diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/wp-content/languages/admin-en_GB.mo b/wp-content/languages/admin-en_GB.mo new file mode 100644 index 00000000..06c22e98 Binary files /dev/null and b/wp-content/languages/admin-en_GB.mo differ diff --git a/wp-content/languages/admin-en_GB.po b/wp-content/languages/admin-en_GB.po new file mode 100644 index 00000000..b7b9b789 --- /dev/null +++ b/wp-content/languages/admin-en_GB.po @@ -0,0 +1,15040 @@ +# Translation of WordPress - 5.6.x - Development - Administration in English (UK) +# This file is distributed under the same license as the WordPress - 5.6.x - Development - Administration package. +msgid "" +msgstr "" +"PO-Revision-Date: 2021-01-28 19:03:35+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: en_GB\n" +"Project-Id-Version: WordPress - 5.6.x - Development - Administration\n" + +#. translators: Default start of the week. 0 = Sunday, 1 = Monday. +#: wp-admin/includes/schema.php:409 +msgctxt "start of week" +msgid "1" +msgstr "1" + +#: wp-admin/includes/schema.php:393 +msgctxt "default GMT offset or timezone string" +msgid "0" +msgstr "Europe/London" + +#: wp-admin/includes/media.php:1730 wp-admin/upgrade.php:74 +#: wp-admin/upgrade.php:154 +msgid "Continue" +msgstr "Continue" + +#: wp-admin/includes/dashboard.php:42 +msgid "PHP Update Recommended" +msgstr "PHP Update Recommended" + +#. translators: %s: The minimum recommended PHP version. +#: wp-admin/includes/class-wp-site-health.php:729 +#: wp-admin/includes/dashboard.php:1770 +msgid "PHP is the programming language used to build and maintain WordPress. Newer versions of PHP are created with increased performance in mind, so you may see a positive effect on your site’s performance. The minimum recommended version of PHP is %s." +msgstr "PHP is the programming language used to build and maintain WordPress. Newer versions of PHP are created with increased performance in mind, so you may see a positive effect on your site’s performance. The minimum recommended version of PHP is %s." + +#. translators: %s: The server PHP version. +#: wp-admin/includes/dashboard.php:1752 +msgid "Your site is running an insecure version of PHP (%s), which should be updated." +msgstr "Your site is running an insecure version of PHP (%s), which should be updated." + +#. translators: %s: The server PHP version. +#: wp-admin/includes/dashboard.php:1758 +msgid "Your site is running an outdated version of PHP (%s), which should be updated." +msgstr "Your site is running an outdated version of PHP (%s), which should be updated." + +#: wp-admin/user-edit.php:766 wp-admin/authorize-application.php:93 +msgid "Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords." +msgstr "Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords." + +#: wp-admin/about.php:249 +msgid "https://wordpress.org/plugins/wp-jquery-update-test/" +msgstr "https://en-gb.wordpress.org/plugins/wp-jquery-update-test/" + +#: wp-admin/about.php:260 +msgid "https://wordpress.org/plugins/enable-jquery-migrate-helper/" +msgstr "https://en-gb.wordpress.org/plugins/enable-jquery-migrate-helper/" + +#. translators: 1: WordPress accessibility-ready guidelines link, 2: WCAG +#. information link. +#: wp-admin/about.php:156 +msgid "What’s more, this default theme puts accessibility at the heart of your website. It conforms to the WordPress accessibility-ready guidelines and addresses several more specialized standards from the Web Content Accessibility Guidelines (WCAG) 2.1 at level AAA. It will help you meet the highest level of international accessibility standards when you create accessible content and choose plugins which are accessible too!" +msgstr "What’s more, this default theme puts accessibility at the heart of your website. It conforms to the WordPress accessibility-ready guidelines and addresses several more specialised standards from the Web Content Accessibility Guidelines (WCAG) 2.1 at level AAA. It will help you meet the highest level of international accessibility standards when you create accessible content and choose plugins which are accessible too!" + +#: wp-admin/about.php:124 +msgid "To help you add subtitles or captions to your videos, you can now upload them within your post or page. This makes it easier than ever to make your videos accessible for anyone who needs or prefers to use subtitles." +msgstr "To help you add subtitles or captions to your videos, you can now upload them within your post or page. This makes it easier than ever to make your videos accessible for anyone who needs, or prefers, to use subtitles." + +#: wp-admin/about.php:123 +msgid "Upload video captions directly in the block editor" +msgstr "Upload video captions directly in the block editor" + +#: wp-admin/includes/class-wp-site-health.php:2128 +msgid "https://developer.wordpress.org/rest-api/frequently-asked-questions/#why-is-authentication-not-working" +msgstr "https://developer.wordpress.org/rest-api/frequently-asked-questions/#why-is-authentication-not-working" + +#. translators: %s: WordPress 5.6 Field Guide link. +#: wp-admin/about.php:276 +msgid "Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change you may want to be aware of. WordPress 5.6 Field Guide." +msgstr "Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change of which you may want to be aware. WordPress 5.6 Field Guide." + +#. translators: %s: jQuery Migrate plugin link. +#: wp-admin/about.php:257 +msgid "If you find issues with the way your site looks (e.g. a slider doesn’t work, a button is stuck — that sort of thing), install the jQuery Migrate plugin." +msgstr "If you find issues with the way your site behaves (eg a slider doesn’t work, a button is stuck – that sort of thing), install the jQuery Migrate plugin." + +#. translators: %s: jQuery update test plugin link. +#: wp-admin/about.php:246 +msgid "Updates to jQuery in WordPress take place across three releases: 5.5, 5.6, and 5.7. As we reach the mid-point of this process, run the update test plugin to check your sites for errors ahead of time." +msgstr "Updates to jQuery in WordPress take place across three releases: 5.5, 5.6, and 5.7. As we reach the mid-point of this process, run the update test plugin to check your sites for errors ahead of time." + +#: wp-admin/about.php:241 +msgid "jQuery" +msgstr "jQuery" + +#. translators: %s: WordPress and PHP 8 dev note link. +#: wp-admin/about.php:232 +msgid "5.6 marks the first steps toward WordPress Core support for PHP 8. Now is a great time to start planning how your WordPress products, services and sites can support the latest PHP version. For more information about what to expect next, read the PHP 8 developer note." +msgstr "5.6 marks the first steps towards WordPress Core support for PHP 8. Now is a great time to start planning how your WordPress products, services, and sites can support the latest PHP version. For more information about what to expect next, read the PHP 8 developer note." + +#: wp-admin/about.php:227 +msgid "More PHP 8 support" +msgstr "More PHP 8 support" + +#: wp-admin/about.php:224 +msgid "Thanks to the API’s new Application Passwords authorization feature, third-party apps can connect to your site seamlessly and securely. This new REST API feature lets you see what apps are connecting to your site and control what they do." +msgstr "Thanks to the API’s new Application Passwords authorisation feature, third-party apps can connect to your site seamlessly and securely. This new REST API feature lets you see what apps are connecting to your site and control what they do." + +#: wp-admin/about.php:223 +msgid "REST API authentication with Application Passwords" +msgstr "REST API authentication with Application Passwords" + +#: wp-admin/about.php:214 +msgid "If you’ve not had the chance to play with block patterns yet, all default themes now feature a range of block patterns that let you master complex layouts with minimal effort. Customize the patterns to your liking with the copy, images and colors that fit your story or brand." +msgstr "If you’ve not had the chance to play with block patterns yet, all default themes now feature a range of block patterns that let you master complex layouts with minimal effort. Customise the patterns to your liking with the copy, images, and colours that fit your story or brand." + +#: wp-admin/about.php:213 +msgid "Built-in patterns" +msgstr "Built-in patterns" + +#. translators: %s: Accessibility statement feature plugin link. +#: wp-admin/about.php:206 +msgid "Even if you’re not an expert, you can start letting folks know about your site’s commitment to accessibility at the click of a button! The new feature plugin includes template copy for you to update and publish, and it’s written to support different contexts and jurisdictions." +msgstr "Even if you’re not an expert, you can start letting folks know about your site’s commitment to accessibility, at the click of a button! The new feature plugin includes template copy for you to update and publish, and it’s written to support different contexts and jurisdictions." + +#: wp-admin/about.php:201 +msgid "Accessibility statement template" +msgstr "Accessibility statement template" + +#: wp-admin/about.php:198 +msgid "For years, only developers have been able to update WordPress automatically. But now, you have that option, right in your dashboard. If this is your first site, you have auto-updates ready to go, right now! Upgrading an existing site? No problem! Everything is the same as it was before." +msgstr "For years, only developers have been able to update WordPress automatically. But now, you have that option, right in your dashboard. If this is your first site, you have auto-updates ready to go, right now! Upgrading an existing site? No problem! Everything is the same as it was before." + +#: wp-admin/about.php:197 +msgid "Expanding auto-updates" +msgstr "Expanding auto-updates" + +#: wp-admin/about.php:176 +msgid "Need more flexibility than that? You can also choose your own color palette from the color picker." +msgstr "Need more flexibility than that? You can also choose your own colour palette from the colour picker." + +#: wp-admin/about.php:175 +msgid "Perfect for a new year, Twenty Twenty-One gives you a range of pre-selected color palettes in pastel, all of which meet AAA standards for contrast. You can also choose your own background color for the theme, and the theme chooses accessibility-conscious text colors for you — automatically!" +msgstr "Perfect for a new year, Twenty Twenty-One gives you a range of pre-selected colour palettes in pastel, all of which meet AAA standards for contrast. You can also choose your own background colour for the theme, and the theme chooses accessibility-conscious text colors for you – automatically!" + +#: wp-admin/about.php:172 +msgid "A rainbow of soft pastels" +msgstr "A rainbow of soft pastels" + +#: wp-admin/about.php:135 +msgid "Twenty Twenty-One is a blank canvas for your ideas, and the block editor is the best brush. It is built for the block editor and packed with brand-new block patterns you can only get in the default themes. Try different layouts in a matter of seconds, and let the theme’s eye-catching, yet timeless design make your work shine." +msgstr "Twenty Twenty-One is a blank canvas for your ideas, and the block editor is the best brush. It is built for the block editor and packed with brand new block patterns you can only get in the default themes. Try different layouts in a matter of seconds, and let the theme’s eye-catching, yet timeless design make your work shine." + +#: wp-admin/about.php:132 +msgid "Twenty Twenty-One is here!" +msgstr "Twenty Twenty-One is here!" + +#: wp-admin/about.php:118 +msgid "In select themes, preconfigured block patterns make setting up standard pages on your site a breeze. Find the power of patterns to streamline your workflow, or share some of that power with your clients and save yourself a few clicks." +msgstr "In select themes, preconfigured block patterns make setting up standard pages on your site a breeze. Find the power of patterns to streamline your workflow, or share some of that power with your clients and save yourself a few clicks." + +#: wp-admin/about.php:117 +msgid "More block patterns" +msgstr "More block patterns" + +#: wp-admin/about.php:111 +msgid "Bring your stories to life with more tools that let you edit your layout with or without code. Single column blocks, designs using mixed widths and columns, full-width headers, and videos in your cover block—make small changes or big statements with equal ease!" +msgstr "Bring your stories to life with more tools that let you edit your layout with or without code. Single column blocks, designs using mixed widths and columns, full-width headers, and videos in your cover block – make small changes or big statements with equal ease!" + +#: wp-admin/about.php:110 +msgid "Greater layout flexibility" +msgstr "Greater layout flexibility" + +#. translators: %s: The current WordPress version number. +#: wp-admin/about.php:67 +msgid "WordPress %s brings you countless ways to set your ideas free and bring them to life. With a brand-new default theme as your canvas, it supports an ever-growing collection of blocks as your brushes. Paint with words. Pictures. Sound. Or rich embedded media." +msgstr "WordPress %s brings you countless ways to set your ideas free and bring them to life. With a brand new default theme as your canvas, it supports an ever growing collection of blocks as your brushes. Paint with words, pictures, or sound. Or rich embedded media." + +#: wp-admin/credits.php:43 wp-admin/privacy.php:40 wp-admin/freedoms.php:46 +#: wp-admin/about.php:41 +msgid "New" +msgstr "New" + +#: wp-admin/credits.php:40 wp-admin/privacy.php:37 wp-admin/freedoms.php:43 +#: wp-admin/about.php:38 +msgid "Sharing your stories has never been easier" +msgstr "Sharing your stories has never been easier" + +#: wp-admin/update-core.php:65 +msgid "You can update to the latest nightly build manually:" +msgstr "You can update to the latest nightly build manually:" + +#: wp-admin/update-core.php:253 +msgid "You are using a development version of WordPress." +msgstr "You are using a development version of WordPress." + +#: wp-admin/update-core.php:381 +msgid "This site appears to be under version control. Automatic updates are disabled." +msgstr "This site appears to be under version control. Automatic updates are disabled." + +#: wp-admin/update-core.php:390 +msgid "Switch to automatic updates for maintenance and security releases only." +msgstr "Switch to automatic updates for maintenance and security releases only." + +#: wp-admin/update-core.php:401 +msgid "Enable automatic updates for all new versions of WordPress." +msgstr "Enable automatic updates for all new versions of WordPress." + +#. translators: Current version of WordPress. +#: wp-admin/update-core.php:1005 +msgid "Current version: %s" +msgstr "Current version: %s" + +#: wp-admin/update-core.php:293 +msgid "WordPress will only receive automatic security and maintenance releases from now on." +msgstr "WordPress will only receive automatic security and maintenance releases from now on." + +#: wp-admin/update-core.php:290 +msgid "Automatic updates for all WordPress versions have been enabled. Thank you!" +msgstr "Automatic updates for all WordPress versions have been enabled. Thank you!" + +#: wp-admin/update-core.php:383 +msgid "This site is automatically kept up to date with each new version of WordPress." +msgstr "This site is automatically kept up to date with each new version of WordPress." + +#: wp-admin/update-core.php:405 +msgid "This site will not receive automatic updates for new versions of WordPress." +msgstr "This site will not receive automatic updates for new versions of WordPress." + +#: wp-admin/update-core.php:983 +msgid "Here you can find information about updates, set auto-updates and see what plugins or themes need updating." +msgstr "Here you can find information about updates, set auto-updates, and see what plugins or themes need updating." + +#: wp-admin/update-core.php:394 +msgid "This site is automatically kept up to date with maintenance and security releases of WordPress only." +msgstr "This site is automatically kept up to date with maintenance and security releases of WordPress only." + +#: wp-admin/index.php:80 +msgid "Site Health Status — Informs you of any potential issues that should be addressed to improve the performance or security of your website." +msgstr "Site Health Status – Informs you of any potential issues that should be addressed to improve the performance or security of your website." + +#: wp-admin/user-edit.php:748 +msgid "Required to create an Application Password, but not to update the user." +msgstr "Required to create an Application Password, but not to update the user." + +#: wp-admin/user-edit.php:762 +msgid "Add New Application Password" +msgstr "Add New Application Password" + +#. translators: %s: Application name. +#: wp-admin/user-edit.php:874 wp-admin/authorize-application.php:191 +#: wp-admin/js/auth-app.js:90 +msgid "Your new password for %s is:" +msgstr "Your new password for %s is:" + +#: wp-admin/includes/class-plugin-installer-skin.php:133 +msgid "Go to Importers" +msgstr "Go to Importers" + +#: wp-admin/includes/class-plugin-installer-skin.php:139 +#: wp-admin/includes/class-plugin-installer-skin.php:145 +msgid "Go to Plugin Installer" +msgstr "Go to Plugin Installer" + +#: wp-admin/revision.php:110 +msgid "← Go to editor" +msgstr "← Go to editor" + +#: wp-admin/user-edit.php:205 +msgid "← Go to Users" +msgstr "← Go to Users" + +#: wp-admin/about.php:289 +msgid "Go to Updates" +msgstr "Go to Updates" + +#: wp-admin/includes/privacy-tools.php:282 +#: wp-admin/includes/class-wp-privacy-policy-content.php:427 +msgid "Go to top" +msgstr "Go to top" + +#: wp-admin/includes/class-theme-installer-skin.php:158 +msgid "Go to Theme Installer" +msgstr "Go to Theme Installer" + +#. translators: %s is the name of the city we couldn't locate. * Replace the +#. examples with cities in your locale, but test * that they match the expected +#. location before including them. * Use endonyms (native locale names) +#. whenever possible. +#: wp-admin/includes/dashboard.php:1374 +msgid "We couldn’t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland." +msgstr "We couldn’t locate %s. Please try another nearby city. For example: Edinburgh; London; Cardiff." + +#: wp-admin/authorize-application.php:250 +msgid "Yes, I approve of this connection." +msgstr "Yes, I approve of this connection." + +#. translators: %s: The URL the user is being redirected to. +#: wp-admin/authorize-application.php:264 +#: wp-admin/authorize-application.php:298 +msgid "You will be sent to %s" +msgstr "You will be sent to %s" + +#: wp-admin/authorize-application.php:277 +msgid "You will be given a password to manually enter into the application in question." +msgstr "You will be given a password to manually enter into the application in question." + +#: wp-admin/authorize-application.php:284 +msgid "No, I do not approve of this connection." +msgstr "No, I do not approve of this connection." + +#: wp-admin/authorize-application.php:302 +msgid "You will be returned to the WordPress Dashboard, and no changes will be made." +msgstr "You will be returned to the WordPress Dashboard, and no changes will be made." + +#: wp-admin/options-privacy.php:237 +msgid "Or" +msgstr "Or" + +#: wp-admin/authorize-application.php:156 +msgid "Would you like to give this application access to your account? You should only do this if you trust the app in question." +msgstr "Would you like to give this application access to your account? You should only do this if you trust the app in question." + +#. translators: 1: URL to my-sites.php, 2: Number of blogs the user has. +#: wp-admin/authorize-application.php:169 +msgid "This will grant access to the %2$s blog in this installation that you have permissions on." +msgid_plural "This will grant access to all %2$s blogs in this installation that you have permissions on." +msgstr[0] "This will grant access to the %2$s blog in this installation that you have permissions on." +msgstr[1] "This will grant access to all %2$s blogs in this installation that you have permissions on." + +#. translators: %s: Application name. +#: wp-admin/authorize-application.php:150 +msgid "Would you like to give the application identifying itself as %s access to your account? You should only do this if you trust the app in question." +msgstr "Would you like to give the application identifying itself as %s access to your account? You should only do this if you trust the app in question." + +#. translators: 1: URL to my-sites.php, 2: Number of blogs the user has. +#: wp-admin/user-edit.php:728 +msgid "Application passwords grant access to the %2$s blog in this installation that you have permissions on." +msgid_plural "Application passwords grant access to all %2$s blogs in this installation that you have permissions on." +msgstr[0] "Application passwords grant access to the %2$s blog in this installation that you have permissions on." +msgstr[1] "Application passwords grant access to all %2$s blogs in this installation that you have permissions on." + +#: wp-admin/user-edit.php:746 wp-admin/authorize-application.php:226 +msgid "New Application Password Name" +msgstr "New Application Password Name" + +#: wp-admin/user-edit.php:747 wp-admin/authorize-application.php:227 +msgid "WordPress App on My Phone" +msgstr "WordPress App on My Phone" + +#: wp-admin/user-edit.php:881 wp-admin/authorize-application.php:198 +#: wp-admin/js/auth-app.js:98 +msgid "Be sure to save this in a safe location. You will not be able to retrieve it." +msgstr "Be sure to save this in a safe location. You will not be able to retrieve it." + +#: wp-admin/authorize-application.php:65 +msgid "Authorize Application" +msgstr "Authorise Application" + +#: wp-admin/authorize-application.php:86 +msgid "The Authorize Application request is not allowed." +msgstr "The Authorise Application request is not allowed." + +#: wp-admin/authorize-application.php:87 wp-admin/authorize-application.php:94 +#: wp-admin/authorize-application.php:112 +msgid "Cannot Authorize Application" +msgstr "Cannot Authorise Application" + +#: wp-admin/authorize-application.php:144 +msgid "An application would like to connect to your account." +msgstr "An application would like to connect to your account." + +#: wp-admin/user-edit.php:717 +msgid "Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website." +msgstr "Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website." + +#: wp-admin/user-new.php:581 +msgid "Type the password again." +msgstr "Type the password again." + +#: wp-admin/user-edit.php:635 +msgid "Set New Password" +msgstr "Set New Password" + +#: wp-admin/user-edit.php:659 +msgid "Type the new password again." +msgstr "Type the new password again." + +#: wp-admin/user-edit.php:716 +msgid "Application Passwords" +msgstr "Application Passwords" + +#. translators: 1: Installed WordPress version number, 2: URL to WordPress +#. release notes, 3: New WordPress version number, including locale if +#. necessary. +#: wp-admin/update-core.php:130 +msgid "You can update from WordPress %1$s to WordPress %3$s manually:" +msgstr "You can update from WordPress %1$s to WordPress %3$s manually:" + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:139 +msgid "Erase personal data" +msgstr "Erase personal data" + +#. translators: 1: The Site Health action that is no longer used by core. 2: +#. The new function that replaces it. +#: wp-admin/includes/ajax-actions.php:5153 +#: wp-admin/includes/ajax-actions.php:5186 +#: wp-admin/includes/ajax-actions.php:5219 +#: wp-admin/includes/ajax-actions.php:5269 +msgid "The Site Health check for %1$s has been replaced with %2$s." +msgstr "The Site Health check for %1$s has been replaced with %2$s." + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:31 +msgid "Last Used" +msgstr "Last Used" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:32 +msgid "Last IP" +msgstr "Last IP" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:33 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:114 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:239 +msgid "Revoke" +msgstr "Revoke" + +#. translators: %s: the application password's given name. +#: wp-admin/includes/class-wp-application-passwords-list-table.php:120 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:241 +msgid "Revoke \"%s\"" +msgstr "Revoke \"%s\"" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:159 +msgid "Revoke all application passwords" +msgstr "Revoke all application passwords" + +#: wp-admin/includes/class-wp-site-health.php:2106 +msgid "The authorization header is missing." +msgstr "The authorisation header is missing." + +#: wp-admin/includes/class-wp-site-health.php:2108 +msgid "The authorization header is invalid." +msgstr "The authorisation header is invalid." + +#: wp-admin/includes/class-wp-site-health.php:2123 +msgid "Flush permalinks" +msgstr "Flush permalinks" + +#: wp-admin/includes/class-wp-site-health.php:2129 +msgid "Learn how to configure the Authorization header." +msgstr "Learn how to configure the Authorisation header." + +#: wp-admin/includes/class-wp-site-health.php:2238 +msgid "Authorization header" +msgstr "Authorisation header" + +#: wp-admin/includes/template.php:2312 +msgid "Current Header Video" +msgstr "Current Header Video" + +#. translators: 1: Plugin name, 2: Current version number, 3: New version +#. number. +#. translators: 1: Theme name, 2: Current version number, 3: New version +#. number. +#: wp-admin/includes/class-wp-automatic-updater.php:1086 +#: wp-admin/includes/class-wp-automatic-updater.php:1114 +#: wp-admin/includes/class-wp-automatic-updater.php:1147 +#: wp-admin/includes/class-wp-automatic-updater.php:1175 +msgid "- %1$s (from version %2$s to %3$s)" +msgstr "– %1$s (from version %2$s to %3$s)" + +#: wp-admin/includes/class-wp-site-health.php:2099 +msgid "The Authorization header comes from the third-party applications you approve. Without it, those apps cannot connect to your site." +msgstr "The Authorisation header comes from the third-party applications you approve. Without it, those apps cannot connect to your site." + +#: wp-admin/includes/class-wp-screen.php:1119 +msgid "They can be expanded and collapsed by clickling on their headings, and arranged by dragging their headings or by clicking on the up and down arrows." +msgstr "They can be expanded and collapsed by clicking on their headings, and arranged by dragging their headings or by clicking on the up and down arrows." + +#: wp-admin/includes/class-wp-site-health.php:2091 +msgid "The Authorization header is working as expected." +msgstr "The Authorisation header is working as expected." + +#: wp-admin/includes/user.php:623 +msgid "The success url must be served over a secure connection." +msgstr "The success URL must be served over a secure connection." + +#: wp-admin/includes/user.php:634 +msgid "The rejection url must be served over a secure connection." +msgstr "The rejection URL must be served over a secure connection." + +#: wp-admin/includes/user.php:642 +msgid "The app id must be a uuid." +msgstr "The app ID must be a uuid." + +#: wp-admin/includes/class-wp-screen.php:1116 +msgid "Screen elements" +msgstr "Screen elements" + +#: wp-admin/includes/class-wp-screen.php:1118 +msgid "Some screen elements can be shown or hidden by using the checkboxes." +msgstr "Some screen elements can be shown or hidden by using the checkboxes." + +#. translators: %s: Plugin search term. +#: wp-admin/includes/class-wp-plugins-list-table.php:410 +msgid "No plugins found for: %s." +msgstr "No plugins found for: %s." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:588 +msgid "If you request a password reset, your IP address will be included in the reset email." +msgstr "If you request a password reset, your IP address will be included in the reset email." + +#. translators: %s: Request email. +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:88 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:94 +msgid "Mark export request for “%s” as completed." +msgstr "Mark export request for “%s” as completed." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:92 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:98 +msgid "Complete request" +msgstr "Complete request" + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:256 +msgid "%d confirmation request failed to resend." +msgid_plural "%d confirmation requests failed to resend." +msgstr[0] "%d confirmation request failed to resend." +msgstr[1] "%d confirmation requests failed to resend." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:273 +msgid "%d confirmation request re-sent successfully." +msgid_plural "%d confirmation requests re-sent successfully." +msgstr[0] "%d confirmation request resent successfully." +msgstr[1] "%d confirmation requests resent successfully." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:300 +msgid "%d request marked as complete." +msgid_plural "%d requests marked as complete." +msgstr[0] "%d request marked as complete." +msgstr[1] "%d requests marked as complete." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:326 +msgid "%d request failed to delete." +msgid_plural "%d requests failed to delete." +msgstr[0] "%d request failed to delete." +msgstr[1] "%d requests failed to delete." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:343 +msgid "%d request deleted successfully." +msgid_plural "%d requests deleted successfully." +msgstr[0] "%d request deleted successfully." +msgstr[1] "%d requests deleted successfully." + +#: wp-admin/includes/privacy-tools.php:398 +msgid "Unable to open user privacy export file (JSON report) for writing." +msgstr "Unable to open user privacy export file (JSON report) for writing." + +#: wp-admin/includes/privacy-tools.php:413 +msgid "Unable to open user privacy export file (HTML report) for writing." +msgstr "Unable to open user privacy export file (HTML report) for writing." + +#: wp-admin/includes/privacy-tools.php:507 +msgid "Unable to add data to user privacy export file (JSON format)." +msgstr "Unable to add data to user privacy export file (JSON format)." + +#: wp-admin/includes/privacy-tools.php:511 +msgid "Unable to add data to user privacy export file (HTML format)." +msgstr "Unable to add data to user privacy export file (HTML format)." + +#: wp-admin/includes/privacy-tools.php:532 +msgid "Unable to open user privacy export file (archive) for writing." +msgstr "Unable to open user privacy export file (archive) for writing." + +#: wp-admin/includes/privacy-tools.php:761 +msgid "Invalid request ID when merging user privacy exporter data." +msgstr "Invalid request ID when merging user privacy exporter data." + +#: wp-admin/includes/privacy-tools.php:912 +msgid "Invalid request ID when processing user privacy eraser data." +msgstr "Invalid request ID when processing user privacy eraser data." + +#: wp-admin/includes/class-wp-privacy-requests-table.php:46 +msgid "Next steps" +msgstr "Next steps" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:214 +msgid "Mark requests as completed" +msgstr "Mark requests as completed" + +#. translators: %s: Search query. +#: wp-admin/edit-tags.php:344 wp-admin/link-manager.php:110 +#: wp-admin/plugins.php:733 wp-admin/edit-comments.php:235 +#: wp-admin/upload.php:281 wp-admin/users.php:576 wp-admin/edit.php:412 +#: wp-admin/js/updates.js:2625 wp-admin/network/themes.php:358 +#: wp-admin/network/users.php:284 wp-admin/network/sites.php:377 +msgid "Search results for: %s" +msgstr "Search results for: %s" + +#: wp-admin/includes/privacy-tools.php:31 +msgid "Unable to initiate user privacy confirmation request." +msgstr "Unable to initiate user privacy confirmation request." + +#: wp-admin/includes/privacy-tools.php:107 +#: wp-admin/includes/privacy-tools.php:119 +msgid "Invalid user privacy action." +msgstr "Invalid user privacy action." + +#: wp-admin/includes/privacy-tools.php:300 +msgid "Unable to generate user privacy export file. ZipArchive not available." +msgstr "Unable to generate user privacy export file. ZipArchive not available." + +#: wp-admin/includes/privacy-tools.php:307 +msgid "Invalid request ID when generating user privacy export file." +msgstr "Invalid request ID when generating user privacy export file." + +#: wp-admin/includes/privacy-tools.php:313 +msgid "Invalid email address when generating user privacy export file." +msgstr "Invalid email address when generating user privacy export file." + +#: wp-admin/includes/privacy-tools.php:321 +msgid "Unable to create user privacy export folder." +msgstr "Unable to create user privacy export folder." + +#: wp-admin/includes/privacy-tools.php:329 +msgid "Unable to protect user privacy export folder from browsing." +msgstr "Unable to protect user privacy export folder from browsing." + +#: wp-admin/options-reading.php:45 +msgid "Note that even when set to discourage search engines, your site is still visible on the web and not all search engines adhere to this directive." +msgstr "Note that even when set to discourage search engines, your site is still visible on the web and not all search engines adhere to this directive." + +#: wp-admin/options-reading.php:44 +msgid "You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen." +msgstr "You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen." + +#: wp-admin/includes/class-wp-debug-data.php:124 +msgid "Environment type" +msgstr "Environment type" + +#. translators: 1: post_max_size, 2: upload_max_filesize +#: wp-admin/includes/class-wp-site-health.php:2062 +msgid "The \"%1$s\" value is smaller than \"%2$s\"." +msgstr "The \"%1$s\" value is smaller than \"%2$s\"." + +#: wp-admin/about.php:271 +msgid "Check the Field Guide for more!" +msgstr "Check the Field Guide for more!" + +#: wp-admin/plugins.php:577 +msgid "Auto-updates are only available for plugins recognized by WordPress.org, or that include a compatible update system." +msgstr "Auto-updates are only available for plugins recognised by WordPress.org, or that include a compatible update system." + +#: wp-admin/includes/theme.php:842 wp-admin/themes.php:1002 +msgid "Update Incompatible" +msgstr "Update Incompatible" + +#: wp-admin/update-core.php:637 +msgid "This update doesn’t work with your versions of WordPress and PHP." +msgstr "This update doesn’t work with your versions of WordPress and PHP." + +#: wp-admin/update-core.php:671 +msgid "This update doesn’t work with your version of WordPress." +msgstr "This update doesn’t work with your version of WordPress." + +#: wp-admin/options-discussion.php:207 wp-admin/options-discussion.php:208 +msgid "Disallowed Comment Keys" +msgstr "Disallowed Comment Keys" + +#: wp-admin/includes/class-wp-site-health.php:2214 +msgid "Plugin and theme auto-updates" +msgstr "Plugin and theme auto-updates" + +#: wp-admin/includes/class-wp-site-health.php:2506 +msgid "There appear to be no issues with plugin and theme auto-updates." +msgstr "There appear to be no issues with plugin and theme auto-updates." + +#: wp-admin/includes/class-wp-site-health.php:2500 +msgid "Auto-updates for themes appear to be disabled. This will prevent your site from receiving new versions automatically when available." +msgstr "Auto-updates for themes appear to be disabled. This will prevent your site from receiving new versions automatically when available." + +#: wp-admin/includes/class-wp-site-health.php:1761 +msgid "Plugin and theme auto-updates ensure that the latest versions are always installed." +msgstr "Plugin and theme auto-updates ensure that the latest versions are always installed." + +#: wp-admin/includes/class-wp-site-health.php:1772 +msgid "Your site may have problems auto-updating plugins and themes" +msgstr "Your site may have problems auto-updating plugins and themes" + +#: wp-admin/includes/class-wp-site-health.php:2481 +msgid "Auto-updates for plugins and/or themes appear to be disabled, but settings are still set to be displayed. This could cause auto-updates to not work as expected." +msgstr "Auto-updates for plugins and/or themes appear to be disabled, but settings are still set to be displayed. This could cause auto-updates to not work as expected." + +#: wp-admin/includes/class-wp-site-health.php:2495 +msgid "Auto-updates for plugins appear to be disabled. This will prevent your site from receiving new versions automatically when available." +msgstr "Auto-updates for plugins appear to be disabled. This will prevent your site from receiving new versions automatically when available." + +#: wp-admin/includes/class-wp-site-health.php:2490 +msgid "Auto-updates for plugins and themes appear to be disabled. This will prevent your site from receiving new versions automatically when available." +msgstr "Auto-updates for plugins and themes appear to be disabled. This will prevent your site from receiving new versions automatically when available." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-themes-list-table.php:215 +#: wp-admin/includes/class-theme-installer-skin.php:143 +#: wp-admin/includes/class-theme-upgrader-skin.php:115 +msgctxt "theme" +msgid "Activate “%s”" +msgstr "Activate “%s”" + +#: wp-admin/includes/class-wp-site-health.php:1753 +msgid "Plugin and theme auto-updates appear to be configured correctly" +msgstr "Plugin and theme auto-updates appear to be configured correctly" + +#. translators: 1: file_uploads, 2: php.ini +#: wp-admin/includes/class-wp-site-health.php:2023 +msgid "The %1$s directive in %2$s determines if uploading files is allowed on your site." +msgstr "The %1$s directive in %2$s determines if uploading files is allowed on your site." + +#. translators: %s: ini_get() +#: wp-admin/includes/class-wp-site-health.php:2036 +msgid "The %s function has been disabled, some media settings are unavailable because of this." +msgstr "The %s function has been disabled, some media settings are unavailable because of this." + +#. translators: 1: file_uploads, 2: 0 +#: wp-admin/includes/class-wp-site-health.php:2048 +msgid "%1$s is set to %2$s. You won't be able to upload files on your site." +msgstr "%1$s is set to %2$s. You won't be able to upload files on your site." + +#: wp-admin/includes/ajax-actions.php:5359 +msgid "Sorry, you are not allowed to modify plugins." +msgstr "Sorry, you are not allowed to modify plugins." + +#. translators: 1: post_max_size, 2: upload_max_filesize +#: wp-admin/includes/class-wp-site-health.php:2071 +msgid "The setting for %1$s is smaller than %2$s, this could cause some problems when trying to upload files." +msgstr "The setting for %1$s is smaller than %2$s, this could cause some problems when trying to upload files." + +#: wp-admin/includes/class-wp-debug-data.php:530 +msgid "File upload settings" +msgstr "File upload settings" + +#: wp-admin/includes/class-wp-debug-data.php:547 +#: wp-admin/includes/class-wp-site-health.php:2210 +msgid "File uploads" +msgstr "File uploads" + +#: wp-admin/includes/class-wp-debug-data.php:552 +msgid "Max size of post data allowed" +msgstr "Maximum size of post data allowed" + +#: wp-admin/includes/class-wp-debug-data.php:556 +msgid "Max size of an uploaded file" +msgstr "Maximum size of an uploaded file" + +#: wp-admin/includes/class-wp-debug-data.php:560 +msgid "Max effective file size" +msgstr "Maximum effective file size" + +#: wp-admin/includes/class-wp-debug-data.php:564 +msgid "Max number of files allowed" +msgstr "Maximum number of files allowed" + +#: wp-admin/includes/class-wp-site-health.php:2013 +msgid "Files can be uploaded." +msgstr "Files can be uploaded." + +#. translators: %s: Theme name. +#: wp-admin/theme-install.php:393 +msgctxt "theme" +msgid "Cannot Install %s" +msgstr "Cannot Install %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/deprecated.php:1383 +msgctxt "plugin" +msgid "Install %s" +msgstr "Install %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-theme-install-list-table.php:326 +#: wp-admin/theme-install.php:386 +msgctxt "theme" +msgid "Install %s" +msgstr "Install %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:243 wp-admin/includes/update.php:709 +msgctxt "theme" +msgid "Update %s now" +msgstr "Update %s now" + +#. translators: 1: Plugin name, 2: Version number. +#. translators: 1: Theme name, 2: Version number. +#: wp-admin/includes/class-wp-automatic-updater.php:1094 +#: wp-admin/includes/class-wp-automatic-updater.php:1122 +#: wp-admin/includes/class-wp-automatic-updater.php:1155 +#: wp-admin/includes/class-wp-automatic-updater.php:1183 +msgid "- %1$s version %2$s" +msgstr "– %1$s version %2$s" + +#: wp-admin/includes/class-plugin-installer-skin.php:211 +msgid "This plugin is already installed." +msgstr "This plugin is already installed." + +#: wp-admin/themes.php:86 +msgid "Sorry, you are not allowed to enable themes automatic updates." +msgstr "Sorry, you are not allowed to enable themes automatic updates." + +#: wp-admin/theme-install.php:356 wp-admin/theme-install.php:418 +msgctxt "theme" +msgid "Activated" +msgstr "Activated" + +#. translators: %s: Plugin name. +#. translators: %s: Plugin name and version. +#: wp-admin/includes/update.php:517 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:557 +#: wp-admin/js/updates.js:2099 +msgctxt "plugin" +msgid "Update %s now" +msgstr "Update %s now" + +#. translators: %s: Plugin name and version. +#. translators: %s: Importer name. +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:535 +#: wp-admin/import.php:159 wp-admin/js/updates.js:895 +#: wp-admin/js/updates.js:2108 wp-admin/js/updates.js:2231 +msgctxt "plugin" +msgid "Install %s now" +msgstr "Install %s now" + +#: wp-admin/user-edit.php:883 wp-admin/js/common.js:1102 +#: wp-admin/js/application-passwords.js:196 +msgid "Dismiss this notice." +msgstr "Dismiss this notice." + +#: wp-admin/themes.php:296 wp-admin/network/themes.php:407 +msgid "Theme will no longer be auto-updated." +msgstr "Theme will no longer be auto-updated." + +#. translators: %s: Theme name. +#: wp-admin/themes.php:549 wp-admin/themes.php:895 wp-admin/themes.php:1110 +#: wp-admin/theme-install.php:371 +msgctxt "theme" +msgid "Cannot Activate %s" +msgstr "Cannot Activate %s" + +#: wp-admin/themes.php:190 wp-admin/network/themes.php:313 +msgid "Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." +msgstr "Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depend on the WP-Cron task scheduling system." + +#: wp-admin/themes.php:292 wp-admin/network/themes.php:398 +msgid "Theme will be auto-updated." +msgstr "Theme will be auto-updated." + +#: wp-admin/post.php:322 wp-admin/upload.php:195 wp-admin/edit.php:169 +msgid "Error in deleting the attachment." +msgstr "Error in deleting the attachment." + +#: wp-admin/post.php:326 wp-admin/edit.php:173 +msgid "Error in deleting the item." +msgstr "Error in deleting the item." + +#: wp-admin/plugins.php:449 +msgid "Sorry, you are not allowed to manage plugins automatic updates." +msgstr "Sorry, you are not allowed to manage plugins automatic updates." + +#: wp-admin/themes.php:106 +msgid "Sorry, you are not allowed to disable themes automatic updates." +msgstr "Sorry, you are not allowed to disable themes automatic updates." + +#: wp-admin/plugins.php:576 +msgid "Auto-updates can be enabled or disabled for each individual plugin. Plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." +msgstr "Auto-updates can be enabled or disabled for each individual plugin. Plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depend on the WP-Cron task scheduling system." + +#: wp-admin/plugins.php:706 +msgid "Plugin will be auto-updated." +msgstr "Plugin will be auto-updated." + +#: wp-admin/plugins.php:708 +msgid "Plugin will no longer be auto-updated." +msgstr "Plugin will no longer be auto-updated." + +#: wp-admin/plugins.php:710 +msgid "Selected plugins will be auto-updated." +msgstr "Selected plugins will be auto-updated." + +#: wp-admin/plugins.php:712 +msgid "Selected plugins will no longer be auto-updated." +msgstr "Selected plugins will no longer be auto-updated." + +#: wp-admin/post.php:261 wp-admin/upload.php:159 wp-admin/edit.php:120 +msgid "Error in moving the item to Trash." +msgstr "Error in moving the item to Bin." + +#: wp-admin/post.php:291 wp-admin/upload.php:180 wp-admin/edit.php:148 +msgid "Error in restoring the item from Trash." +msgstr "Error in restoring the item from Bin." + +#: wp-admin/plugins.php:453 +msgid "Please connect to your network admin to manage plugins automatic updates." +msgstr "Please connect to your network admin to manage plugins automatic updates." + +#: wp-admin/update-core.php:954 wp-admin/plugins.php:578 +#: wp-admin/themes.php:191 wp-admin/network/themes.php:314 +msgid "Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling." +msgstr "Please note: third-party themes and plugins, or custom code, may override WordPress scheduling." + +#: wp-admin/includes/class-wp-debug-data.php:1140 wp-admin/update-core.php:959 +#: wp-admin/plugins.php:574 wp-admin/themes.php:196 +#: wp-admin/network/themes.php:311 +msgid "Auto-updates" +msgstr "Auto-updates" + +#: wp-admin/update-core.php:964 wp-admin/plugins.php:582 +#: wp-admin/themes.php:201 wp-admin/network/themes.php:318 +msgid "Learn more: Auto-updates documentation" +msgstr "Learn more: auto-updates documentation" + +#. translators: %s: Human-readable time interval. +#: wp-admin/index.php:141 +msgid "The admin email verification page will reappear after %s." +msgstr "The admin email verification page will reappear after %s." + +#: wp-admin/update-core.php:953 +msgid "Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." +msgstr "Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." + +#. translators: 1: Documentation on WordPress backups, 2: Documentation on +#. updating WordPress. +#: wp-admin/update-core.php:247 +msgid "Important: Before updating, please back up your database and files. For help with updates, visit the Updating WordPress documentation page." +msgstr "Important: before updating, please back up your database and files. For help with updates, visit the Updating WordPress documentation page." + +#: wp-admin/customize.php:195 wp-admin/themes.php:551 wp-admin/themes.php:897 +#: wp-admin/themes.php:1113 wp-admin/theme-install.php:374 +#: wp-admin/theme-install.php:421 +msgctxt "theme" +msgid "Cannot Activate" +msgstr "Cannot Activate" + +#: wp-admin/comment.php:46 +msgid "You can’t edit this comment because the associated post is in the Trash. Please restore the post first, then try again." +msgstr "You can’t edit this comment because the associated post is in the Bin. Please restore the post first, then try again." + +#: wp-admin/async-upload.php:58 +msgctxt "media item" +msgid "Success" +msgstr "Success" + +#. translators: 1: Current WordPress version, 2: Plugin name, 3: Required +#. WordPress version. +#: wp-admin/includes/plugin.php:1196 +msgctxt "plugin" +msgid "Error: Current WordPress version (%1$s) does not meet minimum requirements for %2$s. The plugin requires WordPress %3$s." +msgstr "Error: current WordPress version (%1$s) does not meet the minimum requirements for %2$s. The plugin requires WordPress %3$s." + +#. translators: 1: Current PHP version, 2: Plugin name, 3: Required PHP +#. version. +#: wp-admin/includes/plugin.php:1185 +msgctxt "plugin" +msgid "Error: Current PHP version (%1$s) does not meet minimum requirements for %2$s. The plugin requires PHP %3$s." +msgstr "Error: current PHP version (%1$s) does not meet the minimum requirements for %2$s. The plugin requires PHP %3$s." + +#. translators: 1: Current WordPress version, 2: Current PHP version, 3: Plugin +#. name, 4: Required WordPress version, 5: Required PHP version. +#: wp-admin/includes/plugin.php:1172 +msgctxt "plugin" +msgid "Error: Current versions of WordPress (%1$s) and PHP (%2$s) do not meet minimum requirements for %3$s. The plugin requires WordPress %4$s and PHP %5$s." +msgstr "Error: current versions of WordPress (%1$s) and PHP (%2$s) do not meet the minimum requirements for %3$s. The plugin requires WordPress %4$s and PHP %5$s." + +#: wp-admin/includes/class-wp-automatic-updater.php:1075 +msgid "Please check your site now. It’s possible that everything is working. If there are updates available, you should update." +msgstr "Please check your site now. It’s possible that everything is working. If there are updates available, you should update." + +#: wp-admin/includes/class-wp-automatic-updater.php:1080 +msgid "These plugins failed to update:" +msgstr "These plugins failed to update:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1108 +msgid "These themes failed to update:" +msgstr "These themes failed to update:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1141 +msgid "These plugins are now up to date:" +msgstr "These plugins are now up to date:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1169 +msgid "These themes are now up to date:" +msgstr "These themes are now up to date:" + +#. translators: %s: Plugins screen URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1199 +msgid "To manage plugins on your site, visit the Plugins page: %s" +msgstr "To manage plugins on your site, visit the Plugins page: %s" + +#. translators: %s: Themes screen URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1208 +msgid "To manage themes on your site, visit the Themes page: %s" +msgstr "To manage themes on your site, visit the Themes page: %s" + +#: wp-admin/includes/ajax-actions.php:1275 +msgid "Error: You can’t reply to a comment on a draft post." +msgstr "Error: you can’t reply to a comment on a draft post." + +#: wp-admin/includes/ajax-actions.php:1305 +#: wp-admin/includes/ajax-actions.php:1407 +msgid "Error: Please type your comment text." +msgstr "Error: please type your comment text." + +#: wp-admin/includes/ajax-actions.php:5341 +msgid "Invalid data. No selected item." +msgstr "Invalid data. No selected item." + +#: wp-admin/includes/ajax-actions.php:5347 +msgid "Invalid data. Unknown state." +msgstr "Invalid data. Unknown state." + +#: wp-admin/includes/ajax-actions.php:5352 +#: wp-admin/includes/ajax-actions.php:5377 +msgid "Invalid data. Unknown type." +msgstr "Invalid data. Unknown type." + +#: wp-admin/includes/ajax-actions.php:5381 +msgid "Invalid data. The item does not exist." +msgstr "Invalid data. The item does not exist." + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1065 +msgid "Howdy! Themes failed to update on your site at %s." +msgstr "Hi! Themes failed to update on your site at %s." + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1036 +msgid "Howdy! Some themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part." +msgstr "Hi! Some themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1046 +msgid "[%s] Some plugins and themes have failed to update" +msgstr "[%s] Some plugins and themes have failed to update" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1049 +msgid "Howdy! Plugins and themes failed to update on your site at %s." +msgstr "Hi! Plugins and themes failed to update on your site at %s." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1054 +msgid "[%s] Some plugins have failed to update" +msgstr "[%s] Some plugins have failed to update" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1057 +msgid "Howdy! Plugins failed to update on your site at %s." +msgstr "Hi! Plugins failed to update on your site at %s." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1062 +msgid "[%s] Some themes have failed to update" +msgstr "[%s] Some themes have failed to update" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1028 +msgid "Howdy! Some plugins have automatically updated to their latest versions on your site at %s. No further action is needed on your part." +msgstr "Hi! Some plugins have automatically updated to their latest versions on your site at %s. No further action is needed on your part." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1033 +msgid "[%s] Some themes were automatically updated" +msgstr "[%s] Some themes were automatically updated" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1020 +msgid "Howdy! Some plugins and themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part." +msgstr "Hi! Some plugins and themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1025 +msgid "[%s] Some plugins were automatically updated" +msgstr "[%s] Some plugins were automatically updated" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1344 +msgid "Move %s box up" +msgstr "Move %s box up" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1354 +msgid "Move %s box down" +msgstr "Move %s box down" + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1017 +msgid "[%s] Some plugins and themes have automatically updated" +msgstr "[%s] Some plugins and themes have automatically updated" + +#: wp-admin/includes/class-wp-comments-list-table.php:368 +msgctxt "comment" +msgid "Not spam" +msgstr "Not spam" + +#: wp-admin/includes/class-wp-site-health.php:2178 +msgid "PHP Sessions" +msgstr "PHP Sessions" + +#. translators: 1: session_start(), 2: session_write_close() +#: wp-admin/includes/class-wp-site-health.php:1129 +msgid "A PHP session was created by a %1$s function call. This interferes with REST API and loopback requests. The session should be closed by %2$s before making any HTTP requests." +msgstr "A PHP session was created by a %1$s function call. This interferes with REST API and loopback requests. The session should be closed by %2$s before making any HTTP requests." + +#. translators: 1: session_start(), 2: session_write_close() +#: wp-admin/includes/class-wp-site-health.php:1112 +msgid "PHP sessions created by a %1$s function call may interfere with REST API and loopback requests. An active session should be closed by %2$s before making any HTTP requests." +msgstr "PHP sessions created by a %1$s function call may interfere with REST API and loopback requests. An active session should be closed by %2$s before making any HTTP requests." + +#: wp-admin/includes/class-wp-site-health.php:1123 +msgid "An active PHP session was detected" +msgstr "An active PHP session was detected" + +#: wp-admin/includes/class-wp-site-health.php:1102 +msgid "No PHP sessions detected" +msgstr "No PHP sessions detected" + +#: wp-admin/includes/class-wp-screen.php:1336 +#: wp-admin/includes/class-wp-list-table.php:170 +msgid "Extended view" +msgstr "Extended view" + +#: wp-admin/includes/user.php:177 +msgid "Error: Passwords don’t match. Please enter the same password in both password fields." +msgstr "Error: passwords don’t match. Please enter the same password in both password fields." + +#: wp-admin/includes/class-wp-screen.php:1332 +#: wp-admin/includes/class-wp-list-table.php:169 +msgid "Compact view" +msgstr "Compact view" + +#: wp-admin/includes/post.php:2188 +msgctxt "block category" +msgid "Text" +msgstr "Text" + +#: wp-admin/includes/post.php:2193 +msgctxt "block category" +msgid "Media" +msgstr "Media" + +#: wp-admin/includes/post.php:2198 +msgctxt "block category" +msgid "Design" +msgstr "Design" + +#: wp-admin/includes/post.php:2203 +msgctxt "block category" +msgid "Widgets" +msgstr "Widgets" + +#: wp-admin/includes/post.php:2208 +msgctxt "block category" +msgid "Embeds" +msgstr "Embeds" + +#: wp-admin/includes/post.php:2213 +msgctxt "block category" +msgid "Reusable Blocks" +msgstr "Reusable Blocks" + +#: wp-admin/includes/meta-boxes.php:353 wp-admin/includes/meta-boxes.php:354 +#: wp-admin/js/post.js:766 +msgctxt "post action/button label" +msgid "Schedule" +msgstr "Schedule" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-plugin-installer-skin.php:301 +msgid "You are updating a plugin. Be sure to back up your database and files first." +msgstr "You are updating a plugin. Be sure to back up your database and files first." + +#: wp-admin/includes/update.php:1081 +msgid "Automatic update not scheduled. There may be a problem with WP-Cron." +msgstr "Automatic update not scheduled. There may be a problem with WP-Cron." + +#. translators: %s: Duration that WP-Cron has been overdue. +#: wp-admin/includes/update.php:1091 +msgid "Automatic update overdue by %s. There may be a problem with WP-Cron." +msgstr "Automatic update overdue by %s. There may be a problem with WP-Cron." + +#. translators: %s: Time until the next update. +#: wp-admin/includes/update.php:1097 +msgid "Automatic update scheduled in %s." +msgstr "Automatic update scheduled in %s." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:284 +#: wp-admin/js/updates.js:2644 +msgid "No plugins found. Try a different search." +msgstr "No plugins found. Try a different search." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-plugin-installer-skin.php:295 +msgid "You are uploading an older version of a current plugin. You can continue to install the older version, but be sure to back up your database and files first." +msgstr "You are uploading an older version of a current plugin. You can continue to install the older version, but be sure to back up your database and files first." + +#: wp-admin/includes/class-plugin-installer-skin.php:216 +msgid "Plugin name" +msgstr "Plugin name" + +#: wp-admin/includes/class-plugin-installer-skin.php:259 +msgid "The plugin cannot be updated due to the following:" +msgstr "The plugin cannot be updated due to the following:" + +#. translators: 1: Current PHP version, 2: Version required by the uploaded +#. plugin. +#: wp-admin/includes/class-plugin-upgrader.php:449 +#: wp-admin/includes/class-plugin-installer-skin.php:268 +msgid "The PHP version on your server is %1$s, however the uploaded plugin requires %2$s." +msgstr "The PHP version on your server is %1$s, however the uploaded plugin requires %2$s." + +#. translators: 1: Current WordPress version, 2: Version required by the +#. uploaded plugin. +#: wp-admin/includes/class-plugin-upgrader.php:460 +#: wp-admin/includes/class-plugin-installer-skin.php:280 +msgid "Your WordPress version is %1$s, however the uploaded plugin requires %2$s." +msgstr "Your WordPress version is %1$s, however the uploaded plugin requires %2$s." + +#: wp-admin/includes/class-theme-upgrader.php:105 +msgid "Downgrading the theme…" +msgstr "Downgrading the theme…" + +#: wp-admin/includes/class-theme-upgrader.php:106 +msgid "Theme downgrade failed." +msgstr "Theme downgrade failed." + +#: wp-admin/includes/class-theme-upgrader.php:107 +msgid "Theme downgraded successfully." +msgstr "Theme downgraded successfully." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-theme-installer-skin.php:330 +msgid "You are uploading an older version of a current theme. You can continue to install the older version, but be sure to back up your database and files first." +msgstr "You are uploading an older version of a current theme. You can continue to install the older version, but be sure to back up your database and files first." + +#: wp-admin/includes/class-theme-installer-skin.php:331 +#: wp-admin/includes/class-theme-installer-skin.php:337 +#: wp-admin/includes/class-plugin-installer-skin.php:296 +#: wp-admin/includes/class-plugin-installer-skin.php:302 +#: wp-admin/update-core.php:248 +msgid "https://wordpress.org/support/article/wordpress-backups/" +msgstr "https://wordpress.org/support/article/wordpress-backups/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-theme-installer-skin.php:336 +msgid "You are updating a theme. Be sure to back up your database and files first." +msgstr "You are updating a theme. Be sure to back up your database and files first." + +#: wp-admin/includes/class-theme-installer-skin.php:348 +#: wp-admin/includes/class-plugin-installer-skin.php:313 +msgid "Replace current with uploaded" +msgstr "Replace current with uploaded" + +#: wp-admin/includes/class-theme-installer-skin.php:359 +#: wp-admin/includes/class-plugin-installer-skin.php:324 +msgid "Cancel and go back" +msgstr "Cancel and go back" + +#: wp-admin/includes/class-theme-installer-skin.php:377 +#: wp-admin/includes/class-plugin-installer-skin.php:342 +msgid "The uploaded file has expired. Please go back and upload it again." +msgstr "The uploaded file has expired. Please go back and upload it again." + +#: wp-admin/includes/image-edit.php:144 +msgid "Restore original image" +msgstr "Restore original image" + +#: wp-admin/includes/class-wp-plugins-list-table.php:419 +#: wp-admin/plugin-editor.php:31 wp-admin/js/updates.js:1041 +msgid "No plugins are currently available." +msgstr "No plugins are currently available." + +#: wp-admin/includes/class-wp-plugins-list-table.php:467 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:336 +msgid "Automatic Updates" +msgstr "Automatic Updates" + +#. translators: %s: Number of plugins. +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-plugins-list-table.php:562 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:424 +msgid "Auto-updates Enabled (%s)" +msgid_plural "Auto-updates Enabled (%s)" +msgstr[0] "Auto-updates Enabled (%s)" +msgstr[1] "Auto-updates Enabled (%s)" + +#. translators: %s: Number of plugins. +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-plugins-list-table.php:570 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:432 +msgid "Auto-updates Disabled (%s)" +msgid_plural "Auto-updates Disabled (%s)" +msgstr[0] "Auto-updates Disabled (%s)" +msgstr[1] "Auto-updates Disabled (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:619 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:485 +msgid "Enable Auto-updates" +msgstr "Enable Auto-updates" + +#: wp-admin/includes/class-wp-plugins-list-table.php:622 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:489 +msgid "Disable Auto-updates" +msgstr "Disable Auto-updates" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1113 +#: wp-admin/themes.php:685 wp-admin/js/updates.js:2940 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:788 +msgid "Disable auto-updates" +msgstr "Disable auto-updates" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1117 +#: wp-admin/themes.php:689 wp-admin/js/updates.js:2951 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:792 +msgid "Enable auto-updates" +msgstr "Enable auto-updates" + +#. translators: %s: Theme error. +#: wp-admin/includes/class-theme-upgrader.php:95 +msgid "The current theme has the following error: \"%s\"." +msgstr "The current theme has the following error: \"%s\"." + +#: wp-admin/includes/class-theme-upgrader.php:99 +msgid "Updating the theme…" +msgstr "Updating the theme…" + +#: wp-admin/includes/class-theme-installer-skin.php:239 +msgid "Theme name" +msgstr "Theme name" + +#: wp-admin/includes/class-theme-installer-skin.php:242 +#: wp-admin/includes/class-plugin-installer-skin.php:219 +msgid "Required WordPress version" +msgstr "Required WordPress version" + +#: wp-admin/includes/class-theme-installer-skin.php:243 +#: wp-admin/includes/class-plugin-installer-skin.php:220 +msgid "Required PHP version" +msgstr "Required PHP version" + +#: wp-admin/includes/class-theme-installer-skin.php:248 +#: wp-admin/includes/class-plugin-installer-skin.php:225 +msgid "Uploaded" +msgstr "Uploaded" + +#: wp-admin/includes/class-theme-installer-skin.php:270 +msgid "(not found)" +msgstr "(not found)" + +#: wp-admin/includes/class-theme-installer-skin.php:294 +msgid "The theme cannot be updated due to the following:" +msgstr "The theme cannot be updated due to the following:" + +#. translators: 1: Current PHP version, 2: Version required by the uploaded +#. theme. +#: wp-admin/includes/class-theme-installer-skin.php:303 +#: wp-admin/includes/class-theme-upgrader.php:597 +msgid "The PHP version on your server is %1$s, however the uploaded theme requires %2$s." +msgstr "The PHP version on your server is %1$s, however the uploaded theme requires %2$s." + +#. translators: 1: Current WordPress version, 2: Version required by the +#. uploaded theme. +#: wp-admin/includes/class-theme-installer-skin.php:315 +#: wp-admin/includes/class-theme-upgrader.php:607 +msgid "Your WordPress version is %1$s, however the uploaded theme requires %2$s." +msgstr "Your WordPress version is %1$s, however the uploaded theme requires %2$s." + +#: wp-admin/includes/theme.php:304 +msgid "Block Editor Patterns" +msgstr "Block Editor Patterns" + +#: wp-admin/includes/theme.php:314 +msgid "Full Site Editing" +msgstr "Full Site Editing" + +#: wp-admin/includes/theme.php:1006 wp-admin/theme-install.php:395 +#: wp-admin/theme-install.php:427 +msgctxt "theme" +msgid "Cannot Install" +msgstr "Cannot Install" + +#: wp-admin/includes/class-wp-debug-data.php:710 +msgid "PHP memory limit (only for admin screens)" +msgstr "PHP memory limit (only for admin screens)" + +#: wp-admin/includes/class-wp-debug-data.php:114 +msgid "Is this site discouraging search engines?" +msgstr "Is this site discouraging search engines?" + +#: wp-admin/includes/class-wp-debug-data.php:771 +msgid "Are pretty permalinks supported?" +msgstr "Are pretty permalinks supported?" + +#: wp-admin/includes/class-wp-debug-data.php:989 +#: wp-admin/includes/class-wp-debug-data.php:1305 +#: wp-admin/includes/class-wp-plugins-list-table.php:1102 +#: wp-admin/themes.php:682 wp-admin/js/updates.js:2942 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:777 +msgid "Auto-updates enabled" +msgstr "Auto-updates enabled" + +#: wp-admin/includes/class-wp-debug-data.php:991 +#: wp-admin/includes/class-wp-debug-data.php:1307 +#: wp-admin/includes/class-wp-plugins-list-table.php:1104 +#: wp-admin/themes.php:680 wp-admin/js/updates.js:2953 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:779 +msgid "Auto-updates disabled" +msgstr "Auto-updates disabled" + +#: wp-admin/includes/class-wp-debug-data.php:1226 +msgid "Auto-update" +msgstr "Auto-update" + +#: wp-admin/includes/class-plugin-upgrader.php:80 +msgid "Removing the current plugin…" +msgstr "Removing the current plugin…" + +#: wp-admin/includes/class-plugin-upgrader.php:81 +msgid "Could not remove the current plugin." +msgstr "Could not remove the current plugin." + +#: wp-admin/includes/class-plugin-upgrader.php:90 +msgid "Updating the plugin…" +msgstr "Updating the plugin…" + +#: wp-admin/includes/class-plugin-upgrader.php:96 +msgid "Downgrading the plugin…" +msgstr "Downgrading the plugin…" + +#: wp-admin/includes/class-plugin-upgrader.php:97 +msgid "Plugin downgrade failed." +msgstr "Plugin downgrade failed." + +#: wp-admin/includes/class-plugin-upgrader.php:98 +msgid "Plugin downgraded successfully." +msgstr "Plugin downgraded successfully." + +#: wp-admin/includes/theme.php:329 +msgid "Wide Blocks" +msgstr "Wide Blocks" + +#: wp-admin/includes/theme.php:305 +msgid "Block Editor Styles" +msgstr "Block Editor Styles" + +#: wp-admin/edit-form-comment.php:108 +msgid "Spam" +msgstr "Spam" + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:401 +msgid "Unable to write to %s file." +msgstr "Unable to write to %s file." + +#. translators: %s: The options page name. +#: wp-admin/options.php:240 +msgid "Error: Options page %s not found in the allowed options list." +msgstr "Error: options page %s not found in the allowed options list." + +#: wp-admin/themes.php:303 wp-admin/import.php:64 wp-admin/users.php:277 +#: wp-admin/includes/network.php:116 wp-admin/includes/network.php:142 +msgid "Error:" +msgstr "Error:" + +#: wp-admin/themes.php:253 wp-admin/network/themes.php:350 +#: wp-admin/network/menu.php:81 +msgctxt "theme" +msgid "Add New" +msgstr "Add New" + +#. translators: %s: web.config +#. translators: %s: .htaccess +#: wp-admin/options-permalink.php:168 wp-admin/options-permalink.php:181 +msgid "You should update your %s file now." +msgstr "You should update your %s file now." + +#: wp-admin/update-core.php:171 +msgid "This localized version contains both the translation and various other localization fixes." +msgstr "This localised version contains both the translation and various other localisation fixes." + +#. translators: 1: Number of issues. 2: URL to Site Health screen. +#: wp-admin/includes/dashboard.php:1878 +msgid "Take a look at the %1$d item on the Site Health screen." +msgid_plural "Take a look at the %1$d items on the Site Health screen." +msgstr[0] "Take a look at the %1$d item on the Site Health screen." +msgstr[1] "Take a look at the %1$d items on the Site Health screen." + +#: wp-admin/includes/dashboard.php:1868 +msgid "Your site’s health is looking good, but there are still some things you can do to improve its performance and security." +msgstr "Your site’s health is looking good, but there are still some things you can do to improve its performance and security." + +#: wp-admin/includes/dashboard.php:1866 +msgid "Great job! Your site currently passes all site health checks." +msgstr "Great job! Your site currently passes all site health checks." + +#: wp-admin/includes/dashboard.php:1864 +msgid "Your site has critical issues that should be addressed as soon as possible to improve its performance and security." +msgstr "Your site has critical issues that should be addressed as soon as possible to improve its performance and security." + +#. translators: %s: URL to Site Health screen. +#: wp-admin/includes/dashboard.php:1856 +msgid "Site health checks will automatically run periodically to gather information about your site. You can also visit the Site Health screen to gather information about your site now." +msgstr "Site health checks will automatically run periodically to gather information about your site. You can also visit the Site Health screen to gather information about your site now." + +#: wp-admin/includes/dashboard.php:1844 +msgid "No information yet…" +msgstr "No information yet…" + +#. translators: 1: upload_max_filesize, 2: php.ini +#: wp-admin/includes/file.php:787 +msgid "The uploaded file exceeds the %1$s directive in %2$s." +msgstr "The uploaded file exceeds the %1$s directive in %2$s." + +#: wp-admin/includes/class-wp-comments-list-table.php:221 +msgid "No comments found in Trash." +msgstr "No comments found in Bin." + +#. translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize +#: wp-admin/includes/import.php:87 wp-admin/includes/file.php:836 +msgid "File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s." +msgstr "File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s." + +#: wp-admin/includes/class-wp-site-health.php:2671 +#: wp-admin/js/site-health.js:336 +msgid "A test is unavailable" +msgstr "A test is unavailable" + +#. translators: 1: The WordPress error message. 2: The WordPress error code. +#: wp-admin/includes/class-wp-site-health.php:1962 +#: wp-admin/includes/class-wp-site-health.php:2546 +msgid "Error: %1$s (%2$s)" +msgstr "Error: %1$s (%2$s)" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:775 +msgid "Your site is running an outdated version of PHP (%s), which requires an update" +msgstr "Your site is running an outdated version of PHP (%s), which requires an update" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:764 +msgid "Your site is running an older version of PHP (%s), which should be updated" +msgstr "Your site is running an older version of PHP (%s), which should be updated" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:752 +msgid "Your site is running an older version of PHP (%s)" +msgstr "Your site is running an older version of PHP (%s)" + +#. translators: %s: The current PHP version. +#: wp-admin/includes/class-wp-site-health.php:717 +msgid "Your site is running the current version of PHP (%s)" +msgstr "Your site is running the current version of PHP (%s)" + +#: wp-admin/includes/class-wp-media-list-table.php:247 +msgid "No media files found in Trash." +msgstr "No media files found in Bin." + +#. translators: Date string for upcoming events. 1: Starting month, 2: Starting +#. day, 3: Ending month, 4: Ending day, 5: Year. +#. translators: Date string for upcoming events. 1: Starting month, 2: Starting +#. day, 3: Ending month, 4: Ending day, 5: Ending year. +#: wp-admin/includes/class-wp-community-events.php:422 +#: wp-admin/js/dashboard.js:778 +msgid "%1$s %2$d – %3$s %4$d, %5$d" +msgstr "%1$s %2$d – %3$s %4$d, %5$d" + +#. translators: Upcoming events year format. See +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:417 +#: wp-admin/includes/class-wp-community-events.php:427 +#: wp-admin/js/dashboard.js:791 wp-admin/js/dashboard.js:802 +msgctxt "upcoming events year format" +msgid "Y" +msgstr "Y" + +#. translators: Upcoming events day format. See +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:414 +#: wp-admin/includes/class-wp-community-events.php:415 +#: wp-admin/includes/class-wp-community-events.php:424 +#: wp-admin/includes/class-wp-community-events.php:426 +#: wp-admin/js/dashboard.js:789 wp-admin/js/dashboard.js:790 +#: wp-admin/js/dashboard.js:799 wp-admin/js/dashboard.js:801 +msgctxt "upcoming events day format" +msgid "j" +msgstr "j" + +#. translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: +#. Ending day, 4: Year. +#: wp-admin/includes/class-wp-community-events.php:411 +#: wp-admin/js/dashboard.js:776 +msgid "%1$s %2$d–%3$d, %4$d" +msgstr "%1$s %2$d–%3$d, %4$d" + +#. translators: Upcoming events month format. See +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:405 +#: wp-admin/includes/class-wp-community-events.php:406 +#: wp-admin/js/dashboard.js:788 wp-admin/js/dashboard.js:798 +#: wp-admin/js/dashboard.js:800 +msgctxt "upcoming events month format" +msgid "F" +msgstr "F" + +#: wp-admin/includes/class-wp-debug-data.php:859 +msgid "Table prefix" +msgstr "Table prefix" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:215 +msgid "Delete requests" +msgstr "Delete requests" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:213 +msgid "Resend confirmation requests" +msgstr "Resend confirmation requests" + +#: wp-admin/includes/class-wp-site-health.php:2174 +msgid "PHP Default Timezone" +msgstr "PHP Default Time Zone" + +#. translators: %s: date_default_timezone_set() +#: wp-admin/includes/class-wp-site-health.php:1084 +msgid "PHP default timezone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times." +msgstr "PHP default time zone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times." + +#: wp-admin/includes/class-wp-site-health.php:1078 +msgid "PHP default timezone is invalid" +msgstr "PHP default time zone is invalid" + +#: wp-admin/includes/class-wp-site-health.php:1069 +msgid "PHP default timezone was configured by WordPress on loading. This is necessary for correct calculations of dates and times." +msgstr "PHP default time zone was configured by WordPress on loading. This is necessary for correct calculations of dates and times." + +#: wp-admin/includes/class-wp-site-health.php:1061 +msgid "PHP default timezone is valid" +msgstr "PHP default time zone is valid" + +#. translators: %s: add_submenu_page() +#: wp-admin/includes/plugin.php:1434 +msgid "The seventh parameter passed to %s should be an integer representing menu position." +msgstr "The seventh parameter passed to %s should be an integer representing menu position." + +#. translators: 1: WordPress version number, 2: The PHP extension name needed. +#: wp-admin/includes/update-core.php:1028 +msgid "The update cannot be installed because WordPress %1$s requires the %2$s PHP extension." +msgstr "The update cannot be installed because WordPress %1$s requires the %2$s PHP extension." + +#: wp-admin/includes/class-wp-site-health.php:1251 +msgid "UTF8MB4 is the character set WordPress prefers for database storage because it safely supports the widest set of characters and encodings, including Emoji, enabling better support for non-English languages." +msgstr "UTF8MB4 is the character set WordPress prefers for database storage because it safely supports the widest set of characters and encodings, including Emoji, enabling better support for non-English languages." + +#: wp-admin/privacy.php:65 +msgid "https://wordpress.org/about/stats/" +msgstr "https://en-gb.wordpress.org/about/stats/" + +#: wp-admin/export.php:57 +msgid "Documentation on Export" +msgstr "Documentation on Export" + +#: wp-admin/plugin-install.php:109 +msgid "Documentation on Installing Plugins" +msgstr "Documentation on Installing Plugins" + +#: wp-admin/edit.php:309 +msgid "Documentation on Managing Pages" +msgstr "Documentation on Managing Pages" + +#: wp-admin/edit.php:284 +msgid "Documentation on Managing Posts" +msgstr "Documentation on Managing Posts" + +#: wp-admin/options-discussion.php:31 +msgid "Documentation on Discussion Settings" +msgstr "Documentation on Discussion Settings" + +#: wp-admin/theme-install.php:131 +msgid "Documentation on Adding New Themes" +msgstr "Documentation on Adding New Themes" + +#: wp-admin/media-new.php:60 +msgid "Documentation on Uploading Media Files" +msgstr "Documentation on Uploading Media Files" + +#: wp-admin/users.php:75 +msgid "Descriptions of Roles and Capabilities" +msgstr "Descriptions of Roles and Capabilities" + +#: wp-admin/users.php:74 +msgid "Documentation on Managing Users" +msgstr "Documentation on Managing Users" + +#: wp-admin/user-edit.php:327 +msgid "More information" +msgstr "More information" + +#: wp-admin/user-edit.php:71 +msgid "Documentation on User Profiles" +msgstr "Documentation on User Profiles" + +#: wp-admin/options-media.php:37 +msgid "Documentation on Media Settings" +msgstr "Documentation on Media Settings" + +#: wp-admin/widgets.php:83 +msgid "Documentation on Widgets" +msgstr "Documentation on Widgets" + +#: wp-admin/import.php:31 +msgid "Documentation on Import" +msgstr "Documentation on Import" + +#: wp-admin/tools.php:55 +msgid "Documentation on Tools" +msgstr "Documentation on Tools" + +#: wp-admin/options.php:351 +msgid "This page allows direct access to your site settings. You can break things here. Please be cautious!" +msgstr "This page allows direct access to your site settings. You can break things here. Please be cautious!" + +#. translators: %s: The option/setting. +#: wp-admin/options.php:299 +msgid "The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/" +msgstr "The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/" + +#: wp-admin/edit-form-advanced.php:380 +msgid "Format — Post Formats designate how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. Learn more about each post format." +msgstr "Format — Post Formats designate how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. Learn more about each post format." + +#: wp-admin/edit-form-advanced.php:337 +msgid "Documentation on Editing Pages" +msgstr "Documentation on Editing Pages" + +#: wp-admin/edit-form-advanced.php:336 +msgid "Documentation on Adding New Pages" +msgstr "Documentation on Adding New Pages" + +#: wp-admin/edit-form-advanced.php:319 +msgid "Documentation on Writing and Editing Posts" +msgstr "Documentation on Writing and Editing Posts" + +#: wp-admin/upload.php:75 wp-admin/upload.php:252 +msgid "Documentation on Media Library" +msgstr "Documentation on Media Library" + +#: wp-admin/revision.php:156 +msgid "Revisions Management" +msgstr "Revisions Management" + +#: wp-admin/media.php:96 wp-admin/edit-form-advanced.php:355 +msgid "Documentation on Edit Media" +msgstr "Documentation on Edit Media" + +#: wp-admin/edit-comments.php:196 +msgid "Documentation on Keyboard Shortcuts" +msgstr "Documentation on Keyboard Shortcuts" + +#: wp-admin/edit-comments.php:195 +msgid "Documentation on Comment Spam" +msgstr "Documentation on Comment Spam" + +#: wp-admin/plugins.php:587 +msgid "Documentation on Managing Plugins" +msgstr "Documentation on Managing Plugins" + +#: wp-admin/index.php:111 +msgid "Documentation on Dashboard" +msgstr "Documentation on Dashboard" + +#: wp-admin/user-new.php:294 +msgid "Documentation on Adding New Users" +msgstr "Documentation on Adding New Users" + +#. translators: %s: URL to Site Health Status page. +#: wp-admin/site-health-info.php:90 +msgid "This page can show you every detail about the configuration of your WordPress website. For any improvements that could be made, see the Site Health Status page." +msgstr "This page can show you every detail about the configuration of your WordPress website. For any improvements that could be made, see the Site Health Status page." + +#: wp-admin/options-permalink.php:212 +msgid "https://wordpress.org/support/article/using-permalinks/" +msgstr "https://wordpress.org/support/article/using-permalinks/" + +#: wp-admin/includes/dashboard.php:1846 wp-admin/site-health-info.php:47 +#: wp-admin/site-health.php:52 +msgid "Results are still loading…" +msgstr "Results are still loading…" + +#: wp-admin/options-permalink.php:413 +msgid "Documentation on Nginx configuration." +msgstr "Documentation on Nginx configuration." + +#: wp-admin/options-permalink.php:61 +msgid "Documentation on Using Permalinks" +msgstr "Documentation on Using Permalinks" + +#: wp-admin/options-permalink.php:60 +msgid "Documentation on Permalinks Settings" +msgstr "Documentation on Permalinks Settings" + +#: wp-admin/update-core.php:969 +msgid "Documentation on Updating WordPress" +msgstr "Documentation on Updating WordPress" + +#: wp-admin/nav-menus.php:658 +msgid "Documentation on Menus" +msgstr "Documentation on Menus" + +#: wp-admin/plugin-editor.php:143 +msgid "Documentation on Writing Plugins" +msgstr "Documentation on Writing Plugins" + +#: wp-admin/plugin-editor.php:142 +msgid "Documentation on Editing Plugins" +msgstr "Documentation on Editing Plugins" + +#: wp-admin/theme-editor.php:54 +msgid "Documentation on Template Tags" +msgstr "Documentation on Template Tags" + +#: wp-admin/theme-editor.php:53 +msgid "Documentation on Editing Files" +msgstr "Documentation on Editing Files" + +#: wp-admin/theme-editor.php:52 wp-admin/themes.php:206 +msgid "Documentation on Using Themes" +msgstr "Documentation on Using Themes" + +#: wp-admin/theme-editor.php:51 +msgid "Documentation on Theme Development" +msgstr "Documentation on Theme Development" + +#: wp-admin/comment.php:70 wp-admin/edit-comments.php:194 +msgid "Documentation on Comments" +msgstr "Documentation on Comments" + +#: wp-admin/options-general.php:377 +msgid "Documentation on date and time formatting." +msgstr "Documentation on date and time formatting." + +#. translators: %s: UTC time. +#: wp-admin/options-general.php:246 +msgid "Universal time is %s." +msgstr "Universal time is %s." + +#. translators: %s: UTC abbreviation +#: wp-admin/options-general.php:235 +msgid "Choose either a city in the same timezone as you or a %s (Coordinated Universal Time) time offset." +msgstr "Choose either a city in the same time zone as you or a %s (Coordinated Universal Time) time offset." + +#: wp-admin/options-general.php:111 +msgid "Administration Email Address" +msgstr "Administration Email Address" + +#: wp-admin/options-general.php:100 +msgid "https://wordpress.org/support/article/giving-wordpress-its-own-directory/" +msgstr "https://wordpress.org/support/article/giving-wordpress-its-own-directory/" + +#: wp-admin/options-general.php:48 +msgid "Documentation on General Settings" +msgstr "Documentation on General Settings" + +#: wp-admin/includes/file.php:324 wp-admin/theme-editor.php:323 +#: wp-admin/plugin-editor.php:296 wp-admin/options-permalink.php:366 +#: wp-admin/options-permalink.php:391 wp-admin/options-permalink.php:424 +msgid "https://wordpress.org/support/article/changing-file-permissions/" +msgstr "https://wordpress.org/support/article/changing-file-permissions/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/file.php:323 wp-admin/theme-editor.php:322 +#: wp-admin/plugin-editor.php:295 +msgid "You need to make this file writable before you can save your changes. See Changing File Permissions for more information." +msgstr "You need to make this file writable before you can save your changes. See Changing File Permissions for more information." + +#: wp-admin/includes/dashboard.php:1957 +msgid "https://wordpress.org/support/article/first-steps-with-wordpress/" +msgstr "https://wordpress.org/support/article/first-steps-with-wordpress/" + +#: wp-admin/includes/ajax-actions.php:2434 +msgid "Upload failed. Please reload and try again." +msgstr "Upload failed. Please reload and try again." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:67 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:141 +msgid "Erasure completed." +msgstr "Erasure completed." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:142 +msgid "Data erasure has failed." +msgstr "Data erasure has failed." + +#: wp-admin/includes/image.php:161 +msgid "The attached file cannot be found." +msgstr "The attached file cannot be found." + +#: wp-admin/includes/template.php:2218 +msgctxt "page label" +msgid "Privacy Policy Page" +msgstr "Privacy Policy Page" + +#: wp-admin/includes/template.php:2213 +msgctxt "page label" +msgid "Posts Page" +msgstr "Posts Page" + +#: wp-admin/includes/template.php:2209 +msgctxt "page label" +msgid "Front Page" +msgstr "Front Page" + +#: wp-admin/includes/template.php:2200 +msgctxt "post status" +msgid "Sticky" +msgstr "Sticky" + +#: wp-admin/includes/template.php:2192 +msgctxt "post status" +msgid "Customization Draft" +msgstr "Customisation Draft" + +#: wp-admin/includes/template.php:2178 +msgctxt "post status" +msgid "Password protected" +msgstr "Password protected" + +#. translators: %s: The name of the late cron event. +#: wp-admin/includes/class-wp-site-health.php:1661 +msgid "The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." +msgstr "The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." + +#: wp-admin/includes/class-wp-site-health.php:1655 +msgid "A scheduled event is late" +msgstr "A scheduled event is late" + +#: wp-admin/includes/class-wp-site-health.php:1509 +msgid "An HTTPS connection is a more secure way of browsing the web. Many services now have HTTPS as a requirement. HTTPS allows you to take advantage of new features that can increase site speed, improve search rankings, and gain the trust of your visitors by helping to protect their online privacy." +msgstr "An HTTPS connection is a more secure way of browsing the web. Many services now have HTTPS as a requirement. HTTPS allows you to take advantage of new features that can increase site speed, improve search rankings, and gain the trust of your visitors by helping to protect their online privacy." + +#. translators: %s: The current version of WordPress installed on this site. +#: wp-admin/includes/class-wp-site-health.php:321 +msgid "Your version of WordPress (%s) is up to date" +msgstr "Your version of WordPress (%s) is up to date" + +#: wp-admin/includes/ms.php:1158 wp-admin/network/site-new.php:32 +#: wp-admin/network/sites.php:45 +msgid "Documentation on Site Management" +msgstr "Documentation on Site Management" + +#: wp-admin/includes/meta-boxes.php:807 +msgid "https://wordpress.org/support/article/introduction-to-blogging/#managing-comments" +msgstr "https://wordpress.org/support/article/introduction-to-blogging/#managing-comments" + +#: wp-admin/includes/meta-boxes.php:783 +msgid "https://wordpress.org/support/article/custom-fields/" +msgstr "https://wordpress.org/support/article/custom-fields/" + +#: wp-admin/includes/meta-boxes.php:746 +msgid "https://wordpress.org/support/article/introduction-to-blogging/#comments" +msgstr "https://wordpress.org/support/article/introduction-to-blogging/#comments" + +#. translators: Post date information. %s: Date on which the post is to be +#. published. +#: wp-admin/includes/meta-boxes.php:236 +msgid "Publish on: %s" +msgstr "Publish on: %s" + +#. translators: Post date information. %s: Date on which the post is to be +#. published. +#: wp-admin/includes/meta-boxes.php:233 +msgid "Schedule for: %s" +msgstr "Schedule for: %s" + +#. translators: Post date information. %s: Date on which the post was +#. published. +#: wp-admin/includes/meta-boxes.php:228 +msgid "Published on: %s" +msgstr "Published on: %s" + +#. translators: Post date information. %s: Date on which the post is currently +#. scheduled to be published. +#: wp-admin/includes/meta-boxes.php:225 +msgid "Scheduled for: %s" +msgstr "Scheduled for: %s" + +#. translators: Publish box time format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/meta-boxes.php:220 wp-admin/includes/meta-boxes.php:412 +#: wp-admin/edit-form-advanced.php:177 wp-admin/edit-form-comment.php:130 +msgctxt "publish box time format" +msgid "H:i" +msgstr "H:i" + +#. translators: Publish box date format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/meta-boxes.php:218 wp-admin/includes/meta-boxes.php:410 +#: wp-admin/edit-form-advanced.php:175 wp-admin/edit-form-comment.php:128 +msgctxt "publish box date format" +msgid "M j, Y" +msgstr "j M Y" + +#. translators: 1: Marker. +#: wp-admin/includes/misc.php:136 +msgid "" +"The directives (lines) between \"BEGIN %1$s\" and \"END %1$s\" are\n" +"dynamically generated, and should only be modified via WordPress filters.\n" +"Any changes to the directives between these markers will be overwritten." +msgstr "" +"The directives (lines) between \"BEGIN %1$s\" and \"END %1$s\" are\n" +"dynamically generated, and should only be modified via WordPress filters.\n" +"Any changes to the directives between these markers will be overwritten." + +#: wp-admin/includes/image-edit.php:67 +msgid "Rotate right" +msgstr "Rotate right" + +#: wp-admin/includes/image-edit.php:66 +msgid "Rotate left" +msgstr "Rotate left" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:147 +msgid "All automatic updates are disabled." +msgstr "All automatic updates are disabled." + +#: wp-admin/includes/class-wp-debug-data.php:871 +msgid "Database collation" +msgstr "Database collation" + +#: wp-admin/includes/class-wp-debug-data.php:865 +msgid "Database charset" +msgstr "Database charset" + +#: wp-admin/includes/class-wp-debug-data.php:160 +msgid "Inactive Themes" +msgstr "Inactive Themes" + +#: wp-admin/includes/class-wp-debug-data.php:155 +msgid "Parent Theme" +msgstr "Parent Theme" + +#. translators: %s: wp-content directory name. +#: wp-admin/includes/class-wp-debug-data.php:143 +#: wp-admin/includes/class-wp-plugins-list-table.php:668 +msgid "Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins." +msgstr "Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins." + +#. translators: Description for the About section in a personal data export. +#: wp-admin/includes/privacy-tools.php:361 +msgctxt "personal data group description" +msgid "Overview of export report." +msgstr "Overview of export report." + +#: wp-admin/options-writing.php:52 +msgid "Documentation on Writing Settings" +msgstr "Documentation on Writing Settings" + +#: wp-admin/edit-tags.php:311 +msgid "Documentation on Tags" +msgstr "Documentation on Tags" + +#: wp-admin/edit-tags.php:307 +msgid "Documentation on Categories" +msgstr "Documentation on Categories" + +#. translators: %s: Documentation URL. +#: wp-admin/options-reading.php:170 +msgid "Your theme determines how content is displayed in browsers. Learn more about feeds." +msgstr "Your theme determines how content is displayed in browsers. Learn more about feeds." + +#: wp-admin/options-reading.php:160 wp-admin/options-reading.php:161 +msgid "For each post in a feed, include" +msgstr "For each post in a feed, include" + +#: wp-admin/options-reading.php:144 +msgid "Warning: these pages should not be the same as your Privacy Policy page!" +msgstr "Warning: these pages should not be the same as your Privacy Policy page!" + +#: wp-admin/options-reading.php:52 +msgid "Documentation on Reading Settings" +msgstr "Documentation on Reading Settings" + +#: wp-admin/options-reading.php:34 wp-admin/options-reading.php:171 +msgid "https://wordpress.org/support/article/wordpress-feeds/" +msgstr "https://wordpress.org/support/article/wordpress-feeds/" + +#. translators: %s: Site title. +#: wp-admin/ms-delete-site.php:92 +msgid "[%s] Delete My Site" +msgstr "[%s] Delete My Site" + +#: wp-admin/options-discussion.php:58 +msgid "Allow people to submit comments on new posts" +msgstr "Allow people to submit comments on new posts" + +#: wp-admin/options-discussion.php:46 wp-admin/options-discussion.php:47 +msgid "Default post settings" +msgstr "Default post settings" + +#. translators: %s: Gravatar URL. +#: wp-admin/user-edit.php:590 +msgid "You can change your profile picture on Gravatar." +msgstr "You can change your profile picture on Gravatar." + +#: wp-admin/plugins.php:700 +msgid "Selected plugins deactivated." +msgstr "Selected plugins deactivated." + +#: wp-admin/plugins.php:698 +msgid "Plugin deactivated." +msgstr "Plugin deactivated." + +#: wp-admin/plugins.php:696 +msgid "Selected plugins activated." +msgstr "Selected plugins activated." + +#: wp-admin/plugins.php:694 +msgid "Plugin activated." +msgstr "Plugin activated." + +#: wp-admin/plugins.php:687 +msgid "The selected plugins have been deleted." +msgstr "The selected plugins have been deleted." + +#: wp-admin/plugins.php:685 +msgid "The selected plugin has been deleted." +msgstr "The selected plugin has been deleted." + +#. translators: 1: Plugin file, 2: Error message. +#: wp-admin/plugins.php:611 +msgid "The plugin %1$s has been deactivated due to an error: %2$s" +msgstr "The plugin %1$s has been deactivated due to an error: %2$s" + +#: wp-admin/plugins.php:704 +msgid "Plugin resumed." +msgstr "Plugin resumed." + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/theme-editor.php:367 +msgid "If you need to tweak more than your theme’s CSS, you might want to try making a child theme." +msgstr "If you need to tweak more than your theme’s CSS, you might want to try making a child theme." + +#: wp-admin/theme-editor.php:359 +msgid "You appear to be making direct edits to your theme in the WordPress dashboard. We recommend that you don’t! Editing your theme directly could break your site and your changes may be lost in future updates." +msgstr "You appear to be making direct edits to your theme in the WordPress dashboard. We recommend that you don’t! Editing your theme directly could break your site and your changes may be lost in future updates." + +#. translators: Maximum number of words used in a preview of a draft on the +#. dashboard. +#: wp-admin/includes/dashboard.php:619 +msgctxt "draft_length" +msgid "10" +msgstr "10" + +#: wp-admin/includes/file.php:478 wp-admin/theme-editor.php:278 +#: wp-admin/plugin-editor.php:109 +msgid "File does not exist! Please double check the name and try again." +msgstr "File does not exist! Please double check the name and try again." + +#. translators: 1: $image, 2: WP_Image_Editor +#: wp-admin/includes/image-edit.php:286 wp-admin/includes/image-edit.php:355 +#: wp-admin/includes/image-edit.php:515 +msgid "%1$s needs to be a %2$s object." +msgstr "%1$s needs to be a %2$s object." + +#. translators: %s: Recovery Mode exit link. +#: wp-admin/includes/update.php:1004 +msgid "You are in recovery mode. This means there may be an error with a theme or plugin. To exit recovery mode, log out or use the Exit button. Exit Recovery Mode" +msgstr "You are in recovery mode. This means there may be an error with a theme or plugin. To exit recovery mode, log out or use the Exit button. Exit Recovery Mode" + +#: wp-admin/about.php:191 +msgid "Improvements for everyone" +msgstr "Improvements for everyone" + +#. translators: Tab heading for Site Health Status page. +#: wp-admin/site-health-info.php:55 wp-admin/site-health.php:60 +msgctxt "Site Health" +msgid "Status" +msgstr "Status" + +#. translators: Tab heading for Site Health Info page. +#: wp-admin/site-health-info.php:62 wp-admin/site-health.php:67 +msgctxt "Site Health" +msgid "Info" +msgstr "Info" + +#: wp-admin/includes/class-wp-debug-data.php:456 +msgid "Themes directory location" +msgstr "Themes directory location" + +#: wp-admin/includes/class-wp-debug-data.php:120 +msgctxt "comment status" +msgid "Closed" +msgstr "Closed" + +#. translators: %s: Number of critical issues found. +#: wp-admin/site-health.php:105 wp-admin/js/site-health.js:151 +msgid "%s critical issue" +msgid_plural "%s critical issues" +msgstr[0] "%s critical issue" +msgstr[1] "%s critical issues" + +#. translators: 1: Name of the library, 2: Number of version. +#: wp-admin/includes/class-wp-site-health.php:1322 +#: wp-admin/includes/class-wp-site-health.php:1338 +msgid "WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator." +msgstr "WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator." + +#. translators: %s: Version number. +#: wp-admin/includes/class-wp-site-health.php:1287 +msgid "WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator." +msgstr "WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator." + +#. translators: %s: Version number. +#: wp-admin/includes/class-wp-site-health.php:1267 +msgid "WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator." +msgstr "WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator." + +#. translators: Localized version of WordPress requirements if one exists. +#: wp-admin/includes/class-wp-site-health.php:1165 +msgid "https://wordpress.org/about/requirements/" +msgstr "https://wordpress.org/about/requirements/" + +#: wp-admin/includes/class-wp-site-health.php:1160 +msgid "The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings." +msgstr "The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings." + +#: wp-admin/includes/class-wp-site-health.php:840 +msgid "PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator." +msgstr "PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator." + +#: wp-admin/includes/class-wp-site-health.php:1403 +msgid "Get help resolving this issue." +msgstr "Get help resolving this issue." + +#: wp-admin/includes/class-wp-site-health.php:1166 +msgid "Learn more about what WordPress requires to run." +msgstr "Learn more about what WordPress requires to run." + +#: wp-admin/update-core.php:249 +msgid "https://wordpress.org/support/article/updating-wordpress/" +msgstr "https://wordpress.org/support/article/updating-wordpress/" + +#: wp-admin/includes/class-wp-site-health.php:494 +msgid "Manage your themes" +msgstr "Manage your themes" + +#: wp-admin/includes/class-wp-site-health.php:461 +msgid "Manage inactive plugins" +msgstr "Manage inactive plugins" + +#: wp-admin/includes/class-wp-site-health.php:412 +msgid "Update your plugins" +msgstr "Update your plugins" + +#: wp-admin/includes/class-wp-site-health.php:361 +msgid "Manage your plugins" +msgstr "Manage your plugins" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:332 +msgid "View Privacy Policy Guide." +msgstr "View Privacy Policy Guide." + +#: wp-admin/includes/class-wp-debug-data.php:76 +msgid "User Language" +msgstr "User Language" + +#. translators: 1: WP_DEBUG_DISPLAY, 2: WP_DEBUG +#: wp-admin/includes/class-wp-site-health.php:1478 +msgid "The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site." +msgstr "The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site." + +#. translators: Background update finished notification email subject. %s: Site +#. title. +#: wp-admin/includes/class-wp-automatic-updater.php:1345 +msgid "[%s] Background Update Finished" +msgstr "[%s] Background Update Finished" + +#. translators: Background update failed notification email subject. %s: Site +#. title. +#: wp-admin/includes/class-wp-automatic-updater.php:1342 +msgid "[%s] Background Update Failed" +msgstr "[%s] Background Update Failed" + +#: wp-admin/plugins.php:635 +msgid "Plugin could not be resumed because it triggered a fatal error." +msgstr "Plugin could not be resumed because it triggered a fatal error." + +#: wp-admin/includes/class-wp-site-health.php:606 +#: wp-admin/includes/class-wp-site-health.php:652 +msgid "You should remove inactive themes" +msgstr "You should remove inactive themes" + +#: wp-admin/includes/class-wp-site-health.php:581 +msgid "Your site has 1 installed theme, and it is up to date." +msgstr "Your site has 1 installed theme, and it is up to date." + +#: wp-admin/includes/class-wp-site-health.php:418 +msgid "Your site has 1 active plugin, and it is up to date." +msgstr "Your site has 1 active plugin, and it is up to date." + +#: wp-admin/site-health.php:126 +msgid "Passed tests" +msgstr "Passed tests" + +#: wp-admin/site-health.php:20 +msgid "Sorry, you are not allowed to access site health information." +msgstr "Sorry, you are not allowed to access site health information." + +#: wp-admin/site-health-info.php:100 +msgid "Copy site info to clipboard" +msgstr "Copy site info to clipboard" + +#: wp-admin/site-health-info.php:94 +msgid "If you want to export a handy list of all the information on this page, you can use the button below to copy it to the clipboard. You can then paste it in a text file and save it to your device, or paste it in an email exchange with a support engineer or theme/plugin developer for example." +msgstr "If you want to export a handy list of all the information on this page, you can use the button below to copy it to the clipboard. You can then paste it in a text file and save it to your device, or paste it in an email exchange with a support engineer or theme/plugin developer for example." + +#: wp-admin/site-health-info.php:71 wp-admin/site-health.php:76 +msgid "The Site Health check requires JavaScript." +msgstr "The Site Health check requires JavaScript." + +#: wp-admin/site-health-info.php:15 +msgid "Sorry, you are not allowed to access the debug data." +msgstr "Sorry, you are not allowed to access the debug data." + +#: wp-admin/site-health-info.php:12 wp-admin/site-health-info.php:84 +msgid "Site Health Info" +msgstr "Site Health Info" + +#: wp-admin/update-core.php:501 wp-admin/update-core.php:680 +msgid "This update doesn’t work with your version of PHP." +msgstr "This update doesn’t work with your version of PHP." + +#: wp-admin/includes/class-wp-posts-list-table.php:508 +msgid "All formats" +msgstr "All formats" + +#: wp-admin/includes/class-wp-posts-list-table.php:506 +msgid "Filter by post format" +msgstr "Filter by post format" + +#: wp-admin/includes/plugin.php:2484 +msgid "Go to the Plugins screen" +msgstr "Go to the Plugins screen" + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1361 +msgid "The authenticity of %s could not be verified." +msgstr "The authenticity of %s could not be verified." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1313 +msgid "The authenticity of %s could not be verified as no signature was found." +msgstr "The authenticity of %s could not be verified as no signature was found." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1240 wp-admin/includes/file.php:1260 +#: wp-admin/includes/file.php:1294 +msgid "The authenticity of %s could not be verified as signature verification is unavailable on this system." +msgstr "The authenticity of %s could not be verified as signature verification is unavailable on this system." + +#. translators: %s: Eraser friendly name. +#: wp-admin/includes/ajax-actions.php:5028 +msgid "Eraser callback is not valid: %s." +msgstr "Eraser callback is not valid: %s." + +#. translators: %s: Eraser friendly name. +#: wp-admin/includes/ajax-actions.php:5018 +msgid "Eraser does not include a callback: %s." +msgstr "Eraser does not include a callback: %s." + +#: wp-admin/includes/ajax-actions.php:4740 +#: wp-admin/includes/ajax-actions.php:4931 +msgid "Sorry, you are not allowed to perform this action." +msgstr "Sorry, you are not allowed to perform this action." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health.php:1873 +msgid "HTTP requests have been blocked by the %s constant, with no allowed hosts." +msgstr "HTTP requests have been blocked by the %s constant, with no allowed hosts." + +#. translators: 1: Name of the constant used. 2: List of allowed hostnames. +#: wp-admin/includes/class-wp-site-health.php:1888 +msgid "HTTP requests have been blocked by the %1$s constant, with some allowed hosts: %2$s." +msgstr "HTTP requests have been blocked by the %1$s constant, with some allowed hosts: %2$s." + +#. translators: 1: The name of the drop-in. 2: The name of the database engine. +#: wp-admin/includes/class-wp-site-health.php:1214 +msgid "You are using a %1$s drop-in which might mean that a %2$s database is not being used." +msgstr "You are using a %1$s drop-in which might mean that a %2$s database is not being used." + +#. translators: Localized team handbook, if one exists. +#: wp-admin/includes/class-wp-site-health.php:845 +msgid "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions" +msgstr "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions" + +#: wp-admin/includes/class-wp-site-health.php:250 +#: wp-admin/includes/class-wp-site-health.php:722 +#: wp-admin/includes/class-wp-site-health.php:835 +#: wp-admin/includes/class-wp-site-health.php:1064 +#: wp-admin/includes/class-wp-site-health.php:1105 +#: wp-admin/includes/class-wp-site-health.php:1155 +#: wp-admin/includes/class-wp-site-health.php:1246 +#: wp-admin/includes/class-wp-site-health.php:1613 +#: wp-admin/includes/class-wp-site-health.php:1799 +#: wp-admin/includes/class-wp-site-health.php:1842 +#: wp-admin/includes/class-wp-site-health.php:1913 +#: wp-admin/includes/class-wp-site-health.php:2016 +msgid "Performance" +msgstr "Performance" + +#. translators: 1: The amount of inactive themes. 2: The default theme for +#. WordPress. 3: The currently active theme. +#: wp-admin/includes/class-wp-site-health.php:674 +msgid "Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgid_plural "Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgstr[0] "Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgstr[1] "Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme." + +#: wp-admin/includes/class-wp-site-health.php:667 +#: wp-admin/includes/class-wp-site-health.php:683 +msgid "We recommend removing any unused themes to enhance your site’s security." +msgstr "We recommend removing any unused themes to enhance your site’s security." + +#. translators: 1: The amount of inactive themes. 2: The currently active +#. theme. +#: wp-admin/includes/class-wp-site-health.php:659 +msgid "Your site has %1$d inactive theme, other than %2$s, your active theme." +msgid_plural "Your site has %1$d inactive themes, other than %2$s, your active theme." +msgstr[0] "Your site has %1$d inactive theme, other than %2$s, your active theme." +msgstr[1] "Your site has %1$d inactive themes, other than %2$s, your active theme." + +#. translators: 1: Link to the hosting group page about recommended PHP +#. modules. 2: Additional link attributes. 3: Accessibility text. +#: wp-admin/includes/class-wp-site-health.php:843 +msgid "The WordPress Hosting Team maintains a list of those modules, both recommended and required, in the team handbook%3$s." +msgstr "The WordPress Hosting Team maintains a list of those modules, both recommended and required, in the team handbook%3$s." + +#. translators: %d: The number of inactive themes. +#: wp-admin/includes/class-wp-site-health.php:613 +#: wp-admin/includes/class-wp-site-health.php:632 +msgid "Your site has %d inactive theme." +msgid_plural "Your site has %d inactive themes." +msgstr[0] "Your site has %d inactive theme." +msgstr[1] "Your site has %d inactive themes." + +#: wp-admin/includes/class-wp-site-health.php:455 +msgid "Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it." +msgstr "Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it." + +#: wp-admin/includes/class-wp-site-health.php:311 +#: wp-admin/includes/class-wp-site-health.php:351 +#: wp-admin/includes/class-wp-site-health.php:484 +#: wp-admin/includes/class-wp-site-health.php:779 +#: wp-admin/includes/class-wp-site-health.php:1195 +#: wp-admin/includes/class-wp-site-health.php:1361 +#: wp-admin/includes/class-wp-site-health.php:1430 +#: wp-admin/includes/class-wp-site-health.php:1504 +#: wp-admin/includes/class-wp-site-health.php:1567 +#: wp-admin/includes/class-wp-site-health.php:1686 +#: wp-admin/includes/class-wp-site-health.php:1756 +#: wp-admin/includes/class-wp-site-health.php:2094 +msgid "Security" +msgstr "Security" + +#: wp-admin/erase-personal-data.php:43 +msgid "Erase personal data list" +msgstr "Erase personal data list" + +#: wp-admin/erase-personal-data.php:42 +msgid "Erase personal data list navigation" +msgstr "Erase personal data list navigation" + +#: wp-admin/erase-personal-data.php:41 +msgid "Filter erase personal data list" +msgstr "Filter erase personal data list" + +#: wp-admin/export-personal-data.php:43 +msgid "Export personal data list" +msgstr "Export personal data list" + +#: wp-admin/export-personal-data.php:42 +msgid "Export personal data list navigation" +msgstr "Export personal data list navigation" + +#: wp-admin/export-personal-data.php:41 +msgid "Filter export personal data list" +msgstr "Filter export personal data list" + +#. translators: %d: The number of inactive plugins. +#: wp-admin/includes/class-wp-site-health.php:448 +msgid "Your site has %d inactive plugin." +msgid_plural "Your site has %d inactive plugins." +msgstr[0] "Your site has %d inactive plugin." +msgstr[1] "Your site has %d inactive plugins." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:564 +#: wp-admin/includes/plugin-install.php:876 +msgctxt "plugin" +msgid "Cannot Update" +msgstr "Cannot Update" + +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number 5: URL to Update PHP page. +#: wp-admin/includes/update.php:523 +msgid "There is a new version of %1$s available, but it doesn’t work with your version of PHP. View version %4$s details or learn more about updating PHP." +msgstr "There is a new version of %1$s available, but it doesn’t work with your version of PHP. View version %4$s details or learn more about updating PHP." + +#: wp-admin/includes/class-wp-plugins-list-table.php:1077 +msgid "This plugin failed to load properly and is paused during recovery mode." +msgstr "This plugin failed to load properly and is paused during recovery mode." + +#: wp-admin/includes/theme.php:1149 +msgid "Go to the Themes screen" +msgstr "Go to the Themes screen" + +#: wp-admin/includes/class-wp-debug-data.php:1559 +msgid "The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files." +msgstr "The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files." + +#: wp-admin/includes/class-wp-debug-data.php:1603 +msgid "Total size is not available. Some errors were encountered when determining the size of your installation." +msgstr "Total size is not available. Some errors were encountered when determining the size of your installation." + +#: wp-admin/includes/class-wp-debug-data.php:1552 +msgid "The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions." +msgstr "The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions." + +#: wp-admin/includes/class-wp-debug-data.php:246 +msgid "These settings alter where and how parts of WordPress are loaded." +msgstr "These settings alter where and how parts of WordPress are loaded." + +#: wp-admin/site-health.php:99 +msgid "The site health check shows critical information about your WordPress configuration and items that require your attention." +msgstr "The site health check shows critical information about your WordPress configuration and items that require your attention." + +#: wp-admin/includes/dashboard.php:56 wp-admin/site-health.php:17 +#: wp-admin/site-health.php:96 +msgid "Site Health Status" +msgstr "Site Health Status" + +#: wp-admin/site-health.php:90 +msgid "Everything is running smoothly here." +msgstr "Everything is running smoothly here." + +#: wp-admin/site-health.php:86 +msgid "Great job!" +msgstr "Great job!" + +#. translators: %s: Number of items with no issues. +#: wp-admin/site-health.php:135 wp-admin/js/site-health.js:161 +msgid "%s item with no issues detected" +msgid_plural "%s items with no issues detected" +msgstr[0] "%s item with no issues detected" +msgstr[1] "%s items with no issues detected" + +#. translators: %s: Number of recommended improvements. +#: wp-admin/site-health.php:116 wp-admin/js/site-health.js:156 +msgid "%s recommended improvement" +msgid_plural "%s recommended improvements" +msgstr[0] "%s recommended improvement" +msgstr[1] "%s recommended improvements" + +#: wp-admin/includes/class-wp-site-health.php:2232 +msgid "Loopback request" +msgstr "Loopback request" + +#: wp-admin/includes/class-wp-site-health.php:2567 +msgid "The loopback request to your site completed successfully." +msgstr "The loopback request to your site completed successfully." + +#: wp-admin/includes/class-wp-site-health.php:2198 +msgid "Scheduled events" +msgstr "Scheduled events" + +#: wp-admin/includes/class-wp-site-health.php:2194 +msgid "Secure communication" +msgstr "Secure communication" + +#: wp-admin/includes/class-wp-site-health.php:2346 +msgid "No scheduled events exist on this site." +msgstr "No scheduled events exist on this site." + +#: wp-admin/includes/class-wp-site-health.php:2190 +msgid "HTTPS status" +msgstr "HTTPS status" + +#: wp-admin/includes/class-wp-site-health.php:2186 +msgid "MySQL utf8mb4 support" +msgstr "MySQL utf8mb4 support" + +#: wp-admin/includes/class-wp-site-health.php:2166 +msgid "PHP Version" +msgstr "PHP Version" + +#: wp-admin/includes/class-wp-site-health.php:2182 +msgid "Database Server version" +msgstr "Database Server version" + +#: wp-admin/includes/class-wp-site-health.php:2162 +msgid "Theme Versions" +msgstr "Theme Versions" + +#: wp-admin/includes/class-wp-site-health.php:2158 +msgid "Plugin Versions" +msgstr "Plugin Versions" + +#: wp-admin/includes/class-wp-site-health.php:2154 +msgid "WordPress Version" +msgstr "WordPress Version" + +#. translators: 1: The HTTP error code. 2: The HTTP error message. +#: wp-admin/includes/class-wp-site-health.php:1977 +msgid "The REST API call gave the following unexpected result: (%1$d) %2$s." +msgstr "The REST API call gave the following unexpected result: (%1$d) %2$s." + +#: wp-admin/includes/class-wp-site-health.php:1959 +msgid "The REST API request failed due to an error." +msgstr "The REST API request failed due to an error." + +#: wp-admin/includes/class-wp-site-health.php:2250 +msgid "REST API availability" +msgstr "REST API availability" + +#: wp-admin/includes/class-wp-site-health.php:2202 +msgid "HTTP Requests" +msgstr "HTTP Requests" + +#: wp-admin/includes/class-wp-site-health.php:2170 +msgid "PHP Extensions" +msgstr "PHP Extensions" + +#: wp-admin/credits.php:47 wp-admin/includes/ms.php:1120 +#: wp-admin/privacy.php:44 wp-admin/nav-menus.php:696 +#: wp-admin/site-health-info.php:51 wp-admin/freedoms.php:50 +#: wp-admin/about.php:45 wp-admin/site-health.php:56 +msgid "Secondary menu" +msgstr "Secondary menu" + +#. translators: %d: The HTTP response code returned. +#: wp-admin/includes/class-wp-site-health.php:2559 +msgid "The loopback request returned an unexpected http status code, %d, it was not possible to determine if this will prevent features from working as expected." +msgstr "The loopback request returned an unexpected http status code, %d, it was not possible to determine if this will prevent features from working as expected." + +#: wp-admin/includes/class-wp-site-health.php:2543 +msgid "The loopback request to your site failed, this means features relying on them are not currently working as expected." +msgstr "The loopback request to your site failed, this means features relying on them are not currently working as expected." + +#: wp-admin/includes/class-wp-site-health.php:2206 +msgid "Debugging enabled" +msgstr "Debugging enabled" + +#. translators: %s: The name of the query parameter being tested. +#: wp-admin/includes/class-wp-site-health.php:1994 +msgid "The REST API did not process the %s query parameter correctly." +msgstr "The REST API did not process the %s query parameter correctly." + +#: wp-admin/includes/class-wp-site-health.php:1988 +msgid "The REST API did not behave correctly" +msgstr "The REST API did not behave correctly" + +#: wp-admin/includes/class-wp-site-health.php:1971 +msgid "The REST API encountered an unexpected result" +msgstr "The REST API encountered an unexpected result" + +#: wp-admin/includes/class-wp-site-health.php:1953 +msgid "The REST API encountered an error" +msgstr "The REST API encountered an error" + +#: wp-admin/includes/class-wp-site-health.php:1918 +msgid "The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages." +msgstr "The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages." + +#: wp-admin/includes/class-wp-site-health.php:1910 +msgid "The REST API is available" +msgstr "The REST API is available" + +#: wp-admin/includes/class-wp-site-health.php:1882 +msgid "HTTP requests are partially blocked" +msgstr "HTTP requests are partially blocked" + +#: wp-admin/includes/class-wp-site-health.php:1867 +msgid "HTTP requests are blocked" +msgstr "HTTP requests are blocked" + +#: wp-admin/includes/class-wp-site-health.php:1847 +msgid "It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended." +msgstr "It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended." + +#: wp-admin/includes/class-wp-site-health.php:1839 +msgid "HTTP requests seem to be working as expected" +msgstr "HTTP requests seem to be working as expected" + +#: wp-admin/includes/class-wp-site-health.php:1815 +msgid "Your site could not complete a loopback request" +msgstr "Your site could not complete a loopback request" + +#: wp-admin/includes/class-wp-site-health.php:1804 +msgid "Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability." +msgstr "Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability." + +#: wp-admin/includes/class-wp-site-health.php:1796 +msgid "Your site can perform loopback requests" +msgstr "Your site can perform loopback requests" + +#: wp-admin/includes/class-wp-site-health.php:1720 +msgid "Background updates may not be working properly" +msgstr "Background updates may not be working properly" + +#: wp-admin/includes/class-wp-site-health.php:1712 +msgid "Background updates are not working as expected" +msgstr "Background updates are not working as expected" + +#: wp-admin/includes/class-wp-site-health.php:1709 +msgid "Passed" +msgstr "Passed" + +#: wp-admin/includes/class-wp-site-health.php:1691 +msgid "Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using." +msgstr "Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using." + +#: wp-admin/includes/class-wp-site-health.php:1683 +msgid "Background updates are working" +msgstr "Background updates are working" + +#. translators: %s: The name of the failed cron event. +#: wp-admin/includes/class-wp-site-health.php:1648 +msgid "The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." +msgstr "The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." + +#: wp-admin/includes/class-wp-site-health.php:1642 +msgid "A scheduled event has failed" +msgstr "A scheduled event has failed" + +#. translators: %s: The error message returned while from the cron scheduler. +#: wp-admin/includes/class-wp-site-health.php:1635 +msgid "While trying to test your site’s scheduled events, the following error was returned: %s" +msgstr "While trying to test your site’s scheduled events, the following error was returned: %s" + +#: wp-admin/includes/class-wp-site-health.php:1629 +msgid "It was not possible to check your scheduled events" +msgstr "It was not possible to check your scheduled events" + +#: wp-admin/includes/class-wp-site-health.php:1618 +msgid "Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed." +msgstr "Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed." + +#. translators: %s: URL to General Settings screen. +#: wp-admin/includes/class-wp-site-health.php:1535 +msgid "You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default." +msgstr "You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default." + +#: wp-admin/includes/class-wp-site-health.php:1610 +msgid "Scheduled events are running" +msgstr "Scheduled events are running" + +#: wp-admin/includes/class-wp-site-health.php:1591 +msgid "Talk to your web host about OpenSSL support for PHP." +msgstr "Talk to your web host about OpenSSL support for PHP." + +#: wp-admin/includes/class-wp-site-health.php:1587 +msgid "Your site is unable to communicate securely with other services" +msgstr "Your site is unable to communicate securely with other services" + +#: wp-admin/includes/class-wp-site-health.php:1583 +msgid "Your site can communicate securely with other services" +msgstr "Your site can communicate securely with other services" + +#: wp-admin/includes/class-wp-site-health.php:1572 +msgid "Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more." +msgstr "Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more." + +#. translators: Documentation explaining HTTPS and why it should be used. +#: wp-admin/includes/class-wp-site-health.php:1514 +msgid "https://wordpress.org/support/article/why-should-i-use-https/" +msgstr "https://wordpress.org/support/article/why-should-i-use-https/" + +#: wp-admin/includes/class-wp-site-health.php:1549 +msgid "Your site does not use HTTPS" +msgstr "Your site does not use HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1501 +msgid "Your website is using an active HTTPS connection." +msgstr "Your website is using an active HTTPS connection." + +#: wp-admin/includes/class-wp-site-health.php:1543 +msgid "Update your site addresses" +msgstr "Update your site addresses" + +#: wp-admin/includes/class-wp-site-health.php:1529 +msgid "Only parts of your site are using HTTPS" +msgstr "Only parts of your site are using HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1515 +msgid "Learn more about why you should use HTTPS" +msgstr "Learn more about why you should use HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1465 +msgid "Your site is set to display errors to site visitors" +msgstr "Your site is set to display errors to site visitors" + +#. translators: %s: WP_DEBUG_LOG +#: wp-admin/includes/class-wp-site-health.php:1458 +msgid "The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to all users." +msgstr "The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to all users." + +#: wp-admin/includes/class-wp-site-health.php:1450 +msgid "Your site is set to log errors to a potentially public file." +msgstr "Your site is set to log errors to a potentially public file." + +#: wp-admin/includes/class-wp-site-health.php:1435 +msgid "Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website." +msgstr "Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website." + +#: wp-admin/includes/class-wp-site-health.php:1427 +msgid "Your site is not set to output debug information" +msgstr "Your site is not set to output debug information" + +#. translators: 1: The IP address WordPress.org resolves to. 2: The error +#. returned by the lookup. +#: wp-admin/includes/class-wp-site-health.php:1392 +msgid "Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s" +msgstr "Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s" + +#: wp-admin/includes/class-wp-site-health.php:1383 +msgid "Could not reach WordPress.org" +msgstr "Could not reach WordPress.org" + +#: wp-admin/includes/class-wp-site-health.php:1366 +msgid "Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins." +msgstr "Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins." + +#: wp-admin/includes/class-wp-site-health.php:1358 +msgid "Can communicate with WordPress.org" +msgstr "Can communicate with WordPress.org" + +#: wp-admin/includes/class-wp-site-health.php:1316 +#: wp-admin/includes/class-wp-site-health.php:1332 +msgid "utf8mb4 requires a newer client library" +msgstr "utf8mb4 requires a newer client library" + +#: wp-admin/includes/class-wp-site-health.php:1294 +msgid "Your MariaDB version supports utf8mb4." +msgstr "Your MariaDB version supports utf8mb4." + +#: wp-admin/includes/class-wp-site-health.php:1281 +msgid "utf8mb4 requires a MariaDB update" +msgstr "utf8mb4 requires a MariaDB update" + +#: wp-admin/includes/class-wp-site-health.php:1274 +msgid "Your MySQL version supports utf8mb4." +msgstr "Your MySQL version supports utf8mb4." + +#: wp-admin/includes/class-wp-site-health.php:1261 +msgid "utf8mb4 requires a MySQL update" +msgstr "utf8mb4 requires a MySQL update" + +#: wp-admin/includes/class-wp-site-health.php:1243 +msgid "UTF8MB4 is supported" +msgstr "UTF8MB4 is supported" + +#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database +#. server minimum version number. +#: wp-admin/includes/class-wp-site-health.php:1201 +msgid "WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this." +msgstr "WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this." + +#: wp-admin/includes/class-wp-site-health.php:1194 +msgid "Severely outdated SQL server" +msgstr "Severely outdated SQL server" + +#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database +#. server recommended version number. +#: wp-admin/includes/class-wp-site-health.php:1184 +msgid "For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this." +msgstr "For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this." + +#: wp-admin/includes/class-wp-site-health.php:1178 +msgid "Outdated SQL server" +msgstr "Outdated SQL server" + +#: wp-admin/includes/class-wp-site-health.php:1152 +msgid "SQL server is up to date" +msgstr "SQL server is up to date" + +#: wp-admin/includes/class-wp-site-health.php:1043 +msgid "One or more required modules are missing" +msgstr "One or more required modules are missing" + +#: wp-admin/includes/class-wp-site-health.php:1040 +msgid "One or more recommended modules are missing" +msgstr "One or more recommended modules are missing" + +#. translators: %s: The module name. +#: wp-admin/includes/class-wp-site-health.php:1012 +msgid "The optional module, %s, is not installed, or has been disabled." +msgstr "The optional module, %s, is not installed, or has been disabled." + +#. translators: %s: The module name. +#: wp-admin/includes/class-wp-site-health.php:1004 +msgid "The required module, %s, is not installed, or has been disabled." +msgstr "The required module, %s, is not installed, or has been disabled." + +#: wp-admin/includes/class-wp-site-health.php:1001 +#: wp-admin/includes/class-wp-site-health.php:1389 +#: wp-admin/includes/class-wp-site-health.php:1716 +msgid "Error" +msgstr "Error" + +#: wp-admin/includes/class-wp-site-health.php:832 +msgid "Required and recommended modules are installed" +msgstr "Required and recommended modules are installed" + +#: wp-admin/includes/class-wp-site-health.php:693 +msgid "Have a default theme available" +msgstr "Have a default theme available" + +#: wp-admin/includes/class-wp-site-health.php:697 +msgid "Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your chosen theme." +msgstr "Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your chosen theme." + +#. translators: 1: The default theme for WordPress. 2: The currently active +#. theme. 3: The active theme's parent theme. +#: wp-admin/includes/class-wp-site-health.php:641 +msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme." +msgstr "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme." + +#. translators: 1: The currently active theme. 2: The active theme's parent +#. theme. +#: wp-admin/includes/class-wp-site-health.php:622 +msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme." +msgstr "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme." + +#. translators: %d: The number of outdated themes. +#: wp-admin/includes/class-wp-site-health.php:568 +msgid "Your site has %d theme waiting to be updated." +msgid_plural "Your site has %d themes waiting to be updated." +msgstr[0] "Your site has %d theme waiting to be updated." +msgstr[1] "Your site has %d themes waiting to be updated." + +#: wp-admin/includes/class-wp-site-health.php:442 +msgid "You should remove inactive plugins" +msgstr "You should remove inactive plugins" + +#: wp-admin/includes/class-wp-site-health.php:562 +msgid "You have themes waiting to be updated" +msgstr "You have themes waiting to be updated" + +#: wp-admin/includes/class-wp-site-health.php:489 +msgid "Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure." +msgstr "Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure." + +#. translators: %d: The number of themes. +#: wp-admin/includes/class-wp-site-health.php:588 +msgid "Your site has %d installed theme, and it is up to date." +msgid_plural "Your site has %d installed themes, and they are all up to date." +msgstr[0] "Your site has %d installed theme, and it is up to date." +msgstr[1] "Your site has %d installed themes, and they are all up to date." + +#. translators: %d: The number of outdated plugins. +#: wp-admin/includes/class-wp-site-health.php:400 +msgid "Your site has %d plugin waiting to be updated." +msgid_plural "Your site has %d plugins waiting to be updated." +msgstr[0] "Your site has %d plugin waiting to be updated." +msgstr[1] "Your site has %d plugins waiting to be updated." + +#: wp-admin/includes/class-wp-site-health.php:394 +msgid "You have plugins waiting to be updated" +msgstr "You have plugins waiting to be updated" + +#: wp-admin/includes/class-wp-site-health.php:356 +msgid "Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date." +msgstr "Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date." + +#. translators: %d: The number of active plugins. +#: wp-admin/includes/class-wp-site-health.php:425 +msgid "Your site has %d active plugin, and it is up to date." +msgid_plural "Your site has %d active plugins, and they are all up to date." +msgstr[0] "Your site has %d active plugin, and it is up to date." +msgstr[1] "Your site has %d active plugins, and they are all up to date." + +#: wp-admin/includes/class-wp-site-health.php:481 +msgid "Your themes are all up to date" +msgstr "Your themes are all up to date" + +#: wp-admin/includes/class-wp-site-health.php:327 +msgid "You are currently running the latest version of WordPress available, keep it up!" +msgstr "You are currently running the latest version of WordPress available, keep it up!" + +#: wp-admin/includes/class-wp-site-health.php:314 +msgid "A new minor update is available for your site. Because minor updates often address security, it’s important to install them." +msgstr "A new minor update is available for your site. Because minor updates often address security, it’s important to install them." + +#: wp-admin/includes/class-wp-site-health.php:348 +msgid "Your plugins are all up to date" +msgstr "Your plugins are all up to date" + +#: wp-admin/includes/class-wp-debug-data.php:721 +msgid "Max input time" +msgstr "Max input time" + +#: wp-admin/includes/class-wp-debug-data.php:620 +msgid "Unable to determine if Ghostscript is installed" +msgstr "Unable to determine if Ghostscript is installed" + +#: wp-admin/includes/class-wp-debug-data.php:590 +msgid "Imagick Resource Limits" +msgstr "Imagick Resource Limits" + +#: wp-admin/includes/class-wp-debug-data.php:505 +msgid "Active editor" +msgstr "Active editor" + +#: wp-admin/includes/class-wp-debug-data.php:645 +msgid "(Supports 64bit values)" +msgstr "(Supports 64bit values)" + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:449 +msgid "WordPress security and maintenance releases are blocked by the %s filter." +msgstr "WordPress security and maintenance releases are blocked by the %s filter." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:437 +msgid "WordPress security and maintenance releases are blocked by %s." +msgstr "WordPress security and maintenance releases are blocked by %s." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:417 +msgid "WordPress development updates are blocked by the %s filter." +msgstr "WordPress development updates are blocked by the %s filter." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:405 +msgid "WordPress development updates are blocked by the %s constant." +msgstr "WordPress development updates are blocked by the %s constant." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:381 +msgid "All of your WordPress files are writable." +msgstr "All of your WordPress files are writable." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:376 +msgid "Some files are not writable by WordPress:" +msgstr "Some files are not writable by WordPress:" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:350 +msgid "This could mean that connections are failing to WordPress.org." +msgstr "This could mean that connections are failing to WordPress.org." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:347 +msgid "Couldn't retrieve a list of the checksums for WordPress %s." +msgstr "Couldn't retrieve a list of the checksums for WordPress %s." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:295 +msgid "Your installation of WordPress doesn't require FTP credentials to perform updates." +msgstr "Your installation of WordPress doesn't require FTP credentials to perform updates." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:286 +msgid "(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)" +msgstr "(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:285 +msgid "Your installation of WordPress prompts for FTP credentials to perform updates." +msgstr "Your installation of WordPress prompts for FTP credentials to perform updates." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:263 +msgid "No version control systems were detected." +msgstr "No version control systems were detected." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:120 +msgid "The %s filter is enabled." +msgstr "The %s filter is enabled." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:99 +msgid "A plugin has prevented updates by disabling %s." +msgstr "A plugin has prevented updates by disabling %s." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:77 +msgid "The %s constant is defined and enabled." +msgstr "The %s constant is defined and enabled." + +#: wp-admin/includes/class-wp-debug-data.php:1092 +#: wp-admin/includes/class-theme-installer-skin.php:244 +msgid "Parent theme" +msgstr "Parent theme" + +#: wp-admin/includes/class-wp-debug-data.php:1087 +#: wp-admin/includes/class-wp-debug-data.php:1182 +msgid "Author website" +msgstr "Author website" + +#. translators: 1: Plugin version number. 2: Plugin author name. +#. translators: 1: Theme version number. 2: Theme author name. +#: wp-admin/includes/class-wp-debug-data.php:888 +#: wp-admin/includes/class-wp-debug-data.php:935 +#: wp-admin/includes/class-wp-debug-data.php:1258 +msgid "Version %1$s by %2$s" +msgstr "Version %1$s by %2$s" + +#: wp-admin/includes/class-wp-debug-data.php:831 +msgid "Server version" +msgstr "Server version" + +#: wp-admin/includes/class-wp-debug-data.php:826 +msgid "Extension" +msgstr "Extension" + +#: wp-admin/includes/class-wp-debug-data.php:729 +msgid "PHP post max size" +msgstr "PHP post max size" + +#: wp-admin/includes/class-wp-debug-data.php:725 +msgid "Upload max filesize" +msgstr "Upload max filesize" + +#: wp-admin/includes/class-wp-debug-data.php:706 +#: wp-admin/includes/class-wp-debug-data.php:715 +msgid "PHP memory limit" +msgstr "PHP memory limit" + +#: wp-admin/includes/class-wp-debug-data.php:700 +msgid "PHP time limit" +msgstr "PHP time limit" + +#: wp-admin/includes/class-wp-debug-data.php:696 +msgid "PHP max input variables" +msgstr "PHP max input variables" + +#: wp-admin/includes/class-wp-debug-data.php:686 +msgid "Server settings" +msgstr "Server settings" + +#: wp-admin/includes/class-wp-debug-data.php:679 +msgid "Unable to determine PHP SAPI" +msgstr "Unable to determine PHP SAPI" + +#. translators: 1: Folder name. 2: Version control directory. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:254 +msgid "The folder %1$s was detected as being under version control (%2$s)." +msgstr "The folder %1$s was detected as being under version control (%2$s)." + +#. translators: 1: Folder name. 2: Version control directory. 3: Filter name. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:241 +msgid "The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates." +msgstr "The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:186 +msgid "We'll try again with the next release." +msgstr "We'll try again with the next release." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:181 +msgid "A previous automatic background update could not occur." +msgstr "A previous automatic background update could not occur." + +#. translators: %s: Code of error shown. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:172 +#: wp-admin/includes/class-wp-site-health-auto-updates.php:189 +msgid "The error code was %s." +msgstr "The error code was %s." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:169 +msgid "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts." +msgstr "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:168 +#: wp-admin/includes/class-wp-site-health-auto-updates.php:183 +msgid "You would have received an email because of this." +msgstr "You would have received an email because of this." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:167 +msgid "A previous automatic background update ended with a critical failure, so updates are now disabled." +msgstr "A previous automatic background update ended with a critical failure, so updates are now disabled." + +#: wp-admin/includes/class-wp-debug-data.php:678 +msgid "PHP SAPI" +msgstr "PHP SAPI" + +#: wp-admin/includes/class-wp-debug-data.php:652 +msgid "Unable to determine PHP version" +msgstr "Unable to determine PHP version" + +#: wp-admin/includes/class-wp-debug-data.php:664 +msgid "Unable to determine server architecture" +msgstr "Unable to determine server architecture" + +#: wp-admin/includes/class-wp-debug-data.php:663 +msgid "Server architecture" +msgstr "Server architecture" + +#: wp-admin/includes/class-wp-debug-data.php:493 +#: wp-admin/includes/class-wp-debug-data.php:515 +#: wp-admin/includes/class-wp-debug-data.php:1587 +msgid "Not available" +msgstr "Not available" + +#: wp-admin/includes/class-wp-debug-data.php:645 +msgid "(Does not support 64bit values)" +msgstr "(Does not support 64bit values)" + +#: wp-admin/includes/class-wp-debug-data.php:669 +msgid "Unable to determine what web server software is used" +msgstr "Unable to determine what web server software is used" + +#: wp-admin/includes/class-wp-site-health.php:306 +msgid "A new version of WordPress is available." +msgstr "A new version of WordPress is available." + +#: wp-admin/includes/class-wp-site-health.php:298 +msgid "Install the latest version of WordPress" +msgstr "Install the latest version of WordPress" + +#. translators: %s: The latest version of WordPress available. +#: wp-admin/includes/class-wp-site-health.php:291 +msgid "WordPress update available (%s)" +msgstr "WordPress update available (%s)" + +#: wp-admin/includes/class-wp-site-health.php:278 +msgid "Check for updates manually" +msgstr "Check for updates manually" + +#: wp-admin/includes/class-wp-site-health.php:272 +msgid "We were unable to check if any new versions of WordPress are available." +msgstr "We were unable to check if any new versions of WordPress are available." + +#: wp-admin/includes/class-wp-debug-data.php:1342 +msgid "The must use plugins directory" +msgstr "The must use plugins directory" + +#: wp-admin/includes/class-wp-debug-data.php:1097 +msgid "Theme features" +msgstr "Theme features" + +#. translators: %s: Latest WordPress version number. +#. translators: %s: Latest plugin version number. +#. translators: %s: Latest theme version number. +#: wp-admin/includes/class-wp-debug-data.php:54 +#: wp-admin/includes/class-wp-debug-data.php:953 +#: wp-admin/includes/class-wp-debug-data.php:1044 +#: wp-admin/includes/class-wp-debug-data.php:1156 +#: wp-admin/includes/class-wp-debug-data.php:1276 +msgid "(Latest version: %s)" +msgstr "(Latest version: %s)" + +#: wp-admin/includes/class-wp-debug-data.php:883 +#: wp-admin/includes/class-wp-debug-data.php:930 +#: wp-admin/includes/class-wp-debug-data.php:1253 +msgid "No version or author information is available." +msgstr "No version or author information is available." + +#: wp-admin/includes/class-wp-debug-data.php:762 +msgid "Is the Imagick library available?" +msgstr "Is the Imagick library available?" + +#: wp-admin/includes/class-wp-debug-data.php:753 +msgid "Is SUHOSIN installed?" +msgstr "Is SUHOSIN installed?" + +#: wp-admin/includes/class-wp-debug-data.php:738 +#: wp-admin/includes/class-wp-debug-data.php:743 +msgid "cURL version" +msgstr "cURL version" + +#: wp-admin/includes/class-wp-debug-data.php:673 +msgid "PHP version" +msgstr "PHP version" + +#: wp-admin/includes/class-wp-debug-data.php:668 +msgid "Web server" +msgstr "Web server" + +#: wp-admin/includes/class-wp-debug-data.php:625 +msgid "Ghostscript version" +msgstr "Ghostscript version" + +#: wp-admin/includes/class-wp-debug-data.php:604 +msgid "GD version" +msgstr "GD version" + +#: wp-admin/includes/class-wp-debug-data.php:524 +msgid "ImageMagick version string" +msgstr "ImageMagick version string" + +#: wp-admin/includes/class-wp-debug-data.php:519 +msgid "ImageMagick version number" +msgstr "ImageMagick version number" + +#: wp-admin/includes/class-wp-debug-data.php:794 +msgid ".htaccess rules" +msgstr ".htaccess rules" + +#. translators: %s: ini_get() +#: wp-admin/includes/class-wp-debug-data.php:533 +#: wp-admin/includes/class-wp-debug-data.php:689 +msgid "Unable to determine some settings, as the %s function has been disabled." +msgstr "Unable to determine some settings, as the %s function has been disabled." + +#. translators: %s: .htaccess +#: wp-admin/includes/class-wp-debug-data.php:790 +msgid "Your %s file contains only core WordPress features." +msgstr "Your %s file contains only core WordPress features." + +#. translators: %s: .htaccess +#: wp-admin/includes/class-wp-debug-data.php:787 +msgid "Custom rules have been added to your %s file." +msgstr "Custom rules have been added to your %s file." + +#. translators: 1: The IP address WordPress.org resolves to. 2: The error +#. returned by the lookup. +#: wp-admin/includes/class-wp-debug-data.php:424 +msgid "Unable to reach WordPress.org at %1$s: %2$s" +msgstr "Unable to reach WordPress.org at %1$s: %2$s" + +#: wp-admin/includes/class-wp-debug-data.php:416 +msgid "WordPress.org is reachable" +msgstr "WordPress.org is reachable" + +#: wp-admin/includes/class-wp-debug-data.php:415 +#: wp-admin/includes/class-wp-debug-data.php:421 +#: wp-admin/includes/class-wp-site-health.php:2220 +msgid "Communication with WordPress.org" +msgstr "Communication with WordPress.org" + +#: wp-admin/includes/class-wp-debug-data.php:364 +msgid "The themes directory" +msgstr "The themes directory" + +#: wp-admin/includes/class-wp-debug-data.php:359 +msgid "The plugins directory" +msgstr "The plugins directory" + +#: wp-admin/includes/class-wp-debug-data.php:354 +msgid "The uploads directory" +msgstr "The uploads directory" + +#: wp-admin/includes/class-wp-debug-data.php:349 +msgid "The wp-content directory" +msgstr "The wp-content directory" + +#: wp-admin/includes/class-wp-debug-data.php:345 +#: wp-admin/includes/class-wp-debug-data.php:350 +#: wp-admin/includes/class-wp-debug-data.php:355 +#: wp-admin/includes/class-wp-debug-data.php:360 +#: wp-admin/includes/class-wp-debug-data.php:365 +#: wp-admin/includes/class-wp-debug-data.php:1343 +msgid "Not writable" +msgstr "Not writable" + +#: wp-admin/includes/class-wp-debug-data.php:345 +#: wp-admin/includes/class-wp-debug-data.php:350 +#: wp-admin/includes/class-wp-debug-data.php:355 +#: wp-admin/includes/class-wp-debug-data.php:360 +#: wp-admin/includes/class-wp-debug-data.php:365 +#: wp-admin/includes/class-wp-debug-data.php:1343 +msgid "Writable" +msgstr "Writable" + +#: wp-admin/includes/class-wp-debug-data.php:344 +msgid "The main WordPress directory" +msgstr "The main WordPress directory" + +#: wp-admin/includes/class-wp-debug-data.php:213 +#: wp-admin/includes/class-wp-debug-data.php:222 +#: wp-admin/includes/class-wp-debug-data.php:231 +#: wp-admin/includes/class-wp-debug-data.php:240 +#: wp-admin/includes/class-wp-debug-data.php:255 +#: wp-admin/includes/class-wp-debug-data.php:260 +#: wp-admin/includes/class-wp-debug-data.php:322 +#: wp-admin/includes/class-wp-debug-data.php:327 +#: wp-admin/includes/class-wp-debug-data.php:1088 +#: wp-admin/includes/class-wp-debug-data.php:1183 +msgid "Undefined" +msgstr "Undefined" + +#: wp-admin/includes/class-wp-debug-data.php:195 +msgid "Database" +msgstr "Database" + +#: wp-admin/includes/class-wp-debug-data.php:189 +msgid "Server" +msgstr "Server" + +#: wp-admin/includes/class-wp-debug-data.php:178 +msgid "Inactive Plugins" +msgstr "Inactive Plugins" + +#: wp-admin/includes/class-wp-debug-data.php:172 +msgid "Active Plugins" +msgstr "Active Plugins" + +#: wp-admin/includes/class-wp-debug-data.php:166 +msgid "Must Use Plugins" +msgstr "Must Use Plugins" + +#: wp-admin/includes/class-wp-debug-data.php:479 +msgid "Total installation size" +msgstr "Total installation size" + +#: wp-admin/includes/class-wp-debug-data.php:474 +msgid "Database size" +msgstr "Database size" + +#: wp-admin/includes/class-wp-debug-data.php:340 +msgid "Filesystem Permissions" +msgstr "File system permissions" + +#: wp-admin/includes/class-wp-debug-data.php:245 +msgid "WordPress Constants" +msgstr "WordPress constants" + +#: wp-admin/includes/class-wp-debug-data.php:150 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:904 +msgid "Active Theme" +msgstr "Active theme" + +#: wp-admin/includes/class-wp-debug-data.php:442 +msgid "WordPress directory size" +msgstr "WordPress directory size" + +#: wp-admin/includes/class-wp-debug-data.php:438 +msgid "WordPress directory location" +msgstr "WordPress directory location" + +#: wp-admin/includes/class-wp-debug-data.php:469 +msgid "Plugins directory size" +msgstr "Plugins directory size" + +#: wp-admin/includes/class-wp-debug-data.php:465 +msgid "Plugins directory location" +msgstr "Plugins directory location" + +#: wp-admin/includes/class-wp-debug-data.php:460 +msgid "Themes directory size" +msgstr "Themes directory size" + +#: wp-admin/includes/class-wp-debug-data.php:1101 +#: wp-admin/includes/class-wp-debug-data.php:1187 +msgid "Theme directory location" +msgstr "Theme directory location" + +#: wp-admin/includes/class-wp-debug-data.php:451 +msgid "Uploads directory size" +msgstr "Uploads directory size" + +#: wp-admin/includes/class-wp-debug-data.php:447 +msgid "Uploads directory location" +msgstr "Uploads directory location" + +#: wp-admin/includes/class-wp-debug-data.php:398 +msgid "Network count" +msgstr "Network count" + +#: wp-admin/includes/class-wp-debug-data.php:393 +msgid "Site count" +msgstr "Site count" + +#: wp-admin/includes/class-wp-debug-data.php:388 +#: wp-admin/includes/class-wp-debug-data.php:405 +msgid "User count" +msgstr "User count" + +#: wp-admin/includes/class-wp-debug-data.php:341 +msgid "Shows whether WordPress is able to write to the directories it needs access to." +msgstr "Shows whether WordPress is able to write to the directories it needs access to." + +#: wp-admin/includes/class-wp-debug-data.php:190 +msgid "The options shown below relate to your server setup. If changes are required, you may need your web host’s assistance." +msgstr "The options shown below relate to your server setup. If changes are required, you may need your web host’s assistance." + +#: wp-admin/includes/class-wp-debug-data.php:184 +msgid "Media Handling" +msgstr "Media Handling" + +#: wp-admin/includes/class-wp-debug-data.php:139 +msgid "Drop-ins" +msgstr "Drop-ins" + +#: wp-admin/includes/class-wp-debug-data.php:104 +msgid "Is this a multisite?" +msgstr "Is this a multisite?" + +#: wp-admin/includes/class-wp-debug-data.php:119 +msgid "Default comment status" +msgstr "Default comment status" + +#: wp-admin/includes/class-wp-debug-data.php:109 +msgid "Can anyone register on this site?" +msgstr "Can anyone register on this site?" + +#: wp-admin/includes/class-wp-debug-data.php:99 +msgid "Is this site using HTTPS?" +msgstr "Is this site using HTTPS?" + +#: wp-admin/includes/class-wp-debug-data.php:94 +msgid "Permalink structure" +msgstr "Permalink structure" + +#: wp-admin/includes/class-wp-debug-data.php:89 +msgid "Site URL" +msgstr "Site URL" + +#: wp-admin/includes/class-wp-debug-data.php:84 +msgid "Home URL" +msgstr "Home URL" + +#: wp-admin/includes/class-wp-debug-data.php:133 +msgid "Directories and Sizes" +msgstr "Directories and Sizes" + +#: wp-admin/includes/class-wp-debug-data.php:95 +msgid "No permalink structure set" +msgstr "No permalink structure set" + +#: wp-admin/site-health-info.php:35 wp-admin/site-health.php:40 +#: wp-admin/menu.php:282 +msgid "Site Health" +msgstr "Site Health" + +#. translators: %s: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:157 +msgctxt "requests" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%d)" + +#: wp-admin/theme-install.php:407 +msgid "Previous theme" +msgstr "Previous theme" + +#: wp-admin/menu.php:247 wp-admin/network/menu.php:107 +msgid "Plugin Editor" +msgstr "Plugin Editor" + +#: wp-admin/menu.php:224 wp-admin/network/menu.php:82 +msgid "Theme Editor" +msgstr "Theme Editor" + +#: wp-admin/theme-install.php:408 +msgid "Next theme" +msgstr "Next theme" + +#: wp-admin/options-discussion.php:92 +msgid "Show comments cookies opt-in checkbox, allowing comment author cookies to be set" +msgstr "Show comments cookies opt in checkbox, allowing comment author cookies to be set" + +#: wp-admin/user-edit.php:512 +msgid "If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." +msgstr "If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." + +#: wp-admin/themes.php:284 +msgid "Theme resumed." +msgstr "Theme resumed." + +#: wp-admin/plugins.php:633 +msgid "If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin." +msgstr "If you notice “ headers already sent ” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin." + +#. translators: %d: Number of characters. +#: wp-admin/plugins.php:626 +msgid "The plugin generated %d character of unexpected output during activation." +msgid_plural "The plugin generated %d characters of unexpected output during activation." +msgstr[0] "The plugin generated %d character of unexpected output during activation." +msgstr[1] "The plugin generated %d characters of unexpected output during activation." + +#: wp-admin/plugins.php:431 +msgid "Sorry, you are not allowed to resume this plugin." +msgstr "Sorry, you are not allowed to resume this plugin." + +#. translators: %s: WordPress Planet URL. +#: wp-admin/index.php:95 +msgid "WordPress Events and News — Upcoming events near you as well as the latest news from the official WordPress project and the WordPress Planet." +msgstr "WordPress Events and News — Upcoming events near you as well as the latest news from the official WordPress project and the WordPress Planet." + +#: wp-admin/themes.php:288 +msgid "Theme could not be resumed because it triggered a fatal error." +msgstr "Theme could not be resumed because it triggered a fatal error." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required MySQL version number, 4: Current MySQL version number. +#: wp-admin/update-core.php:121 wp-admin/upgrade.php:119 +msgid "You cannot update because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." +msgstr "You cannot update because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Current PHP version number. +#: wp-admin/update-core.php:112 wp-admin/upgrade.php:110 +msgid "You cannot update because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." +msgstr "You cannot update because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." + +#: wp-admin/nav-menus.php:932 +msgid "Add menu items" +msgstr "Add menu items" + +#. translators: %s: URL to create a new menu. +#: wp-admin/nav-menus.php:898 +msgid "or create a new menu. Don’t forget to save your changes!" +msgstr "or create a new menu. Don’t forget to save your changes!" + +#: wp-admin/nav-menus.php:845 wp-admin/nav-menus.php:910 +msgid "Click the Save Menu button to save your changes." +msgstr "Click the Save Menu button to save your changes." + +#. translators: %s: URL to create a new menu. +#: wp-admin/nav-menus.php:833 +msgid "Edit your menu below, or create a new menu. Don’t forget to save your changes!" +msgstr "Edit your menu below, or create a new menu. Don’t forget to save your changes!" + +#: wp-admin/nav-menus.php:826 +msgid "Fill in the Menu Name and click the Create Menu button to create your first menu." +msgstr "Fill in the Menu Name and click the Create Menu button to create your first menu." + +#: wp-admin/nav-menus.php:825 +msgid "Create your first menu below." +msgstr "Create your first menu below." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required MySQL version number, 4: Current MySQL version number. +#: wp-admin/install.php:277 +msgid "You cannot install because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." +msgstr "You cannot install because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Current PHP version number. +#: wp-admin/install.php:268 +msgid "You cannot install because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." +msgstr "You cannot install because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." + +#: wp-admin/includes/dashboard.php:1940 +msgid "Set up your homepage" +msgstr "Set up your homepage" + +#: wp-admin/includes/class-wp-site-health.php:736 +#: wp-admin/includes/dashboard.php:1781 +msgid "Learn more about updating PHP" +msgstr "Learn more about updating PHP" + +#: wp-admin/includes/dashboard.php:1765 +msgid "What is PHP and how does it affect my site?" +msgstr "What is PHP and how does it affect my site?" + +#: wp-admin/includes/plugin.php:501 +msgid "Custom PHP fatal error handler." +msgstr "Custom PHP fatal error handler." + +#: wp-admin/includes/plugin.php:500 +msgid "Custom PHP error message." +msgstr "Custom PHP error message." + +#: wp-admin/includes/class-language-pack-upgrader.php:122 +msgid "Could not remove the old translation." +msgstr "Could not remove the old translation." + +#: wp-admin/includes/class-language-pack-upgrader.php:121 +msgid "Removing the old version of the translation…" +msgstr "Removing the old version of the translation…" + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/plugin-install.php:831 +msgid "Click here to update WordPress." +msgstr "Click here to update WordPress." + +#. translators: %s: URL to Update PHP page. +#: wp-admin/includes/plugin-install.php:810 +msgid "Click here to learn more about updating PHP." +msgstr "Click here to learn more about updating PHP." + +#. translators: %s: Widget title. +#: wp-admin/includes/widgets.php:255 +msgid "Add widget: %s" +msgstr "Add widget: %s" + +#. translators: %s: Widgets sidebar name. +#: wp-admin/includes/widgets.php:95 +msgid "Add to: %s" +msgstr "Add to: %s" + +#. translators: Audio file track information. %s: Audio track number. +#: wp-admin/includes/media.php:369 +msgid "Track %s." +msgstr "Track %s." + +#: wp-admin/includes/plugin.php:2482 +msgid "You can find more details and make changes on the Plugins screen." +msgstr "You can find more details and make changes on the Plugins screen." + +#: wp-admin/includes/plugin.php:2481 +msgid "One or more plugins failed to load properly." +msgstr "One or more plugins failed to load properly." + +#: wp-admin/includes/plugin.php:2454 +msgid "Could not resume the plugin." +msgstr "Could not resume the plugin." + +#: wp-admin/includes/plugin-install.php:806 +msgid "Error: This plugin requires a newer version of PHP." +msgstr "ERROR: this plugin requires a newer version of PHP." + +#: wp-admin/includes/plugin-install.php:827 +msgid "Error: This plugin requires a newer version of WordPress." +msgstr "ERROR: this plugin requires a newer version of WordPress." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:421 +msgid "Copy this section to clipboard" +msgstr "Copy this section to clipboard" + +#: wp-admin/includes/schema.php:1245 +msgid "My Network" +msgstr "My Network" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:542 +#: wp-admin/includes/plugin-install.php:864 +msgctxt "plugin" +msgid "Cannot Install" +msgstr "Cannot Install" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:687 +msgid "This plugin doesn’t work with your version of PHP." +msgstr "This plugin doesn’t work with your version of PHP." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:678 +msgid "This plugin doesn’t work with your version of WordPress." +msgstr "This plugin doesn’t work with your version of WordPress." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:654 +msgid "This plugin doesn’t work with your versions of WordPress and PHP." +msgstr "This plugin doesn’t work with your versions of WordPress and PHP." + +#. translators: %s: WordPress version. +#. translators: %s: WordPress version +#: wp-admin/includes/update.php:305 wp-admin/install.php:238 +#: wp-admin/update-core.php:82 wp-admin/upgrade.php:80 wp-admin/about.php:96 +msgid "https://wordpress.org/support/wordpress-version/version-%s/" +msgstr "https://wordpress.org/support/wordpress-version/version-%s/" + +#: wp-admin/includes/theme.php:1146 +msgid "One or more themes failed to load properly." +msgstr "One or more themes failed to load properly." + +#. translators: %s: Default category. +#: wp-admin/edit-tags.php:603 +msgid "Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the default category %s. The default category cannot be deleted." +msgstr "Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the default category %s. The default category cannot be deleted." + +#: wp-admin/includes/theme.php:1119 +msgid "Could not resume the theme." +msgstr "Could not resume the theme." + +#: wp-admin/includes/class-wp-plugins-list-table.php:844 +#: wp-admin/themes.php:613 +msgid "Resume" +msgstr "Resume" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:843 +msgctxt "plugin" +msgid "Resume %s" +msgstr "Resume %s" + +#: wp-admin/includes/theme.php:1147 +msgid "You can find more details and make changes on the Themes screen." +msgstr "You can find more details and make changes on the Themes screen." + +#. translators: %s: A link to install the Classic Editor plugin. +#: wp-admin/edit-form-blocks.php:454 +msgid "The block editor requires JavaScript. Please enable JavaScript in your browser settings, or try the Classic Editor plugin." +msgstr "The block editor requires JavaScript. Please enable JavaScript in your browser settings, or try the Classic Editor plugin." + +#: wp-admin/post.php:47 +msgid "A post type mismatch has been detected." +msgstr "A post type mismatch has been detected." + +#: wp-admin/includes/class-wp-screen.php:295 wp-admin/post.php:20 +msgid "A post ID mismatch has been detected." +msgstr "A post ID mismatch has been detected." + +#. translators: %s: A link to use the Classic Editor plugin. +#: wp-admin/includes/template.php:1177 +msgid "Please open the classic editor to use this meta box." +msgstr "Please open the Classic Editor plugin to use this meta box." + +#. translators: %s: A link to activate the Classic Editor plugin. +#: wp-admin/includes/template.php:1164 +msgid "Please activate the Classic Editor plugin to use this meta box." +msgstr "Please activate the Classic Editor plugin to use this meta box." + +#. translators: %s: A link to install the Classic Editor plugin. +#: wp-admin/includes/template.php:1154 +msgid "Please install the Classic Editor plugin to use this meta box." +msgstr "Please install the Classic Editor plugin to use this meta box." + +#: wp-admin/includes/template.php:1145 +msgid "This meta box isn't compatible with the block editor." +msgstr "This meta box isn't compatible with the Block Editor (codename Gutenberg)." + +#: wp-admin/freedoms.php:93 +msgid "To distribute copies of your modified versions to others." +msgstr "To distribute copies of your modified versions to others." + +#: wp-admin/freedoms.php:88 +msgid "To redistribute." +msgstr "To redistribute." + +#: wp-admin/freedoms.php:83 +msgid "To study how the program works and change it to make it do what you wish." +msgstr "To study how the program works and change it to make it do what you wish." + +#: wp-admin/freedoms.php:78 +msgid "To run the program for any purpose." +msgstr "To run the program for any purpose." + +#: wp-admin/freedoms.php:77 +msgid "The 1st Freedom" +msgstr "The First Freedom" + +#: wp-admin/freedoms.php:82 +msgid "The 2nd Freedom" +msgstr "The Second Freedom" + +#: wp-admin/freedoms.php:87 +msgid "The 3rd Freedom" +msgstr "The Third Freedom" + +#: wp-admin/freedoms.php:92 +msgid "The 4th Freedom" +msgstr "The Fourth Freedom" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:30 +msgid "Created" +msgstr "Created" + +#. translators: Use this to specify the CSS font family for the default font. +#: wp-admin/edit-form-blocks.php:194 +msgctxt "CSS Font Family for Editor Font" +msgid "Noto Serif" +msgstr "Noto Serif" + +#. translators: First post content. %s: Site link. +#: wp-admin/includes/upgrade.php:228 +msgid "Welcome to WordPress. This is your first post. Edit or delete it, then start writing!" +msgstr "Welcome to WordPress. This is your first post. Edit or delete it, then start writing!" + +#. translators: First page content. %s: Site admin URL. +#: wp-admin/includes/upgrade.php:319 +msgid "As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!" +msgstr "As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:313 +msgid "The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community." +msgstr "The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community." + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:308 +msgid "...or something like this:" +msgstr "...or something like this:" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:303 +msgid "Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)" +msgstr "Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:298 +msgid "This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:" +msgstr "This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:" + +#: wp-admin/includes/class-wp-posts-list-table.php:1417 +msgid "Export as JSON" +msgstr "Export as JSON" + +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-posts-list-table.php:1416 +msgid "Export “%s” as JSON" +msgstr "Export “%s” as JSON" + +#: wp-admin/edit.php:369 +msgid "1 block not updated, somebody is editing it." +msgstr "1 block not updated, somebody is editing it." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:377 +msgid "%s block restored from the Trash." +msgid_plural "%s blocks restored from the Trash." +msgstr[0] "%s block restored from the Bin." +msgstr[1] "%s blocks restored from the Bin." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:375 +msgid "%s block moved to the Trash." +msgid_plural "%s blocks moved to the Trash." +msgstr[0] "%s block moved to the Bin." +msgstr[1] "%s blocks moved to the Bin." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:373 +msgid "%s block permanently deleted." +msgid_plural "%s blocks permanently deleted." +msgstr[0] "%s block permanently deleted." +msgstr[1] "%s blocks permanently deleted." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:368 +msgid "%s block updated." +msgid_plural "%s blocks updated." +msgstr[0] "%s block updated." +msgstr[1] "%s blocks updated." + +#: wp-admin/setup-config.php:283 +msgid "Error: \"Table Prefix\" must not be empty." +msgstr "Error: \"Table Prefix\" must not be empty." + +#: wp-admin/includes/meta-boxes.php:1001 +#: wp-admin/includes/class-wp-posts-list-table.php:1733 +#: wp-admin/edit-form-blocks.php:173 +msgid "Default template" +msgstr "Default template" + +#. translators: %s: The name of the plugin that generated this meta box. +#: wp-admin/includes/template.php:1143 wp-admin/includes/template.php:1381 +msgid "This meta box, from the %s plugin, isn't compatible with the block editor." +msgstr "This meta box, from the %s plugin, isn't compatible with the block editor." + +#. translators: Page title of the About WordPress page in the admin. +#: wp-admin/about.php:13 +msgctxt "page title" +msgid "About" +msgstr "About" + +#. translators: Header for the About section in a personal data export. +#: wp-admin/includes/privacy-tools.php:359 +msgctxt "personal data group label" +msgid "About" +msgstr "About" + +#: wp-admin/includes/upgrade.php:380 wp-admin/options-privacy.php:58 +msgid "Privacy Policy" +msgstr "Privacy Policy" + +#. translators: %s: Page title. +#: wp-admin/includes/misc.php:1435 +msgid "%s (Draft)" +msgstr "%s (Draft)" + +#: wp-admin/includes/file.php:39 wp-admin/options-privacy.php:123 +msgid "Privacy Policy Page" +msgstr "Privacy Policy Page" + +#. translators: 1: URL to edit Privacy Policy page, 2: URL to preview Privacy +#. Policy page. +#: wp-admin/options-privacy.php:161 +msgid "Edit or preview your Privacy Policy page content." +msgstr "Edit or preview your Privacy Policy page content." + +#. translators: %s: admin_init +#: wp-admin/includes/plugin.php:2345 +msgid "The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation." +msgstr "The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation." + +#. translators: %s: admin_init +#: wp-admin/includes/plugin.php:2334 +msgid "The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action." +msgstr "The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action." + +#: wp-admin/options-privacy.php:25 +msgid "Privacy Policy page updated successfully." +msgstr "Privacy Policy page updated successfully." + +#. translators: %s: Privacy Policy Guide URL. +#: wp-admin/includes/class-wp-privacy-policy-content.php:144 +msgid "The suggested privacy policy text has changed. Please review the guide and update your privacy policy." +msgstr "The suggested privacy policy text has changed. Please review the guide and update your privacy policy." + +#: wp-admin/options-privacy.php:239 +msgid "There are no pages." +msgstr "There are no pages." + +#: wp-admin/options-privacy.php:133 +msgid "After your Privacy Policy page is set, we suggest that you edit it." +msgstr "After your Privacy Policy page is set, we suggest that you edit it." + +#. translators: 1: Privacy Policy guide URL, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-admin/options-privacy.php:175 +msgid "Need help putting together your new Privacy Policy page? Check out our guide%3$s for recommendations on what content to include, along with policies suggested by your plugins and theme." +msgstr "Need help putting together your new Privacy Policy page? Check out our guide%3$s for recommendations on what content to include, along with policies suggested by your plugins and theme." + +#: wp-admin/privacy-policy-guide.php:20 +msgid "Privacy Policy Guide" +msgstr "Privacy Policy Guide" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:625 +msgid "Visitor comments may be checked through an automated spam detection service." +msgstr "Visitor comments may be checked through an automated spam detection service." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:572 +msgid "In this subsection you should note what analytics package you use, how users can opt out of analytics tracking, and a link to your analytics provider’s privacy policy, if any." +msgstr "In this subsection you should note what analytics package you use, how users can opt out of analytics tracking, and a link to your analytics provider’s privacy policy, if any." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:529 +msgid "In this subsection you should note what information may be disclosed by users who can upload media files. All uploaded files are usually publicly accessible." +msgstr "In this subsection you should note what information may be disclosed by users who can upload media files. All uploaded files are usually publicly accessible." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:516 +msgid "In this subsection you should note what information is captured through comments. We have noted the data which WordPress collects by default." +msgstr "In this subsection you should note what information is captured through comments. We have noted the data which WordPress collects by default." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:500 +msgid "In this section you should note what personal data you collect from users and site visitors. This may include personal data, such as name, email address, personal account preferences; transactional data, such as purchase information; and technical data, such as information about cookies." +msgstr "In this section you should note what personal data you collect from users and site visitors. This may include personal data, such as name, email address, personal account preferences; transactional data, such as purchase information; and technical data, such as information about cookies." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:473 +msgid "Suggested text:" +msgstr "Suggested text:" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:450 +msgid "We have suggested the sections you will need. Under each section heading you will find a short summary of what information you should provide, which will help you to get started. Some sections include suggested policy content, others will have to be completed with information from your theme and plugins." +msgstr "We have suggested the sections you will need. Under each section heading you will find a short summary of what information you should provide, which will help you to get started. Some sections include suggested policy content, others will have to be completed with information from your theme and plugins." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-privacy-policy-content.php:413 +msgid "Source: %s" +msgstr "Source: %s" + +#. translators: %s: Date of privacy policy text update. +#: wp-admin/includes/class-wp-privacy-policy-content.php:399 +msgid "Updated %s." +msgstr "Updated %s." + +#. translators: %s: Date of plugin deactivation. +#: wp-admin/includes/class-wp-privacy-policy-content.php:393 +msgid "You deactivated this plugin on %s and may no longer need this policy." +msgstr "You deactivated this plugin on %s and may no longer need this policy." + +#. translators: %s: Date of plugin deactivation. +#: wp-admin/includes/class-wp-privacy-policy-content.php:390 +msgid "Removed %s." +msgstr "Removed %s." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:378 +#: wp-admin/includes/class-wp-privacy-policy-content.php:447 +msgid "Introduction" +msgstr "Introduction" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:330 +msgid "Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme." +msgstr "Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme." + +#: wp-admin/erase-personal-data.php:60 +msgid "Add Data Erasure Request" +msgstr "Add Data Erasure Request" + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:66 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:140 +msgid "Erasing data..." +msgstr "Erasing data..." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:133 +msgid "Send export link" +msgstr "Send export link" + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:676 +msgid "Industry regulatory disclosure requirements" +msgstr "Industry regulatory disclosure requirements" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:680 +msgid "If you are a member of a regulated industry, or if you are subject to additional privacy laws, you may be required to disclose that information here." +msgstr "If you are a member of a regulated industry, or if you are subject to additional privacy laws, you may be required to disclose that information here." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:672 +msgid "If your web site provides a service which includes automated decision making - for example, allowing customers to apply for credit, or aggregating their data into an advertising profile - you must note that this is taking place, and include information about how that information is used, what decisions are made with that aggregated data, and what rights users have over decisions made without human intervention." +msgstr "If your web site provides a service which includes automated decision making - for example, allowing customers to apply for credit, or aggregating their data into an advertising profile - you must note that this is taking place, and include information about how that information is used, what decisions are made with that aggregated data, and what rights users have over decisions made without human intervention." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:668 +msgid "What automated decision making and/or profiling we do with user data" +msgstr "What automated decision making and/or profiling we do with user data" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:664 +msgid "If your web site receives data about users from third parties, including advertisers, this information must be included within the section of your privacy policy dealing with third party data." +msgstr "If your website receives data about users from third parties, including advertisers, this information must be included in the section of your privacy policy dealing with third-party data." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:656 +msgid "In this section you should explain what procedures you have in place to deal with data breaches, either potential or real, such as internal reporting systems, contact mechanisms, or bug bounties." +msgstr "In this section, you should explain what procedures you have in place to deal with data breaches, either potential or real, such as internal reporting systems, contact mechanisms, or bug bounties." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:660 +msgid "What third parties we receive data from" +msgstr "What third parties we receive data from" + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:652 +msgid "What data breach procedures we have in place" +msgstr "What data breach procedures we have in place" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:648 +msgid "In this section you should explain what measures you have taken to protect your users’ data. This could include technical measures such as encryption; security measures such as two factor authentication; and measures such as staff training in data protection. If you have carried out a Privacy Impact Assessment, you can mention it here too." +msgstr "In this section you should explain what measures you have taken to protect your users’ data. This could include technical measures such as encryption; security measures such as two-factor authentication; and measures such as staff training in data protection. If you have carried out a Privacy Impact Assessment, you can mention it here too." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:644 +msgid "How we protect your data" +msgstr "How we protect your data" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:640 +msgid "If you use your site for commercial purposes and you engage in more complex collection or processing of personal data, you should note the following information in your privacy policy in addition to the information we have already discussed." +msgstr "If you use your site for commercial purposes and you engage in more complex collection or processing of personal data, you should note the following information in your privacy policy in addition to the information we have already discussed." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:636 +msgid "Additional information" +msgstr "Additional information" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:632 +msgid "In this section you should provide a contact method for privacy-specific concerns. If you are required to have a Data Protection Officer, list their name and full contact details here as well." +msgstr "In this section, you should provide a contact method for privacy-specific concerns. If you are required to have a Data Protection Officer, list their name and full contact details here as well." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:628 +msgid "Your contact information" +msgstr "Your contact information" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:621 +msgid "European data protection law requires data about European residents which is transferred outside the European Union to be safeguarded to the same standards as if the data was in Europe. So in addition to listing where data goes, you should describe how you ensure that these standards are met either by yourself or by your third party providers, whether that is through an agreement such as Privacy Shield, model clauses in your contracts, or binding corporate rules." +msgstr "European data protection law requires data about European residents which is transferred outside the European Union to be safeguarded to the same standards as if the data was in Europe. So in addition to listing where data goes, you should describe how you ensure that these standards are met either by yourself or by your third-party providers, whether that is through an agreement such as Privacy Shield, model clauses in your contracts, or binding corporate rules." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:619 +msgid "In this section you should list all transfers of your site data outside the European Union and describe the means by which that data is safeguarded to European data protection standards. This could include your web hosting, cloud storage, or other third party services." +msgstr "In this section, you should list all transfers of your site data outside the European Union and describe the means by which that data is safeguarded to European data protection standards. This could include your web hosting, cloud storage, or other third party services." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:615 +msgid "Where we send your data" +msgstr "Where we send your data" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:612 +msgid "If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes." +msgstr "If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:601 +msgid "For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information." +msgstr "For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:608 +msgid "In this section you should explain what rights your users have over their data and how they can invoke those rights." +msgstr "In this section, you should explain what rights your users have over their data and how they can invoke those rights." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:604 +msgid "What rights you have over your data" +msgstr "What rights you have over your data" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:599 +msgid "If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue." +msgstr "If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognise and approve any follow-up comments automatically instead of holding them in a moderation queue." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:595 +msgid "In this section you should explain how long you retain personal data collected or processed by the web site. While it is your responsibility to come up with the schedule of how long you keep each dataset for and why you keep it, that information does need to be listed here. For example, you may want to say that you keep contact form entries for six months, analytics records for a year, and customer purchase records for ten years." +msgstr "In this section you should explain how long you retain personal data collected or processed by the web site. While it is your responsibility to come up with the schedule of how long you keep each dataset for and why you keep it, that information does need to be listed here. For example, you may want to say that you keep contact form entries for six months, analytics records for a year, and customer purchase records for ten years." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:591 +msgid "How long we retain your data" +msgstr "How long we retain your data" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:584 +msgid "By default WordPress does not share any personal data with anyone." +msgstr "By default WordPress does not share any personal data with anyone." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:582 +msgid "In this section you should name and list all third party providers with whom you share site data, including partners, cloud-based services, payment processors, and third party service providers, and note what data you share with them and why. Link to their own privacy policies if possible." +msgstr "In this section, you should name and list all third-party providers with whom you share site data, including partners, cloud-based services, payment processors, and third party service providers, and note what data you share with them and why. Link to their own privacy policies if possible." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:574 +msgid "By default WordPress does not collect any analytics data. However, many web hosting accounts collect some anonymous analytics data. You may also have installed a WordPress plugin that provides analytics services. In that case, add information from that plugin here." +msgstr "By default, WordPress does not collect any analytics data. However, many web hosting accounts collect some anonymous analytics data. You may also have installed a WordPress plugin that provides analytics services. In that case, add information from that plugin here." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:578 +msgid "Who we share your data with" +msgstr "Who we share your data with" + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:568 +msgid "Analytics" +msgstr "Analytics" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:565 +msgid "These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website." +msgstr "These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:563 +msgid "Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website." +msgstr "Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:561 +msgid "Embedded content from other websites" +msgstr "Embedded content from other websites" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:558 +msgid "If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day." +msgstr "If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:556 +msgid "When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed." +msgstr "When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:554 +msgid "If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser." +msgstr "If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:552 +msgid "If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year." +msgstr "If you leave a comment on our site you may opt in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:548 +msgid "In this subsection you should list the cookies your web site uses, including those set by your plugins, social media, and analytics. We have provided the cookies which WordPress installs by default." +msgstr "In this subsection you should list the cookies your web site uses, including those set by your plugins, social media, and analytics. We have provided the cookies which WordPress installs by default." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:544 +msgid "Cookies" +msgstr "Cookies" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:522 +msgid "An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment." +msgstr "An anonymised string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service Privacy Policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:520 +msgid "When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection." +msgstr "When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:540 +msgid "By default, WordPress does not include a contact form. If you use a contact form plugin, use this subsection to note what personal data is captured when someone submits a contact form, and how long you keep it. For example, you may note that you keep contact form submissions for a certain period for customer service purposes, but you do not use the information submitted through them for marketing purposes." +msgstr "By default, WordPress does not include a contact form. If you use a contact form plugin, use this subsection to note what personal data is captured when someone submits a contact form, and how long you keep it. For example, you may note that you keep contact form submissions for a certain period for customer service purposes, but you do not use the information submitted through them for marketing purposes." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:536 +msgid "Contact forms" +msgstr "Contact forms" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:533 +msgid "If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website." +msgstr "If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:508 +msgid "By default WordPress does not collect any personal data about visitors, and only collects the data shown on the User Profile screen from registered users. However some of your plugins may collect personal data. You should add the relevant information below." +msgstr "By default WordPress does not collect any personal data about visitors, and only collects the data shown on the User Profile screen from registered users. However some of your plugins may collect personal data. You should add the relevant information below." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:506 +msgid "Personal data is not just created by a user’s interactions with your site. Personal data is also generated from technical processes such as contact forms, comments, cookies, analytics, and third party embeds." +msgstr "Personal data is not just created by a user’s interactions with your site. Personal data is also generated from technical processes such as contact forms, comments, cookies, analytics, and third-party embeds." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:504 +msgid "In addition to listing what personal data you collect, you need to note why you collect it. These explanations must note either the legal basis for your data collection and retention or the active consent the user has given." +msgstr "In addition to listing what personal data you collect, you need to note why you collect it. These explanations must note either the legal basis for your data collection and retention or the active consent the user has given." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:502 +msgid "You should also note any collection and retention of sensitive personal data, such as data concerning health." +msgstr "You should also note any collection and retention of sensitive personal data, such as data concerning health." + +#. translators: Default privacy policy text. %s: Site URL. +#: wp-admin/includes/class-wp-privacy-policy-content.php:493 +msgid "Our website address is: %s." +msgstr "Our website address is: %s." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:489 +msgid "The amount of information you may be required to show will vary depending on your local or national business regulations. You may, for example, be required to display a physical address, a registered address, or your company registration number." +msgstr "The amount of information you may be required to show will vary depending on your local or national business regulations. You may, for example, be required to display a physical address, a registered address, or your company registration number." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:496 +msgid "What personal data we collect and why we collect it" +msgstr "What personal data we collect and why we collect it" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:487 +msgid "In this section you should note your site URL, as well as the name of the company, organization, or individual behind it, and some accurate contact information." +msgstr "In this section, you should note your site URL, as well as the name of the company, organisation, or individual behind it, and some accurate contact information." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:452 +msgid "It is your responsibility to write a comprehensive privacy policy, to make sure it reflects all national and international legal requirements on privacy, and to keep your policy current and accurate." +msgstr "It is your responsibility to write a comprehensive privacy policy, to make sure it reflects all national and international legal requirements on privacy, and to keep your policy current and accurate." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:483 +msgid "Who we are" +msgstr "Who we are" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:451 +msgid "Please edit your privacy policy content, making sure to delete the summaries, and adding any information from your theme and plugins. Once you publish your policy page, remember to add it to your navigation menu." +msgstr "Please edit your privacy policy content, making sure to delete the summaries, and adding any information from your theme and plugins. Once you publish your policy page, remember to add it to your navigation menu." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:448 +msgid "Hello," +msgstr "Hello," + +#: wp-admin/includes/class-wp-privacy-policy-content.php:449 +msgid "This text template will help you to create your web site’s privacy policy." +msgstr "This text template will help you to create your web site’s privacy policy." + +#: wp-admin/options-privacy.php:125 +msgid "As a website owner, you may need to follow national or international privacy laws. For example, you may need to create and display a Privacy Policy." +msgstr "As a website owner, you may need to follow national or international privacy laws. For example, you may need to create and display a Privacy Policy." + +#: wp-admin/includes/privacy-tools.php:377 +msgctxt "date/time" +msgid "On" +msgstr "On" + +#: wp-admin/includes/privacy-tools.php:373 +msgctxt "website URL" +msgid "At URL" +msgstr "At URL" + +#: wp-admin/includes/privacy-tools.php:369 +msgctxt "website name" +msgid "For site" +msgstr "For site" + +#: wp-admin/includes/privacy-tools.php:365 +msgctxt "email address" +msgid "Report generated for" +msgstr "Report generated for" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:136 +msgid "Email could not be sent." +msgstr "Email could not be sent." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:68 +msgid "Force erasure has failed." +msgstr "Force erasure has failed." + +#. translators: %s: Exporter array index. +#: wp-admin/includes/ajax-actions.php:4824 +msgid "Exporter array at index %s does not include a friendly name." +msgstr "Exporter array at index %s does not include a friendly name." + +#: wp-admin/includes/ajax-actions.php:4793 +msgid "An exporter has improperly used the registration filter." +msgstr "An exporter has improperly used the registration filter." + +#: wp-admin/includes/ajax-actions.php:4991 +msgid "Eraser index is out of range." +msgstr "Eraser index is out of range." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4868 +msgid "Expected data array in response array from exporter: %s." +msgstr "Expected data array in response array from exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4861 +msgid "Expected data in response array from exporter: %s." +msgstr "Expected data in response array from exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4875 +msgid "Expected done (boolean) in response array from exporter: %s." +msgstr "Expected done (boolean) in response array from exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4854 +msgid "Expected response as an array from exporter: %s." +msgstr "Expected response as an array from exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4840 +msgid "Exporter callback is not a valid callback: %s." +msgstr "Exporter callback is not a valid callback: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4833 +msgid "Exporter does not include a callback: %s." +msgstr "Exporter does not include a callback: %s." + +#: wp-admin/includes/ajax-actions.php:4799 +msgid "Exporter index cannot be negative." +msgstr "Exporter index cannot be negative." + +#: wp-admin/includes/ajax-actions.php:4749 +#: wp-admin/includes/ajax-actions.php:4940 +msgid "Invalid request type." +msgstr "Invalid request type." + +#: wp-admin/includes/ajax-actions.php:4950 +msgid "Missing eraser index." +msgstr "Missing eraser index." + +#: wp-admin/includes/ajax-actions.php:4758 +msgid "Missing exporter index." +msgstr "Missing exporter index." + +#: wp-admin/includes/ajax-actions.php:4764 +#: wp-admin/includes/ajax-actions.php:4956 +msgid "Missing page index." +msgstr "Missing page index." + +#: wp-admin/export-personal-data.php:13 +msgid "Sorry, you are not allowed to export personal data on this site." +msgstr "Sorry, you are not allowed to export personal data on this site." + +#. translators: %s: Exporter array index. +#: wp-admin/includes/ajax-actions.php:4817 +msgid "Expected an array describing the exporter at index %s." +msgstr "Expected an array describing the exporter at index %s." + +#: wp-admin/includes/ajax-actions.php:4803 +msgid "Exporter index is out of range." +msgstr "Exporter index is out of range." + +#: wp-admin/erase-personal-data.php:13 +msgid "Sorry, you are not allowed to erase personal data on this site." +msgstr "Sorry, you are not allowed to erase personal data on this site." + +#: wp-admin/options-privacy.php:190 +msgid "Change your Privacy Policy page" +msgstr "Change your Privacy Policy page" + +#: wp-admin/options-privacy.php:246 +msgid "Create New Page" +msgstr "Create New Page" + +#: wp-admin/options-privacy.php:192 +msgid "Select a Privacy Policy page" +msgstr "Select a Privacy Policy page" + +#: wp-admin/options-privacy.php:227 +msgid "Use This Page" +msgstr "Use This Page" + +#. translators: 1: URL to edit Privacy Policy page, 2: URL to view Privacy +#. Policy page. +#: wp-admin/options-privacy.php:154 +msgid "Edit or view your Privacy Policy page content." +msgstr "Edit or view your Privacy Policy page content." + +#: wp-admin/options-privacy.php:134 +msgid "We would also suggest reviewing your Privacy Policy from time to time, especially after installing or updating any themes or plugins. There may be changes or new suggested information for you to consider adding to your policy." +msgstr "We would also suggest reviewing your Privacy Policy from time to time, especially after installing or updating any themes or plugins. There may be changes or new suggested information for you to consider adding to your policy." + +#: wp-admin/options-privacy.php:130 +msgid "However, it is your responsibility to use those resources correctly, to provide the information that your Privacy Policy requires, and to keep that information current and accurate." +msgstr "However, it is your responsibility to use those resources correctly, to provide the information that your Privacy Policy requires, and to keep that information current and accurate." + +#. translators: Privacy Policy page slug. +#: wp-admin/includes/upgrade.php:382 +msgid "privacy-policy" +msgstr "privacy-policy" + +#: wp-admin/options-privacy.php:129 +msgid "The new page will include help and suggestions for your Privacy Policy." +msgstr "The new page will include help and suggestions for your Privacy Policy." + +#: wp-admin/options-privacy.php:126 +msgid "If you already have a Privacy Policy page, please select it below. If not, please create one." +msgstr "If you already have a Privacy Policy page, please select it below. If not, please create one." + +#: wp-admin/options-privacy.php:94 +msgid "The currently selected Privacy Policy page does not exist. Please create or select a new page." +msgstr "The currently selected Privacy Policy page does not exist. Please create or select a new page." + +#: wp-admin/options-privacy.php:70 +msgid "Unable to create a Privacy Policy page." +msgstr "Unable to create a Privacy Policy page." + +#. translators: %s: URL to Customizer -> Menus. +#: wp-admin/options-privacy.php:42 +msgid "Privacy Policy page setting updated successfully. Remember to update your menus!" +msgstr "Privacy Policy page setting updated successfully. Remember to update your menus!" + +#. translators: %s: URL to Pages Trash. +#: wp-admin/options-privacy.php:104 +msgid "The currently selected Privacy Policy page is in the Trash. Please create or select a new Privacy Policy page or restore the current page." +msgstr "The currently selected Privacy Policy page is in the Bin. Please create or select a new Privacy Policy page or restore the current page." + +#. translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are +#. placeholders. +#: wp-admin/includes/privacy-tools.php:630 +msgid "" +"Howdy,\n" +"\n" +"Your request for an export of personal data has been completed. You may\n" +"download your personal data by clicking on the link below. For privacy\n" +"and security, we will automatically delete the file on ###EXPIRATION###,\n" +"so please download it before then.\n" +"\n" +"###LINK###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"Your request for an export of personal data has been completed. You may\n" +"download your personal data by clicking on the link below. For privacy\n" +"and security, we will automatically delete the file on ###EXPIRATION###,\n" +"so please download it before then.\n" +"\n" +"###LINK###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#. translators: Personal data export notification email subject. %s: Site +#. title. +#: wp-admin/includes/privacy-tools.php:604 +msgid "[%s] Personal Data Export" +msgstr "[%s] Personal Data Export" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:135 +msgid "Email sent." +msgstr "Email sent." + +#: wp-admin/includes/privacy-tools.php:714 +msgid "Unable to send personal data export email." +msgstr "Unable to send personal data export email." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:62 +msgid "Download personal data again" +msgstr "Download personal data again" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:134 +msgid "Sending email..." +msgstr "Sending email..." + +#: wp-admin/includes/privacy-tools.php:433 +msgid "Personal Data Export" +msgstr "Personal Data Export" + +#. translators: %s: User's email address. +#: wp-admin/includes/privacy-tools.php:349 +msgid "Personal Data Export for %s" +msgstr "Personal Data Export for %s" + +#: wp-admin/includes/ajax-actions.php:4754 +msgid "A valid email address must be given." +msgstr "A valid email address must be given." + +#: wp-admin/includes/privacy-tools.php:559 +msgid "Invalid request ID when sending personal data export email." +msgstr "Invalid request ID when sending personal data export email." + +#: wp-admin/export-personal-data.php:60 +msgid "Add Data Export Request" +msgstr "Add Data Export Request" + +#: wp-admin/includes/privacy-tools.php:169 +msgid "Confirmation request initiated successfully." +msgstr "Confirmation request initiated successfully." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5045 +msgid "Did not receive array from %1$s eraser (index %2$d)." +msgstr "Did not receive array from %1$s eraser (index %2$d)." + +#. translators: %d: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5009 +msgid "Eraser array at index %d does not include a friendly name." +msgstr "Eraser array at index %d does not include a friendly name." + +#: wp-admin/includes/ajax-actions.php:4987 +msgid "Eraser index cannot be less than one." +msgstr "Eraser index cannot be less than one." + +#. translators: %d: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5004 +msgid "Expected an array describing the eraser at index %d." +msgstr "Expected an array describing the eraser at index %d." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5100 +msgid "Expected done flag in response array from %1$s eraser (index %2$d)." +msgstr "Expected done flag in response array from %1$s eraser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5056 +msgid "Expected items_removed key in response array from %1$s eraser (index %2$d)." +msgstr "Expected items_removed key in response array from %1$s eraser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5067 +msgid "Expected items_retained key in response array from %1$s eraser (index %2$d)." +msgstr "Expected items_retained key in response array from %1$s eraser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5078 +msgid "Expected messages key in response array from %1$s eraser (index %2$d)." +msgstr "Expected messages key in response array from %1$s eraser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5089 +msgid "Expected messages key to reference an array in response array from %1$s eraser (index %2$d)." +msgstr "Expected messages key to reference an array in response array from %1$s eraser (index %2$d)." + +#: wp-admin/includes/ajax-actions.php:4736 +#: wp-admin/includes/ajax-actions.php:4926 +msgid "Invalid request ID." +msgstr "Invalid request ID." + +#: wp-admin/includes/ajax-actions.php:4807 +#: wp-admin/includes/ajax-actions.php:4995 +msgid "Page index cannot be less than one." +msgstr "Page index cannot be less than one." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:156 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:163 +msgid "Remove request" +msgstr "Remove request" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:45 +msgid "Requested" +msgstr "Requested" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:43 +msgid "Requester" +msgstr "Requester" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:116 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:122 +msgid "Waiting for confirmation" +msgstr "Waiting for confirmation" + +#: wp-admin/includes/privacy-tools.php:158 +msgid "Unable to initiate confirmation request." +msgstr "Unable to initiate confirmation request." + +#: wp-admin/includes/privacy-tools.php:91 +msgid "Confirmation request sent again successfully." +msgstr "Confirmation request sent again successfully." + +#: wp-admin/erase-personal-data.php:66 wp-admin/export-personal-data.php:66 +msgid "Send Request" +msgstr "Send request" + +#: wp-admin/includes/ajax-actions.php:4946 +msgid "Invalid email address in request." +msgstr "Invalid email address in request." + +#: wp-admin/includes/privacy-tools.php:130 +msgid "Unable to add this request. A valid email address or username must be supplied." +msgstr "Unable to add this request. A valid email address or username must be supplied." + +#: wp-admin/erase-personal-data.php:64 wp-admin/export-personal-data.php:64 +msgid "Username or email address" +msgstr "Username or email address" + +#: wp-admin/erase-personal-data.php:61 wp-admin/export-personal-data.php:61 +msgid "An email will be sent to the user at this email address asking them to verify the request." +msgstr "An email will be sent to the user at this email address asking them to verify the request." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:60 +msgid "Download personal data" +msgstr "Download personal data" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:61 +msgid "Downloading data..." +msgstr "Downloading data..." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:65 +msgid "Force erase personal data" +msgstr "Force erase personal data" + +#: wp-admin/includes/plugin-install.php:676 +msgid "Requires PHP Version:" +msgstr "Requires PHP:" + +#: wp-admin/customize.php:80 +msgid "This changeset cannot be further modified." +msgstr "This changeset cannot be further modified." + +#. translators: %s: https://wordpress.org/about/stats +#: wp-admin/privacy.php:64 +msgid "This data is used to provide general enhancements to WordPress, which includes helping to protect your site by finding and automatically installing new updates. It is also used to calculate statistics, such as those shown on the WordPress.org stats page." +msgstr "This data is used to provide general enhancements to WordPress, which includes helping to protect your site by finding and automatically installing new updates. It is also used to calculate statistics, such as those shown on the WordPress.org stats page." + +#. translators: %s: Link to Custom CSS section in the Customizer. +#: wp-admin/theme-editor.php:205 +msgid "There’s no need to change your CSS here — you can edit and live preview CSS changes in the built-in CSS editor." +msgstr "There’s no need to change your CSS here — you can edit and live preview CSS changes in the built-in CSS editor." + +#: wp-admin/theme-editor.php:200 +msgid "Did you know?" +msgstr "Did you know?" + +#: wp-admin/credits.php:149 +msgid "Noteworthy Contributors" +msgstr "Noteworthy Contributors" + +#: wp-admin/theme-editor.php:373 +msgid "If you decide to go ahead with direct edits anyway, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." +msgstr "If you decide to go ahead with direct edits anyway, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." + +#: wp-admin/plugin-editor.php:327 +msgid "If you absolutely have to make direct edits to this plugin, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." +msgstr "If you absolutely have to make direct edits to this plugin, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." + +#: wp-admin/plugin-editor.php:326 +msgid "You appear to be making direct edits to your plugin in the WordPress dashboard. We recommend that you don’t! Editing plugins directly may introduce incompatibilities that break your site and your changes may be lost in future updates." +msgstr "You appear to be making direct edits to your plugin in the WordPress dashboard. We recommend that you don’t! Editing plugins directly may introduce incompatibilities that break your site and your changes may be lost in future updates." + +#. translators: 1: Codex URL, 2: URL to Reading Settings screen. +#: wp-admin/options-writing.php:223 +msgid "WordPress is not notifying any Update Services because of your site’s visibility settings." +msgstr "WordPress is not notifying any Update Services because of your site’s visibility settings." + +#: wp-admin/options-writing.php:210 wp-admin/options-writing.php:224 +msgid "https://codex.wordpress.org/Update_Services" +msgstr "https://codex.wordpress.org/Update_Services" + +#. translators: 1: .htaccess, 2: Documentation URL, 3: CTRL + a +#: wp-admin/options-permalink.php:422 +msgid "If your %1$s file was writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s to select all." +msgstr "If your %1$s file was writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s to select all." + +#. translators: 1: Documentation URL, 2: web.config, 3: CTRL + a +#: wp-admin/options-permalink.php:390 +msgid "If the root directory of your site was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %2$s file. Create a new file, called %2$s in the root directory of your site. Click in the field and press %3$s to select all. Then insert this code into the %2$s file." +msgstr "If the root directory of your site was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %2$s file. Create a new file, called %2$s in the root directory of your site. Click in the field and press %3$s to select all. Then insert this code into the %2$s file." + +#. translators: 1: web.config, 2: Documentation URL, 3: CTRL + a, 4: Element +#. code. +#: wp-admin/options-permalink.php:364 +msgid "If your %1$s file was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %1$s file. Click in the field and press %3$s to select all. Then insert this rule inside of the %4$s element in %1$s file." +msgstr "If your %1$s file was writable, we could do this automatically, but it isn’t so this is the URL rewrite rule you should have in your %1$s file. Click in the field and press %3$s to select all. Then insert this rule inside of the %4$s element in %1$s file." + +#. translators: %s: Documentation URL. +#: wp-admin/options-general.php:99 +msgid "Enter the address here if you want your site home page to be different from your WordPress installation directory." +msgstr "Enter the address here if you want your site home page to be different from your WordPress installation directory." + +#. translators: %s: https://wordpress.org/about/privacy +#: wp-admin/privacy.php:74 +msgid "We take privacy and transparency very seriously. To learn more about what data we collect, and how we use it, please visit WordPress.org/about/privacy." +msgstr "We take privacy and transparency very seriously. To learn more about what data we collect, and how we use it, please visit WordPress.org/about/privacy." + +#: wp-admin/freedoms.php:66 wp-admin/freedoms.php:118 +msgid "https://wordpress.org/about/license/" +msgstr "https://en-gb.wordpress.org/about/licence/" + +#: wp-admin/privacy.php:58 +msgid "From time to time, your WordPress site may send data to WordPress.org — including, but not limited to — the version of WordPress you are using, and a list of installed plugins and themes." +msgstr "From time to time, your WordPress site may send data to WordPress.org – including, but not limited to – the version of WordPress you are using, and a list of installed plugins and themes." + +#. translators: Attachment information. %s: Date the attachment was uploaded. +#: wp-admin/includes/meta-boxes.php:415 +msgid "Uploaded on: %s" +msgstr "Uploaded on: %s" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-plugin-upgrader.php:77 +#: wp-admin/includes/class-theme-upgrader.php:75 +msgid "Downloading installation package from %s…" +msgstr "Downloading installation package from %s…" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-language-pack-upgrader.php:117 +msgid "Downloading translation from %s…" +msgstr "Downloading translation from %s…" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-plugin-upgrader.php:60 +#: wp-admin/includes/class-theme-upgrader.php:59 +#: wp-admin/includes/class-core-upgrader.php:33 +msgid "Downloading update from %s…" +msgstr "Downloading update from %s…" + +#. translators: 1: wp-admin/includes/template.php, 2: add_meta_box(), 3: +#. add_meta_boxes +#: wp-admin/includes/template.php:2558 +msgid "Likely direct inclusion of %1$s in order to use %2$s. This is very wrong. Hook the %2$s call into the %3$s action instead." +msgstr "Likely direct inclusion of %1$s in order to use %2$s. This is very wrong. Hook the %2$s call into the %3$s action instead." + +#: wp-admin/includes/template.php:2187 +msgid "Customization Draft" +msgstr "Customisation Draft" + +#. translators: %s: URL to the Customizer. +#: wp-admin/includes/meta-boxes.php:289 +msgid "This draft comes from your unpublished customization changes. You can edit, but there’s no need to publish now. It will be published automatically with those changes." +msgstr "This draft comes from your unpublished customisation changes. You can edit, but there’s no need to publish now. It will be published automatically with those changes." + +#: wp-admin/theme-editor.php:251 +msgid "Theme Files" +msgstr "Theme Files" + +#: wp-admin/includes/misc.php:388 wp-admin/includes/misc.php:477 +msgid "folder" +msgstr "folder" + +#: wp-admin/includes/file.php:571 +msgid "Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP." +msgstr "Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP." + +#: wp-admin/press-this.php:75 wp-admin/press-this.php:81 +msgid "Installation Required" +msgstr "Installation Required" + +#. translators: %s: Plugin filename. +#: wp-admin/includes/plugin.php:1037 +msgid "Could not fully remove the plugin %s." +msgstr "Could not fully remove the plugin %s." + +#: wp-admin/user-new.php:350 +msgid "User has been created, but could not be added to this site." +msgstr "User has been created, but could not be added to this site." + +#: wp-admin/user-new.php:347 +msgid "That user could not be added to this site." +msgstr "That user could not be added to this site." + +#: wp-admin/user-edit.php:291 +msgid "Disable syntax highlighting when editing code" +msgstr "Disable syntax highlighting when editing code" + +#: wp-admin/user-edit.php:288 +msgid "Syntax Highlighting" +msgstr "Syntax Highlighting" + +#: wp-admin/setup-config.php:418 wp-admin/setup-config.php:451 +msgid "Run the installation" +msgstr "Run the installation" + +#: wp-admin/privacy.php:75 +msgid "https://wordpress.org/about/privacy/" +msgstr "https://wordpress.org/about/privacy/" + +#: wp-admin/press-this.php:80 +msgid "Press This is not available. Please contact your site administrator." +msgstr "Press This is not available. Please contact your site administrator." + +#. translators: %s: URL to Press This bookmarklet on the main site. +#: wp-admin/press-this.php:68 +msgid "Press This is not installed. Please install Press This from the main site." +msgstr "Press This is not installed. Please install Press This from the main site." + +#: wp-admin/press-this.php:44 +msgid "Activate Press This" +msgstr "Activate Press This" + +#: wp-admin/theme-editor.php:377 wp-admin/plugin-editor.php:331 +msgid "I understand" +msgstr "I understand" + +#: wp-admin/theme-editor.php:356 wp-admin/plugin-editor.php:325 +msgid "Heads up!" +msgstr "Heads up!" + +#: wp-admin/plugin-editor.php:282 +msgid "Warning: Making changes to active plugins is not recommended." +msgstr "Warning: Making changes to active plugins is not recommended." + +#: wp-admin/theme-editor.php:284 wp-admin/plugin-editor.php:263 +msgid "Selected file content:" +msgstr "Selected file content:" + +#: wp-admin/theme-editor.php:193 wp-admin/plugin-editor.php:188 +msgid "There was an error while trying to update the file. You may need to fix something and try updating again." +msgstr "There was an error while trying to update the file. You may need to fix something and try updating again." + +#. translators: %s: Select field to choose the front page. +#: wp-admin/options-reading.php:109 +msgid "Homepage: %s" +msgstr "Homepage: %s" + +#: wp-admin/options-permalink.php:306 +msgid "Available tags:" +msgstr "Available tags:" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:302 +msgid "%s (already used in permalink structure)" +msgstr "%s (already used in permalink structure)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:299 +msgid "%s added to permalink structure" +msgstr "%s added to permalink structure" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:286 +msgid "%s (A sanitized version of the author name.)" +msgstr "%s (A sanitised version of the author name.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:282 +msgid "%s (The sanitized post title (slug).)" +msgstr "%s (The sanitised post title (slug).)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:280 +msgid "%s (The unique ID of the post, for example 423.)" +msgstr "%s (The unique ID of the post, for example 423.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:278 +msgid "%s (Second of the minute, for example 33.)" +msgstr "%s (Second of the minute, for example 33.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:276 +msgid "%s (Minute of the hour, for example 43.)" +msgstr "%s (Minute of the hour, for example 43.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:274 +msgid "%s (Hour of the day, for example 15.)" +msgstr "%s (Hour of the day, for example 15.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:272 +msgid "%s (Day of the month, for example 28.)" +msgstr "%s (Day of the month, for example 28.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:270 +msgid "%s (Month of the year, for example 05.)" +msgstr "%s (Month of the year, for example 05.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:284 +msgid "%s (Category slug. Nested sub-categories appear as nested directories in the URL.)" +msgstr "%s (Category slug. Nested sub-categories appear as nested directories in the URL.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:268 +msgid "%s (The year of the post, four digits, for example 2004.)" +msgstr "%s (The year of the post, four digits, for example 2004.)" + +#: wp-admin/includes/theme-install.php:245 +msgid "Theme Installation" +msgstr "Theme Installation" + +#. translators: %s: User's display name. +#: wp-admin/includes/post.php:1744 +msgid "%s is currently editing this post. Do you want to take over?" +msgstr "%s is currently editing this post. Do you want to take over?" + +#. translators: %s: User's display name. +#: wp-admin/includes/post.php:1747 +msgid "%s is currently editing this post." +msgstr "%s is currently editing this post." + +#: wp-admin/includes/plugin-install.php:598 wp-admin/update.php:126 +msgid "Plugin Installation" +msgstr "Plugin Installation" + +#: wp-admin/includes/plugin.php:497 +msgid "Custom installation script." +msgstr "Custom installation script." + +#: wp-admin/includes/plugin-install.php:683 +msgid "Active Installations:" +msgstr "Active Installations:" + +#: wp-admin/includes/ms.php:1145 +msgid "Settings — This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database." +msgstr "Settings — This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are greyed out and say Serialised Data. You cannot modify these values due to the way the setting is stored in the database." + +#. translators: %s: URL to Network Themes screen. +#: wp-admin/includes/ms.php:1142 +msgid "Themes — This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen." +msgstr "Themes — This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen." + +#: wp-admin/includes/ms.php:1139 +msgid "Users — This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network." +msgstr "Users — This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network." + +#: wp-admin/includes/ms.php:1138 +msgid "Info — The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable." +msgstr "Info — The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable." + +#: wp-admin/includes/ms.php:1137 +msgid "The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable." +msgstr "The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable." + +#: wp-admin/includes/file.php:504 +msgid "Unable to write to file." +msgstr "Unable to write to file." + +#. translators: 1: Line number, 2: File path. +#: wp-admin/includes/file.php:311 +msgid "Your PHP code changes were rolled back due to an error on line %1$s of file %2$s. Please fix and try saving again." +msgstr "Your PHP code changes were rolled back due to an error on line %1$s of file %2$s. Please fix and try saving again." + +#. translators: If a Rosetta site exists (e.g. https://es.wordpress.org/news/), +#. then use that. Otherwise, leave untranslated. +#: wp-admin/includes/dashboard.php:1265 +msgctxt "Events and News dashboard widget" +msgid "https://wordpress.org/news/" +msgstr "https://wordpress.org/news/" + +#: wp-admin/includes/dashboard.php:75 wp-admin/includes/dashboard.php:616 +msgid "Your Recent Drafts" +msgstr "Your Recent Drafts" + +#: wp-admin/includes/class-wp-users-list-table.php:546 +#: wp-admin/includes/class-wp-ms-users-list-table.php:307 +msgctxt "name" +msgid "Unknown" +msgstr "Unknown" + +#. translators: %s: Author's display name. +#: wp-admin/includes/class-wp-users-list-table.php:468 +msgid "View posts by %s" +msgstr "View posts by %s" + +#: wp-admin/includes/class-wp-terms-list-table.php:548 +msgid "No description" +msgstr "No description" + +#. translators: %s: Number of installations. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:756 +msgid "%s Active Installations" +msgstr "%s Active Installations" + +#: wp-admin/includes/class-theme-upgrader.php:81 +msgid "Theme installation failed." +msgstr "Theme installation failed." + +#: wp-admin/includes/class-plugin-upgrader.php:83 +msgid "Plugin installation failed." +msgstr "Plugin installation failed." + +#: wp-admin/customize.php:71 +msgid "Your scheduled changes just published" +msgstr "Your scheduled changes just published" + +#: wp-admin/includes/class-plugin-installer-skin.php:110 +msgid "Activate Plugin & Go to Press This" +msgstr "Activate Plugin and Go to Press This" + +#: wp-admin/options-discussion.php:54 +msgid "Allow link notifications from other blogs (pingbacks and trackbacks) on new posts" +msgstr "Allow link notifications from other blogs (pingbacks and trackbacks) on new posts" + +#: wp-admin/menu-header.php:278 wp-admin/js/common.js:1907 +msgid "Collapse Main menu" +msgstr "Collapse Main menu" + +#. translators: %s: Theme name. +#: wp-admin/themes.php:540 wp-admin/themes.php:888 wp-admin/themes.php:1101 +#: wp-admin/theme-install.php:350 wp-admin/theme-install.php:413 +#: wp-admin/js/updates.js:1384 +msgctxt "theme" +msgid "Activate %s" +msgstr "Activate %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:854 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:580 +#: wp-admin/js/updates.js:745 +msgctxt "plugin" +msgid "Activate %s" +msgstr "Activate %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:800 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:593 +#: wp-admin/js/updates.js:734 +msgctxt "plugin" +msgid "Network Activate %s" +msgstr "Network Activate %s" + +#: wp-admin/includes/class-wp-media-list-table.php:249 +msgid "No media files found." +msgstr "No media files found." + +#. translators: %s: Importer name. +#: wp-admin/import.php:132 wp-admin/import.php:181 wp-admin/js/updates.js:844 +msgid "Run %s" +msgstr "Run %s" + +#: wp-admin/import.php:133 wp-admin/import.php:182 wp-admin/js/updates.js:848 +msgid "Run Importer" +msgstr "Run Importer" + +#: wp-admin/includes/class-wp-debug-data.php:120 +msgctxt "comment status" +msgid "Open" +msgstr "Open" + +#. translators: %s: Meetup organization documentation URL. +#: wp-admin/includes/dashboard.php:1419 +msgid "There aren’t any events scheduled near you at the moment. Would you like to organize a WordPress event?" +msgstr "There aren’t any events scheduled near you at the moment. Would you like to organise a WordPress event?" + +#. translators: %s: User's display name. +#: wp-admin/user-edit.php:38 +msgid "Edit User %s" +msgstr "Edit User %s" + +#. translators: %s: Widget title. +#: wp-admin/includes/widgets.php:249 +msgid "Edit widget: %s" +msgstr "Edit widget: %s" + +#: wp-admin/includes/dashboard.php:1411 wp-admin/includes/dashboard.php:1420 +msgid "https://make.wordpress.org/community/handbook/meetup-organizer/welcome/" +msgstr "https://make.wordpress.org/community/handbook/meetup-organizer/welcome/" + +#. translators: %s: The name of a city. +#: wp-admin/includes/dashboard.php:1360 +msgid "Attend an upcoming event near %s." +msgstr "Attend an upcoming event near %s." + +#: wp-admin/includes/dashboard.php:1318 +msgid "City:" +msgstr "City:" + +#: wp-admin/includes/dashboard.php:1311 +msgid "Edit city" +msgstr "Edit city" + +#: wp-admin/includes/dashboard.php:1253 +msgid "WordCamps" +msgstr "WordCamps" + +#: wp-admin/includes/dashboard.php:1241 +msgid "Meetups" +msgstr "Meetups" + +#: wp-admin/includes/dashboard.php:1330 +msgid "Cincinnati" +msgstr "London" + +#: wp-admin/includes/dashboard.php:80 +msgid "WordPress Events and News" +msgstr "WordPress Events and News" + +#: wp-admin/includes/class-wp-community-events.php:124 +msgid "Unknown API error." +msgstr "Unknown API error." + +#. translators: Date format for upcoming events on the dashboard. Include the +#. day of the week. See https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:396 +#: wp-admin/includes/class-wp-community-events.php:401 +#: wp-admin/js/dashboard.js:774 +msgid "l, M j, Y" +msgstr "l, j M Y" + +#. translators: %d: Numeric HTTP status code, e.g. 400, 403, 500, 504, etc. +#: wp-admin/includes/class-wp-community-events.php:119 +msgid "Invalid API response code (%d)." +msgstr "Invalid API response code (%d)." + +#. translators: 1: The city the user searched for, 2: Meetup organization +#. documentation URL. +#: wp-admin/includes/dashboard.php:1409 +msgid "There aren’t any events scheduled near %1$s at the moment. Would you like to organize a WordPress event?" +msgstr "There aren’t any events scheduled near %1$s at the moment. Would you like to organise a WordPress event?" + +#: wp-admin/includes/dashboard.php:1290 wp-admin/js/dashboard.js:585 +msgid "An error occurred. Please try again." +msgstr "An error occurred. Please try again." + +#: wp-admin/edit-tags.php:498 wp-admin/edit-tag-form.php:183 +msgid "Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band." +msgstr "Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band." + +#: wp-admin/users.php:180 wp-admin/users.php:229 +msgid "Sorry, you are not allowed to delete users." +msgstr "Sorry, you are not allowed to delete users." + +#: wp-admin/user-new.php:23 wp-admin/user-new.php:183 +msgid "Sorry, you are not allowed to create users." +msgstr "Sorry, you are not allowed to create users." + +#: wp-admin/customize.php:233 +msgid "The Customizer allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements." +msgstr "The Customiser allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements." + +#: wp-admin/customize.php:247 +msgctxt "short (~12 characters) label for hide controls button" +msgid "Hide Controls" +msgstr "Hide Controls" + +#: wp-admin/theme-install.php:70 +msgid "Expand Sidebar" +msgstr "Expand Sidebar" + +#: wp-admin/nav-menus.php:1042 +msgid "Display location" +msgstr "Display location" + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:432 +msgid "ID #%1$s: %2$s Sorry, you are not allowed to remove this user." +msgstr "ID #%1$s: %2$s Sorry, you are not allowed to remove this user." + +#: wp-admin/user-edit.php:55 +msgid "You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see." +msgstr "You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see." + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:69 +msgid "If you need to re-install version %s, you can do so here:" +msgstr "If you need to re-install version %s, you can do so here:" + +#: wp-admin/theme-install.php:237 +msgid "Edit Filters" +msgstr "Edit Filters" + +#: wp-admin/theme-install.php:209 wp-admin/theme-install.php:232 +msgid "Clear current filters" +msgstr "Clear current filters" + +#. translators: Accessibility text. +#: wp-admin/theme-install.php:72 +msgid "Select one or more Theme features to filter by" +msgstr "Select one or more Theme features to filter by" + +#. translators: %s: Number of ratings. +#: wp-admin/includes/theme.php:825 wp-admin/theme-install.php:450 +msgid "(%s ratings)" +msgstr "(%s ratings)" + +#: wp-admin/includes/template.php:2325 +msgid "Current Background Image" +msgstr "Current Background Image" + +#: wp-admin/includes/template.php:2305 +msgid "Current Header Image" +msgstr "Current Header Image" + +#: wp-admin/includes/plugin-install.php:338 +msgid "Search plugins..." +msgstr "Search plugins..." + +#: wp-admin/includes/meta-boxes.php:138 +msgid "Set status" +msgstr "Set status" + +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-posts-list-table.php:943 +msgid "“%s” is locked" +msgstr "“%s” is locked" + +#: wp-admin/includes/ajax-actions.php:2513 +msgid "Sorry, you are not allowed to attach files to this post." +msgstr "Sorry, you are not allowed to attach files to this post." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:751 +#: wp-admin/includes/plugin-install.php:693 +msgctxt "Active plugin installations" +msgid "Less Than 10" +msgstr "Less Than 10" + +#: wp-admin/includes/plugin-install.php:273 +#: wp-admin/includes/plugin-install.php:700 wp-admin/freedoms.php:111 +#: wp-admin/plugins.php:550 wp-admin/plugin-install.php:89 +msgid "https://wordpress.org/plugins/" +msgstr "https://en-gb.wordpress.org/plugins/" + +#: wp-admin/customize.php:72 wp-admin/customize.php:81 +msgid "Customize New Changes" +msgstr "Customise New Changes" + +#: wp-admin/includes/class-custom-background.php:446 +#: wp-admin/includes/class-custom-background.php:447 +msgctxt "Background Scroll" +msgid "Scroll" +msgstr "Scroll" + +#: wp-admin/includes/class-custom-background.php:438 +#: wp-admin/includes/class-custom-background.php:439 +msgctxt "Background Repeat" +msgid "Repeat" +msgstr "Repeat" + +#: wp-admin/options-reading.php:53 wp-admin/edit-tags.php:314 +#: wp-admin/link-manager.php:79 wp-admin/options-writing.php:53 +#: wp-admin/includes/class-custom-background.php:100 +#: wp-admin/includes/class-custom-image-header.php:135 wp-admin/my-sites.php:52 +#: wp-admin/options-general.php:49 wp-admin/comment.php:71 +#: wp-admin/theme-editor.php:55 wp-admin/plugin-editor.php:144 +#: wp-admin/nav-menus.php:659 wp-admin/update-core.php:971 +#: wp-admin/options-permalink.php:62 wp-admin/user-new.php:295 +#: wp-admin/index.php:112 wp-admin/plugins.php:589 wp-admin/themes.php:208 +#: wp-admin/edit-comments.php:197 wp-admin/media.php:97 +#: wp-admin/revision.php:157 wp-admin/upload.php:76 wp-admin/upload.php:253 +#: wp-admin/edit-form-advanced.php:320 wp-admin/edit-form-advanced.php:338 +#: wp-admin/edit-form-advanced.php:356 wp-admin/tools.php:56 +#: wp-admin/import.php:32 wp-admin/widgets.php:84 wp-admin/options-media.php:38 +#: wp-admin/edit-link-form.php:77 wp-admin/user-edit.php:72 +#: wp-admin/users.php:76 wp-admin/media-new.php:61 +#: wp-admin/theme-install.php:132 wp-admin/options-discussion.php:32 +#: wp-admin/edit.php:285 wp-admin/edit.php:310 wp-admin/plugin-install.php:110 +#: wp-admin/export.php:58 wp-admin/network.php:81 +#: wp-admin/network/themes.php:325 wp-admin/network/upgrade.php:32 +#: wp-admin/network/settings.php:64 +msgid "Support" +msgstr "Support" + +#. translators: %s: Number of failed updates. +#: wp-admin/includes/update.php:897 +msgid "%s update failed." +msgstr "%s update failed." + +#. translators: %s: Number of failed updates. +#: wp-admin/includes/update.php:902 +msgid "%s updates failed." +msgstr "%s updates failed." + +#: wp-admin/includes/class-wp-plugins-list-table.php:447 +msgid "Search installed plugins..." +msgstr "Search installed plugins..." + +#: wp-admin/plugin-install.php:91 +msgid "You can find new plugins to install by searching or browsing the directory right here in your own Plugins section." +msgstr "You can find new plugins to install by searching or browsing the directory right here in your own Plugins section." + +#. translators: %s: https://wordpress.org/plugins +#: wp-admin/plugin-install.php:88 +msgid "Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official WordPress Plugin Directory are compatible with the license WordPress uses." +msgstr "Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official WordPress Plugin Directory are compatible with the licence WordPress uses." + +#: wp-admin/includes/plugin-install.php:331 +msgid "Search plugins by:" +msgstr "Search plugins by:" + +#: wp-admin/includes/import.php:197 +msgid "Convert existing categories to tags or tags to categories, selectively." +msgstr "Convert existing categories to tags or tags to categories, selectively." + +#: wp-admin/includes/import.php:203 +msgid "Import posts from LiveJournal using their API." +msgstr "Import posts from LiveJournal using their API." + +#: wp-admin/includes/import.php:209 +msgid "Import posts and comments from a Movable Type or TypePad blog." +msgstr "Import posts and comments from a Movable Type or TypePad blog." + +#: wp-admin/includes/import.php:215 +msgid "Import posts from an RSS feed." +msgstr "Import posts from an RSS feed." + +#: wp-admin/includes/import.php:221 +msgid "Import posts & media from Tumblr using their API." +msgstr "Import posts & media from Tumblr using their API." + +#: wp-admin/includes/import.php:227 +msgid "Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file." +msgstr "Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file." + +#: wp-admin/includes/import.php:191 +msgid "Import posts, comments, and users from a Blogger blog." +msgstr "Import posts, comments, and users from a Blogger blog." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:811 +#: wp-admin/includes/class-wp-plugins-list-table.php:865 +msgctxt "plugin" +msgid "Delete %s" +msgstr "Delete %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:832 +msgctxt "plugin" +msgid "Deactivate %s" +msgstr "Deactivate %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:789 +msgctxt "plugin" +msgid "Network Deactivate %s" +msgstr "Network Deactivate %s" + +#: wp-admin/user-new.php:264 +msgid "By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you don’t want to send the new user a welcome email." +msgstr "By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you don’t want to send the new user a welcome email." + +#: wp-admin/user-new.php:262 +msgid "New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added." +msgstr "New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added." + +#. translators: %s: Plugin name. +#: wp-admin/includes/update.php:965 +msgctxt "plugin" +msgid "%s was successfully deleted." +msgstr "%s was successfully deleted." + +#: wp-admin/plugins.php:546 +msgid "The search for installed plugins will search for terms in their name, description, or author." +msgstr "The search for installed plugins will search for terms in their name, description, or author." + +#: wp-admin/includes/theme.php:309 +msgid "Custom Logo" +msgstr "Custom Logo" + +#: wp-admin/user-new.php:16 wp-admin/user-new.php:56 +#: wp-admin/network/user-new.php:14 +msgid "Sorry, you are not allowed to add users to this network." +msgstr "Sorry, you are not allowed to add users to this network." + +#: wp-admin/customize.php:35 +msgid "Sorry, you are not allowed to edit this changeset." +msgstr "Sorry, you are not allowed to edit this changeset." + +#: wp-admin/users.php:368 wp-admin/users.php:400 +#: wp-admin/network/site-users.php:120 +msgid "Sorry, you are not allowed to remove users." +msgstr "Sorry, you are not allowed to remove users." + +#: wp-admin/themes.php:395 wp-admin/themes.php:734 +msgid "New version available. " +msgstr "New version available. " + +#: wp-admin/update-core.php:23 wp-admin/update-core.php:1049 +#: wp-admin/update-core.php:1085 wp-admin/update-core.php:1125 +#: wp-admin/update-core.php:1165 wp-admin/update-core.php:1194 +msgid "Sorry, you are not allowed to update this site." +msgstr "Sorry, you are not allowed to update this site." + +#: wp-admin/includes/ajax-actions.php:4154 wp-admin/update.php:202 +#: wp-admin/update.php:223 +msgid "Sorry, you are not allowed to update themes for this site." +msgstr "Sorry, you are not allowed to update themes for this site." + +#: wp-admin/theme-install.php:161 +msgid "The Theme Installer screen requires JavaScript." +msgstr "The Theme Installer screen requires JavaScript." + +#: wp-admin/includes/file.php:425 wp-admin/theme-editor.php:18 +msgid "Sorry, you are not allowed to edit templates for this site." +msgstr "Sorry, you are not allowed to edit templates for this site." + +#: wp-admin/setup-config.php:321 +msgid "Error: \"Table Prefix\" is invalid." +msgstr "Error: \"Table Prefix\" is invalid." + +#: wp-admin/plugins.php:92 +msgid "Sorry, you are not allowed to activate plugins for this site." +msgstr "Sorry, you are not allowed to activate plugins for this site." + +#: wp-admin/plugins.php:225 +msgid "Sorry, you are not allowed to deactivate plugins for this site." +msgstr "Sorry, you are not allowed to deactivate plugins for this site." + +#: wp-admin/options.php:248 +msgid "Sorry, you are not allowed to modify unregistered settings for this site." +msgstr "Sorry, you are not allowed to modify unregistered settings for this site." + +#: wp-admin/includes/file.php:393 wp-admin/plugin-editor.php:18 +msgid "Sorry, you are not allowed to edit plugins for this site." +msgstr "Sorry, you are not allowed to edit plugins for this site." + +#: wp-admin/ms-delete-site.php:17 +msgid "Sorry, you are not allowed to delete this site." +msgstr "Sorry, you are not allowed to delete this site." + +#: wp-admin/nav-menus.php:681 wp-admin/widgets.php:409 +msgid "Manage with Live Preview" +msgstr "Manage with Live Preview" + +#: wp-admin/options-reading.php:13 wp-admin/options-writing.php:13 +#: wp-admin/options-general.php:16 wp-admin/options-permalink.php:13 +#: wp-admin/options.php:50 wp-admin/options-media.php:13 +#: wp-admin/options-discussion.php:12 wp-admin/network.php:19 +msgid "Sorry, you are not allowed to manage options for this site." +msgstr "Sorry, you are not allowed to manage options for this site." + +#: wp-admin/link-add.php:13 +msgid "Sorry, you are not allowed to add links to this site." +msgstr "Sorry, you are not allowed to add links to this site." + +#: wp-admin/includes/upgrade.php:271 +msgid "" +"Hi, this is a comment.\n" +"To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\n" +"Commenter avatars come from Gravatar." +msgstr "" +"Hi, this is a comment.\n" +"To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\n" +"Commenter avatars come from Gravatar." + +#: wp-admin/includes/upgrade.php:268 +msgid "A WordPress Commenter" +msgstr "A WordPress Commenter" + +#. translators: %s: Theme name. +#: wp-admin/includes/update.php:973 +msgctxt "theme" +msgid "%s was successfully deleted." +msgstr "%s was successfully deleted." + +#: wp-admin/includes/theme.php:322 +msgid "Grid Layout" +msgstr "Grid Layout" + +#: wp-admin/includes/theme.php:313 +msgid "Footer Widgets" +msgstr "Footer Widgets" + +#: wp-admin/includes/theme.php:291 +msgid "Blog" +msgstr "Blog" + +#: wp-admin/includes/theme.php:292 +msgid "E-Commerce" +msgstr "E-Commerce" + +#: wp-admin/includes/theme.php:293 +msgid "Education" +msgstr "Education" + +#: wp-admin/includes/theme.php:294 +msgid "Entertainment" +msgstr "Entertainment" + +#: wp-admin/includes/theme.php:295 +msgid "Food & Drink" +msgstr "Food & Drink" + +#: wp-admin/includes/theme.php:297 wp-admin/includes/dashboard.php:1266 +msgid "News" +msgstr "News" + +#: wp-admin/includes/theme.php:298 +msgid "Photography" +msgstr "Photography" + +#: wp-admin/includes/theme.php:299 +msgid "Portfolio" +msgstr "Portfolio" + +#. translators: 1: URL to WordPress release notes, 2: New WordPress version, 3: +#. URL to network admin, 4: Accessibility text. +#: wp-admin/includes/update.php:312 +msgid "WordPress %2$s is available! Please update now." +msgstr "WordPress %2$s is available! Please update now." + +#: wp-admin/includes/update.php:316 +msgid "Please update WordPress now" +msgstr "Please update WordPress now" + +#. translators: 1: URL to WordPress release notes, 2: New WordPress version. +#: wp-admin/includes/update.php:321 +msgid "WordPress %2$s is available! Please notify the site administrator." +msgstr "WordPress %2$s is available! Please notify the site administrator." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/update.php:870 +msgid "%s plugin successfully updated." +msgstr "%s plugin successfully updated." + +#. translators: %s: Number of themes. +#: wp-admin/includes/update.php:875 +msgid "%s theme successfully updated." +msgstr "%s theme successfully updated." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/update.php:882 +msgid "%s plugins successfully updated." +msgstr "%s plugins successfully updated." + +#. translators: %s: Number of themes. +#: wp-admin/includes/update.php:887 +msgid "%s themes successfully updated." +msgstr "%s themes successfully updated." + +#: wp-admin/includes/template.php:2588 +msgid "This will replace the current editor content with the last backup version. You can use undo and redo in the editor to get the old content back or to return to the restored version." +msgstr "This will replace the current editor content with the last backup version. You can use undo and redo in the editor to get the old content back or to return to the restored version." + +#: wp-admin/includes/template.php:1931 +msgid "Close media attachment panel" +msgstr "Close media attachment panel" + +#: wp-admin/includes/file.php:47 +msgid "Embed Template" +msgstr "Embed Template" + +#: wp-admin/includes/file.php:48 +msgid "Embed 404 Template" +msgstr "Embed 404 Template" + +#: wp-admin/includes/file.php:49 +msgid "Embed Content Template" +msgstr "Embed Content Template" + +#: wp-admin/includes/file.php:50 +msgid "Embed Header Template" +msgstr "Embed Header Template" + +#: wp-admin/includes/file.php:51 +msgid "Embed Footer Template" +msgstr "Embed Footer Template" + +#: wp-admin/includes/menu.php:350 wp-admin/my-sites.php:17 +#: wp-admin/network/site-info.php:32 wp-admin/network/user-new.php:37 +#: wp-admin/network/index.php:17 wp-admin/network/site-users.php:50 +#: wp-admin/network/upgrade.php:38 wp-admin/network/users.php:14 +#: wp-admin/network/users.php:24 wp-admin/network/users.php:46 +#: wp-admin/network/users.php:60 wp-admin/network/users.php:150 +#: wp-admin/network/site-themes.php:57 wp-admin/network/settings.php:17 +#: wp-admin/network/site-settings.php:32 wp-admin/network/sites.php:14 +#: wp-admin/network/sites.php:140 +msgid "Sorry, you are not allowed to access this page." +msgstr "Sorry, you are not allowed to access this page." + +#: wp-admin/includes/meta-boxes.php:1021 +msgid "Need help? Use the Help tab above the screen title." +msgstr "Need help? Use the Help tab above the screen title." + +#: wp-admin/includes/ms.php:1054 +msgid "Info" +msgstr "Info" + +#: wp-admin/includes/ajax-actions.php:4309 +#: wp-admin/includes/ajax-actions.php:4418 +#: wp-admin/includes/ajax-actions.php:4526 +msgid "No plugin specified." +msgstr "No plugin specified." + +#: wp-admin/includes/ajax-actions.php:4433 wp-admin/update.php:29 +#: wp-admin/update.php:57 wp-admin/update.php:79 +msgid "Sorry, you are not allowed to update plugins for this site." +msgstr "Sorry, you are not allowed to update plugins for this site." + +#: wp-admin/includes/ajax-actions.php:4579 +msgid "Plugin could not be deleted." +msgstr "Plugin could not be deleted." + +#: wp-admin/link-manager.php:12 wp-admin/link-manager.php:91 +#: wp-admin/includes/bookmark.php:32 wp-admin/includes/bookmark.php:350 +msgid "Sorry, you are not allowed to edit the links for this site." +msgstr "Sorry, you are not allowed to edit the links for this site." + +#: wp-admin/includes/class-wp-media-list-table.php:524 +msgid "(Private post)" +msgstr "(Private post)" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:575 +msgctxt "plugin" +msgid "Active" +msgstr "Active" + +#: wp-admin/privacy-policy-guide.php:13 wp-admin/options-privacy.php:13 +msgid "Sorry, you are not allowed to manage privacy options on this site." +msgstr "Sorry, you are not allowed to manage privacy options on this site." + +#: wp-admin/includes/ajax-actions.php:4017 +#: wp-admin/includes/ajax-actions.php:4140 +#: wp-admin/includes/ajax-actions.php:4235 +msgid "No theme specified." +msgstr "No theme specified." + +#: wp-admin/includes/ajax-actions.php:4030 wp-admin/update.php:251 +#: wp-admin/update.php:291 wp-admin/update.php:324 +#: wp-admin/theme-install.php:16 +msgid "Sorry, you are not allowed to install themes on this site." +msgstr "Sorry, you are not allowed to install themes on this site." + +#: wp-admin/includes/ajax-actions.php:4247 +msgid "Sorry, you are not allowed to delete themes on this site." +msgstr "Sorry, you are not allowed to delete themes on this site." + +#: wp-admin/includes/ajax-actions.php:4285 +msgid "Theme could not be deleted." +msgstr "Theme could not be deleted." + +#: wp-admin/admin.php:305 wp-admin/import.php:15 +msgid "Sorry, you are not allowed to import content into this site." +msgstr "Sorry, you are not allowed to import content into this site." + +#: wp-admin/edit.php:252 +msgid "You can filter the list of posts by post status using the text links above the posts list to only show posts with that status. The default view is to show all posts." +msgstr "You can filter the list of posts by post status using the text links above the posts list to only show posts with that status. The default view is to show all posts." + +#: wp-admin/export.php:13 +msgid "Sorry, you are not allowed to export the content of this site." +msgstr "Sorry, you are not allowed to export the content of this site." + +#: wp-admin/includes/class-custom-image-header.php:1029 +msgid "Sorry, you are not allowed to customize headers." +msgstr "Sorry, you are not allowed to customise headers." + +#: wp-admin/customize.php:206 +msgid "Close the Customizer and go back to the previous page" +msgstr "Close the Customiser and go back to the previous page" + +#: wp-admin/credits.php:154 +msgid "Release Deputy" +msgstr "Release Deputy" + +#: wp-admin/credits.php:153 +msgid "Release Design Lead" +msgstr "Release Design Lead" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:782 +msgid "Custom fields can be used to add extra metadata to a post that you can use in your theme." +msgstr "Custom fields can be used to add extra metadata to a post that you can use in your theme." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:806 +msgid "Allow trackbacks and pingbacks on this page" +msgstr "Allow trackbacks and pingbacks on this page" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:745 +msgid "Trackbacks are a way to notify legacy blog systems that you’ve linked to them. If you link other WordPress sites, they’ll be notified automatically using pingbacks, no other action necessary." +msgstr "Trackbacks are a way to notify legacy blog systems that you’ve linked to them. If you link other WordPress sites, they’ll be notified automatically using pingbacks, no other action necessary." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:707 +msgid "Excerpts are optional hand-crafted summaries of your content that can be used in your theme. Learn more about manual excerpts." +msgstr "Excerpts are optional hand-crafted summaries of your content that can be used in your theme. Learn more about manual excerpts." + +#: wp-admin/edit-form-advanced.php:295 +msgid "The Text mode allows you to enter HTML along with your post text. Note that <p> and <br> tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing <br>, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically." +msgstr "The Text mode allows you to enter HTML along with your post text. Note that <p> and <br> tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing <br>, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically." + +#: wp-admin/edit-form-advanced.php:294 +msgid "Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls." +msgstr "Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls." + +#: wp-admin/upload.php:360 +msgid "Error saving media file." +msgstr "Error saving media file." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:352 +msgid "%s media file restored from the Trash." +msgid_plural "%s media files restored from the Trash." +msgstr[0] "%s media file restored from the Bin." +msgstr[1] "%s media files restored from the Bin." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:339 +msgid "%s media file moved to the Trash." +msgid_plural "%s media files moved to the Trash." +msgstr[0] "%s media file moved to the Bin." +msgstr[1] "%s media files moved to the Bin." + +#: wp-admin/upload.php:300 +msgid "Media file attached." +msgstr "Media file attached." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:303 +msgid "%s media file attached." +msgid_plural "%s media files attached." +msgstr[0] "%s media file attached." +msgstr[1] "%s media files attached." + +#: wp-admin/upload.php:312 +msgid "Media file detached." +msgstr "Media file detached." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:327 +msgid "%s media file permanently deleted." +msgid_plural "%s media files permanently deleted." +msgstr[0] "%s media file permanently deleted." +msgstr[1] "%s media files permanently deleted." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:315 +msgid "%s media file detached." +msgid_plural "%s media files detached." +msgstr[0] "%s media file detached." +msgstr[1] "%s media files detached." + +#: wp-admin/media.php:108 wp-admin/upload.php:293 wp-admin/upload.php:358 +#: wp-admin/edit-form-advanced.php:210 +msgid "Media file updated." +msgstr "Media file updated." + +#. translators: 1: Theme name, 2: Version number. +#. translators: 1: Plugin name, 2: Version number. +#: wp-admin/includes/theme.php:210 wp-admin/includes/theme.php:223 +#: wp-admin/includes/theme.php:236 wp-admin/includes/update.php:483 +#: wp-admin/includes/update.php:496 wp-admin/includes/update.php:510 +#: wp-admin/includes/update.php:529 wp-admin/includes/update.php:676 +#: wp-admin/includes/update.php:689 wp-admin/includes/update.php:702 +#: wp-admin/update-core.php:527 +msgid "View %1$s version %2$s details" +msgstr "View %1$s version %2$s details" + +#. translators: 1: Relative date, 2: Time. +#: wp-admin/includes/dashboard.php:992 +msgctxt "dashboard" +msgid "%1$s, %2$s" +msgstr "%1$s, %2$s" + +#: wp-admin/edit-form-advanced.php:376 +msgid "Publish — You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post." +msgstr "Publish — You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post." + +#: wp-admin/user-edit.php:212 +msgid "Error while saving the new email address. Please try again." +msgstr "Error while saving the new email address. Please try again." + +#. translators: %s: New email. +#: wp-admin/user-edit.php:525 +msgid "There is a pending change of your email to %s." +msgstr "There is a pending change of your email to %s." + +#: wp-admin/upload.php:229 +msgid "You can narrow the list by file type/status or by date using the dropdown menus above the media table." +msgstr "You can narrow the list by file type/status or by date using the dropdown menus above the media table." + +#: wp-admin/themes.php:271 +msgid "New theme activated." +msgstr "New theme activated." + +#: wp-admin/themes.php:575 wp-admin/network/themes.php:429 +msgid "The following themes are installed but incomplete." +msgstr "The following themes are installed but incomplete." + +#: wp-admin/themes.php:267 +msgid "Settings saved and theme activated." +msgstr "Settings saved and theme activated." + +#: wp-admin/setup-config.php:219 +msgid "The name of the database you want to use with WordPress." +msgstr "The name of the database you want to use with WordPress." + +#: wp-admin/setup-config.php:229 +msgid "Your database password." +msgstr "Your database password." + +#: wp-admin/setup-config.php:224 +msgid "Your database username." +msgstr "Your database username." + +#: wp-admin/users.php:188 +msgid "Sorry, you are not allowed to delete that user." +msgstr "Sorry, you are not allowed to delete that user." + +#: wp-admin/freedoms.php:112 wp-admin/themes.php:156 +#: wp-admin/theme-install.php:99 +msgid "https://wordpress.org/themes/" +msgstr "https://en-gb.wordpress.org/themes/" + +#. translators: 1: Plugin name, 2: Plugin author. +#: wp-admin/plugins.php:364 +msgctxt "plugin" +msgid "%1$s by %2$s" +msgstr "%1$s by %2$s" + +#. translators: 1: Plugin name, 2: Plugin author. +#: wp-admin/plugins.php:360 +msgid "%1$s by %2$s (will also delete its data)" +msgstr "%1$s by %2$s (will also delete its data)" + +#. translators: %s: New admin email. +#: wp-admin/options-general.php:123 +msgid "There is a pending change of the admin email to %s." +msgstr "There is a pending change of the admin email to %s." + +#: wp-admin/index.php:164 +msgid "Dismiss the welcome panel" +msgstr "Dismiss the welcome panel" + +#. translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES +#: wp-admin/install.php:309 +msgid "The constant %s cannot be defined when installing WordPress." +msgstr "The constant %s cannot be defined when installing WordPress." + +#: wp-admin/install.php:419 +msgid "WordPress has been installed. Thank you, and enjoy!" +msgstr "WordPress has been installed. Thank you, and enjoy!" + +#. translators: %s: wp-config.php +#: wp-admin/install.php:296 +msgid "Your %s file has an empty database table prefix, which is not supported." +msgstr "Your %s file has an empty database table prefix, which is not supported." + +#: wp-admin/includes/template.php:1930 +msgid "Attach to existing content" +msgstr "Attach to existing content" + +#: wp-admin/includes/post.php:1562 +msgid "Click the image to edit or update" +msgstr "Click the image to edit or update" + +#: wp-admin/includes/plugin-install.php:733 +msgid "Read all reviews on WordPress.org or write your own!" +msgstr "Read all reviews on WordPress.org or write your own!" + +#: wp-admin/includes/plugin-install.php:732 +msgid "Reviews" +msgstr "Reviews" + +#: wp-admin/includes/theme-install.php:185 +msgid "Theme zip file" +msgstr "Theme zip file" + +#. translators: %s: URL to "Features as Plugins" page. +#: wp-admin/includes/plugin-install.php:407 +msgid "You are using a development version of WordPress. These feature plugins are also under development. Learn more." +msgstr "You are using a development version of WordPress. These feature plugins are also under development. Learn more." + +#. translators: 1: Number of stars (used to determine singular/plural), 2: +#. Number of reviews. +#: wp-admin/includes/plugin-install.php:741 +msgid "Reviews with %1$d star: %2$s. Opens in a new tab." +msgid_plural "Reviews with %1$d stars: %2$s. Opens in a new tab." +msgstr[0] "Reviews with %1$d star: %2$s. Opens in a new tab." +msgstr[1] "Reviews with %1$d stars: %2$s. Opens in a new tab." + +#: wp-admin/includes/image-edit.php:186 +msgid "crop ratio height" +msgstr "crop ratio height" + +#: wp-admin/includes/image-edit.php:183 +msgid "crop ratio width" +msgstr "crop ratio width" + +#: wp-admin/includes/image-edit.php:167 +msgid "Image Crop Help" +msgstr "Image Crop Help" + +#: wp-admin/includes/image-edit.php:124 +msgid "New dimensions:" +msgstr "New dimensions:" + +#: wp-admin/includes/image-edit.php:129 +msgid "scale height" +msgstr "scale height" + +#: wp-admin/includes/image-edit.php:106 +msgid "Scale Image Help" +msgstr "Scale Image Help" + +#: wp-admin/includes/image-edit.php:126 +msgid "scale width" +msgstr "scale width" + +#: wp-admin/includes/image-edit.php:197 +msgid "selection height" +msgstr "selection height" + +#: wp-admin/includes/image-edit.php:194 +msgid "selection width" +msgstr "selection width" + +#: wp-admin/includes/image-edit.php:212 +msgid "Thumbnail Settings Help" +msgstr "Thumbnail Settings Help" + +#. translators: 1: Type of comment, 2: Post link, 3: Notification if the +#. comment is pending. +#: wp-admin/includes/dashboard.php:852 +msgctxt "dashboard" +msgid "%1$s on %2$s %3$s" +msgstr "%1$s on %2$s %3$s" + +#: wp-admin/includes/file.php:33 +msgid "Date Template" +msgstr "Date Template" + +#: wp-admin/includes/dashboard.php:1645 +msgid "Dismiss the browser warning panel" +msgstr "Dismiss the browser warning panel" + +#: wp-admin/includes/file.php:37 +msgid "Single Page" +msgstr "Single Page" + +#: wp-admin/includes/file.php:35 +msgid "Singular Template" +msgstr "Singular Template" + +#: wp-admin/includes/file.php:28 +msgid "Taxonomy Template" +msgstr "Taxonomy Template" + +#: wp-admin/includes/dashboard.php:1060 +msgid "View more comments" +msgstr "View more comments" + +#: wp-admin/includes/dashboard.php:751 +msgid "View this comment" +msgstr "View this comment" + +#: wp-admin/includes/class-core-upgrader.php:30 +msgid "Another update is currently in progress." +msgstr "Another update is currently in progress." + +#. translators: %s: Attachment title. +#: wp-admin/includes/class-wp-media-list-table.php:554 +#: wp-admin/includes/class-wp-media-list-table.php:731 +msgid "Attach “%s” to existing content" +msgstr "Attach “%s” to existing content" + +#. translators: %s: Taxonomy term name. +#: wp-admin/includes/class-wp-terms-list-table.php:497 +msgid "Delete “%s”" +msgstr "Delete “%s”" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:713 +#: wp-admin/includes/class-wp-media-list-table.php:770 +#: wp-admin/includes/class-wp-posts-list-table.php:1382 +msgid "Delete “%s” permanently" +msgstr "Delete “%s” permanently" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:703 +#: wp-admin/includes/class-wp-media-list-table.php:759 +#: wp-admin/includes/class-wp-posts-list-table.php:1373 +msgid "Move “%s” to the Trash" +msgstr "Move “%s” to the Bin" + +#. translators: %s: Taxonomy term name. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-terms-list-table.php:488 +#: wp-admin/includes/class-wp-posts-list-table.php:1353 +msgid "Quick edit “%s” inline" +msgstr "Quick edit “%s” inline" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:751 +#: wp-admin/includes/class-wp-posts-list-table.php:1365 +msgid "Restore “%s” from the Trash" +msgstr "Restore “%s” from the Bin" + +#: wp-admin/includes/class-wp-plugins-list-table.php:414 +msgid "Search for plugins in the WordPress Plugin Directory." +msgstr "Search for plugins in the WordPress Plugin Directory." + +#: wp-admin/includes/class-plugin-upgrader-skin.php:85 +#: wp-admin/update-core.php:1108 wp-admin/update-core.php:1148 +msgid "Update progress" +msgstr "Update progress" + +#. translators: %s: Taxonomy term name. +#: wp-admin/includes/class-wp-terms-list-table.php:506 +msgid "View “%s” archive" +msgstr "View “%s” archive" + +#. translators: %s: Taxonomy term name. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-terms-list-table.php:419 +#: wp-admin/includes/class-wp-media-list-table.php:414 +#: wp-admin/includes/class-wp-posts-list-table.php:1030 +msgid "“%s” (Edit)" +msgstr "“%s” (Edit)" + +#. translators: %s: Title of the post the attachment is attached to. +#: wp-admin/includes/class-wp-media-list-table.php:540 +msgid "Detach from “%s”" +msgstr "Detach from “%s”" + +#: wp-admin/includes/class-wp-comments-list-table.php:776 +#: wp-admin/includes/dashboard.php:709 +msgid "Edit this comment" +msgstr "Edit this comment" + +#: wp-admin/includes/class-wp-comments-list-table.php:788 +msgid "Quick edit this comment inline" +msgstr "Quick edit this comment inline" + +#: wp-admin/includes/class-wp-media-list-table.php:160 +msgctxt "attachment filter" +msgid "Trash" +msgstr "Bin" + +#: wp-admin/includes/class-wp-comments-list-table.php:739 +msgid "Restore this comment from the spam" +msgstr "Restore this comment from the spam" + +#. translators: 1: User login, 2: User email address. +#: wp-admin/includes/ajax-actions.php:325 +msgctxt "user autocomplete result" +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#. translators: %s: Importer slug. +#: wp-admin/import.php:67 +msgid "The %s importer is invalid or is not installed." +msgstr "The %s importer is invalid or is not installed." + +#: wp-admin/edit-form-comment.php:117 +msgctxt "comment status" +msgid "Pending" +msgstr "Pending" + +#. translators: %d: Custom header width. +#. translators: %d: Custom header height. +#: wp-admin/includes/class-custom-image-header.php:563 +#: wp-admin/includes/class-custom-image-header.php:575 +#: wp-admin/includes/class-custom-image-header.php:588 +#: wp-admin/includes/class-custom-image-header.php:599 +msgid "%d pixels" +msgstr "%d pixels" + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:572 +msgid "Images should be at least %s tall." +msgstr "Images should be at least %s tall." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:560 +msgid "Images should be at least %s wide." +msgstr "Images should be at least %s wide." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:596 +msgid "Suggested height is %s." +msgstr "Suggested height is %s." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:585 +msgid "Suggested width is %s." +msgstr "Suggested width is %s." + +#: wp-admin/user-new.php:594 +msgid "Send User Notification" +msgstr "Send User Notification" + +#: wp-admin/user-new.php:597 +msgid "Send the new user an email about their account." +msgstr "Send the new user an email about their account." + +#. translators: %s: Menu name. +#: wp-admin/nav-menus.php:1055 +msgctxt "menu location" +msgid "(Currently set to: %s)" +msgstr "(Currently set to: %s)" + +#. translators: %s: WordPress version number. +#: wp-admin/about.php:312 +msgid "Version %s addressed one security issue." +msgstr "Version %s addressed one security issue." + +#: wp-admin/user-edit.php:591 +msgid "https://en.gravatar.com/" +msgstr "https://en.gravatar.com/" + +#: wp-admin/user-edit.php:582 +msgid "Profile Picture" +msgstr "Profile Picture" + +#: wp-admin/about.php:309 +msgid "Maintenance and Security Releases" +msgstr "Maintenance and Security Releases" + +#: wp-admin/about.php:303 +msgid "Maintenance Releases" +msgstr "Maintenance Releases" + +#: wp-admin/about.php:306 +msgid "Security Releases" +msgstr "Security Releases" + +#: wp-admin/options-permalink.php:235 +msgid "Plain" +msgstr "Plain" + +#. translators: %s: Documentation URL. +#: wp-admin/options-permalink.php:211 +msgid "WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A number of tags are available, and here are some examples to get you started." +msgstr "WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A number of tags are available, and here are some examples to get you started." + +#: wp-admin/options-permalink.php:33 +msgid "Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure." +msgstr "Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure." + +#. translators: %s: Documentation URL. +#: wp-admin/setup-config.php:193 +msgid "Need more help? We got it." +msgstr "Need more help? We got it." + +#. translators: %s: localhost +#: wp-admin/setup-config.php:237 +msgid "You should be able to get this info from your web host, if %s doesn’t work." +msgstr "You should be able to get this info from your web host, if %s doesn’t work." + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:407 +msgid "You can create the %s file manually and paste the following text into it." +msgstr "You can create the %s file manually and paste the following text into it." + +#. translators: 1: wp-config-sample.php, 2: wp-config.php +#: wp-admin/setup-config.php:184 +msgid "If for any reason this automatic file creation doesn’t work, don’t worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s." +msgstr "If for any reason this automatic file creation doesn’t work, don’t worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s." + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:176 +msgid "We’re going to use this information to create a %s file." +msgstr "We’re going to use this information to create a %s file." + +#. translators: %s: wp-content/uploads +#: wp-admin/options-media.php:123 +msgid "Default is %s" +msgstr "Default is %s" + +#. translators: %s: style.css +#: wp-admin/includes/class-theme-upgrader.php:572 +msgid "The %s stylesheet doesn’t contain a valid theme header." +msgstr "The %s stylesheet doesn’t contain a valid theme header." + +#. translators: 1: .po, 2: .mo +#: wp-admin/includes/class-language-pack-upgrader.php:352 +msgid "The language pack is missing either the %1$s or %2$s files." +msgstr "The language pack is missing either the %1$s or %2$s files." + +#. translators: %s: index.php +#: wp-admin/includes/class-theme-upgrader.php:585 +msgid "The theme is missing the %s file." +msgstr "The theme is missing the %s file." + +#. translators: %s: style.css +#: wp-admin/includes/class-theme-upgrader.php:547 +msgid "The theme is missing the %s stylesheet." +msgstr "The theme is missing the %s stylesheet." + +#: wp-admin/theme-install.php:196 +msgid "If you have marked themes as favorites on WordPress.org, you can browse them here." +msgstr "If you have marked themes as favourites on WordPress.org, you can browse them here." + +#: wp-admin/theme-install.php:179 +msgctxt "themes" +msgid "Favorites" +msgstr "Favourites" + +#: wp-admin/maint/repair.php:30 +msgid "Allow automatic database repair" +msgstr "Allow automatic database repair" + +#: wp-admin/maint/repair.php:71 +msgid "Database repair results" +msgstr "Database repair results" + +#: wp-admin/setup-config.php:163 +msgid "Before getting started" +msgstr "Before getting started" + +#: wp-admin/maint/repair.php:64 +msgid "Check secret keys" +msgstr "Check secret keys" + +#: wp-admin/setup-config.php:448 +msgid "Successful database connection" +msgstr "Successful database connection" + +#: wp-admin/maint/repair.php:159 +msgid "WordPress database repair" +msgstr "WordPress database repair" + +#: wp-admin/setup-config.php:212 +msgid "Set up your database connection" +msgstr "Set up your database connection" + +#. translators: %s: Nav menu title. +#: wp-admin/includes/nav-menu.php:1243 +msgid "%s has been updated." +msgstr "%s has been updated." + +#. translators: %s: Walker class name. +#: wp-admin/includes/nav-menu.php:1059 +msgid "The Walker class named %s does not exist." +msgstr "The Walker class named %s does not exist." + +#. translators: 1: Drop-in constant name, 2: wp-config.php +#: wp-admin/includes/class-wp-plugins-list-table.php:763 +msgid "Requires %1$s in %2$s file." +msgstr "Requires %1$s in %2$s file." + +#. translators: %s: Date and time. +#: wp-admin/options-general.php:287 +msgid "Daylight saving time begins on: %s." +msgstr "Daylight saving time begins on: %s." + +#. translators: %s: File name. +#: wp-admin/includes/media.php:1729 +msgid "You are about to delete %s." +msgstr "You are about to delete %s." + +#. translators: %s: Date and time. +#: wp-admin/options-general.php:289 +msgid "Standard time begins on: %s." +msgstr "Standard time begins on: %s." + +#. translators: %s: mu-plugins directory name. +#: wp-admin/includes/class-wp-plugins-list-table.php:662 +msgid "Files in the %s directory are executed automatically." +msgstr "Files in the %s directory are executed automatically." + +#: wp-admin/widgets.php:496 +msgid "This will clear all items from the inactive widgets list. You will not be able to restore any customizations." +msgstr "This will clear all items from the inactive widgets list. You will not be able to restore any customisations." + +#: wp-admin/widgets.php:486 +msgid "Clear Inactive Widgets" +msgstr "Clear Inactive Widgets" + +#: wp-admin/users.php:146 wp-admin/network/site-users.php:164 +msgid "One of the selected users is not a member of this site." +msgstr "One of the selected users is not a member of this site." + +#: wp-admin/users.php:82 wp-admin/network/users.php:237 +msgid "Users list navigation" +msgstr "Users list navigation" + +#: wp-admin/users.php:83 wp-admin/network/users.php:238 +msgid "Users list" +msgstr "Users list" + +#: wp-admin/users.php:81 wp-admin/network/users.php:236 +msgid "Filter users list" +msgstr "Filter users list" + +#: wp-admin/upload.php:258 +msgid "Filter media items list" +msgstr "Filter media items list" + +#: wp-admin/upload.php:260 +msgid "Media items list" +msgstr "Media items list" + +#: wp-admin/upload.php:259 +msgid "Media items list navigation" +msgstr "Media items list navigation" + +#: wp-admin/theme-install.php:168 wp-admin/network/themes.php:330 +msgid "Filter themes list" +msgstr "Filter themes list" + +#: wp-admin/themes.php:651 +msgid "Install Parent Theme" +msgstr "Install Parent Theme" + +#: wp-admin/theme-install.php:241 wp-admin/network/themes.php:332 +msgid "Themes list" +msgstr "Themes list" + +#: wp-admin/plugins.php:702 +msgid "All selected plugins are up to date." +msgstr "All selected plugins are up to date." + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:203 +msgid "Browsing %s (active)" +msgstr "Browsing %s (active)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:211 +msgid "Browsing %s (inactive)" +msgstr "Browsing %s (inactive)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:200 +msgid "Editing %s (active)" +msgstr "Editing %s (active)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:208 +msgid "Editing %s (inactive)" +msgstr "Editing %s (inactive)" + +#: wp-admin/plugins.php:594 wp-admin/plugin-install.php:115 +msgid "Filter plugins list" +msgstr "Filter plugins list" + +#: wp-admin/plugins.php:596 wp-admin/plugin-install.php:117 +msgid "Plugins list" +msgstr "Plugins list" + +#: wp-admin/plugins.php:595 wp-admin/plugin-install.php:116 +msgid "Plugins list navigation" +msgstr "Plugins list navigation" + +#. translators: %s: Local time. +#: wp-admin/options-general.php:256 +msgid "Local time is %s." +msgstr "Local time is %s." + +#: wp-admin/my-sites.php:72 wp-admin/network/menu.php:53 +#: wp-admin/network/sites.php:369 +msgctxt "site" +msgid "Add New" +msgstr "Add New" + +#: wp-admin/link-manager.php:84 +msgid "Links list" +msgstr "Links list" + +#. translators: %s: WordPress version. +#: wp-admin/includes/update.php:270 +msgid "Get Version %s" +msgstr "Get Version %s" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1361 +msgid "Toggle panel: %s" +msgstr "Toggle panel: %s" + +#: wp-admin/includes/post.php:1489 +msgid "Edit permalink" +msgstr "Edit permalink" + +#. translators: 1: Site Wide Only: true, 2: Network: true +#: wp-admin/includes/plugin.php:91 +msgid "The %1$s plugin header is deprecated. Use %2$s instead." +msgstr "The %1$s plugin header is deprecated. Use %2$s instead." + +#: wp-admin/includes/post.php:1787 +msgid "Saving revision…" +msgstr "Saving revision…" + +#: wp-admin/includes/class-wp-site-health.php:1009 +#: wp-admin/includes/class-wp-site-health.php:1724 +msgid "Warning" +msgstr "Warning" + +#: wp-admin/includes/template.php:1322 wp-admin/options.php:351 +#: wp-admin/includes/network.php:128 wp-admin/includes/network.php:203 +#: wp-admin/includes/network.php:263 wp-admin/includes/network.php:312 +#: wp-admin/includes/network.php:325 wp-admin/includes/network.php:427 +#: wp-admin/includes/network.php:615 wp-admin/includes/network.php:668 +msgid "Warning:" +msgstr "Warning:" + +#: wp-admin/includes/ms.php:981 +msgid "Once you hit “Confirm Deletion”, the user will be permanently removed." +msgstr "Once you hit “Confirm Deletion”, the user will be permanently removed." + +#: wp-admin/includes/ms.php:983 +msgid "Once you hit “Confirm Deletion”, these users will be permanently removed." +msgstr "Once you hit “Confirm Deletion”, these users will be permanently removed." + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:914 +msgid "What should be done with content owned by %s?" +msgstr "What should be done with content owned by %s?" + +#: wp-admin/includes/ms.php:930 +msgid "Select a user" +msgstr "Select a user" + +#. translators: %s: Link to user's site. +#: wp-admin/includes/ms.php:951 +msgid "Site: %s" +msgstr "Site: %s" + +#: wp-admin/includes/ms.php:966 +msgid "User has no sites or content and will be deleted." +msgstr "User has no sites or content and will be deleted." + +#: wp-admin/includes/file.php:18 +msgid "Theme Footer" +msgstr "Theme Footer" + +#: wp-admin/includes/file.php:17 +msgid "Theme Header" +msgstr "Theme Header" + +#: wp-admin/includes/ms.php:862 +msgid "You have chosen to delete the user from all networks and sites." +msgstr "You have chosen to delete the user from all networks and sites." + +#: wp-admin/includes/ms.php:864 +msgid "You have chosen to delete the following users from all networks and sites." +msgstr "You have chosen to delete the following users from all networks and sites." + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:885 +msgid "Warning! User %s cannot be deleted." +msgstr "Warning! User %s cannot be deleted." + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:895 +msgid "Warning! User cannot be deleted. The user %s is a network administrator." +msgstr "Warning! User cannot be deleted. The user %s is a network administrator." + +#: wp-admin/includes/media.php:1008 +msgid "Invalid image URL." +msgstr "Invalid image URL." + +#. translators: %s: Number of columns on the page. +#: wp-admin/includes/class-wp-screen.php:1214 +msgid "%s column" +msgid_plural "%s columns" +msgstr[0] "%s column" +msgstr[1] "%s columns" + +#: wp-admin/includes/class-wp-screen.php:1002 +msgid "Additional settings" +msgstr "Additional settings" + +#. translators: 1: Title of an update, 2: Error message. +#: wp-admin/includes/class-bulk-upgrader-skin.php:43 +msgid "An error occurred while updating %1$s: %2$s" +msgstr "An error occurred while updating %1$s: %2$s" + +#. translators: 1: Comment author, 2: Notification if the comment is pending. +#: wp-admin/includes/dashboard.php:823 +msgid "From %1$s %2$s" +msgstr "From %1$s %2$s" + +#: wp-admin/includes/class-wp-screen.php:762 +msgid "Items list" +msgstr "Items list" + +#: wp-admin/includes/class-wp-screen.php:761 +msgid "Items list navigation" +msgstr "Items list navigation" + +#. translators: Date and time format for recent posts on the dashboard, from a +#. different calendar year, see https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/dashboard.php:979 +msgid "M jS Y" +msgstr "M jS Y" + +#: wp-admin/includes/class-wp-users-list-table.php:243 +msgid "No role" +msgstr "No role" + +#: wp-admin/includes/class-wp-users-list-table.php:627 +msgctxt "no user roles" +msgid "None" +msgstr "None" + +#: wp-admin/includes/class-wp-screen.php:1276 +msgid "Pagination" +msgstr "Pagination" + +#: wp-admin/includes/dashboard.php:613 +msgid "View all drafts" +msgstr "View all drafts" + +#: wp-admin/includes/class-wp-screen.php:1329 +msgid "View mode" +msgstr "View mode" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:240 +msgctxt "comments" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:261 +msgctxt "comments" +msgid "Approved (%s)" +msgid_plural "Approved (%s)" +msgstr[0] "Approved (%s)" +msgstr[1] "Approved (%s)" + +#: wp-admin/export.php:214 wp-admin/export.php:261 wp-admin/export.php:301 +msgid "End date:" +msgstr "End date:" + +#: wp-admin/includes/class-wp-screen.php:760 +msgid "Filter items list" +msgstr "Filter items list" + +#: wp-admin/includes/class-wp-plugins-list-table.php:819 +msgid "Network Active" +msgstr "Network Active" + +#: wp-admin/includes/class-wp-plugins-list-table.php:823 +msgid "Network Only" +msgstr "Network Only" + +#: wp-admin/includes/class-wp-list-table.php:787 +msgid "No pending comments" +msgstr "No pending comments" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:254 +msgctxt "comments" +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "Pending (%s)" +msgstr[1] "Pending (%s)" + +#. translators: %s: The new user. +#: wp-admin/includes/ajax-actions.php:1702 +msgid "User %s added" +msgstr "User %s added" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:268 +msgctxt "comments" +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Spam (%s)" +msgstr[1] "Spam (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:275 +msgctxt "comments" +msgid "Trash (%s)" +msgid_plural "Trash (%s)" +msgstr[0] "Bin (%s)" +msgstr[1] "Bin (%s)" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ssh2.php:174 +msgid "Failed to initialize a SFTP subsystem session with the SSH2 Server %s" +msgstr "Failed to initialise a SFTP subsystem session with the SSH2 Server %s" + +#: wp-admin/includes/class-wp-comments-list-table.php:469 +msgctxt "column name" +msgid "Submitted on" +msgstr "Submitted on" + +#: wp-admin/export.php:178 +msgid "Content to export" +msgstr "Content to export" + +#: wp-admin/edit.php:253 +msgid "You can view posts in a simple title list or with an excerpt using the Screen Options tab." +msgstr "You can view posts in a simple title list or with an excerpt using the Screen Options tab." + +#. translators: %s: Comment date. +#: wp-admin/edit-form-comment.php:136 +msgid "Submitted on: %s" +msgstr "Submitted on: %s" + +#: wp-admin/edit-form-comment.php:32 +msgctxt "comment" +msgid "Permalink:" +msgstr "Permalink:" + +#: wp-admin/edit-form-advanced.php:208 +msgid "Page draft updated." +msgstr "Page draft updated." + +#. translators: %s: Scheduled date for the page. +#: wp-admin/edit-form-advanced.php:207 +msgid "Page scheduled for: %s." +msgstr "Page scheduled for: %s." + +#: wp-admin/edit-form-advanced.php:205 +msgid "Page submitted." +msgstr "Page submitted." + +#: wp-admin/edit-form-advanced.php:193 +msgid "Post draft updated." +msgstr "Post draft updated." + +#. translators: %s: Scheduled date for the post. +#: wp-admin/edit-form-advanced.php:192 +msgid "Post scheduled for: %s." +msgstr "Post scheduled for: %s." + +#: wp-admin/edit-form-advanced.php:190 +msgid "Post submitted." +msgstr "Post submitted." + +#: wp-admin/edit-form-advanced.php:166 +msgid "View page" +msgstr "View page" + +#: wp-admin/edit-comments.php:204 +msgid "Comments list" +msgstr "Comments list" + +#: wp-admin/edit-comments.php:203 +msgid "Comments list navigation" +msgstr "Comments list navigation" + +#: wp-admin/edit-comments.php:202 +msgid "Filter comments list" +msgstr "Filter comments list" + +#: wp-admin/edit-form-advanced.php:131 wp-admin/edit-form-advanced.php:138 +msgid "Preview post" +msgstr "Preview post" + +#: wp-admin/edit-form-advanced.php:152 wp-admin/edit-form-advanced.php:159 +msgid "Preview page" +msgstr "Preview page" + +#: wp-admin/edit-comments.php:187 +msgid "In the Submitted on column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site." +msgstr "In the Submitted on column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site." + +#: wp-admin/edit-comments.php:185 +msgid "In the Comment column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment." +msgstr "In the Comment column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or bin that comment." + +#. translators: %s: Comments count. +#: wp-admin/edit-comments.php:160 wp-admin/js/edit-comments.js:196 +#: wp-admin/js/edit-comments.js:216 +msgid "Comments (%s)" +msgstr "Comments (%s)" + +#: wp-admin/includes/class-custom-image-header.php:948 +msgid "The current theme does not support a flexible sized header image." +msgstr "The current theme does not support a flexible sized header image." + +#. translators: 1: Comments count, 2: Post title. +#: wp-admin/edit-comments.php:144 +msgid "Comments (%1$s) on “%2$s”" +msgstr "Comments (%1$s) on “%2$s”" + +#: wp-admin/includes/ajax-actions.php:5369 +msgid "Sorry, you are not allowed to modify themes." +msgstr "Sorry, you are not allowed to modify themes." + +#: wp-admin/includes/class-custom-image-header.php:776 +#: wp-admin/includes/class-custom-image-header.php:940 +msgid "The current theme does not support uploading a custom header image." +msgstr "The current theme does not support uploading a custom header image." + +#: wp-admin/includes/user.php:525 +msgid "You’re using the auto-generated password for your account. Would you like to change it?" +msgstr "You’re using the auto-generated password for your account. Would you like to change it?" + +#: wp-admin/users.php:419 +msgid "You have specified this user for removal:" +msgstr "You have specified this user for removal:" + +#. translators: %s: User's display name. +#: wp-admin/user-edit.php:704 +msgid "Log %s out of all locations." +msgstr "Log %s out of all locations." + +#: wp-admin/user-edit.php:692 +msgid "Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here." +msgstr "Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here." + +#: wp-admin/user-edit.php:678 wp-admin/user-edit.php:688 +#: wp-admin/user-edit.php:698 +msgid "Sessions" +msgstr "Sessions" + +#: wp-admin/user-edit.php:680 wp-admin/user-edit.php:690 +msgid "Log Out Everywhere Else" +msgstr "Log Out Everywhere Else" + +#: wp-admin/user-edit.php:644 +msgid "Cancel password change" +msgstr "Cancel password change" + +#: wp-admin/user-edit.php:629 +msgid "Account Management" +msgstr "Account Management" + +#: wp-admin/user-new.php:563 +msgid "Generate password" +msgstr "Generate password" + +#. translators: The non-breaking space prevents 1Password from thinking the +#. text "log in" should trigger a password save prompt. +#: wp-admin/install.php:153 +msgid "You will need this password to log in. Please store it in a secure location." +msgstr "You will need this password to log in. Please store it in a secure location." + +#: wp-admin/includes/class-wp-list-table.php:764 +msgid "No approved comments" +msgstr "No approved comments" + +#: wp-admin/includes/class-wp-list-table.php:734 +#: wp-admin/includes/class-wp-list-table.php:764 +#: wp-admin/includes/class-wp-list-table.php:787 +msgid "No comments" +msgstr "No Comments" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:720 +msgid "%s approved comment" +msgid_plural "%s approved comments" +msgstr[0] "%s approved comment" +msgstr[1] "%s approved comments" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:726 +msgid "%s pending comment" +msgid_plural "%s pending comments" +msgstr[0] "%s pending comment" +msgstr[1] "%s pending comments" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:714 +msgid "%s comment" +msgid_plural "%s comments" +msgstr[0] "%s comment" +msgstr[1] "%s comments" + +#: wp-admin/includes/ajax-actions.php:3877 +msgid "Image could not be processed." +msgstr "Image could not be processed." + +#: wp-admin/install.php:167 wp-admin/user-new.php:585 +#: wp-admin/user-edit.php:664 +msgid "Confirm Password" +msgstr "Confirm Password" + +#. translators: 1: wp-config.php, 2: Secret key service URL. +#: wp-admin/maint/repair.php:67 +msgid "While you are editing your %1$s file, take a moment to make sure you have all 8 keys and that they are unique. You can generate these using the WordPress.org secret key service." +msgstr "While you are editing your %1$s file, take a moment to make sure you have all 8 keys and that they are unique. You can generate these using the WordPress.org secret key service." + +#: wp-admin/includes/update.php:905 +#: wp-admin/includes/class-wp-comments-list-table.php:847 +#: wp-admin/includes/class-wp-list-table.php:572 +#: wp-admin/includes/class-wp-list-table.php:1458 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:259 +msgid "Show more details" +msgstr "Show more details" + +#. translators: %s: Number of menus. +#: wp-admin/nav-menus.php:725 +msgid "Your theme supports %s menu. Select which menu appears in each location." +msgid_plural "Your theme supports %s menus. Select which menu appears in each location." +msgstr[0] "Your theme supports %s menu. Select which menu appears in each location." +msgstr[1] "Your theme supports %s menus. Select which menu appears in each location." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-installer-skin.php:133 +#: wp-admin/includes/class-theme-upgrader-skin.php:105 +msgid "Live Preview “%s”" +msgstr "Live Preview “%s”" + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-users-list-table.php:564 +msgid "%s post by this author" +msgid_plural "%s posts by this author" +msgstr[0] "%s post by this author" +msgstr[1] "%s posts by this author" + +#: wp-admin/includes/class-wp-list-table.php:970 +msgid "Last page" +msgstr "Last page" + +#: wp-admin/includes/class-wp-list-table.php:918 +msgid "First page" +msgstr "First Page" + +#: wp-admin/edit-form-comment.php:115 +msgid "Comment status" +msgstr "Comment status" + +#: wp-admin/includes/meta-boxes.php:275 wp-admin/edit-form-comment.php:141 +msgid "Date and time" +msgstr "Date and time" + +#. translators: %s: Post link. +#: wp-admin/edit-form-comment.php:160 +msgid "In response to: %s" +msgstr "In response to: %s" + +#: wp-admin/edit-form-advanced.php:362 +msgid "You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. Learn more about embeds." +msgstr "You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. Learn more about embeds." + +#: wp-admin/includes/class-custom-background.php:99 +msgid "Documentation on Custom Background" +msgstr "Documentation on Custom Background" + +#: wp-admin/edit-tags.php:309 +msgid "Documentation on Link Categories" +msgstr "Documentation on Link Categories" + +#: wp-admin/edit-link-form.php:76 +msgid "Documentation on Creating Links" +msgstr "Documentation on Creating Links" + +#: wp-admin/link-manager.php:78 +msgid "Documentation on Managing Links" +msgstr "Documentation on Managing Links" + +#: wp-admin/includes/class-custom-image-header.php:134 +msgid "Documentation on Custom Header" +msgstr "Documentation on Custom Header" + +#: wp-admin/my-sites.php:51 +msgid "Documentation on My Sites" +msgstr "Documentation on My Sites" + +#: wp-admin/widgets.php:88 +msgid "The theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions." +msgstr "The theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions." + +#. translators: %s: Codex URL. +#: wp-admin/options-writing.php:209 +msgid "When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see Update Services on the Codex. Separate multiple service URLs with line breaks." +msgstr "When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see Update Services on the Codex. Separate multiple service URLs with line breaks." + +#: wp-admin/includes/options.php:133 +msgid "The character encoding of your site (UTF-8 is recommended)" +msgstr "The character encoding of your site (UTF-8 is recommended)" + +#: wp-admin/includes/file.php:2204 +msgid "example: www.wordpress.org" +msgstr "example: www.wordpress.org" + +#: wp-admin/themes.php:137 +msgid "The search for installed themes will search for terms in their name, description, author, or tag." +msgstr "The search for installed themes will search for terms in their name, description, author, or tag." + +#: wp-admin/theme-install.php:102 +msgid "Alternately, you can browse the themes that are Featured, Popular, or Latest. When you find a theme you like, you can preview it or install it." +msgstr "Alternately, you can browse the themes that are Featured, Popular, or Latest. When you find a theme you like, you can preview it or install it." + +#: wp-admin/theme-install.php:101 +msgid "You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter." +msgstr "You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter." + +#. translators: %d: Number of themes. +#: wp-admin/themes.php:234 wp-admin/theme-install.php:67 +msgid "Number of Themes found: %d" +msgstr "Number of Themes found: %d" + +#: wp-admin/options-general.php:371 +msgid "Custom time format:" +msgstr "Custom time format:" + +#: wp-admin/options-general.php:370 +msgid "enter a custom time format in the following field" +msgstr "enter a custom time format in the following field" + +#: wp-admin/options-general.php:334 +msgid "Custom date format:" +msgstr "Custom date format:" + +#: wp-admin/options-general.php:333 +msgid "enter a custom date format in the following field" +msgstr "enter a custom date format in the following field" + +#: wp-admin/includes/class-plugin-upgrader.php:66 +msgid "Plugins updated successfully." +msgstr "Plugins updated successfully." + +#. translators: %s: Number of millions. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:747 +#: wp-admin/includes/plugin-install.php:689 +msgctxt "Active plugin installations" +msgid "%s+ Million" +msgid_plural "%s+ Million" +msgstr[0] "%s+ Million" +msgstr[1] "%s+ Million" + +#. translators: 1: Error message, 2: Line number. +#: wp-admin/link-parse-opml.php:89 +msgid "XML Error: %1$s at line %2$s" +msgstr "XML Error: %1$s at line %2$s" + +#: wp-admin/includes/class-wp-media-list-table.php:541 +msgid "Detach" +msgstr "Detach" + +#: wp-admin/menu-header.php:286 +msgid "Main menu" +msgstr "Main menu" + +#: wp-admin/includes/file.php:2255 +msgid "Enter the location on the server where the public and private keys are located. If a passphrase is needed, enter that in the password field above." +msgstr "Enter the location on the server where the public and private keys are located. If a passphrase is needed, enter that in the password field above." + +#: wp-admin/users.php:284 +msgid "You have specified these users for deletion:" +msgstr "You have specified these users for deletion:" + +#: wp-admin/users.php:313 +msgid "What should be done with content owned by these users?" +msgstr "What should be done with content owned by these users?" + +#. translators: %s: Number of users. +#: wp-admin/users.php:490 +msgid "%s user deleted." +msgid_plural "%s users deleted." +msgstr[0] "%s user deleted." +msgstr[1] "%s users deleted." + +#: wp-admin/plugins.php:346 +msgid "Delete Plugins" +msgstr "Delete Plugins" + +#: wp-admin/plugins.php:350 +msgid "You are about to remove the following plugins:" +msgstr "You are about to remove the following plugins:" + +#: wp-admin/plugins.php:348 +msgid "These plugins may be active on other sites in the network." +msgstr "These plugins may be active on other sites in the network." + +#: wp-admin/edit.php:356 +msgid "1 page not updated, somebody is editing it." +msgstr "1 page not updated, somebody is editing it." + +#: wp-admin/edit.php:343 +msgid "1 post not updated, somebody is editing it." +msgstr "1 post not updated, somebody is editing it." + +#: wp-admin/theme-install.php:455 +msgid "This theme has not been rated yet." +msgstr "This theme has not been rated yet." + +#: wp-admin/update-core.php:765 +msgid "New translations are available." +msgstr "New translations are available." + +#. translators: Date and time format for exact current time, mainly about +#. timezones, see https://www.php.net/manual/datetime.format.php +#: wp-admin/options-general.php:22 +msgctxt "timezone date format" +msgid "Y-m-d H:i:s" +msgstr "Y-m-d H:i:s" + +#: wp-admin/nav-menus.php:630 +msgid "To add a custom link, expand the Custom Links section, enter a URL and link text, and click Add to Menu" +msgstr "To add a custom link, expand the Custom Links section, enter a URL and link text, and click Add to Menu" + +#: wp-admin/includes/theme.php:789 wp-admin/themes.php:911 +msgid "Close details dialog" +msgstr "Close details dialog" + +#: wp-admin/includes/template.php:2669 +msgid "You are currently editing the page that shows your latest posts." +msgstr "You are currently editing the page that shows your latest posts." + +#: wp-admin/includes/file.php:31 +msgid "Posts Page" +msgstr "Posts Page" + +#: wp-admin/includes/class-wp-screen.php:1236 +msgid "Number of items per page:" +msgstr "Number of items per page:" + +#: wp-admin/user-edit.php:57 +msgid "You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button." +msgstr "You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button." + +#. translators: Do not translate USERNAME, URL_DELETE, SITENAME, SITEURL: those +#. are placeholders. +#: wp-admin/ms-delete-site.php:56 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently clicked the 'Delete Site' link on your site and filled in a\n" +"form on that page.\n" +"\n" +"If you really want to delete your site, click the link below. You will not\n" +"be asked to confirm again so only click this link if you are absolutely certain:\n" +"###URL_DELETE###\n" +"\n" +"If you delete your site, please consider opening a new site here\n" +"some time in the future! (But remember your current site and username\n" +"are gone forever.)\n" +"\n" +"Thanks for using the site,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi ###USERNAME###,\n" +"\n" +"You recently clicked the 'Delete Site' link on your site and filled in a\n" +"form on that page.\n" +"\n" +"If you really want to delete your site, click the link below. You will not\n" +"be asked to confirm again so only click this link if you are absolutely certain:\n" +"###URL_DELETE###\n" +"\n" +"If you delete your site, please consider opening a new site here\n" +"some time in the future! (But remember your current site and username\n" +"are gone forever.)\n" +"\n" +"Thanks for using the site,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/ms.php:302 wp-admin/network/settings.php:386 +msgid "Size in megabytes" +msgstr "Size in megabytes" + +#: wp-admin/includes/ms.php:299 +msgid "Site Upload Space Quota" +msgstr "Site Upload Space Quota" + +#: wp-admin/includes/revision.php:241 wp-admin/includes/revision.php:284 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "j M @ H:i" + +#: wp-admin/includes/class-wp-automatic-updater.php:1349 +msgid "" +"UPDATE LOG\n" +"==========" +msgstr "" +"UPDATE LOG\n" +"==========" + +#: wp-admin/includes/class-wp-automatic-updater.php:1326 +msgid "" +"BETA TESTING?\n" +"=============\n" +"\n" +"This debugging email is sent when you are using a development version of WordPress.\n" +"\n" +"If you think these failures might be due to a bug in WordPress, could you report it?\n" +" * Open a thread in the support forums: https://wordpress.org/support/forum/alphabeta\n" +" * Or, if you're comfortable writing a bug report: https://core.trac.wordpress.org/\n" +"\n" +"Thanks! -- The WordPress Team" +msgstr "" +"BETA TESTING?\n" +"=============\n" +"\n" +"This debugging email is sent when you are using a development version of WordPress.\n" +"\n" +"If you think these failures might be due to a bug in WordPress, could you report it?\n" +" * Open a thread in the support forums: https://wordpress.org/support/forum/alphabeta\n" +" * Or, if you're comfortable writing a bug report: https://core.trac.wordpress.org/\n" +"\n" +"Thanks! -- The WordPress Team" + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-admin/includes/misc.php:1357 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the administration email address on\n" +"your site changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi ###USERNAME###,\n" +"\n" +"You recently requested to have the administration email address on\n" +"your site changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/revision.php:240 wp-admin/includes/revision.php:283 +msgid "M j, Y @ H:i" +msgstr "j M Y @ H:i" + +#: wp-admin/comment.php:212 +msgid "Submitted on" +msgstr "Submitted on" + +#. translators: Column name or table row header. +#: wp-admin/includes/class-wp-comments-list-table.php:466 +#: wp-admin/comment.php:186 +msgid "In response to" +msgstr "In response to" + +#. translators: Localized Support reference. +#: wp-admin/includes/class-wp-site-health.php:1402 +msgid "https://wordpress.org/support" +msgstr "https://wordpress.org/support" + +#. translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. +#: wp-admin/includes/template.php:833 wp-admin/js/comment.js:89 +#: wp-admin/js/post.js:783 +msgid "%1$s %2$s, %3$s at %4$s:%5$s" +msgstr "%1$s %2$s, %3$s at %4$s:%5$s" + +#: wp-admin/user-edit.php:682 +msgid "You are only logged in at this location." +msgstr "You are only logged in at this location." + +#: wp-admin/includes/plugin-install.php:402 +msgid "These suggestions are based on the plugins you and other users have installed." +msgstr "These suggestions are based on the plugins you and other users have installed." + +#: wp-admin/edit-form-advanced.php:297 +msgid "You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options." +msgstr "You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options." + +#: wp-admin/user-edit.php:700 +msgid "Log Out Everywhere" +msgstr "Log Out Everywhere" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:111 +msgctxt "Plugin Installer" +msgid "Recommended" +msgstr "Recommended" + +#. translators: New site notification email. 1: New site URL, 2: User login, 3: +#. User password or password reset link, 4: Login URL. +#: wp-admin/includes/upgrade.php:610 +msgid "" +"Your new WordPress site has been successfully set up at:\n" +"\n" +"%1$s\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"\n" +"Username: %2$s\n" +"Password: %3$s\n" +"Log in here: %4$s\n" +"\n" +"We hope you enjoy your new site. Thanks!\n" +"\n" +"--The WordPress Team\n" +"https://wordpress.org/\n" +msgstr "" +"Your new WordPress site has been successfully set up at:\n" +"\n" +"%1$s\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"\n" +"Username: %2$s\n" +"Password: %3$s\n" +"Log in here: %4$s\n" +"\n" +"We hope you enjoy your new site. Thanks!\n" +"\n" +"--The WordPress Team\n" +"https://wordpress.org/\n" + +#: wp-admin/themes.php:280 +msgid "You cannot delete a theme while it has an active child theme." +msgstr "You cannot delete a theme while it has an active child theme." + +#: wp-admin/options-general.php:34 wp-admin/network/settings.php:55 +msgid "You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable)." +msgstr "You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable)." + +#: wp-admin/options-discussion.php:275 +msgid "Mystery Person" +msgstr "Mystery Person" + +#: wp-admin/install.php:127 +msgid "Usernames can have only alphanumeric characters, spaces, underscores, hyphens, periods, and the @ symbol." +msgstr "Usernames can have only alphanumeric characters, spaces, underscores, hyphens, full stops, and the @ symbol." + +#: wp-admin/includes/class-wp-screen.php:1004 +msgid "Enable full-height editor and distraction-free functionality." +msgstr "Enable full-height editor and distraction-free functionality." + +#: wp-admin/includes/dashboard.php:1488 +msgid "https://planet.wordpress.org/feed/" +msgstr "https://planet.wordpress.org/feed/" + +#: wp-admin/includes/dashboard.php:1479 wp-admin/index.php:96 +msgid "https://planet.wordpress.org/" +msgstr "https://planet.wordpress.org/" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:762 +msgid "Untested with your version of WordPress" +msgstr "Untested with your version of WordPress" + +#: wp-admin/includes/class-wp-links-list-table.php:117 +#: wp-admin/includes/class-wp-posts-list-table.php:459 +msgid "Filter by category" +msgstr "Filter by category" + +#: wp-admin/includes/meta-boxes.php:1118 +msgid "All categories" +msgstr "All categories" + +#: wp-admin/includes/class-wp-comments-list-table.php:499 +msgid "Filter by comment type" +msgstr "Filter by comment type" + +#: wp-admin/includes/ajax-actions.php:3848 +msgid "You are now logged out everywhere else." +msgstr "You are now logged out everywhere else." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:3852 +msgid "%s has been logged out." +msgstr "%s has been logged out." + +#: wp-admin/includes/ajax-actions.php:3839 +msgid "Could not log out user sessions. Please try again." +msgstr "Could not log out user sessions. Please try again." + +#: wp-admin/includes/ajax-actions.php:3726 +msgid "This preview is unavailable in the editor." +msgstr "This preview is unavailable in the editor." + +#: wp-admin/edit-form-advanced.php:293 +msgid "Post editor — Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab." +msgstr "Post editor — Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab." + +#: wp-admin/edit-form-advanced.php:296 +msgid "You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode." +msgstr "You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting Toolbar available in Visual mode." + +#. translators: %s: URL to background image configuration in Customizer. +#: wp-admin/includes/class-custom-background.php:234 +msgid "You can now manage and live-preview Custom Backgrounds in the Customizer." +msgstr "You can now manage and live-preview Custom Backgrounds in the Customiser." + +#. translators: %s: URL to header image configuration in Customizer. +#: wp-admin/includes/class-custom-image-header.php:483 +msgid "You can now manage and live-preview Custom Header in the Customizer." +msgstr "You can now manage and live-preview Custom Header in the Customiser." + +#: wp-admin/includes/class-wp-screen.php:1137 +msgctxt "Welcome panel" +msgid "Welcome" +msgstr "Welcome" + +#. translators: %s: Number of users. +#. translators: Number of users. +#: wp-admin/includes/class-wp-users-list-table.php:203 +#: wp-admin/includes/class-wp-ms-users-list-table.php:148 +msgctxt "users" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%s)" + +#: wp-admin/includes/class-wp-links-list-table.php:133 +#: wp-admin/edit-link-form.php:114 +msgctxt "link name" +msgid "Name" +msgstr "Name" + +#. translators: %s: Placeholder that must come at the start of the URL. +#: wp-admin/options-permalink.php:334 +msgid "If you like, you may enter custom structures for your category and tag URLs here. For example, using topics as your category base would make your category links like %s/topics/uncategorized/. If you leave these blank the defaults will be used." +msgstr "If you like, you may enter custom structures for your category and tag URLs here. For example, using topics as your category base would make your category links like %s/topics/uncategorised/. If you leave these blank the defaults will be used." + +#: wp-admin/credits.php:152 +msgid "Release Lead" +msgstr "Release Lead" + +#: wp-admin/upload.php:68 +msgid "Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly." +msgstr "Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly." + +#: wp-admin/upload.php:57 wp-admin/upload.php:230 +msgid "You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media." +msgstr "You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media." + +#: wp-admin/upload.php:58 +msgid "To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media." +msgstr "To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media." + +#: wp-admin/upload.php:67 +msgid "Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved." +msgstr "Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved." + +#: wp-admin/upload.php:69 +msgid "You can also delete individual items and access the extended edit screen from the details dialog." +msgstr "You can also delete individual items and access the extended edit screen from the details dialog." + +#: wp-admin/upload.php:56 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first." +msgstr "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first." + +#: wp-admin/plugin-install.php:139 +msgid "Browse Plugins" +msgstr "Browse Plugins" + +#: wp-admin/plugin-install.php:101 +msgid "If you just want to get an idea of what’s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly." +msgstr "If you just want to get an idea of what’s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly." + +#: wp-admin/plugin-install.php:50 +msgid "Add Plugins" +msgstr "Add Plugins" + +#: wp-admin/includes/translation-install.php:24 +msgid "Invalid translation type." +msgstr "Invalid translation type." + +#. translators: 1: WPLANG, 2: wp-config.php +#: wp-admin/options-general.php:191 +msgid "The %1$s constant in your %2$s file is no longer needed." +msgstr "The %1$s constant in your %2$s file is no longer needed." + +#: wp-admin/install.php:358 +msgid "Welcome to the famous five-minute WordPress installation process! Just fill in the information below and you’ll be on your way to using the most extendable and powerful personal publishing platform in the world." +msgstr "Welcome to the famous five-minute WordPress installation process! Just fill in the information below and you’ll be on your way to using the most extendable and powerful personal publishing platform in the world." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:764 +msgid "Incompatible with your version of WordPress" +msgstr "Incompatible with your version of WordPress" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:766 +msgid "Compatible with your version of WordPress" +msgstr "Compatible with your version of WordPress" + +#. translators: %s: Number of stars. +#: wp-admin/includes/plugin-install.php:759 +msgid "%d star" +msgid_plural "%d stars" +msgstr[0] "%d star" +msgstr[1] "%d stars" + +#: wp-admin/includes/class-wp-list-table.php:486 +msgid "Select bulk action" +msgstr "Select bulk action" + +#. translators: %s: List view URL. +#: wp-admin/upload.php:102 +msgid "The grid view for the Media Library requires JavaScript. Switch to the list view." +msgstr "The grid view for the Media Library requires JavaScript. Switch to the list view." + +#: wp-admin/user-new.php:453 wp-admin/user-new.php:620 +msgid "Add the user without sending an email that requires their confirmation." +msgstr "Add the user without sending an email that requires their confirmation." + +#. translators: %s: URL that could not be embedded. +#: wp-admin/includes/ajax-actions.php:3692 +msgid "%s failed to embed." +msgstr "%s failed to embed." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:106 +msgctxt "Plugin Installer" +msgid "Beta Testing" +msgstr "Beta Testing" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:465 +msgctxt "Plugin installer group title" +msgid "Performance" +msgstr "Performance" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:466 +msgctxt "Plugin installer group title" +msgid "Social" +msgstr "Social" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:467 +msgctxt "Plugin installer group title" +msgid "Tools" +msgstr "Tools" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:624 +msgid "More Details" +msgstr "More Details" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1046 +msgid "View details" +msgstr "View details" + +#: wp-admin/includes/class-wp-terms-list-table.php:195 +msgctxt "Number/count of items" +msgid "Count" +msgstr "Count" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:67 +msgctxt "themes" +msgid "Recently Updated" +msgstr "Recently Updated" + +#: wp-admin/includes/plugin-install.php:574 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Reviews" + +#: wp-admin/includes/plugin-install.php:704 +#: wp-admin/includes/plugin-install.php:791 +msgid "Donate to this plugin »" +msgstr "Donate to this plugin »" + +#: wp-admin/includes/plugin-install.php:773 +msgid "Contributors" +msgstr "Contributors" + +#. translators: %s: Support email address. +#: wp-admin/includes/class-wp-automatic-updater.php:797 +msgid "The WordPress team is willing to help you. Forward this email to %s and the team will work with you to make sure your site is working." +msgstr "The WordPress team is willing to help you. Forward this email to %s and the team will work with you to make sure your site is working." + +#: wp-admin/includes/class-wp-automatic-updater.php:812 +msgid "If you reach out to us, we'll also ensure you'll never have this problem again." +msgstr "If you reach out to us, we'll also ensure you'll never have this problem again." + +#: wp-admin/theme-install.php:235 +msgid "Filtering by:" +msgstr "Filtering by:" + +#: wp-admin/includes/image-edit.php:170 +msgid "To crop the image, click on it and drag to make your selection." +msgstr "To crop the image, click on it and drag to make your selection." + +#: wp-admin/includes/image-edit.php:108 +msgid "You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up." +msgstr "You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up." + +#: wp-admin/edit-comments.php:183 +msgid "A red bar on the left means the comment is waiting for you to moderate it." +msgstr "A red bar on the left means the comment is waiting for you to moderate it." + +#: wp-admin/includes/image-edit.php:173 +msgid "The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc." +msgstr "The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc." + +#: wp-admin/includes/image-edit.php:176 +msgid "Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings." +msgstr "Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings." + +#: wp-admin/includes/image-edit.php:214 +msgid "You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image." +msgstr "You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image." + +#: wp-admin/includes/media.php:3253 +msgid "Displayed on attachment pages." +msgstr "Displayed on attachment pages." + +#. translators: %s: Alt + F10 +#: wp-admin/edit-form-advanced.php:300 +msgid "Keyboard users: When you’re working in the visual editor, you can use %s to access the toolbar." +msgstr "Keyboard users: when you’re working in the visual editor, you can use %s to access the toolbar." + +#: wp-admin/includes/class-wp-comments-list-table.php:503 +msgid "All comment types" +msgstr "All comment types" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:64 +#: wp-admin/theme-install.php:176 +msgctxt "themes" +msgid "Featured" +msgstr "Featured" + +#: wp-admin/theme-install.php:177 +msgctxt "themes" +msgid "Popular" +msgstr "Popular" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:66 +#: wp-admin/theme-install.php:178 +msgctxt "themes" +msgid "Latest" +msgstr "Latest" + +#: wp-admin/maint/repair.php:147 +msgid "https://wordpress.org/support/forum/how-to-and-troubleshooting" +msgstr "https://wordpress.org/support/forum/how-to-and-troubleshooting" + +#: wp-admin/theme-install.php:24 +msgid "Add Themes" +msgstr "Add Themes" + +#: wp-admin/theme-install.php:56 +msgid "Search Themes" +msgstr "Search Themes" + +#: wp-admin/theme-install.php:57 +msgid "Search themes..." +msgstr "Search themes..." + +#: wp-admin/theme-install.php:334 +msgctxt "theme" +msgid "Details & Preview" +msgstr "Details & Preview" + +#: wp-admin/users.php:311 +msgid "What should be done with content owned by this user?" +msgstr "What should be done with content owned by this user?" + +#: wp-admin/includes/ms.php:955 wp-admin/users.php:317 +msgid "Delete all content." +msgstr "Delete all content." + +#: wp-admin/includes/ms.php:957 wp-admin/users.php:320 +msgid "Attribute all content to:" +msgstr "Attribute all content to:" + +#: wp-admin/index.php:63 +msgid "Box Controls — Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a “Configure” link in the title bar if you hover over it." +msgstr "Box Controls — Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a “Configure” link in the title bar if you hover over it." + +#: wp-admin/themes.php:43 +msgid "Sorry, you are not allowed to resume this theme." +msgstr "Sorry, you are not allowed to resume this theme." + +#: wp-admin/users.php:56 +msgid "Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using bulk actions." +msgstr "Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using bulk actions." + +#: wp-admin/users.php:58 +msgid "Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using bulk actions." +msgstr "Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using bulk actions." + +#: wp-admin/index.php:84 +msgid "At a Glance — Displays a summary of the content on your site and identifies which theme and version of WordPress you are using." +msgstr "At a Glance – Displays a summary of the content on your site and identifies which theme and version of WordPress you are using." + +#. translators: %s: https://wordpress.org +#: wp-admin/admin-footer.php:37 +msgid "Thank you for creating with WordPress." +msgstr "Thank you for creating with WordPress." + +#: wp-admin/credits.php:67 wp-admin/credits.php:82 +msgid "https://make.wordpress.org/" +msgstr "https://make.wordpress.org/" + +#: wp-admin/includes/dashboard.php:1949 +msgid "Manage widgets" +msgstr "Manage widgets" + +#: wp-admin/includes/dashboard.php:1952 +msgid "Manage menus" +msgstr "Manage menus" + +#: wp-admin/includes/meta-boxes.php:134 +msgid "Edit status" +msgstr "Edit status" + +#: wp-admin/includes/meta-boxes.php:186 +msgid "Edit visibility" +msgstr "Edit visibility" + +#: wp-admin/includes/meta-boxes.php:259 +msgid "Browse revisions" +msgstr "Browse revisions" + +#: wp-admin/includes/meta-boxes.php:272 wp-admin/edit-form-comment.php:139 +msgid "Edit date and time" +msgstr "Edit date and time" + +#: wp-admin/includes/ms.php:1159 wp-admin/network/user-new.php:30 +#: wp-admin/network/index.php:56 wp-admin/network/users.php:231 +#: wp-admin/network/site-new.php:33 wp-admin/network/sites.php:46 +msgid "Support Forums" +msgstr "Support Forums" + +#: wp-admin/themes.php:232 +msgid "Search installed themes..." +msgstr "Search installed themes..." + +#: wp-admin/update-core.php:925 +msgid "If an update is available, you᾿ll see a notification appear in the Toolbar and navigation menu." +msgstr "If an update is available, you᾿ll see a notification appear in the Toolbar and navigation menu." + +#: wp-admin/update-core.php:935 +msgid "WordPress — Updating your WordPress installation is a simple one-click procedure: just click on the “Update Now” button when you are notified that a new version is available." +msgstr "WordPress — Updating your WordPress installation is a simple one-click procedure: just click on the “Update Now” button when you are notified that a new version is available." + +#: wp-admin/update-core.php:935 +msgid "In most cases, WordPress will automatically apply maintenance and security updates in the background for you." +msgstr "In most cases, WordPress will automatically apply maintenance and security updates in the background for you." + +#: wp-admin/update-core.php:939 +msgid "Translations — The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can click the “Update Translations” button." +msgstr "Translations — The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can click the “Update Translations” button." + +#: wp-admin/update-core.php:936 +msgid "Themes and Plugins — To update individual themes or plugins from this screen, use the checkboxes to make your selection, then click on the appropriate “Update” button. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button." +msgstr "Themes and Plugins — To update individual themes or plugins from this screen, use the checkboxes to make your selection, then click on the appropriate “Update” button. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button." + +#: wp-admin/update-core.php:924 +msgid "On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories." +msgstr "On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories." + +#. translators: %s: https://wordpress.org/themes +#: wp-admin/themes.php:155 +msgid "If you would like to see more themes to choose from, click on the “Add New” button and you will be able to browse or search for additional themes from the WordPress Theme Directory. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "If you would like to see more themes to choose from, click on the “Add New” button and you will be able to browse or search for additional themes from the WordPress Theme Directory. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the licence WordPress uses. Oh, and they’re free!" + +#. translators: %s: Number of posts. +#: wp-admin/includes/dashboard.php:297 +msgid "%s Post" +msgid_plural "%s Posts" +msgstr[0] "%s Post" +msgstr[1] "%s Posts" + +#. translators: %s: Number of pages. +#: wp-admin/includes/dashboard.php:300 +msgid "%s Page" +msgid_plural "%s Pages" +msgstr[0] "%s Page" +msgstr[1] "%s Pages" + +#. translators: Date and time format for recent posts on the dashboard, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/dashboard.php:982 +msgid "M jS" +msgstr "j M" + +#. translators: %s: Number of megabytes. +#: wp-admin/includes/dashboard.php:1568 +msgid "%s MB Space Allowed" +msgstr "%s MB Space Allowed" + +#. translators: 1: Number of megabytes, 2: Percentage. +#: wp-admin/includes/dashboard.php:1582 +msgid "%1$s MB (%2$s%%) Space Used" +msgstr "%1$s MB (%2$s%%) Space Used" + +#: wp-admin/includes/dashboard.php:61 +msgid "At a Glance" +msgstr "At a Glance" + +#: wp-admin/options-reading.php:46 +msgid "When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search engines discouraged”, to remind you that you have directed search engines to not crawl your site." +msgstr "When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search engines discouraged”, to remind you that you have directed search engines to not crawl your site." + +#: wp-admin/themes.php:526 wp-admin/themes.php:873 +msgctxt "theme" +msgid "Active:" +msgstr "Active:" + +#: wp-admin/includes/theme.php:303 +msgid "Accessibility Ready" +msgstr "Accessibility Ready" + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:916 wp-admin/themes.php:1081 +msgid "This is a child theme of %s." +msgstr "This is a child theme of %s." + +#: wp-admin/themes.php:131 +msgid "This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties." +msgstr "This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties." + +#: wp-admin/themes.php:133 +msgid "Hover or tap to see Activate and Live Preview buttons" +msgstr "Hover or tap to see Activate and Live Preview buttons" + +#: wp-admin/themes.php:134 +msgid "Click on the theme to see the theme name, version, author, description, tags, and the Delete link" +msgstr "Click on the theme to see the theme name, version, author, description, tags, and the Delete link" + +#: wp-admin/themes.php:135 +msgid "Click Customize for the current theme or Live Preview for any other theme to see a live preview" +msgstr "Click Customise for the current theme or Live Preview for any other theme to see a live preview" + +#: wp-admin/themes.php:136 +msgid "The current theme is displayed highlighted as the first theme." +msgstr "The current theme is displayed highlighted as the first theme." + +#: wp-admin/themes.php:172 +msgid "Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way." +msgstr "Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customised in this way." + +#: wp-admin/themes.php:174 +msgid "When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again." +msgstr "When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again." + +#: wp-admin/themes.php:173 +msgid "The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Publish & Activate button above the menu." +msgstr "The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Publish & Activate button above the menu." + +#: wp-admin/widgets.php:449 +msgid "To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back." +msgstr "To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back." + +#. translators: 1: The rating, 2: The number of ratings. +#: wp-admin/includes/template.php:2641 +msgid "%1$s rating based on %2$s rating" +msgid_plural "%1$s rating based on %2$s ratings" +msgstr[0] "%1$s rating based on %2$s rating" +msgstr[1] "%1$s rating based on %2$s ratings" + +#. translators: %s: The rating. +#: wp-admin/includes/template.php:2645 +msgid "%s rating" +msgstr "%s rating" + +#: wp-admin/my-sites.php:45 +msgid "This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the front end or the dashboard for that site." +msgstr "This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the front end or the dashboard for that site." + +#. translators: 1: Error code, 2: Error message. +#: wp-admin/includes/class-wp-automatic-updater.php:1382 +msgid "Error: [%1$s] %2$s" +msgstr "ERROR: [%1$s] %2$s" + +#. translators: 1: Error code, 2: Error message. +#: wp-admin/includes/class-wp-automatic-updater.php:1379 +msgid "Rollback Error: [%1$s] %2$s" +msgstr "ROLLBACK ERROR: [%1$s] %2$s" + +#: wp-admin/includes/class-wp-automatic-updater.php:1292 +msgid "The following plugins were successfully updated:" +msgstr "The following plugins were successfully updated:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1293 +msgid "The following themes were successfully updated:" +msgstr "The following themes were successfully updated:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1294 +msgid "The following translations were successfully updated:" +msgstr "The following translations were successfully updated:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1306 +msgid "The following plugins failed to update:" +msgstr "The following plugins failed to update:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1307 +msgid "The following themes failed to update:" +msgstr "The following themes failed to update:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1308 +msgid "The following translations failed to update:" +msgstr "The following translations failed to update:" + +#: wp-admin/post.php:82 +msgid "Unable to submit this form, please refresh and try again." +msgstr "Unable to submit this form, please refresh and try again." + +#: wp-admin/themes.php:226 +msgid "" +"Are you sure you want to delete this theme?\n" +"\n" +"Click 'Cancel' to go back, 'OK' to confirm the delete." +msgstr "" +"Are you sure you want to delete this theme?\n" +"\n" +"Click 'Cancel' to go back, 'OK' to confirm the delete." + +#: wp-admin/themes.php:230 wp-admin/theme-install.php:55 +msgid "Add New Theme" +msgstr "Add New Theme" + +#: wp-admin/includes/theme.php:837 wp-admin/themes.php:997 +msgid "Update Available" +msgstr "Update Available" + +#: wp-admin/includes/theme.php:787 wp-admin/themes.php:909 +msgid "Show previous theme" +msgstr "Show previous theme" + +#: wp-admin/includes/theme.php:788 wp-admin/themes.php:910 +msgid "Show next theme" +msgstr "Show next theme" + +#: wp-admin/widgets.php:570 +msgid "Add Widget" +msgstr "Add Widget" + +#: wp-admin/index.php:87 +msgid "Activity — Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them." +msgstr "Activity — Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them." + +#: wp-admin/index.php:61 +msgid "Screen Options — Use the Screen Options tab to choose which Dashboard boxes to show." +msgstr "Screen Options — Use the Screen Options tab to choose which Dashboard boxes to show." + +#: wp-admin/index.php:90 +msgid "Quick Draft — Allows you to create a new post and save it as a draft. Also displays links to the 3 most recent draft posts you've started." +msgstr "Quick Draft — Allows you to create a new post and save it as a draft. Also displays links to the 3 most recent draft posts you've started." + +#: wp-admin/includes/dashboard.php:75 +msgid "Quick Draft" +msgstr "Quick Draft" + +#. translators: 1: Version number, 2: Theme name. +#: wp-admin/includes/update.php:357 +msgid "WordPress %1$s running %2$s theme." +msgstr "WordPress %1$s running %2$s theme." + +#: wp-admin/includes/dashboard.php:558 +msgid "What’s on your mind?" +msgstr "What’s on your mind?" + +#: wp-admin/includes/dashboard.php:894 +msgid "Publishing Soon" +msgstr "Publishing Soon" + +#: wp-admin/includes/dashboard.php:903 +msgid "Recently Published" +msgstr "Recently Published" + +#: wp-admin/includes/dashboard.php:912 +msgid "No activity yet!" +msgstr "No activity yet!" + +#: wp-admin/includes/dashboard.php:70 +msgid "Activity" +msgstr "Activity" + +#. translators: %s: Network home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1268 +msgid "WordPress site: %s" +msgstr "WordPress site: %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:1275 +msgid "SUCCESS: WordPress was successfully updated to %s" +msgstr "SUCCESS: WordPress was successfully updated to %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:1278 +msgid "FAILED: WordPress failed to update to %s" +msgstr "FAILED: WordPress failed to update to %s" + +#. translators: %s: Name of plugin / theme / translation. +#: wp-admin/includes/class-wp-automatic-updater.php:1300 +msgid "SUCCESS: %s" +msgstr "SUCCESS: %s" + +#. translators: %s: Name of plugin / theme / translation. +#: wp-admin/includes/class-wp-automatic-updater.php:1315 +msgid "FAILED: %s" +msgstr "FAILED: %s" + +#: wp-admin/includes/dashboard.php:976 +msgid "Tomorrow" +msgstr "Tomorrow" + +#: wp-admin/includes/deprecated.php:1380 +msgid "Popular Plugin" +msgstr "Popular Plugin" + +#: wp-admin/includes/dashboard.php:1575 wp-admin/includes/dashboard.php:1590 +msgid "Manage Uploads" +msgstr "Manage Uploads" + +#: wp-admin/includes/update-core.php:945 wp-admin/includes/update-core.php:1092 +#: wp-admin/includes/update-core.php:1117 +#: wp-admin/includes/class-core-upgrader.php:160 +#: wp-admin/includes/class-wp-upgrader.php:165 +msgid "The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions." +msgstr "The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions." + +#. translators: %s: WordPress latest version. +#: wp-admin/includes/class-wp-automatic-updater.php:740 +msgid "WordPress %s is also now available." +msgstr "WordPress %s is also now available." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:772 +msgid "Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s." +msgstr "Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:826 +msgid "Your site was running version %s." +msgstr "Your site was running version %s." + +#: wp-admin/includes/class-language-pack-upgrader-skin.php:31 +#: wp-admin/update-core.php:767 wp-admin/update-core.php:1175 +msgid "Update Translations" +msgstr "Update Translations" + +#. translators: 1: Project name (plugin, theme, or WordPress), 2: Language. +#: wp-admin/includes/class-wp-automatic-updater.php:376 +#: wp-admin/includes/class-language-pack-upgrader-skin.php:51 +msgid "Updating translations for %1$s (%2$s)…" +msgstr "Updating translations for %1$s (%2$s)…" + +#. translators: %s: Project name (plugin, theme, or WordPress). +#: wp-admin/includes/class-wp-automatic-updater.php:374 +msgid "Translations for %s" +msgstr "Translations for %s" + +#. translators: Site updated notification email subject. 1: Site title, 2: +#. WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:695 +msgid "[%1$s] Your site has updated to WordPress %2$s" +msgstr "[%1$s] Your site has updated to WordPress %2$s" + +#. translators: Update available notification email subject. 1: Site title, 2: +#. WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:701 +msgid "[%1$s] WordPress %2$s is available. Please update!" +msgstr "[%1$s] WordPress %2$s is available. Please update!" + +#. translators: Site down notification email subject. 1: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:706 +msgid "[%1$s] URGENT: Your site may be down due to a failed update" +msgstr "[%1$s] URGENT: Your site may be down due to a failed update" + +#: wp-admin/includes/class-wp-automatic-updater.php:729 +msgid "No further action is needed on your part." +msgstr "No further action is needed on your part." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:735 +msgid "For more on version %s, see the About WordPress screen:" +msgstr "For more on version %s, see the About WordPress screen:" + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:751 +msgid "Please update your site at %1$s to WordPress %2$s." +msgstr "Please update your site at %1$s to WordPress %2$s." + +#: wp-admin/includes/class-wp-automatic-updater.php:761 +msgid "We tried but were unable to update your site automatically." +msgstr "We tried but were unable to update your site automatically." + +#: wp-admin/includes/class-wp-automatic-updater.php:741 +#: wp-admin/includes/class-wp-automatic-updater.php:764 +msgid "Updating is easy and only takes a few moments:" +msgstr "Updating is easy and only takes a few moments:" + +#. translators: 1: Home URL, 2: WordPress latest version. +#: wp-admin/includes/class-wp-automatic-updater.php:779 +msgid "Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s." +msgstr "Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s." + +#: wp-admin/includes/class-wp-automatic-updater.php:785 +msgid "This means your site may be offline or broken. Don't panic; this can be fixed." +msgstr "This means your site may be offline or broken. Don't panic; this can be fixed." + +#: wp-admin/includes/class-wp-automatic-updater.php:787 +msgid "Please check out your site now. It's possible that everything is working. If it says you need to update, you should do so:" +msgstr "Please check out your site now. It's possible that everything is working. If it says you need to update, you should do so:" + +#: wp-admin/includes/class-wp-automatic-updater.php:808 +#: wp-admin/update-core.php:925 +msgid "Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers." +msgstr "Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers." + +#: wp-admin/includes/class-wp-automatic-updater.php:802 +#: wp-admin/includes/class-wp-automatic-updater.php:1215 +msgid "If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help." +msgstr "If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help." + +#: wp-admin/includes/class-wp-automatic-updater.php:817 +msgid "You also have some plugins or themes with updates available. Update them now:" +msgstr "You also have some plugins or themes with updates available. Update them now:" + +#: wp-admin/includes/class-wp-automatic-updater.php:821 +#: wp-admin/includes/class-wp-automatic-updater.php:1217 +msgid "The WordPress Team" +msgstr "The WordPress Team" + +#: wp-admin/includes/class-wp-automatic-updater.php:827 +msgid "We have some data that describes the error your site encountered." +msgstr "We have some data that describes the error your site encountered." + +#: wp-admin/includes/class-wp-automatic-updater.php:828 +msgid "Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:" +msgstr "Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:" + +#. translators: %s: Error code. +#: wp-admin/includes/class-wp-automatic-updater.php:845 +msgid "Error code: %s" +msgstr "Error code: %s" + +#: wp-admin/update-core.php:755 wp-admin/update-core.php:763 +msgid "Translations" +msgstr "Translations" + +#: wp-admin/includes/class-language-pack-upgrader.php:114 +#: wp-admin/update-core.php:756 +msgid "Your translations are all up to date." +msgstr "Your translations are all up to date." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:723 +msgid "Howdy! Your site at %1$s has been updated automatically to WordPress %2$s." +msgstr "Hi! Your site at %1$s has been updated automatically to WordPress %2$s." + +#: wp-admin/includes/class-wp-site-health.php:2226 +msgid "Background updates" +msgstr "Background updates" + +#: wp-admin/includes/class-language-pack-upgrader.php:113 +msgid "Some of your translations need updating. Sit tight for a few more seconds while we update them as well." +msgstr "Some of your translations need updating. Sit tight for a few more seconds while we update them as well." + +#: wp-admin/includes/class-language-pack-upgrader.php:119 +msgid "Translation update failed." +msgstr "Translation update failed." + +#: wp-admin/includes/class-language-pack-upgrader.php:120 +msgid "Translation updated successfully." +msgstr "Translation updated successfully." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-automatic-updater.php:357 +msgid "Updating theme: %s" +msgstr "Updating theme: %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-automatic-updater.php:369 +msgid "Updating plugin: %s" +msgstr "Updating plugin: %s" + +#: wp-admin/includes/update-core.php:1158 +msgid "There is not enough free disk space to complete the update." +msgstr "There is not enough free disk space to complete the update." + +#: wp-admin/options-discussion.php:182 +msgid "Comment must be manually approved" +msgstr "Comment must be manually approved" + +#: wp-admin/options-media.php:52 +msgid "The sizes listed below determine the maximum dimensions in pixels to use when adding an image to the Media Library." +msgstr "The sizes listed below determine the maximum dimensions in pixels to use when adding an image to the Media Library." + +#: wp-admin/user-new.php:482 +msgid "Create a brand new user and add them to this site." +msgstr "Create a brand new user and add them to this site." + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/theme-editor.php:42 +msgid "Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead." +msgstr "Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead." + +#. translators: 1: Folder to locate, 2: Folder to start searching from. +#: wp-admin/includes/class-wp-filesystem-base.php:266 +msgid "Looking for %1$s in %2$s" +msgstr "Looking for %1$s in %2$s" + +#: wp-admin/includes/class-core-upgrader.php:37 +msgid "Attempting to roll back to previous version." +msgstr "Attempting to roll back to previous version." + +#: wp-admin/includes/class-core-upgrader.php:38 +msgid "Due to an error during updating, WordPress has rolled back to your previous version." +msgstr "Due to an error during updating, WordPress has rolled back to your previous version." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:343 +msgid "Updating to WordPress %s" +msgstr "Updating to WordPress %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:345 +msgid "WordPress %s" +msgstr "WordPress %s" + +#. translators: 1: File checksum, 2: Expected checksum value. +#: wp-admin/includes/file.php:1211 +msgid "The checksum of the file (%1$s) does not match the expected checksum value (%2$s)." +msgstr "The checksum of the file (%1$s) does not match the expected checksum value (%2$s)." + +#: wp-admin/includes/file.php:2219 +msgid "This password will not be stored on the server." +msgstr "This password will not be stored on the server." + +#: wp-admin/includes/update-core.php:1036 +msgid "Preparing to install the latest version…" +msgstr "Preparing to install the latest version…" + +#: wp-admin/includes/update-core.php:1106 +msgid "Copying the required files…" +msgstr "Copying the required files…" + +#: wp-admin/install.php:393 +msgid "Please provide a valid username." +msgstr "Please provide a valid username." + +#: wp-admin/install.php:396 +msgid "The username you provided has invalid characters." +msgstr "The username you provided has invalid characters." + +#: wp-admin/install.php:400 +msgid "Your passwords do not match. Please try again." +msgstr "Your passwords do not match. Please try again." + +#: wp-admin/nav-menus.php:628 +msgid "Clicking the arrow to the right of any menu item in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab." +msgstr "Clicking the arrow to the right of any menu item in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab." + +#. translators: %s: URL to Widgets screen. +#: wp-admin/nav-menus.php:588 +msgid "Your theme does not natively support menus, but you can use them in sidebars by adding a “Navigation Menu” widget on the Widgets screen." +msgstr "Your theme does not natively support menus, but you can use them in sidebars by adding a “Navigation Menu” widget on the Widgets screen." + +#. translators: 1: URL to Widgets screen, 2 and 3: The names of the default +#. themes. +#: wp-admin/nav-menus.php:597 +msgid "Menus can be displayed in locations defined by your theme, even used in sidebars by adding a “Navigation Menu” widget on the Widgets screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the Documentation link to the side." +msgstr "Menus can be displayed in locations defined by your theme, even used in sidebars by adding a “Navigation Menu” widget on the Widgets screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the Documentation link to the side." + +#: wp-admin/install.php:408 +msgid "Sorry, that isn’t a valid email address. Email addresses look like username@example.com." +msgstr "Sorry, that isn’t a valid email address. Email addresses look like username@example.com." + +#: wp-admin/install.php:404 +msgid "You must provide an email address." +msgstr "You must provide an email address." + +#: wp-admin/includes/edit-tag-messages.php:24 +msgid "Category added." +msgstr "Category added." + +#: wp-admin/includes/edit-tag-messages.php:25 +msgid "Category deleted." +msgstr "Category deleted." + +#: wp-admin/includes/edit-tag-messages.php:26 +msgid "Category updated." +msgstr "Category updated." + +#: wp-admin/includes/edit-tag-messages.php:27 +msgid "Category not added." +msgstr "Category not added." + +#: wp-admin/includes/edit-tag-messages.php:28 +msgid "Category not updated." +msgstr "Category not updated." + +#: wp-admin/includes/edit-tag-messages.php:29 +msgid "Categories deleted." +msgstr "Categories deleted." + +#: wp-admin/includes/edit-tag-messages.php:34 +msgid "Tag added." +msgstr "Tag added." + +#: wp-admin/includes/edit-tag-messages.php:35 +msgid "Tag deleted." +msgstr "Tag deleted." + +#: wp-admin/includes/edit-tag-messages.php:36 +msgid "Tag updated." +msgstr "Tag updated." + +#: wp-admin/includes/edit-tag-messages.php:37 +msgid "Tag not added." +msgstr "Tag not added." + +#: wp-admin/includes/edit-tag-messages.php:38 +msgid "Tag not updated." +msgstr "Tag not updated." + +#: wp-admin/includes/edit-tag-messages.php:39 +msgid "Tags deleted." +msgstr "Tags deleted." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:345 +msgid "%s post not updated, somebody is editing it." +msgid_plural "%s posts not updated, somebody is editing them." +msgstr[0] "%s post not updated, somebody is editing it." +msgstr[1] "%s posts not updated, somebody is editing them." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:347 +msgid "%s post permanently deleted." +msgid_plural "%s posts permanently deleted." +msgstr[0] "%s post permanently deleted." +msgstr[1] "%s posts permanently deleted." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:351 +msgid "%s post restored from the Trash." +msgid_plural "%s posts restored from the Trash." +msgstr[0] "%s post restored from the Bin." +msgstr[1] "%s posts restored from the Bin." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:362 +msgid "%s page moved to the Trash." +msgid_plural "%s pages moved to the Trash." +msgstr[0] "%s page moved to the Bin." +msgstr[1] "%s pages moved to the Bin." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:364 +msgid "%s page restored from the Trash." +msgid_plural "%s pages restored from the Trash." +msgstr[0] "%s page restored from the Bin." +msgstr[1] "%s pages restored from the Bin." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:355 +msgid "%s page updated." +msgid_plural "%s pages updated." +msgstr[0] "%s page updated." +msgstr[1] "%s pages updated." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:358 +msgid "%s page not updated, somebody is editing it." +msgid_plural "%s pages not updated, somebody is editing them." +msgstr[0] "%s page not updated, somebody is editing it." +msgstr[1] "%s pages not updated, somebody is editing them." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:360 +msgid "%s page permanently deleted." +msgid_plural "%s pages permanently deleted." +msgstr[0] "%s page permanently deleted." +msgstr[1] "%s pages permanently deleted." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:349 +msgid "%s post moved to the Trash." +msgid_plural "%s posts moved to the Trash." +msgstr[0] "%s post moved to the Bin." +msgstr[1] "%s posts moved to the Bin." + +#: wp-admin/revision.php:144 +msgid "Compare two different revisions by selecting the “Compare any two revisions” box to the side." +msgstr "Compare two different revisions by selecting the “Compare any two revisions” box to the side." + +#: wp-admin/includes/revision.php:380 +msgid "Compare any two revisions" +msgstr "Compare any two revisions" + +#. translators: 1: Audio track title, 2: Album title, 3: Artist name. +#: wp-admin/includes/media.php:331 +msgid "\"%1$s\" from %2$s by %3$s." +msgstr "\"%1$s\" from %2$s by %3$s." + +#. translators: 1: Audio track title, 2: Album title. +#: wp-admin/includes/media.php:334 +msgid "\"%1$s\" from %2$s." +msgstr "\"%1$s\" from %2$s." + +#. translators: 1: Audio track title, 2: Artist name. +#: wp-admin/includes/media.php:337 +msgid "\"%1$s\" by %2$s." +msgstr "\"%1$s\" by %2$s." + +#. translators: %s: Audio track title. +#: wp-admin/includes/media.php:340 +msgid "\"%s\"." +msgstr "\"%s\"." + +#. translators: Post revisions heading. %s: The number of available revisions. +#: wp-admin/includes/meta-boxes.php:257 +msgid "Revisions: %s" +msgstr "Revisions: %s" + +#: wp-admin/includes/meta-boxes.php:259 +msgctxt "revisions" +msgid "Browse" +msgstr "Browse" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:401 +msgid "Autosave by %s" +msgstr "Autosave by %s" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:411 +msgid "Current Revision by %s" +msgstr "Current Revision by %s" + +#: wp-admin/includes/revision.php:439 +msgid "Restore This Autosave" +msgstr "Restore This Autosave" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:421 +msgid "Revision by %s" +msgstr "Revision by %s" + +#: wp-admin/edit-form-advanced.php:450 +msgid "Connection lost. Saving has been disabled until you’re reconnected." +msgstr "Connection lost. Saving has been disabled until you’re reconnected." + +#: wp-admin/edit-form-advanced.php:451 +msgid "We’re backing up this post in your browser, just in case." +msgstr "We’re backing up this post in your browser, just in case." + +#: wp-admin/includes/revision.php:453 +msgid "Sorry, something went wrong. The requested comparison could not be loaded." +msgstr "Sorry, something went wrong. The requested comparison could not be loaded." + +#: wp-admin/user-edit.php:653 +msgid "Repeat New Password" +msgstr "Repeat New Password" + +#: wp-admin/install.php:158 wp-admin/user-new.php:578 +msgid "Repeat Password" +msgstr "Repeat Password" + +#: wp-admin/includes/nav-menu.php:1035 +msgid "Add menu items from the column on the left." +msgstr "Add menu items from the column on the left." + +#. translators: %s: https://wordpress.org/plugins +#: wp-admin/includes/plugin-install.php:272 +msgid "Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the WordPress Plugin Directory or upload a plugin in .zip format by clicking the button at the top of this page." +msgstr "Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the WordPress Plugin Directory or upload a plugin in .zip format by clicking the button at the top of this page." + +#. Plugin URI of the plugin +msgid "http://wordpress.org/plugins/hello-dolly/" +msgstr "http://wordpress.org/plugins/hello-dolly/" + +#: wp-admin/includes/class-wp-upgrader.php:161 +msgid "The package contains no files." +msgstr "The package contains no files." + +#: wp-admin/includes/class-theme-upgrader.php:80 +msgid "The theme contains no files." +msgstr "The theme contains no files." + +#: wp-admin/revision.php:143 +msgid "To navigate between revisions, drag the slider handle left or right or use the Previous or Next buttons." +msgstr "To navigate between revisions, drag the slider handle left or right or use the Previous or Next buttons." + +#: wp-admin/includes/class-wp-debug-data.php:434 +#: wp-admin/includes/dashboard.php:1107 wp-admin/includes/dashboard.php:1297 +#: wp-admin/customize.php:147 +msgid "Loading…" +msgstr "Loading…" + +#: wp-admin/post.php:242 +msgid "The item you are trying to move to the Trash no longer exists." +msgstr "The item you are trying to move to the Bin no longer exists." + +#: wp-admin/post.php:279 +msgid "The item you are trying to restore from the Trash no longer exists." +msgstr "The item you are trying to restore from the Bin no longer exists." + +#: wp-admin/post.php:308 +msgid "This item has already been deleted." +msgstr "This item has already been deleted." + +#: wp-admin/nav-menus.php:984 +msgid "Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options." +msgstr "Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options." + +#: wp-admin/nav-menus.php:616 +msgid "If you haven’t yet created any menus, click the ’create a new menu’ link to get started" +msgstr "If you haven’t yet created any menus, click the ’create a new menu’ link to get started" + +#: wp-admin/revision.php:140 +msgid "This screen is used for managing your content revisions." +msgstr "This screen is used for managing your content revisions." + +#: wp-admin/revision.php:141 +msgid "Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added." +msgstr "Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added." + +#: wp-admin/revision.php:142 +msgid "From this screen you can review, compare, and restore revisions:" +msgstr "From this screen you can review, compare, and restore revisions:" + +#: wp-admin/revision.php:145 +msgid "To restore a revision, click Restore This Revision." +msgstr "To restore a revision, click Restore This Revision." + +#: wp-admin/includes/revision.php:391 +msgctxt "Followed by post revision info" +msgid "To:" +msgstr "To:" + +#: wp-admin/includes/revision.php:389 +msgctxt "Followed by post revision info" +msgid "From:" +msgstr "From:" + +#: wp-admin/includes/revision.php:362 +msgctxt "Button label for a previous revision" +msgid "Previous" +msgstr "Previous" + +#: wp-admin/includes/revision.php:366 +msgctxt "Button label for a next revision" +msgid "Next" +msgstr "Next" + +#: wp-admin/nav-menus.php:604 +msgid "Add, organize, and modify individual menu items" +msgstr "Add, organise, and modify individual menu items" + +#: wp-admin/nav-menus.php:631 +msgid "To reorganize menu items, drag and drop items with your mouse or use your keyboard. Drag or move a menu item a little to the right to make it a submenu" +msgstr "To reorganise menu items, drag and drop items with your mouse or use your keyboard. Drag or move a menu item a little to the right to make it a submenu" + +#: wp-admin/nav-menus.php:451 +msgid "Menu locations updated." +msgstr "Menu locations updated." + +#. translators: 1: Audio album title, 2: Artist name. +#: wp-admin/includes/media.php:346 +msgid "%1$s by %2$s." +msgstr "%1$s by %2$s." + +#. translators: Audio file track information. %d: Year of audio track release. +#: wp-admin/includes/media.php:358 +msgid "Released: %d." +msgstr "Released: %d." + +#. translators: Audio file track information. 1: Audio track number, 2: Total +#. audio tracks. +#: wp-admin/includes/media.php:366 +msgid "Track %1$s of %2$s." +msgstr "Track %1$s of %2$s." + +#. translators: Audio file genre information. %s: Audio genre name. +#: wp-admin/includes/media.php:375 +msgid "Genre: %s." +msgstr "Genre: %s." + +#: wp-admin/includes/media.php:3428 +msgid "Audio Format:" +msgstr "Audio Format:" + +#: wp-admin/includes/media.php:3429 +msgid "Audio Codec:" +msgstr "Audio Codec:" + +#: wp-admin/includes/post.php:1788 +msgid "Your latest changes were saved as a revision." +msgstr "Your latest changes were saved as a revision." + +#: wp-admin/nav-menus.php:602 wp-admin/themes.php:132 +msgid "From this screen you can:" +msgstr "From this screen you can:" + +#: wp-admin/nav-menus.php:603 +msgid "Create, edit, and delete menus" +msgstr "Create, edit, and delete menus" + +#: wp-admin/nav-menus.php:614 +msgid "The menu management box at the top of the screen is used to control which menu is opened in the editor below." +msgstr "The menu management box at the top of the screen is used to control which menu is opened in the editor below." + +#: wp-admin/nav-menus.php:615 +msgid "To edit an existing menu, choose a menu from the drop down and click Select" +msgstr "To edit an existing menu, choose a menu from the drop down and click Select" + +#: wp-admin/nav-menus.php:617 +msgid "You can assign theme locations to individual menus by selecting the desired settings at the bottom of the menu editor. To assign menus to all theme locations at once, visit the Manage Locations tab at the top of the screen." +msgstr "You can assign theme locations to individual menus by selecting the desired settings at the bottom of the menu editor. To assign menus to all theme locations at once, visit the Manage Locations tab at the top of the screen." + +#: wp-admin/nav-menus.php:622 +msgid "Menu Management" +msgstr "Menu Management" + +#: wp-admin/nav-menus.php:629 +msgid "Add one or several items at once by selecting the checkbox next to each item and clicking Add to Menu" +msgstr "Add one or several items at once by selecting the checkbox next to each item and clicking Add to Menu" + +#: wp-admin/nav-menus.php:632 +msgid "Delete a menu item by expanding it and clicking the Remove link" +msgstr "Delete a menu item by expanding it and clicking the Remove link" + +#: wp-admin/nav-menus.php:637 +msgid "Editing Menus" +msgstr "Editing Menus" + +#: wp-admin/nav-menus.php:642 +msgid "This screen is used for globally assigning menus to locations defined by your theme." +msgstr "This screen is used for globally assigning menus to locations defined by your theme." + +#: wp-admin/nav-menus.php:643 +msgid "To assign menus to one or more theme locations, select a menu from each location’s drop down. When you’re finished, click Save Changes" +msgstr "To assign menus to one or more theme locations, select a menu from each location’s drop down. When you’re finished, click Save Changes" + +#: wp-admin/nav-menus.php:644 +msgid "To edit a menu currently assigned to a theme location, click the adjacent ’Edit’ link" +msgstr "To edit a menu currently assigned to a theme location, click the adjacent ’Edit’ link" + +#: wp-admin/nav-menus.php:645 +msgid "To add a new menu instead of assigning an existing one, click the ’Use new menu’ link. Your new menu will be automatically assigned to that theme location" +msgstr "To add a new menu instead of assigning an existing one, click the ’Use new menu’ link. Your new menu will be automatically assigned to that theme location" + +#: wp-admin/nav-menus.php:697 +msgid "Edit Menus" +msgstr "Edit Menus" + +#: wp-admin/nav-menus.php:708 +msgid "Manage Locations" +msgstr "Manage Locations" + +#: wp-admin/nav-menus.php:739 +msgid "Theme Location" +msgstr "Theme Location" + +#: wp-admin/nav-menus.php:740 +msgid "Assigned Menu" +msgstr "Assigned Menu" + +#: wp-admin/nav-menus.php:749 +msgid "Select a Menu" +msgstr "Select a Menu" + +#: wp-admin/nav-menus.php:780 +msgctxt "menu" +msgid "Edit" +msgstr "Edit" + +#: wp-admin/nav-menus.php:799 +msgctxt "menu" +msgid "Use new menu" +msgstr "Use new menu" + +#: wp-admin/nav-menus.php:627 +msgid "Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below." +msgstr "Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below." + +#: wp-admin/nav-menus.php:594 +msgid "This screen is used for managing your navigation menus." +msgstr "This screen is used for managing your navigation menus." + +#: wp-admin/includes/revision.php:441 +msgid "Restore This Revision" +msgstr "Restore This Revision" + +#: wp-admin/user-edit.php:824 +msgid "Capabilities" +msgstr "Capabilities" + +#. translators: %s: Capability name. +#: wp-admin/user-edit.php:838 +msgid "Denied: %s" +msgstr "Denied: %s" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:246 +msgid "Move" +msgstr "Move" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:247 +msgid "Up one" +msgstr "Up one" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:248 +msgid "Down one" +msgstr "Down one" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:251 +msgid "To the top" +msgstr "To the top" + +#: wp-admin/nav-menus.php:1017 wp-admin/network/settings.php:473 +msgid "Menu Settings" +msgstr "Menu Settings" + +#: wp-admin/nav-menus.php:940 +msgid "Menu structure" +msgstr "Menu structure" + +#. translators: 1: Post creation date, 2: Post creation time. +#: wp-admin/includes/ajax-actions.php:1564 +msgid "Draft created on %1$s at %2$s" +msgstr "Draft created on %1$s at %2$s" + +#. translators: %s: User's display name. +#: wp-admin/post.php:257 +msgid "You cannot move this item to the Trash. %s is currently editing." +msgstr "You cannot move this item to the Bin. %s is currently editing." + +#. translators: %s: User's display name. +#: wp-admin/includes/misc.php:1128 +msgid "%s has taken over and is currently editing." +msgstr "%s has taken over and is currently editing." + +#: wp-admin/nav-menus.php:850 +msgid "Select a menu to edit:" +msgstr "Select a menu to edit:" + +#. translators: %s: URL to Upgrade Network screen. +#: wp-admin/includes/ms.php:708 +msgid "Thank you for Updating! Please visit the Upgrade Network page to update all your sites." +msgstr "Thank you for Updating! Please visit the Upgrade Network page to update all your sites." + +#: wp-admin/setup-config.php:449 +msgid "All right, sparky! You’ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to…" +msgstr "All right, sunshine! You’ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to…" + +#: wp-admin/includes/class-wp-debug-data.php:836 +msgid "Client version" +msgstr "Client version" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:121 +msgid "sub item" +msgstr "sub item" + +#: wp-admin/nav-menus.php:310 +msgid "Selected menus have been successfully deleted." +msgstr "Selected menus have been successfully deleted." + +#: wp-admin/nav-menus.php:1033 +msgid "Auto add pages" +msgstr "Auto add pages" + +#: wp-admin/nav-menus.php:1002 +msgid "Give your menu a name, then click Create Menu." +msgstr "Give your menu a name, then click Create Menu." + +#: wp-admin/nav-menus.php:982 +msgid "Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes." +msgstr "Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes." + +#: wp-admin/plugin-editor.php:128 +msgid "The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function." +msgstr "The Documentation menu below the editor lists the PHP functions recognised in the plugin file. Clicking Look Up takes you to a web page about that particular function." + +#: wp-admin/theme-editor.php:31 +msgid "For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function." +msgstr "For PHP files, you can use the Documentation dropdown to select from functions recognised in that file. Look Up takes you to a web page with reference material about that particular function." + +#: wp-admin/theme-editor.php:295 wp-admin/plugin-editor.php:274 +msgid "Look Up" +msgstr "Look Up" + +#. translators: %s: User's display name. +#: wp-admin/includes/misc.php:1078 +#: wp-admin/includes/class-wp-posts-list-table.php:1011 +msgid "%s is currently editing" +msgstr "%s is currently editing" + +#: wp-admin/edit-form-advanced.php:361 +msgid "You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the “Create a new gallery” button." +msgstr "You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the “Create a new gallery” button." + +#: wp-admin/includes/image-edit.php:70 +msgid "Image rotation is not supported by your web host." +msgstr "Image rotation is not supported by your web host." + +#. translators: %s: URL to install the Link Manager plugin. +#: wp-admin/includes/bookmark.php:347 +msgid "If you are looking to use the link manager, please install the Link Manager plugin." +msgstr "If you are looking to use the link manager, please install the Link Manager plugin." + +#: wp-admin/edit-form-advanced.php:282 +msgid "The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen." +msgstr "The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimise or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen." + +#: wp-admin/includes/class-custom-image-header.php:128 +msgid "Don’t forget to click “Save Changes” when you’re done!" +msgstr "Don’t forget to click “Save Changes” when you’re done!" + +#: wp-admin/edit-form-advanced.php:367 +msgid "Inserting Media" +msgstr "Inserting Media" + +#: wp-admin/edit-form-advanced.php:374 +msgid "Several boxes on this screen contain settings for how your content will be published, including:" +msgstr "Several boxes on this screen contain settings for how your content will be published, including:" + +#: wp-admin/includes/class-custom-background.php:91 +msgid "To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the “Choose Image” button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site." +msgstr "To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the “Choose Image” button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site." + +#: wp-admin/widgets.php:77 +msgid "When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved." +msgstr "When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved." + +#: wp-admin/edit-tags.php:288 +msgid "Parent — Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown." +msgstr "Parent — Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown." + +#. translators: 1: URL to browser uploader, 2: Additional link attributes. +#: wp-admin/includes/media.php:3019 +msgid "You are using the multi-file uploader. Problems? Try the browser uploader instead." +msgstr "You are using the multi-file uploader. Problems? Try the browser uploader instead." + +#: wp-admin/async-upload.php:56 +msgctxt "media item" +msgid "Edit" +msgstr "Edit" + +#. translators: %s: Default text color. +#: wp-admin/includes/class-custom-image-header.php:738 +msgctxt "color" +msgid "Default: %s" +msgstr "Default: %s" + +#: wp-admin/includes/class-wp-media-list-table.php:341 +msgctxt "column name" +msgid "Uploaded to" +msgstr "Uploaded to" + +#: wp-admin/includes/class-custom-background.php:492 +#: wp-admin/includes/class-custom-image-header.php:899 +#: wp-admin/includes/ajax-actions.php:2540 +msgid "The uploaded file is not a valid image. Please try again." +msgstr "The uploaded file is not a valid image. Please try again." + +#: wp-admin/includes/class-custom-background.php:338 +msgid "Choose a Background Image" +msgstr "Choose a Background Image" + +#: wp-admin/includes/class-custom-image-header.php:631 +msgid "Choose a Custom Header" +msgstr "Choose a Custom Header" + +#: wp-admin/includes/class-custom-background.php:92 +msgid "You can also choose a background color by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker." +msgstr "You can also choose a background colour by clicking the Select Colour button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a colour using the colour picker." + +#: wp-admin/includes/class-custom-image-header.php:127 +msgid "In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker." +msgstr "In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a colour for the text by clicking the Select Colour button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a colour using the colour picker." + +#: wp-admin/includes/dashboard.php:1946 +msgid "More Actions" +msgstr "More Actions" + +#: wp-admin/includes/dashboard.php:1955 +msgid "Turn comments on or off" +msgstr "Turn comments on or off" + +#: wp-admin/includes/dashboard.php:1957 +msgid "Learn more about getting started" +msgstr "Learn more about getting started" + +#: wp-admin/edit-comments.php:186 +msgid "In the In response to column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post." +msgstr "In the In response to column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post." + +#. translators: Storage space that's been used. 1: Percentage of used space, 2: +#. Total space allowed in megabytes or gigabytes. +#: wp-admin/includes/ms.php:259 +msgid "Used: %1$s%% of %2$s" +msgstr "Used: %1$s%% of %2$s" + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:294 +msgid "ID #%1$s: %2$s The current user will not be deleted." +msgstr "ID #%1$s: %2$s The current user will not be deleted." + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:297 wp-admin/users.php:435 +msgid "ID #%1$s: %2$s" +msgstr "ID #%1$s: %2$s" + +#: wp-admin/users.php:277 +msgid "Please select an option." +msgstr "Please select an option." + +#: wp-admin/options-reading.php:206 wp-admin/install.php:201 +msgid "It is up to search engines to honor this request." +msgstr "It is up to search engines to honour this request." + +#: wp-admin/includes/dashboard.php:1908 +msgid "Welcome to WordPress!" +msgstr "Welcome to WordPress!" + +#: wp-admin/includes/dashboard.php:1909 +msgid "We’ve assembled some links to get you started:" +msgstr "We’ve assembled some links to get you started:" + +#: wp-admin/includes/dashboard.php:1913 +msgid "Get Started" +msgstr "Get Started" + +#. translators: %s: URL to Themes panel in Customizer or Themes screen. +#: wp-admin/includes/dashboard.php:1922 +msgid "or, change your theme completely" +msgstr "or, change your theme completely" + +#: wp-admin/includes/dashboard.php:1928 +msgid "Next Steps" +msgstr "Next Steps" + +#: wp-admin/includes/dashboard.php:1931 wp-admin/includes/dashboard.php:1934 +msgid "Edit your front page" +msgstr "Edit your front page" + +#: wp-admin/includes/dashboard.php:1932 wp-admin/includes/dashboard.php:1935 +msgid "Add additional pages" +msgstr "Add additional pages" + +#: wp-admin/includes/dashboard.php:1936 +msgid "Add a blog post" +msgstr "Add a blog post" + +#: wp-admin/includes/dashboard.php:1938 +msgid "Write your first blog post" +msgstr "Write your first blog post" + +#: wp-admin/includes/dashboard.php:1939 +msgid "Add an About page" +msgstr "Add an About page" + +#: wp-admin/includes/dashboard.php:1942 +msgid "View your site" +msgstr "View your site" + +#: wp-admin/includes/plugin-install.php:372 +msgid "If you have marked plugins as favorites on WordPress.org, you can browse them here." +msgstr "If you have marked plugins as favourites on WordPress.org, you can browse them here." + +#: wp-admin/includes/plugin-install.php:376 wp-admin/theme-install.php:199 +msgid "Your WordPress.org username:" +msgstr "Your WordPress.org username:" + +#: wp-admin/includes/plugin-install.php:378 wp-admin/theme-install.php:202 +msgid "Get Favorites" +msgstr "Get Favourites" + +#. translators: 1: WordPress version, 2: URL to About screen. +#: wp-admin/includes/update-core.php:1442 wp-admin/update-core.php:857 +msgid "Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click here." +msgstr "Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click here." + +#: wp-admin/options-reading.php:183 wp-admin/install.php:190 +msgid "Allow search engines to index this site" +msgstr "Allow search engines to index this site" + +#: wp-admin/options-reading.php:185 wp-admin/options-reading.php:205 +#: wp-admin/install.php:192 wp-admin/install.php:200 +msgid "Discourage search engines from indexing this site" +msgstr "Discourage search engines from indexing this site" + +#: wp-admin/setup-config.php:214 +msgid "Below you should enter your database connection details. If you’re not sure about these, contact your host." +msgstr "Below you should enter your database connection details. If you’re not sure about these, contact your host." + +#: wp-admin/plugin-install.php:100 +msgid "If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag." +msgstr "If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labelled with that tag." + +#: wp-admin/plugin-install.php:102 +msgid "You can also browse a user’s favorite plugins, by using the Favorites link above the plugins list and entering their WordPress.org username." +msgstr "You can also browse a user’s favourite plugins, by using the Favourites link above the plugins list and entering their WordPress.org username." + +#: wp-admin/plugin-install.php:103 +msgid "If you want to install a plugin that you’ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin." +msgstr "If you want to install a plugin that you’ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin." + +#: wp-admin/setup-config.php:417 +msgid "After you’ve done that, click “Run the installation”." +msgstr "After you’ve done that, click “Run the installation”." + +#: wp-admin/includes/dashboard.php:381 +msgid "Search engines discouraged" +msgstr "Search engines discouraged" + +#: wp-admin/options-reading.php:43 wp-admin/options-reading.php:179 +#: wp-admin/options-reading.php:180 wp-admin/install.php:182 +#: wp-admin/install.php:185 +msgid "Search engine visibility" +msgstr "Search engine visibility" + +#. translators: 1: Link to documentation on child themes, 2: Name of parent +#. theme. +#: wp-admin/includes/class-wp-themes-list-table.php:285 +msgid "This child theme requires its parent theme, %2$s." +msgstr "This child theme requires its parent theme, %2$s." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:112 +msgctxt "Plugin Installer" +msgid "Favorites" +msgstr "Favourites" + +#: wp-admin/theme-install.php:119 +msgid "To install the theme so you can preview it with your site’s content and customize its theme options, click the \"Install\" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the \"Activate\" link, or by navigating to your Manage Themes screen and clicking the \"Live Preview\" link under any installed theme’s thumbnail image." +msgstr "To install the theme so you can preview it with your site’s content and customise its theme options, click the \"Install\" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the \"Activate\" link, or by navigating to your Manage Themes screen and clicking the \"Live Preview\" link under any installed theme’s thumbnail image." + +#: wp-admin/includes/widgets.php:262 +msgctxt "widget" +msgid "Add" +msgstr "Add" + +#: wp-admin/includes/widgets.php:261 +msgctxt "widget" +msgid "Edit" +msgstr "Edit" + +#: wp-admin/includes/theme-install.php:117 +msgid "Search by tag" +msgstr "Search by tag" + +#: wp-admin/includes/theme-install.php:114 +msgid "Search by author" +msgstr "Search by author" + +#: wp-admin/includes/theme-install.php:111 +#: wp-admin/includes/theme-install.php:123 +msgid "Search by keyword" +msgstr "Search by keyword" + +#: wp-admin/includes/theme-install.php:101 +msgid "Type of search" +msgstr "Type of search" + +#: wp-admin/includes/class-wp-screen.php:1064 +msgid "Screen Options Tab" +msgstr "Screen Options Tab" + +#: wp-admin/includes/class-wp-screen.php:870 +msgid "Contextual Help Tab" +msgstr "Contextual Help Tab" + +#: wp-admin/includes/class-wp-comments-list-table.php:858 +msgid "Select comment" +msgstr "Select comment" + +#. translators: %s: Link name. +#. translators: %s: Plugin name. +#. translators: %s: Taxonomy term name. +#. translators: %s: User login. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#. translators: %s: Theme name. +#. translators: %s: Site URL. +#: wp-admin/includes/class-wp-links-list-table.php:177 +#: wp-admin/includes/class-wp-plugins-list-table.php:961 +#: wp-admin/includes/class-wp-terms-list-table.php:372 +#: wp-admin/includes/class-wp-users-list-table.php:494 +#: wp-admin/includes/class-wp-media-list-table.php:386 +#: wp-admin/includes/class-wp-posts-list-table.php:933 +#: wp-admin/update-core.php:541 wp-admin/update-core.php:705 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:409 +#: wp-admin/includes/class-wp-ms-users-list-table.php:241 +msgid "Select %s" +msgstr "Select %s" + +#. translators: %s: URL to Categories to Tags Converter tool. +#: wp-admin/edit-tags.php:627 +msgid "Tags can be selectively converted to categories using the tag to category converter." +msgstr "Tags can be selectively converted to categories using the tag to category converter." + +#: wp-admin/edit-tags.php:260 +msgid "You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category." +msgstr "You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category." + +#: wp-admin/includes/class-custom-image-header.php:551 +msgid "You can select an image to be shown at the top of your site by uploading from your computer or choosing from your media library. After selecting an image you will be able to crop it." +msgstr "You can select an image to be shown at the top of your site by uploading from your computer or choosing from your media library. After selecting an image you will be able to crop it." + +#: wp-admin/menu-header.php:287 +msgid "Skip to main content" +msgstr "Skip to main content" + +#: wp-admin/edit-form-advanced.php:324 +msgid "Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box." +msgstr "Creating a Page is very similar to creating a Post, and the screens can be customised in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box." + +#: wp-admin/includes/class-custom-image-header.php:109 +msgid "You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the “Choose Image” button." +msgstr "You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the “Choose Image” button." + +#: wp-admin/includes/class-custom-image-header.php:878 +msgid "Skip Cropping, Publish Image as Is" +msgstr "Skip Cropping, Publish Image as Is" + +#: wp-admin/includes/class-custom-background.php:326 +#: wp-admin/includes/class-custom-image-header.php:549 +msgid "Select Image" +msgstr "Select Image" + +#: wp-admin/includes/class-custom-background.php:336 +#: wp-admin/includes/class-custom-image-header.php:628 +msgid "Or choose an image from your media library:" +msgstr "Or choose an image from your media library:" + +#: wp-admin/includes/class-custom-background.php:339 +#: wp-admin/includes/class-custom-image-header.php:632 +msgid "Choose Image" +msgstr "Choose Image" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:394 +#: wp-admin/theme-install.php:527 +msgid "Collapse" +msgstr "Collapse" + +#: wp-admin/includes/class-custom-image-header.php:112 +msgid "If you don’t want a header image to be displayed on your site at all, click the “Remove Header Image” button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click “Save Changes”." +msgstr "If you don’t want a header image to be displayed on your site at all, click the “Remove Header Image” button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click “Save Changes”." + +#: wp-admin/media.php:70 +msgid "You attempted to edit an item that isn’t an attachment. Please go back and try again." +msgstr "You attempted to edit an item that isn’t an attachment. Please go back and try again." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:606 +msgctxt "plugin" +msgid "Installed" +msgstr "Installed" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:316 +#: wp-admin/includes/class-wp-theme-install-list-table.php:474 +msgid "This theme is already installed and is up to date" +msgstr "This theme is already installed and is up to date" + +#: wp-admin/theme-install.php:118 +msgid "Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you’re interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look." +msgstr "Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you’re interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look." + +#: wp-admin/theme-install.php:124 +msgid "Previewing and Installing" +msgstr "Previewing and Installing" + +#: wp-admin/themes.php:179 +msgid "Previewing and Customizing" +msgstr "Previewing and Customising" + +#: wp-admin/includes/media.php:3036 +msgid "You are using the browser’s built-in file uploader. The WordPress uploader includes multiple file selection and drag and drop capability. Switch to the multi-file uploader." +msgstr "You are using the browser’s built-in file uploader. The WordPress uploader includes multiple file selection and drag and drop capability. Switch to the multi-file uploader." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-theme-install-list-table.php:336 +msgid "Preview %s" +msgstr "Preview %s" + +#: wp-admin/tools.php:48 +msgid "Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content." +msgstr "Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realise that the other would work better for their content." + +#: wp-admin/tools.php:49 +msgid "The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin & Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa." +msgstr "The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin & Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa." + +#: wp-admin/includes/class-custom-image-header.php:99 +msgid "This screen is used to customize the header section of your theme." +msgstr "This screen is used to customise the header section of your theme." + +#: wp-admin/includes/class-custom-image-header.php:100 +msgid "You can choose from the theme’s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed." +msgstr "You can choose from the theme’s default header images, or use one of your own. You can also customise how your Site Title and Tagline are displayed." + +#: wp-admin/includes/class-custom-image-header.php:110 +msgid "Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the “Save Changes” button." +msgstr "Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the “Save Changes” button." + +#: wp-admin/includes/class-custom-image-header.php:111 +msgid "If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the “Random” radio button next to the Uploaded Images or Default Images section to enable this feature." +msgstr "If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the “Random” radio button next to the Uploaded Images or Default Images section to enable this feature." + +#. translators: %s: URL to General Settings screen. +#: wp-admin/includes/class-custom-image-header.php:123 +msgid "For most themes, the header text is your Site Title and Tagline, as defined in the General Settings section." +msgstr "For most themes, the header text is your Site Title and Tagline, as defined in the General Settings section." + +#: wp-admin/install.php:293 wp-admin/install.php:306 +msgid "Configuration Error" +msgstr "Configuration Error" + +#: wp-admin/media-new.php:54 +msgid "Revert to the Browser Uploader by clicking the link below the drag and drop box." +msgstr "Revert to the Browser Uploader by clicking the link below the drag and drop box." + +#: wp-admin/users.php:487 wp-admin/network/users.php:250 +msgid "User deleted." +msgstr "User deleted." + +#: wp-admin/includes/class-core-upgrader.php:36 wp-admin/includes/file.php:1546 +#: wp-admin/includes/file.php:1673 +msgid "Could not copy files. You may have run out of disk space." +msgstr "Could not copy files. You may have run out of disk space." + +#: wp-admin/includes/theme-install.php:95 +msgid "Search for themes by keyword." +msgstr "Search for themes by keyword." + +#: wp-admin/includes/theme-install.php:140 +msgid "Find a theme based on specific features." +msgstr "Find a theme based on specific features." + +#: wp-admin/setup-config.php:198 +msgid "In all likelihood, these items were supplied to you by your Web Host. If you don’t have this information, then you will need to contact them before you can continue. If you’re all ready…" +msgstr "In all likelihood, these items were supplied to you by your Web Host. If you don’t have this information, then you will need to contact them before you can continue. If you’re all ready…" + +#: wp-admin/theme-editor.php:246 +msgid "This theme is broken." +msgstr "This theme is broken." + +#: wp-admin/includes/class-custom-background.php:339 +msgid "Set as background" +msgstr "Set as background" + +#: wp-admin/includes/class-custom-image-header.php:632 +msgid "Set as header" +msgstr "Set as header" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-upgrader-skin.php:94 +msgid "Customize “%s”" +msgstr "Customise “%s”" + +#: wp-admin/edit-comments.php:308 wp-admin/edit-comments.php:314 +msgid "Edit comment" +msgstr "Edit comment" + +#: wp-admin/includes/class-wp-media-list-table.php:174 +#: wp-admin/includes/class-wp-media-list-table.php:752 +#: wp-admin/includes/class-wp-comments-list-table.php:366 +#: wp-admin/includes/class-wp-comments-list-table.php:750 +#: wp-admin/includes/class-wp-posts-list-table.php:408 +#: wp-admin/includes/class-wp-posts-list-table.php:1366 +msgid "Restore" +msgstr "Restore" + +#: wp-admin/includes/media.php:2569 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:370 +msgid "Actions" +msgstr "Actions" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:392 +#: wp-admin/theme-install.php:69 wp-admin/theme-install.php:525 +msgid "Collapse Sidebar" +msgstr "Collapse Sidebar" + +#: wp-admin/link.php:111 +msgid "Edit Link" +msgstr "Edit Link" + +#: wp-admin/includes/class-wp-plugins-list-table.php:462 +msgid "Plugin" +msgstr "Plugin" + +#: wp-admin/includes/image-edit.php:132 +msgid "Scale" +msgstr "Scale" + +#: wp-admin/includes/media.php:1403 +msgid "Link URL" +msgstr "Link URL" + +#: wp-admin/includes/media.php:1406 wp-admin/includes/media.php:2980 +msgid "Enter a link URL or click above for presets." +msgstr "Enter a link URL or click above for presets." + +#: wp-admin/includes/class-wp-themes-list-table.php:279 +#: wp-admin/includes/class-wp-theme-install-list-table.php:509 +#: wp-admin/includes/plugin-install.php:654 +msgid "Version:" +msgstr "Version:" + +#. translators: %s: Number of words. +#: wp-admin/edit-form-advanced.php:614 +msgid "Word count: %s" +msgstr "Word count: %s" + +#: wp-admin/install.php:159 wp-admin/user-new.php:507 wp-admin/user-new.php:511 +#: wp-admin/user-new.php:558 wp-admin/user-new.php:578 +#: wp-admin/user-edit.php:458 wp-admin/user-edit.php:506 +msgid "(required)" +msgstr "(required)" + +#: wp-admin/includes/meta-boxes.php:862 +msgid "No comments yet." +msgstr "No comments yet." + +#: wp-admin/options-general.php:337 wp-admin/options-general.php:374 +msgid "Preview:" +msgstr "Preview:" + +#: wp-admin/includes/class-wp-list-table.php:1192 +#: wp-admin/includes/nav-menu.php:663 wp-admin/includes/nav-menu.php:894 +#: wp-admin/update-core.php:453 wp-admin/update-core.php:573 +#: wp-admin/update-core.php:615 wp-admin/update-core.php:737 +msgid "Select All" +msgstr "Select all" + +#: wp-admin/credits.php:66 +msgid "https://wordpress.org/about/" +msgstr "https://en-gb.wordpress.org/about/" + +#: wp-admin/includes/user.php:151 +msgid "Error: Please enter a nickname." +msgstr "Error: please enter a nickname." + +#: wp-admin/includes/meta-boxes.php:59 wp-admin/js/post.js:828 +msgid "Save as Pending" +msgstr "Save as Pending" + +#: wp-admin/includes/meta-boxes.php:108 wp-admin/includes/meta-boxes.php:143 +#: wp-admin/js/post.js:797 wp-admin/js/post.js:799 +msgid "Privately Published" +msgstr "Privately Published" + +#: wp-admin/includes/meta-boxes.php:175 wp-admin/js/post.js:874 +msgid "Public, Sticky" +msgstr "Public, Sticky" + +#: wp-admin/includes/theme-install.php:103 +#: wp-admin/includes/plugin-install.php:333 +msgid "Keyword" +msgstr "Keyword" + +#: wp-admin/includes/class-theme-upgrader.php:85 +msgid "This theme requires a parent theme. Checking if it is installed…" +msgstr "This theme requires a parent theme. Checking if it is installed…" + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:87 +msgid "Preparing to install %1$s %2$s…" +msgstr "Preparing to install %1$s %2$s…" + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:89 +msgid "The parent theme, %1$s %2$s, is currently installed." +msgstr "The parent theme, %1$s %2$s, is currently installed." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:91 +msgid "Successfully installed the parent theme, %1$s %2$s." +msgstr "Successfully installed the parent theme, %1$s %2$s." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-upgrader.php:93 +msgid "The parent theme could not be found. You will need to install the parent theme, %s, before you can use this child theme." +msgstr "The parent theme could not be found. You will need to install the parent theme, %s, before you can use this child theme." + +#: wp-admin/includes/class-custom-image-header.php:119 +#: wp-admin/includes/class-custom-image-header.php:702 +#: wp-admin/includes/class-custom-image-header.php:707 +msgid "Header Text" +msgstr "Header Text" + +#: wp-admin/includes/class-custom-image-header.php:710 +msgid "Show header text with your image." +msgstr "Show header text with your image." + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number, 5: Update URL, 6: Additional link attributes. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number, 5: Update URL, 6: Additional link attributes. +#: wp-admin/includes/theme.php:230 wp-admin/includes/update.php:504 +#: wp-admin/includes/update.php:696 +msgid "There is a new version of %1$s available. View version %4$s details or update now." +msgstr "There is a new version of %1$s available. View version %4$s details or update now." + +#. translators: %s: Plugin author. +#: wp-admin/includes/plugin.php:214 +msgid "By %s." +msgstr "By %s." + +#: wp-admin/includes/template.php:455 +msgid "Add new Comment" +msgstr "Add new Comment" + +#: wp-admin/includes/meta-boxes.php:848 wp-admin/includes/template.php:494 +msgid "Add Comment" +msgstr "Add Comment" + +#. Description of the plugin +msgid "This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from Hello, Dolly in the upper right of your admin screen on every page." +msgstr "This is not just a plugin, it symbolises the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from Hello, Dolly in the upper right of your admin screen on every page." + +#. Plugin Name of the plugin +msgid "Hello Dolly" +msgstr "Hello Dolly" + +#. Author URI of the plugin +msgid "http://ma.tt/" +msgstr "https://ma.tt/" + +#: wp-admin/index.php:76 +msgid "Welcome — Shows links for some of the most common tasks when setting up a new site." +msgstr "Welcome — Shows links for some of the most common tasks when setting up a new site." + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/theme.php:217 wp-admin/includes/update.php:683 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this theme." +msgstr "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this theme." + +#: wp-admin/install.php:108 wp-admin/install.php:357 +msgctxt "Howdy" +msgid "Welcome" +msgstr "Welcome" + +#. translators: %s: Network title. +#: wp-admin/ms-delete-site.php:26 +msgid "Thank you for using %s, your site has been deleted. Happy trails to you until we meet again." +msgstr "Thank you for using %s, your site has been deleted. Cheerio!" + +#: wp-admin/ms-delete-site.php:131 +msgid "Delete My Site Permanently" +msgstr "Delete My Site Permanently" + +#: wp-admin/ms-delete-site.php:117 +msgid "Remember, once deleted your site cannot be restored." +msgstr "Remember, once deleted your site cannot be restored." + +#: wp-admin/ms-delete-site.php:31 +msgid "Sorry, the link you clicked is stale. Please select another option." +msgstr "Sorry, the link you clicked is stale. Please select another option." + +#. translators: %s: Network title. +#: wp-admin/ms-delete-site.php:112 +msgid "If you do not want to use your %s site any more, you can delete it using the form below. When you click Delete My Site Permanently you will be sent an email with a link in it. Click on this link to delete your site." +msgstr "If you do not want to use your %s site any more, you can delete it using the form below. When you click Delete My Site Permanently you will be sent an email with a link in it. Click on this link to delete your site." + +#: wp-admin/ms-delete-site.php:103 +msgid "Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked." +msgstr "Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked." + +#. translators: %s: Site address. +#: wp-admin/ms-delete-site.php:126 +msgid "I'm sure I want to permanently delete my site, and I am aware I can never get it back or use %s again." +msgstr "I'm sure I want to permanently delete my site, and I am aware I can never get it back or use %s again." + +#: wp-admin/includes/ms.php:607 +msgid "Visit Dashboard" +msgstr "Visit Dashboard" + +#: wp-admin/includes/ms.php:601 +msgid "Your Sites" +msgstr "Your Sites" + +#: wp-admin/includes/ms.php:599 +msgid "If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way." +msgstr "If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way." + +#. translators: 1: Site title. +#: wp-admin/includes/ms.php:587 wp-admin/includes/ms.php:596 +msgid "You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator." +msgstr "You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator." + +#: wp-admin/includes/ms.php:302 +msgid "MB (Leave blank for network default)" +msgstr "MB (Leave blank for network default)" + +#: wp-admin/includes/ms.php:608 +msgid "View Site" +msgstr "View Site" + +#. translators: My Sites label. +#: wp-admin/includes/ms.php:765 +msgid "Primary Site" +msgstr "Primary Site" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:546 +msgid "Paused (%s)" +msgid_plural "Paused (%s)" +msgstr[0] "Paused (%s)" +msgstr[1] "Paused (%s)" + +#: wp-admin/includes/class-wp-debug-data.php:200 +#: wp-admin/includes/class-wp-debug-data.php:210 +#: wp-admin/includes/class-wp-debug-data.php:219 +#: wp-admin/includes/class-wp-debug-data.php:228 +#: wp-admin/includes/class-wp-debug-data.php:237 +#: wp-admin/includes/class-wp-debug-data.php:277 +#: wp-admin/includes/class-wp-debug-data.php:282 +#: wp-admin/includes/class-wp-debug-data.php:292 +#: wp-admin/includes/class-wp-debug-data.php:297 +#: wp-admin/includes/class-wp-debug-data.php:548 +#: wp-admin/includes/class-wp-debug-data.php:1133 +#: wp-admin/includes/class-wp-debug-data.php:1219 +msgid "Disabled" +msgstr "Disabled" + +#. translators: New admin email address notification email subject. %s: Site +#. title. +#: wp-admin/includes/misc.php:1410 +msgid "[%s] New Admin Email Address" +msgstr "[%s] New Admin Email Address" + +#: wp-admin/includes/ms.php:651 +msgid "American English" +msgstr "US English" + +#: wp-admin/includes/ms.php:655 +msgid "British English" +msgstr "UK English" + +#: wp-admin/my-sites.php:77 +msgid "You must be a member of at least one site to use this page." +msgstr "You must be a member of at least one site to use this page." + +#: wp-admin/my-sites.php:112 +msgid "Global Settings" +msgstr "Global Settings" + +#: wp-admin/my-sites.php:33 +msgid "The primary site you chose does not exist." +msgstr "The primary site you chose does not exist." + +#: wp-admin/setup-config.php:114 +msgid "WordPress › Setup Configuration File" +msgstr "WordPress › Setup Configuration File" + +#: wp-admin/setup-config.php:164 +msgid "Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding." +msgstr "Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding." + +#: wp-admin/includes/class-wp-debug-data.php:853 wp-admin/setup-config.php:166 +msgid "Database name" +msgstr "Database name" + +#: wp-admin/includes/class-wp-debug-data.php:841 wp-admin/setup-config.php:167 +msgid "Database username" +msgstr "Database username" + +#: wp-admin/setup-config.php:168 +msgid "Database password" +msgstr "Database password" + +#: wp-admin/includes/class-wp-debug-data.php:847 wp-admin/setup-config.php:169 +msgid "Database host" +msgstr "Database host" + +#: wp-admin/setup-config.php:170 +msgid "Table prefix (if you want to run more than one WordPress in a single database)" +msgstr "Table prefix (if you want to run more than one WordPress in a single database)" + +#: wp-admin/setup-config.php:200 +msgid "Let’s go!" +msgstr "Let’s go!" + +#: wp-admin/setup-config.php:217 +msgid "Database Name" +msgstr "Database Name" + +#: wp-admin/setup-config.php:223 +msgctxt "example username" +msgid "username" +msgstr "username" + +#: wp-admin/setup-config.php:228 +msgctxt "example password" +msgid "password" +msgstr "password" + +#: wp-admin/setup-config.php:232 +msgid "Database Host" +msgstr "Database Host" + +#: wp-admin/setup-config.php:242 +msgid "Table Prefix" +msgstr "Table Prefix" + +#: wp-admin/setup-config.php:244 +msgid "If you want to run multiple WordPress installations in a single database, change this." +msgstr "If you want to run multiple WordPress installations in a single database, change this." + +#. translators: 1: wp-config.php, 2: install.php +#: wp-admin/setup-config.php:63 +msgid "The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." +msgstr "The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." + +#. translators: %s: wp-config-sample.php +#: wp-admin/setup-config.php:52 +msgid "Sorry, I need a %s file to work from. Please re-upload this file to your WordPress installation." +msgstr "Sorry, I need a %s file to work from. Please re-upload this file to your WordPress installation." + +#. translators: 1: wp-config.php, 2: install.php +#: wp-admin/setup-config.php:76 +msgid "The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." +msgstr "The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." + +#. translators: %s: wp-config.php +#: wp-admin/maint/repair.php:35 +msgid "To allow use of this page to automatically repair database problems, please add the following line to your %s file. Once this line is added to your config, reload this page." +msgstr "To allow use of this page to automatically repair database problems, please add the following line to your %s file. Once this line is added to your config, reload this page." + +#: wp-admin/includes/class-wp-comments-list-table.php:219 +msgid "No comments awaiting moderation." +msgstr "No comments awaiting moderation." + +#: wp-admin/includes/plugin-install.php:573 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Changelog" + +#: wp-admin/includes/plugin-install.php:575 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Other Notes" + +#: wp-admin/includes/plugin-install.php:571 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: wp-admin/includes/plugin-install.php:570 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installation" + +#: wp-admin/includes/plugin-install.php:569 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Description" + +#: wp-admin/includes/plugin-install.php:572 +msgctxt "Plugin installer section title" +msgid "Screenshots" +msgstr "Screenshots" + +#: wp-admin/includes/plugin-install.php:702 +msgid "Plugin Homepage »" +msgstr "Plugin Homepage »" + +#. translators: 1: Table name, 2: Error message. +#: wp-admin/maint/repair.php:114 +msgid "Failed to repair the %1$s table. Error: %2$s" +msgstr "Failed to repair the %1$s table. Error: %2$s" + +#: wp-admin/export.php:50 +msgid "You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status." +msgstr "You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status." + +#: wp-admin/user-new.php:260 +msgid "New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you don’t want the user to receive a welcome email." +msgstr "New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you don’t want the user to receive a welcome email." + +#: wp-admin/includes/image-edit.php:251 +msgid "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." +msgstr "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." + +#: wp-admin/import.php:25 +msgid "In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently." +msgstr "In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently." + +#: wp-admin/users.php:45 +msgid "You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed." +msgstr "You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed." + +#: wp-admin/options-writing.php:34 +msgid "Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it’s a good idea to keep this address very secret." +msgstr "Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it’s a good idea to keep this address very secret." + +#: wp-admin/maint/repair.php:168 +msgid "WordPress can also attempt to optimize the database. This improves performance in some situations. Repairing and optimizing the database can take a long time and the database will be locked while optimizing." +msgstr "WordPress can also attempt to optimise the database. This improves performance in some situations. Repairing and optimising the database can take a long time and the database will be locked while optimising." + +#: wp-admin/maint/repair.php:155 +msgid "Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users." +msgstr "Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorised users." + +#: wp-admin/themes.php:262 +msgid "The active theme is broken. Reverting to the default theme." +msgstr "The active theme is broken. Reverting to the default theme." + +#: wp-admin/includes/class-custom-image-header.php:838 +#: wp-admin/includes/class-custom-image-header.php:981 +#: wp-admin/includes/class-custom-image-header.php:1317 +msgid "Image could not be processed. Please go back and try again." +msgstr "Image could not be processed. Please go back and try again." + +#. translators: 1: Table name, 2: Error message. +#: wp-admin/maint/repair.php:104 +msgid "The %1$s table is not okay. It is reporting the following error: %2$s. WordPress will attempt to repair this table…" +msgstr "The %1$s table is not okay. It is reporting the following error: %2$s. WordPress will attempt to repair this table…" + +#. translators: %s: URL to view the autosave. +#: wp-admin/edit-form-advanced.php:253 +msgid "There is an autosave of this post that is more recent than the version below. View the autosave" +msgstr "There is an autosave of this post that is more recent than the version below. View the autosave" + +#: wp-admin/maint/repair.php:164 +msgid "WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient." +msgstr "WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient." + +#: wp-admin/options-discussion.php:220 +msgid "An avatar is an image that follows you from weblog to weblog appearing beside your name when you comment on avatar enabled sites. Here you can enable the display of avatars for people who comment on your site." +msgstr "An avatar is an image that follows you from weblog to weblog appearing beside your name when you comment on avatar enabled sites. Here you can enable the display of avatars for people who comment on your site." + +#: wp-admin/user-new.php:414 +msgid "Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." + +#: wp-admin/user-new.php:418 +msgid "Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." + +#: wp-admin/user-edit.php:337 +msgid "Show Toolbar when viewing site" +msgstr "Show Toolbar when viewing site" + +#. translators: 1: WordPress version number, 2: Plural number of bugs. Singular +#. security issue. +#: wp-admin/about.php:323 +msgid "Version %1$s addressed a security issue and fixed %2$s bug." +msgid_plural "Version %1$s addressed a security issue and fixed %2$s bugs." +msgstr[0] "Version %1$s addressed a security issue and fixed %2$s bug." +msgstr[1] "Version %1$s addressed a security issue and fixed %2$s bugs." + +#. translators: %s: HelpHub URL +#. translators: %s: Documentation URL. +#: wp-admin/about.php:93 wp-admin/about.php:335 +msgid "For more information, see the release notes." +msgstr "For more information, see the release notes." + +#. translators: 1: WordPress version number, 2: Plural number of bugs. More +#. than one security issue. +#: wp-admin/about.php:329 +msgid "Version %1$s addressed some security issues and fixed %2$s bug." +msgid_plural "Version %1$s addressed some security issues and fixed %2$s bugs." +msgstr[0] "Version %1$s addressed some security issues and fixed %2$s bug." +msgstr[1] "Version %1$s addressed some security issues and fixed %2$s bugs." + +#. translators: 1: WordPress version number, 2: Plural number of bugs. +#: wp-admin/about.php:81 wp-admin/about.php:317 +msgid "Version %1$s addressed %2$s bug." +msgid_plural "Version %1$s addressed %2$s bugs." +msgstr[0] "Version %1$s addressed %2$s bug." +msgstr[1] "Version %1$s addressed %2$s bugs." + +#: wp-admin/index.php:35 +msgid "Welcome to your WordPress Dashboard! This is the screen you will see when you log in to your site, and gives you access to all the site management features of WordPress. You can get help for any screen by clicking the Help tab above the screen title." +msgstr "Welcome to your WordPress Dashboard! This is the screen you will see when you log in to your site, and gives you access to all the site management features of WordPress. You can get help for any screen by clicking the Help tab above the screen title." + +#: wp-admin/about.php:308 +msgid "Maintenance and Security Release" +msgstr "Maintenance and Security Release" + +#: wp-admin/credits.php:48 wp-admin/privacy.php:45 wp-admin/freedoms.php:51 +#: wp-admin/about.php:46 +msgid "What’s New" +msgstr "What’s New" + +#: wp-admin/about.php:305 +msgid "Security Release" +msgstr "Security Release" + +#: wp-admin/about.php:76 wp-admin/about.php:302 +msgid "Maintenance Release" +msgstr "Maintenance Release" + +#. translators: %s: WordPress version number. +#: wp-admin/about.php:314 +msgid "Version %s addressed some security issues." +msgstr "Version %s addressed some security issues." + +#: wp-admin/options-permalink.php:24 +msgid "This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures." +msgstr "This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures." + +#. translators: 1: WordPress version, 2: URL to About screen. +#: wp-admin/includes/update-core.php:1450 wp-admin/update-core.php:865 +msgid "Welcome to WordPress %1$s. Learn more." +msgstr "Welcome to WordPress %1$s. Learn more." + +#: wp-admin/edit-tags.php:298 +msgid "Adding Categories" +msgstr "Adding Categories" + +#: wp-admin/edit-tags.php:298 +msgid "Adding Tags" +msgstr "Adding Tags" + +#: wp-admin/plugins.php:557 +msgid "Troubleshooting" +msgstr "Troubleshooting" + +#: wp-admin/media-new.php:50 +msgid "You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:" +msgstr "You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:" + +#: wp-admin/edit.php:241 +msgid "This screen provides access to all of your posts. You can customize the display of this screen to suit your workflow." +msgstr "This screen provides access to all of your posts. You can customise the display of this screen to suit your workflow." + +#: wp-admin/edit.php:249 +msgid "You can customize the display of this screen’s contents in a number of ways:" +msgstr "You can customise the display of this screen’s contents in a number of ways:" + +#. translators: %s: URL to Import screen. +#: wp-admin/tools.php:77 +msgid "If you want to convert your categories to tags (or vice versa), use the Categories and Tags Converter available from the Import screen." +msgstr "If you want to convert your categories to tags (or vice versa), use the Categories and Tags Converter available from the Import screen." + +#: wp-admin/user-new.php:267 +msgid "Remember to click the Add New User button at the bottom of this screen when you are finished." +msgstr "Remember to click the Add New User button at the bottom of this screen when you are finished." + +#: wp-admin/export.php:173 +msgid "Once you’ve saved the download file, you can use the Import function in another WordPress installation to import the content from this site." +msgstr "Once you’ve saved the download file, you can use the Import function in another WordPress installation to import the content from this site." + +#: wp-admin/upload.php:244 +msgid "Attaching Files" +msgstr "Attaching Files" + +#: wp-admin/user-new.php:281 +msgid "Here is a basic overview of the different user roles and the permissions associated with each one:" +msgstr "Here is a basic overview of the different user roles and the permissions associated with each one:" + +#: wp-admin/user-new.php:280 +msgid "User Roles" +msgstr "User Roles" + +#: wp-admin/user-new.php:256 +msgid "To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom." +msgstr "To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom." + +#: wp-admin/edit-comments.php:181 +msgid "Moderating Comments" +msgstr "Moderating Comments" + +#: wp-admin/user-new.php:283 +msgid "Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content." +msgstr "Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content." + +#. translators: %s: URL to Add Plugins screen. +#: wp-admin/import.php:228 +msgid "If the importer you need is not listed, search the plugin directory to see if an importer is available." +msgstr "If the importer you need is not listed, search the plugin directory to see if an importer is available." + +#: wp-admin/edit.php:278 +msgid "When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears." +msgstr "When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears." + +#: wp-admin/upload.php:236 wp-admin/users.php:66 wp-admin/edit.php:261 +msgid "Available Actions" +msgstr "Available Actions" + +#: wp-admin/user-new.php:285 +msgid "Authors can publish and manage their own posts, and are able to upload files." +msgstr "Authors can publish and manage their own posts, and are able to upload files." + +#: wp-admin/update-core.php:945 +msgid "How to Update" +msgstr "How to Update" + +#: wp-admin/plugin-install.php:98 +msgid "Adding Plugins" +msgstr "Adding Plugins" + +#: wp-admin/users.php:41 wp-admin/edit.php:247 +msgid "Screen Content" +msgstr "Screen Content" + +#: wp-admin/themes.php:163 +msgid "Adding Themes" +msgstr "Adding Themes" + +#: wp-admin/edit.php:277 +msgid "You can also edit or move multiple posts to the Trash at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk actions menu and click Apply." +msgstr "You can also edit or move multiple posts to the Bin at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply." + +#: wp-admin/options-permalink.php:23 +msgid "Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change — hence the name permalink." +msgstr "Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change — hence the name permalink." + +#: wp-admin/options-permalink.php:232 +msgid "Common Settings" +msgstr "Common Settings" + +#: wp-admin/options-permalink.php:52 +msgid "Custom Structures" +msgstr "Custom Structures" + +#: wp-admin/options-media.php:22 +msgid "Uploading Files allows you to choose the folder and path for storing your uploaded files." +msgstr "Uploading Files allows you to choose the folder and path for storing your uploaded files." + +#: wp-admin/options-writing.php:23 +msgid "You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links." +msgstr "You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links." + +#: wp-admin/themes.php:151 +msgid "Installing themes on Multisite can only be done from the Network Admin section." +msgstr "Installing themes on Multisite can only be done from the Network Admin section." + +#: wp-admin/options-general.php:31 +msgid "If you want site visitors to be able to register themselves, as opposed to by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site admin." +msgstr "If you want site visitors to be able to register themselves, as opposed to by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site admin." + +#: wp-admin/options-writing.php:45 +msgid "If desired, WordPress will automatically alert various services of your new posts." +msgstr "If desired, WordPress will automatically alert various services of your new posts." + +#: wp-admin/options-writing.php:33 +msgid "Post Via Email" +msgstr "Post Via Email" + +#: wp-admin/options-discussion.php:24 +msgid "This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation links to get information on what each discussion setting does." +msgstr "This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation links to get information on what each discussion setting does." + +#: wp-admin/user-edit.php:54 +msgid "You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens." +msgstr "You can change your password, turn on keyboard shortcuts, change the colour scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens." + +#: wp-admin/widgets.php:107 +msgid "Inactive Sidebar (not used)" +msgstr "Inactive Sidebar (not used)" + +#: wp-admin/widgets.php:110 +msgid "This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar." +msgstr "This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar." + +#: wp-admin/media-new.php:52 +msgid "Drag and drop your files into the area below. Multiple files are allowed." +msgstr "Drag and drop your files into the area below. Multiple files are allowed." + +#: wp-admin/media-new.php:53 +msgid "Clicking Select Files opens a navigation window showing you files in your operating system. Selecting Open after clicking on the file you want activates a progress bar on the uploader screen." +msgstr "Clicking Select Files opens a navigation window showing you files in your operating system. Selecting Open after clicking on the file you want activates a progress bar on the uploader screen." + +#: wp-admin/edit-tags.php:254 +msgid "You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts." +msgstr "You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts." + +#: wp-admin/widgets.php:64 +msgid "Removing and Reusing" +msgstr "Removing and Reusing" + +#: wp-admin/edit-tags.php:256 +msgid "You can assign keywords to your posts using tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another." +msgstr "You can assign keywords to your posts using tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another." + +#: wp-admin/widgets.php:74 +msgid "Missing Widgets" +msgstr "Missing Widgets" + +#: wp-admin/upload.php:228 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen." +msgstr "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customise the display of this screen." + +#: wp-admin/edit.php:302 +msgid "Managing pages is very similar to managing posts, and the screens can be customized in the same way." +msgstr "Managing pages is very similar to managing posts, and the screens can be customised in the same way." + +#: wp-admin/edit-form-advanced.php:323 wp-admin/edit.php:294 +msgid "Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages." +msgstr "Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorised or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages." + +#: wp-admin/index.php:50 +msgid "Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information." +msgstr "Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information." + +#: wp-admin/link-manager.php:70 +msgid "Deleting Links" +msgstr "Deleting Links" + +#: wp-admin/edit.php:303 +msgid "You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk actions menu to edit the metadata for multiple pages at once." +msgstr "You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk Actions menu to edit the metadata for multiple pages at once." + +#: wp-admin/edit-comments.php:188 +msgid "Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more." +msgstr "Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more." + +#: wp-admin/upload.php:238 +msgid "Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file." +msgstr "Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file." + +#: wp-admin/upload.php:246 +msgid "If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file." +msgstr "If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file." + +#: wp-admin/edit-comments.php:184 +msgid "In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address." +msgstr "In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address." + +#: wp-admin/edit-comments.php:175 +msgid "You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions." +msgstr "You can manage comments made on your site similar to the way you manage posts and other content. This screen is customisable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions." + +#: wp-admin/link-manager.php:63 +msgid "Links may be separated into Link Categories; these are different than the categories used on your posts." +msgstr "Links may be separated into Link Categories; these are different than the categories used on your posts." + +#. translators: 1: URL to About screen, 2: WordPress version. +#: wp-admin/update-core.php:273 +msgid "Learn more about WordPress %2$s." +msgstr "Learn more about WordPress %2$s." + +#: wp-admin/edit.php:300 +msgid "Managing Pages" +msgstr "Managing Pages" + +#: wp-admin/users.php:44 +msgid "You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab." +msgstr "You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab." + +#: wp-admin/edit.php:268 +msgid "Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status." +msgstr "Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status." + +#: wp-admin/users.php:51 +msgid "Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:" +msgstr "Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:" + +#: wp-admin/edit.php:266 +msgid "Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen." +msgstr "Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen." + +#: wp-admin/edit.php:265 +msgid "Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title." +msgstr "Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title." + +#: wp-admin/users.php:46 +msgid "You can view all posts made by a user by clicking on the number under the Posts column." +msgstr "You can view all posts made by a user by clicking on the number under the Posts column." + +#: wp-admin/users.php:53 +msgid "Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username." +msgstr "Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username." + +#: wp-admin/edit.php:267 +msgid "Trash removes your post from this list and places it in the Trash, from which you can permanently delete it." +msgstr "Bin removes your post from this list and places it in the Bin, from which you can permanently delete it." + +#: wp-admin/user-new.php:259 +msgid "Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users." +msgstr "Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users." + +#. translators: %s: The current WordPress version number. +#: wp-admin/about.php:58 +msgid "Welcome to WordPress %s." +msgstr "Welcome to WordPress %s." + +#: wp-admin/about.php:292 +msgid "Go to Dashboard → Home" +msgstr "Go to Dashboard → Home" + +#: wp-admin/about.php:289 +msgid "Go to Dashboard → Updates" +msgstr "Go to Dashboard → Updates" + +#: wp-admin/credits.php:75 +msgid "WordPress is created by a worldwide team of passionate individuals." +msgstr "WordPress is created by a worldwide team of passionate individuals." + +#: wp-admin/about.php:221 +msgid "For developers" +msgstr "For developers" + +#: wp-admin/includes/dashboard.php:1914 wp-admin/includes/dashboard.php:1916 +msgid "Customize Your Site" +msgstr "Customise Your Site" + +#: wp-admin/user-edit.php:200 +msgid "Profile updated." +msgstr "Profile updated." + +#. translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. +#: wp-admin/user-new.php:116 +msgid "" +"Hi,\n" +"\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"\n" +"Please click the following link to confirm the invite:\n" +"%4$s" +msgstr "" +"Hi,\n" +"\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"\n" +"Please click the following link to confirm the invite:\n" +"%4$s" + +#: wp-admin/credits.php:155 +msgid "Core Developer" +msgstr "Core Developer" + +#: wp-admin/includes/class-wp-upgrader.php:164 +msgid "The package could not be installed." +msgstr "The package could not be installed." + +#: wp-admin/includes/class-plugin-upgrader.php:82 +msgid "The plugin contains no files." +msgstr "The plugin contains no files." + +#: wp-admin/includes/class-plugin-upgrader.php:440 +msgid "No valid plugins were found." +msgstr "No valid plugins were found." + +#: wp-admin/includes/media.php:1253 +msgid "Attachment Post URL" +msgstr "Attachment Post URL" + +#: wp-admin/menu.php:81 +msgctxt "admin menu" +msgid "All Links" +msgstr "All Links" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/plugin-install.php:310 +msgid "%s plugins" +msgstr "%s plugins" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/plugin-install.php:308 +msgid "%s plugin" +msgstr "%s plugin" + +#. translators: 1: Table name. 2: Error message. +#: wp-admin/maint/repair.php:136 +msgid "Failed to optimize the %1$s table. Error: %2$s" +msgstr "Failed to optimise the %1$s table. Error: %2$s" + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:133 +msgid "Successfully optimized the %s table." +msgstr "Successfully optimised the %s table." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:126 +msgid "The %s table is already optimized." +msgstr "The %s table is already optimised." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:111 +msgid "Successfully repaired the %s table." +msgstr "Successfully repaired the %s table." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:101 +msgid "The %s table is okay." +msgstr "The %s table is fine." + +#. translators: %s: Plugin version. +#: wp-admin/update-core.php:529 +msgid "View version %s details." +msgstr "View version %s details." + +#: wp-admin/includes/import.php:220 +msgid "Tumblr" +msgstr "Tumblr" + +#. translators: 1: Browser update URL, 2: Browser name, 3: Browse Happy URL. +#: wp-admin/includes/dashboard.php:1640 +msgid "Update %2$s or learn how to browse happy" +msgstr "Update %2$s or learn how to browse happy" + +#. translators: 1: Link start tag, 2: Link end tag, 3: Width, 4: Height. +#: wp-admin/includes/media.php:3068 +msgid "Scale images to match the large size selected in %1$simage options%2$s (%3$d × %4$d)." +msgstr "Scale images to match the large size selected in %1$simage options%2$s (%3$d × %4$d)." + +#: wp-admin/includes/media.php:2927 +msgid "Audio, Video, or Other File" +msgstr "Audio, Video, or Other File" + +#: wp-admin/includes/media.php:2399 +msgid "Insert media from another website" +msgstr "Insert media from another website" + +#: wp-admin/includes/file.php:2127 +msgid "Error: Could not connect to the server. Please verify the settings are correct." +msgstr "Error: could not connect to the server. Please verify the settings are correct." + +#: wp-admin/index.php:49 +msgid "The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimize this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom." +msgstr "The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimise this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom." + +#: wp-admin/index.php:60 +msgid "You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well." +msgstr "You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well." + +#: wp-admin/options-reading.php:24 wp-admin/edit-tags.php:268 +#: wp-admin/link-manager.php:56 wp-admin/options-writing.php:22 +#: wp-admin/includes/class-custom-background.php:88 +#: wp-admin/includes/ms.php:1135 wp-admin/includes/class-wp-screen.php:853 +#: wp-admin/includes/class-custom-image-header.php:97 wp-admin/my-sites.php:43 +#: wp-admin/options-general.php:41 wp-admin/comment.php:61 +#: wp-admin/theme-editor.php:27 wp-admin/plugin-editor.php:124 +#: wp-admin/nav-menus.php:609 wp-admin/nav-menus.php:650 +#: wp-admin/update-core.php:930 wp-admin/options-permalink.php:22 +#: wp-admin/user-new.php:272 wp-admin/index.php:42 wp-admin/plugins.php:543 +#: wp-admin/themes.php:142 wp-admin/edit-comments.php:173 wp-admin/media.php:85 +#: wp-admin/revision.php:150 wp-admin/upload.php:54 wp-admin/upload.php:226 +#: wp-admin/edit-form-advanced.php:344 wp-admin/import.php:23 +#: wp-admin/widgets.php:55 wp-admin/options-media.php:30 +#: wp-admin/edit-link-form.php:66 wp-admin/user-edit.php:64 +#: wp-admin/users.php:32 wp-admin/media-new.php:48 +#: wp-admin/theme-install.php:112 wp-admin/options-discussion.php:23 +#: wp-admin/edit.php:239 wp-admin/edit.php:292 wp-admin/plugin-install.php:84 +#: wp-admin/export.php:49 wp-admin/network/user-new.php:20 +#: wp-admin/network/index.php:33 wp-admin/network/themes.php:297 +#: wp-admin/network/upgrade.php:21 wp-admin/network/users.php:217 +#: wp-admin/network/site-new.php:23 wp-admin/network/settings.php:48 +#: wp-admin/network/sites.php:28 +msgid "Overview" +msgstr "Overview" + +#: wp-admin/index.php:55 +msgid "Navigation" +msgstr "Navigation" + +#: wp-admin/index.php:62 +msgid "Drag and Drop — To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box." +msgstr "Drag and Drop — To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a grey dotted-line rectangle appear in the location you want to place the box." + +#. translators: %s: Number of pending updates. +#. translators: %s: Number of available updates. +#: wp-admin/menu.php:49 wp-admin/network/menu.php:30 +msgid "Updates %s" +msgstr "Updates %s" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:554 +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "Update Available (%s)" +msgstr[1] "Update Available (%s)" + +#: wp-admin/comment.php:166 wp-admin/theme-editor.php:305 +#: wp-admin/plugins.php:342 wp-admin/plugins.php:348 +#: wp-admin/includes/network.php:444 wp-admin/includes/network.php:452 +#: wp-admin/includes/network.php:460 wp-admin/network/themes.php:137 +#: wp-admin/network/themes.php:141 +msgid "Caution:" +msgstr "Caution:" + +#: wp-admin/user-new.php:248 wp-admin/user-new.php:370 +#: wp-admin/user-new.php:479 wp-admin/user-new.php:631 wp-admin/menu.php:272 +#: wp-admin/menu.php:274 wp-admin/network/user-new.php:101 +#: wp-admin/network/user-new.php:107 wp-admin/network/site-users.php:337 +#: wp-admin/network/site-users.php:364 +msgid "Add New User" +msgstr "Add New User" + +#: wp-admin/menu.php:242 wp-admin/network/menu.php:105 +msgid "Installed Plugins" +msgstr "Installed Plugins" + +#: wp-admin/includes/ms.php:987 wp-admin/users.php:345 +msgid "Confirm Deletion" +msgstr "Confirm Deletion" + +#: wp-admin/includes/class-wp-plugins-list-table.php:605 +#: wp-admin/includes/class-wp-plugins-list-table.php:833 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:700 +msgid "Deactivate" +msgstr "Deactivate" + +#. translators: %s: Plugin version number. +#. translators: %s: Theme version number. +#. translators: %s: WordPress version. +#. translators: %s: Plugin version. +#. translators: %s: Theme version. +#: wp-admin/includes/class-wp-debug-data.php:899 +#: wp-admin/includes/class-wp-debug-data.php:946 +#: wp-admin/includes/class-wp-debug-data.php:1269 +#: wp-admin/includes/class-wp-plugins-list-table.php:1022 +#: wp-admin/includes/update.php:231 wp-admin/includes/update.php:276 +#: wp-admin/includes/ajax-actions.php:4443 +#: wp-admin/includes/ajax-actions.php:4486 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:713 +msgid "Version %s" +msgstr "Version %s" + +#: wp-admin/user-new.php:361 wp-admin/network/user-new.php:91 +#: wp-admin/network/site-users.php:242 wp-admin/network/users.php:262 +msgid "User added." +msgstr "User added." + +#: wp-admin/includes/class-wp-terms-list-table.php:507 +#: wp-admin/includes/class-wp-users-list-table.php:469 +#: wp-admin/includes/class-wp-media-list-table.php:723 +#: wp-admin/includes/class-wp-media-list-table.php:781 +#: wp-admin/includes/class-wp-posts-list-table.php:1406 +#: wp-admin/includes/dashboard.php:752 +#: wp-admin/includes/class-wp-ms-users-list-table.php:412 +msgid "View" +msgstr "View" + +#: wp-admin/includes/class-wp-users-list-table.php:438 +#: wp-admin/user-edit.php:437 +#: wp-admin/includes/class-wp-ms-users-list-table.php:285 +msgid "Super Admin" +msgstr "Super Admin" + +#: wp-admin/users.php:359 wp-admin/users.php:391 +msgid "You can’t remove users." +msgstr "You can’t remove users." + +#: wp-admin/users.php:515 wp-admin/network/site-users.php:254 +msgid "Changed roles." +msgstr "Changed roles." + +#: wp-admin/users.php:526 wp-admin/network/site-users.php:260 +msgid "User removed from this site." +msgstr "User removed from this site." + +#: wp-admin/includes/dashboard.php:473 wp-admin/includes/dashboard.php:475 +#: wp-admin/users.php:589 wp-admin/network/site-users.php:279 +#: wp-admin/network/users.php:296 +msgid "Search Users" +msgstr "Search Users" + +#: wp-admin/user-new.php:372 wp-admin/user-new.php:411 +#: wp-admin/user-new.php:472 wp-admin/network/site-users.php:303 +msgid "Add Existing User" +msgstr "Add Existing User" + +#: wp-admin/includes/class-wp-users-list-table.php:359 +#: wp-admin/user-new.php:442 wp-admin/user-new.php:603 +#: wp-admin/user-edit.php:414 wp-admin/network/site-users.php:312 +#: wp-admin/network/site-users.php:350 +msgid "Role" +msgstr "Role" + +#: wp-admin/user-edit.php:231 wp-admin/users.php:566 wp-admin/menu.php:262 +#: wp-admin/menu.php:264 wp-admin/network/users.php:276 +#: wp-admin/network/menu.php:57 +msgctxt "user" +msgid "Add New" +msgstr "Add New" + +#: wp-admin/options-reading.php:51 wp-admin/edit-tags.php:304 +#: wp-admin/link-manager.php:77 wp-admin/options-writing.php:51 +#: wp-admin/includes/class-custom-background.php:98 +#: wp-admin/includes/ms.php:1157 +#: wp-admin/includes/class-custom-image-header.php:133 wp-admin/my-sites.php:50 +#: wp-admin/options-general.php:47 wp-admin/comment.php:69 +#: wp-admin/theme-editor.php:50 wp-admin/plugin-editor.php:141 +#: wp-admin/nav-menus.php:657 wp-admin/update-core.php:968 +#: wp-admin/options-permalink.php:59 wp-admin/user-new.php:293 +#: wp-admin/index.php:110 wp-admin/plugins.php:586 wp-admin/themes.php:205 +#: wp-admin/edit-comments.php:193 wp-admin/media.php:95 +#: wp-admin/revision.php:155 wp-admin/upload.php:74 wp-admin/upload.php:251 +#: wp-admin/edit-form-advanced.php:318 wp-admin/edit-form-advanced.php:335 +#: wp-admin/edit-form-advanced.php:354 wp-admin/tools.php:54 +#: wp-admin/import.php:30 wp-admin/widgets.php:82 wp-admin/options-media.php:36 +#: wp-admin/edit-link-form.php:75 wp-admin/user-edit.php:70 +#: wp-admin/users.php:73 wp-admin/media-new.php:59 +#: wp-admin/theme-install.php:130 wp-admin/options-discussion.php:30 +#: wp-admin/edit.php:283 wp-admin/edit.php:308 wp-admin/plugin-install.php:108 +#: wp-admin/export.php:56 wp-admin/network.php:65 wp-admin/network.php:78 +#: wp-admin/network/user-new.php:28 wp-admin/network/index.php:54 +#: wp-admin/network/themes.php:322 wp-admin/network/upgrade.php:30 +#: wp-admin/network/users.php:229 wp-admin/network/site-new.php:31 +#: wp-admin/network/settings.php:62 wp-admin/network/sites.php:44 +msgid "For more information:" +msgstr "For more information:" + +#: wp-admin/includes/class-wp-links-list-table.php:88 +#: wp-admin/includes/class-wp-links-list-table.php:336 +#: wp-admin/includes/class-wp-themes-list-table.php:233 +#: wp-admin/includes/theme.php:992 +#: wp-admin/includes/class-wp-plugins-list-table.php:614 +#: wp-admin/includes/class-wp-plugins-list-table.php:812 +#: wp-admin/includes/class-wp-plugins-list-table.php:866 +#: wp-admin/includes/meta-boxes.php:1079 +#: wp-admin/includes/class-wp-terms-list-table.php:164 +#: wp-admin/includes/class-wp-terms-list-table.php:498 +#: wp-admin/includes/class-wp-users-list-table.php:273 +#: wp-admin/includes/class-wp-users-list-table.php:455 +#: wp-admin/includes/media.php:1726 wp-admin/includes/widgets.php:295 +#: wp-admin/includes/template.php:645 wp-admin/themes.php:633 +#: wp-admin/themes.php:1120 wp-admin/widgets.php:351 +#: wp-admin/edit-tag-form.php:278 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:290 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:716 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:479 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:630 +#: wp-admin/includes/class-wp-ms-users-list-table.php:115 +#: wp-admin/includes/class-wp-ms-users-list-table.php:514 +msgid "Delete" +msgstr "Delete" + +#: wp-admin/menu.php:260 wp-admin/network/menu.php:56 +msgid "All Users" +msgstr "All Users" + +#. translators: %s: Plugin name. +#: wp-admin/includes/theme.php:1003 +#: wp-admin/includes/class-wp-theme-install-list-table.php:483 +#: wp-admin/includes/deprecated.php:1383 wp-admin/theme-install.php:388 +#: wp-admin/theme-install.php:425 wp-admin/includes/network.php:374 +msgid "Install" +msgstr "Install" + +#. translators: %s: Number of pending plugin updates. +#. translators: %s: Number of available plugin updates. +#: wp-admin/menu.php:240 wp-admin/network/menu.php:88 +msgid "Plugins %s" +msgstr "Plugins %s" + +#: wp-admin/ms-delete-site.php:38 wp-admin/menu.php:286 +msgid "Delete Site" +msgstr "Delete Site" + +#: wp-admin/my-sites.php:58 wp-admin/options-head.php:15 +#: wp-admin/options.php:335 wp-admin/network/settings.php:141 +#: wp-admin/network/sites.php:351 +msgid "Settings saved." +msgstr "Settings saved." + +#: wp-admin/edit-form-advanced.php:329 +msgid "About Pages" +msgstr "About Pages" + +#: wp-admin/edit-form-advanced.php:287 +msgid "Customizing This Display" +msgstr "Customising This Display" + +#: wp-admin/edit-form-advanced.php:307 +msgid "Title and Post Editor" +msgstr "Title and Post Editor" + +#: wp-admin/options-reading.php:186 wp-admin/install.php:193 +msgid "Note: Neither of these options blocks access to your site — it is up to search engines to honor your request." +msgstr "Note: Neither of these options blocks access to your site — it is up to search engines to honour your request." + +#: wp-admin/options-permalink.php:251 +msgid "Post name" +msgstr "Post name" + +#: wp-admin/options-permalink.php:240 wp-admin/options-permalink.php:244 +#: wp-admin/options-permalink.php:252 +msgctxt "sample permalink structure" +msgid "sample-post" +msgstr "sample-post" + +#: wp-admin/options-permalink.php:228 wp-admin/options-permalink.php:248 +msgctxt "sample permalink base" +msgid "archives" +msgstr "archives" + +#. translators: %s: URL to Import screen on the main site. +#: wp-admin/import.php:165 +msgid "This importer is not installed. Please install importers from the main site." +msgstr "This importer is not installed. Please install importers from the main site." + +#: wp-admin/includes/class-wp-debug-data.php:72 +#: wp-admin/options-general.php:166 wp-admin/network/site-new.php:233 +msgid "Site Language" +msgstr "Site Language" + +#: wp-admin/options-discussion.php:50 +msgid "Attempt to notify any blogs linked to from the post" +msgstr "Attempt to notify any blogs linked to from the post" + +#. translators: 1: Site title, 2: Site URL, 3: User role. +#: wp-admin/includes/user.php:582 +msgid "" +"Hi,\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"If you do not want to join this site please ignore\n" +"this email. This invitation will expire in a few days.\n" +"\n" +"Please click the following link to activate your user account:\n" +"%%s" +msgstr "" +"Hi,\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"If you do not want to join this site please ignore\n" +"this email. This invitation will expire in a few days.\n" +"\n" +"Please click the following link to activate your user account:\n" +"%%s" + +#: wp-admin/includes/theme.php:315 +msgid "Full Width Template" +msgstr "Full Width Template" + +#: wp-admin/includes/theme.php:316 wp-admin/includes/meta-boxes.php:494 +msgid "Post Formats" +msgstr "Post Formats" + +#: wp-admin/includes/theme.php:312 +msgid "Featured Images" +msgstr "Featured Images" + +#: wp-admin/includes/theme.php:311 +msgid "Featured Image Header" +msgstr "Featured Image Header" + +#. translators: %s: Browser name and link. +#: wp-admin/includes/dashboard.php:1618 +msgid "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." +msgstr "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." + +#. translators: %s: Browser name and link. +#: wp-admin/includes/dashboard.php:1612 +msgid "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." +msgstr "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." + +#: wp-admin/includes/nav-menu.php:1081 +msgid "There are some invalid menu items. Please check or delete them." +msgstr "There are some invalid menu items. Please check or delete them." + +#: wp-admin/edit-tags.php:445 +#: wp-admin/includes/class-wp-terms-list-table.php:187 +#: wp-admin/includes/class-wp-terms-list-table.php:651 +#: wp-admin/edit-tag-form.php:132 +msgctxt "term name" +msgid "Name" +msgstr "Name" + +#: wp-admin/includes/template.php:571 wp-admin/includes/template.php:586 +#: wp-admin/includes/template.php:718 +msgctxt "meta name" +msgid "Name" +msgstr "Name" + +#: wp-admin/themes.php:584 +msgctxt "theme name" +msgid "Name" +msgstr "Name" + +#. translators: %s: Theme Directory URL. +#: wp-admin/theme-install.php:98 +msgid "You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses." +msgstr "You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the licence WordPress uses." + +#. translators: %s: WordPress Plugin Directory URL. +#: wp-admin/plugins.php:549 +msgid "If you would like to see more plugins to choose from, click on the “Add New” button and you will be able to browse or search for additional plugins from the WordPress Plugin Directory. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "If you would like to see more plugins to choose from, click on the “Add New” button and you will be able to browse or search for additional plugins from the WordPress Plugin Directory. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the licence WordPress uses. Oh, and they’re free!" + +#: wp-admin/update-core.php:70 +msgid "Re-install Now" +msgstr "Re-install Now" + +#. translators: %s: MAX_FILE_SIZE +#: wp-admin/includes/file.php:793 +msgid "The uploaded file exceeds the %s directive that was specified in the HTML form." +msgstr "The uploaded file exceeds the %s directive that was specified in the HTML form." + +#: wp-admin/credits.php:156 +msgid "External Libraries" +msgstr "External Libraries" + +#: wp-admin/menu.php:279 +msgid "Available Tools" +msgstr "Available Tools" + +#: wp-admin/menu.php:289 wp-admin/network.php:52 wp-admin/network/menu.php:112 +msgid "Network Setup" +msgstr "Network Setup" + +#: wp-admin/includes/credits.php:104 +msgctxt "Translate this to be the equivalent of English Translators in your language for the credits page Translators section" +msgid "Translators" +msgstr "UK English Translators" + +#. translators: %s: https://wordpressfoundation.org/trademark-policy +#: wp-admin/freedoms.php:103 +msgid "WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We’re flattered every time someone spreads the good word, just make sure to check out our trademark guidelines first." +msgstr "WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We’re flattered every time someone spreads the good word, just make sure to check out our trademark guidelines first." + +#. translators: 1: URL to Plugins screen, 2: URL to Themes screen, 3: +#. https://wordpress.org/about/license +#: wp-admin/freedoms.php:115 +msgid "Every plugin and theme in WordPress.org’s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress license, we don’t recommend them." +msgstr "Every plugin and theme in WordPress.org’s directory is 100%% GPL or a similarly free and compatible licence, so you can feel safe finding plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress licence, we don’t recommend them." + +#. translators: %s: https://wordpress.org/about/license +#: wp-admin/freedoms.php:65 +msgid "WordPress is Free and open source software, built by a distributed community of mostly volunteer developers from around the world. WordPress comes with some awesome, worldview-changing rights courtesy of its license, the GPL." +msgstr "WordPress is free and open source software, built by a distributed community of mostly volunteer developers from around the world. WordPress comes with some awesome, worldview-changing rights courtesy of its licence, the GPL." + +#: wp-admin/credits.php:151 +msgid "Lead Developer" +msgstr "Lead Developer" + +#. translators: %s: https://make.wordpress.org +#: wp-admin/credits.php:81 +msgid "Want to see your name in lights on this page? Get involved in WordPress." +msgstr "Want to see your name in lights on this page? Get involved in WordPress." + +#: wp-admin/credits.php:13 wp-admin/credits.php:49 wp-admin/credits.php:57 +#: wp-admin/privacy.php:46 wp-admin/freedoms.php:52 wp-admin/about.php:47 +msgid "Credits" +msgstr "Credits" + +#: wp-admin/widgets.php:445 +msgctxt "removing-widget" +msgid "Deactivate" +msgstr "Deactivate" + +#: wp-admin/credits.php:150 +msgid "Cofounder, Project Lead" +msgstr "Cofounder, Project Lead" + +#. translators: %s: The current WordPress version number. +#: wp-admin/credits.php:148 +msgid "Core Contributors to WordPress %s" +msgstr "Core Contributors to WordPress %s" + +#: wp-admin/menu.php:109 +msgid "All Comments" +msgstr "All Comments" + +#. translators: 1: https://wordpress.org/about/, 2: https://make.wordpress.org +#: wp-admin/credits.php:65 +msgid "WordPress is created by a worldwide team of passionate individuals. Get involved in WordPress." +msgstr "WordPress is created by a worldwide team of passionate individuals. Get involved in WordPress." + +#: wp-admin/credits.php:146 +msgid "Project Leaders" +msgstr "Project Leaders" + +#: wp-admin/includes/dashboard.php:32 +msgid "You are using an insecure browser!" +msgstr "You are using an insecure browser!" + +#: wp-admin/includes/dashboard.php:34 +msgid "Your browser is out of date!" +msgstr "Your browser is out of date!" + +#: wp-admin/credits.php:50 wp-admin/privacy.php:47 wp-admin/freedoms.php:18 +#: wp-admin/freedoms.php:53 wp-admin/freedoms.php:59 wp-admin/about.php:48 +msgid "Freedoms" +msgstr "Freedoms" + +#: wp-admin/freedoms.php:123 +msgid "Don’t you wish all software came with these freedoms? So do we! For more information, check out the Free Software Foundation." +msgstr "Don’t you wish all software came with these freedoms? So do we! For more information, check out the Free Software Foundation." + +#: wp-admin/includes/class-custom-image-header.php:665 +msgid "You can use one of these cool headers or show a random one on each page." +msgstr "You can use one of these cool headers or show a random one on each page." + +#: wp-admin/includes/class-custom-image-header.php:663 +msgid "If you don‘t want to upload your own image, you can use one of these cool headers, or show a random one." +msgstr "If you don‘t want to upload your own image, you can use one of these cool headers, or show a random one." + +#: wp-admin/includes/class-custom-image-header.php:649 +msgid "You can choose one of your previously uploaded headers, or show a random one." +msgstr "You can choose one of your previously uploaded headers, or show a random one." + +#: wp-admin/menu-header.php:280 +msgid "Collapse menu" +msgstr "Collapse menu" + +#: wp-admin/includes/class-custom-image-header.php:294 +msgid "Random: Show a different image on each page." +msgstr "Random: Show a different image on each page." + +#: wp-admin/includes/class-custom-image-header.php:647 +msgid "Uploaded Images" +msgstr "Uploaded Images" + +#: wp-admin/includes/theme.php:321 wp-admin/includes/theme.php:357 +#: wp-admin/includes/class-wp-screen.php:1207 wp-admin/index.php:68 +msgid "Layout" +msgstr "Layout" + +#: wp-admin/users.php:282 +msgid "You have specified this user for deletion:" +msgstr "You have specified this user for deletion:" + +#. translators: 1: Current page, 2: Total pages. +#: wp-admin/includes/class-wp-list-table.php:948 +msgctxt "paging" +msgid "%1$s of %2$s" +msgstr "%1$s of %2$s" + +#. translators: %s: Template name. +#: wp-admin/includes/file.php:92 +msgid "%s Page Template" +msgstr "%s Page Template" + +#: wp-admin/plugins.php:342 +msgid "This plugin may be active on other sites in the network." +msgstr "This plugin may be active on other sites in the network." + +#: wp-admin/includes/ajax-actions.php:4548 wp-admin/plugins.php:622 +msgid "You cannot delete a plugin while it is active on the main site." +msgstr "You cannot delete a plugin while it is active on the main site." + +#: wp-admin/options-writing.php:98 +msgid "Default Post Format" +msgstr "Default Post Format" + +#: wp-admin/user-edit.php:233 wp-admin/users.php:568 +msgctxt "user" +msgid "Add Existing" +msgstr "Add Existing" + +#: wp-admin/theme-editor.php:45 wp-admin/plugin-editor.php:136 +msgid "Any edits to files from this screen will be reflected on all sites in the network." +msgstr "Any edits to files from this screen will be reflected on all sites in the network." + +#: wp-admin/index.php:73 +msgid "The boxes on your Dashboard screen are:" +msgstr "The boxes on your Dashboard screen are:" + +#: wp-admin/users.php:33 +msgid "This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role." +msgstr "This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role." + +#: wp-admin/plugin-editor.php:135 +msgid "If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below." +msgstr "If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below." + +#. translators: Default page slug. +#: wp-admin/includes/upgrade.php:337 +msgid "sample-page" +msgstr "sample-page" + +#: wp-admin/includes/upgrade.php:335 +msgid "Sample Page" +msgstr "Sample Page" + +#: wp-admin/options-discussion.php:281 +msgid "Retro (Generated)" +msgstr "Retro (Generated)" + +#. translators: 1: URL to Themes tab on Edit Site screen, 2: URL to Add Themes +#. screen. +#: wp-admin/includes/class-wp-themes-list-table.php:102 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable or install more themes." +msgstr "You currently have only one theme enabled for this site. Visit the Network Admin to enable or install more themes." + +#. translators: %s: URL to Themes tab on Edit Site screen. +#: wp-admin/includes/class-wp-themes-list-table.php:111 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes." +msgstr "You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes." + +#: wp-admin/user-edit.php:442 +msgid "Super admin privileges cannot be removed because this user has the network admin email." +msgstr "Super admin privileges cannot be removed because this user has the network admin email." + +#. translators: %s: URL to Add Themes screen. +#: wp-admin/includes/class-wp-themes-list-table.php:122 +msgid "You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress Theme Directory at any time: just click on the Install Themes tab above." +msgstr "You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress Theme Directory at any time: just click on the Install Themes tab above." + +#: wp-admin/maint/repair.php:162 +msgid "One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the “Repair Database” button. Repairing can take a while, so please be patient." +msgstr "One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the “Repair Database” button. Repairing can take a while, so please be patient." + +#: wp-admin/includes/file.php:55 +msgid "Visual Editor RTL Stylesheet" +msgstr "Visual Editor RTL Stylesheet" + +#. translators: %s: Link to edit parent theme. +#: wp-admin/theme-editor.php:258 +msgid "This child theme inherits templates from a parent theme, %s." +msgstr "This child theme inherits templates from a parent theme, %s." + +#: wp-admin/theme-editor.php:307 +msgid "This is a file in your current parent theme." +msgstr "This is a file in your current parent theme." + +#: wp-admin/includes/class-theme-installer-skin.php:150 +#: wp-admin/js/updates.js:1377 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:469 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:577 +msgid "Network Enable" +msgstr "Network Enable" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:176 +msgid "You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localized version to be released." +msgstr "You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localised version to be released." + +#: wp-admin/upgrade.php:153 +msgid "Your WordPress database has been successfully updated!" +msgstr "Your WordPress database has been successfully updated!" + +#: wp-admin/upgrade.php:142 +msgid "Update WordPress Database" +msgstr "Update WordPress Database" + +#: wp-admin/upgrade.php:64 +msgid "WordPress › Update" +msgstr "WordPress › Update" + +#: wp-admin/upgrade.php:152 +msgid "Update Complete" +msgstr "Update Complete" + +#: wp-admin/upgrade.php:139 wp-admin/network/upgrade.php:139 +msgid "Database Update Required" +msgstr "Database Update Required" + +#: wp-admin/upgrade.php:140 +msgid "WordPress has been updated! Before we send you on your way, we have to update your database to the newest version." +msgstr "WordPress has been updated! Before we send you on your way, we have to update your database to the newest version." + +#: wp-admin/upgrade.php:72 +msgid "No Update Required" +msgstr "No Update Required" + +#: wp-admin/upgrade.php:141 wp-admin/network/upgrade.php:143 +msgid "The database update process may take a little while, so please be patient." +msgstr "The database update process may take a little while, so please be patient." + +#: wp-admin/includes/class-plugin-upgrader.php:65 +#: wp-admin/includes/class-plugin-upgrader.php:92 +msgid "Plugin updated successfully." +msgstr "Plugin updated successfully." + +#: wp-admin/includes/class-theme-upgrader-skin.php:44 wp-admin/update.php:209 +msgid "Update Theme" +msgstr "Update Theme" + +#: wp-admin/includes/class-plugin-upgrader.php:64 +#: wp-admin/includes/class-plugin-upgrader.php:91 +#: wp-admin/includes/ajax-actions.php:4505 +msgid "Plugin update failed." +msgstr "Plugin update failed." + +#: wp-admin/includes/class-theme-upgrader.php:63 +#: wp-admin/includes/class-theme-upgrader.php:100 +#: wp-admin/includes/ajax-actions.php:4214 +msgid "Theme update failed." +msgstr "Theme update failed." + +#: wp-admin/includes/class-theme-upgrader.php:64 +#: wp-admin/includes/class-theme-upgrader.php:101 +msgid "Theme updated successfully." +msgstr "Theme updated successfully." + +#: wp-admin/includes/class-plugin-upgrader-skin.php:62 wp-admin/update.php:62 +msgid "Update Plugin" +msgstr "Update Plugin" + +#: wp-admin/includes/class-plugin-upgrader.php:58 +#: wp-admin/includes/class-theme-upgrader.php:57 +#: wp-admin/includes/class-core-upgrader.php:31 +#: wp-admin/includes/class-language-pack-upgrader.php:115 +msgid "Update package not available." +msgstr "Update package not available." + +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/update.php:490 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin." +msgstr "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin." + +#: wp-admin/export.php:208 wp-admin/export.php:255 wp-admin/export.php:295 +msgid "Date range:" +msgstr "Date range:" + +#: wp-admin/export.php:175 +msgid "Choose what to export" +msgstr "Choose what to export" + +#: wp-admin/export.php:191 wp-admin/export.php:238 +msgid "Authors:" +msgstr "Authors:" + +#: wp-admin/export.php:180 +msgid "All content" +msgstr "All content" + +#: wp-admin/export.php:181 +msgid "This will contain all of your posts, pages, comments, custom fields, terms, navigation menus, and custom posts." +msgstr "This will contain all of your posts, pages, comments, custom fields, terms, navigation menus, and custom posts." + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:247 +msgctxt "comments" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Mine (%s)" +msgstr[1] "Mine (%s)" + +#. translators: Admin screen title. %s: Admin screen name. +#: wp-admin/admin-header.php:49 +msgid "%s — WordPress" +msgstr "%s — WordPress" + +#: wp-admin/widgets.php:58 +msgid "The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget." +msgstr "The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget." + +#: wp-admin/media.php:90 wp-admin/edit-form-advanced.php:349 +msgid "Remember to click Update Media to save metadata entered or changed." +msgstr "Remember to click Update Media to save metadata entered or changed." + +#: wp-admin/media.php:89 wp-admin/edit-form-advanced.php:348 +msgid "Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping." +msgstr "Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping." + +#: wp-admin/media.php:88 wp-admin/edit-form-advanced.php:347 +msgid "For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information." +msgstr "For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information." + +#: wp-admin/media.php:87 wp-admin/edit-form-advanced.php:346 +msgid "This screen allows you to edit fields for metadata in a file within the media library." +msgstr "This screen allows you to edit fields for metadata in a file within the media library." + +#: wp-admin/user-new.php:419 +msgid "Email or Username" +msgstr "Email or Username" + +#: wp-admin/themes.php:231 wp-admin/network/themes.php:422 +#: wp-admin/network/site-themes.php:215 +msgid "Search Installed Themes" +msgstr "Search Installed Themes" + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/update-core.php:603 +msgid "Please Note: Any customizations you have made to theme files will be lost. Please consider using child themes for modifications." +msgstr "Please Note: Any customisations you have made to theme files will be lost. Please consider using child themes for modifications." + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:378 +msgctxt "posts" +msgid "Sticky (%s)" +msgid_plural "Sticky (%s)" +msgstr[0] "Sticky (%s)" +msgstr[1] "Sticky (%s)" + +#. translators: 1: Date, 2: Time. +#: wp-admin/update-core.php:1010 +msgid "Last checked on %1$s at %2$s." +msgstr "Last checked on %1$s at %2$s." + +#: wp-admin/update-core.php:991 +msgid "Please select one or more plugins to update." +msgstr "Please select one or more plugins to update." + +#: wp-admin/update-core.php:989 +msgid "Please select one or more themes to update." +msgstr "Please select one or more themes to update." + +#: wp-admin/update-core.php:1011 +msgid "Check again." +msgstr "Check again." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:41 +msgid "The update process is starting. This process may take a while on some hosts, so please be patient." +msgstr "The update process is starting. This process may take a while on some hosts, so please be patient." + +#: wp-admin/theme-install.php:208 wp-admin/theme-install.php:231 +msgid "Apply Filters" +msgstr "Apply Filters" + +#: wp-admin/includes/theme.php:310 +msgid "Editor Style" +msgstr "Editor Style" + +#: wp-admin/includes/file.php:2175 +msgid "To perform the requested action, WordPress needs to access your web server." +msgstr "To perform the requested action, WordPress needs to access your web server." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:168 +msgid "No themes match your request." +msgstr "No themes match your request." + +#: wp-admin/includes/class-wp-list-table.php:936 +#: wp-admin/includes/class-wp-list-table.php:940 +msgid "Current Page" +msgstr "Current Page" + +#: wp-admin/includes/dashboard.php:481 wp-admin/includes/dashboard.php:483 +#: wp-admin/network/sites.php:391 +msgid "Search Sites" +msgstr "Search Sites" + +#: wp-admin/includes/dashboard.php:433 +msgid "Create a New User" +msgstr "Create a New User" + +#. translators: 1: Text indicating the number of sites on the network, 2: Text +#. indicating the number of users on the network. +#: wp-admin/includes/dashboard.php:445 +msgid "You have %1$s and %2$s." +msgstr "You have %1$s and %2$s." + +#. translators: %s: Number of sites on the network. +#: wp-admin/includes/dashboard.php:442 +msgid "%s site" +msgid_plural "%s sites" +msgstr[0] "%s site" +msgstr[1] "%s sites" + +#. translators: %s: Number of users on the network. +#: wp-admin/includes/dashboard.php:440 +msgid "%s user" +msgid_plural "%s users" +msgstr[0] "%s user" +msgstr[1] "%s users" + +#: wp-admin/includes/dashboard.php:1446 +msgid "https://wordpress.org/news/" +msgstr "https://wordpress.org/news/" + +#: wp-admin/includes/dashboard.php:1455 +msgid "https://wordpress.org/news/feed/" +msgstr "https://en-gb.wordpress.org/news/feed/" + +#: wp-admin/options-discussion.php:73 +msgid "(Signup has been disabled. Only members of this site can comment.)" +msgstr "(Signup has been disabled. Only members of this site can comment.)" + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number. +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/theme.php:204 wp-admin/includes/update.php:477 +#: wp-admin/includes/update.php:670 +msgid "There is a new version of %1$s available. View version %4$s details." +msgstr "There is a new version of %1$s available. View version %4$s details." + +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:56 +#: wp-admin/includes/class-language-pack-upgrader-skin.php:78 +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:56 +msgid "Go to WordPress Updates page" +msgstr "Go to WordPress Updates page" + +#: wp-admin/includes/class-plugin-installer-skin.php:151 +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:51 +#: wp-admin/includes/class-plugin-upgrader-skin.php:101 +msgid "Go to Plugins page" +msgstr "Go to Plugins page" + +#: wp-admin/includes/class-theme-installer-skin.php:164 +#: wp-admin/includes/class-theme-upgrader-skin.php:127 +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:51 +msgid "Go to Themes page" +msgstr "Go to Themes page" + +#: wp-admin/includes/nav-menu.php:1077 +msgid "Click Save Menu to make pending menu items public." +msgstr "Click Save Menu to make pending menu items public." + +#: wp-admin/includes/dashboard.php:1561 +msgid "Storage Space" +msgstr "Storage Space" + +#: wp-admin/includes/dashboard.php:430 +msgid "Create a New Site" +msgstr "Create a New Site" + +#. translators: 1: Image width in pixels, 2: Image height in pixels. +#: wp-admin/includes/class-custom-image-header.php:555 +msgid "Images of exactly %1$d × %2$d pixels will be used as-is." +msgstr "Images of exactly %1$d × %2$d pixels will be used as-is." + +#: wp-admin/includes/class-custom-image-header.php:875 +msgid "Crop and Publish" +msgstr "Crop and Publish" + +#: wp-admin/edit-link-form.php:70 +msgid "XFN stands for XHTML Friends Network, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking." +msgstr "XFN stands for XHTML Friends Network, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking." + +#: wp-admin/includes/file.php:2185 +msgid "FTP Password" +msgstr "FTP Password" + +#: wp-admin/includes/file.php:2184 +msgid "FTP Username" +msgstr "FTP Username" + +#: wp-admin/includes/file.php:2181 +msgid "FTP/SSH Password" +msgstr "FTP/SSH Password" + +#: wp-admin/includes/file.php:2180 +msgid "FTP/SSH Username" +msgstr "FTP/SSH Username" + +#: wp-admin/widgets.php:76 +msgid "Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area." +msgstr "Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area." + +#: wp-admin/options-permalink.php:53 +msgid "The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be /topics/uncategorized instead of /category/uncategorized." +msgstr "The Optional fields let you customise the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorised” category could be /topics/uncategorised instead of /category/uncategorised." + +#. translators: %s: URL to create a new page. +#: wp-admin/options-reading.php:28 +msgid "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." +msgstr "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." + +#. translators: %s: Percent sign (%). +#: wp-admin/options-permalink.php:36 +msgid "If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there." +msgstr "If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there." + +#. translators: 1: %category%, 2: %tag% +#: wp-admin/options-permalink.php:41 +msgid "When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s." +msgstr "When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s." + +#: wp-admin/widgets.php:66 +msgid "If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas." +msgstr "If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas." + +#: wp-admin/users.php:34 +msgid "To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section." +msgstr "To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section." + +#: wp-admin/options-media.php:19 +msgid "You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size." +msgstr "You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size." + +#: wp-admin/options-general.php:27 +msgid "Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes." +msgstr "Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes." + +#: wp-admin/edit-form-advanced.php:414 +msgid "Order — Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field." +msgstr "Order — Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field." + +#: wp-admin/includes/file.php:2179 +msgid "Please enter your FTP or SSH credentials to proceed." +msgstr "Please enter your FTP or SSH credentials to proceed." + +#: wp-admin/includes/file.php:2183 +msgid "Please enter your FTP credentials to proceed." +msgstr "Please enter your FTP credentials to proceed." + +#: wp-admin/includes/file.php:2189 +msgid "If you do not remember your credentials, you should contact your web host." +msgstr "If you do not remember your credentials, you should contact your web host." + +#: wp-admin/user-edit.php:53 +msgid "Your profile contains information about you (your “account”) as well as some personal options related to using WordPress." +msgstr "Your profile contains information about you (your “account”) as well as some personal options related to using WordPress." + +#. translators: %s: /wp-content/themes +#: wp-admin/theme-install.php:105 +msgid "You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your %s directory." +msgstr "You can Upload a theme manually if you have already downloaded its zip archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your %s directory." + +#: wp-admin/edit-form-advanced.php:401 +msgid "Send Trackbacks — Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary." +msgstr "Send Trackbacks — Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary." + +#: wp-admin/user-new.php:284 +msgid "Contributors can write and manage their posts but not publish posts or upload media files." +msgstr "Contributors can write and manage their posts but not publish posts or upload media files." + +#: wp-admin/user-new.php:287 +msgid "Administrators have access to all the administration features." +msgstr "Administrators have access to all the administration features." + +#. translators: %s: URL to Widgets screen. +#: wp-admin/link-manager.php:60 +msgid "You can add links here to be displayed on your site, usually using Widgets. By default, links to several sites in the WordPress community are included as examples." +msgstr "You can add links here to be displayed on your site, usually using Widgets. By default, links to several sites in the WordPress community are included as examples." + +#: wp-admin/link-manager.php:72 +msgid "If you delete a link, it will be removed permanently, as Links do not have a Trash function yet." +msgstr "If you delete a link, it will be removed permanently, as Links do not have a Rubbish Bin function yet." + +#: wp-admin/plugin-editor.php:126 +msgid "You can use the plugin editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations." +msgstr "You can use the plugin editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customisations." + +#: wp-admin/includes/class-custom-background.php:93 +msgid "Don’t forget to click on the Save Changes button when you are finished." +msgstr "Don’t forget to click on the Save Changes button when you are finished." + +#. translators: %s: URL to Press This bookmarklet. +#: wp-admin/edit-form-advanced.php:315 +msgid "You can also create posts with the Press This bookmarklet." +msgstr "You can also create posts with the Press This bookmarklet." + +#: wp-admin/includes/class-custom-background.php:90 +msgid "You can customize the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a color." +msgstr "You can customise the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a colour." + +#: wp-admin/edit-tags.php:284 +msgid "Slug — The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "Slug — The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." + +#: wp-admin/user-edit.php:56 +msgid "Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts." +msgstr "Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts." + +#: wp-admin/user-edit.php:58 +msgid "Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so." +msgstr "Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so." + +#: wp-admin/user-edit.php:59 +msgid "Remember to click the Update Profile button when you are finished." +msgstr "Remember to click the Update Profile button when you are finished." + +#: wp-admin/user-new.php:286 +msgid "Editors can publish posts, manage posts as well as manage other people’s posts, etc." +msgstr "Editors can publish posts, manage posts as well as manage other people’s posts, etc." + +#: wp-admin/comment.php:64 +msgid "You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment." +msgstr "You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment." + +#: wp-admin/comment.php:63 +msgid "You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error." +msgstr "You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error." + +#: wp-admin/options-general.php:26 +msgid "The fields on this screen determine some of the basics of your site setup." +msgstr "The fields on this screen determine some of the basics of your site setup." + +#: wp-admin/options-reading.php:25 +msgid "This screen contains the settings that affect the display of your content." +msgstr "This screen contains the settings that affect the display of your content." + +#: wp-admin/options-reading.php:36 wp-admin/options-writing.php:24 +#: wp-admin/options-general.php:36 wp-admin/options-permalink.php:25 +#: wp-admin/options-permalink.php:45 wp-admin/options-permalink.php:54 +#: wp-admin/options-media.php:25 wp-admin/options-discussion.php:25 +msgid "You must click the Save Changes button at the bottom of the screen for new settings to take effect." +msgstr "You must click the Save Changes button at the bottom of the screen for new settings to take effect." + +#: wp-admin/options-general.php:30 +msgid "The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory." +msgstr "The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory." + +#: wp-admin/options-general.php:35 +msgid "UTC means Coordinated Universal Time." +msgstr "UTC is the same as Greenwich Mean Time (GMT)." + +#. translators: %s: Documentation URL. +#: wp-admin/options-reading.php:33 +msgid "You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or a summary. Learn more about feeds." +msgstr "You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or a summary. Learn more about feeds." + +#: wp-admin/edit-link-form.php:69 +msgid "The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don’t use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box." +msgstr "The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don’t use in the Screen Options tab, or minimise boxes by clicking on the title bar of the box." + +#: wp-admin/update-core.php:255 +msgid "You have the latest version of WordPress." +msgstr "You have the latest version of WordPress." + +#: wp-admin/update-core.php:241 +msgid "An updated version of WordPress is available." +msgstr "An updated version of WordPress is available." + +#: wp-admin/update-core.php:432 +msgid "Your plugins are all up to date." +msgstr "Your plugins are all up to date." + +#: wp-admin/update-core.php:591 +msgid "Your themes are all up to date." +msgstr "Your themes are all up to date." + +#: wp-admin/update-core.php:268 +msgid "While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated." +msgstr "While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated." + +#: wp-admin/theme-editor.php:167 wp-admin/plugin-editor.php:169 +msgid "Function Name…" +msgstr "Function Name…" + +#: wp-admin/edit-link-form.php:68 +msgid "You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields." +msgstr "You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields." + +#: wp-admin/includes/class-plugin-installer-skin.php:104 +msgid "Activate Plugin & Run Importer" +msgstr "Activate Plugin & Run Importer" + +#. translators: %s: URL to Categories to Tags Converter tool. +#: wp-admin/edit-tags.php:614 +msgid "Categories can be selectively converted to tags using the category to tag converter." +msgstr "Categories can be selectively converted to tags using the category to tag converter." + +#: wp-admin/import.php:24 +msgid "This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform." +msgstr "This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform." + +#: wp-admin/export.php:51 +msgid "Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format." +msgstr "Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format." + +#: wp-admin/link-manager.php:64 +msgid "You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table." +msgstr "You can customise the display of this screen using the Screen Options tab and/or the dropdown filters above the links table." + +#: wp-admin/plugin-editor.php:127 +msgid "Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished." +msgstr "Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished." + +#: wp-admin/plugins.php:559 +msgid "Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue." +msgstr "Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue." + +#: wp-admin/widgets.php:67 +msgid "Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required." +msgstr "Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required." + +#: wp-admin/widgets.php:68 +msgid "Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop." +msgstr "Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop." + +#: wp-admin/theme-editor.php:38 +msgid "After typing in your edits, click Update File." +msgstr "After typing in your edits, click Update File." + +#: wp-admin/widgets.php:57 +msgid "Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them." +msgstr "Widgets are independent sections of content that can be placed into any widgetised area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them." + +#: wp-admin/theme-editor.php:30 +msgid "Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme’s template files. Clicking once on any file name causes the file to appear in the large Editor box." +msgstr "Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme’s template files. Clicking once on any file name causes the file to appear in the large Editor box." + +#: wp-admin/theme-editor.php:29 +msgid "You can use the theme editor to edit the individual CSS and PHP files which make up your theme." +msgstr "You can use the theme editor to edit the individual CSS and PHP files which make up your theme." + +#: wp-admin/theme-editor.php:39 +msgid "Advice: Think very carefully about your site crashing if you are live-editing the theme currently in use." +msgstr "Advice: Think very carefully about your site crashing if you are live-editing the theme currently in use." + +#: wp-admin/includes/meta-boxes.php:948 +msgid "(no parent)" +msgstr "(no parent)" + +#: wp-admin/edit-form-advanced.php:412 +msgid "Parent — You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages." +msgstr "Parent — You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages." + +#: wp-admin/edit-form-advanced.php:413 +msgid "Template — Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu." +msgstr "Template — Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:48 +msgid "All updates have been completed." +msgstr "All updates have been completed." + +#: wp-admin/edit-tags.php:277 +msgid "When adding a new tag on this screen, you’ll fill in the following fields:" +msgstr "When adding a new tag on this screen, you’ll fill in the following fields:" + +#: wp-admin/edit-tags.php:293 +msgid "You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table." +msgstr "You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table." + +#: wp-admin/edit-tags.php:275 +msgid "When adding a new category on this screen, you’ll fill in the following fields:" +msgstr "When adding a new category on this screen, you’ll fill in the following fields:" + +#: wp-admin/edit-tags.php:262 +msgid "What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index." +msgstr "What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index." + +#. translators: %s: URL to Writing Settings screen. +#: wp-admin/edit-tags.php:250 +msgid "You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your writing settings." +msgstr "You can use categories to define sections of your site and group related posts. The default category is “Uncategorised” until you change it in your writing settings." + +#: wp-admin/edit-tags.php:291 +msgid "Description — The description is not prominent by default; however, some themes may display it." +msgstr "Description — The description is not prominent by default; however, some themes may display it." + +#: wp-admin/edit-tags.php:281 +msgid "Name — The name is how it appears on your site." +msgstr "Name — The name is how it appears on your site." + +#: wp-admin/includes/class-custom-image-header.php:660 +msgid "Default Images" +msgstr "Default Images" + +#: wp-admin/includes/class-custom-image-header.php:853 +msgid "Crop Header Image" +msgstr "Crop Header Image" + +#: wp-admin/includes/class-custom-image-header.php:680 +msgid "Remove Header Image" +msgstr "Remove Header Image" + +#: wp-admin/includes/class-custom-image-header.php:690 +msgid "Reset Image" +msgstr "Reset Image" + +#: wp-admin/includes/class-custom-image-header.php:693 +msgid "Restore Original Header Image" +msgstr "Restore Original Header Image" + +#: wp-admin/includes/class-custom-image-header.php:905 +msgid "Image Upload Error" +msgstr "Image Upload Error" + +#: wp-admin/includes/class-custom-image-header.php:679 +msgid "This will remove the header image. You will not be able to restore any customizations." +msgstr "This will remove the header image. You will not be able to restore any customisations." + +#: wp-admin/includes/class-custom-image-header.php:857 +msgid "You need JavaScript to choose a part of the image." +msgstr "You need JavaScript to choose a part of the image." + +#: wp-admin/includes/class-custom-image-header.php:692 +msgid "This will restore the original header image. You will not be able to restore any customizations." +msgstr "This will restore the original header image. You will not be able to restore any customisations." + +#: wp-admin/includes/class-wp-comments-list-table.php:759 +#: wp-admin/includes/dashboard.php:735 +msgid "Delete this comment permanently" +msgstr "Delete this comment permanently" + +#: wp-admin/includes/class-wp-comments-list-table.php:749 +msgid "Restore this comment from the Trash" +msgstr "Restore this comment from the Bin" + +#. translators: %s: Featured image. +#: wp-admin/edit-form-advanced.php:386 +msgid "%s — This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc." +msgstr "%s — This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc." + +#: wp-admin/edit-form-advanced.php:402 +msgid "Discussion — You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them." +msgstr "Discussion — You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them." + +#: wp-admin/edit-form-advanced.php:292 +msgid "Title — Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit." +msgstr "Title — Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit." + +#: wp-admin/edit.php:254 +msgid "You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list." +msgstr "You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list." + +#: wp-admin/edit.php:251 +msgid "You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab." +msgstr "You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab." + +#: wp-admin/edit.php:263 +msgid "Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:" +msgstr "Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:" + +#: wp-admin/users.php:42 +msgid "You can customize the display of this screen in a number of ways:" +msgstr "You can customise the display of this screen in a number of ways:" + +#: wp-admin/plugins.php:761 +msgid "Search Installed Plugins" +msgstr "Search Installed Plugins" + +#: wp-admin/nav-menus.php:721 +msgid "Your theme supports one menu. Select which menu you would like to use." +msgstr "Your theme supports %s menu. Select which menu appears in each location." + +#: wp-admin/nav-menus.php:19 +msgid "Your theme does not support navigation menus or widgets." +msgstr "Your theme does not support navigation menus or widgets." + +#: wp-admin/includes/import.php:196 wp-admin/tools.php:47 wp-admin/tools.php:72 +msgid "Categories and Tags Converter" +msgstr "Categories and Tags Converter" + +#: wp-admin/includes/nav-menu.php:513 wp-admin/includes/nav-menu.php:528 +msgid "Most Recent" +msgstr "Most Recent" + +#: wp-admin/export.php:209 wp-admin/export.php:256 wp-admin/export.php:296 +msgid "Start date:" +msgstr "Start date:" + +#: wp-admin/includes/plugin-install.php:335 +msgctxt "Plugin Installer" +msgid "Tag" +msgstr "Tag" + +#: wp-admin/includes/theme-install.php:105 +msgctxt "Theme Installer" +msgid "Tag" +msgstr "Tag" + +#: wp-admin/includes/media.php:2560 +msgctxt "verb" +msgid "Clear" +msgstr "Clear" + +#: wp-admin/includes/class-wp-comments-list-table.php:362 +#: wp-admin/comment.php:132 +msgctxt "comment" +msgid "Mark as spam" +msgstr "Mark as spam" + +#: wp-admin/includes/class-custom-background.php:303 +msgid "Remove Background Image" +msgstr "Remove Background Image" + +#. translators: %s: Post title. +#. translators: %s: Link to post. +#: wp-admin/edit-comments.php:151 wp-admin/edit-comments.php:217 +msgid "Comments on “%s”" +msgstr "Comments on “%s”" + +#: wp-admin/includes/nav-menu.php:1103 +msgid "Show advanced menu properties" +msgstr "Show advanced menu properties" + +#. translators: 1: Plugin version, 2: New version. +#. translators: 1: Theme version, 2: New version. +#: wp-admin/update-core.php:552 wp-admin/update-core.php:716 +msgid "You have version %1$s installed. Update to %2$s." +msgstr "You have version %1$s installed. Update to %2$s." + +#: wp-admin/includes/class-wp-debug-data.php:205 +#: wp-admin/includes/class-wp-debug-data.php:210 +#: wp-admin/includes/class-wp-debug-data.php:219 +#: wp-admin/includes/class-wp-debug-data.php:228 +#: wp-admin/includes/class-wp-debug-data.php:237 +#: wp-admin/includes/class-wp-debug-data.php:277 +#: wp-admin/includes/class-wp-debug-data.php:282 +#: wp-admin/includes/class-wp-debug-data.php:292 +#: wp-admin/includes/class-wp-debug-data.php:297 +#: wp-admin/includes/class-wp-debug-data.php:548 +#: wp-admin/includes/class-wp-debug-data.php:1131 +#: wp-admin/includes/class-wp-debug-data.php:1217 +msgid "Enabled" +msgstr "Enabled" + +#: wp-admin/includes/class-wp-comments-list-table.php:740 +msgctxt "comment" +msgid "Not Spam" +msgstr "Not Spam" + +#: wp-admin/includes/class-custom-background.php:318 +msgid "This will restore the original background image. You will not be able to restore any customizations." +msgstr "This will restore the original background image. You will not be able to restore any customisations." + +#: wp-admin/includes/dashboard.php:1464 +msgid "WordPress Blog" +msgstr "WordPress Blog" + +#: wp-admin/user-edit.php:426 wp-admin/user-edit.php:428 +msgid "— No role for this site —" +msgstr "— No role for this site —" + +#: wp-admin/users.php:416 +msgid "Remove Users from Site" +msgstr "Remove Users from Site" + +#: wp-admin/includes/plugin.php:506 +msgid "Custom site deleted message." +msgstr "Custom site deleted message." + +#: wp-admin/includes/plugin.php:508 +msgid "Custom site suspended message." +msgstr "Custom site suspended message." + +#: wp-admin/includes/plugin.php:507 +msgid "Custom site inactive message." +msgstr "Custom site inactive message." + +#: wp-admin/includes/schema.php:403 +msgid "My Site" +msgstr "My Site" + +#: wp-admin/includes/upgrade.php:635 +msgid "New WordPress Site" +msgstr "New WordPress Site" + +#: wp-admin/includes/post.php:829 +msgid "Sorry, you are not allowed to create posts or drafts on this site." +msgstr "Sorry, you are not allowed to create posts or drafts on this site." + +#: wp-admin/includes/post.php:827 +msgid "Sorry, you are not allowed to create pages on this site." +msgstr "Sorry, you are not allowed to create pages on this site." + +#: wp-admin/import.php:72 +msgid "If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:" +msgstr "If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:" + +#: wp-admin/includes/nav-menu.php:443 wp-admin/includes/nav-menu.php:722 +msgid "No items." +msgstr "No items." + +#. translators: %s: Host name. +#: wp-admin/includes/schema.php:1094 +msgid "The installer attempted to contact a random hostname (%s) on your domain." +msgstr "The installer attempted to contact a random hostname (%s) on your domain." + +#. translators: %s: Asterisk symbol (*). +#: wp-admin/includes/schema.php:1105 +msgid "To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool." +msgstr "To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool." + +#: wp-admin/nav-menus.php:265 +msgid "The menu item has been successfully deleted." +msgstr "The menu item has been successfully deleted." + +#: wp-admin/includes/ajax-actions.php:1612 +msgid "Please provide a custom field name." +msgstr "Please provide a custom field name." + +#: wp-admin/includes/class-custom-background.php:348 +msgid "Display Options" +msgstr "Display Options" + +#: wp-admin/includes/class-custom-background.php:299 +#: wp-admin/includes/class-custom-image-header.php:677 +msgid "Remove Image" +msgstr "Remove Image" + +#: wp-admin/users.php:421 +msgid "You have specified these users for removal:" +msgstr "You have specified these users for removal:" + +#: wp-admin/users.php:160 wp-admin/users.php:218 +msgid "User deletion is not allowed from this screen." +msgstr "User deletion is not allowed from this screen." + +#: wp-admin/users.php:443 +msgid "Confirm Removal" +msgstr "Confirm Removal" + +#: wp-admin/users.php:445 +msgid "There are no valid users selected for removal." +msgstr "There are no valid users selected for removal." + +#: wp-admin/users.php:529 +msgid "You can't remove the current user." +msgstr "You can't remove the current user." + +#: wp-admin/users.php:530 +msgid "Other users have been removed." +msgstr "Other users have been removed." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:153 +msgid "Show details." +msgstr "Show details." + +#. translators: %s: Title of an update. +#: wp-admin/includes/class-bulk-upgrader-skin.php:47 +msgid "%s updated successfully." +msgstr "%s updated successfully." + +#: wp-admin/includes/user.php:527 +msgid "Yes, take me to my profile page" +msgstr "Yes, take me to my profile page" + +#: wp-admin/includes/upgrade.php:96 +msgid "Your chosen password." +msgstr "Your chosen password." + +#: wp-admin/includes/user.php:528 +msgid "No thanks, do not remind me again" +msgstr "No thanks, do not remind me again" + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:290 +msgid "%s comment moved to the Trash." +msgid_plural "%s comments moved to the Trash." +msgstr[0] "%s comment moved to the Bin." +msgstr[1] "%s comments moved to the Bin." + +#: wp-admin/post.php:287 wp-admin/upload.php:176 wp-admin/edit.php:144 +msgid "Sorry, you are not allowed to restore this item from the Trash." +msgstr "Sorry, you are not allowed to restore this item from the Bin." + +#: wp-admin/post.php:250 wp-admin/upload.php:155 wp-admin/edit.php:111 +msgid "Sorry, you are not allowed to move this item to the Trash." +msgstr "Sorry, you are not allowed to move this item to the Bin." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:295 +msgid "%s comment restored from the Trash." +msgid_plural "%s comments restored from the Trash." +msgstr[0] "%s comment restored from the Bin." +msgstr[1] "%s comments restored from the Bin." + +#: wp-admin/update-core.php:598 +msgid "The following themes have new versions available. Check the ones you want to update and then click “Update Themes”." +msgstr "The following themes have new versions available. Check the ones you want to update and then click “Update Themes”." + +#: wp-admin/user-new.php:335 +msgid "User has been added to your site." +msgstr "User has been added to your site." + +#: wp-admin/user-new.php:344 +msgid "That user is already a member of this site." +msgstr "That user is already a member of this site." + +#: wp-admin/user-new.php:332 +msgid "Invitation email sent to user. A confirmation link must be clicked for them to be added to your site." +msgstr "Invitation email sent to user. A confirmation link must be clicked for them to be added to your site." + +#: wp-admin/update-core.php:445 +msgid "The following plugins have new versions available. Check the ones you want to update and then click “Update Plugins”." +msgstr "The following plugins have new versions available. Check the ones you want to update and then click “Update Plugins”." + +#: wp-admin/includes/class-custom-background.php:304 +msgid "This will remove the background image. You will not be able to restore any customizations." +msgstr "This will remove the background image. You will not be able to restore any customisations." + +#. translators: %s: Network title. +#: wp-admin/includes/class-wp-themes-list-table.php:132 +msgid "Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes." +msgstr "Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes." + +#: wp-admin/includes/file.php:27 +msgid "Author Template" +msgstr "Author Template" + +#: wp-admin/includes/file.php:54 +msgid "Visual Editor Stylesheet" +msgstr "Visual Editor Stylesheet" + +#: wp-admin/includes/file.php:30 +msgid "Tag Template" +msgstr "Tag Template" + +#: wp-admin/edit-form-advanced.php:204 +msgid "Page saved." +msgstr "Page saved." + +#. translators: %s: Plugin name. +#. translators: %s: Plugin name and version. +#. translators: %s: Importer name. +#: wp-admin/includes/class-wp-plugins-list-table.php:1044 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:622 +#: wp-admin/import.php:204 +msgid "More information about %s" +msgstr "More information about %s" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:559 +#: wp-admin/update-core.php:58 wp-admin/js/updates.js:629 +msgid "Update Now" +msgstr "Update Now" + +#: wp-admin/user-edit.php:440 +msgid "Grant this user super admin privileges for the Network." +msgstr "Grant this user super admin privileges for the Network." + +#: wp-admin/install.php:151 wp-admin/user-edit.php:195 +msgid "Important:" +msgstr "Important:" + +#: wp-admin/user-edit.php:195 +msgid "This user has super admin privileges." +msgstr "This user has super admin privileges." + +#. translators: %s: Theme version. +#: wp-admin/includes/class-wp-theme-install-list-table.php:308 +#: wp-admin/includes/class-wp-theme-install-list-table.php:466 +msgid "Update to version %s" +msgstr "Update to version %s" + +#: wp-admin/setup-config.php:288 +msgid "Error: \"Table Prefix\" can only contain numbers, letters, and underscores." +msgstr "Error: \"Table Prefix\" can only contain numbers, letters and underscores." + +#: wp-admin/options-reading.php:157 +msgid "items" +msgstr "items" + +#: wp-admin/user-edit.php:410 +msgid "Usernames cannot be changed." +msgstr "Usernames cannot be changed." + +#: wp-admin/nav-menus.php:288 +msgid "The menu has been successfully deleted." +msgstr "The menu has been successfully deleted." + +#: wp-admin/options-general.php:71 +msgid "In a few words, explain what this site is about." +msgstr "In a few words, explain what this site is about." + +#: wp-admin/options-reading.php:43 wp-admin/options-reading.php:179 +#: wp-admin/options-reading.php:180 wp-admin/install.php:182 +#: wp-admin/install.php:185 +msgid "Site visibility" +msgstr "Site visibility" + +#: wp-admin/includes/nav-menu.php:1105 +msgid "Link Target" +msgstr "Link Target" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:212 +msgid "CSS Classes (optional)" +msgstr "CSS Classes (optional)" + +#: wp-admin/nav-menus.php:966 wp-admin/nav-menus.php:1101 +msgid "Save Menu" +msgstr "Save Menu" + +#. translators: 1: Theme name, 2: Number of the theme, 3: Total number of +#. themes being updated. +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:24 +msgid "Updating Theme %1$s (%2$d/%3$d)" +msgstr "Updating Theme %1$s (%2$d/%3$d)" + +#: wp-admin/includes/schema.php:978 +msgid "You must provide a domain name." +msgstr "You must provide a domain name." + +#: wp-admin/includes/schema.php:981 +msgid "You must provide a name for your network of sites." +msgstr "You must provide a name for your network of sites." + +#: wp-admin/includes/schema.php:988 wp-admin/includes/schema.php:992 +msgid "The network already exists." +msgstr "The network already exists." + +#. translators: %s: Error message. +#: wp-admin/includes/schema.php:1099 +msgid "This resulted in an error message: %s" +msgstr "This resulted in an error message: %s" + +#: wp-admin/includes/schema.php:1109 +msgid "You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message." +msgstr "You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message." + +#: wp-admin/includes/schema.php:997 +msgid "You must provide a valid email address." +msgstr "You must provide a valid email address." + +#: wp-admin/includes/user.php:524 +msgid "Notice:" +msgstr "Notice:" + +#: wp-admin/edit-form-advanced.php:546 +msgid "Get Shortlink" +msgstr "Get Shortlink" + +#. translators: 1: Plugin name, 2: Number of the plugin, 3: Total number of +#. plugins being updated. +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:24 +msgid "Updating Plugin %1$s (%2$d/%3$d)" +msgstr "Updating Plugin %1$s (%2$d/%3$d)" + +#. translators: %s: Title of an update. +#: wp-admin/includes/class-bulk-upgrader-skin.php:45 +msgid "The update of %s failed." +msgstr "The update of %s failed." + +#: wp-admin/includes/upgrade.php:100 +msgid "User already exists. Password inherited." +msgstr "User already exists. Password inherited." + +#: wp-admin/includes/upgrade.php:117 +msgid "The password you chose during installation." +msgstr "The password you chose during installation." + +#: wp-admin/update-core.php:806 +msgid "Update WordPress" +msgstr "Update WordPress" + +#: wp-admin/update-core.php:448 wp-admin/update-core.php:577 +#: wp-admin/update-core.php:1102 wp-admin/update-core.php:1107 +#: wp-admin/plugins.php:156 +msgid "Update Plugins" +msgstr "Update Plugins" + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Minimum required MySQL version +#. number, 5: Current PHP version number, 6: Current MySQL version number. +#: wp-admin/update-core.php:101 wp-admin/upgrade.php:99 +msgid "You cannot update because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." +msgstr "You cannot update because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." + +#: wp-admin/includes/update-core.php:1436 +#: wp-admin/includes/class-wp-automatic-updater.php:418 +#: wp-admin/update-core.php:853 +msgid "WordPress updated successfully." +msgstr "WordPress updated successfully." + +#: wp-admin/update-core.php:921 wp-admin/update-core.php:982 +msgid "WordPress Updates" +msgstr "WordPress Updates" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:175 +msgid "Edit menu item" +msgstr "Edit menu item" + +#: wp-admin/plugins.php:344 +msgid "You are about to remove the following plugin:" +msgstr "You are about to remove the following plugin:" + +#: wp-admin/plugins.php:340 +msgid "Delete Plugin" +msgstr "Delete Plugin" + +#: wp-admin/includes/class-wp-plugins-list-table.php:760 +msgid "Inactive:" +msgstr "Inactive:" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:530 +msgid "Must-Use (%s)" +msgid_plural "Must-Use (%s)" +msgstr[0] "Must-Use (%s)" +msgstr[1] "Must-Use (%s)" + +#: wp-admin/about.php:292 wp-admin/includes/network.php:148 +msgid "Go to Dashboard" +msgstr "Go to Dashboard" + +#: wp-admin/nav-menus.php:383 wp-admin/nav-menus.php:405 +msgid "Please enter a valid menu name." +msgstr "Please enter a valid menu name." + +#: wp-admin/includes/nav-menu.php:518 wp-admin/includes/nav-menu.php:804 +msgid "View All" +msgstr "View All" + +#: wp-admin/options-general.php:272 +msgid "This timezone is currently in daylight saving time." +msgstr "This timezone is currently in daylight saving time." + +#: wp-admin/options-general.php:295 +msgid "This timezone does not observe daylight saving time." +msgstr "This timezone does not observe daylight saving time." + +#: wp-admin/plugins.php:392 +msgid "Yes, delete these files and data" +msgstr "Yes, delete these files and data" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:538 +msgid "Drop-in (%s)" +msgid_plural "Drop-ins (%s)" +msgstr[0] "Drop-in (%s)" +msgstr[1] "Drop-ins (%s)" + +#: wp-admin/plugins.php:374 +msgid "Are you sure you want to delete these files and data?" +msgstr "Are you sure you want to delete these files and data?" + +#: wp-admin/options-general.php:113 wp-admin/network/settings.php:164 +msgid "This address is used for admin purposes. If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." +msgstr "This address is used for admin purposes. If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." + +#: wp-admin/includes/plugin.php:505 +msgid "Executed before Multisite is loaded." +msgstr "Executed before Multisite is loaded." + +#: wp-admin/includes/plugin.php:499 +msgid "External object cache." +msgstr "External object cache." + +#: wp-admin/includes/plugin.php:498 +msgid "Custom maintenance message." +msgstr "Custom maintenance message." + +#: wp-admin/includes/plugin.php:496 +msgid "Custom database error message." +msgstr "Custom database error message." + +#: wp-admin/includes/file.php:832 +msgid "File is empty. Please upload something more substantial." +msgstr "File is empty. Please upload something more substantial." + +#: wp-admin/includes/plugin.php:495 +msgid "Custom database class." +msgstr "Custom database class." + +#: wp-admin/includes/plugin.php:494 +msgid "Advanced caching plugin." +msgstr "Advanced caching plugin." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Minimum required MySQL version +#. number, 5: Current PHP version number, 6: Current MySQL version number. +#: wp-admin/install.php:257 +msgid "You cannot install because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." +msgstr "You cannot install because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." + +#: wp-admin/comment.php:158 +msgid "This comment is currently in the Trash." +msgstr "This comment is currently in the Bin." + +#: wp-admin/edit-comments.php:311 +msgid "This comment is already in the Trash." +msgstr "This comment is already in the Bin." + +#: wp-admin/edit-comments.php:311 +msgid "View Trash" +msgstr "View Bin" + +#: wp-admin/comment.php:155 +msgid "This comment is currently marked as spam." +msgstr "This comment is currently marked as spam." + +#: wp-admin/comment.php:99 +msgid "Moderate Comment" +msgstr "Moderate Comment" + +#: wp-admin/comment.php:152 +msgid "This comment is currently approved." +msgstr "This comment is currently approved." + +#: wp-admin/edit-comments.php:308 +msgid "This comment is already approved." +msgstr "This comment is already approved." + +#: wp-admin/edit-comments.php:314 +msgid "This comment is already marked as spam." +msgstr "This comment is already marked as spam." + +#: wp-admin/media.php:73 +msgid "You can’t edit this attachment because it is in the Trash. Please move it out of the Trash and try again." +msgstr "You can’t edit this attachment because it is in the Bin. Please move it out of the Bin and try again." + +#: wp-admin/post.php:143 +msgid "You can’t edit this item because it is in the Trash. Please restore it and try again." +msgstr "You can’t edit this item because it is in the Bin. Please restore it and try again." + +#: wp-admin/includes/theme.php:307 +msgid "Custom Colors" +msgstr "Custom Colours" + +#: wp-admin/includes/misc.php:952 wp-admin/user-edit.php:299 +msgid "Admin Color Scheme" +msgstr "Admin Colour Scheme" + +#: wp-admin/options-media.php:143 +msgid "Organize my uploads into month- and year-based folders" +msgstr "Organise my uploads into month- and year-based folders" + +#: wp-admin/maint/repair.php:169 +msgid "Repair and Optimize Database" +msgstr "Repair and Optimise Database" + +#. translators: Default category slug. +#: wp-admin/includes/upgrade.php:160 +msgctxt "Default category slug" +msgid "Uncategorized" +msgstr "Uncategorised" + +#: wp-admin/includes/class-wp-screen.php:969 +msgid "Screen Options" +msgstr "Screen Options" + +#: wp-admin/includes/theme-install.php:139 wp-admin/theme-install.php:182 +msgid "Feature Filter" +msgstr "Feature Filter" + +#: wp-admin/includes/theme.php:323 +msgid "One Column" +msgstr "One Column" + +#: wp-admin/includes/theme.php:324 +msgid "Two Columns" +msgstr "Two Columns" + +#: wp-admin/includes/theme.php:325 +msgid "Three Columns" +msgstr "Three Columns" + +#: wp-admin/includes/theme.php:326 +msgid "Four Columns" +msgstr "Four Columns" + +#: wp-admin/includes/theme.php:327 +msgid "Left Sidebar" +msgstr "Left Sidebar" + +#: wp-admin/includes/theme.php:328 +msgid "Right Sidebar" +msgstr "Right Sidebar" + +#: wp-admin/includes/theme.php:302 wp-admin/includes/theme.php:358 +msgid "Features" +msgstr "Features" + +#: wp-admin/includes/theme.php:318 +msgid "Theme Options" +msgstr "Theme Options" + +#: wp-admin/includes/theme.php:317 +msgid "Sticky Post" +msgstr "Sticky Post" + +#: wp-admin/includes/theme.php:290 wp-admin/includes/theme.php:359 +msgid "Subject" +msgstr "Subject" + +#: wp-admin/includes/theme.php:296 +msgid "Holiday" +msgstr "Holiday" + +#: wp-admin/includes/theme-install.php:172 +msgid "Find Themes" +msgstr "Find Themes" + +#: wp-admin/includes/theme.php:72 wp-admin/includes/class-wp-upgrader.php:155 +msgid "Unable to locate WordPress theme directory." +msgstr "Unable to locate WordPress theme directory." + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:83 +msgid "Could not fully remove the theme %s." +msgstr "Could not fully remove the theme %s." + +#. translators: 1: WordPress version number, 2: Minimum required PHP version +#. number, 3: Minimum required MySQL version number, 4: Current PHP version +#. number, 5: Current MySQL version number. +#: wp-admin/includes/update-core.php:990 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." +msgstr "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." + +#. translators: 1: WordPress version number, 2: Minimum required PHP version +#. number, 3: Current PHP version number. +#: wp-admin/includes/update-core.php:1003 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." +msgstr "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." + +#. translators: 1: WordPress version number, 2: Minimum required MySQL version +#. number, 3: Current MySQL version number. +#: wp-admin/includes/update-core.php:1014 +msgid "The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." +msgstr "The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." + +#: wp-admin/includes/update-core.php:920 +msgid "Verifying the unpacked files…" +msgstr "Verifying the unpacked files…" + +#: wp-admin/includes/update-core.php:933 +msgid "The update could not be unpacked" +msgstr "The update could not be unpacked" + +#: wp-admin/includes/update-core.php:1289 +msgid "Upgrading database…" +msgstr "Upgrading database…" + +#. translators: 1: WordPress version number, 2: URL to WordPress Updates +#. screen. +#: wp-admin/includes/update.php:260 +msgid "You are using a development version (%1$s). Cool! Please stay updated." +msgstr "You are using a development version (%1$s). Cool! Please stay updated." + +#. translators: %s: WordPress version number, or 'Latest' string. +#: wp-admin/includes/update.php:351 +msgid "Update to %s" +msgstr "Update to %s" + +#. translators: %s: WordPress version number, or 'Latest' string. +#: wp-admin/includes/update.php:351 +msgid "Latest" +msgstr "Latest" + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/update.php:831 +msgid "An automated WordPress update has failed to complete - please attempt the update again now." +msgstr "An automated WordPress update has failed to complete - please attempt the update again now." + +#: wp-admin/includes/update.php:835 +msgid "An automated WordPress update has failed to complete! Please notify the site administrator." +msgstr "An automated WordPress update has failed to complete! Please notify the site administrator." + +#: wp-admin/includes/upgrade.php:89 +msgid "Note that password carefully! It is a random password that was generated just for you." +msgstr "Note that password carefully! It is a random password that was generated just for you." + +#: wp-admin/includes/upgrade.php:240 +msgid "Hello world!" +msgstr "Hello world!" + +#. translators: Default post slug. +#: wp-admin/includes/upgrade.php:242 wp-admin/includes/upgrade.php:556 +msgctxt "Default post slug" +msgid "hello-world" +msgstr "hello-world" + +#: wp-admin/install.php:73 +msgid "WordPress › Installation" +msgstr "WordPress › Installation" + +#: wp-admin/install.php:122 +msgid "User(s) already exists." +msgstr "User(s) already exists." + +#: wp-admin/install.php:207 +msgid "Install WordPress" +msgstr "Install WordPress" + +#: wp-admin/install.php:360 +msgid "Information needed" +msgstr "Information needed" + +#: wp-admin/install.php:361 +msgid "Please provide the following information. Don’t worry, you can always change these settings later." +msgstr "Please provide the following information. Don’t worry, you can always change these settings later." + +#: wp-admin/install.php:417 +msgid "Success!" +msgstr "Success!" + +#: wp-admin/link-add.php:16 +msgid "Add New Link" +msgstr "Add New Link" + +#. translators: Add new links. +#: wp-admin/link-manager.php:103 wp-admin/edit-link-form.php:90 +#: wp-admin/menu.php:83 +msgctxt "link" +msgid "Add New" +msgstr "Add New" + +#. translators: %s: Number of links. +#: wp-admin/link-manager.php:124 +msgid "%s link deleted." +msgid_plural "%s links deleted." +msgstr[0] "%s link deleted." +msgstr[1] "%s links deleted" + +#: wp-admin/link-manager.php:132 +msgid "Search Links" +msgstr "Search Links" + +#: wp-admin/includes/class-wp-links-list-table.php:80 +msgid "No links found." +msgstr "No links found." + +#: wp-admin/link.php:117 +msgid "Link not found." +msgstr "Link not found." + +#: wp-admin/maint/repair.php:20 +msgid "WordPress › Database Repair" +msgstr "WordPress › Database Repair" + +#. translators: %s: URL to "Fixing WordPress" forum. +#: wp-admin/maint/repair.php:146 +msgid "Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance." +msgstr "Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance." + +#: wp-admin/maint/repair.php:167 +msgid "Repair Database" +msgstr "Repair Database" + +#: wp-admin/media-new.php:42 +msgid "Upload New Media" +msgstr "Upload New Media" + +#: wp-admin/media.php:67 +msgid "You attempted to edit an attachment that doesn’t exist. Perhaps it was deleted?" +msgstr "You attempted to edit an attachment that doesn’t exist. Perhaps it was deleted?" + +#: wp-admin/media.php:136 wp-admin/media.php:156 +msgid "Update Media" +msgstr "Update Media" + +#: wp-admin/menu.php:67 +msgid "Library" +msgstr "Library" + +#. translators: Add new file. +#: wp-admin/media.php:129 wp-admin/upload.php:90 wp-admin/upload.php:273 +#: wp-admin/menu.php:69 +msgctxt "file" +msgid "Add New" +msgstr "Add New" + +#. translators: %s: Number of comments. +#: wp-admin/menu.php:98 +msgid "Comments %s" +msgstr "Comments %s" + +#. translators: Add new plugin. +#: wp-admin/plugins.php:725 wp-admin/menu.php:246 wp-admin/network/menu.php:106 +msgctxt "plugin" +msgid "Add New" +msgstr "Add New" + +#: wp-admin/user-edit.php:35 wp-admin/user/menu.php:14 wp-admin/menu.php:255 +#: wp-admin/menu.php:267 wp-admin/menu.php:270 +msgid "Profile" +msgstr "Profile" + +#: wp-admin/menu.php:293 +msgctxt "settings screen" +msgid "General" +msgstr "General" + +#: wp-admin/menu.php:294 +msgid "Writing" +msgstr "Writing" + +#: wp-admin/menu.php:295 +msgid "Reading" +msgstr "Reading" + +#: wp-admin/credits.php:51 wp-admin/privacy.php:12 wp-admin/privacy.php:48 +#: wp-admin/privacy.php:54 wp-admin/freedoms.php:54 wp-admin/about.php:49 +#: wp-admin/menu.php:299 +msgid "Privacy" +msgstr "Privacy" + +#: wp-admin/menu.php:298 +msgid "Permalinks" +msgstr "Permalinks" + +#: wp-admin/my-sites.php:13 wp-admin/ms-delete-site.php:13 +#: wp-admin/network/admin.php:17 +msgid "Multisite support is not enabled." +msgstr "Multisite support is not enabled." + +#: wp-admin/my-sites.php:124 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:720 +#: wp-admin/network/site-info.php:137 wp-admin/network/site-users.php:229 +#: wp-admin/network/site-themes.php:179 wp-admin/network/site-settings.php:94 +msgid "Visit" +msgstr "Visit" + +#: wp-admin/update-core.php:610 wp-admin/update-core.php:741 +#: wp-admin/update-core.php:1142 wp-admin/update-core.php:1147 +#: wp-admin/network/themes.php:84 +msgid "Update Themes" +msgstr "Update Themes" + +#: wp-admin/includes/class-wp-users-list-table.php:159 +#: wp-admin/includes/deprecated.php:570 +#: wp-admin/includes/class-wp-ms-users-list-table.php:126 +msgid "No users found." +msgstr "No users found." + +#: wp-admin/edit-form-advanced.php:407 wp-admin/options-discussion.php:15 +msgid "Discussion Settings" +msgstr "Discussion Settings" + +#: wp-admin/options-discussion.php:64 wp-admin/options-discussion.php:65 +msgid "Other comment settings" +msgstr "Other comment settings" + +#: wp-admin/options-discussion.php:70 +msgid "Users must be registered and logged in to comment" +msgstr "Users must be registered and logged in to comment" + +#. translators: %s: Number of levels. +#: wp-admin/options-discussion.php:119 +msgid "Enable threaded (nested) comments %s levels deep" +msgstr "Enable threaded (nested) comments %s levels deep" + +#: wp-admin/options-discussion.php:131 +msgid "last" +msgstr "last" + +#: wp-admin/options-discussion.php:135 +msgid "first" +msgstr "first" + +#. translators: 1: Form field control for number of top level comments per +#. page, 2: Form field control for the 'first' or 'last' page. +#: wp-admin/options-discussion.php:138 +msgid "Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default" +msgstr "Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default" + +#: wp-admin/options-discussion.php:152 +msgid "older" +msgstr "older" + +#: wp-admin/options-discussion.php:156 +msgid "newer" +msgstr "newer" + +#. translators: %s: Form field control for 'older' or 'newer' comments. +#: wp-admin/options-discussion.php:159 +msgid "Comments should be displayed with the %s comments at the top of each page" +msgstr "Comments should be displayed with the %s comments at the top of each page" + +#: wp-admin/options-discussion.php:170 +msgid "Anyone posts a comment" +msgstr "Anyone posts a comment" + +#: wp-admin/options-discussion.php:174 +msgid "A comment is held for moderation" +msgstr "A comment is held for moderation" + +#: wp-admin/options-discussion.php:178 wp-admin/options-discussion.php:179 +msgid "Before a comment appears" +msgstr "Before a comment appears" + +#: wp-admin/options-discussion.php:184 +msgid "Comment author must have a previously approved comment" +msgstr "Comment author must have a previously approved comment" + +#: wp-admin/options-discussion.php:188 wp-admin/options-discussion.php:189 +msgid "Comment Moderation" +msgstr "Comment Moderation" + +#. translators: %s: Number of links. +#: wp-admin/options-discussion.php:194 +msgid "Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)" +msgstr "Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)" + +#: wp-admin/options-discussion.php:218 +msgid "Avatars" +msgstr "Avatars" + +#: wp-admin/options-discussion.php:234 +msgid "Avatar Display" +msgstr "Avatar Display" + +#: wp-admin/options-discussion.php:238 +msgid "Show Avatars" +msgstr "Show Avatars" + +#: wp-admin/options-discussion.php:243 wp-admin/options-discussion.php:244 +msgid "Maximum Rating" +msgstr "Maximum Rating" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:249 +msgid "G — Suitable for all audiences" +msgstr "G — Suitable for all audiences" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:251 +msgid "PG — Possibly offensive, usually for audiences 13 and above" +msgstr "PG — Possibly offensive, usually for audiences 13 and above" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:253 +msgid "R — Intended for adult audiences above 17" +msgstr "R — Intended for adult audiences above 17" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:255 +msgid "X — Even more mature than above" +msgstr "X — Even more mature than above" + +#: wp-admin/options-discussion.php:266 wp-admin/options-discussion.php:267 +msgid "Default Avatar" +msgstr "Default Avatar" + +#: wp-admin/options-discussion.php:276 +msgid "Blank" +msgstr "Blank" + +#: wp-admin/options-discussion.php:277 +msgid "Gravatar Logo" +msgstr "Gravatar Logo" + +#: wp-admin/options-discussion.php:278 +msgid "Identicon (Generated)" +msgstr "Identicon (Generated)" + +#: wp-admin/options-discussion.php:279 +msgid "Wavatar (Generated)" +msgstr "Wavatar (Generated)" + +#: wp-admin/options-discussion.php:280 +msgid "MonsterID (Generated)" +msgstr "MonsterID (Generated)" + +#: wp-admin/options-general.php:19 +msgid "General Settings" +msgstr "General Settings" + +#: wp-admin/options-general.php:141 wp-admin/options-general.php:142 +msgid "Membership" +msgstr "Membership" + +#: wp-admin/options-general.php:144 +msgid "Anyone can register" +msgstr "Anyone can register" + +#: wp-admin/options-general.php:149 +msgid "New User Default Role" +msgstr "New User Default Role" + +#: wp-admin/includes/class-wp-debug-data.php:80 +#: wp-admin/options-general.php:224 +msgid "Timezone" +msgstr "Timezone" + +#: wp-admin/options-general.php:274 +msgid "This timezone is currently in standard time." +msgstr "This timezone is currently in standard time." + +#: wp-admin/options-general.php:333 wp-admin/options-general.php:370 +msgid "Custom:" +msgstr "Custom:" + +#: wp-admin/options-general.php:383 +msgid "Week Starts On" +msgstr "Week Starts On" + +#: wp-admin/options-media.php:16 +msgid "Media Settings" +msgstr "Media Settings" + +#: wp-admin/options-media.php:51 +msgid "Image sizes" +msgstr "Image sizes" + +#: wp-admin/options-media.php:56 wp-admin/options-media.php:57 +msgid "Thumbnail size" +msgstr "Thumbnail size" + +#: wp-admin/options-media.php:65 +msgid "Crop thumbnail to exact dimensions (normally thumbnails are proportional)" +msgstr "Crop thumbnail to exact dimensions (normally thumbnails are proportional)" + +#: wp-admin/options-media.php:70 wp-admin/options-media.php:71 +msgid "Medium size" +msgstr "Medium size" + +#: wp-admin/options-media.php:72 wp-admin/options-media.php:83 +msgid "Max Width" +msgstr "Max Width" + +#: wp-admin/options-media.php:75 wp-admin/options-media.php:86 +msgid "Max Height" +msgstr "Max Height" + +#: wp-admin/options-media.php:81 wp-admin/options-media.php:82 +msgid "Large size" +msgstr "Large size" + +#: wp-admin/options-media.php:107 +msgid "Uploading Files" +msgstr "Uploading Files" + +#: wp-admin/options-media.php:118 +msgid "Store uploads in this folder" +msgstr "Store uploads in this folder" + +#: wp-admin/options-media.php:130 +msgid "Full URL path to files" +msgstr "Full URL path to files" + +#: wp-admin/options-media.php:132 +msgid "Configuring this is optional. By default, it should be blank." +msgstr "Configuring this is optional. By default, it should be blank." + +#: wp-admin/options-permalink.php:16 wp-admin/options-permalink.php:32 +msgid "Permalink Settings" +msgstr "Permalink Settings" + +#: wp-admin/options-permalink.php:161 +msgid "Permalink structure updated." +msgstr "Permalink structure updated." + +#: wp-admin/options-permalink.php:239 +msgid "Day and name" +msgstr "Day and name" + +#: wp-admin/options-permalink.php:243 +msgid "Month and name" +msgstr "Month and name" + +#: wp-admin/options-permalink.php:247 +msgid "Numeric" +msgstr "Numeric" + +#: wp-admin/options-permalink.php:257 +msgid "Custom Structure" +msgstr "Custom Structure" + +#: wp-admin/options-permalink.php:330 +msgid "Optional" +msgstr "Optional" + +#. translators: Prefix for category permalinks. +#: wp-admin/options-permalink.php:340 +msgid "Category base" +msgstr "Category base" + +#: wp-admin/options-permalink.php:344 +msgid "Tag base" +msgstr "Tag base" + +#: wp-admin/options-reading.php:16 +msgid "Reading Settings" +msgstr "Reading Settings" + +#. translators: %s: URL to Pages screen. +#: wp-admin/options-reading.php:98 +msgid "A static page (select below)" +msgstr "A static page (select below)" + +#. translators: %s: Select field to choose the page for posts. +#: wp-admin/options-reading.php:126 +msgid "Posts page: %s" +msgstr "Posts page: %s" + +#: wp-admin/options-reading.php:141 +msgid "Warning: these pages should not be the same!" +msgstr "Warning: these pages should not be the same!" + +#: wp-admin/options-reading.php:150 +msgid "Blog pages show at most" +msgstr "Blog pages show at most" + +#: wp-admin/options-reading.php:156 +msgid "Syndication feeds show the most recent" +msgstr "Syndication feeds show the most recent" + +#: wp-admin/options-reading.php:163 +msgid "Full text" +msgstr "Full text" + +#: wp-admin/options-reading.php:164 +msgid "Summary" +msgstr "Summary" + +#: wp-admin/options-reading.php:67 +msgid "Encoding for pages and feeds" +msgstr "Encoding for pages and feeds" + +#: wp-admin/options-writing.php:16 +msgid "Writing Settings" +msgstr "Writing Settings" + +#: wp-admin/options-writing.php:68 wp-admin/options-writing.php:69 +msgid "Formatting" +msgstr "Formatting" + +#: wp-admin/options-writing.php:72 +msgid "Convert emoticons like :-) and :-P to graphics on display" +msgstr "Convert emoticons like :-) and :-P to graphics on display" + +#: wp-admin/options-writing.php:73 +msgid "WordPress should correct invalidly nested XHTML automatically" +msgstr "WordPress should correct invalidly nested XHTML automatically" + +#: wp-admin/options-writing.php:78 +msgid "Default Post Category" +msgstr "Default Post Category" + +#: wp-admin/options-writing.php:112 +msgid "Default Link Category" +msgstr "Default Link Category" + +#: wp-admin/options-writing.php:155 +msgid "Mail Server" +msgstr "Mail Server" + +#: wp-admin/options-writing.php:157 +msgid "Port" +msgstr "Port" + +#: wp-admin/options-writing.php:162 +msgid "Login Name" +msgstr "Login Name" + +#: wp-admin/options-writing.php:172 +msgid "Default Mail Category" +msgstr "Default Mail Category" + +#: wp-admin/options-writing.php:44 wp-admin/options-writing.php:201 +msgid "Update Services" +msgstr "Update Services" + +#: wp-admin/options.php:348 +msgid "All Settings" +msgstr "All Settings" + +#: wp-admin/plugin-editor.php:21 +msgid "Edit Plugins" +msgstr "Edit Plugins" + +#: wp-admin/includes/file.php:486 wp-admin/plugin-editor.php:116 +msgid "Files of this type are not editable." +msgstr "Files of this type are not editable." + +#: wp-admin/includes/ajax-actions.php:4716 wp-admin/theme-editor.php:189 +#: wp-admin/plugin-editor.php:184 +msgid "File edited successfully." +msgstr "File edited successfully." + +#: wp-admin/plugin-editor.php:219 +msgid "Select plugin to edit:" +msgstr "Select plugin to edit:" + +#: wp-admin/plugin-editor.php:242 +msgid "Plugin Files" +msgstr "Plugin Files" + +#: wp-admin/theme-editor.php:293 wp-admin/plugin-editor.php:272 +msgid "Documentation:" +msgstr "Documentation:" + +#: wp-admin/theme-editor.php:314 wp-admin/plugin-editor.php:287 +msgid "Update File" +msgstr "Update File" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:109 +msgctxt "Plugin Installer" +msgid "Featured" +msgstr "Featured" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:110 +msgctxt "Plugin Installer" +msgid "Popular" +msgstr "Popular" + +#: wp-admin/plugins.php:545 +msgid "Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here." +msgstr "Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here." + +#: wp-admin/plugins.php:637 +msgid "Plugin could not be activated because it triggered a fatal error." +msgstr "Plugin could not be activated because it triggered a fatal error." + +#. translators: %s: Error message. +#: wp-admin/plugins.php:674 +msgid "Plugin could not be deleted due to an error: %s" +msgstr "Plugin could not be deleted due to an error: %s" + +#: wp-admin/includes/class-wp-plugins-list-table.php:605 +#: wp-admin/includes/class-wp-plugins-list-table.php:790 +msgid "Network Deactivate" +msgstr "Network Deactivate" + +#: wp-admin/includes/class-wp-plugins-list-table.php:601 +#: wp-admin/includes/class-wp-plugins-list-table.php:801 +#: wp-admin/includes/class-plugin-installer-skin.php:124 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:591 +#: wp-admin/js/updates.js:738 +msgid "Network Activate" +msgstr "Network Activate" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1052 +msgid "Visit plugin site" +msgstr "Visit plugin site" + +#: wp-admin/includes/class-wp-plugins-list-table.php:658 +msgid "Clear List" +msgstr "Clear List" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:497 +msgctxt "plugins" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:506 +msgid "Active (%s)" +msgid_plural "Active (%s)" +msgstr[0] "Active (%s)" +msgstr[1] "Active (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:514 +msgid "Recently Active (%s)" +msgid_plural "Recently Active (%s)" +msgstr[0] "Recently Active (%s)" +msgstr[1] "Recently Active (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:522 +msgid "Inactive (%s)" +msgid_plural "Inactive (%s)" +msgstr[0] "Inactive (%s)" +msgstr[1] "Inactive (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:417 +msgid "No plugins found." +msgstr "No plugins found." + +#: wp-admin/edit-tags.php:160 wp-admin/edit-tags.php:180 wp-admin/post.php:127 +#: wp-admin/term.php:31 +msgid "You attempted to edit an item that doesn’t exist. Perhaps it was deleted?" +msgstr "You attempted to edit an item that doesn’t exist. Perhaps it was deleted?" + +#: wp-admin/theme-editor.php:21 +msgid "Edit Themes" +msgstr "Edit Themes" + +#: wp-admin/theme-editor.php:225 +msgid "Select theme to edit:" +msgstr "Select theme to edit:" + +#: wp-admin/themes.php:276 wp-admin/network/themes.php:389 +msgid "Theme deleted." +msgstr "Theme deleted." + +#: wp-admin/includes/theme.php:802 wp-admin/themes.php:924 +msgid "Current Theme" +msgstr "Current Theme" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-themes-list-table.php:232 +msgid "" +"You are about to delete this theme '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"You are about to delete this theme '%s'\n" +" 'Cancel' to stop, 'OK' to delete." + +#: wp-admin/themes.php:574 +msgid "Broken Themes" +msgstr "Broken Themes" + +#: wp-admin/update-core.php:163 +msgid "Hide this update" +msgstr "Hide this update" + +#: wp-admin/update-core.php:165 +msgid "Bring back this update" +msgstr "Bring back this update" + +#: wp-admin/update-core.php:199 wp-admin/update-core.php:210 +msgid "Show hidden updates" +msgstr "Show hidden updates" + +#: wp-admin/update-core.php:200 +msgid "Hide hidden updates" +msgstr "Hide hidden updates" + +#: wp-admin/update.php:89 +msgid "Plugin Reactivation" +msgstr "Plugin Reactivation" + +#: wp-admin/update.php:91 +msgid "Plugin reactivated successfully." +msgstr "Plugin reactivated successfully." + +#: wp-admin/update.php:95 +msgid "Plugin failed to reactivate due to a fatal error." +msgstr "Plugin failed to reactivate due to a fatal error." + +#. translators: %s: Plugin name and version. +#: wp-admin/update.php:132 +msgid "Installing Plugin: %s" +msgstr "Installing Plugin: %s" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:117 +#: wp-admin/update.php:156 wp-admin/plugin-install.php:138 +msgid "Upload Plugin" +msgstr "Upload Plugin" + +#. translators: %s: Theme name and version. +#: wp-admin/update.php:278 +msgid "Installing Theme: %s" +msgstr "Installing Theme: %s" + +#: wp-admin/update.php:298 wp-admin/theme-install.php:58 +#: wp-admin/theme-install.php:152 wp-admin/theme-install.php:154 +msgid "Upload Theme" +msgstr "Upload Theme" + +#: wp-admin/includes/user.php:564 +msgid "Use https" +msgstr "Use https" + +#: wp-admin/includes/user.php:565 +msgid "Always use https when visiting the admin" +msgstr "Always use https when visiting the admin" + +#: wp-admin/user-edit.php:202 +msgid "User updated." +msgstr "User updated." + +#: wp-admin/user-edit.php:260 +msgid "Personal Options" +msgstr "Personal Options" + +#: wp-admin/user-edit.php:265 +msgid "Visual Editor" +msgstr "Visual Editor" + +#: wp-admin/user-edit.php:268 +msgid "Disable the visual editor when writing" +msgstr "Disable the visual editor when writing" + +#: wp-admin/user-edit.php:325 +msgid "Enable keyboard shortcuts for comment moderation." +msgstr "Enable keyboard shortcuts for comment moderation." + +#: wp-admin/user-new.php:516 wp-admin/user-edit.php:448 +msgid "First Name" +msgstr "First Name" + +#: wp-admin/user-new.php:520 wp-admin/user-edit.php:453 +msgid "Last Name" +msgstr "Last Name" + +#: wp-admin/user-edit.php:458 +msgid "Nickname" +msgstr "Nickname" + +#: wp-admin/user-edit.php:463 +msgid "Display name publicly as" +msgstr "Display name publicly as" + +#: wp-admin/user-edit.php:502 +msgid "Contact Info" +msgstr "Contact Info" + +#: wp-admin/user-edit.php:571 +msgid "About Yourself" +msgstr "About Yourself" + +#: wp-admin/user-edit.php:571 +msgid "About the user" +msgstr "About the user" + +#: wp-admin/user-edit.php:575 +msgid "Biographical Info" +msgstr "Biographical Info" + +#: wp-admin/user-edit.php:577 +msgid "Share a little biographical information to fill out your profile. This may be shown publicly." +msgstr "Share a little biographical information to fill out your profile. This may be shown publicly." + +#: wp-admin/user-edit.php:632 +msgid "New Password" +msgstr "New Password" + +#: wp-admin/user-edit.php:657 +msgid "Type your new password again." +msgstr "Type your new password again." + +#: wp-admin/user-edit.php:821 +msgid "Additional Capabilities" +msgstr "Additional Capabilities" + +#: wp-admin/user-edit.php:852 +msgid "Update Profile" +msgstr "Update Profile" + +#: wp-admin/user-edit.php:852 +msgid "Update User" +msgstr "Update User" + +#: wp-admin/users.php:274 +msgid "Delete Users" +msgstr "Delete Users" + +#: wp-admin/users.php:347 +msgid "There are no valid users selected for deletion." +msgstr "There are no valid users selected for deletion." + +#: wp-admin/users.php:495 +msgid "New user created." +msgstr "New user created." + +#: wp-admin/users.php:518 +msgid "The current user’s role must have user editing capabilities." +msgstr "The current user’s role must have user editing capabilities." + +#: wp-admin/users.php:519 +msgid "Other user roles have been changed." +msgstr "Other user roles have been changed." + +#: wp-admin/users.php:522 +msgid "You can’t delete the current user." +msgstr "You can’t delete the current user." + +#: wp-admin/users.php:523 +msgid "Other users have been deleted." +msgstr "Other users have been deleted." + +#. translators: 1: User role name, 2: Number of users. +#: wp-admin/includes/class-wp-users-list-table.php:227 +#: wp-admin/includes/class-wp-users-list-table.php:246 +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#: wp-admin/includes/class-wp-users-list-table.php:294 +#: wp-admin/includes/class-wp-users-list-table.php:296 +msgid "Change role to…" +msgstr "Change role to…" + +#: wp-admin/includes/class-wp-users-list-table.php:300 +msgid "Change" +msgstr "Change" + +#: wp-admin/widgets.php:126 +msgid "Inactive Widgets" +msgstr "Inactive Widgets" + +#. translators: %s: Widget name. +#: wp-admin/widgets.php:298 +msgid "Widget %s" +msgstr "Widget %s" + +#: wp-admin/widgets.php:313 +msgid "Select both the sidebar for this widget and the position of the widget in that sidebar." +msgstr "Select both the sidebar for this widget and the position of the widget in that sidebar." + +#: wp-admin/widgets.php:315 +msgid "Position" +msgstr "Position" + +#: wp-admin/widgets.php:360 +msgid "Save Widget" +msgstr "Save Widget" + +#: wp-admin/widgets.php:378 wp-admin/js/inline-edit-tax.js:227 +#: wp-admin/js/inline-edit-post.js:438 +msgid "Changes saved." +msgstr "Changes saved." + +#: wp-admin/includes/misc.php:1246 wp-admin/includes/post.php:1958 +#: wp-admin/widgets.php:382 +msgid "Error while saving." +msgstr "Error while saving." + +#: wp-admin/widgets.php:383 +msgid "Error in displaying the widget settings form." +msgstr "Error in displaying the widget settings form." + +#: wp-admin/widgets.php:442 wp-admin/widgets.php:445 +msgid "Available Widgets" +msgstr "Available Widgets" + +#: wp-admin/widgets.php:129 +msgid "Drag widgets here to remove them from the sidebar but keep their settings." +msgstr "Drag widgets here to remove them from the sidebar but keep their settings." + +#: wp-admin/export.php:186 +msgid "Categories:" +msgstr "Categories:" + +#. translators: %s: Theme version. +#: wp-admin/includes/theme.php:807 wp-admin/themes.php:929 +#: wp-admin/theme-install.php:461 +msgid "Version: %s" +msgstr "Version: %s" + +#: wp-admin/includes/theme.php:981 wp-admin/themes.php:1087 +msgid "Tags:" +msgstr "Tags:" + +#: wp-admin/plugins.php:392 +msgid "Yes, delete these files" +msgstr "Yes, delete these files" + +#: wp-admin/plugins.php:400 +msgid "No, return me to the plugin list" +msgstr "No, return me to the plugin list" + +#. translators: %s: WP_PLUGIN_DIR constant value. +#: wp-admin/plugins.php:562 +msgid "If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated." +msgstr "If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated." + +#: wp-admin/upload.php:324 wp-admin/upload.php:359 +msgid "Media file permanently deleted." +msgstr "Media file permanently deleted." + +#: wp-admin/media.php:23 wp-admin/media.php:61 +msgid "Sorry, you are not allowed to edit this attachment." +msgstr "Sorry, you are not allowed to edit this attachment." + +#: wp-admin/edit-tags.php:173 wp-admin/includes/post.php:1964 +#: wp-admin/includes/class-wp-screen.php:295 wp-admin/post.php:20 +#: wp-admin/post.php:47 wp-admin/post.php:139 wp-admin/term.php:43 +#: wp-admin/media-upload.php:47 +msgid "Sorry, you are not allowed to edit this item." +msgstr "Sorry, you are not allowed to edit this item." + +#: wp-admin/edit-tags.php:137 wp-admin/options.php:78 +msgid "Sorry, you are not allowed to delete these items." +msgstr "Sorry, you are not allowed to delete these items." + +#: wp-admin/upgrade.php:73 +msgid "Your WordPress database is already up to date!" +msgstr "Your WordPress database is already up to date!" + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:380 +msgid "If you temporarily make your %s file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after rule has been saved." +msgstr "If you temporarily make your %s file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after the rule has been saved." + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:405 +msgid "If you temporarily make your site’s root directory writable for us to generate the %s file automatically, do not forget to revert the permissions after the file has been created." +msgstr "If you temporarily make your site’s root directory writable for us to generate the %s file automatically, do not forget to revert the permissions after the file has been created." + +#: wp-admin/options-privacy.php:115 +msgid "Privacy Settings" +msgstr "Privacy Settings" + +#. translators: %s: Site link. +#. translators: First post content. %s: Site link. +#: wp-admin/includes/schema.php:1258 wp-admin/includes/upgrade.php:213 +msgid "Welcome to %s. This is your first post. Edit or delete it, then start writing!" +msgstr "Welcome to %s. This is your first post. Edit or delete it, then start writing!" + +#. translators: %s: Post title. +#: wp-admin/revision.php:109 +msgid "Compare Revisions of “%s”" +msgstr "Compare revisions of “%s”" + +#. translators: Joining confirmation notification email subject. %s: Site +#. title. +#: wp-admin/user-new.php:129 +msgid "[%s] Joining Confirmation" +msgstr "[%s] Joining Confirmation" + +#: wp-admin/options-discussion.php:66 +msgid "Comment author must fill out name and email" +msgstr "Comment author must fill out name and email" + +#: wp-admin/install.php:179 +msgid "Double-check your email address before continuing." +msgstr "Double-check your email address before continuing." + +#: wp-admin/options-discussion.php:166 wp-admin/options-discussion.php:167 +msgid "Email me whenever" +msgstr "Email me whenever" + +#: wp-admin/options-discussion.php:270 +msgid "For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address." +msgstr "For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address." + +#: wp-admin/user-new.php:329 +msgid "Invitation email sent to new user. A confirmation link must be clicked before their account is created." +msgstr "Invitation email sent to new user. A confirmation link must be clicked before their account is created." + +#: wp-admin/options-writing.php:140 +msgid "Post via email" +msgstr "Post via email" + +#: wp-admin/user-new.php:450 wp-admin/user-new.php:617 +msgid "Skip Confirmation Email" +msgstr "Skip Confirmation Email" + +#: wp-admin/install.php:177 +msgid "Your Email" +msgstr "Your Email" + +#: wp-admin/user-new.php:338 wp-admin/users.php:508 +#: wp-admin/network/user-new.php:94 +msgid "Edit user" +msgstr "Edit user" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:484 wp-admin/update-core.php:493 +msgid "Compatibility with WordPress %s: Unknown" +msgstr "Compatibility with WordPress %s: unknown" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:481 wp-admin/update-core.php:490 +msgid "Compatibility with WordPress %s: 100%% (according to its author)" +msgstr "Compatibility with WordPress %s: 100%% (according to its author)" + +#: wp-admin/plugins.php:376 +msgid "Are you sure you want to delete these files?" +msgstr "Are you sure you want to delete these files?" + +#. translators: %s: Number of days. +#: wp-admin/options-discussion.php:83 +msgid "Automatically close comments on posts older than %s days" +msgstr "Automatically close comments on posts older than %s days" + +#: wp-admin/options-discussion.php:60 +msgid "These settings may be overridden for individual posts." +msgstr "These settings may be overridden for individual posts." + +#: wp-admin/upload.php:349 wp-admin/upload.php:362 +msgid "Media file restored from the Trash." +msgstr "Media file restored from the Bin." + +#: wp-admin/upload.php:336 wp-admin/upload.php:361 +msgid "Media file moved to the Trash." +msgstr "Media file moved to the Bin." + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:174 +msgid "Permalink structure updated. Remove write access on %s file now!" +msgstr "Permalink structure updated. Remove write access on %s file now!" + +#: wp-admin/includes/user.php:201 +msgid "Error: Please enter an email address." +msgstr "Error: please enter an email address." + +#: wp-admin/includes/user.php:172 +msgid "Error: Passwords may not contain the character \"\\\"." +msgstr "Error: passwords may not contain the character \"\\\"." + +#: wp-admin/includes/user.php:167 +msgid "Error: Please enter a password." +msgstr "Error: please enter a password." + +#: wp-admin/includes/class-theme-installer-skin.php:224 +msgid "This theme is already installed." +msgstr "This theme is already installed." + +#: wp-admin/options-discussion.php:200 +msgid "When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be held in the moderation queue. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." +msgstr "When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be held in the moderation queue. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." + +#: wp-admin/options-discussion.php:209 +msgid "When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be put in the Trash. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." +msgstr "When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be put in the Bin. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." + +#. translators: 1, 2, 3: Examples of random email addresses. +#: wp-admin/options-writing.php:145 +msgid "To post to WordPress by email, you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it’s a good idea to keep this address very secret. Here are three random strings you could use: %1$s, %2$s, %3$s." +msgstr "To post to WordPress by email, you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it’s a good idea to keep this address very secret. Here are three random strings you could use: %1$s, %2$s, %3$s." + +#. translators: %s: File name. +#: wp-admin/update.php:162 +msgid "Installing plugin from uploaded file: %s" +msgstr "Installing plugin from uploaded file: %s" + +#. translators: %s: File name. +#: wp-admin/update.php:305 +msgid "Installing theme from uploaded file: %s" +msgstr "Installing theme from uploaded file: %s" + +#: wp-admin/includes/theme-install.php:182 +msgid "If you have a theme in a .zip format, you may install or update it by uploading it here." +msgstr "If you have a theme in a .zip format, you may install or update it by uploading it here." + +#: wp-admin/includes/class-wp-automatic-updater.php:416 +#: wp-admin/update-core.php:847 wp-admin/js/updates.js:809 +#: wp-admin/js/updates.js:1464 +msgid "Installation failed." +msgstr "Installation failed." + +#: wp-admin/includes/class-wp-media-list-table.php:210 +#: wp-admin/includes/class-wp-comments-list-table.php:418 +#: wp-admin/includes/class-wp-posts-list-table.php:568 +msgid "Empty Trash" +msgstr "Empty Bin" + +#: wp-admin/includes/class-wp-media-list-table.php:704 +#: wp-admin/includes/class-wp-media-list-table.php:760 +#: wp-admin/includes/class-wp-comments-list-table.php:768 +#: wp-admin/includes/class-wp-posts-list-table.php:1374 +#: wp-admin/includes/dashboard.php:744 +msgctxt "verb" +msgid "Trash" +msgstr "Bin" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1285 +msgid "neighbor" +msgstr "neighbour" + +#: wp-admin/comment.php:143 +msgid "You are about to approve the following comment:" +msgstr "You are about to approve the following comment:" + +#: wp-admin/comment.php:367 +msgid "Unknown action." +msgstr "Unknown action." + +#: wp-admin/includes/class-custom-background.php:226 +#: wp-admin/includes/theme.php:306 +msgid "Custom Background" +msgstr "Custom Background" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-custom-background.php:247 +msgid "Background updated. Visit your site to see how it looks." +msgstr "Background updated. Visit your site to see how it looks." + +#: wp-admin/includes/class-custom-background.php:329 +#: wp-admin/includes/class-custom-image-header.php:609 +msgid "Choose an image from your computer:" +msgstr "Choose an image from your computer:" + +#: wp-admin/includes/theme.php:308 +#: wp-admin/includes/class-custom-image-header.php:475 +msgid "Custom Header" +msgstr "Custom Header" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-custom-image-header.php:496 +msgid "Header updated. Visit your site to see how it looks." +msgstr "Header updated. Visit your site to see how it looks." + +#: wp-admin/includes/class-custom-image-header.php:838 +#: wp-admin/includes/class-custom-image-header.php:981 +msgid "Image Processing Error" +msgstr "Image Processing Error" + +#: wp-admin/includes/class-custom-image-header.php:856 +msgid "Choose the part of the image you want to use as your header." +msgstr "Choose the part of the image you want to use as your header." + +#. translators: %s: Link name. +#. translators: %s: Taxonomy term name. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-links-list-table.php:197 +#: wp-admin/includes/class-wp-terms-list-table.php:482 +#: wp-admin/includes/class-wp-media-list-table.php:693 +#: wp-admin/includes/class-wp-media-list-table.php:741 +#: wp-admin/includes/class-wp-posts-list-table.php:1345 +#: wp-admin/includes/dashboard.php:630 wp-admin/includes/dashboard.php:995 +msgid "Edit “%s”" +msgstr "Edit “%s”" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:722 +#: wp-admin/includes/class-wp-media-list-table.php:780 +#: wp-admin/includes/class-wp-posts-list-table.php:1405 +msgid "View “%s”" +msgstr "View “%s”" + +#: wp-admin/includes/class-wp-media-list-table.php:478 +#: wp-admin/includes/class-wp-posts-list-table.php:1076 +msgid "Unpublished" +msgstr "Unpublished" + +#: wp-admin/includes/class-wp-media-list-table.php:545 +msgid "(Unattached)" +msgstr "(Unattached)" + +#: wp-admin/includes/class-wp-media-list-table.php:184 +#: wp-admin/includes/class-wp-media-list-table.php:555 +#: wp-admin/includes/class-wp-media-list-table.php:732 +msgid "Attach" +msgstr "Attach" + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:279 +msgid "%s comment marked as spam." +msgid_plural "%s comments marked as spam." +msgstr[0] "%s comment marked as spam." +msgstr[1] "%s comments marked as spam." + +#: wp-admin/edit-form-comment.php:102 +msgid "Approved" +msgstr "Approved" + +#: wp-admin/edit-comments.php:329 +msgid "Search Comments" +msgstr "Search Comments" + +#: wp-admin/includes/class-wp-comments-list-table.php:356 +#: wp-admin/includes/class-wp-comments-list-table.php:696 +#: wp-admin/includes/class-wp-comments-list-table.php:721 +#: wp-admin/includes/dashboard.php:703 +msgid "Unapprove" +msgstr "Unapprove" + +#: wp-admin/includes/class-wp-comments-list-table.php:359 +#: wp-admin/includes/class-wp-comments-list-table.php:704 +#: wp-admin/includes/class-wp-comments-list-table.php:713 +#: wp-admin/includes/dashboard.php:695 +msgid "Approve" +msgstr "Approve" + +#: wp-admin/includes/class-wp-comments-list-table.php:494 +#: wp-admin/includes/class-wp-posts-list-table.php:1782 +msgid "Pings" +msgstr "Pings" + +#: wp-admin/includes/class-wp-links-list-table.php:121 +#: wp-admin/includes/class-wp-media-list-table.php:207 +#: wp-admin/includes/class-wp-comments-list-table.php:412 +#: wp-admin/includes/class-wp-posts-list-table.php:563 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:340 +msgid "Filter" +msgstr "Filter" + +#: wp-admin/includes/class-wp-comments-list-table.php:418 +msgid "Empty Spam" +msgstr "Empty Spam" + +#: wp-admin/includes/class-wp-comments-list-table.php:223 +msgid "No comments found." +msgstr "No comments found." + +#: wp-admin/edit-form-advanced.php:183 wp-admin/edit-form-advanced.php:198 +msgid "Custom field updated." +msgstr "Custom field updated." + +#: wp-admin/edit-form-advanced.php:184 wp-admin/edit-form-advanced.php:199 +msgid "Custom field deleted." +msgstr "Custom field deleted." + +#: wp-admin/edit-form-advanced.php:189 +msgid "Post saved." +msgstr "Post saved." + +#: wp-admin/includes/meta-boxes.php:1514 +msgid "Send Trackbacks" +msgstr "Send Trackbacks" + +#: wp-admin/includes/meta-boxes.php:1520 +msgid "Custom Fields" +msgstr "Custom Fields" + +#. translators: 1: User's display name, 2: Date of last edit, 3: Time of last +#. edit. +#. translators: 1: Name of most recent post author, 2: Post edited date, 3: +#. Post edited time. +#: wp-admin/includes/ajax-actions.php:2813 wp-admin/edit-form-advanced.php:627 +msgid "Last edited by %1$s on %2$s at %3$s" +msgstr "Last edited by %1$s on %2$s at %3$s" + +#. translators: 1: Date of last edit, 2: Time of last edit. +#. translators: 1: Post edited date, 2: Post edited time. +#: wp-admin/includes/ajax-actions.php:2816 wp-admin/edit-form-advanced.php:630 +msgid "Last edited on %1$s at %2$s" +msgstr "Last edited on %1$s at %2$s" + +#: wp-admin/includes/template.php:495 +msgid "Update Comment" +msgstr "Update Comment" + +#: wp-admin/edit-tags.php:453 wp-admin/edit-tag-form.php:156 +msgid "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." + +#: wp-admin/edit-tags.php:505 wp-admin/edit-tag-form.php:191 +msgid "The description is not prominent by default; however, some themes may show it." +msgstr "The description is not prominent by default; however, some themes may show it." + +#. translators: %s: URL to Links screen. +#: wp-admin/edit-link-form.php:16 +msgid "Links / Edit Link" +msgstr "Links / Edit Link" + +#: wp-admin/includes/meta-boxes.php:1087 wp-admin/edit-link-form.php:17 +msgid "Update Link" +msgstr "Update Link" + +#. translators: %s: URL to Links screen. +#: wp-admin/edit-link-form.php:22 +msgid "Links / Add New Link" +msgstr "Links / Add New Link" + +#: wp-admin/edit-link-form.php:95 +msgid "Link added." +msgstr "Link added." + +#: wp-admin/edit-link-form.php:117 +msgid "Example: Nifty blogging software" +msgstr "Example: Nifty blogging software" + +#: wp-admin/edit-link-form.php:122 +msgid "Web Address" +msgstr "Web Address" + +#: wp-admin/edit-link-form.php:133 +msgid "This will be shown when someone hovers over the link in the blogroll, or optionally below the link." +msgstr "This will be shown when someone hovers over the link in the blogroll, or optionally below the link." + +#: wp-admin/edit-tags.php:447 wp-admin/edit-tag-form.php:134 +msgid "The name is how it appears on your site." +msgstr "The name is how it appears on your site." + +#: wp-admin/edit-tags.php:496 wp-admin/edit-tag-form.php:181 +msgid "Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional." +msgstr "Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional." + +#: wp-admin/includes/edit-tag-messages.php:15 +msgid "Item deleted." +msgstr "Item deleted." + +#: wp-admin/includes/edit-tag-messages.php:16 +msgid "Item updated." +msgstr "Item updated." + +#: wp-admin/includes/edit-tag-messages.php:17 +msgid "Item not added." +msgstr "Item not added." + +#: wp-admin/includes/edit-tag-messages.php:19 +msgid "Items deleted." +msgstr "Items deleted." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:342 +msgid "%s post updated." +msgid_plural "%s posts updated." +msgstr[0] "%s post updated." +msgstr[1] "%s posts updated." + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:307 +msgctxt "posts" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Mine (%s)" +msgstr[1] "Mine (%s)" + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:328 +msgctxt "posts" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%s)" + +#: wp-admin/export.php:18 wp-admin/menu.php:281 +msgid "Export" +msgstr "Export" + +#: wp-admin/export.php:171 +msgid "When you click the button below WordPress will create an XML file for you to save to your computer." +msgstr "When you click the button below WordPress will create an XML file for you to save to your computer." + +#: wp-admin/export.php:172 +msgid "This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags." +msgstr "This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags." + +#: wp-admin/export.php:320 +msgid "Download Export File" +msgstr "Download Export File" + +#: wp-admin/import.php:96 +msgid "No importers are available." +msgstr "No importers are available." + +#: wp-admin/includes/import.php:190 +msgid "Blogger" +msgstr "Blogger" + +#: wp-admin/includes/import.php:202 +msgid "LiveJournal" +msgstr "LiveJournal" + +#: wp-admin/includes/import.php:208 +msgid "Movable Type and TypePad" +msgstr "Movable Type and TypePad" + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-filesystem-base.php:295 +msgid "Changing to %s" +msgstr "Changing to %s" + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-filesystem-base.php:313 +msgid "Found %s" +msgstr "Found %s" + +#: wp-admin/includes/class-wp-filesystem-ftpext.php:37 +msgid "The ftp PHP extension is not available" +msgstr "The ftp PHP extension is not available" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:49 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:53 +msgid "FTP hostname is required" +msgstr "FTP hostname is required" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:56 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:60 +msgid "FTP username is required" +msgstr "FTP username is required" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:62 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:66 +msgid "FTP password is required" +msgstr "FTP password is required" + +#. translators: %s: Username. +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:113 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:110 +#: wp-admin/includes/class-wp-filesystem-ssh2.php:145 +msgid "Username/Password incorrect for %s" +msgstr "Username/Password incorrect for %s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:69 +msgid "The ssh2 PHP extension is not available" +msgstr "The ssh2 PHP extension is not available" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:81 +msgid "SSH2 hostname is required" +msgstr "SSH2 hostname is required" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:95 +msgid "SSH2 username is required" +msgstr "SSH2 username is required" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:105 +msgid "SSH2 password is required" +msgstr "SSH2 password is required" + +#. translators: %s: Username. +#: wp-admin/includes/class-wp-filesystem-ssh2.php:158 +msgid "Public and Private keys incorrect for %s" +msgstr "Public and Private keys incorrect for %s" + +#. translators: %s: Command. +#: wp-admin/includes/class-wp-filesystem-ssh2.php:226 +msgid "Unable to perform command: %s" +msgstr "Unable to perform command: %s" + +#: wp-admin/includes/theme.php:62 +#: wp-admin/includes/class-wp-automatic-updater.php:401 +#: wp-admin/includes/class-wp-upgrader.php:150 wp-admin/includes/file.php:1428 +#: wp-admin/includes/plugin.php:945 +msgid "Could not access filesystem." +msgstr "Could not access filesystem." + +#: wp-admin/includes/theme.php:66 wp-admin/includes/class-wp-upgrader.php:151 +#: wp-admin/includes/plugin.php:949 +msgid "Filesystem error." +msgstr "Filesystem error." + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-upgrader.php:157 +msgid "Unable to locate needed folder (%s)." +msgstr "Unable to locate needed folder (%s)." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:63 +#: wp-admin/includes/class-wp-upgrader.php:159 +msgid "Download failed." +msgstr "Download failed." + +#: wp-admin/includes/class-wp-upgrader.php:160 +msgid "Installing the latest version…" +msgstr "Installing the latest version…" + +#: wp-admin/includes/class-wp-upgrader.php:162 +msgid "Destination folder already exists." +msgstr "Destination folder already exists." + +#: wp-admin/includes/update-core.php:1379 +#: wp-admin/includes/class-wp-upgrader.php:163 wp-admin/includes/file.php:1572 +#: wp-admin/includes/file.php:1699 wp-admin/includes/file.php:1767 +msgid "Could not create directory." +msgstr "Could not create directory." + +#: wp-admin/includes/file.php:1505 wp-admin/includes/file.php:1645 +msgid "Incompatible Archive." +msgstr "Incompatible Archive." + +#: wp-admin/includes/update-core.php:1098 +#: wp-admin/includes/class-wp-upgrader.php:167 +msgid "Enabling Maintenance mode…" +msgstr "Enabling Maintenance mode…" + +#: wp-admin/includes/update-core.php:1195 +#: wp-admin/includes/class-wp-upgrader.php:168 +msgid "Disabling Maintenance mode…" +msgstr "Disabling Maintenance mode…" + +#: wp-admin/includes/class-plugin-upgrader.php:57 +msgid "The plugin is at the latest version." +msgstr "The plugin is at the latest version." + +#: wp-admin/includes/class-plugin-upgrader.php:61 +#: wp-admin/includes/class-theme-upgrader.php:60 +#: wp-admin/includes/class-core-upgrader.php:34 +#: wp-admin/includes/class-language-pack-upgrader.php:118 +msgid "Unpacking the update…" +msgstr "Unpacking the update…" + +#: wp-admin/includes/class-plugin-upgrader.php:62 +msgid "Removing the old version of the plugin…" +msgstr "Removing the old version of the plugin…" + +#: wp-admin/includes/class-plugin-upgrader.php:63 +msgid "Could not remove the old plugin." +msgstr "Could not remove the old plugin." + +#: wp-admin/includes/class-plugin-upgrader.php:78 +#: wp-admin/includes/class-theme-upgrader.php:76 +msgid "Unpacking the package…" +msgstr "Unpacking the package…" + +#: wp-admin/includes/class-plugin-upgrader.php:79 +msgid "Installing the plugin…" +msgstr "Installing the plugin…" + +#: wp-admin/includes/class-plugin-upgrader.php:84 +msgid "Plugin installed successfully." +msgstr "Plugin installed successfully." + +#: wp-admin/includes/class-theme-upgrader.php:56 +msgid "The theme is at the latest version." +msgstr "The theme is at the latest version." + +#: wp-admin/includes/class-theme-upgrader.php:61 +#: wp-admin/includes/class-theme-upgrader.php:78 +msgid "Removing the old version of the theme…" +msgstr "Removing the old version of the theme…" + +#: wp-admin/includes/class-theme-upgrader.php:62 +#: wp-admin/includes/class-theme-upgrader.php:79 +msgid "Could not remove the old theme." +msgstr "Could not remove the old theme." + +#: wp-admin/includes/class-theme-upgrader.php:77 +msgid "Installing the theme…" +msgstr "Installing the theme…" + +#: wp-admin/includes/class-theme-upgrader.php:82 +msgid "Theme installed successfully." +msgstr "Theme installed successfully." + +#: wp-admin/includes/class-core-upgrader.php:29 +msgid "WordPress is at the latest version." +msgstr "WordPress is at the latest version." + +#: wp-admin/includes/class-core-upgrader.php:35 +msgid "Could not copy files." +msgstr "Could not copy files." + +#: wp-admin/includes/class-plugin-installer-skin.php:116 +#: wp-admin/includes/class-plugin-upgrader-skin.php:96 +msgid "Activate Plugin" +msgstr "Activate Plugin" + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:84 +msgid "Successfully installed the theme %1$s %2$s." +msgstr "Successfully installed the theme %1$s %2$s." + +#. translators: %s: Theme name. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-theme-install-list-table.php:273 +#: wp-admin/includes/class-wp-posts-list-table.php:1396 +msgid "Preview “%s”" +msgstr "Preview “%s”" + +#: wp-admin/includes/class-file-upload-upgrader.php:56 +#: wp-admin/includes/class-file-upload-upgrader.php:95 +#: wp-admin/includes/class-file-upload-upgrader.php:111 +msgid "Please select a file" +msgstr "Please select a file" + +#. translators: %s: Destination file path. +#: wp-admin/includes/file.php:915 +msgid "The uploaded file could not be moved to %s." +msgstr "The uploaded file could not be moved to %s." + +#: wp-admin/includes/dashboard.php:65 +msgid "Right Now" +msgstr "Right Now" + +#: wp-admin/includes/dashboard.php:1497 +msgid "Other WordPress News" +msgstr "Other WordPress News" + +#: wp-admin/includes/dashboard.php:136 +msgid "View all" +msgstr "View all" + +#: wp-admin/includes/dashboard.php:196 +msgid "Configure" +msgstr "Configure" + +#: wp-admin/includes/nav-menu.php:465 wp-admin/includes/nav-menu.php:751 +msgid "Page" +msgstr "Page" + +#: wp-admin/edit-form-comment.php:105 +msgid "Pending" +msgstr "Pending" + +#: wp-admin/includes/class-wp-comments-list-table.php:703 +#: wp-admin/includes/class-wp-comments-list-table.php:712 +#: wp-admin/includes/dashboard.php:694 +msgid "Approve this comment" +msgstr "Approve this comment" + +#: wp-admin/includes/class-wp-comments-list-table.php:695 +#: wp-admin/includes/class-wp-comments-list-table.php:720 +#: wp-admin/includes/dashboard.php:702 +msgid "Unapprove this comment" +msgstr "Unapprove this comment" + +#: wp-admin/includes/class-wp-comments-list-table.php:798 +#: wp-admin/includes/dashboard.php:717 +msgid "Reply to this comment" +msgstr "Reply to this comment" + +#: wp-admin/includes/class-wp-comments-list-table.php:730 +#: wp-admin/includes/dashboard.php:725 +msgid "Mark this comment as spam" +msgstr "Mark this comment as spam" + +#. translators: "Mark as spam" link. +#: wp-admin/includes/class-wp-comments-list-table.php:732 +#: wp-admin/includes/dashboard.php:727 +msgctxt "verb" +msgid "Spam" +msgstr "Spam" + +#: wp-admin/includes/dashboard.php:818 wp-admin/includes/dashboard.php:825 +#: wp-admin/includes/dashboard.php:855 wp-admin/includes/dashboard.php:862 +msgid "[Pending]" +msgstr "[Pending]" + +#: wp-admin/includes/dashboard.php:1107 wp-admin/includes/dashboard.php:1286 +msgid "This widget requires JavaScript." +msgstr "This widget requires JavaScript." + +#: wp-admin/includes/file.php:25 +msgid "Main Index Template" +msgstr "Main Index Template" + +#: wp-admin/includes/file.php:56 +msgid "RTL Stylesheet" +msgstr "RTL Stylesheet" + +#: wp-admin/includes/file.php:64 +msgid "Popup Comments" +msgstr "Popup Comments" + +#: wp-admin/includes/file.php:29 +msgid "Category Template" +msgstr "Category Template" + +#: wp-admin/includes/file.php:21 +msgid "Search Form" +msgstr "Search Form" + +#: wp-admin/includes/file.php:36 +msgid "Single Post" +msgstr "Single Post" + +#: wp-admin/includes/file.php:22 +msgid "404 Template" +msgstr "404 Template" + +#: wp-admin/includes/file.php:23 +msgid "Links Template" +msgstr "Links Template" + +#: wp-admin/includes/file.php:16 +msgid "Theme Functions" +msgstr "Theme Functions" + +#: wp-admin/includes/file.php:41 +msgid "Attachment Template" +msgstr "Attachment Template" + +#: wp-admin/includes/file.php:42 +msgid "Image Attachment Template" +msgstr "Image Attachment Template" + +#: wp-admin/includes/file.php:43 +msgid "Video Attachment Template" +msgstr "Video Attachment Template" + +#: wp-admin/includes/file.php:44 +msgid "Audio Attachment Template" +msgstr "Audio Attachment Template" + +#: wp-admin/includes/file.php:45 +msgid "Application Attachment Template" +msgstr "Application Attachment Template" + +#: wp-admin/includes/file.php:58 +msgid "my-hacks.php (legacy hacks support)" +msgstr "my-hacks.php (legacy hacks support)" + +#: wp-admin/includes/file.php:59 +msgid ".htaccess (for rewrite rules )" +msgstr ".htaccess (for rewrite rules )" + +#: wp-admin/includes/file.php:62 +msgid "Comments Template" +msgstr "Comments Template" + +#: wp-admin/includes/file.php:63 +msgid "Popup Comments Template" +msgstr "Popup Comments Template" + +#: wp-admin/includes/file.php:796 +msgid "The uploaded file was only partially uploaded." +msgstr "The uploaded file was only partially uploaded." + +#: wp-admin/includes/file.php:797 +msgid "No file was uploaded." +msgstr "No file was uploaded." + +#: wp-admin/includes/file.php:799 +msgid "Missing a temporary folder." +msgstr "Missing a temporary folder." + +#: wp-admin/includes/file.php:800 +msgid "Failed to write file to disk." +msgstr "Failed to write file to disk." + +#: wp-admin/includes/file.php:801 +msgid "File upload stopped by extension." +msgstr "File upload stopped by extension." + +#: wp-admin/includes/file.php:815 +msgid "Invalid form submission." +msgstr "Invalid form submission." + +#: wp-admin/includes/file.php:825 +msgid "Specified file failed upload test." +msgstr "Specified file failed upload test." + +#: wp-admin/includes/file.php:1039 +msgid "Invalid URL Provided." +msgstr "Invalid URL Provided." + +#: wp-admin/includes/file.php:1046 +msgid "Could not create Temporary file." +msgstr "Could not create Temporary file." + +#: wp-admin/includes/file.php:1513 wp-admin/includes/file.php:1580 +msgid "Could not retrieve file from archive." +msgstr "Could not retrieve file from archive." + +#: wp-admin/includes/file.php:1598 +msgid "Could not extract file from archive." +msgstr "Could not extract file from archive." + +#: wp-admin/includes/update-core.php:1240 +#: wp-admin/includes/update-core.php:1368 wp-admin/includes/file.php:1602 +#: wp-admin/includes/file.php:1720 wp-admin/includes/file.php:1759 +msgid "Could not copy file." +msgstr "Could not copy file." + +#: wp-admin/includes/file.php:1649 +msgid "Empty archive." +msgstr "Empty archive." + +#: wp-admin/includes/file.php:2136 +msgid "FTP" +msgstr "FTP" + +#: wp-admin/includes/file.php:2139 +msgid "FTPS (SSL)" +msgstr "FTPS (SSL)" + +#: wp-admin/includes/file.php:2142 +msgid "SSH2" +msgstr "SSH2" + +#: wp-admin/includes/file.php:2169 +msgid "Connection Information" +msgstr "Connection Information" + +#: wp-admin/includes/file.php:2203 +msgid "Hostname" +msgstr "Hostname" + +#: wp-admin/includes/file.php:2246 +msgid "Authentication Keys" +msgstr "Authentication Keys" + +#: wp-admin/includes/file.php:2248 +msgid "Public Key:" +msgstr "Public Key:" + +#: wp-admin/includes/file.php:2252 +msgid "Private Key:" +msgstr "Private Key:" + +#: wp-admin/includes/file.php:2225 +msgid "Connection Type" +msgstr "Connection Type" + +#: wp-admin/includes/file.php:2269 +msgid "Proceed" +msgstr "Proceed" + +#: wp-admin/includes/image-edit.php:28 wp-admin/includes/image-edit.php:826 +msgid "Image data does not exist. Please re-upload the image." +msgstr "Image data does not exist. Please re-upload the image." + +#: wp-admin/includes/image-edit.php:76 +msgid "Flip vertical" +msgstr "Flip vertically" + +#: wp-admin/includes/image-edit.php:77 +msgid "Flip horizontal" +msgstr "Flip horizontally" + +#: wp-admin/includes/image-edit.php:105 +msgid "Scale Image" +msgstr "Scale Image" + +#. translators: %s: Image width and height in pixels. +#: wp-admin/includes/image-edit.php:115 +msgid "Original dimensions %s" +msgstr "Original dimensions %s" + +#: wp-admin/includes/class-custom-background.php:313 +#: wp-admin/includes/class-custom-background.php:317 +msgid "Restore Original Image" +msgstr "Restore Original Image" + +#: wp-admin/includes/image-edit.php:148 +msgid "Discard any changes and restore the original image." +msgstr "Discard any changes and restore the original image." + +#: wp-admin/includes/image-edit.php:151 +msgid "Previously edited copies of the image will not be deleted." +msgstr "Previously edited copies of the image will not be deleted." + +#: wp-admin/includes/image-edit.php:156 +msgid "Restore image" +msgstr "Restore image" + +#: wp-admin/includes/image-edit.php:166 +msgid "Image Crop" +msgstr "Image Crop" + +#: wp-admin/includes/image-edit.php:172 +msgid "Crop Aspect Ratio" +msgstr "Crop Aspect Ratio" + +#: wp-admin/includes/image-edit.php:175 +msgid "Crop Selection" +msgstr "Crop Selection" + +#: wp-admin/includes/image-edit.php:181 +msgid "Aspect ratio:" +msgstr "Aspect ratio:" + +#: wp-admin/includes/image-edit.php:192 +msgid "Selection:" +msgstr "Selection:" + +#: wp-admin/includes/image-edit.php:211 +msgid "Thumbnail Settings" +msgstr "Thumbnail Settings" + +#: wp-admin/includes/image-edit.php:220 +msgid "Current thumbnail" +msgstr "Current thumbnail" + +#: wp-admin/includes/image-edit.php:225 +msgid "Apply changes to:" +msgstr "Apply changes to:" + +#: wp-admin/includes/image-edit.php:229 +msgid "All image sizes" +msgstr "All image sizes" + +#: wp-admin/includes/image-edit.php:239 +msgid "All sizes except thumbnail" +msgstr "All sizes except thumbnail" + +#: wp-admin/includes/image-edit.php:691 +msgid "Cannot load image metadata." +msgstr "Cannot load image metadata." + +#: wp-admin/includes/image-edit.php:751 +msgid "Cannot save image metadata." +msgstr "Cannot save image metadata." + +#: wp-admin/includes/image-edit.php:756 +msgid "Image metadata is inconsistent." +msgstr "Image metadata is inconsistent." + +#: wp-admin/includes/image-edit.php:758 +msgid "Image restored successfully." +msgstr "Image restored successfully." + +#: wp-admin/includes/image-edit.php:785 +msgid "Unable to create new image." +msgstr "Unable to create new image." + +#: wp-admin/includes/image-edit.php:809 +msgid "Error while saving the scaled image. Please reload the page and try again." +msgstr "Error while saving the scaled image. Please reload the page and try again." + +#: wp-admin/includes/image-edit.php:818 +msgid "Nothing to save, the image has not changed." +msgstr "Nothing to save, the image has not changed." + +#: wp-admin/includes/image-edit.php:867 +msgid "Unable to save the image." +msgstr "Unable to save the image." + +#: wp-admin/includes/image-edit.php:995 +msgid "Image saved" +msgstr "Image saved" + +#: wp-admin/includes/media.php:18 +msgid "From Computer" +msgstr "From Computer" + +#: wp-admin/includes/media.php:19 +msgid "From URL" +msgstr "From URL" + +#. translators: %s: Number of attachments. +#: wp-admin/includes/media.php:64 +msgid "Gallery (%s)" +msgstr "Gallery (%s)" + +#: wp-admin/includes/media.php:520 +msgid "Uploads" +msgstr "Uploads" + +#: wp-admin/credits.php:34 wp-admin/includes/class-wp-debug-data.php:64 +#: wp-admin/includes/class-wp-privacy-policy-content.php:724 +#: wp-admin/includes/media.php:520 wp-admin/includes/template.php:2023 +#: wp-admin/privacy.php:31 wp-admin/install.php:77 wp-admin/freedoms.php:37 +#: wp-admin/upgrade.php:68 wp-admin/about.php:32 wp-admin/setup-config.php:118 +#: wp-admin/maint/repair.php:24 +msgid "WordPress" +msgstr "WordPress" + +#: wp-admin/includes/media.php:1252 wp-admin/includes/media.php:1413 +msgid "File URL" +msgstr "File URL" + +#: wp-admin/includes/media.php:1474 wp-admin/includes/media.php:2955 +msgid "Alt text for the image, e.g. “The Mona Lisa”" +msgstr "Alt text for the image, e.g. “The Mona Lisa”" + +#: wp-admin/includes/media.php:1331 +msgid "Empty Title filled from filename." +msgstr "Empty Title filled from filename." + +#: wp-admin/includes/media.php:1417 +msgid "Location of the uploaded file." +msgstr "Location of the uploaded file." + +#: wp-admin/includes/media.php:1608 wp-admin/includes/media.php:2554 +#: wp-admin/js/user-profile.js:74 +msgid "Show" +msgstr "Show" + +#: wp-admin/includes/media.php:1609 wp-admin/includes/media.php:2555 +#: wp-admin/install.php:146 wp-admin/user-new.php:571 +#: wp-admin/user-edit.php:642 wp-admin/js/user-profile.js:74 +msgid "Hide" +msgstr "Hide" + +#: wp-admin/includes/media.php:1692 +msgid "Upload date:" +msgstr "Upload date:" + +#: wp-admin/includes/media.php:1718 wp-admin/includes/media.php:2985 +#: wp-admin/includes/media.php:2991 +msgid "Insert into Post" +msgstr "Insert into Post" + +#: wp-admin/includes/media.php:2331 +msgid "Add media files from your computer" +msgstr "Add media files from your computer" + +#: wp-admin/includes/media.php:2361 wp-admin/includes/media.php:2580 +#: wp-admin/includes/media.php:2883 +msgid "Save all changes" +msgstr "Save all changes" + +#: wp-admin/includes/media.php:2553 +msgid "All Tabs:" +msgstr "All Tabs:" + +#: wp-admin/includes/media.php:2557 +msgid "Sort Order:" +msgstr "Sort Order:" + +#: wp-admin/includes/media.php:2558 wp-admin/includes/media.php:2637 +msgid "Ascending" +msgstr "Ascending" + +#: wp-admin/includes/media.php:2559 wp-admin/includes/media.php:2640 +msgid "Descending" +msgstr "Descending" + +#: wp-admin/includes/media.php:2601 +msgid "Link thumbnails to:" +msgstr "Link thumbnails to:" + +#: wp-admin/includes/media.php:2606 +msgid "Image File" +msgstr "Image File" + +#: wp-admin/includes/media.php:2616 +msgid "Order images by:" +msgstr "Order images by:" + +#: wp-admin/includes/media.php:2621 +msgid "Menu order" +msgstr "Menu order" + +#: wp-admin/includes/media.php:2623 +msgid "Date/Time" +msgstr "Date/Time" + +#: wp-admin/includes/media.php:2624 +msgid "Random" +msgstr "Random" + +#: wp-admin/includes/media.php:2632 +msgid "Order:" +msgstr "Order:" + +#: wp-admin/includes/media.php:2647 +msgid "Gallery columns:" +msgstr "Gallery columns:" + +#: wp-admin/includes/media.php:2668 +msgid "Update gallery settings" +msgstr "Update gallery settings" + +#: wp-admin/includes/media.php:2727 wp-admin/includes/media.php:2729 +msgid "Search Media" +msgstr "Search Media" + +#: wp-admin/includes/media.php:2764 +msgid "All Types" +msgstr "All Types" + +#: wp-admin/includes/media.php:2856 +msgid "Filter »" +msgstr "Filter »" + +#: wp-admin/includes/media.php:2904 +msgid "Image Caption" +msgstr "Image Caption" + +#: wp-admin/includes/media.php:2974 +msgid "Link Image To:" +msgstr "Link Image To:" + +#: wp-admin/includes/media.php:2979 +msgid "Link to image" +msgstr "Link to image" + +#: wp-admin/includes/media.php:2948 +msgid "Link text, e.g. “Ransom Demands (PDF)”" +msgstr "Link text, e.g. “Ransom Demands (PDF)”" + +#: wp-admin/includes/meta-boxes.php:71 +msgid "Preview Changes" +msgstr "Preview Changes" + +#: wp-admin/includes/meta-boxes.php:103 wp-admin/edit-form-comment.php:98 +#: wp-admin/export.php:222 wp-admin/export.php:269 +msgid "Status:" +msgstr "Status:" + +#: wp-admin/includes/meta-boxes.php:198 +msgid "Stick this post to the front page" +msgstr "Stick this post to the front page" + +#: wp-admin/includes/meta-boxes.php:230 wp-admin/includes/meta-boxes.php:244 +msgid "Publish immediately" +msgstr "Publish immediately" + +#: wp-admin/includes/meta-boxes.php:1141 wp-admin/includes/meta-boxes.php:1143 +msgid "+ Add New Category" +msgstr "+ Add New Category" + +#: wp-admin/includes/meta-boxes.php:1144 +msgid "New category name" +msgstr "New category name" + +#: wp-admin/includes/meta-boxes.php:727 +msgid "Already pinged:" +msgstr "Already pinged:" + +#: wp-admin/includes/meta-boxes.php:737 +msgid "Send trackbacks to:" +msgstr "Send trackbacks to:" + +#: wp-admin/includes/meta-boxes.php:740 +msgid "Separate multiple URLs with spaces" +msgstr "Separate multiple URLs with spaces" + +#: wp-admin/includes/meta-boxes.php:872 +msgid "Show comments" +msgstr "Show comments" + +#: wp-admin/includes/meta-boxes.php:967 +#: wp-admin/includes/class-wp-posts-list-table.php:1678 +msgid "Parent" +msgstr "Parent" + +#: wp-admin/includes/class-wp-posts-list-table.php:1684 +msgid "Main Page (no parent)" +msgstr "Main Page (no parent)" + +#: wp-admin/includes/meta-boxes.php:1052 +msgid "Visit Link" +msgstr "Visit Link" + +#: wp-admin/includes/meta-boxes.php:1060 +msgid "Keep this link private" +msgstr "Keep this link private" + +#. translators: %s: Link name. +#: wp-admin/includes/class-wp-links-list-table.php:335 +#: wp-admin/includes/meta-boxes.php:1078 +msgid "" +"You are about to delete this link '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"You are about to delete this link '%s'\n" +" 'Cancel' to stop, 'OK' to delete." + +#: wp-admin/includes/meta-boxes.php:1167 +msgid "_blank — new window or tab." +msgstr "_blank — new window or tab." + +#: wp-admin/includes/meta-boxes.php:1170 +msgid "_top — current window or tab, with no frames." +msgstr "_top — current window or tab, with no frames." + +#: wp-admin/includes/meta-boxes.php:1173 +msgid "_none — same window or tab." +msgstr "_none — same window or tab." + +#: wp-admin/includes/meta-boxes.php:1175 +msgid "Choose the target frame for your link." +msgstr "Choose the target frame for your link." + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1231 +msgid "rel:" +msgstr "rel:" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1235 wp-admin/includes/meta-boxes.php:1236 +msgid "identity" +msgstr "identity" + +#: wp-admin/includes/meta-boxes.php:1239 +msgid "another web address of mine" +msgstr "another web address of mine" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1243 wp-admin/includes/meta-boxes.php:1244 +msgid "friendship" +msgstr "friendship" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1246 +msgid "contact" +msgstr "contact" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1249 +msgid "acquaintance" +msgstr "acquaintance" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1252 +msgid "friend" +msgstr "friend" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1255 wp-admin/includes/meta-boxes.php:1288 +#: wp-admin/includes/meta-boxes.php:1311 +msgid "none" +msgstr "none" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1260 wp-admin/includes/meta-boxes.php:1261 +msgid "physical" +msgstr "physical" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1263 +msgid "met" +msgstr "met" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1268 wp-admin/includes/meta-boxes.php:1269 +msgid "professional" +msgstr "professional" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1274 +msgid "colleague" +msgstr "colleague" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1279 wp-admin/includes/meta-boxes.php:1280 +msgid "geographical" +msgstr "geographical" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1282 +msgid "co-resident" +msgstr "co-resident" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1293 wp-admin/includes/meta-boxes.php:1294 +msgid "family" +msgstr "family" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1296 +msgid "child" +msgstr "child" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1299 +msgid "kin" +msgstr "kin" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1302 +msgid "parent" +msgstr "parent" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1271 +msgid "co-worker" +msgstr "co-worker" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1305 +msgid "sibling" +msgstr "sibling" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1308 +msgid "spouse" +msgstr "spouse" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1316 wp-admin/includes/meta-boxes.php:1317 +msgid "romantic" +msgstr "romantic" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1319 +msgid "muse" +msgstr "muse" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1322 +msgid "crush" +msgstr "crush" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1325 +msgid "date" +msgstr "date" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1328 +msgid "sweetheart" +msgstr "sweetheart" + +#: wp-admin/includes/meta-boxes.php:1349 +msgid "Image Address" +msgstr "Image Address" + +#: wp-admin/includes/meta-boxes.php:1353 +msgid "RSS Address" +msgstr "RSS Address" + +#: wp-admin/includes/meta-boxes.php:1357 +msgid "Notes" +msgstr "Notes" + +#: wp-admin/includes/class-wp-links-list-table.php:138 +#: wp-admin/includes/meta-boxes.php:1361 +msgid "Rating" +msgstr "Rating" + +#: wp-admin/includes/meta-boxes.php:1372 +msgid "(Leave at 0 for no rating.)" +msgstr "(Leave at 0 for no rating.)" + +#: wp-admin/includes/plugin-install.php:281 +msgid "Popular tags" +msgstr "Popular tags" + +#: wp-admin/includes/plugin-install.php:282 +msgid "You may also browse based on the most popular tags in the Plugin Directory:" +msgstr "You may also browse based on the most popular tags in the Plugin Directory:" + +#: wp-admin/includes/plugin-install.php:337 +#: wp-admin/includes/plugin-install.php:339 +msgid "Search Plugins" +msgstr "Search Plugins" + +#: wp-admin/includes/plugin-install.php:355 +msgid "Plugin zip file" +msgstr "Plugin zip file" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:537 +#: wp-admin/includes/theme-install.php:187 +#: wp-admin/includes/class-wp-theme-install-list-table.php:327 +#: wp-admin/includes/plugin-install.php:357 +#: wp-admin/includes/plugin-install.php:860 wp-admin/press-this.php:63 +#: wp-admin/import.php:160 wp-admin/js/updates.js:899 +#: wp-admin/js/updates.js:2192 wp-admin/js/updates.js:2235 +msgid "Install Now" +msgstr "Install Now" + +#. translators: %s: Number of ratings. +#: wp-admin/includes/plugin-install.php:722 +msgid "(based on %s rating)" +msgid_plural "(based on %s ratings)" +msgstr[0] "(based on %s rating)" +msgstr[1] "(based on %s ratings)" + +#: wp-admin/includes/plugin-install.php:872 +msgid "Install Update Now" +msgstr "Install Update Now" + +#. translators: %s: Plugin version. +#: wp-admin/includes/plugin-install.php:883 +msgid "Newer Version (%s) Installed" +msgstr "Newer Version (%s) Installed" + +#: wp-admin/includes/plugin-install.php:886 +msgid "Latest Version Installed" +msgstr "Latest Version Installed" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:735 +#: wp-admin/includes/plugin-install.php:658 +msgid "Last Updated:" +msgstr "Last Updated:" + +#. translators: %s: Version number. +#: wp-admin/includes/plugin-install.php:669 +#: wp-admin/includes/plugin-install.php:679 +msgid "%s or higher" +msgstr "%s or higher" + +#: wp-admin/includes/plugin-install.php:673 +msgid "Compatible up to:" +msgstr "Compatible up to:" + +#: wp-admin/includes/plugin-install.php:700 +msgid "WordPress.org Plugin Page »" +msgstr "WordPress.org Plugin Page »" + +#: wp-admin/includes/plugin-install.php:708 +msgid "Average Rating" +msgstr "Average Rating" + +#: wp-admin/includes/plugin.php:733 +msgid "The plugin generated unexpected output." +msgstr "The plugin generated unexpected output." + +#: wp-admin/includes/plugin.php:883 +msgid "One of the plugins is invalid." +msgstr "One of the plugins is invalid." + +#: wp-admin/includes/plugin.php:1100 +msgid "Invalid plugin path." +msgstr "Invalid plugin path." + +#: wp-admin/includes/plugin.php:1103 +msgid "Plugin file does not exist." +msgstr "Plugin file does not exist." + +#: wp-admin/includes/plugin.php:1108 +msgid "The plugin does not have a valid header." +msgstr "The plugin does not have a valid header." + +#: wp-admin/includes/post.php:685 +msgid "Auto Draft" +msgstr "Auto Draft" + +#: wp-admin/includes/post.php:1461 wp-admin/includes/post.php:1486 +msgid "Permalink:" +msgstr "Permalink:" + +#: wp-admin/includes/post.php:1474 +msgid "Change Permalinks" +msgstr "Change Permalinks" + +#. translators: Site tagline. +#: wp-admin/includes/schema.php:405 +msgid "Just another WordPress site" +msgstr "Just another WordPress site" + +#. translators: %s: Network title. +#: wp-admin/includes/schema.php:556 +msgid "Just another %s site" +msgstr "Just another %s site" + +#: wp-admin/includes/schema.php:1090 +msgid "Warning! Wildcard DNS may not be configured correctly!" +msgstr "Warning! Wildcard DNS may not be configured correctly!" + +#: wp-admin/includes/class-wp-terms-list-table.php:648 +#: wp-admin/includes/class-wp-posts-list-table.php:1532 +msgid "Quick Edit" +msgstr "Quick Edit" + +#: wp-admin/includes/class-wp-terms-list-table.php:489 +#: wp-admin/includes/class-wp-comments-list-table.php:789 +#: wp-admin/includes/class-wp-posts-list-table.php:1354 +msgid "Quick Edit" +msgstr "Quick Edit" + +#. translators: Posts screen column name. +#: wp-admin/includes/class-wp-posts-list-table.php:619 +msgctxt "column name" +msgid "Title" +msgstr "Title" + +#. translators: Column name. +#: wp-admin/includes/class-wp-media-list-table.php:311 +msgctxt "column name" +msgid "File" +msgstr "File" + +#. translators: Column name. +#: wp-admin/includes/class-wp-media-list-table.php:347 +msgctxt "column name" +msgid "Date" +msgstr "Date" + +#: wp-admin/includes/class-wp-comments-list-table.php:462 +#: wp-admin/includes/class-wp-post-comments-list-table.php:27 +msgctxt "column name" +msgid "Comment" +msgstr "Comment" + +#: wp-admin/includes/class-wp-links-list-table.php:136 +msgid "Relationship" +msgstr "Relationship" + +#: wp-admin/includes/class-wp-links-list-table.php:137 +msgid "Visible" +msgstr "Visible" + +#: wp-admin/includes/class-wp-posts-list-table.php:1532 +msgid "Bulk Edit" +msgstr "Bulk Edit" + +#: wp-admin/includes/class-wp-posts-list-table.php:1587 +#: wp-admin/includes/class-wp-posts-list-table.php:1690 +#: wp-admin/includes/class-wp-posts-list-table.php:1729 +#: wp-admin/includes/class-wp-posts-list-table.php:1771 +#: wp-admin/includes/class-wp-posts-list-table.php:1784 +#: wp-admin/includes/class-wp-posts-list-table.php:1828 +#: wp-admin/includes/class-wp-posts-list-table.php:1851 +#: wp-admin/includes/class-wp-posts-list-table.php:1876 +msgid "— No Change —" +msgstr "— No Change —" + +#. translators: Between password field and private checkbox on post quick edit +#. interface. +#: wp-admin/includes/class-wp-posts-list-table.php:1630 +msgid "–OR–" +msgstr "–OR–" + +#: wp-admin/includes/class-wp-posts-list-table.php:1772 +#: wp-admin/includes/class-wp-posts-list-table.php:1785 +msgid "Allow" +msgstr "Allow" + +#: wp-admin/includes/class-wp-posts-list-table.php:1773 +#: wp-admin/includes/class-wp-posts-list-table.php:1786 +msgid "Do not allow" +msgstr "Do not allow" + +#: wp-admin/includes/class-wp-posts-list-table.php:1802 +msgid "Allow Comments" +msgstr "Allow Comments" + +#: wp-admin/includes/class-wp-posts-list-table.php:1811 +msgid "Allow Pings" +msgstr "Allow Pings" + +#: wp-admin/includes/class-wp-posts-list-table.php:1849 +#: wp-admin/includes/class-wp-posts-list-table.php:1852 +msgid "Sticky" +msgstr "Sticky" + +#: wp-admin/includes/class-wp-posts-list-table.php:1853 +msgid "Not Sticky" +msgstr "Not Sticky" + +#: wp-admin/includes/class-wp-posts-list-table.php:1861 +msgid "Make this post sticky" +msgstr "Make this post sticky" + +#: wp-admin/includes/class-wp-posts-list-table.php:1096 +msgid "Missed schedule" +msgstr "Missed schedule" + +#: wp-admin/includes/template.php:454 +msgid "Reply to Comment" +msgstr "Reply to Comment" + +#: wp-admin/includes/template.php:496 +msgid "Submit Reply" +msgstr "Submit Reply" + +#. translators: %s: Comment author, filled by Ajax. +#: wp-admin/includes/template.php:549 +msgid "Comment by %s marked as spam." +msgstr "Comment by %s marked as spam." + +#: wp-admin/includes/template.php:572 wp-admin/includes/template.php:587 +#: wp-admin/includes/template.php:652 wp-admin/includes/template.php:719 +msgid "Value" +msgstr "Value" + +#: wp-admin/includes/template.php:642 +msgid "Key" +msgstr "Key" + +#: wp-admin/includes/template.php:714 +msgid "Add New Custom Field:" +msgstr "Add New Custom Field:" + +#: wp-admin/includes/template.php:740 +msgid "Enter new" +msgstr "Enter new" + +#: wp-admin/includes/template.php:753 +msgid "Add Custom Field" +msgstr "Add Custom Field" + +#: wp-admin/includes/template.php:973 +msgid "Before you can upload your import file, you will need to fix the following error:" +msgstr "Before you can upload your import file, you will need to fix the following error:" + +#: wp-admin/includes/template.php:983 +msgid "Choose a file from your computer:" +msgstr "Choose a file from your computer:" + +#. translators: %s: Maximum allowed file size. +#: wp-admin/includes/template.php:985 +msgid "Maximum size: %s" +msgstr "Maximum size: %s" + +#: wp-admin/includes/template.php:992 +msgid "Upload file and import" +msgstr "Upload file and import" + +#: wp-admin/update.php:272 +msgid "Install Themes" +msgstr "Install Themes" + +#: wp-admin/themes.php:126 +msgid "Manage Themes" +msgstr "Manage Themes" + +#: wp-admin/widgets.php:416 +msgid "Enable accessibility mode" +msgstr "Enable accessibility mode" + +#: wp-admin/widgets.php:416 +msgid "Disable accessibility mode" +msgstr "Disable accessibility mode" + +#: wp-admin/includes/template.php:2481 wp-admin/nav-menus.php:808 +#: wp-admin/options.php:402 +msgid "Save Changes" +msgstr "Save Changes" + +#. translators: %s: Date and time of the revision. +#: wp-admin/edit-form-advanced.php:202 +msgid "Page restored to revision from %s." +msgstr "Page restored to revision from %s." + +#. translators: %s: Date and time of the revision. +#: wp-admin/edit-form-advanced.php:187 +msgid "Post restored to revision from %s." +msgstr "Post restored to revision from %s." + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:87 +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:100 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:97 +msgid "Failed to connect to FTP Server %s" +msgstr "Failed to connect to FTP Server %s" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ssh2.php:131 +msgid "Failed to connect to SSH2 Server %s" +msgstr "Failed to connect to SSH2 Server %s" + +#. translators: 1: Comment author, 2: Post link, 3: Notification if the comment +#. is pending. +#: wp-admin/includes/dashboard.php:815 +msgid "From %1$s on %2$s %3$s" +msgstr "From %1$s on %2$s %3$s" + +#: wp-admin/includes/class-wp-comments-list-table.php:767 +#: wp-admin/includes/dashboard.php:743 +msgid "Move this comment to the Trash" +msgstr "Move this comment to the bin" + +#: wp-admin/themes.php:267 wp-admin/themes.php:271 +msgid "Visit site" +msgstr "Visit site" + +#. translators: 1: Type of comment, 2: Notification if the comment is pending. +#: wp-admin/includes/dashboard.php:860 +msgctxt "dashboard" +msgid "%1$s %2$s" +msgstr "%1$s %2$s" + +#: wp-admin/edit-tags.php:117 wp-admin/post.php:316 wp-admin/themes.php:63 +#: wp-admin/upload.php:191 wp-admin/edit.php:164 +msgid "Sorry, you are not allowed to delete this item." +msgstr "Sorry, you are not allowed to delete this item." + +#: wp-admin/includes/post.php:34 wp-admin/includes/post.php:79 +msgid "Sorry, you are not allowed to edit pages as this user." +msgstr "Sorry, you are not allowed to edit pages as this user." + +#: wp-admin/includes/post.php:36 wp-admin/includes/post.php:81 +msgid "Sorry, you are not allowed to edit posts as this user." +msgstr "Sorry, you are not allowed to edit posts as this user." + +#: wp-admin/includes/class-wp-upgrader.php:149 +msgid "Invalid data provided." +msgstr "Invalid data provided." + +#: wp-admin/includes/class-wp-upgrader.php:152 +msgid "Unable to locate WordPress root directory." +msgstr "Unable to locate WordPress root directory." + +#: wp-admin/includes/class-wp-upgrader.php:153 +msgid "Unable to locate WordPress content directory (wp-content)." +msgstr "Unable to locate WordPress content directory (wp-content)." + +#: wp-admin/includes/class-wp-upgrader.php:154 wp-admin/includes/plugin.php:955 +msgid "Unable to locate WordPress plugin directory." +msgstr "Unable to locate WordPress plugin directory." + +#: wp-admin/includes/class-plugin-upgrader.php:75 +#: wp-admin/includes/class-theme-upgrader.php:73 +msgid "Installation package not available." +msgstr "Installation package not available." + +#. translators: %s: Comma-separated list of plugin filenames. +#: wp-admin/includes/plugin.php:1040 +msgid "Could not fully remove the plugins %s." +msgstr "Could not fully remove the plugins %s." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:281 +#: wp-admin/includes/class-wp-theme-install-list-table.php:151 +#: wp-admin/theme-install.php:65 wp-admin/setup-config.php:280 +msgid "Try Again" +msgstr "Try Again" + +#: wp-admin/erase-personal-data.php:77 wp-admin/export-personal-data.php:77 +msgid "Search Requests" +msgstr "Search Requests" + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:371 +msgid "%s block not updated, somebody is editing it." +msgid_plural "%s blocks not updated, somebody is editing them." +msgstr[0] "%s block not updated, somebody is editing it." +msgstr[1] "%s blocks not updated, somebody is editing them." + +#: wp-admin/includes/plugin-install.php:666 +msgid "Requires WordPress Version:" +msgstr "Requires WordPress:" + +#. translators: 1: Plugin name, 2: Plugin version. +#: wp-admin/includes/class-plugin-upgrader.php:86 +msgid "Successfully installed the plugin %1$s %2$s." +msgstr "Successfully installed the plugin %1$s %2$s." + +#: wp-admin/includes/plugin-install.php:823 +msgid "Warning: This plugin has not been tested with your current version of WordPress." +msgstr "Warning: this plugin has not been tested with your current version of WordPress." + +#. translators: 1: Starting number of users on the current page, 2: Ending +#. number of users, 3: Total number of users. +#: wp-admin/includes/deprecated.php:605 +msgid "Displaying %1$s–%2$s of %3$s" +msgstr "Displaying %1$s–%2$s of %3$s" + +#. translators: %s: Comment author, filled by Ajax. +#: wp-admin/includes/template.php:540 +msgid "Comment by %s moved to the Trash." +msgstr "Comment by %s moved to the Bin." + +#: wp-admin/includes/file.php:405 wp-admin/includes/file.php:465 +#: wp-admin/includes/file.php:705 wp-admin/includes/file.php:711 +msgid "Sorry, that file cannot be edited." +msgstr "Sorry, that file cannot be edited." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:300 +msgid "%s comment permanently deleted." +msgid_plural "%s comments permanently deleted." +msgstr[0] "%s comment permanently deleted." +msgstr[1] "%s comments permanently deleted." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:284 +msgid "%s comment restored from the spam." +msgid_plural "%s comments restored from the spam." +msgstr[0] "%s comment restored from the spam." +msgstr[1] "%s comments restored from the spam." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:273 +msgid "%s comment approved." +msgid_plural "%s comments approved." +msgstr[0] "%s comment approved." +msgstr[1] "%s comments approved." + +#: wp-admin/comment.php:140 +msgid "Permanently delete comment" +msgstr "Permanently delete comment" + +#: wp-admin/comment.php:144 +msgid "Approve comment" +msgstr "Approve comment" + +#: wp-admin/includes/media.php:1724 +#: wp-admin/includes/class-wp-media-list-table.php:714 +#: wp-admin/includes/class-wp-media-list-table.php:771 +#: wp-admin/includes/class-wp-comments-list-table.php:760 +#: wp-admin/includes/class-wp-posts-list-table.php:1383 +#: wp-admin/includes/dashboard.php:736 wp-admin/edit-form-comment.php:205 +msgid "Delete Permanently" +msgstr "Delete Permanently" + +#: wp-admin/includes/class-wp-list-table.php:488 wp-admin/edit.php:275 +msgid "Bulk actions" +msgstr "Bulk actions" + +#: wp-admin/edit-link-form.php:125 +msgid "Example: https://wordpress.org/ — don’t forget the https://" +msgstr "Example: https://en-gb.wordpress.org/ — don’t forget the https://" + +#: wp-admin/includes/bookmark.php:229 +msgid "Could not update link in the database." +msgstr "Could not update link in the database." + +#: wp-admin/includes/bookmark.php:237 +msgid "Could not insert link into the database." +msgstr "Could not insert link into the database." + +#: wp-admin/includes/meta-boxes.php:1334 +msgid "If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out XFN." +msgstr "If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea, check out XFN." + +#: wp-admin/includes/plugin-install.php:352 +msgid "If you have a plugin in a .zip format, you may install or update it by uploading it here." +msgstr "If you have a plugin in a .zip format, you may install or update it by uploading it here." + +#: wp-admin/comment.php:86 +msgid "This comment is in the Trash. Please move it out of the Trash if you want to edit it." +msgstr "This comment is in the Bin. Please move it out of the Bin if you want to edit it." + +#: wp-admin/comment.php:135 +msgid "You are about to move the following comment to the Trash:" +msgstr "You are about to move the following comment to the Bin:" + +#: wp-admin/includes/media.php:2806 wp-admin/includes/nav-menu.php:463 +#: wp-admin/includes/nav-menu.php:749 +msgid "«" +msgstr "«" + +#: wp-admin/includes/media.php:2807 wp-admin/includes/nav-menu.php:464 +#: wp-admin/includes/nav-menu.php:750 +msgid "»" +msgstr "»" + +#. translators: %d: Comment ID. +#: wp-admin/includes/ajax-actions.php:960 +msgid "Comment %d does not exist" +msgstr "Comment %d does not exist" + +#: wp-admin/includes/taxonomy.php:136 +msgid "You did not enter a category name." +msgstr "You did not enter a category name." + +#: wp-admin/includes/ajax-actions.php:1301 +msgid "Sorry, you must be logged in to reply to a comment." +msgstr "Sorry, you must be logged in to reply to a comment." + +#: wp-admin/includes/ajax-actions.php:1581 +#: wp-admin/includes/ajax-actions.php:1589 +msgid "Please provide a custom field value." +msgstr "Please provide a custom field value." + +#. translators: Draft saved date format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/misc.php:1250 +msgid "g:i:s a" +msgstr "g:i:s a" + +#. translators: %s: Date and time. +#: wp-admin/includes/misc.php:1254 +msgid "Draft saved at %s." +msgstr "Draft saved at %s." + +#: wp-admin/includes/ajax-actions.php:2005 +msgid "Someone" +msgstr "Someone" + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:2012 +msgid "Saving is disabled: %s is currently editing this page." +msgstr "Saving is disabled: %s is currently editing this page." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:2008 +msgid "Saving is disabled: %s is currently editing this post." +msgstr "Saving is disabled: %s is currently editing this post." + +#: wp-admin/includes/edit-tag-messages.php:18 +#: wp-admin/includes/ajax-actions.php:2131 +#: wp-admin/includes/ajax-actions.php:2137 +msgid "Item not updated." +msgstr "Item not updated." + +#: wp-admin/includes/meta-boxes.php:114 wp-admin/includes/meta-boxes.php:145 +#: wp-admin/includes/ajax-actions.php:2195 +#: wp-admin/includes/class-wp-posts-list-table.php:1098 +#: wp-admin/includes/class-wp-posts-list-table.php:1833 +msgid "Scheduled" +msgstr "Scheduled" + +#. translators: %s: Admin page generated by a plugin. +#: wp-admin/admin.php:269 +msgid "Cannot load %s." +msgstr "Cannot load %s." + +#: wp-admin/admin.php:329 wp-admin/import.php:18 wp-admin/menu.php:280 +msgid "Import" +msgstr "Import" + +#: wp-admin/includes/template.php:453 wp-admin/comment.php:56 +#: wp-admin/edit-form-comment.php:17 +msgid "Edit Comment" +msgstr "Edit Comment" + +#: wp-admin/comment.php:131 +msgid "You are about to mark the following comment as spam:" +msgstr "You are about to mark the following comment as spam:" + +#: wp-admin/comment.php:139 +msgid "You are about to delete the following comment:" +msgstr "You are about to delete the following comment:" + +#: wp-admin/includes/comment.php:55 wp-admin/comment.php:279 +#: wp-admin/edit-comments.php:253 +msgid "Sorry, you are not allowed to edit comments on this post." +msgstr "Sorry, you are not allowed to edit comments on this post." + +#: wp-admin/admin.php:262 +msgid "Invalid plugin page." +msgstr "Invalid plugin page." + +#: wp-admin/authorize-application.php:97 wp-admin/authorize-application.php:115 +msgid "Go Back" +msgstr "Go Back" \ No newline at end of file diff --git a/wp-content/languages/admin-network-en_GB.mo b/wp-content/languages/admin-network-en_GB.mo new file mode 100644 index 00000000..e056db80 Binary files /dev/null and b/wp-content/languages/admin-network-en_GB.mo differ diff --git a/wp-content/languages/admin-network-en_GB.po b/wp-content/languages/admin-network-en_GB.po new file mode 100644 index 00000000..fd030a17 --- /dev/null +++ b/wp-content/languages/admin-network-en_GB.po @@ -0,0 +1,1426 @@ +# Translation of WordPress - 5.6.x - Development - Administration - Network Admin in English (UK) +# This file is distributed under the same license as the WordPress - 5.6.x - Development - Administration - Network Admin package. +msgid "" +msgstr "" +"PO-Revision-Date: 2020-07-24 07:33:32+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: en_GB\n" +"Project-Id-Version: WordPress - 5.6.x - Development - Administration - Network Admin\n" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:293 +msgctxt "site" +msgid "Not spam" +msgstr "Not spam" + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:410 +msgid "%s theme will no longer be auto-updated." +msgid_plural "%s themes will no longer be auto-updated." +msgstr[0] "%s theme will no longer be auto-updated." +msgstr[1] "%s themes will no longer be auto-updated." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:401 +msgid "%s theme will be auto-updated." +msgid_plural "%s themes will be auto-updated." +msgstr[0] "%s theme will be auto-updated." +msgstr[1] "%s themes will be auto-updated." + +#: wp-admin/network/themes.php:225 +msgid "Sorry, you are not allowed to change themes automatic update settings." +msgstr "Sorry, you are not allowed to change themes automatic update settings." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:321 +msgid "No themes are currently available." +msgstr "No themes are currently available." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:477 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:498 +#: wp-admin/includes/class-wp-ms-users-list-table.php:336 +msgid "Y/m/d g:i:s a" +msgstr "j F Y H:i:s" + +#: wp-admin/includes/network.php:629 +msgid "https://wordpress.org/support/article/nginx/" +msgstr "https://wordpress.org/support/article/nginx/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/network.php:628 +msgid "It seems your network is running with Nginx web server. Learn more about further configuration." +msgstr "It seems your network is running with the Nginx web server. Learn more about further configuration." + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:254 +msgid "Deleted (%s)" +msgid_plural "Deleted (%s)" +msgstr[0] "Deleted (%s)" +msgstr[1] "Deleted (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:247 +msgctxt "sites" +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Spam (%s)" +msgstr[1] "Spam (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:241 +msgid "Mature (%s)" +msgid_plural "Mature (%s)" +msgstr[0] "Mature (%s)" +msgstr[1] "Mature (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:235 +msgid "Archived (%s)" +msgid_plural "Archived (%s)" +msgstr[0] "Archived (%s)" +msgstr[1] "Archived (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:229 +msgid "Public (%s)" +msgid_plural "Public (%s)" +msgstr[0] "Public (%s)" +msgstr[1] "Public (%1$s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:222 +msgctxt "sites" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%s)" + +#: wp-admin/network/upgrade.php:31 +msgid "Documentation on Upgrade Network" +msgstr "Documentation on Upgrade Network" + +#: wp-admin/network/index.php:55 +msgid "Documentation on the Network Admin" +msgstr "Documentation on the Network Admin" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:406 +msgctxt "themes" +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "Update Available (%s)" +msgstr[1] "Update Available (%s)" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:616 +msgid "Main" +msgstr "Main" + +#: wp-admin/network.php:67 wp-admin/network.php:80 +msgid "Documentation on the Network Screen" +msgstr "Documentation on the Network Screen" + +#: wp-admin/network.php:66 wp-admin/network.php:79 +msgid "Documentation on Creating a Network" +msgstr "Documentation on Creating a Network" + +#. translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES +#: wp-admin/includes/network.php:118 +msgid "The constant %s cannot be defined when creating a network." +msgstr "The constant %s cannot be defined when creating a network." + +#: wp-admin/network/sites.php:195 +msgid "You are about to delete the following sites:" +msgstr "You are about to delete the following sites:" + +#: wp-admin/network/site-users.php:248 +msgid "User could not be added to this site." +msgstr "User could not be added to this site." + +#: wp-admin/network/site-new.php:263 +msgid "The username and a link to set the password will be mailed to this email address." +msgstr "The username and a link to set the password will be mailed to this email address." + +#. translators: %s: New network admin email. +#: wp-admin/network/settings.php:175 +msgid "There is a pending change of the network admin email to %s." +msgstr "There is a pending change of the network admin email to %s." + +#: wp-admin/includes/network.php:332 +msgid "Sub-domain Installation" +msgstr "Sub-domain Installation" + +#: wp-admin/includes/network.php:301 wp-admin/includes/network.php:319 +msgid "Sub-directory Installation" +msgstr "Sub-directory Installation" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:909 +msgid "Active Child Theme" +msgstr "Active Child Theme" + +#: wp-admin/network/site-info.php:193 +msgid "Attributes" +msgstr "Attributes" + +#. translators: %s: File size in kilobytes. +#: wp-admin/network/settings.php:407 +msgid "%s KB" +msgstr "%s KB" + +#. translators: %s: Default network title. +#: wp-admin/includes/network.php:172 +msgid "%s Sites" +msgstr "%s Sites" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:624 +msgctxt "theme" +msgid "Delete %s" +msgstr "Delete %s" + +#: wp-admin/network/themes.php:101 +msgid "Sorry, you are not allowed to delete themes for this site." +msgstr "Sorry, you are not allowed to delete themes for this site." + +#: wp-admin/network/themes.php:14 +msgid "Sorry, you are not allowed to manage network themes." +msgstr "Sorry, you are not allowed to manage network themes." + +#: wp-admin/network/sites.php:320 +msgid "Sorry, you are not allowed to delete that site." +msgstr "Sorry, you are not allowed to delete that site." + +#: wp-admin/network/site-themes.php:14 +msgid "Sorry, you are not allowed to manage themes for this site." +msgstr "Sorry, you are not allowed to manage themes for this site." + +#: wp-admin/network/site-new.php:17 +msgid "Sorry, you are not allowed to add sites to this network." +msgstr "Sorry, you are not allowed to add sites to this network." + +#: wp-admin/network/site-info.php:14 wp-admin/network/site-users.php:14 +#: wp-admin/network/site-settings.php:14 +msgid "Sorry, you are not allowed to edit this site." +msgstr "Sorry, you are not allowed to edit this site." + +#: wp-admin/network/settings.php:357 +msgid "The email address of the first comment author on a new site." +msgstr "The email address of the first comment author on a new site." + +#: wp-admin/network/settings.php:353 +msgid "First Comment Email" +msgstr "First Comment Email" + +#: wp-admin/includes/network.php:485 +msgid "That’s all, stop editing! Happy publishing." +msgstr "That’s all, stop editing! Happy publishing." + +#. translators: 1: wp-config.php, 2: Location of wp-config file, 3: Translated +#. version of "That's all, stop editing! Happy publishing." +#: wp-admin/includes/network.php:477 +msgid "Add the following to your %1$s file in %2$s above the line reading %3$s:" +msgstr "Add the following to your %1$s file in %2$s above the line reading %3$s:" + +#. translators: 1: Theme name, 2: Theme author. +#: wp-admin/network/themes.php:149 +msgctxt "theme" +msgid "%1$s by %2$s" +msgstr "%1$s by %2$s" + +#: wp-admin/network/site-new.php:219 +msgid "Only lowercase letters (a-z), numbers, and hyphens are allowed." +msgstr "Only lowercase letters (a-z), numbers, and hyphens are allowed." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:540 +msgid "These unique authentication keys are also missing from your %s file." +msgstr "These unique authentication keys are also missing from your %s file." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:534 +msgid "This unique authentication key is also missing from your %s file." +msgstr "This unique authentication key is also missing from your %s file." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:463 +msgid "We recommend you back up your existing %s file." +msgstr "We recommend you back up your existing %s file." + +#. translators: 1: wp-config.php, 2: .htaccess +#. translators: 1: wp-config.php, 2: web.config +#: wp-admin/includes/network.php:447 wp-admin/includes/network.php:455 +msgid "We recommend you back up your existing %1$s and %2$s files." +msgstr "We recommend you back up your existing %1$s and %2$s files." + +#. translators: 1: localhost, 2: localhost.localdomain +#: wp-admin/includes/network.php:306 +msgid "Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains." +msgstr "Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains." + +#. translators: %s: Host name. +#: wp-admin/includes/network.php:288 wp-admin/includes/network.php:348 +msgid "The internet address of your network will be %s." +msgstr "The internet address of your network will be %s." + +#. translators: 1: Site URL, 2: Host name, 3: www. +#: wp-admin/includes/network.php:274 +msgid "We recommend you change your site domain to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s but any links will not have the %3$s prefix." +msgstr "We recommend you change your site domain to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s, but any links will not have the %3$s prefix." + +#: wp-admin/includes/network.php:229 +msgid "You cannot change this later." +msgstr "You cannot change this later." + +#: wp-admin/includes/network.php:228 +msgid "Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories." +msgstr "Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories." + +#. translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google +#. search for mod_rewrite. +#: wp-admin/includes/network.php:216 +msgid "If %1$s is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up." +msgstr "If %1$s is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up." + +#. translators: %s: mod_rewrite +#: wp-admin/includes/network.php:206 +msgid "It looks like the Apache %s module is not installed." +msgstr "It looks like the Apache %s module is not installed." + +#. translators: %s: mod_rewrite +#: wp-admin/includes/network.php:198 +msgid "Please make sure the Apache %s module is installed as it will be used at the end of this installation." +msgstr "Please make sure the Apache %s module is installed as it will be used at the end of this installation." + +#. translators: %s: Port number. +#: wp-admin/includes/network.php:145 +msgid "You cannot use port numbers such as %s." +msgstr "You cannot use port numbers such as %s." + +#: wp-admin/includes/class-wp-ms-users-list-table.php:200 +msgctxt "user" +msgid "Registered" +msgstr "Registered" + +#. translators: Number of users. +#: wp-admin/includes/class-wp-ms-users-list-table.php:164 +msgid "Super Admin (%s)" +msgid_plural "Super Admins (%s)" +msgstr[0] "Super Admin (%s)" +msgstr[1] "Super Admins (%s)" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:118 +msgctxt "user" +msgid "Not spam" +msgstr "Not spam" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:117 +msgctxt "user" +msgid "Mark as spam" +msgstr "Mark as spam" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:727 +msgid "Visit Theme Site" +msgstr "Visit Theme Site" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:721 +msgid "Visit %s homepage" +msgstr "Visit %s homepage" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:690 +msgid "Broken Theme:" +msgstr "Broken Theme:" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:596 +msgid "Network Disable %s" +msgstr "Network Disable %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:593 +msgid "Disable %s" +msgstr "Disable %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:570 +msgid "Network Enable %s" +msgstr "Network Enable %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:567 +msgid "Enable %s" +msgstr "Enable %s" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:472 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:603 +msgid "Network Disable" +msgstr "Network Disable" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:472 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:603 +msgid "Disable" +msgstr "Disable" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:469 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:577 +msgid "Enable" +msgstr "Enable" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:415 +msgctxt "themes" +msgid "Broken (%s)" +msgid_plural "Broken (%s)" +msgstr[0] "Broken (%s)" +msgstr[1] "Broken (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:397 +msgctxt "themes" +msgid "Disabled (%s)" +msgid_plural "Disabled (%s)" +msgstr[0] "Disabled (%s)" +msgstr[1] "Disabled (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:388 +msgctxt "themes" +msgid "Enabled (%s)" +msgid_plural "Enabled (%s)" +msgstr[0] "Enabled (%s)" +msgstr[1] "Enabled (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:379 +msgctxt "themes" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "All (%s)" +msgstr[1] "All (%s)" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:331 +msgid "Theme" +msgstr "Theme" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:319 +msgid "No themes found." +msgstr "No themes found." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:706 +msgctxt "verb; site" +msgid "Archive" +msgstr "Archive" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:704 +msgid "Unarchive" +msgstr "Unarchive" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:480 +msgid "Never" +msgstr "Never" + +#. translators: 1: Site title, 2: Site tagline. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:453 +msgid "%1$s – %2$s" +msgstr "%1$s – %2$s" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:365 +#: wp-admin/network/site-info.php:176 +msgctxt "site" +msgid "Registered" +msgstr "Registered" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:364 +#: wp-admin/network/site-info.php:180 +msgid "Last Updated" +msgstr "Last Updated" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:710 +msgctxt "site" +msgid "Not Spam" +msgstr "Not Spam" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:292 +msgctxt "site" +msgid "Mark as spam" +msgstr "Mark as spam" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:207 +msgid "No sites found." +msgstr "No sites found." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:42 +#: wp-admin/network/site-info.php:190 +msgid "Mature" +msgstr "Mature" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:41 +#: wp-admin/network/site-info.php:188 +msgid "Deleted" +msgstr "Deleted" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:40 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:712 +#: wp-admin/network/site-info.php:187 +msgctxt "site" +msgid "Spam" +msgstr "Spam" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:39 +#: wp-admin/network/site-info.php:186 +msgid "Archived" +msgstr "Archived" + +#: wp-admin/network/user-new.php:136 wp-admin/network/site-users.php:360 +msgid "A password reset link will be sent to the user via email." +msgstr "A password reset link will be sent to the user via email." + +#. translators: 1: NOBLOGREDIRECT, 2: wp-config.php +#: wp-admin/network/settings.php:212 +msgid "If registration is disabled, please set %1$s in %2$s to a URL you will redirect visitors to if they visit a non-existent site." +msgstr "If registration is disabled, please set %1$s in %2$s to a URL you will redirect visitors to if they visit a non-existent site." + +#. translators: 1: WP_ALLOW_MULTISITE, 2: wp-config.php +#: wp-admin/network.php:44 +msgid "You must define the %1$s constant as true in your %2$s file to allow creation of a Network." +msgstr "You must define the %1$s constant as true in your %2$s file to allow creation of a Network." + +#: wp-admin/network/themes.php:331 +msgid "Themes list navigation" +msgstr "Themes list navigation" + +#: wp-admin/network/sites.php:52 +msgid "Sites list" +msgstr "Sites list" + +#: wp-admin/network/sites.php:51 +msgid "Sites list navigation" +msgstr "Sites list navigation" + +#: wp-admin/network/site-users.php:27 +msgid "Site users list" +msgstr "Site users list" + +#: wp-admin/network/site-users.php:26 +msgid "Site users list navigation" +msgstr "Site users list navigation" + +#: wp-admin/network/site-users.php:25 +msgid "Filter site users list" +msgstr "Filter site users list" + +#: wp-admin/network/site-themes.php:24 +msgid "Site themes list" +msgstr "Site themes list" + +#: wp-admin/network/site-themes.php:23 +msgid "Site themes list navigation" +msgstr "Site themes list navigation" + +#: wp-admin/network/site-themes.php:22 +msgid "Filter site themes list" +msgstr "Filter site themes list" + +#: wp-admin/network/site-new.php:121 +msgid "The domain or path entered conflicts with an existing username." +msgstr "The domain or path entered conflicts with an existing username." + +#: wp-admin/network/sites.php:89 +msgid "The requested action is not valid." +msgstr "The requested action is not valid." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:81 +msgid "You are about to mark the site %s as not mature." +msgstr "You are about to mark the site %s as not mature." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:79 +msgid "You are about to mark the site %s as mature." +msgstr "You are about to mark the site %s as mature." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:77 +msgid "You are about to delete the site %s." +msgstr "You are about to delete the site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:75 +msgid "You are about to mark the site %s as spam." +msgstr "You are about to mark the site %s as spam." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:73 +msgid "You are about to unspam the site %s." +msgstr "You are about to unspam the site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:71 +msgid "You are about to archive the site %s." +msgstr "You are about to archive the site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:69 +msgid "You are about to unarchive the site %s." +msgstr "You are about to unarchive the site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:67 +msgid "You are about to deactivate the site %s." +msgstr "You are about to deactivate the site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:65 +msgid "You are about to activate the site %s." +msgstr "You are about to activate the site %s." + +#: wp-admin/network/site-info.php:28 wp-admin/network/site-users.php:46 +#: wp-admin/network/site-themes.php:53 wp-admin/network/site-settings.php:28 +msgid "The requested site does not exist." +msgstr "The requested site does not exist." + +#: wp-admin/network/user-new.php:29 wp-admin/network/users.php:230 +msgid "Documentation on Network Users" +msgstr "Documentation on Network Users" + +#: wp-admin/network/themes.php:323 +msgid "Documentation on Network Themes" +msgstr "Documentation on Network Themes" + +#: wp-admin/network/settings.php:63 +msgid "Documentation on Network Settings" +msgstr "Documentation on Network Settings" + +#. translators: 1: Site URL, 2: Server error message. +#: wp-admin/network/upgrade.php:98 +msgid "Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s" +msgstr "Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s" + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:392 +msgid "%s theme deleted." +msgid_plural "%s themes deleted." +msgstr[0] "%s theme deleted." +msgstr[1] "%s themes deleted." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:383 wp-admin/network/site-themes.php:204 +msgid "%s theme disabled." +msgid_plural "%s themes disabled." +msgstr[0] "%s theme disabled." +msgstr[1] "%s themes disabled." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:374 wp-admin/network/site-themes.php:195 +msgid "%s theme enabled." +msgid_plural "%s themes enabled." +msgstr[0] "%s theme enabled." +msgstr[1] "%s themes enabled." + +#: wp-admin/network/themes.php:175 +msgid "Yes, delete these themes" +msgstr "Yes, delete these themes" + +#: wp-admin/network/themes.php:142 +msgid "You are about to remove the following themes:" +msgstr "You are about to remove the following themes:" + +#: wp-admin/network/themes.php:141 +msgid "These themes may be active on other sites in the network." +msgstr "These themes may be active on other sites in the network." + +#: wp-admin/network/themes.php:140 +msgid "Delete Themes" +msgstr "Delete Themes" + +#: wp-admin/network/site-info.php:196 +msgid "Set site attributes" +msgstr "Set site attributes" + +#: wp-admin/network/settings.php:479 +msgid "Enable menus" +msgstr "Enable menus" + +#: wp-admin/network/settings.php:412 +msgid "Size in kilobytes" +msgstr "Size in kilobytes" + +#: wp-admin/network/settings.php:396 +msgid "Allowed file types. Separate types by spaces." +msgstr "Allowed file types. Separate types by spaces." + +#: wp-admin/network/settings.php:202 +msgid "New registrations settings" +msgstr "New registrations settings" + +#. translators: 1: File name (.htaccess or web.config), 2: File path. +#: wp-admin/includes/network.php:609 wp-admin/includes/network.php:662 +msgid "Add the following to your %1$s file in %2$s, replacing other WordPress rules:" +msgstr "Add the following to your %1$s file in %2$s, replacing other WordPress rules:" + +#: wp-admin/network/sites.php:114 wp-admin/network/sites.php:190 +msgid "Confirm your action" +msgstr "Confirm your action" + +#: wp-admin/network/users.php:220 +msgid "Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site." +msgstr "Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site." + +#: wp-admin/network/index.php:43 +msgid "To search for a site, enter the path or domain." +msgstr "To search for a site, enter the path or domain." + +#: wp-admin/network/index.php:42 +msgid "To search for a user, enter an email address or username. Use a wildcard to search for a partial username, such as user*." +msgstr "To search for a user, enter an email address or username. Use a wildcard to search for a partial username, such as user*." + +#: wp-admin/network/index.php:40 +msgid "To add a new site, click Create a New Site." +msgstr "To add a new site, click Create a New Site." + +#: wp-admin/network/index.php:39 +msgid "To add a new user, click Create a New User." +msgstr "To add a new user, click Create a New User." + +#: wp-admin/network/index.php:48 +msgid "Quick Tasks" +msgstr "Quick Tasks" + +#: wp-admin/network/index.php:41 +msgid "To search for a user or site, use the search boxes." +msgstr "To search for a user or site, use the search boxes." + +#: wp-admin/network/index.php:38 +msgid "The Right Now widget on this screen provides current user and site counts on your network." +msgstr "The Right Now widget on this screen provides current user and site counts on your network." + +#: wp-admin/network/index.php:28 +msgid "Modify global network settings" +msgstr "Modify global network settings" + +#: wp-admin/network/index.php:27 +msgid "Update your network" +msgstr "Update your network" + +#: wp-admin/network/index.php:26 +msgid "Install and activate themes or plugins" +msgstr "Install and activate themes or plugins" + +#: wp-admin/network/index.php:25 +msgid "Add and manage sites or users" +msgstr "Add and manage sites or users" + +#: wp-admin/network/index.php:24 +msgid "From here you can:" +msgstr "From here you can:" + +#: wp-admin/network/index.php:23 +msgid "Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network." +msgstr "Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network." + +#: wp-admin/network/upgrade.php:140 +msgid "WordPress has been updated! Before we send you on your way, we need to individually upgrade the sites in your network." +msgstr "WordPress has been updated! Before we send you on your way, we need to individually upgrade the sites in your network." + +#: wp-admin/network/upgrade.php:23 +msgid "Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied." +msgstr "Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied." + +#: wp-admin/network/upgrade.php:15 wp-admin/network/upgrade.php:42 +#: wp-admin/network/upgrade.php:144 wp-admin/network/menu.php:46 +msgid "Upgrade Network" +msgstr "Upgrade Network" + +#: wp-admin/includes/network.php:263 wp-admin/includes/network.php:615 +#: wp-admin/includes/network.php:668 +msgid "Subdirectory networks may not be fully compatible with custom wp-content directories." +msgstr "Subdirectory networks may not be fully compatible with custom wp-content directories." + +#: wp-admin/network.php:62 +msgid "Add the designated lines of code to wp-config.php (just before /*...stop editing...*/) and .htaccess (replacing the existing WordPress rules)." +msgstr "Add the designated lines of code to wp-config.php (just before /*...stop editing...*/) and .htaccess (replacing the existing WordPress rules)." + +#: wp-admin/network/settings.php:423 +msgid "Language Settings" +msgstr "Language Settings" + +#: wp-admin/network/settings.php:238 +msgid "Allow site administrators to add new users to their site via the \"Users → Add New\" page" +msgstr "Allow site administrators to add new users to their site via the \"Users → Add New\" page" + +#: wp-admin/network/settings.php:57 +msgid "Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges." +msgstr "Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges." + +#: wp-admin/network/site-users.php:269 +msgid "Enter the username and email." +msgstr "Enter the username and email." + +#: wp-admin/network/site-users.php:266 +msgid "User created." +msgstr "User created." + +#: wp-admin/network/site-users.php:263 +msgid "Select a user to remove." +msgstr "Select a user to remove." + +#: wp-admin/network/site-users.php:257 +msgid "Select a user to change role." +msgstr "Select a user to change role." + +#: wp-admin/network/site-users.php:251 +msgid "Enter the username of an existing user." +msgstr "Enter the username of an existing user." + +#: wp-admin/network/site-users.php:245 +msgid "User is already a member of this site." +msgstr "User is already a member of this site." + +#: wp-admin/network/site-settings.php:78 +msgid "Site options updated." +msgstr "Site options updated." + +#: wp-admin/network/site-new.php:177 wp-admin/network/site-new.php:187 +msgid "Add New Site" +msgstr "Add New Site" + +#. translators: 1: Dashboard URL, 2: Network admin edit URL. +#: wp-admin/network/site-new.php:170 +msgid "Site added. Visit Dashboard or Edit Site" +msgstr "Site added. Visit Dashboard or Edit Site" + +#: wp-admin/network/site-new.php:25 +msgid "This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings." +msgstr "This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings." + +#: wp-admin/network/site-info.php:121 +msgid "Site info updated." +msgstr "Site info updated." + +#: wp-admin/network/themes.php:416 +msgid "You cannot delete a theme while it is active on the main site." +msgstr "You cannot delete a theme while it is active on the main site." + +#: wp-admin/network/themes.php:301 +msgid "Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes." +msgstr "Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes." + +#: wp-admin/network/themes.php:182 +msgid "No, return me to the theme list" +msgstr "No, return me to the theme list" + +#: wp-admin/network/themes.php:173 +msgid "Yes, delete this theme" +msgstr "Yes, delete this theme" + +#: wp-admin/network/themes.php:159 +msgid "Are you sure you want to delete these themes?" +msgstr "Are you sure you want to delete these themes?" + +#: wp-admin/network/themes.php:138 +msgid "You are about to remove the following theme:" +msgstr "You are about to remove the following theme:" + +#: wp-admin/network/themes.php:137 +msgid "This theme may be active on other sites in the network." +msgstr "This theme may be active on other sites in the network." + +#: wp-admin/network/themes.php:136 +msgid "Delete Theme" +msgstr "Delete Theme" + +#: wp-admin/network/site-themes.php:212 +msgid "Network enabled themes are not shown on this screen." +msgstr "Network enabled themes are not shown on this screen." + +#: wp-admin/network/themes.php:414 wp-admin/network/site-themes.php:208 +msgid "No theme selected." +msgstr "No theme selected." + +#: wp-admin/network/themes.php:380 wp-admin/network/site-themes.php:201 +msgid "Theme disabled." +msgstr "Theme disabled." + +#: wp-admin/network/themes.php:371 wp-admin/network/site-themes.php:192 +msgid "Theme enabled." +msgstr "Theme enabled." + +#. translators: %s: Site title. +#: wp-admin/network/site-info.php:126 wp-admin/network/site-users.php:204 +#: wp-admin/network/site-themes.php:170 wp-admin/network/site-settings.php:83 +msgid "Edit Site: %s" +msgstr "Edit Site: %s" + +#: wp-admin/network/site-info.php:23 wp-admin/network/site-users.php:41 +#: wp-admin/network/site-themes.php:46 wp-admin/network/site-settings.php:23 +msgid "Invalid site ID." +msgstr "Invalid site ID." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:167 +msgid "Sorry, you are not allowed to delete the site %s." +msgstr "Sorry, you are not allowed to delete the site %s." + +#: wp-admin/network/sites.php:39 +msgid "Clicking on bold headings can re-sort this table." +msgstr "Clicking on bold headings can re-sort this table." + +#: wp-admin/network/sites.php:36 +msgid "Delete which is a permanent action after the confirmation screens." +msgstr "Delete which is a permanent action after the confirmation screens." + +#: wp-admin/network/sites.php:34 +msgid "Dashboard leads to the Dashboard for that site." +msgstr "Dashboard leads to the Dashboard for that site." + +#: wp-admin/network/sites.php:33 +msgid "An Edit link to a separate Edit Site screen." +msgstr "An Edit link to a separate Edit Site screen." + +#: wp-admin/network/sites.php:30 +msgid "Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page." +msgstr "Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page." + +#: wp-admin/network/user-new.php:148 wp-admin/network/site-users.php:323 +msgid "Add User" +msgstr "Add User" + +#: wp-admin/network/user-new.php:55 +msgid "Cannot add user." +msgstr "Cannot add user." + +#: wp-admin/network/user-new.php:22 +msgid "Add User will set up a new user account on the network and send that person an email with username and password." +msgstr "Add User will set up a new user account on the network and send that person an email with username and password." + +#: wp-admin/network/menu.php:41 +msgid "Updates" +msgstr "Updates" + +#: wp-admin/network/settings.php:20 wp-admin/network/menu.php:111 +msgid "Network Settings" +msgstr "Network Settings" + +#: wp-admin/network/menu.php:80 +msgid "Installed Themes" +msgstr "Installed Themes" + +#. translators: %s: Number of available theme updates. +#: wp-admin/network/menu.php:63 +msgid "Themes %s" +msgstr "Themes %s" + +#: wp-admin/network/menu.php:52 +msgid "All Sites" +msgstr "All Sites" + +#: wp-admin/includes/network.php:680 +msgid "Once you complete these steps, your network is enabled and configured. You will have to log in again." +msgstr "Once you complete these steps, your network is enabled and configured. You will have to log in again." + +#: wp-admin/includes/network.php:545 +msgid "To make your installation more secure, you should also add:" +msgstr "To make your installation more secure, you should also add:" + +#: wp-admin/includes/network.php:440 +msgid "Complete the following steps to enable the features for creating a network of sites." +msgstr "Complete the following steps to enable the features for creating a network of sites." + +#: wp-admin/includes/network.php:439 +msgid "Enabling the Network" +msgstr "Enabling the Network" + +#: wp-admin/includes/network.php:428 +msgid "Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables." +msgstr "Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables." + +#: wp-admin/includes/network.php:427 +msgid "An existing WordPress network was detected." +msgstr "An existing WordPress network was detected." + +#: wp-admin/includes/network.php:422 +msgid "The original configuration steps are shown here for reference." +msgstr "The original configuration steps are shown here for reference." + +#: wp-admin/includes/network.php:369 +msgid "Your email address." +msgstr "Your email address." + +#: wp-admin/includes/network.php:360 +msgid "What would you like to call your network?" +msgstr "What would you like to call your network?" + +#: wp-admin/includes/network.php:356 wp-admin/network/settings.php:153 +msgid "Network Title" +msgstr "Network Title" + +#: wp-admin/includes/network.php:335 +msgid "Because your installation is not new, the sites in your WordPress network must use sub-domains." +msgstr "Because your installation is not new, the sites in your WordPress network must use sub-domains." + +#: wp-admin/includes/network.php:322 +msgid "Because your installation is in a directory, the sites in your WordPress network must use sub-directories." +msgstr "Because your installation is in a directory, the sites in your WordPress network must use sub-directories." + +#: wp-admin/includes/network.php:312 wp-admin/includes/network.php:325 +#: wp-admin/includes/network.php:336 +msgid "The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links." +msgstr "The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links." + +#: wp-admin/includes/network.php:297 +msgid "Network Details" +msgstr "Network Details" + +#: wp-admin/includes/network.php:269 wp-admin/includes/network.php:283 +#: wp-admin/includes/network.php:343 +msgid "Server Address" +msgstr "Server Address" + +#. translators: 1: Host name. +#: wp-admin/includes/network.php:251 +msgctxt "subdirectory examples" +msgid "like %1$s/site1 and %1$s/site2" +msgstr "like %1$s/site1 and %1$s/site2" + +#: wp-admin/includes/network.php:246 +msgid "Sub-directories" +msgstr "Sub-directories" + +#. translators: 1: Host name. +#: wp-admin/includes/network.php:239 +msgctxt "subdomain examples" +msgid "like site1.%1$s and site2.%1$s" +msgstr "like site1.%1$s and site2.%1$s" + +#: wp-admin/includes/network.php:234 +msgid "Sub-domains" +msgstr "Sub-domains" + +#: wp-admin/includes/network.php:230 +msgid "You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality." +msgstr "You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality." + +#: wp-admin/includes/network.php:227 +msgid "Addresses of Sites in your Network" +msgstr "Addresses of Sites in your Network" + +#: wp-admin/includes/network.php:195 +msgid "Note:" +msgstr "Note:" + +#: wp-admin/includes/network.php:182 +msgid "Fill in the information below and you’ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step." +msgstr "Fill in the information below and you’ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step." + +#: wp-admin/includes/network.php:181 +msgid "Welcome to the Network installation process!" +msgstr "Welcome to the Network installation process!" + +#: wp-admin/includes/network.php:160 +msgid "Error: The network could not be created." +msgstr "Error: the network could not be created." + +#: wp-admin/includes/network.php:142 +msgid "You cannot install a network of sites with your server address." +msgstr "You cannot install a network of sites with your server address." + +#: wp-admin/includes/network.php:133 +msgid "Once the network is created, you may reactivate your plugins." +msgstr "Once the network is created, you may reactivate your plugins." + +#. translators: %s: URL to Plugins screen. +#: wp-admin/includes/network.php:130 +msgid "Please deactivate your plugins before enabling the Network feature." +msgstr "Please deactivate your plugins before enabling the Network feature." + +#: wp-admin/network.php:72 +msgid "Network" +msgstr "Network" + +#: wp-admin/network.php:64 +msgid "The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed in a future version." +msgstr "The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed in a future version." + +#: wp-admin/network.php:63 +msgid "Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar." +msgstr "Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar." + +#: wp-admin/network.php:61 +msgid "The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files." +msgstr "The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files." + +#: wp-admin/network.php:60 +msgid "Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories)." +msgstr "Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories)." + +#: wp-admin/network.php:59 +msgid "This screen allows you to configure a network as having subdomains (site1.example.com) or subdirectories (example.com/site1). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it." +msgstr "This screen allows you to configure a network as having subdomains (site1.example.com) or subdirectories (example.com/site1). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it." + +#: wp-admin/network.php:55 +msgid "Create a Network of WordPress Sites" +msgstr "Create a Network of WordPress Sites" + +#: wp-admin/network.php:29 +msgid "The Network creation panel is not for WordPress MU networks." +msgstr "The Network creation panel is not for WordPress MU networks." + +#. translators: %s: User login. +#: wp-admin/network/users.php:77 +msgid "Warning! User cannot be modified. The user %s is a network administrator." +msgstr "Warning! User cannot be modified. The user %s is a network administrator." + +#: wp-admin/network/site-new.php:26 +msgid "If the admin email for the new site does not exist in the database, a new user will also be created." +msgstr "If the admin email for the new site does not exist in the database, a new user will also be created." + +#: wp-admin/network/sites.php:38 +msgid "The site ID is used internally, and is not shown on the front end of the site or to users/viewers." +msgstr "The site ID is used internally, and is not shown on the front end of the site or to users/viewers." + +#: wp-admin/network/sites.php:35 +msgid "Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later." +msgstr "Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later." + +#: wp-admin/network/sites.php:32 +msgid "Hovering over each site reveals seven options (three for the primary site):" +msgstr "Hovering over each site reveals seven options (three for the primary site):" + +#: wp-admin/network/settings.php:51 +msgid "Operational settings has fields for the network’s name and admin email." +msgstr "Operational settings has fields for the network’s name and admin email." + +#: wp-admin/network/users.php:223 +msgid "The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses." +msgstr "The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses." + +#: wp-admin/network/users.php:221 +msgid "You can also go to the user’s profile page by clicking on the individual username." +msgstr "You can also go to the user’s profile page by clicking on the individual username." + +#: wp-admin/network/settings.php:54 +msgid "Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only)." +msgstr "Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only)." + +#: wp-admin/network/sites.php:37 +msgid "Visit to go to the front-end site live." +msgstr "Visit to go to the front-end site live." + +#: wp-admin/network/users.php:224 +msgid "You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege." +msgstr "You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege." + +#: wp-admin/network/user-new.php:23 +msgid "Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them." +msgstr "Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them." + +#: wp-admin/network/users.php:222 +msgid "You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list." +msgstr "You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list." + +#: wp-admin/network/users.php:219 +msgid "This table shows all users across the network and the sites to which they are assigned." +msgstr "This table shows all users across the network and the sites to which they are assigned." + +#: wp-admin/network/upgrade.php:25 +msgid "If this process fails for any reason, users logging in to their sites will force the same update." +msgstr "If this process fails for any reason, users logging in to their sites will force the same update." + +#: wp-admin/network/upgrade.php:24 +msgid "If a version update to core has not happened, clicking this button won’t affect anything." +msgstr "If a version update to core has not happened, clicking this button won’t affect anything." + +#: wp-admin/network/themes.php:300 +msgid "If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen." +msgstr "If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen." + +#: wp-admin/network/themes.php:299 +msgid "This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using." +msgstr "This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using." + +#: wp-admin/network/sites.php:31 +msgid "This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table." +msgstr "This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table." + +#: wp-admin/network/settings.php:56 +msgid "Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins." +msgstr "Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins." + +#: wp-admin/network/settings.php:53 +msgid "New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what᾿s put in the first post, page, comment, comment author, and comment URL." +msgstr "New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what᾿s put in the first post, page, comment, comment author, and comment URL." + +#: wp-admin/network/settings.php:52 +msgid "Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network." +msgstr "Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network." + +#: wp-admin/network/settings.php:50 +msgid "This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site’s options." +msgstr "This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site’s options." + +#. translators: %s: Reserved names list. +#: wp-admin/network/site-new.php:59 +msgid "The following words are reserved for use by WordPress functions and cannot be used as blog names: %s" +msgstr "The following words are reserved for use by WordPress functions and cannot be used as blog names: %s" + +#: wp-admin/network/upgrade.php:124 +msgid "If your browser doesn’t start loading the next page automatically, click this link:" +msgstr "If your browser doesn’t start loading the next page automatically, click this link:" + +#: wp-admin/network/settings.php:284 +msgid "If you want to ban domains from site registrations. One domain per line." +msgstr "If you want to ban domains from site registrations. One domain per line." + +#: wp-admin/network/settings.php:266 +msgid "If you want to limit site registrations to certain domains. One domain per line." +msgstr "If you want to limit site registrations to certain domains. One domain per line." + +#: wp-admin/network/site-new.php:40 +msgid "Can’t create an empty site." +msgstr "Can’t create an empty site." + +#: wp-admin/network/users.php:256 +msgid "Users removed from spam." +msgstr "Users removed from spam." + +#: wp-admin/network/sites.php:338 +msgid "Site marked as spam." +msgstr "Site marked as spam." + +#: wp-admin/network/sites.php:335 +msgid "Site removed from spam." +msgstr "Site removed from spam." + +#: wp-admin/network/sites.php:311 +msgid "Sites marked as spam." +msgstr "Sites marked as spam." + +#: wp-admin/network/sites.php:308 +msgid "Sites removed from spam." +msgstr "Sites removed from spam." + +#: wp-admin/network/users.php:259 +msgid "Users deleted." +msgstr "Users deleted." + +#: wp-admin/network/users.php:253 +msgid "Users marked as spam." +msgstr "Users marked as spam." + +#: wp-admin/network/sites.php:332 +msgid "Site deactivated." +msgstr "Site deactivated." + +#: wp-admin/network/sites.php:329 +msgid "Site activated." +msgstr "Site activated." + +#: wp-admin/network/sites.php:326 +msgid "Site unarchived." +msgstr "Site unarchived." + +#: wp-admin/network/sites.php:323 +msgid "Site archived." +msgstr "Site archived." + +#: wp-admin/network/sites.php:317 +msgid "Site deleted." +msgstr "Site deleted." + +#: wp-admin/network/sites.php:314 +msgid "Sites deleted." +msgstr "Sites deleted." + +#: wp-admin/network/sites.php:105 wp-admin/network/sites.php:223 +msgid "Sorry, you are not allowed to change the current site." +msgstr "Sorry, you are not allowed to change the current site." + +#: wp-admin/network/site-new.php:126 +msgid "There was an error creating the user." +msgstr "There was an error creating the user." + +#: wp-admin/network/settings.php:392 +msgid "Upload file types" +msgstr "Upload file types" + +#. translators: %s: Number of megabytes to limit uploads to. +#: wp-admin/network/settings.php:380 +msgid "Limit total size of files uploaded to %s MB" +msgstr "Limit total size of files uploaded to %s MB" + +#: wp-admin/network/settings.php:366 +msgid "The URL for the first comment on a new site." +msgstr "The URL for the first comment on a new site." + +#: wp-admin/network/settings.php:348 +msgid "The author of the first comment on a new site." +msgstr "The author of the first comment on a new site." + +#: wp-admin/network/settings.php:339 +msgid "The first comment on a new site." +msgstr "The first comment on a new site." + +#: wp-admin/network/settings.php:329 +msgid "The first page on a new site." +msgstr "The first page on a new site." + +#: wp-admin/network/settings.php:319 +msgid "The first post on a new site." +msgstr "The first post on a new site." + +#: wp-admin/network/upgrade.php:73 +msgid "All done!" +msgstr "All done!" + +#: wp-admin/network/settings.php:206 +msgid "Both sites and user accounts can be registered" +msgstr "Both sites and user accounts can be registered" + +#: wp-admin/network/settings.php:205 +msgid "Logged in users may register new sites" +msgstr "Logged in users may register new sites" + +#: wp-admin/network/settings.php:204 +msgid "User accounts may be registered" +msgstr "User accounts may be registered" + +#: wp-admin/network/settings.php:203 +msgid "Registration is disabled" +msgstr "Registration is disabled" + +#: wp-admin/network/settings.php:476 +msgid "Enable administration menus" +msgstr "Enable administration menus" + +#: wp-admin/network/settings.php:371 +msgid "Upload Settings" +msgstr "Upload Settings" + +#: wp-admin/network/settings.php:290 +msgid "New Site Settings" +msgstr "New Site Settings" + +#: wp-admin/network/settings.php:190 +msgid "Registration Settings" +msgstr "Registration Settings" + +#: wp-admin/network/settings.php:150 +msgid "Operational Settings" +msgstr "Operational Settings" + +#: wp-admin/network/site-new.php:91 +msgid "Missing email address." +msgstr "Missing email address." + +#: wp-admin/network/site-new.php:87 +msgid "Missing or invalid site address." +msgstr "Missing or invalid site address." + +#: wp-admin/network/upgrade.php:124 +msgid "Next Sites" +msgstr "Next Sites" + +#: wp-admin/network/settings.php:374 +msgid "Site upload space" +msgstr "Site upload space" + +#: wp-admin/network/settings.php:299 +msgid "The welcome email sent to new site owners." +msgstr "The welcome email sent to new site owners." + +#: wp-admin/network/settings.php:247 +msgid "Users are not allowed to register these sites. Separate names by spaces." +msgstr "Users are not allowed to register these sites. Separate names by spaces." + +#: wp-admin/network/settings.php:231 +msgid "Send the network admin an email notification every time someone registers a site or user account" +msgstr "Send the network admin an email notification every time someone registers a site or user account" + +#: wp-admin/includes/network.php:365 wp-admin/network/settings.php:160 +msgid "Network Admin Email" +msgstr "Network Admin Email" + +#: wp-admin/network/site-new.php:263 +msgid "A new user will be created if the above email address is not in the database." +msgstr "A new user will be created if the above email address is not in the database." + +#: wp-admin/network/site-new.php:259 +msgid "Admin Email" +msgstr "Admin Email" + +#: wp-admin/network/site-new.php:275 +msgid "Add Site" +msgstr "Add Site" + +#: wp-admin/network/settings.php:426 +msgid "Default Language" +msgstr "Default Language" + +#: wp-admin/network/settings.php:402 +msgid "Max upload file size" +msgstr "Max upload file size" + +#: wp-admin/network/settings.php:362 +msgid "First Comment URL" +msgstr "First Comment URL" + +#: wp-admin/network/settings.php:344 +msgid "First Comment Author" +msgstr "First Comment Author" + +#: wp-admin/network/settings.php:334 +msgid "First Comment" +msgstr "First Comment" + +#: wp-admin/network/settings.php:324 +msgid "First Page" +msgstr "First Page" + +#: wp-admin/network/settings.php:309 +msgid "The welcome email sent to new users." +msgstr "The welcome email sent to new users." + +#: wp-admin/network/settings.php:304 +msgid "Welcome User Email" +msgstr "Welcome User Email" + +#: wp-admin/network/settings.php:294 +msgid "Welcome Email" +msgstr "Welcome Email" + +#: wp-admin/network/settings.php:272 +msgid "Banned Email Domains" +msgstr "Banned Email Domains" + +#: wp-admin/network/settings.php:253 +msgid "Limited Email Registrations" +msgstr "Limited Email Registrations" + +#: wp-admin/network/settings.php:243 +msgid "Banned Names" +msgstr "Banned Names" + +#: wp-admin/network/settings.php:236 +msgid "Add New Users" +msgstr "Add New Users" + +#: wp-admin/network/settings.php:224 +msgid "Registration notification" +msgstr "Registration notification" + +#: wp-admin/network/settings.php:193 +msgid "Allow new registrations" +msgstr "Allow new registrations" + +#: wp-admin/network/site-users.php:272 +msgid "Duplicated username or email address." +msgstr "Duplicated username or email address." + +#: wp-admin/network/user-new.php:41 +msgid "Cannot create an empty user." +msgstr "Cannot create an empty user." + +#: wp-admin/network/sites.php:121 wp-admin/network/sites.php:208 +msgid "Confirm" +msgstr "Confirm" \ No newline at end of file diff --git a/wp-content/languages/admin-network-nl_NL.mo b/wp-content/languages/admin-network-nl_NL.mo new file mode 100644 index 00000000..bd025aa8 Binary files /dev/null and b/wp-content/languages/admin-network-nl_NL.mo differ diff --git a/wp-content/languages/admin-network-nl_NL.po b/wp-content/languages/admin-network-nl_NL.po new file mode 100644 index 00000000..e933aa31 --- /dev/null +++ b/wp-content/languages/admin-network-nl_NL.po @@ -0,0 +1,1426 @@ +# Translation of WordPress - 5.6.x - Development - Administration - Network Admin in Dutch +# This file is distributed under the same license as the WordPress - 5.6.x - Development - Administration - Network Admin package. +msgid "" +msgstr "" +"PO-Revision-Date: 2020-12-04 18:05:00+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: nl\n" +"Project-Id-Version: WordPress - 5.6.x - Development - Administration - Network Admin\n" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:293 +msgctxt "site" +msgid "Not spam" +msgstr "Geen spam" + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:410 +msgid "%s theme will no longer be auto-updated." +msgid_plural "%s themes will no longer be auto-updated." +msgstr[0] "%s thema zal niet langer automatisch geupdate worden." +msgstr[1] "%s thema's zullen niet langer automatisch geupdate worden. " + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:401 +msgid "%s theme will be auto-updated." +msgid_plural "%s themes will be auto-updated." +msgstr[0] "%s thema zal automatisch worden geüpdate." +msgstr[1] "%s thema's zullen automatisch worden geüpdate." + +#: wp-admin/network/themes.php:225 +msgid "Sorry, you are not allowed to change themes automatic update settings." +msgstr "Sorry, je hebt geen toestemming de instelling voor het automatisch updaten van thema's te wijzigen." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:321 +msgid "No themes are currently available." +msgstr "Er zijn momenteel geen thema's beschikbaar." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:477 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:498 +#: wp-admin/includes/class-wp-ms-users-list-table.php:336 +msgid "Y/m/d g:i:s a" +msgstr "j F Y H:i" + +#: wp-admin/includes/network.php:629 +msgid "https://wordpress.org/support/article/nginx/" +msgstr "https://wordpress.org/support/article/nginx/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/network.php:628 +msgid "It seems your network is running with Nginx web server. Learn more about further configuration." +msgstr "Het lijkt erop dat je netwerk werkt met Nginx server. Lees meer over verdere configuratie." + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:254 +msgid "Deleted (%s)" +msgid_plural "Deleted (%s)" +msgstr[0] "Verwijderd (%s)" +msgstr[1] "Verwijderd (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:247 +msgctxt "sites" +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Spam (%s)" +msgstr[1] "Spam (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:241 +msgid "Mature (%s)" +msgid_plural "Mature (%s)" +msgstr[0] "Volwassenen (%s)" +msgstr[1] "Volwassenen (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:235 +msgid "Archived (%s)" +msgid_plural "Archived (%s)" +msgstr[0] "Gearchiveerd (%s)" +msgstr[1] "Gearchiveerd (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:229 +msgid "Public (%s)" +msgid_plural "Public (%s)" +msgstr[0] "Openbaar (%s)" +msgstr[1] "Openbaar (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:222 +msgctxt "sites" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alle (%s)" +msgstr[1] "Alle (%s)" + +#: wp-admin/network/upgrade.php:31 +msgid "Documentation on Upgrade Network" +msgstr "Documentatie over het bijwerken van een Netwerk" + +#: wp-admin/network/index.php:55 +msgid "Documentation on the Network Admin" +msgstr "Documentatie over de Netwerk Admin" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:406 +msgctxt "themes" +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "Update beschikbaar (%s)" +msgstr[1] "Updates beschikbaar (%s)" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:616 +msgid "Main" +msgstr "Hoofd" + +#: wp-admin/network.php:67 wp-admin/network.php:80 +msgid "Documentation on the Network Screen" +msgstr "Documentatie over het netwerkscherm" + +#: wp-admin/network.php:66 wp-admin/network.php:79 +msgid "Documentation on Creating a Network" +msgstr "Documentatie over het maken van een netwerk" + +#. translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES +#: wp-admin/includes/network.php:118 +msgid "The constant %s cannot be defined when creating a network." +msgstr "De constante %s kan niet gedefinieerd worden bij het aanmaken van een netwerk." + +#: wp-admin/network/sites.php:195 +msgid "You are about to delete the following sites:" +msgstr "Je staat op het punt de volgende sites te verwijderen:" + +#: wp-admin/network/site-users.php:248 +msgid "User could not be added to this site." +msgstr "Gebruiker kon niet worden toegevoegd aan deze site." + +#: wp-admin/network/site-new.php:263 +msgid "The username and a link to set the password will be mailed to this email address." +msgstr "De gebruikersnaam en een link om het wachtwoord in te stellen zullen worden gemaild naar dit e-mailadres." + +#. translators: %s: New network admin email. +#: wp-admin/network/settings.php:175 +msgid "There is a pending change of the network admin email to %s." +msgstr "Er is een wijziging van het netwerkbeheerder e-mailadres naar %s in behandeling." + +#: wp-admin/includes/network.php:332 +msgid "Sub-domain Installation" +msgstr "Subdomein installatie" + +#: wp-admin/includes/network.php:301 wp-admin/includes/network.php:319 +msgid "Sub-directory Installation" +msgstr "Submap installatie" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:909 +msgid "Active Child Theme" +msgstr "Actief subthema" + +#: wp-admin/network/site-info.php:193 +msgid "Attributes" +msgstr "Attributen" + +#. translators: %s: File size in kilobytes. +#: wp-admin/network/settings.php:407 +msgid "%s KB" +msgstr "%s KB" + +#. translators: %s: Default network title. +#: wp-admin/includes/network.php:172 +msgid "%s Sites" +msgstr "%s sites" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:624 +msgctxt "theme" +msgid "Delete %s" +msgstr "%s verwijderen" + +#: wp-admin/network/themes.php:101 +msgid "Sorry, you are not allowed to delete themes for this site." +msgstr "Je hebt geen toestemming om thema's van de site te verwijderen." + +#: wp-admin/network/themes.php:14 +msgid "Sorry, you are not allowed to manage network themes." +msgstr "Je hebt geen toestemming om netwerk-thema's te beheren." + +#: wp-admin/network/sites.php:320 +msgid "Sorry, you are not allowed to delete that site." +msgstr "Je hebt geen toestemming om die site te verwijderen." + +#: wp-admin/network/site-themes.php:14 +msgid "Sorry, you are not allowed to manage themes for this site." +msgstr "Je hebt geen toestemming om thema's te beheren voor deze site." + +#: wp-admin/network/site-new.php:17 +msgid "Sorry, you are not allowed to add sites to this network." +msgstr "Je hebt geen toestemming om sites toe te voegen aan dit netwerk." + +#: wp-admin/network/site-info.php:14 wp-admin/network/site-users.php:14 +#: wp-admin/network/site-settings.php:14 +msgid "Sorry, you are not allowed to edit this site." +msgstr "Je hebt geen toestemming om deze site aan te passen." + +#: wp-admin/network/settings.php:357 +msgid "The email address of the first comment author on a new site." +msgstr "Het e-mailadres van de eerste reactie-auteur op een nieuwe site." + +#: wp-admin/network/settings.php:353 +msgid "First Comment Email" +msgstr "De eerste reactie e-mail" + +#: wp-admin/includes/network.php:485 +msgid "That’s all, stop editing! Happy publishing." +msgstr "Dat is alles, klaar met bewerken! Veel plezier met publiceren." + +#. translators: 1: wp-config.php, 2: Location of wp-config file, 3: Translated +#. version of "That's all, stop editing! Happy publishing." +#: wp-admin/includes/network.php:477 +msgid "Add the following to your %1$s file in %2$s above the line reading %3$s:" +msgstr "Voeg het volgende toe aan je %1$s bestand in %2$s boven de regel waar staat %3$s:" + +#. translators: 1: Theme name, 2: Theme author. +#: wp-admin/network/themes.php:149 +msgctxt "theme" +msgid "%1$s by %2$s" +msgstr "%1$s door %2$s" + +#: wp-admin/network/site-new.php:219 +msgid "Only lowercase letters (a-z), numbers, and hyphens are allowed." +msgstr "Alleen kleine letters (a-z), cijfers en koppeltekens zijn toegestaan." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:540 +msgid "These unique authentication keys are also missing from your %s file." +msgstr "Deze unieke authenticatiesleutels ontbreken ook van je %s bestand." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:534 +msgid "This unique authentication key is also missing from your %s file." +msgstr "Deze unieke autorisatiesleutel ontbreekt ook in je %s bestand." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:463 +msgid "We recommend you back up your existing %s file." +msgstr "We bevelen aan om eerst een back-up te maken van het bestaande %s bestand." + +#. translators: 1: wp-config.php, 2: .htaccess +#. translators: 1: wp-config.php, 2: web.config +#: wp-admin/includes/network.php:447 wp-admin/includes/network.php:455 +msgid "We recommend you back up your existing %1$s and %2$s files." +msgstr "We bevelen aan om eerst een back-up te maken van de %1$s en %2$s bestanden." + +#. translators: 1: localhost, 2: localhost.localdomain +#: wp-admin/includes/network.php:306 +msgid "Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains." +msgstr "Omdat je %1$s gebruikt, moeten de sites in je netwerk subfolders gebruiken. Overweeg %2$s als je subdomeinen wilt gebruiken." + +#. translators: %s: Host name. +#: wp-admin/includes/network.php:288 wp-admin/includes/network.php:348 +msgid "The internet address of your network will be %s." +msgstr "Het internetadres van je netwerk wordt: %s." + +#. translators: 1: Site URL, 2: Host name, 3: www. +#: wp-admin/includes/network.php:274 +msgid "We recommend you change your site domain to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s but any links will not have the %3$s prefix." +msgstr "We raden je aan je site domein te wijzigen naar %1$s voordat de netwerk functionaliteit wordt geactiveerd. Het is nog steeds mogelijk om je site te bezoeken met het %3$s voorvoegsel in het adres als %2$s, maar elke link zal het %3$s voorvoegsel niet bevatten." + +#: wp-admin/includes/network.php:229 +msgid "You cannot change this later." +msgstr "Je kunt dit achteraf niet wijzigen." + +#: wp-admin/includes/network.php:228 +msgid "Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories." +msgstr "Maak een keuze of je sites in je WordPress netwerk als subdomein of subfolder wilt gebruiken." + +#. translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google +#. search for mod_rewrite. +#: wp-admin/includes/network.php:216 +msgid "If %1$s is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up." +msgstr "Als %1$s is uitgeschakeld, vraag je beheerder om deze module in te schakelen, of bekijk de Apache documentatie of kijk ergens anders voor hulp om het in te stellen." + +#. translators: %s: mod_rewrite +#: wp-admin/includes/network.php:206 +msgid "It looks like the Apache %s module is not installed." +msgstr "Het lijkt er op dat de Apache %s module niet is geïnstalleerd." + +#. translators: %s: mod_rewrite +#: wp-admin/includes/network.php:198 +msgid "Please make sure the Apache %s module is installed as it will be used at the end of this installation." +msgstr "Verzeker jezelf ervan dat de Apache %s module is geïnstalleerd aangezien het gebruikt gaat worden na deze installatie." + +#. translators: %s: Port number. +#: wp-admin/includes/network.php:145 +msgid "You cannot use port numbers such as %s." +msgstr "Je mag geen poortnummers gebruiken zoals %s." + +#: wp-admin/includes/class-wp-ms-users-list-table.php:200 +msgctxt "user" +msgid "Registered" +msgstr "Geregistreerd" + +#. translators: Number of users. +#: wp-admin/includes/class-wp-ms-users-list-table.php:164 +msgid "Super Admin (%s)" +msgid_plural "Super Admins (%s)" +msgstr[0] "Super Admin (%s)" +msgstr[1] "Super Admins (%s)" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:118 +msgctxt "user" +msgid "Not spam" +msgstr "Geen spam" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:117 +msgctxt "user" +msgid "Mark as spam" +msgstr "Markeer als spam" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:727 +msgid "Visit Theme Site" +msgstr "Thema site bezoeken" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:721 +msgid "Visit %s homepage" +msgstr "Homepagina %s bezoeken" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:690 +msgid "Broken Theme:" +msgstr "Kapot thema:" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:596 +msgid "Network Disable %s" +msgstr "%s voor netwerk deactiveren" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:593 +msgid "Disable %s" +msgstr "%s deactiveren" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:570 +msgid "Network Enable %s" +msgstr "%s voor netwerk activeren" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:567 +msgid "Enable %s" +msgstr "%s activeren" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:472 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:603 +msgid "Network Disable" +msgstr "Netwerk uitschakelen" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:472 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:603 +msgid "Disable" +msgstr "Uitschakelen" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:469 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:577 +msgid "Enable" +msgstr "Inschakelen" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:415 +msgctxt "themes" +msgid "Broken (%s)" +msgid_plural "Broken (%s)" +msgstr[0] "Incompleet (%s)" +msgstr[1] "Incompleet (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:397 +msgctxt "themes" +msgid "Disabled (%s)" +msgid_plural "Disabled (%s)" +msgstr[0] "Uitgeschakeld (%s)" +msgstr[1] "Uitgeschakeld (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:388 +msgctxt "themes" +msgid "Enabled (%s)" +msgid_plural "Enabled (%s)" +msgstr[0] "Ingeschakeld (%s)" +msgstr[1] "Ingeschakeld (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:379 +msgctxt "themes" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alles (%s)" +msgstr[1] "Alles (%s)" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:331 +msgid "Theme" +msgstr "Thema" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:319 +msgid "No themes found." +msgstr "Geen thema's gevonden." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:706 +msgctxt "verb; site" +msgid "Archive" +msgstr "Archiveren" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:704 +msgid "Unarchive" +msgstr "Dearchiveren" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:480 +msgid "Never" +msgstr "Nooit" + +#. translators: 1: Site title, 2: Site tagline. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:453 +msgid "%1$s – %2$s" +msgstr "%1$s – %2$s" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:365 +#: wp-admin/network/site-info.php:176 +msgctxt "site" +msgid "Registered" +msgstr "Geregistreerd" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:364 +#: wp-admin/network/site-info.php:180 +msgid "Last Updated" +msgstr "Laatst bijgewerkt" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:710 +msgctxt "site" +msgid "Not Spam" +msgstr "Geen spam" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:292 +msgctxt "site" +msgid "Mark as spam" +msgstr "Markeer als spam" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:207 +msgid "No sites found." +msgstr "Geen sites gevonden." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:42 +#: wp-admin/network/site-info.php:190 +msgid "Mature" +msgstr "Volwassen" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:41 +#: wp-admin/network/site-info.php:188 +msgid "Deleted" +msgstr "Verwijderd" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:40 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:712 +#: wp-admin/network/site-info.php:187 +msgctxt "site" +msgid "Spam" +msgstr "Spam" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:39 +#: wp-admin/network/site-info.php:186 +msgid "Archived" +msgstr "Gearchiveerd" + +#: wp-admin/network/user-new.php:136 wp-admin/network/site-users.php:360 +msgid "A password reset link will be sent to the user via email." +msgstr "Een link om het wachtwoord te herstellen wordt verstuurd naar de gebruiker via e-mail." + +#. translators: 1: NOBLOGREDIRECT, 2: wp-config.php +#: wp-admin/network/settings.php:212 +msgid "If registration is disabled, please set %1$s in %2$s to a URL you will redirect visitors to if they visit a non-existent site." +msgstr "Wanneer registratie is uitgeschakeld zet de %1$s in de %2$s naar een URL waar de gebruikers naartoe verwezen kunnen worden als ze een niet-bestaande site bezoeken." + +#. translators: 1: WP_ALLOW_MULTISITE, 2: wp-config.php +#: wp-admin/network.php:44 +msgid "You must define the %1$s constant as true in your %2$s file to allow creation of a Network." +msgstr "Het is noodzakelijk om de constante %1$s als 'true' te definiëren in het %2$s bestand om een netwerk te kunnen activeren." + +#: wp-admin/network/themes.php:331 +msgid "Themes list navigation" +msgstr "Themalijst navigatie" + +#: wp-admin/network/sites.php:52 +msgid "Sites list" +msgstr "Sitelijst" + +#: wp-admin/network/sites.php:51 +msgid "Sites list navigation" +msgstr "Sitelijst navigatie" + +#: wp-admin/network/site-users.php:27 +msgid "Site users list" +msgstr "Sitegebruikerslijst" + +#: wp-admin/network/site-users.php:26 +msgid "Site users list navigation" +msgstr "Sitegebruikerslijst navigatie" + +#: wp-admin/network/site-users.php:25 +msgid "Filter site users list" +msgstr "Gebruikers van de site filteren" + +#: wp-admin/network/site-themes.php:24 +msgid "Site themes list" +msgstr "Sitethema'slijst" + +#: wp-admin/network/site-themes.php:23 +msgid "Site themes list navigation" +msgstr "Sitethema'slijst navigatie" + +#: wp-admin/network/site-themes.php:22 +msgid "Filter site themes list" +msgstr "Thema's van de site filteren" + +#: wp-admin/network/site-new.php:121 +msgid "The domain or path entered conflicts with an existing username." +msgstr "Het ingevoerde domein of pad conflicteert met een bestaande gebruikersnaam." + +#: wp-admin/network/sites.php:89 +msgid "The requested action is not valid." +msgstr "De opgevraagde actie is ongeldig." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:81 +msgid "You are about to mark the site %s as not mature." +msgstr "Je staat op het punt de site %s te markeren als niet volwassen." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:79 +msgid "You are about to mark the site %s as mature." +msgstr "Je staat op het punt de site %s te markeren als volwassen." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:77 +msgid "You are about to delete the site %s." +msgstr "Je staat op het punt om de site %s te verwijderen." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:75 +msgid "You are about to mark the site %s as spam." +msgstr "Je staat op het punt de site %s te markeren als spam. " + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:73 +msgid "You are about to unspam the site %s." +msgstr "Je staat op het punt de site %s te demarkeren als spam." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:71 +msgid "You are about to archive the site %s." +msgstr "Je staat op het punt de site %s te archiveren." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:69 +msgid "You are about to unarchive the site %s." +msgstr "Je staat op het punt de site %s te herstellen vanuit het archief." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:67 +msgid "You are about to deactivate the site %s." +msgstr "Je staat op het punt de site %s te deactiveren." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:65 +msgid "You are about to activate the site %s." +msgstr "Je staat op het punt de site %s te activeren." + +#: wp-admin/network/site-info.php:28 wp-admin/network/site-users.php:46 +#: wp-admin/network/site-themes.php:53 wp-admin/network/site-settings.php:28 +msgid "The requested site does not exist." +msgstr "De opgevraagde site bestaat niet." + +#: wp-admin/network/user-new.php:29 wp-admin/network/users.php:230 +msgid "Documentation on Network Users" +msgstr "Documentatie over Netwerk-gebruikers" + +#: wp-admin/network/themes.php:323 +msgid "Documentation on Network Themes" +msgstr "Documentatie over Netwerk Thema's" + +#: wp-admin/network/settings.php:63 +msgid "Documentation on Network Settings" +msgstr "Documentatie over de Netwerk instellingen" + +#. translators: 1: Site URL, 2: Server error message. +#: wp-admin/network/upgrade.php:98 +msgid "Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s" +msgstr "Waarschuwing. Er is een probleem met het bijwerken van %1$s. De server is mogelijk niet in staat om verbinding te maken met de sites die er op draaien. Foutmelding: %2$s" + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:392 +msgid "%s theme deleted." +msgid_plural "%s themes deleted." +msgstr[0] "%s thema is verwijderd." +msgstr[1] "%s thema's zijn verwijderd." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:383 wp-admin/network/site-themes.php:204 +msgid "%s theme disabled." +msgid_plural "%s themes disabled." +msgstr[0] "%s thema uitgeschakeld." +msgstr[1] "%s thema's uitgeschakeld." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:374 wp-admin/network/site-themes.php:195 +msgid "%s theme enabled." +msgid_plural "%s themes enabled." +msgstr[0] "%s thema ingeschakeld." +msgstr[1] "%s thema's ingeschakeld." + +#: wp-admin/network/themes.php:175 +msgid "Yes, delete these themes" +msgstr "Ja, deze thema's verwijderen" + +#: wp-admin/network/themes.php:142 +msgid "You are about to remove the following themes:" +msgstr "Je staat op het punt om de volgende thema's te verwijderen:" + +#: wp-admin/network/themes.php:141 +msgid "These themes may be active on other sites in the network." +msgstr "Deze thema's kunnen actief zijn op andere sites in het netwerk." + +#: wp-admin/network/themes.php:140 +msgid "Delete Themes" +msgstr "Thema's verwijderen" + +#: wp-admin/network/site-info.php:196 +msgid "Set site attributes" +msgstr "Site attributen instellen" + +#: wp-admin/network/settings.php:479 +msgid "Enable menus" +msgstr "Menu's activeren" + +#: wp-admin/network/settings.php:412 +msgid "Size in kilobytes" +msgstr "Grootte in kilobytes" + +#: wp-admin/network/settings.php:396 +msgid "Allowed file types. Separate types by spaces." +msgstr "Toegestane bestandstypen. De bestandstypes scheiden met spaties." + +#: wp-admin/network/settings.php:202 +msgid "New registrations settings" +msgstr "Nieuwe registratie instellingen" + +#. translators: 1: File name (.htaccess or web.config), 2: File path. +#: wp-admin/includes/network.php:609 wp-admin/includes/network.php:662 +msgid "Add the following to your %1$s file in %2$s, replacing other WordPress rules:" +msgstr "Voeg het volgende toe aan je %1$s bestand in %2$s, en vervang daarmee andere WordPress regels:" + +#: wp-admin/network/sites.php:114 wp-admin/network/sites.php:190 +msgid "Confirm your action" +msgstr "De acties bevestigen" + +#: wp-admin/network/users.php:220 +msgid "Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site." +msgstr "Hover over een gebruiker in de lijst om de bewerklink te tonen. De linker bewerklink brengt je naar je eigen Profielpagina; de bewerklink aan de rechterzijde naast een sitenaam gaat naar het Site bewerken scherm van deze site." + +#: wp-admin/network/index.php:43 +msgid "To search for a site, enter the path or domain." +msgstr "Om een site te zoeken, vul het pad of domeinnaam in." + +#: wp-admin/network/index.php:42 +msgid "To search for a user, enter an email address or username. Use a wildcard to search for a partial username, such as user*." +msgstr "Om een gebruiker te zoeken, vul een e-mailadres of gebruikersnaam in. Gebruik een wildcard om op een gedeelte van een gebruikersnaam te zoeken, zoals gebrui*." + +#: wp-admin/network/index.php:40 +msgid "To add a new site, click Create a New Site." +msgstr "Om een nieuwe site toe te voegen, klik Nieuwe site toevoegen." + +#: wp-admin/network/index.php:39 +msgid "To add a new user, click Create a New User." +msgstr "Om een nieuwe gebruiker toe te voegen, klik Nieuwe gebruiker toevoegen." + +#: wp-admin/network/index.php:48 +msgid "Quick Tasks" +msgstr "Snelle taken" + +#: wp-admin/network/index.php:41 +msgid "To search for a user or site, use the search boxes." +msgstr "Om te zoeken naar gebruikers of site, maak gebruik van de zoekboxen." + +#: wp-admin/network/index.php:38 +msgid "The Right Now widget on this screen provides current user and site counts on your network." +msgstr "De op-dit-moment widget op dit scherm biedt informatie over gebruikers en site aantallen van je netwerk." + +#: wp-admin/network/index.php:28 +msgid "Modify global network settings" +msgstr "Globale instellingen bewerken" + +#: wp-admin/network/index.php:27 +msgid "Update your network" +msgstr "Netwerk bijwerken" + +#: wp-admin/network/index.php:26 +msgid "Install and activate themes or plugins" +msgstr "Thema's installeren en activeren" + +#: wp-admin/network/index.php:25 +msgid "Add and manage sites or users" +msgstr "Sites en gebruikers toevoegen en beheren" + +#: wp-admin/network/index.php:24 +msgid "From here you can:" +msgstr "Hier kun je:" + +#: wp-admin/network/index.php:23 +msgid "Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network." +msgstr "Welkom bij het netwerkbeheer. Dit onderdeel van het beheerscherm wordt gebruikt om alle aspecten van multisite te beheren." + +#: wp-admin/network/upgrade.php:140 +msgid "WordPress has been updated! Before we send you on your way, we need to individually upgrade the sites in your network." +msgstr "WordPress is bijgewerkt. Voordat je verder gaat moeten eerst alle individuele sites in je netwerk bijgewerkt worden." + +#: wp-admin/network/upgrade.php:23 +msgid "Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied." +msgstr "Dit scherm alleen gebruiken wanneer je WordPress hebt bijgewerkt via Nieuwe updates beschikbaar (in het netwerkbeheer navigatiemenu of in de toolbar). Het klikken op de bijwerkenknop zorgt ervoor dat alle database wijzigingen worden doorgevoerd voor elke site (5 tegelijkertijd) op alle sites in het netwerk." + +#: wp-admin/network/upgrade.php:15 wp-admin/network/upgrade.php:42 +#: wp-admin/network/upgrade.php:144 wp-admin/network/menu.php:46 +msgid "Upgrade Network" +msgstr "Netwerk upgraden" + +#: wp-admin/includes/network.php:263 wp-admin/includes/network.php:615 +#: wp-admin/includes/network.php:668 +msgid "Subdirectory networks may not be fully compatible with custom wp-content directories." +msgstr "Netwerken met submappen kunnen niet volledig compatibel zijn met aangepaste wp-content mappen." + +#: wp-admin/network.php:62 +msgid "Add the designated lines of code to wp-config.php (just before /*...stop editing...*/) and .htaccess (replacing the existing WordPress rules)." +msgstr "De volgende gegenereerde regels toevoegen aan wp-config.php (vlak voor /* ...stop editing... */ en aan .htaccess (vervang hier de bestaande WordPress regels)." + +#: wp-admin/network/settings.php:423 +msgid "Language Settings" +msgstr "Taalinstellingen" + +#: wp-admin/network/settings.php:238 +msgid "Allow site administrators to add new users to their site via the \"Users → Add New\" page" +msgstr "Sta sitebeheerders toe om nieuwe gebruikers toe te voegen aan hun site via de \"Gebruikers → Nieuwe Toevoegen\" pagina." + +#: wp-admin/network/settings.php:57 +msgid "Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges." +msgstr "Super admins kunnen niet langer worden toegevoegd via het opties scherm. Je gaat nu naar de lijst van bestaande gebruikers op Netwerk admin > Gebruikers en klikt op de gebruikersnaam of de bewerklink onder de naam. Dit gaat naar een bewerk gebruiker pagina waar je een gebruiker super admin rechten kunt geven via een selectievakje." + +#: wp-admin/network/site-users.php:269 +msgid "Enter the username and email." +msgstr "Voer de gebruikersnaam en e-mailadres in." + +#: wp-admin/network/site-users.php:266 +msgid "User created." +msgstr "Gebruiker aangemaakt." + +#: wp-admin/network/site-users.php:263 +msgid "Select a user to remove." +msgstr "Een gebruiker selecteren om te verwijderen." + +#: wp-admin/network/site-users.php:257 +msgid "Select a user to change role." +msgstr "Een gebruiker selecteren om de rol te wijzigen." + +#: wp-admin/network/site-users.php:251 +msgid "Enter the username of an existing user." +msgstr "Voer de gebruikersnaam van een bestaande gebruiker in." + +#: wp-admin/network/site-users.php:245 +msgid "User is already a member of this site." +msgstr "Gebruiker is al lid van deze site." + +#: wp-admin/network/site-settings.php:78 +msgid "Site options updated." +msgstr "Site-opties bijgewerkt." + +#: wp-admin/network/site-new.php:177 wp-admin/network/site-new.php:187 +msgid "Add New Site" +msgstr "Nieuwe site toevoegen" + +#. translators: 1: Dashboard URL, 2: Network admin edit URL. +#: wp-admin/network/site-new.php:170 +msgid "Site added. Visit Dashboard or Edit Site" +msgstr "Site toegevoegd. Bezoek het Dashboard of bewerk de site " + +#: wp-admin/network/site-new.php:25 +msgid "This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings." +msgstr "Dit scherm is voor Super Admins om nieuwe sites toe te voegen aan het netwerk. Dit wordt niet beïnvloed door registratie instellingen." + +#: wp-admin/network/site-info.php:121 +msgid "Site info updated." +msgstr "Site-informatie bijgewerkt." + +#: wp-admin/network/themes.php:416 +msgid "You cannot delete a theme while it is active on the main site." +msgstr "Het is niet mogelijk een thema te verwijderen welke actief is op de hoofdsite." + +#: wp-admin/network/themes.php:301 +msgid "Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes." +msgstr "Thema's kunnen worden geactiveerd per site door de netwerkbeheerder op de pagina Site-scherm (welke een tabblad Thema's heeft). Je komt daar via het de link Bewerken op het overzicht van alle sites. Alleen netwerkbeheerders kunnen them''s installeren of bewerken." + +#: wp-admin/network/themes.php:182 +msgid "No, return me to the theme list" +msgstr "Nee, breng mij terug naar de themalijst" + +#: wp-admin/network/themes.php:173 +msgid "Yes, delete this theme" +msgstr "Ja, dit thema verwijderen" + +#: wp-admin/network/themes.php:159 +msgid "Are you sure you want to delete these themes?" +msgstr "Weet je zeker dat je deze thema's wilt verwijderen?" + +#: wp-admin/network/themes.php:138 +msgid "You are about to remove the following theme:" +msgstr "Je staat op het punt om het volgende thema te verwijderen:" + +#: wp-admin/network/themes.php:137 +msgid "This theme may be active on other sites in the network." +msgstr "Dit thema kan actief zijn op andere sites in het netwerk." + +#: wp-admin/network/themes.php:136 +msgid "Delete Theme" +msgstr "Thema verwijderen" + +#: wp-admin/network/site-themes.php:212 +msgid "Network enabled themes are not shown on this screen." +msgstr "Netwerk ingeschakeld thema's worden niet weergegeven op dit scherm." + +#: wp-admin/network/themes.php:414 wp-admin/network/site-themes.php:208 +msgid "No theme selected." +msgstr "Geen thema geselecteerd." + +#: wp-admin/network/themes.php:380 wp-admin/network/site-themes.php:201 +msgid "Theme disabled." +msgstr "Thema deactiveren." + +#: wp-admin/network/themes.php:371 wp-admin/network/site-themes.php:192 +msgid "Theme enabled." +msgstr "Thema activeren." + +#. translators: %s: Site title. +#: wp-admin/network/site-info.php:126 wp-admin/network/site-users.php:204 +#: wp-admin/network/site-themes.php:170 wp-admin/network/site-settings.php:83 +msgid "Edit Site: %s" +msgstr "Site wijzigen:%s" + +#: wp-admin/network/site-info.php:23 wp-admin/network/site-users.php:41 +#: wp-admin/network/site-themes.php:46 wp-admin/network/site-settings.php:23 +msgid "Invalid site ID." +msgstr "Ongeldige site-ID." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:167 +msgid "Sorry, you are not allowed to delete the site %s." +msgstr "Je hebt geen toestemming om de site %s te verwijderen." + +#: wp-admin/network/sites.php:39 +msgid "Clicking on bold headings can re-sort this table." +msgstr "Klikken op de koppen kan deze tabel hersorteren." + +#: wp-admin/network/sites.php:36 +msgid "Delete which is a permanent action after the confirmation screens." +msgstr "Verwijderen, wat een permanente actie is na de bevestiging vensters." + +#: wp-admin/network/sites.php:34 +msgid "Dashboard leads to the Dashboard for that site." +msgstr "Dashboard leidt naar het Dashboard van de betreffende site." + +#: wp-admin/network/sites.php:33 +msgid "An Edit link to a separate Edit Site screen." +msgstr "De Bewerken link verwijst naar een apart site wijzigenscherm." + +#: wp-admin/network/sites.php:30 +msgid "Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page." +msgstr "Nieuwe Toevoegen brengt je naar de Nieuwe Site toevoegen scherm. Je kunt zoeken naar een site op naam, ID-nummer, of IP-adres. Via Schermopties kun je kiezen hoeveel sites je wilt tonen op een pagina." + +#: wp-admin/network/user-new.php:148 wp-admin/network/site-users.php:323 +msgid "Add User" +msgstr "Gebruiker toevoegen" + +#: wp-admin/network/user-new.php:55 +msgid "Cannot add user." +msgstr "Toevoegen gebruiker niet mogelijk." + +#: wp-admin/network/user-new.php:22 +msgid "Add User will set up a new user account on the network and send that person an email with username and password." +msgstr "Gebruiker toevoegen zal een nieuw gebruikersaccount aan het netwerk toevoegen en deze persoon een e-mail zenden met gebruikersnaam en wachtwoord." + +#: wp-admin/network/menu.php:41 +msgid "Updates" +msgstr "Updates" + +#: wp-admin/network/settings.php:20 wp-admin/network/menu.php:111 +msgid "Network Settings" +msgstr "Netwerkinstellingen" + +#: wp-admin/network/menu.php:80 +msgid "Installed Themes" +msgstr "Geïnstalleerde thema's" + +#. translators: %s: Number of available theme updates. +#: wp-admin/network/menu.php:63 +msgid "Themes %s" +msgstr "Thema's %s" + +#: wp-admin/network/menu.php:52 +msgid "All Sites" +msgstr "Alle sites" + +#: wp-admin/includes/network.php:680 +msgid "Once you complete these steps, your network is enabled and configured. You will have to log in again." +msgstr "Wanneer je deze stappen hebt afgerond is je netwerk geactiveerd. Je zult hierna opnieuw in moeten loggen." + +#: wp-admin/includes/network.php:545 +msgid "To make your installation more secure, you should also add:" +msgstr "Voeg ook dit toe, om je installatie nog veiliger te maken:" + +#: wp-admin/includes/network.php:440 +msgid "Complete the following steps to enable the features for creating a network of sites." +msgstr "De volgende stappen afronden om de nieuwe eigenschappen te activeren om een netwerk met sites te creëren." + +#: wp-admin/includes/network.php:439 +msgid "Enabling the Network" +msgstr "Netwerk activeren" + +#: wp-admin/includes/network.php:428 +msgid "Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables." +msgstr "Graag de configuratiestappen afronden. Om een nieuw netwerk aan te maken moet je de netwerkdatabasetabellen leegmaken of verwijderen." + +#: wp-admin/includes/network.php:427 +msgid "An existing WordPress network was detected." +msgstr "Een bestaande WordPress netwerk was gevonden." + +#: wp-admin/includes/network.php:422 +msgid "The original configuration steps are shown here for reference." +msgstr "De originele configuratiestappen worden hier getoond ter referentie." + +#: wp-admin/includes/network.php:369 +msgid "Your email address." +msgstr "Je e-mailadres." + +#: wp-admin/includes/network.php:360 +msgid "What would you like to call your network?" +msgstr "Hoe zou je je netwerk willen noemen?" + +#: wp-admin/includes/network.php:356 wp-admin/network/settings.php:153 +msgid "Network Title" +msgstr "Netwerktitel" + +#: wp-admin/includes/network.php:335 +msgid "Because your installation is not new, the sites in your WordPress network must use sub-domains." +msgstr "Aangezien je werkt met een bestaande installatie moeten de sites in je WordPress netwerk gebruik maken van subdomeinen." + +#: wp-admin/includes/network.php:322 +msgid "Because your installation is in a directory, the sites in your WordPress network must use sub-directories." +msgstr "Aangezien je installatie in een submap zit moeten de sites in je WordPress netwerk submappen gebruiken." + +#: wp-admin/includes/network.php:312 wp-admin/includes/network.php:325 +#: wp-admin/includes/network.php:336 +msgid "The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links." +msgstr "De hoofdsite als een submap-installatie zorgt ervoor dat de permalinkstructuur gewijzigd moet worden wat mogelijk bestaande links corrupt maakt." + +#: wp-admin/includes/network.php:297 +msgid "Network Details" +msgstr "Netwerkdetails" + +#: wp-admin/includes/network.php:269 wp-admin/includes/network.php:283 +#: wp-admin/includes/network.php:343 +msgid "Server Address" +msgstr "Serveradres" + +#. translators: 1: Host name. +#: wp-admin/includes/network.php:251 +msgctxt "subdirectory examples" +msgid "like %1$s/site1 and %1$s/site2" +msgstr "zoals %1$s/site1 en %1$s/site2" + +#: wp-admin/includes/network.php:246 +msgid "Sub-directories" +msgstr "Subfolders" + +#. translators: 1: Host name. +#: wp-admin/includes/network.php:239 +msgctxt "subdomain examples" +msgid "like site1.%1$s and site2.%1$s" +msgstr "zoals site1.%1$s en site2.%1$s" + +#: wp-admin/includes/network.php:234 +msgid "Sub-domains" +msgstr "Subdomeinen" + +#: wp-admin/includes/network.php:230 +msgid "You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality." +msgstr "Je hebt een wildcard DNS-record nodig als je gebruik wilt maken van de virtual host (subdomein) functionaliteit." + +#: wp-admin/includes/network.php:227 +msgid "Addresses of Sites in your Network" +msgstr "Adressen van de sites in je netwerk" + +#: wp-admin/includes/network.php:195 +msgid "Note:" +msgstr "Opmerking:" + +#: wp-admin/includes/network.php:182 +msgid "Fill in the information below and you’ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step." +msgstr "Vul onderstaande informatie in en je bent op weg om een netwerk te creëren met WordPress sites. Wij zullen de configuratiebestanden aanmaken in de volgende stap." + +#: wp-admin/includes/network.php:181 +msgid "Welcome to the Network installation process!" +msgstr "Welkom bij de netwerkinstallatie." + +#: wp-admin/includes/network.php:160 +msgid "Error: The network could not be created." +msgstr "Fout: Het netwerk kon niet gemaakt worden." + +#: wp-admin/includes/network.php:142 +msgid "You cannot install a network of sites with your server address." +msgstr "Je kunt geen netwerk installeren met je server adres." + +#: wp-admin/includes/network.php:133 +msgid "Once the network is created, you may reactivate your plugins." +msgstr "Wanneer het netwerk gemaakt is mag je je plugins weer opnieuw activeren." + +#. translators: %s: URL to Plugins screen. +#: wp-admin/includes/network.php:130 +msgid "Please deactivate your plugins before enabling the Network feature." +msgstr "Graag de plugins deactiveren voordat je het Netwerk gaat inschakelen." + +#: wp-admin/network.php:72 +msgid "Network" +msgstr "Netwerk" + +#: wp-admin/network.php:64 +msgid "The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed in a future version." +msgstr "De keuze van submap-sites is uitgeschakeld als deze setup meer dan een maand oud is, vanwege permalink-problemen met “/blog/” van de hoofdsite. Dit uitschakelen zal in een toekomstige versie aangepast worden." + +#: wp-admin/network.php:63 +msgid "Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar." +msgstr "Als je deze code eenmaal toegevoegd hebt en je browser vernieuwt, zal de multisite ingeschakeld zijn. Dit scherm, nu in het Netwerk navigatiemenu, zal een archief bewaren van de toegevoegde code. Je kunt wisselen tussen Netwerkbeheerder en sitebeheerder door te klikken op het Hallo (gebruikersnaam) dropdown-menu in de rechter bovenkant van het dashboard." + +#: wp-admin/network.php:61 +msgid "The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files." +msgstr "Het volgende scherm voor Netwerk Setup geeft je individueel gegenereerde regels code die je moet toe voegen aan je wp-config.php en .htaccess-bestanden. Zorg ervoor dat de instellingen van je FTP-client zo zijn dat bestanden die met een punt beginnen zichtbaar zijn zodat je het .htaccess bestand kunt vinden. Mogelijk moet je dit bestand maken als het er echt niet is. Maak van beide bestanden uiteraard eerst een kopie. " + +#: wp-admin/network.php:60 +msgid "Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories)." +msgstr "Kies subdomeinen of submappen; dit kan alleen achteraf gewisseld worden door je installatie te herconfigureren. Vul de netwerkdetails in, en klik op installeren. Als het niet werkt, kun je een wildcard DNS-record (voor subdomeinen) toevoegen, of wijzigen met een andere instelling in Permalinks (voor submappen)." + +#: wp-admin/network.php:59 +msgid "This screen allows you to configure a network as having subdomains (site1.example.com) or subdirectories (example.com/site1). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it." +msgstr "Dit scherm laat je een netwerk instellen met subdomeinen (site1.example.com) of subdirectories (example.com/site1). Subdomeinen vereisen dat wildcard subdomeinen zijn ingeschakeld in Apache en DNS-records, als je host dit toestaat." + +#: wp-admin/network.php:55 +msgid "Create a Network of WordPress Sites" +msgstr "Maak een netwerk van WordPress sites" + +#: wp-admin/network.php:29 +msgid "The Network creation panel is not for WordPress MU networks." +msgstr "Het netwerk aanmaakpaneel is niet voor WordPress MU netwerken." + +#. translators: %s: User login. +#: wp-admin/network/users.php:77 +msgid "Warning! User cannot be modified. The user %s is a network administrator." +msgstr "Let op. Gebruiker kan niet worden aangepast. De gebruikers %s is een netwerk admin." + +#: wp-admin/network/site-new.php:26 +msgid "If the admin email for the new site does not exist in the database, a new user will also be created." +msgstr "Als de beheerder e-mail voor de nieuwe site niet bestaat in de database zal er een nieuwe gebruiker worden gemaakt. " + +#: wp-admin/network/sites.php:38 +msgid "The site ID is used internally, and is not shown on the front end of the site or to users/viewers." +msgstr "Het site-ID wordt intern gebruikt en wordt niet getoond aan de voorkant van de site of aan gebruikers/bezoekers." + +#: wp-admin/network/sites.php:35 +msgid "Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later." +msgstr "Deactiveren, Archief en Spam welke naar de bevestiging schermen leiden. Deze acties kunnen later ongedaan gemaakt worden." + +#: wp-admin/network/sites.php:32 +msgid "Hovering over each site reveals seven options (three for the primary site):" +msgstr "Als je met de muis over je site heen gaat worden zeven opties (drie voor de primaire site) getoond:" + +#: wp-admin/network/settings.php:51 +msgid "Operational settings has fields for the network’s name and admin email." +msgstr "Operationele instellingen bevatten velden voor de netwerk naam en beheerder e-mail." + +#: wp-admin/network/users.php:223 +msgid "The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses." +msgstr "De bulkactie zal de geselecteerde gebruikers permanent verwijderen, of de geselecteerde markeren/demarkeren als spam. De berichten van de spam-gebruikers zullen verwijderd worden. Spam-gebruikers kunnen zich niet opnieuw registreren met hetzelfde e-mailadres." + +#: wp-admin/network/users.php:221 +msgid "You can also go to the user’s profile page by clicking on the individual username." +msgstr "Je kunt ook naar de gebruikers profiel pagina door op de individuele gebruikersnaam te klikken." + +#: wp-admin/network/settings.php:54 +msgid "Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only)." +msgstr "Uploadinstellingen bepalen de grootte van de geuploade bestanden en de overgebleven uploadruimte die nog beschikbaar is voor elke site. De standaard ruimte voor specifieke sites kan gewijzigd worden door de Super Admin. De toegestane bestandstypen staan in een overzicht (door spaties gescheiden)." + +#: wp-admin/network/sites.php:37 +msgid "Visit to go to the front-end site live." +msgstr "Ga naar de frontend van de live site." + +#: wp-admin/network/users.php:224 +msgid "You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege." +msgstr "Je kunt een bestaande gebruiker wijzigen naar Super Admin door naar de Bewerk Gebruiker profielpagina te gaan en deze keuze toe te wijzen." + +#: wp-admin/network/user-new.php:23 +msgid "Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them." +msgstr "Gebruikers die zijn geregistreerd op het netwerk zonder een eigen site, worden toegevoegd als inschrijvers op de hoofdsite, ze krijgen toegang in het Dashboard op hun eigen profiel pagina om hun account te beheren. Deze gebruikers zullen het Dashboard en Mijn sites alleen kunnen zien in de hoofdnavigatie, tot zijzelf een eigen site zullen bezitten." + +#: wp-admin/network/users.php:222 +msgid "You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list." +msgstr "Je kunt het overzicht sorteren door te klikken op één van de vetgedrukte teksten en wisselen tussen lijst en samenvattingen met gebruik van de icoontjes in de rechter bovenhoek." + +#: wp-admin/network/users.php:219 +msgid "This table shows all users across the network and the sites to which they are assigned." +msgstr "Deze tabel toont alle gebruikers in het netwerk en de sites waar ze bij horen." + +#: wp-admin/network/upgrade.php:25 +msgid "If this process fails for any reason, users logging in to their sites will force the same update." +msgstr "Indien dit proces mislukt om wat voor reden dan ook, zullen gebruikers die op hun site inloggen dezelfde update forceren." + +#: wp-admin/network/upgrade.php:24 +msgid "If a version update to core has not happened, clicking this button won’t affect anything." +msgstr "Als er geen versie update aan de core is gedaan, zal klikken op deze knop geen enkele invloed hebben." + +#: wp-admin/network/themes.php:300 +msgid "If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen." +msgstr "Als de Super Admin een thema uitschakelt wat in gebruik is, kan dat thema nog steeds gebruikt worden door de site-eigenaars die deze site in gebruik hebben. Kiest een site-eigenaar echter een ander thema, dan zal het uitgeschakelde thema niet meer verschijnen in het Weergave > Thema scherm." + +#: wp-admin/network/themes.php:299 +msgid "This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using." +msgstr "Dit scherm laat je kiezen welke thema's beschikbaar zijn in het Weergave menu voor elke site. Het thema dat momenteel gebruikt wordt door een site, wordt hierdoor niet geactiveerd of gedeactiveerd. " + +#: wp-admin/network/sites.php:31 +msgid "This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table." +msgstr "Dit is het hoofdoverzicht van alle sites op dit netwerk. Wissel tussen lijst en samenvattingen met gebruik van de icoontjes aan de rechter bovenkant van het overzicht." + +#: wp-admin/network/settings.php:56 +msgid "Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins." +msgstr "In- of uitschakelen van de plugin menu's voor niet super admins, zodat alleen super admins -geen site admins- toegang hebben om plugins te activeren." + +#: wp-admin/network/settings.php:53 +msgid "New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what᾿s put in the first post, page, comment, comment author, and comment URL." +msgstr "Nieuwe site-instellingen worden standaard toegepast als een nieuwe site in het netwerk wordt gemaakt. Deze bevatten een welkomst e-mail wanneer een nieuwe gebruiker of gebruikersaccount is geregistreerd. Het bevat ook berichten voor de inhoud van de site voor het eerste bericht, pagina, reactie, reactie-auteur en reactie URL (internet adres)." + +#: wp-admin/network/settings.php:52 +msgid "Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network." +msgstr "Registratie instellingen kunnen ingeschakeld/uitgeschakeld worden voor publieke registraties. Als je anderen laat registreren voor een site, installeer dan anti spam plugins. Namen en sites die je wilt verbannen op dit netwerk, scheiden met spaties, gebruik GEEN komma's." + +#: wp-admin/network/settings.php:50 +msgid "This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site’s options." +msgstr "Dit scherm is voor de instellingen en wijzigingen voor het netwerk als geheel. De eerste site is de hoofdsite in het netwerk. De netwerk instellingen worden van de originele site instellingen gehaald." + +#. translators: %s: Reserved names list. +#: wp-admin/network/site-new.php:59 +msgid "The following words are reserved for use by WordPress functions and cannot be used as blog names: %s" +msgstr "De volgende woorden zijn gereserveerd voor gebruik van de WordPress functies en kunnen niet gebruikt worden als sitenamen: %s" + +#: wp-admin/network/upgrade.php:124 +msgid "If your browser doesn’t start loading the next page automatically, click this link:" +msgstr "Als je browser de volgende pagina niet automatisch start, klik op deze link:" + +#: wp-admin/network/settings.php:284 +msgid "If you want to ban domains from site registrations. One domain per line." +msgstr "Als je domeinen wilt verbieden van site registraties. Een domein per regel." + +#: wp-admin/network/settings.php:266 +msgid "If you want to limit site registrations to certain domains. One domain per line." +msgstr "Als je de site registraties wilt beperken tot bepaalde domeinen. Een domein per regel." + +#: wp-admin/network/site-new.php:40 +msgid "Can’t create an empty site." +msgstr "Aanmaken van een lege site niet mogelijk." + +#: wp-admin/network/users.php:256 +msgid "Users removed from spam." +msgstr "Gebruikers verwijderd uit spam." + +#: wp-admin/network/sites.php:338 +msgid "Site marked as spam." +msgstr "Site gemarkeerd als spam." + +#: wp-admin/network/sites.php:335 +msgid "Site removed from spam." +msgstr "Site verwijderd uit spam." + +#: wp-admin/network/sites.php:311 +msgid "Sites marked as spam." +msgstr "Sites gemarkeerd als spam." + +#: wp-admin/network/sites.php:308 +msgid "Sites removed from spam." +msgstr "Sites verwijderd uit spam." + +#: wp-admin/network/users.php:259 +msgid "Users deleted." +msgstr "Gebruikers verwijderd." + +#: wp-admin/network/users.php:253 +msgid "Users marked as spam." +msgstr "Gebruikers gemarkeerd als spam." + +#: wp-admin/network/sites.php:332 +msgid "Site deactivated." +msgstr "Site gedeactiveerd." + +#: wp-admin/network/sites.php:329 +msgid "Site activated." +msgstr "Site geactiveerd." + +#: wp-admin/network/sites.php:326 +msgid "Site unarchived." +msgstr "Site herstellen uit het archief." + +#: wp-admin/network/sites.php:323 +msgid "Site archived." +msgstr "Site gearchiveerd." + +#: wp-admin/network/sites.php:317 +msgid "Site deleted." +msgstr "Site verwijderd." + +#: wp-admin/network/sites.php:314 +msgid "Sites deleted." +msgstr "Sites verwijderd." + +#: wp-admin/network/sites.php:105 wp-admin/network/sites.php:223 +msgid "Sorry, you are not allowed to change the current site." +msgstr "Je hebt geen toestemming om de huidige site te veranderen." + +#: wp-admin/network/site-new.php:126 +msgid "There was an error creating the user." +msgstr "Er is een fout opgetreden bij het aanmaken van de gebruiker." + +#: wp-admin/network/settings.php:392 +msgid "Upload file types" +msgstr "Upload bestandstypen" + +#. translators: %s: Number of megabytes to limit uploads to. +#: wp-admin/network/settings.php:380 +msgid "Limit total size of files uploaded to %s MB" +msgstr "Maximale opslagruimte voor uploads is %s MB" + +#: wp-admin/network/settings.php:366 +msgid "The URL for the first comment on a new site." +msgstr "De URL voor de eerste reactie op een nieuwe site." + +#: wp-admin/network/settings.php:348 +msgid "The author of the first comment on a new site." +msgstr "De auteur van de eerste reactie op een nieuwe site." + +#: wp-admin/network/settings.php:339 +msgid "The first comment on a new site." +msgstr "De eerste reactie op een nieuwe site." + +#: wp-admin/network/settings.php:329 +msgid "The first page on a new site." +msgstr "De eerste pagina op een nieuwe site." + +#: wp-admin/network/settings.php:319 +msgid "The first post on a new site." +msgstr "Het eerste bericht op een nieuwe site." + +#: wp-admin/network/upgrade.php:73 +msgid "All done!" +msgstr "Klaar." + +#: wp-admin/network/settings.php:206 +msgid "Both sites and user accounts can be registered" +msgstr "Zowel sites als gebruikersaccounts kunnen worden geregistreerd" + +#: wp-admin/network/settings.php:205 +msgid "Logged in users may register new sites" +msgstr "Ingelogde gebruikers mogen nieuwe sites registreren" + +#: wp-admin/network/settings.php:204 +msgid "User accounts may be registered" +msgstr "Gebruikersaccounts kunnen worden geregistreerd" + +#: wp-admin/network/settings.php:203 +msgid "Registration is disabled" +msgstr "Registreren is gedeactiveerd" + +#: wp-admin/network/settings.php:476 +msgid "Enable administration menus" +msgstr "Administratiemenu's activeren" + +#: wp-admin/network/settings.php:371 +msgid "Upload Settings" +msgstr "Upload instellingen" + +#: wp-admin/network/settings.php:290 +msgid "New Site Settings" +msgstr "Nieuwe site-instellingen" + +#: wp-admin/network/settings.php:190 +msgid "Registration Settings" +msgstr "Registratie instellingen" + +#: wp-admin/network/settings.php:150 +msgid "Operational Settings" +msgstr "Operationele instellingen" + +#: wp-admin/network/site-new.php:91 +msgid "Missing email address." +msgstr "E-mailadres ontbreekt." + +#: wp-admin/network/site-new.php:87 +msgid "Missing or invalid site address." +msgstr "Ontbrekend of ongeldig site-adres." + +#: wp-admin/network/upgrade.php:124 +msgid "Next Sites" +msgstr "Volgende sites" + +#: wp-admin/network/settings.php:374 +msgid "Site upload space" +msgstr "Site uploadruimte" + +#: wp-admin/network/settings.php:299 +msgid "The welcome email sent to new site owners." +msgstr "De welkomst e-mail is verstuurd naar de nieuwe site eigenaren." + +#: wp-admin/network/settings.php:247 +msgid "Users are not allowed to register these sites. Separate names by spaces." +msgstr "Gebruikers zijn niet toegestaan deze sites te registeren. Namen scheiden door spaties." + +#: wp-admin/network/settings.php:231 +msgid "Send the network admin an email notification every time someone registers a site or user account" +msgstr "Stuur de netwerkbeheerder een e-mailmelding elke keer dat iemand een site of een gebruikersaccount registreert." + +#: wp-admin/includes/network.php:365 wp-admin/network/settings.php:160 +msgid "Network Admin Email" +msgstr "E-mailadres netwerkbeheerder" + +#: wp-admin/network/site-new.php:263 +msgid "A new user will be created if the above email address is not in the database." +msgstr "Een nieuwe gebruiker wordt aangemaakt als bovenstaande e-mailadres niet voorkomt in de database." + +#: wp-admin/network/site-new.php:259 +msgid "Admin Email" +msgstr "Beheerder e-mailadres" + +#: wp-admin/network/site-new.php:275 +msgid "Add Site" +msgstr "Site toevoegen" + +#: wp-admin/network/settings.php:426 +msgid "Default Language" +msgstr "Standaard taalinstellingen" + +#: wp-admin/network/settings.php:402 +msgid "Max upload file size" +msgstr "Maximale upload bestandsgrootte" + +#: wp-admin/network/settings.php:362 +msgid "First Comment URL" +msgstr "URL van eerste reactie" + +#: wp-admin/network/settings.php:344 +msgid "First Comment Author" +msgstr "Eerste reactie van de auteur" + +#: wp-admin/network/settings.php:334 +msgid "First Comment" +msgstr "Eerste reactie" + +#: wp-admin/network/settings.php:324 +msgid "First Page" +msgstr "Eerste pagina" + +#: wp-admin/network/settings.php:309 +msgid "The welcome email sent to new users." +msgstr "De welkomst e-mail is verstuurd naar de nieuwe gebruikers." + +#: wp-admin/network/settings.php:304 +msgid "Welcome User Email" +msgstr "Welkom gebruiker e-mail" + +#: wp-admin/network/settings.php:294 +msgid "Welcome Email" +msgstr "Welkomst e-mail" + +#: wp-admin/network/settings.php:272 +msgid "Banned Email Domains" +msgstr "Verboden e-mail domeinnamen" + +#: wp-admin/network/settings.php:253 +msgid "Limited Email Registrations" +msgstr "Beperkte e-mailregistraties" + +#: wp-admin/network/settings.php:243 +msgid "Banned Names" +msgstr "Verboden namen" + +#: wp-admin/network/settings.php:236 +msgid "Add New Users" +msgstr "Nieuwe gebruikers toevoegen" + +#: wp-admin/network/settings.php:224 +msgid "Registration notification" +msgstr "Registratiemelding" + +#: wp-admin/network/settings.php:193 +msgid "Allow new registrations" +msgstr "Nieuwe registraties toestaan" + +#: wp-admin/network/site-users.php:272 +msgid "Duplicated username or email address." +msgstr "De gebruikersnaam of het e-mailadres is al in gebruik." + +#: wp-admin/network/user-new.php:41 +msgid "Cannot create an empty user." +msgstr "Aanmaken van lege gebruiker niet mogelijk." + +#: wp-admin/network/sites.php:121 wp-admin/network/sites.php:208 +msgid "Confirm" +msgstr "Bevestigen" \ No newline at end of file diff --git a/wp-content/languages/admin-nl_NL.mo b/wp-content/languages/admin-nl_NL.mo new file mode 100644 index 00000000..18cda801 Binary files /dev/null and b/wp-content/languages/admin-nl_NL.mo differ diff --git a/wp-content/languages/admin-nl_NL.po b/wp-content/languages/admin-nl_NL.po new file mode 100644 index 00000000..44ea757d --- /dev/null +++ b/wp-content/languages/admin-nl_NL.po @@ -0,0 +1,15038 @@ +# Translation of WordPress - 5.6.x - Development - Administration in Dutch +# This file is distributed under the same license as the WordPress - 5.6.x - Development - Administration package. +msgid "" +msgstr "" +"PO-Revision-Date: 2021-02-06 07:52:53+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: nl\n" +"Project-Id-Version: WordPress - 5.6.x - Development - Administration\n" + +#. translators: Default start of the week. 0 = Sunday, 1 = Monday. +#: wp-admin/includes/schema.php:409 +msgctxt "start of week" +msgid "1" +msgstr "1" + +#: wp-admin/includes/schema.php:393 +msgctxt "default GMT offset or timezone string" +msgid "0" +msgstr "Europa/Amsterdam" + +#: wp-admin/includes/media.php:1730 wp-admin/upgrade.php:74 +#: wp-admin/upgrade.php:154 +msgid "Continue" +msgstr "Doorgaan" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/dashboard.php:1758 +msgid "Your site is running an outdated version of PHP (%s), which should be updated." +msgstr "Je site draait op een verouderde versie van PHP (%s), welke geüpdatet zou moeten worden." + +#. translators: %s: The server PHP version. +#: wp-admin/includes/dashboard.php:1752 +msgid "Your site is running an insecure version of PHP (%s), which should be updated." +msgstr "Je site draait op een onveilige versie van PHP (%s), welke geüpdatet zou moeten worden." + +#: wp-admin/includes/dashboard.php:42 +msgid "PHP Update Recommended" +msgstr "PHP update aanbevolen" + +#. translators: %s: The minimum recommended PHP version. +#: wp-admin/includes/class-wp-site-health.php:729 +#: wp-admin/includes/dashboard.php:1770 +msgid "PHP is the programming language used to build and maintain WordPress. Newer versions of PHP are created with increased performance in mind, so you may see a positive effect on your site’s performance. The minimum recommended version of PHP is %s." +msgstr "PHP is de programmeertaal waarmee WordPress wordt gebouwd en onderhouden. Nieuwere versies van PHP zijn gemaakt met een verhoogde prestatie in gedachten, dus je zult mogelijk een positief effect op de prestatie van je site zien. De minimum aanbevolen versie van PHP is %s." + +#: wp-admin/user-edit.php:766 wp-admin/authorize-application.php:93 +msgid "Your website appears to use Basic Authentication, which is not currently compatible with Application Passwords." +msgstr "Je site schijnt basis authenticatie te gebruiken, wat op dit moment niet compatibel is met applicatie wachtwoorden." + +#: wp-admin/about.php:260 +msgid "https://wordpress.org/plugins/enable-jquery-migrate-helper/" +msgstr "https://wordpress.org/plugins/enable-jquery-migrate-helper/" + +#: wp-admin/about.php:249 +msgid "https://wordpress.org/plugins/wp-jquery-update-test/" +msgstr "https://wordpress.org/plugins/wp-jquery-update-test/" + +#. translators: 1: WordPress accessibility-ready guidelines link, 2: WCAG +#. information link. +#: wp-admin/about.php:156 +msgid "What’s more, this default theme puts accessibility at the heart of your website. It conforms to the WordPress accessibility-ready guidelines and addresses several more specialized standards from the Web Content Accessibility Guidelines (WCAG) 2.1 at level AAA. It will help you meet the highest level of international accessibility standards when you create accessible content and choose plugins which are accessible too!" +msgstr "Aanvullend, dit standaardthema zet de toegankelijkheid in het hart van je site. Het voldoet aan de WordPress accessibility-ready richtlijnen en behandeld verschillende meer gespecialiseerde normen van de Web Content Accessibility Guidelines (WCAG) 2.1 at level AAA. Het helpt je te voldoen aan het hoogste niveau van internationale toegankelijkheidsnormen wanneer je toegankelijke inhoud maakt en plugins kiest die ook toegankelijk zijn!" + +#: wp-admin/about.php:124 +msgid "To help you add subtitles or captions to your videos, you can now upload them within your post or page. This makes it easier than ever to make your videos accessible for anyone who needs or prefers to use subtitles." +msgstr "Om je te helpen ondertiteling of bijschriften toe te voegen aan je video's, kan je ze nu uploaden in je bericht of pagina. Dit maakt het makkelijker dan ooit om video's toegankelijk te maken voor iedereen die ondertiteling nodig heeft of hiervoor de voorkeur voor heeft." + +#: wp-admin/about.php:123 +msgid "Upload video captions directly in the block editor" +msgstr "Upload videobijschriften direct in de blokeditor" + +#: wp-admin/includes/class-wp-site-health.php:2128 +msgid "https://developer.wordpress.org/rest-api/frequently-asked-questions/#why-is-authentication-not-working" +msgstr "https://developer.wordpress.org/rest-api/frequently-asked-questions/#why-is-authentication-not-working" + +#. translators: %s: WordPress 5.6 Field Guide link. +#: wp-admin/about.php:276 +msgid "Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change you may want to be aware of. WordPress 5.6 Field Guide." +msgstr "Bekijk de nieuwste versie van de WordPress Field Guide. Het heeft opmerkingen van ontwikkelaars voor elke wijziging waarvan je op de hoogte wil zijn: WordPress 5.6 Field Guide." + +#. translators: %s: jQuery Migrate plugin link. +#: wp-admin/about.php:257 +msgid "If you find issues with the way your site looks (e.g. a slider doesn’t work, a button is stuck — that sort of thing), install the jQuery Migrate plugin." +msgstr "Als je problemen hebt met de manier waarop je site er uitziet (bijv. een slider werkt niet, een knop zit vast - dat soort dingen), installeer dan de jQuery Migrate plugin." + +#. translators: %s: jQuery update test plugin link. +#: wp-admin/about.php:246 +msgid "Updates to jQuery in WordPress take place across three releases: 5.5, 5.6, and 5.7. As we reach the mid-point of this process, run the update test plugin to check your sites for errors ahead of time." +msgstr "Updates voor jQuery in WordPress vinden plaats in drie releases:5.5, 5.6 en 5.7. Als we het midden van dit proces hebben bereikt, voer je de update test plugin uit om je sites van tevoren op fouten te controleren." + +#: wp-admin/about.php:241 +msgid "jQuery" +msgstr "jQuery" + +#. translators: %s: WordPress and PHP 8 dev note link. +#: wp-admin/about.php:232 +msgid "5.6 marks the first steps toward WordPress Core support for PHP 8. Now is a great time to start planning how your WordPress products, services and sites can support the latest PHP version. For more information about what to expect next, read the PHP 8 developer note." +msgstr "5.6 markeert de eerste stappen in de richting van WordPress Core ondersteuning voor PHP 8. Dit is een goed moment om te plannen hoe je WordPress producten, diensten en sites de nieuwste PHP-versie kunnen ondersteunen. Voor meer informatie over wat je kan verwachten, lees de PHP 8 ontwikkelaar notitie." + +#: wp-admin/about.php:227 +msgid "More PHP 8 support" +msgstr "Meer ondersteuning voor PHP 8" + +#: wp-admin/about.php:224 +msgid "Thanks to the API’s new Application Passwords authorization feature, third-party apps can connect to your site seamlessly and securely. This new REST API feature lets you see what apps are connecting to your site and control what they do." +msgstr "Dankzij de nieuwe autorisatiefunctie voor Application Passwords van de API kunnen apps van derden naadloos en veilig verbinding maken met je site. Met deze nieuwe REST API functie kan je zien welke apps verbinding maken met je site en bepalen wat ze doen." + +#: wp-admin/about.php:223 +msgid "REST API authentication with Application Passwords" +msgstr "REST API authenticatie met applicatie wachtwoorden" + +#: wp-admin/about.php:214 +msgid "If you’ve not had the chance to play with block patterns yet, all default themes now feature a range of block patterns that let you master complex layouts with minimal effort. Customize the patterns to your liking with the copy, images and colors that fit your story or brand." +msgstr "Als je nog niet de kans hebt gehad om met blokpatronen te spelen, hebben alle standaardthema's nu een reeks blokpatronen waarmee je complexe lay-outs met minimale inspanning onder de knie kunt krijgen. Pas de patronen naar wens aan met de tekst, afbeeldingen en kleuren die bij je verhaal of merk passen." + +#: wp-admin/about.php:213 +msgid "Built-in patterns" +msgstr "Ingebouwde patronen" + +#. translators: %s: Accessibility statement feature plugin link. +#: wp-admin/about.php:206 +msgid "Even if you’re not an expert, you can start letting folks know about your site’s commitment to accessibility at the click of a button! The new feature plugin includes template copy for you to update and publish, and it’s written to support different contexts and jurisdictions." +msgstr "Zelfs als je geen expert bent, kun je mensen met een klik op de knop laten weten dat je site zich inzet voor toegankelijkheid! De nieuwe functie plugin bevat een template kopie die je kan updaten en publiceren, en het is geschreven om verschillende contexten en rechtsgebieden te ondersteunen." + +#: wp-admin/about.php:201 +msgid "Accessibility statement template" +msgstr "Template voor toegankelijkheidsverklaring" + +#: wp-admin/about.php:198 +msgid "For years, only developers have been able to update WordPress automatically. But now, you have that option, right in your dashboard. If this is your first site, you have auto-updates ready to go, right now! Upgrading an existing site? No problem! Everything is the same as it was before." +msgstr "Jarenlang konden alleen ontwikkelaars WordPress automatisch updaten. Maar nu heb je die optie, rechtstreeks in je dashboard. Als dit je eerste site is, heb je nu auto-updates klaar voor gebruik! Een bestaande site upgraden? Geen probleem! Alles is hetzelfde als voorheen." + +#: wp-admin/about.php:197 +msgid "Expanding auto-updates" +msgstr "Auto-updates uitgebreid" + +#: wp-admin/about.php:176 +msgid "Need more flexibility than that? You can also choose your own color palette from the color picker." +msgstr "Meer flexibiliteit nodig dan dat? Je kunt ook je eigen kleurenpalet kiezen uit de kleurenkiezer." + +#: wp-admin/about.php:175 +msgid "Perfect for a new year, Twenty Twenty-One gives you a range of pre-selected color palettes in pastel, all of which meet AAA standards for contrast. You can also choose your own background color for the theme, and the theme chooses accessibility-conscious text colors for you — automatically!" +msgstr "Twenty Twenty-One is perfect voor een nieuw jaar en biedt je een reeks vooraf geselecteerde kleurenpaletten in pastelkleuren, die allemaal voldoen aan de AAA-normen voor contrast. Je kan ook je eigen achtergrondkleur voor het thema kiezen, en het thema kiest automatisch bewust toegankelijke tekstkleuren voor je!" + +#: wp-admin/about.php:172 +msgid "A rainbow of soft pastels" +msgstr "Een regenboog van zachte pastelkleuren" + +#: wp-admin/about.php:135 +msgid "Twenty Twenty-One is a blank canvas for your ideas, and the block editor is the best brush. It is built for the block editor and packed with brand-new block patterns you can only get in the default themes. Try different layouts in a matter of seconds, and let the theme’s eye-catching, yet timeless design make your work shine." +msgstr "Twenty Twenty-One is een leeg canvas voor je ideeën en de blok-editor is het beste penseel. Het is gebouwd voor de blok-editor en zit boordevol gloednieuwe blokpatronen die je alleen in de standaardthema's kunt krijgen. Probeer binnen enkele seconden verschillende lay-outs uit en laat het opvallende, maar tijdloze ontwerp van het thema je werk doen stralen." + +#: wp-admin/about.php:132 +msgid "Twenty Twenty-One is here!" +msgstr "Twenty Twenty-One is er!" + +#: wp-admin/about.php:118 +msgid "In select themes, preconfigured block patterns make setting up standard pages on your site a breeze. Find the power of patterns to streamline your workflow, or share some of that power with your clients and save yourself a few clicks." +msgstr "In geselecteerde thema's maken voor-geconfigureerde blokpatronen het opzetten van standaardpagina's op je site een fluitje van een cent. Ontdek de kracht van patronen om je workflow te stroomlijnen, of deel een deel van die kracht met je klanten en bespaar jezelf een paar klikken." + +#: wp-admin/about.php:117 +msgid "More block patterns" +msgstr "Meer blokpatronen" + +#: wp-admin/about.php:111 +msgid "Bring your stories to life with more tools that let you edit your layout with or without code. Single column blocks, designs using mixed widths and columns, full-width headers, and videos in your cover block—make small changes or big statements with equal ease!" +msgstr "Breng je verhalen tot leven met meer gereedschappen waarmee je je lay-out met of zonder code kunt bewerken. Blokken met één kolom, ontwerpen met verschillende breedtes en kolommen, headers over de volledige breedte en video's in je cover blok—breng met hetzelfde gemak kleine wijzigingen of grote uitspraken aan!" + +#: wp-admin/about.php:110 +msgid "Greater layout flexibility" +msgstr "Meer flexibiliteit in de lay-out" + +#. translators: %s: The current WordPress version number. +#: wp-admin/about.php:67 +msgid "WordPress %s brings you countless ways to set your ideas free and bring them to life. With a brand-new default theme as your canvas, it supports an ever-growing collection of blocks as your brushes. Paint with words. Pictures. Sound. Or rich embedded media." +msgstr "WordPress %s biedt je talloze manieren om je ideeën de vrije loop te laten en ze tot leven te brengen. Met een gloednieuw standaardthema als je canvas, ondersteunt het een steeds groter wordende verzameling blokken als je penselen. Verf met woorden. Afbeeldingen. Geluid. Of rich embedded media." + +#: wp-admin/credits.php:43 wp-admin/privacy.php:40 wp-admin/freedoms.php:46 +#: wp-admin/about.php:41 +msgid "New" +msgstr "Nieuw" + +#: wp-admin/credits.php:40 wp-admin/privacy.php:37 wp-admin/freedoms.php:43 +#: wp-admin/about.php:38 +msgid "Sharing your stories has never been easier" +msgstr "Het delen van je verhalen is nog nooit zo eenvoudig geweest" + +#: wp-admin/update-core.php:381 +msgid "This site appears to be under version control. Automatic updates are disabled." +msgstr "Deze site blijkt in versiebeheer te zijn. Automatische updates zijn uitgeschakeld." + +#: wp-admin/update-core.php:253 +msgid "You are using a development version of WordPress." +msgstr "Je gebruikt een ontwikkelversie van WordPress." + +#: wp-admin/update-core.php:65 +msgid "You can update to the latest nightly build manually:" +msgstr "Je kunt handmatig updaten naar de laatste nightly build:" + +#: wp-admin/update-core.php:401 +msgid "Enable automatic updates for all new versions of WordPress." +msgstr "Schakel automatische updates in voor alle nieuwe versies van WordPress." + +#: wp-admin/update-core.php:390 +msgid "Switch to automatic updates for maintenance and security releases only." +msgstr "Wissel naar automatische updates alleen voor onderhoud- en beveiligingsreleases." + +#. translators: Current version of WordPress. +#: wp-admin/update-core.php:1005 +msgid "Current version: %s" +msgstr "Huidige versie: %s" + +#: wp-admin/update-core.php:983 +msgid "Here you can find information about updates, set auto-updates and see what plugins or themes need updating." +msgstr "Hier kun je informatie vinden over updates, auto-updates instellen en bekijken welke plugins of thema's een update nodig hebben." + +#: wp-admin/update-core.php:405 +msgid "This site will not receive automatic updates for new versions of WordPress." +msgstr "Deze site zal geen automatische updates ontvangen voor nieuwe versies van WordPress." + +#: wp-admin/update-core.php:394 +msgid "This site is automatically kept up to date with maintenance and security releases of WordPress only." +msgstr "Deze site wordt automatisch up-to-date gehouden met onderhouds- en beveiligingsreleases van alleen WordPress." + +#: wp-admin/update-core.php:383 +msgid "This site is automatically kept up to date with each new version of WordPress." +msgstr "Deze site wordt automatisch up to date gehouden met elke nieuwe versie van WordPress." + +#: wp-admin/update-core.php:293 +msgid "WordPress will only receive automatic security and maintenance releases from now on." +msgstr "WordPress zal vanaf nu alleen automatische beveiliging- en onderhoudsreleases ontvangen." + +#: wp-admin/update-core.php:290 +msgid "Automatic updates for all WordPress versions have been enabled. Thank you!" +msgstr "Automatische updates voor alle WordPress versies zijn ingeschakeld. Dankjewel!" + +#: wp-admin/index.php:80 +msgid "Site Health Status — Informs you of any potential issues that should be addressed to improve the performance or security of your website." +msgstr "Status sitediagnose — Informeert je over mogelijke problemen die moeten worden aangepakt om de prestaties of beveiliging van je site te verbeteren." + +#. translators: %s: Application name. +#: wp-admin/user-edit.php:874 wp-admin/authorize-application.php:191 +#: wp-admin/js/auth-app.js:90 +msgid "Your new password for %s is:" +msgstr "Je nieuwe wachtwoord voor %s is:" + +#: wp-admin/user-edit.php:762 +msgid "Add New Application Password" +msgstr "Nieuw applicatie wachtwoord toevoegen" + +#: wp-admin/user-edit.php:748 +msgid "Required to create an Application Password, but not to update the user." +msgstr "Vereist om een applicatie wachtwoord aan te maken, maar niet om de gebruiker te updaten." + +#: wp-admin/about.php:289 +msgid "Go to Updates" +msgstr "Ga naar updates" + +#: wp-admin/user-edit.php:205 +msgid "← Go to Users" +msgstr "← Ga naar gebruikers" + +#: wp-admin/revision.php:110 +msgid "← Go to editor" +msgstr "← Ga naar editor" + +#: wp-admin/includes/class-plugin-installer-skin.php:139 +#: wp-admin/includes/class-plugin-installer-skin.php:145 +msgid "Go to Plugin Installer" +msgstr "Ga naar plugin-installer" + +#: wp-admin/includes/class-plugin-installer-skin.php:133 +msgid "Go to Importers" +msgstr "Ga naar importers" + +#: wp-admin/includes/class-theme-installer-skin.php:158 +msgid "Go to Theme Installer" +msgstr "Ga naar thema installer" + +#: wp-admin/includes/privacy-tools.php:282 +#: wp-admin/includes/class-wp-privacy-policy-content.php:427 +msgid "Go to top" +msgstr "Ga naar boven" + +#. translators: %s is the name of the city we couldn't locate. * Replace the +#. examples with cities in your locale, but test * that they match the expected +#. location before including them. * Use endonyms (native locale names) +#. whenever possible. +#: wp-admin/includes/dashboard.php:1374 +msgid "We couldn’t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland." +msgstr "We konden locatie %s niet vinden. Probeer een andere nabijgelegen stad. Bijvoorbeeld: Kansas City; Springfield; Portland." + +#: wp-admin/options-privacy.php:237 +msgid "Or" +msgstr "Of" + +#: wp-admin/authorize-application.php:302 +msgid "You will be returned to the WordPress Dashboard, and no changes will be made." +msgstr "Je keert terug naar het WordPress Dashboard en er worden geen wijzigingen aangebracht." + +#: wp-admin/authorize-application.php:284 +msgid "No, I do not approve of this connection." +msgstr "Nee, ik keur deze verbinding niet goed." + +#: wp-admin/authorize-application.php:277 +msgid "You will be given a password to manually enter into the application in question." +msgstr "Je krijgt een wachtwoord om de betreffende applicatie handmatig in te voeren." + +#. translators: %s: The URL the user is being redirected to. +#: wp-admin/authorize-application.php:264 +#: wp-admin/authorize-application.php:298 +msgid "You will be sent to %s" +msgstr "Je wordt gestuurd naar %s" + +#: wp-admin/authorize-application.php:250 +msgid "Yes, I approve of this connection." +msgstr "Ja, ik keur deze connectie goed." + +#. translators: 1: URL to my-sites.php, 2: Number of blogs the user has. +#: wp-admin/authorize-application.php:169 +msgid "This will grant access to the %2$s blog in this installation that you have permissions on." +msgid_plural "This will grant access to all %2$s blogs in this installation that you have permissions on." +msgstr[0] "Dit geeft toegang tot de %2$s blog in deze installatie waarvoor je machtigingen hebt." +msgstr[1] "Dit geeft toegang tot alle %2$s blogs in deze installatie waarvoor je machtigingen hebt." + +#: wp-admin/authorize-application.php:156 +msgid "Would you like to give this application access to your account? You should only do this if you trust the app in question." +msgstr "Wil je deze applicatie toegang geven tot je account? Doe dit alleen als je de betreffende app vertrouwt." + +#. translators: %s: Application name. +#: wp-admin/authorize-application.php:150 +msgid "Would you like to give the application identifying itself as %s access to your account? You should only do this if you trust the app in question." +msgstr "Wil je de applicatie die zichzelf identificeert als %s toegang geven tot je account? Doe dit alleen als je de betreffende app vertrouwt." + +#: wp-admin/authorize-application.php:144 +msgid "An application would like to connect to your account." +msgstr "Een applicatie wil verbinding maken met je account." + +#: wp-admin/authorize-application.php:87 wp-admin/authorize-application.php:94 +#: wp-admin/authorize-application.php:112 +msgid "Cannot Authorize Application" +msgstr "Kan applicatie niet autoriseren" + +#: wp-admin/authorize-application.php:86 +msgid "The Authorize Application request is not allowed." +msgstr "De applicatie autorisatie aanvraag is niet toegestaan." + +#: wp-admin/authorize-application.php:65 +msgid "Authorize Application" +msgstr "Applicatie autoriseren" + +#: wp-admin/user-edit.php:881 wp-admin/authorize-application.php:198 +#: wp-admin/js/auth-app.js:98 +msgid "Be sure to save this in a safe location. You will not be able to retrieve it." +msgstr "Zorg ervoor dat dit op een veilige locatie wordt opgeslagen. Je bent niet in staat om het terug te halen." + +#: wp-admin/user-edit.php:747 wp-admin/authorize-application.php:227 +msgid "WordPress App on My Phone" +msgstr "WordPress app op mijn telefoon" + +#: wp-admin/user-edit.php:746 wp-admin/authorize-application.php:226 +msgid "New Application Password Name" +msgstr "Nieuw applicatie wachtwoord naam" + +#. translators: 1: URL to my-sites.php, 2: Number of blogs the user has. +#: wp-admin/user-edit.php:728 +msgid "Application passwords grant access to the %2$s blog in this installation that you have permissions on." +msgid_plural "Application passwords grant access to all %2$s blogs in this installation that you have permissions on." +msgstr[0] "Applicatie wachtwoorden verlenen toegang totde %2$s blog in deze installatie waarvoor je machtigingen hebt." +msgstr[1] "Applicatie wachtwoorden verlenen toegang totalle %2$s blogs in deze installatie waarvoor je machtigingen hebt." + +#: wp-admin/user-edit.php:717 +msgid "Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website." +msgstr "Applicatie wachtwoorden maken authenticatie mogelijk via niet-interactieve systemen, zoals XML-RPC of de REST API, zonder je daadwerkelijke wachtwoord op te geven. Applicatie wachtwoorden kunnen eenvoudig worden ingetrokken. Ze kunnen niet worden gebruikt voor traditionele logins op je site." + +#: wp-admin/user-edit.php:716 +msgid "Application Passwords" +msgstr "Applicatie wachtwoorden" + +#: wp-admin/user-edit.php:659 +msgid "Type the new password again." +msgstr "Typ het nieuwe wachtwoord opnieuw." + +#: wp-admin/user-edit.php:635 +msgid "Set New Password" +msgstr "Nieuw wachtwoord instellen" + +#: wp-admin/user-new.php:581 +msgid "Type the password again." +msgstr "Typ het wachtwoord opnieuw." + +#. translators: 1: Installed WordPress version number, 2: URL to WordPress +#. release notes, 3: New WordPress version number, including locale if +#. necessary. +#: wp-admin/update-core.php:130 +msgid "You can update from WordPress %1$s to WordPress %3$s manually:" +msgstr "Je kunt handmatig updaten van WordPress %1$s naar WordPress %3$s:" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:159 +msgid "Revoke all application passwords" +msgstr "Alle applicatie wachtwoorden intrekken" + +#. translators: %s: the application password's given name. +#: wp-admin/includes/class-wp-application-passwords-list-table.php:120 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:241 +msgid "Revoke \"%s\"" +msgstr "Trek \"%s\" in" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:33 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:114 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:239 +msgid "Revoke" +msgstr "Intrekken" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:32 +msgid "Last IP" +msgstr "Laatste IP" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:31 +msgid "Last Used" +msgstr "Laatst gebruikt" + +#. translators: 1: The Site Health action that is no longer used by core. 2: +#. The new function that replaces it. +#: wp-admin/includes/ajax-actions.php:5153 +#: wp-admin/includes/ajax-actions.php:5186 +#: wp-admin/includes/ajax-actions.php:5219 +#: wp-admin/includes/ajax-actions.php:5269 +msgid "The Site Health check for %1$s has been replaced with %2$s." +msgstr "De sitediagnose voor %1$s is vervangen door %2$s." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:139 +msgid "Erase personal data" +msgstr "Wis persoonlijke gegevens" + +#. translators: 1: Plugin name, 2: Current version number, 3: New version +#. number. +#. translators: 1: Theme name, 2: Current version number, 3: New version +#. number. +#: wp-admin/includes/class-wp-automatic-updater.php:1086 +#: wp-admin/includes/class-wp-automatic-updater.php:1114 +#: wp-admin/includes/class-wp-automatic-updater.php:1147 +#: wp-admin/includes/class-wp-automatic-updater.php:1175 +msgid "- %1$s (from version %2$s to %3$s)" +msgstr "- %1$s (van versie %2$s naar %3$s)" + +#: wp-admin/includes/template.php:2312 +msgid "Current Header Video" +msgstr "Huidige header video" + +#: wp-admin/includes/class-wp-site-health.php:2238 +msgid "Authorization header" +msgstr "Autorisatie-header" + +#: wp-admin/includes/class-wp-site-health.php:2129 +msgid "Learn how to configure the Authorization header." +msgstr "Leer hoe je de autorisatie-header configureert." + +#: wp-admin/includes/class-wp-site-health.php:2123 +msgid "Flush permalinks" +msgstr "Permalinks herschrijven" + +#: wp-admin/includes/class-wp-site-health.php:2108 +msgid "The authorization header is invalid." +msgstr "De autorisatie-header is ongeldig." + +#: wp-admin/includes/class-wp-site-health.php:2106 +msgid "The authorization header is missing." +msgstr "De autorisatie-header ontbreekt." + +#: wp-admin/includes/class-wp-site-health.php:2099 +msgid "The Authorization header comes from the third-party applications you approve. Without it, those apps cannot connect to your site." +msgstr "De autorisatie-header is afkomstig van de applicaties van derden die je goedkeurt. Zonder dit kunnen die apps geen verbinding maken met je site." + +#: wp-admin/includes/class-wp-site-health.php:2091 +msgid "The Authorization header is working as expected." +msgstr "De autorisatie-header werkt zoals verwacht." + +#: wp-admin/includes/class-wp-screen.php:1119 +msgid "They can be expanded and collapsed by clickling on their headings, and arranged by dragging their headings or by clicking on the up and down arrows." +msgstr "Ze kunnen worden uitgevouwen en samengevouwen door op hun headings te klikken en ze kunnen worden gerangschikt door hun headings te verslepen of door op de pijlen omhoog en omlaag te klikken." + +#: wp-admin/includes/class-wp-screen.php:1118 +msgid "Some screen elements can be shown or hidden by using the checkboxes." +msgstr "Sommige schermelementen kunnen worden weergegeven of verborgen door de selectievakjes te gebruiken." + +#: wp-admin/includes/class-wp-screen.php:1116 +msgid "Screen elements" +msgstr "Schermelementen" + +#: wp-admin/includes/user.php:642 +msgid "The app id must be a uuid." +msgstr "De app-ID moet een uuid zijn." + +#: wp-admin/includes/user.php:634 +msgid "The rejection url must be served over a secure connection." +msgstr "De afwijzings-URL moet worden aangeboden via een beveiligde verbinding." + +#: wp-admin/includes/user.php:623 +msgid "The success url must be served over a secure connection." +msgstr "De succes URL moet worden aangeboden via een beveiligde verbinding." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:588 +msgid "If you request a password reset, your IP address will be included in the reset email." +msgstr "Als je een wachtwoord reset aanvraagt, wordt je IP-adres opgenomen in de reset e-mail." + +#. translators: %s: Plugin search term. +#: wp-admin/includes/class-wp-plugins-list-table.php:410 +msgid "No plugins found for: %s." +msgstr "Geen plugins gevonden voor: %s." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:92 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:98 +msgid "Complete request" +msgstr "Afronden aanvraag" + +#. translators: %s: Request email. +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:88 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:94 +msgid "Mark export request for “%s” as completed." +msgstr "Markeer het exportverzoek voor “%s” als afgerond." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:343 +msgid "%d request deleted successfully." +msgid_plural "%d requests deleted successfully." +msgstr[0] "%d aanvraag succesvol verwijderd." +msgstr[1] "%d aanvragen succesvol verwijderd." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:326 +msgid "%d request failed to delete." +msgid_plural "%d requests failed to delete." +msgstr[0] "%d aanvraag kan niet worden verwijderd." +msgstr[1] "%d aanvragen zijn niet verwijderd." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:300 +msgid "%d request marked as complete." +msgid_plural "%d requests marked as complete." +msgstr[0] "%d aanvraag gemarkeerd als afgerond." +msgstr[1] "%d aanvragen gemarkeerd als afgerond." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:273 +msgid "%d confirmation request re-sent successfully." +msgid_plural "%d confirmation requests re-sent successfully." +msgstr[0] "%d bevestigingsaanvraag opnieuw verzonden." +msgstr[1] "%d bevestigingsaanvragen opnieuw verzonden." + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:256 +msgid "%d confirmation request failed to resend." +msgid_plural "%d confirmation requests failed to resend." +msgstr[0] "%d bevestigingsaanvraag kan niet opnieuw worden verzonden." +msgstr[1] "%d bevestigingsaanvragen konden niet opnieuw worden verzonden." + +#: wp-admin/includes/class-wp-privacy-requests-table.php:214 +msgid "Mark requests as completed" +msgstr "Markeer de aanvraag als afgerond" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:46 +msgid "Next steps" +msgstr "Volgende stappen" + +#: wp-admin/includes/privacy-tools.php:912 +msgid "Invalid request ID when processing user privacy eraser data." +msgstr "Ongeldige aanvraag ID bij het verwerken van gegevens over het wissen van gebruikersprivacy." + +#: wp-admin/includes/privacy-tools.php:761 +msgid "Invalid request ID when merging user privacy exporter data." +msgstr "Ongeldige aanvraag ID bij het samenvoegen van gebruikersprivacy exportergegevens." + +#: wp-admin/includes/privacy-tools.php:532 +msgid "Unable to open user privacy export file (archive) for writing." +msgstr "Kan het exportbestand (archief) van gebruikersprivacy niet openen om te schrijven." + +#: wp-admin/includes/privacy-tools.php:511 +msgid "Unable to add data to user privacy export file (HTML format)." +msgstr "Kan geen gegevens toevoegen aan het exportbestand van gebruikersprivacy (HTML-format)." + +#: wp-admin/includes/privacy-tools.php:507 +msgid "Unable to add data to user privacy export file (JSON format)." +msgstr "Kan geen gegevens toevoegen aan het exportbestand van gebruikersprivacy (JSON-format)." + +#: wp-admin/includes/privacy-tools.php:413 +msgid "Unable to open user privacy export file (HTML report) for writing." +msgstr "Kan het exportbestand van gebruikersprivacy (HTML-rapport) niet openen om te schrijven." + +#: wp-admin/includes/privacy-tools.php:398 +msgid "Unable to open user privacy export file (JSON report) for writing." +msgstr "Kan het exportbestand van gebruikersprivacy (JSON-rapport) niet openen om te schrijven." + +#: wp-admin/includes/privacy-tools.php:329 +msgid "Unable to protect user privacy export folder from browsing." +msgstr "De exportmap van de gebruikersprivacy kan niet worden beschermd tegen browsen." + +#: wp-admin/includes/privacy-tools.php:321 +msgid "Unable to create user privacy export folder." +msgstr "Kan geen exportmap voor gebruikersprivacy maken." + +#: wp-admin/includes/privacy-tools.php:313 +msgid "Invalid email address when generating user privacy export file." +msgstr "Ongeldig e-mailadres bij genereren van exportbestand voor gebruikersprivacy." + +#: wp-admin/includes/privacy-tools.php:307 +msgid "Invalid request ID when generating user privacy export file." +msgstr "Ongeldige aanvraag ID bij genereren van exportbestand voor gebruikersprivacy." + +#: wp-admin/includes/privacy-tools.php:300 +msgid "Unable to generate user privacy export file. ZipArchive not available." +msgstr "Kan geen exportbestand voor gebruikersprivacy genereren. ZipArchive niet beschikbaar." + +#: wp-admin/includes/privacy-tools.php:107 +#: wp-admin/includes/privacy-tools.php:119 +msgid "Invalid user privacy action." +msgstr "Ongeldige actie voor gebruikersprivacy." + +#: wp-admin/includes/privacy-tools.php:31 +msgid "Unable to initiate user privacy confirmation request." +msgstr "Kan aanvraag om bevestiging van gebruikersprivacy niet starten." + +#. translators: %s: Search query. +#: wp-admin/edit-tags.php:344 wp-admin/link-manager.php:110 +#: wp-admin/plugins.php:733 wp-admin/edit-comments.php:235 +#: wp-admin/upload.php:281 wp-admin/users.php:576 wp-admin/edit.php:412 +#: wp-admin/js/updates.js:2625 wp-admin/network/themes.php:358 +#: wp-admin/network/users.php:284 wp-admin/network/sites.php:377 +msgid "Search results for: %s" +msgstr "Zoekresultaten voor: %s" + +#: wp-admin/options-reading.php:45 +msgid "Note that even when set to discourage search engines, your site is still visible on the web and not all search engines adhere to this directive." +msgstr "Merk op dat zelfs wanneer deze is ingesteld om zoekmachines te ontmoedigen, je site nog steeds zichtbaar is op internet en dat niet alle zoekmachines zich aan deze richtlijn houden." + +#: wp-admin/options-reading.php:44 +msgid "You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen." +msgstr "Je kunt kiezen of je site wordt gecrawld door robots, pingservices en spiders. Als je wil dat deze diensten je site negeren, klik je op het selectievakje naast “Zoekmachines ontmoedigen deze site te indexeren” en klik je op de knop Wijzigingen opslaan onder aan het scherm." + +#. translators: 1: post_max_size, 2: upload_max_filesize +#: wp-admin/includes/class-wp-site-health.php:2062 +msgid "The \"%1$s\" value is smaller than \"%2$s\"." +msgstr "De \"%1$s\" waarde is kleiner dan \"%2$s\"." + +#: wp-admin/includes/class-wp-debug-data.php:124 +msgid "Environment type" +msgstr "Type omgeving" + +#: wp-admin/about.php:271 +msgid "Check the Field Guide for more!" +msgstr "Bekijk de Field Guide voor meer informatie!" + +#: wp-admin/plugins.php:577 +msgid "Auto-updates are only available for plugins recognized by WordPress.org, or that include a compatible update system." +msgstr "Auto-updates zijn alleen beschikbaar voor plugins die erkend worden door WordPress.org, of die een compatibel update systeem bevatten." + +#: wp-admin/includes/theme.php:842 wp-admin/themes.php:1002 +msgid "Update Incompatible" +msgstr "Update niet compatibel" + +#: wp-admin/update-core.php:671 +msgid "This update doesn’t work with your version of WordPress." +msgstr "Deze update werkt niet met jouw versie van WordPress." + +#: wp-admin/update-core.php:637 +msgid "This update doesn’t work with your versions of WordPress and PHP." +msgstr "Deze update werkt niet met jouw versies van WordPress en PHP." + +#: wp-admin/options-discussion.php:207 wp-admin/options-discussion.php:208 +msgid "Disallowed Comment Keys" +msgstr "Niet toegestane reactie toetsen" + +#: wp-admin/includes/class-wp-site-health.php:2214 +msgid "Plugin and theme auto-updates" +msgstr "Auto-updates voor plugins en thema's" + +#: wp-admin/includes/class-wp-site-health.php:2506 +msgid "There appear to be no issues with plugin and theme auto-updates." +msgstr "Er lijken geen problemen te zijn met auto-updates voor plugins en thema's." + +#: wp-admin/includes/class-wp-site-health.php:2500 +msgid "Auto-updates for themes appear to be disabled. This will prevent your site from receiving new versions automatically when available." +msgstr "Auto-updates voor thema's lijkt te zijn uitgeschakeld. Dit voorkomt dat je site automatisch nieuwe versies ontvangt wanneer deze beschikbaar zijn." + +#: wp-admin/includes/class-wp-site-health.php:2495 +msgid "Auto-updates for plugins appear to be disabled. This will prevent your site from receiving new versions automatically when available." +msgstr "Auto-updates voor plugins lijkt te zijn uitgeschakeld. Dit voorkomt dat je site automatisch nieuwe versies ontvangt wanneer deze beschikbaar zijn." + +#: wp-admin/includes/class-wp-site-health.php:2490 +msgid "Auto-updates for plugins and themes appear to be disabled. This will prevent your site from receiving new versions automatically when available." +msgstr "Auto-updates voor plugins en thema's lijkt te zijn uitgeschakeld. Dit voorkomt dat je site automatisch nieuwe versies ontvangt wanneer deze beschikbaar zijn." + +#: wp-admin/includes/class-wp-site-health.php:2481 +msgid "Auto-updates for plugins and/or themes appear to be disabled, but settings are still set to be displayed. This could cause auto-updates to not work as expected." +msgstr "Auto-updates voor plugins en/of thema's lijkt te zijn uitgeschakeld, maar instellingen worden nog steeds weergegeven. Dit kan ertoe leiden dat auto-updates niet werkt zoals verwacht." + +#: wp-admin/includes/class-wp-site-health.php:1772 +msgid "Your site may have problems auto-updating plugins and themes" +msgstr "Je site heeft mogelijk problemen met het automatisch bijwerken van plugins en thema's" + +#: wp-admin/includes/class-wp-site-health.php:1761 +msgid "Plugin and theme auto-updates ensure that the latest versions are always installed." +msgstr "Auto-updates voor plugins en thema's zorgt ervoor dat de nieuwste versies altijd worden geïnstalleerd." + +#: wp-admin/includes/class-wp-site-health.php:1753 +msgid "Plugin and theme auto-updates appear to be configured correctly" +msgstr "Auto-updates voor plugins en thema's lijkt correct te zijn geconfigureerd" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-themes-list-table.php:215 +#: wp-admin/includes/class-theme-installer-skin.php:143 +#: wp-admin/includes/class-theme-upgrader-skin.php:115 +msgctxt "theme" +msgid "Activate “%s”" +msgstr "“%s” activeren" + +#: wp-admin/includes/ajax-actions.php:5359 +msgid "Sorry, you are not allowed to modify plugins." +msgstr "Je mag geen plugins wijzigen." + +#. translators: 1: post_max_size, 2: upload_max_filesize +#: wp-admin/includes/class-wp-site-health.php:2071 +msgid "The setting for %1$s is smaller than %2$s, this could cause some problems when trying to upload files." +msgstr "De instelling voor %1$s is kleiner dan %2$s, dit kan problemen veroorzaken bij het uploaden van bestanden." + +#. translators: 1: file_uploads, 2: 0 +#: wp-admin/includes/class-wp-site-health.php:2048 +msgid "%1$s is set to %2$s. You won't be able to upload files on your site." +msgstr "%1$s is ingesteld op %2$s. Je kan geen bestanden uploaden naar je site." + +#. translators: %s: ini_get() +#: wp-admin/includes/class-wp-site-health.php:2036 +msgid "The %s function has been disabled, some media settings are unavailable because of this." +msgstr "De %s functie is uitgeschakeld, hierdoor zijn sommige media instellingen niet beschikbaar." + +#. translators: 1: file_uploads, 2: php.ini +#: wp-admin/includes/class-wp-site-health.php:2023 +msgid "The %1$s directive in %2$s determines if uploading files is allowed on your site." +msgstr "De %1$s directive in %2$s bepaalt of het uploaden van bestanden is toegestaan ​​op je site." + +#: wp-admin/includes/class-wp-site-health.php:2013 +msgid "Files can be uploaded." +msgstr "Bestanden kunnen worden geüpload." + +#: wp-admin/includes/class-wp-debug-data.php:564 +msgid "Max number of files allowed" +msgstr "Max. aantal toegestane bestanden" + +#: wp-admin/includes/class-wp-debug-data.php:560 +msgid "Max effective file size" +msgstr "Maximale effectieve bestandsgrootte" + +#: wp-admin/includes/class-wp-debug-data.php:556 +msgid "Max size of an uploaded file" +msgstr "Maximale grootte van een geüpload bestand" + +#: wp-admin/includes/class-wp-debug-data.php:552 +msgid "Max size of post data allowed" +msgstr "Maximale toegestane grootte van berichtgegevens" + +#: wp-admin/includes/class-wp-debug-data.php:547 +#: wp-admin/includes/class-wp-site-health.php:2210 +msgid "File uploads" +msgstr "Bestand uploads" + +#: wp-admin/includes/class-wp-debug-data.php:530 +msgid "File upload settings" +msgstr "Bestand upload instellingen" + +#. translators: %s: Theme name. +#: wp-admin/theme-install.php:393 +msgctxt "theme" +msgid "Cannot Install %s" +msgstr "Kan %s niet installeren" + +#. translators: %s: Plugin name. +#: wp-admin/includes/deprecated.php:1383 +msgctxt "plugin" +msgid "Install %s" +msgstr "Installeer %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-theme-install-list-table.php:326 +#: wp-admin/theme-install.php:386 +msgctxt "theme" +msgid "Install %s" +msgstr "Installeer %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:243 wp-admin/includes/update.php:709 +msgctxt "theme" +msgid "Update %s now" +msgstr "Update %s nu" + +#. translators: 1: Plugin name, 2: Version number. +#. translators: 1: Theme name, 2: Version number. +#: wp-admin/includes/class-wp-automatic-updater.php:1094 +#: wp-admin/includes/class-wp-automatic-updater.php:1122 +#: wp-admin/includes/class-wp-automatic-updater.php:1155 +#: wp-admin/includes/class-wp-automatic-updater.php:1183 +msgid "- %1$s version %2$s" +msgstr "- %1$s versie %2$s" + +#: wp-admin/theme-install.php:356 wp-admin/theme-install.php:418 +msgctxt "theme" +msgid "Activated" +msgstr "Geactiveerd" + +#: wp-admin/themes.php:86 +msgid "Sorry, you are not allowed to enable themes automatic updates." +msgstr "Je hebt geen toestemming om auto-updates voor thema's in te schakelen." + +#: wp-admin/includes/class-plugin-installer-skin.php:211 +msgid "This plugin is already installed." +msgstr "Deze plugin is al geïnstalleerd." + +#. translators: %s: Plugin name. +#. translators: %s: Plugin name and version. +#: wp-admin/includes/update.php:517 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:557 +#: wp-admin/js/updates.js:2099 +msgctxt "plugin" +msgid "Update %s now" +msgstr "Nu %s bijwerken" + +#. translators: %s: Plugin name and version. +#. translators: %s: Importer name. +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:535 +#: wp-admin/import.php:159 wp-admin/js/updates.js:895 +#: wp-admin/js/updates.js:2108 wp-admin/js/updates.js:2231 +msgctxt "plugin" +msgid "Install %s now" +msgstr "Installeer %s nu" + +#: wp-admin/user-edit.php:883 wp-admin/js/common.js:1102 +#: wp-admin/js/application-passwords.js:196 +msgid "Dismiss this notice." +msgstr "Negeer dit bericht." + +#. translators: %s: Theme name. +#: wp-admin/themes.php:549 wp-admin/themes.php:895 wp-admin/themes.php:1110 +#: wp-admin/theme-install.php:371 +msgctxt "theme" +msgid "Cannot Activate %s" +msgstr "Kan %s niet activeren" + +#: wp-admin/themes.php:296 wp-admin/network/themes.php:407 +msgid "Theme will no longer be auto-updated." +msgstr "Thema zal niet langer automatisch bijgewerkt worden." + +#: wp-admin/themes.php:292 wp-admin/network/themes.php:398 +msgid "Theme will be auto-updated." +msgstr "Thema zal automatisch bijgewerkt worden." + +#: wp-admin/themes.php:190 wp-admin/network/themes.php:313 +msgid "Auto-updates can be enabled or disabled for each individual theme. Themes with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." +msgstr "Auto-updates kan voor elk afzonderlijk thema worden in- of uitgeschakeld. Thema's waarbij auto-updates is ingeschakeld, tonen de geschatte datum van de volgende auto-update. Auto-updates is afhankelijk van het WP-Cron taak planningssysteem." + +#: wp-admin/themes.php:106 +msgid "Sorry, you are not allowed to disable themes automatic updates." +msgstr "Je hebt geen toestemming om de auto-updates voor thema's uit te schakelen." + +#: wp-admin/plugins.php:449 +msgid "Sorry, you are not allowed to manage plugins automatic updates." +msgstr "Je hebt geen toestemming om auto-updates voor plugins te beheren." + +#: wp-admin/post.php:326 wp-admin/edit.php:173 +msgid "Error in deleting the item." +msgstr "Fout bij het verwijderen van het item." + +#: wp-admin/post.php:322 wp-admin/upload.php:195 wp-admin/edit.php:169 +msgid "Error in deleting the attachment." +msgstr "Fout bij het verwijderen van de bijlage." + +#: wp-admin/post.php:291 wp-admin/upload.php:180 wp-admin/edit.php:148 +msgid "Error in restoring the item from Trash." +msgstr "Fout bij het terugzetten van het item uit de prullenbak." + +#: wp-admin/post.php:261 wp-admin/upload.php:159 wp-admin/edit.php:120 +msgid "Error in moving the item to Trash." +msgstr "Fout bij het verplaatsen van het item naar de prullenbak." + +#: wp-admin/plugins.php:712 +msgid "Selected plugins will no longer be auto-updated." +msgstr "Geselecteerde plugins worden niet langer automatisch bijgewerkt." + +#: wp-admin/plugins.php:710 +msgid "Selected plugins will be auto-updated." +msgstr "Geselecteerde plugins worden automatisch bijgewerkt." + +#: wp-admin/plugins.php:708 +msgid "Plugin will no longer be auto-updated." +msgstr "Plugin zal niet langer automatisch bijgewerkt worden." + +#: wp-admin/plugins.php:706 +msgid "Plugin will be auto-updated." +msgstr "De plugin zal automatisch bijgewerkt worden." + +#: wp-admin/plugins.php:576 +msgid "Auto-updates can be enabled or disabled for each individual plugin. Plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." +msgstr "Auto-updates kan voor elke afzonderlijke plugin worden in- of uitgeschakeld. Plugins waarvoor auto-updates zijn ingeschakeld, tonen de geschatte datum van de volgende auto-update. Auto-updates is afhankelijk van het WP-Cron taak planningssysteem." + +#: wp-admin/plugins.php:453 +msgid "Please connect to your network admin to manage plugins automatic updates." +msgstr "Koppel je netwerk beheer om auto-updates voor plugins te beheren." + +#. translators: %s: Human-readable time interval. +#: wp-admin/index.php:141 +msgid "The admin email verification page will reappear after %s." +msgstr "De verificatiepagina voor e-mail van de beheerder wordt na %s opnieuw weergegeven." + +#: wp-admin/update-core.php:964 wp-admin/plugins.php:582 +#: wp-admin/themes.php:201 wp-admin/network/themes.php:318 +msgid "Learn more: Auto-updates documentation" +msgstr "Meer informatie: documentatie voor auto-updates" + +#: wp-admin/includes/class-wp-debug-data.php:1140 wp-admin/update-core.php:959 +#: wp-admin/plugins.php:574 wp-admin/themes.php:196 +#: wp-admin/network/themes.php:311 +msgid "Auto-updates" +msgstr "Auto-updates" + +#: wp-admin/update-core.php:954 wp-admin/plugins.php:578 +#: wp-admin/themes.php:191 wp-admin/network/themes.php:314 +msgid "Please note: Third-party themes and plugins, or custom code, may override WordPress scheduling." +msgstr "Let op: thema's en plugins van derden of aangepaste code kunnen de planning van WordPress overschrijven." + +#: wp-admin/update-core.php:953 +msgid "Auto-updates can be enabled or disabled for WordPress major versions and for each individual theme or plugin. Themes or plugins with auto-updates enabled will display the estimated date of the next auto-update. Auto-updates depends on the WP-Cron task scheduling system." +msgstr "Auto-updates kunnen ingeschakeld of uitgeschakeld worden voor WordPress major versies en voor elk individuele thema of plugin. Thema's of plugins waarvoor auto-updates is ingeschakeld tonen de geschatte datum van de volgende auto-update. Auto-updates is afhankelijk van het WP-Cron taakplanning systeem." + +#. translators: 1: Documentation on WordPress backups, 2: Documentation on +#. updating WordPress. +#: wp-admin/update-core.php:247 +msgid "Important: Before updating, please back up your database and files. For help with updates, visit the Updating WordPress documentation page." +msgstr "Belangrijk: maak voordat je gaat updaten een backup van je database en bestanden. Voor hulp bij updates ga je naar de documentatiepagina van Updating WordPress." + +#: wp-admin/customize.php:195 wp-admin/themes.php:551 wp-admin/themes.php:897 +#: wp-admin/themes.php:1113 wp-admin/theme-install.php:374 +#: wp-admin/theme-install.php:421 +msgctxt "theme" +msgid "Cannot Activate" +msgstr "Kan niet activeren" + +#: wp-admin/comment.php:46 +msgid "You can’t edit this comment because the associated post is in the Trash. Please restore the post first, then try again." +msgstr "Je kan deze reactie niet bewerken omdat het bijbehorende bericht in de prullenbak staat. Herstel eerst het bericht en probeer het dan opnieuw." + +#: wp-admin/async-upload.php:58 +msgctxt "media item" +msgid "Success" +msgstr "Succes" + +#. translators: 1: Current WordPress version, 2: Plugin name, 3: Required +#. WordPress version. +#: wp-admin/includes/plugin.php:1196 +msgctxt "plugin" +msgid "Error: Current WordPress version (%1$s) does not meet minimum requirements for %2$s. The plugin requires WordPress %3$s." +msgstr "Fout: de huidige WordPress-versie (%1$s) voldoet niet aan de minimumvereisten voor %2$s. De plugin vereist WordPress %3$s." + +#. translators: 1: Current PHP version, 2: Plugin name, 3: Required PHP +#. version. +#: wp-admin/includes/plugin.php:1185 +msgctxt "plugin" +msgid "Error: Current PHP version (%1$s) does not meet minimum requirements for %2$s. The plugin requires PHP %3$s." +msgstr "Fout: de huidige PHP-versie (%1$s) voldoet niet aan de minimumvereisten voor %2$s. De plugin vereist PHP %3$s." + +#. translators: 1: Current WordPress version, 2: Current PHP version, 3: Plugin +#. name, 4: Required WordPress version, 5: Required PHP version. +#: wp-admin/includes/plugin.php:1172 +msgctxt "plugin" +msgid "Error: Current versions of WordPress (%1$s) and PHP (%2$s) do not meet minimum requirements for %3$s. The plugin requires WordPress %4$s and PHP %5$s." +msgstr "Fout: de huidige versies van WordPress (%1$s) en PHP (%2$s) voldoen niet aan de minimumvereisten voor %3$s. De plugin vereist WordPress %4$s en PHP %5$s." + +#: wp-admin/includes/ajax-actions.php:5381 +msgid "Invalid data. The item does not exist." +msgstr "Ongeldige gegevens. Het item bestaat niet." + +#: wp-admin/includes/ajax-actions.php:5352 +#: wp-admin/includes/ajax-actions.php:5377 +msgid "Invalid data. Unknown type." +msgstr "Ongeldige gegevens. Onbekend type." + +#: wp-admin/includes/ajax-actions.php:5347 +msgid "Invalid data. Unknown state." +msgstr "Ongeldige gegevens. Onbekende status." + +#: wp-admin/includes/ajax-actions.php:5341 +msgid "Invalid data. No selected item." +msgstr "Ongeldige gegevens. Geen item geselecteerd." + +#: wp-admin/includes/ajax-actions.php:1305 +#: wp-admin/includes/ajax-actions.php:1407 +msgid "Error: Please type your comment text." +msgstr "Fout: geef wat tekst op als reactie." + +#: wp-admin/includes/ajax-actions.php:1275 +msgid "Error: You can’t reply to a comment on a draft post." +msgstr "Fout: je kan niet reageren op een reactie over een conceptbericht." + +#. translators: %s: Themes screen URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1208 +msgid "To manage themes on your site, visit the Themes page: %s" +msgstr "Om je thema's op je site te beheren ga naar de thema pagina: %s" + +#. translators: %s: Plugins screen URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1199 +msgid "To manage plugins on your site, visit the Plugins page: %s" +msgstr "Om je plugins op je site te beheren, ga naar de plugins pagina: %s" + +#: wp-admin/includes/class-wp-automatic-updater.php:1169 +msgid "These themes are now up to date:" +msgstr "Deze thema's zijn nu up-to-date:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1141 +msgid "These plugins are now up to date:" +msgstr "Deze plugins zijn nu up-to-date:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1108 +msgid "These themes failed to update:" +msgstr "Deze thema updates zijn mislukt:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1080 +msgid "These plugins failed to update:" +msgstr "Bij deze plugins is het updaten mislukt:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1075 +msgid "Please check your site now. It’s possible that everything is working. If there are updates available, you should update." +msgstr "Controleer nu je site. Het is mogelijk dat alles werkt. Als er updates beschikbaar zijn, moet je updaten." + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1065 +msgid "Howdy! Themes failed to update on your site at %s." +msgstr "Thema's kunnen niet worden geüpdate op je site op %s." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1062 +msgid "[%s] Some themes have failed to update" +msgstr "[%s] Het updaten van sommige thema's is mislukt" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1057 +msgid "Howdy! Plugins failed to update on your site at %s." +msgstr "Plugins kunnen niet worden geüpdatet op je site op %s." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1054 +msgid "[%s] Some plugins have failed to update" +msgstr "[%s] Het updaten van sommige plugins is mislukt" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1049 +msgid "Howdy! Plugins and themes failed to update on your site at %s." +msgstr "Plugins en thema's kunnen niet worden geüpdate op je site op %s." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1046 +msgid "[%s] Some plugins and themes have failed to update" +msgstr "[%s] Bij sommige plugins en thema's is de update mislukt" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1036 +msgid "Howdy! Some themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part." +msgstr "Sommige thema's zijn automatisch geüpdatet naar hun nieuwste versies op je site op %s. Je hoeft verder niets te doen." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1033 +msgid "[%s] Some themes were automatically updated" +msgstr "[%s] Sommige thema's zijn automatisch geüpdatet" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1028 +msgid "Howdy! Some plugins have automatically updated to their latest versions on your site at %s. No further action is needed on your part." +msgstr "Sommige plugins zijn automatisch geüpdatet naar hun nieuwste versies op je site op %s. Je hoeft verder niets te doen." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1025 +msgid "[%s] Some plugins were automatically updated" +msgstr "[%s] Sommige plugins zijn automatisch geüpdatet" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1020 +msgid "Howdy! Some plugins and themes have automatically updated to their latest versions on your site at %s. No further action is needed on your part." +msgstr "Sommige plugins en thema's zijn automatisch geüpdatet naar hun nieuwste versies op je site op %s. Je hoeft verder niets te doen." + +#. translators: %s: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:1017 +msgid "[%s] Some plugins and themes have automatically updated" +msgstr "[%s] Sommige plugins en thema's zijn automatisch geüpdatet" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1354 +msgid "Move %s box down" +msgstr "Verplaats %s box naar beneden" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1344 +msgid "Move %s box up" +msgstr "Verplaats %s box naar boven" + +#: wp-admin/includes/class-wp-comments-list-table.php:368 +msgctxt "comment" +msgid "Not spam" +msgstr "Geen spam" + +#: wp-admin/includes/class-wp-site-health.php:2178 +msgid "PHP Sessions" +msgstr "PHP sessies" + +#. translators: 1: session_start(), 2: session_write_close() +#: wp-admin/includes/class-wp-site-health.php:1129 +msgid "A PHP session was created by a %1$s function call. This interferes with REST API and loopback requests. The session should be closed by %2$s before making any HTTP requests." +msgstr "Een PHP-sessie is gemaakt door een %1$s functie aanroep. Dit interfereerd met de REST API en loopback verzoeken. De sessie moet worden afgesloten door %2$s voordat HTTP-aanvragen worden gedaan." + +#: wp-admin/includes/class-wp-site-health.php:1123 +msgid "An active PHP session was detected" +msgstr "Een actieve PHP sessie is gedetecteerd" + +#. translators: 1: session_start(), 2: session_write_close() +#: wp-admin/includes/class-wp-site-health.php:1112 +msgid "PHP sessions created by a %1$s function call may interfere with REST API and loopback requests. An active session should be closed by %2$s before making any HTTP requests." +msgstr "PHP-sessies gemaakt door een %1$s functie aanroep kunnen interfereren met de REST API en loopback aanvragen. Een actieve sessie moet worden afgesloten door %2$s voordat HTTP-aanvragen worden gedaan." + +#: wp-admin/includes/class-wp-site-health.php:1102 +msgid "No PHP sessions detected" +msgstr "Geen PHP sessies gedetecteerd" + +#: wp-admin/includes/class-wp-screen.php:1336 +#: wp-admin/includes/class-wp-list-table.php:170 +msgid "Extended view" +msgstr "Uitgebreide weergave" + +#: wp-admin/includes/class-wp-screen.php:1332 +#: wp-admin/includes/class-wp-list-table.php:169 +msgid "Compact view" +msgstr "Compacte weergave" + +#: wp-admin/includes/user.php:177 +msgid "Error: Passwords don’t match. Please enter the same password in both password fields." +msgstr "Fout: wachtwoorden komen niet overeen. Voer in beide wachtwoordvelden hetzelfde wachtwoord in." + +#: wp-admin/includes/post.php:2213 +msgctxt "block category" +msgid "Reusable Blocks" +msgstr "Herbruikbare blokken" + +#: wp-admin/includes/post.php:2208 +msgctxt "block category" +msgid "Embeds" +msgstr "Insluitingen" + +#: wp-admin/includes/post.php:2203 +msgctxt "block category" +msgid "Widgets" +msgstr "Widgets" + +#: wp-admin/includes/post.php:2198 +msgctxt "block category" +msgid "Design" +msgstr "Ontwerp" + +#: wp-admin/includes/post.php:2193 +msgctxt "block category" +msgid "Media" +msgstr "Media" + +#: wp-admin/includes/post.php:2188 +msgctxt "block category" +msgid "Text" +msgstr "Tekst" + +#: wp-admin/includes/meta-boxes.php:353 wp-admin/includes/meta-boxes.php:354 +#: wp-admin/js/post.js:766 +msgctxt "post action/button label" +msgid "Schedule" +msgstr "Inplannen" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:284 +#: wp-admin/js/updates.js:2644 +msgid "No plugins found. Try a different search." +msgstr "Geen plugins gevonden. Probeer een andere zoekopdracht." + +#. translators: %s: Time until the next update. +#: wp-admin/includes/update.php:1097 +msgid "Automatic update scheduled in %s." +msgstr "Auto-update gepland over %s." + +#. translators: %s: Duration that WP-Cron has been overdue. +#: wp-admin/includes/update.php:1091 +msgid "Automatic update overdue by %s. There may be a problem with WP-Cron." +msgstr "Auto-update is %s achterstallig. Mogelijk is er een probleem met WP-Cron." + +#: wp-admin/includes/update.php:1081 +msgid "Automatic update not scheduled. There may be a problem with WP-Cron." +msgstr "Auto-update niet gepland. Mogelijk is er een probleem met WP-Cron." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-plugin-installer-skin.php:301 +msgid "You are updating a plugin. Be sure to back up your database and files first." +msgstr "Je werkt een plugin bij. Zorg ervoor dat je eerst een backup van je database en bestanden maakt." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-plugin-installer-skin.php:295 +msgid "You are uploading an older version of a current plugin. You can continue to install the older version, but be sure to back up your database and files first." +msgstr "Je uploadt een oudere versie van een huidige plugin. Je kan doorgaan met het installeren van de oudere versie, maar zorg ervoor dat je eerst een backup van je database en bestanden maakt." + +#. translators: 1: Current WordPress version, 2: Version required by the +#. uploaded plugin. +#: wp-admin/includes/class-plugin-upgrader.php:460 +#: wp-admin/includes/class-plugin-installer-skin.php:280 +msgid "Your WordPress version is %1$s, however the uploaded plugin requires %2$s." +msgstr "Je WordPress versie is %1$s, echter de geüploade plugin vereist %2$s." + +#. translators: 1: Current PHP version, 2: Version required by the uploaded +#. plugin. +#: wp-admin/includes/class-plugin-upgrader.php:449 +#: wp-admin/includes/class-plugin-installer-skin.php:268 +msgid "The PHP version on your server is %1$s, however the uploaded plugin requires %2$s." +msgstr "De PHP-versie op je server is %1$s, maar de geüploade plugin vereist %2$s." + +#: wp-admin/includes/class-plugin-installer-skin.php:259 +msgid "The plugin cannot be updated due to the following:" +msgstr "De plugin kan niet geüpdatet worden vanwege het volgende:" + +#: wp-admin/includes/class-plugin-installer-skin.php:216 +msgid "Plugin name" +msgstr "Plugin naam" + +#: wp-admin/includes/class-theme-upgrader.php:107 +msgid "Theme downgraded successfully." +msgstr "Thema met succes gedowngrade." + +#: wp-admin/includes/class-theme-upgrader.php:106 +msgid "Theme downgrade failed." +msgstr "Thema downgrade mislukt." + +#: wp-admin/includes/class-theme-upgrader.php:105 +msgid "Downgrading the theme…" +msgstr "Het thema… aan het downgraden" + +#: wp-admin/includes/class-theme-upgrader.php:99 +msgid "Updating the theme…" +msgstr "Het thema… aan het updaten" + +#. translators: %s: Theme error. +#: wp-admin/includes/class-theme-upgrader.php:95 +msgid "The current theme has the following error: \"%s\"." +msgstr "Het huidige thema heeft de volgende fout: \"%s\"." + +#: wp-admin/includes/class-wp-plugins-list-table.php:1117 +#: wp-admin/themes.php:689 wp-admin/js/updates.js:2951 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:792 +msgid "Enable auto-updates" +msgstr "Auto-updates inschakelen" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1113 +#: wp-admin/themes.php:685 wp-admin/js/updates.js:2940 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:788 +msgid "Disable auto-updates" +msgstr "Auto-updates uitschakelen" + +#: wp-admin/includes/class-wp-plugins-list-table.php:622 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:489 +msgid "Disable Auto-updates" +msgstr "Uitschakelen auto-updates" + +#: wp-admin/includes/class-wp-plugins-list-table.php:619 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:485 +msgid "Enable Auto-updates" +msgstr "Inschakelen auto-updates" + +#. translators: %s: Number of plugins. +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-plugins-list-table.php:570 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:432 +msgid "Auto-updates Disabled (%s)" +msgid_plural "Auto-updates Disabled (%s)" +msgstr[0] "Auto-updates uitgeschakeld (%s)" +msgstr[1] "Auto-updates uitgeschakeld (%s)" + +#. translators: %s: Number of plugins. +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-plugins-list-table.php:562 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:424 +msgid "Auto-updates Enabled (%s)" +msgid_plural "Auto-updates Enabled (%s)" +msgstr[0] "Auto-updates ingeschakeld (%s)" +msgstr[1] "Auto-updates ingeschakeld (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:467 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:336 +msgid "Automatic Updates" +msgstr "Auto-updates" + +#: wp-admin/includes/class-wp-plugins-list-table.php:419 +#: wp-admin/plugin-editor.php:31 wp-admin/js/updates.js:1041 +msgid "No plugins are currently available." +msgstr "Er zijn op dit moment geen plugins beschikbaar." + +#: wp-admin/includes/image-edit.php:144 +msgid "Restore original image" +msgstr "Oorspronkelijke afbeelding herstellen" + +#: wp-admin/includes/class-theme-installer-skin.php:377 +#: wp-admin/includes/class-plugin-installer-skin.php:342 +msgid "The uploaded file has expired. Please go back and upload it again." +msgstr "Het geüploade bestand is verlopen. Ga terug en upload het opnieuw." + +#: wp-admin/includes/class-theme-installer-skin.php:359 +#: wp-admin/includes/class-plugin-installer-skin.php:324 +msgid "Cancel and go back" +msgstr "Afbreken en ga terug" + +#: wp-admin/includes/class-theme-installer-skin.php:348 +#: wp-admin/includes/class-plugin-installer-skin.php:313 +msgid "Replace current with uploaded" +msgstr "Vervang huidige door de geüploade" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-theme-installer-skin.php:336 +msgid "You are updating a theme. Be sure to back up your database and files first." +msgstr "Je werkt een thema bij. Zorg ervoor dat je eerst een backup van je database en bestanden maakt." + +#: wp-admin/includes/class-theme-installer-skin.php:331 +#: wp-admin/includes/class-theme-installer-skin.php:337 +#: wp-admin/includes/class-plugin-installer-skin.php:296 +#: wp-admin/includes/class-plugin-installer-skin.php:302 +#: wp-admin/update-core.php:248 +msgid "https://wordpress.org/support/article/wordpress-backups/" +msgstr "https://wordpress.org/support/article/wordpress-backups/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/class-theme-installer-skin.php:330 +msgid "You are uploading an older version of a current theme. You can continue to install the older version, but be sure to back up your database and files first." +msgstr "Je uploadt een oudere versie van een actueel thema. Je kan doorgaan met het installeren van de oudere versie, maar zorg ervoor dat je eerst een backup van je database en bestanden maakt." + +#. translators: 1: Current WordPress version, 2: Version required by the +#. uploaded theme. +#: wp-admin/includes/class-theme-installer-skin.php:315 +#: wp-admin/includes/class-theme-upgrader.php:607 +msgid "Your WordPress version is %1$s, however the uploaded theme requires %2$s." +msgstr "Je WordPress versie is %1$s, echter het geüploade thema vereist %2$s." + +#. translators: 1: Current PHP version, 2: Version required by the uploaded +#. theme. +#: wp-admin/includes/class-theme-installer-skin.php:303 +#: wp-admin/includes/class-theme-upgrader.php:597 +msgid "The PHP version on your server is %1$s, however the uploaded theme requires %2$s." +msgstr "De PHP versie op jouw server is %1$s, echter het geüploade thema vereist %2$s." + +#: wp-admin/includes/class-theme-installer-skin.php:294 +msgid "The theme cannot be updated due to the following:" +msgstr "Het thema kan vanwege het volgende niet geüpdatet worden:" + +#: wp-admin/includes/class-theme-installer-skin.php:270 +msgid "(not found)" +msgstr "(niet gevonden)" + +#: wp-admin/includes/class-theme-installer-skin.php:248 +#: wp-admin/includes/class-plugin-installer-skin.php:225 +msgid "Uploaded" +msgstr "Geüpload" + +#: wp-admin/includes/class-theme-installer-skin.php:243 +#: wp-admin/includes/class-plugin-installer-skin.php:220 +msgid "Required PHP version" +msgstr "Vereiste PHP versie" + +#: wp-admin/includes/class-theme-installer-skin.php:242 +#: wp-admin/includes/class-plugin-installer-skin.php:219 +msgid "Required WordPress version" +msgstr "Vereiste WordPress versie" + +#: wp-admin/includes/class-theme-installer-skin.php:239 +msgid "Theme name" +msgstr "Thema naam" + +#: wp-admin/includes/theme.php:1006 wp-admin/theme-install.php:395 +#: wp-admin/theme-install.php:427 +msgctxt "theme" +msgid "Cannot Install" +msgstr "Kan niet installeren" + +#: wp-admin/includes/theme.php:314 +msgid "Full Site Editing" +msgstr "Bewerking volledige site" + +#: wp-admin/includes/theme.php:304 +msgid "Block Editor Patterns" +msgstr "Blok-editor patronen" + +#: wp-admin/includes/class-plugin-upgrader.php:98 +msgid "Plugin downgraded successfully." +msgstr "Plugin downgrade met succes uitgevoerd." + +#: wp-admin/includes/class-plugin-upgrader.php:97 +msgid "Plugin downgrade failed." +msgstr "Plugin downgrade mislukt." + +#: wp-admin/includes/class-plugin-upgrader.php:96 +msgid "Downgrading the plugin…" +msgstr "De plugin downgraden…" + +#: wp-admin/includes/class-plugin-upgrader.php:90 +msgid "Updating the plugin…" +msgstr "De plugin bijwerken…" + +#: wp-admin/includes/class-plugin-upgrader.php:81 +msgid "Could not remove the current plugin." +msgstr "Kon de huidige plugin niet verwijderen." + +#: wp-admin/includes/class-plugin-upgrader.php:80 +msgid "Removing the current plugin…" +msgstr "De huidige plugin verwijderen…" + +#: wp-admin/includes/class-wp-debug-data.php:1226 +msgid "Auto-update" +msgstr "Auto-update" + +#: wp-admin/includes/class-wp-debug-data.php:991 +#: wp-admin/includes/class-wp-debug-data.php:1307 +#: wp-admin/includes/class-wp-plugins-list-table.php:1104 +#: wp-admin/themes.php:680 wp-admin/js/updates.js:2953 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:779 +msgid "Auto-updates disabled" +msgstr "Auto-updates uitgeschakeld" + +#: wp-admin/includes/class-wp-debug-data.php:989 +#: wp-admin/includes/class-wp-debug-data.php:1305 +#: wp-admin/includes/class-wp-plugins-list-table.php:1102 +#: wp-admin/themes.php:682 wp-admin/js/updates.js:2942 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:777 +msgid "Auto-updates enabled" +msgstr "Auto-updates ingeschakeld" + +#: wp-admin/includes/class-wp-debug-data.php:771 +msgid "Are pretty permalinks supported?" +msgstr "Worden pretty permalinks ondersteund?" + +#: wp-admin/includes/class-wp-debug-data.php:710 +msgid "PHP memory limit (only for admin screens)" +msgstr "PHP geheugen limiet (alleen voor beheerschermen)" + +#: wp-admin/includes/class-wp-debug-data.php:114 +msgid "Is this site discouraging search engines?" +msgstr "Ontmoedigt deze site zoekmachines?" + +#: wp-admin/includes/theme.php:329 +msgid "Wide Blocks" +msgstr "Brede blokken" + +#: wp-admin/includes/theme.php:305 +msgid "Block Editor Styles" +msgstr "Stijlen van de blok-editor" + +#: wp-admin/edit-form-comment.php:108 +msgid "Spam" +msgstr "Spam" + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:401 +msgid "Unable to write to %s file." +msgstr "Kon niet schrijven naar %s bestand." + +#. translators: %s: The options page name. +#: wp-admin/options.php:240 +msgid "Error: Options page %s not found in the allowed options list." +msgstr "Fout: Optie pagina %s niet gevonden in de toegestane optielijst." + +#: wp-admin/themes.php:303 wp-admin/import.php:64 wp-admin/users.php:277 +#: wp-admin/includes/network.php:116 wp-admin/includes/network.php:142 +msgid "Error:" +msgstr "Fout:" + +#: wp-admin/themes.php:253 wp-admin/network/themes.php:350 +#: wp-admin/network/menu.php:81 +msgctxt "theme" +msgid "Add New" +msgstr "Nieuwe toevoegen" + +#. translators: %s: web.config +#. translators: %s: .htaccess +#: wp-admin/options-permalink.php:168 wp-admin/options-permalink.php:181 +msgid "You should update your %s file now." +msgstr "Je zou nu je %s bestand moeten bijwerken." + +#: wp-admin/update-core.php:171 +msgid "This localized version contains both the translation and various other localization fixes." +msgstr "Deze gelokaliseerde versie bevat zowel de vertaling als diverse andere lokalisatie oplossingen." + +#. translators: 1: Number of issues. 2: URL to Site Health screen. +#: wp-admin/includes/dashboard.php:1878 +msgid "Take a look at the %1$d item on the Site Health screen." +msgid_plural "Take a look at the %1$d items on the Site Health screen." +msgstr[0] "Kijk naar %1$d item op het Sitediagnose scherm." +msgstr[1] "Kijk naar de %1$d items op het Sitediagnose scherm." + +#: wp-admin/includes/dashboard.php:1868 +msgid "Your site’s health is looking good, but there are still some things you can do to improve its performance and security." +msgstr "De sitediagnose ziet er goed uit, maar er zijn nog steeds een paar punten die je kunt uitvoeren om de snelheid en beveiliging te verbeteren." + +#: wp-admin/includes/dashboard.php:1866 +msgid "Great job! Your site currently passes all site health checks." +msgstr "Goed gedaan! Je site voldoet momenteel aan alle sitediagnosecontroles." + +#: wp-admin/includes/dashboard.php:1864 +msgid "Your site has critical issues that should be addressed as soon as possible to improve its performance and security." +msgstr "Je site heeft kritieke problemen die zo snel mogelijk moeten worden aangepakt om zijn prestaties en beveiliging te verbeteren." + +#. translators: %s: URL to Site Health screen. +#: wp-admin/includes/dashboard.php:1856 +msgid "Site health checks will automatically run periodically to gather information about your site. You can also visit the Site Health screen to gather information about your site now." +msgstr "Sitediagnoses zullen automatisch periodiek uitgevoerd worden om informatie over je site te verzamelen. Je kunt ook het Sitediagnose scherm bezoeken om nu informatie over je site te verzamelen." + +#: wp-admin/includes/dashboard.php:1844 +msgid "No information yet…" +msgstr "Nog geen informatie…" + +#. translators: 1: upload_max_filesize, 2: php.ini +#: wp-admin/includes/file.php:787 +msgid "The uploaded file exceeds the %1$s directive in %2$s." +msgstr "Het geüploade bestand overschreed het %1$s commando in %2$s." + +#: wp-admin/includes/class-wp-comments-list-table.php:221 +msgid "No comments found in Trash." +msgstr "Geen reacties gevonden in prullenbak." + +#. translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize +#: wp-admin/includes/import.php:87 wp-admin/includes/file.php:836 +msgid "File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s." +msgstr "Bestand is leeg. Upload iets met meer inhoud. Deze foutmelding kan ook voorkomen als uploads uitgeschakeld zijn in je %1$s of wanneer de %2$s kleiner gedefineerd is als de %3$s in je %1$s." + +#: wp-admin/includes/class-wp-site-health.php:2671 +#: wp-admin/js/site-health.js:336 +msgid "A test is unavailable" +msgstr "Een test is niet beschikbaar" + +#. translators: 1: The WordPress error message. 2: The WordPress error code. +#: wp-admin/includes/class-wp-site-health.php:1962 +#: wp-admin/includes/class-wp-site-health.php:2546 +msgid "Error: %1$s (%2$s)" +msgstr "Fout: %1$s (%2$s)" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:775 +msgid "Your site is running an outdated version of PHP (%s), which requires an update" +msgstr "Je site maakt gebruik van een verouderde versie van PHP (%s), deze vereist een update" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:764 +msgid "Your site is running an older version of PHP (%s), which should be updated" +msgstr "Je site maakt gebruik van een oudere versie van PHP (%s), deze zou geüpdatet moeten worden" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:752 +msgid "Your site is running an older version of PHP (%s)" +msgstr "Je site maakt gebruik van een oudere versie van PHP (%s)" + +#. translators: %s: The current PHP version. +#: wp-admin/includes/class-wp-site-health.php:717 +msgid "Your site is running the current version of PHP (%s)" +msgstr "Je site maakt gebruik van de huidige versie van PHP (%s)" + +#: wp-admin/includes/class-wp-media-list-table.php:247 +msgid "No media files found in Trash." +msgstr "Geen mediabestanden gevonden in prullenbak." + +#. translators: Date string for upcoming events. 1: Starting month, 2: Starting +#. day, 3: Ending month, 4: Ending day, 5: Year. +#. translators: Date string for upcoming events. 1: Starting month, 2: Starting +#. day, 3: Ending month, 4: Ending day, 5: Ending year. +#: wp-admin/includes/class-wp-community-events.php:422 +#: wp-admin/js/dashboard.js:778 +msgid "%1$s %2$d – %3$s %4$d, %5$d" +msgstr "%2$d %1$s – %4$d %3$s %5$d" + +#. translators: Upcoming events year format. See +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:417 +#: wp-admin/includes/class-wp-community-events.php:427 +#: wp-admin/js/dashboard.js:791 wp-admin/js/dashboard.js:802 +msgctxt "upcoming events year format" +msgid "Y" +msgstr "Y" + +#. translators: Upcoming events day format. See +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:414 +#: wp-admin/includes/class-wp-community-events.php:415 +#: wp-admin/includes/class-wp-community-events.php:424 +#: wp-admin/includes/class-wp-community-events.php:426 +#: wp-admin/js/dashboard.js:789 wp-admin/js/dashboard.js:790 +#: wp-admin/js/dashboard.js:799 wp-admin/js/dashboard.js:801 +msgctxt "upcoming events day format" +msgid "j" +msgstr "j" + +#. translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: +#. Ending day, 4: Year. +#: wp-admin/includes/class-wp-community-events.php:411 +#: wp-admin/js/dashboard.js:776 +msgid "%1$s %2$d–%3$d, %4$d" +msgstr "%2$d–%3$d %1$s %4$d" + +#. translators: Upcoming events month format. See +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:405 +#: wp-admin/includes/class-wp-community-events.php:406 +#: wp-admin/js/dashboard.js:788 wp-admin/js/dashboard.js:798 +#: wp-admin/js/dashboard.js:800 +msgctxt "upcoming events month format" +msgid "F" +msgstr "F" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:213 +msgid "Resend confirmation requests" +msgstr "Bevestigingsaanvragen opnieuw verzenden" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:215 +msgid "Delete requests" +msgstr "Verwijder aanvragen" + +#: wp-admin/includes/class-wp-debug-data.php:859 +msgid "Table prefix" +msgstr "Tabel voorvoegsel" + +#: wp-admin/includes/class-wp-site-health.php:2174 +msgid "PHP Default Timezone" +msgstr "PHP standaard tijdzone" + +#. translators: %s: date_default_timezone_set() +#: wp-admin/includes/class-wp-site-health.php:1084 +msgid "PHP default timezone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times." +msgstr "PHP standaard tijdzone is gewijzigd door een %s functie aanroep nadat WordPress geladen is. Dit kan onjuiste berekeningen van datums en tijden veroorzaken." + +#: wp-admin/includes/class-wp-site-health.php:1078 +msgid "PHP default timezone is invalid" +msgstr "PHP standaard tijdzone is ongeldig" + +#: wp-admin/includes/class-wp-site-health.php:1069 +msgid "PHP default timezone was configured by WordPress on loading. This is necessary for correct calculations of dates and times." +msgstr "PHP standaard tijdzone is geconfigureerd door WordPress tijdens het laden. Dit is nodig om datums en tijden juist te berekenen." + +#: wp-admin/includes/class-wp-site-health.php:1061 +msgid "PHP default timezone is valid" +msgstr "PHP standaard tijdzone is geldig" + +#. translators: %s: add_submenu_page() +#: wp-admin/includes/plugin.php:1434 +msgid "The seventh parameter passed to %s should be an integer representing menu position." +msgstr "De zevende parameter die gebruikt wordt in %s zou een integer moeten zijn die een menu positie representeert." + +#. translators: 1: WordPress version number, 2: The PHP extension name needed. +#: wp-admin/includes/update-core.php:1028 +msgid "The update cannot be installed because WordPress %1$s requires the %2$s PHP extension." +msgstr "De update kon niet worden geïnstalleerd, omdat WordPress %1$s de %2$s PHP extensie vereist." + +#: wp-admin/includes/class-wp-site-health.php:1251 +msgid "UTF8MB4 is the character set WordPress prefers for database storage because it safely supports the widest set of characters and encodings, including Emoji, enabling better support for non-English languages." +msgstr "UTF8MB4 is het karakterset dat WordPress prefereert voor database-opslag omdat het veilig het grootste aanbod van karaktersets en coderingen, inclusief Emoji, ondersteunt, wat betere support voor niet Engelse talen betekent." + +#: wp-admin/privacy.php:65 +msgid "https://wordpress.org/about/stats/" +msgstr "https://nl.wordpress.org/about/stats/" + +#: wp-admin/export.php:57 +msgid "Documentation on Export" +msgstr "Documentatie over exporteren" + +#: wp-admin/plugin-install.php:109 +msgid "Documentation on Installing Plugins" +msgstr "Documentatie over plugins installeren" + +#: wp-admin/edit.php:309 +msgid "Documentation on Managing Pages" +msgstr "Documentatie over het beheren van pagina's" + +#: wp-admin/edit.php:284 +msgid "Documentation on Managing Posts" +msgstr "Documentatie over het beheren van berichten" + +#: wp-admin/options-discussion.php:31 +msgid "Documentation on Discussion Settings" +msgstr "Documentatie over discussie-instellingen" + +#: wp-admin/theme-install.php:131 +msgid "Documentation on Adding New Themes" +msgstr "Documentatie over het toevoegen van nieuwe thema's" + +#: wp-admin/media-new.php:60 +msgid "Documentation on Uploading Media Files" +msgstr "Documentatie over het uploaden van media bestanden" + +#: wp-admin/users.php:75 +msgid "Descriptions of Roles and Capabilities" +msgstr "Beschrijvingen van rollen en rechten" + +#: wp-admin/users.php:74 +msgid "Documentation on Managing Users" +msgstr "Documentatie over het beheren van gebruikers" + +#: wp-admin/user-edit.php:327 +msgid "More information" +msgstr "Meer informatie" + +#: wp-admin/user-edit.php:71 +msgid "Documentation on User Profiles" +msgstr "Documentatie over gebruikersprofielen" + +#: wp-admin/options-media.php:37 +msgid "Documentation on Media Settings" +msgstr "Documentatie over media-instellingen" + +#: wp-admin/widgets.php:83 +msgid "Documentation on Widgets" +msgstr "Documentatie over Widgets" + +#: wp-admin/import.php:31 +msgid "Documentation on Import" +msgstr "Documentatie over Importeren" + +#: wp-admin/tools.php:55 +msgid "Documentation on Tools" +msgstr "Documentatie over Gereedschap" + +#: wp-admin/options.php:351 +msgid "This page allows direct access to your site settings. You can break things here. Please be cautious!" +msgstr "Deze pagina geeft je directe toegang tot je site instellingen. Hier kun je site breken, dus pas op wat je doet!" + +#. translators: %s: The option/setting. +#: wp-admin/options.php:299 +msgid "The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/" +msgstr "De %s instelling is unregistered. Unregistered instellingen zijn verouderd. Zie https://developer.wordpress.org/plugins/settings/settings-api/" + +#: wp-admin/edit-form-advanced.php:380 +msgid "Format — Post Formats designate how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. Learn more about each post format." +msgstr "Bericht format - Dit geeft aan hoe je thema getoond wordt in een specifiek bericht. Voorbeeld, je kunt een standaard bericht hebben met een titel en paragrafen, of een korte aside wat de titel weglaat en een korte tekst heeft. Bezoek de Codex voor Beschrijvingen van elk bericht format." + +#: wp-admin/edit-form-advanced.php:337 +msgid "Documentation on Editing Pages" +msgstr "Documentatie over het bewerken van Pagina's" + +#: wp-admin/edit-form-advanced.php:336 +msgid "Documentation on Adding New Pages" +msgstr "Documentatie over het toevoegen van nieuwe Pagina's" + +#: wp-admin/edit-form-advanced.php:319 +msgid "Documentation on Writing and Editing Posts" +msgstr "Documentatie over het schrijven en bewerken van Berichten" + +#: wp-admin/upload.php:75 wp-admin/upload.php:252 +msgid "Documentation on Media Library" +msgstr "Documentatie over de Mediabibliotheek" + +#: wp-admin/revision.php:156 +msgid "Revisions Management" +msgstr "Revisie Management" + +#: wp-admin/media.php:96 wp-admin/edit-form-advanced.php:355 +msgid "Documentation on Edit Media" +msgstr "Documentatie over het bewerken van Media" + +#: wp-admin/edit-comments.php:196 +msgid "Documentation on Keyboard Shortcuts" +msgstr "Documentatie over sneltoetsen" + +#: wp-admin/edit-comments.php:195 +msgid "Documentation on Comment Spam" +msgstr "Documentatie over Reactie spam" + +#: wp-admin/plugins.php:587 +msgid "Documentation on Managing Plugins" +msgstr "Documentatie over het beheren van Plugins" + +#: wp-admin/index.php:111 +msgid "Documentation on Dashboard" +msgstr "Documentatie over het Dashboard" + +#: wp-admin/user-new.php:294 +msgid "Documentation on Adding New Users" +msgstr "Documentatie over het toevoegen van nieuwe Gebruikers" + +#. translators: %s: URL to Site Health Status page. +#: wp-admin/site-health-info.php:90 +msgid "This page can show you every detail about the configuration of your WordPress website. For any improvements that could be made, see the Site Health Status page." +msgstr "Deze pagina kan je elk detail over de configuratie van je WordPress site tonen. Als we iets zien wat verbeterd kan worden, laten we je dat weten op de Status sitediagnose pagina." + +#: wp-admin/includes/dashboard.php:1846 wp-admin/site-health-info.php:47 +#: wp-admin/site-health.php:52 +msgid "Results are still loading…" +msgstr "Resultaten worden nog geladen…" + +#: wp-admin/options-permalink.php:413 +msgid "Documentation on Nginx configuration." +msgstr "Documentatie over Nginx configuraties." + +#: wp-admin/options-permalink.php:212 +msgid "https://wordpress.org/support/article/using-permalinks/" +msgstr "https://wordpress.org/support/article/using-permalinks/" + +#: wp-admin/options-permalink.php:61 +msgid "Documentation on Using Permalinks" +msgstr "Documentatie over het gebruik van Permalinks" + +#: wp-admin/options-permalink.php:60 +msgid "Documentation on Permalinks Settings" +msgstr "Documentatie over Permalinks instellingen" + +#: wp-admin/update-core.php:969 +msgid "Documentation on Updating WordPress" +msgstr "Documentatie over het Bijwerken van WordPress" + +#: wp-admin/nav-menus.php:658 +msgid "Documentation on Menus" +msgstr "Documentatie over Menu's" + +#: wp-admin/plugin-editor.php:143 +msgid "Documentation on Writing Plugins" +msgstr "Documentatie over het schrijven van Plugins" + +#: wp-admin/plugin-editor.php:142 +msgid "Documentation on Editing Plugins" +msgstr "Documentatie over het bijwerken van Plugins" + +#: wp-admin/theme-editor.php:54 +msgid "Documentation on Template Tags" +msgstr "Documentatie over Template Tags" + +#: wp-admin/theme-editor.php:53 +msgid "Documentation on Editing Files" +msgstr "Documentation on bewerken van bestanden" + +#: wp-admin/theme-editor.php:52 wp-admin/themes.php:206 +msgid "Documentation on Using Themes" +msgstr "Documentatie over hoe je Thema's kunt gebruiken" + +#: wp-admin/theme-editor.php:51 +msgid "Documentation on Theme Development" +msgstr "Documentatie over Theme Development" + +#: wp-admin/comment.php:70 wp-admin/edit-comments.php:194 +msgid "Documentation on Comments" +msgstr "Documentatie over Reacties" + +#: wp-admin/options-general.php:377 +msgid "Documentation on date and time formatting." +msgstr "Documentatie over opmaak van datum en tijd." + +#. translators: %s: UTC time. +#: wp-admin/options-general.php:246 +msgid "Universal time is %s." +msgstr "UTC tijd is %s." + +#. translators: %s: UTC abbreviation +#: wp-admin/options-general.php:235 +msgid "Choose either a city in the same timezone as you or a %s (Coordinated Universal Time) time offset." +msgstr "Kies een stad of een tijdzone die bij je past of een %s (Coordinated Universal Time) time offset." + +#: wp-admin/options-general.php:111 +msgid "Administration Email Address" +msgstr "Administratie e-mailadres" + +#: wp-admin/options-general.php:100 +msgid "https://wordpress.org/support/article/giving-wordpress-its-own-directory/" +msgstr "https://wordpress.org/support/article/giving-wordpress-its-own-directory/" + +#: wp-admin/options-general.php:48 +msgid "Documentation on General Settings" +msgstr "Documentatie over Algemene instellingen" + +#: wp-admin/includes/dashboard.php:1957 +msgid "https://wordpress.org/support/article/first-steps-with-wordpress/" +msgstr "https://wordpress.org/support/article/first-steps-with-wordpress/" + +#: wp-admin/includes/file.php:324 wp-admin/theme-editor.php:323 +#: wp-admin/plugin-editor.php:296 wp-admin/options-permalink.php:366 +#: wp-admin/options-permalink.php:391 wp-admin/options-permalink.php:424 +msgid "https://wordpress.org/support/article/changing-file-permissions/" +msgstr "https://wordpress.org/support/article/changing-file-permissions/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/file.php:323 wp-admin/theme-editor.php:322 +#: wp-admin/plugin-editor.php:295 +msgid "You need to make this file writable before you can save your changes. See Changing File Permissions for more information." +msgstr "Je moet dit bestand beschrijfbaar maken voordat je je wijzigingen kunt opslaan. Kijk bij Changing File Permissions voor meer informatie." + +#: wp-admin/includes/ajax-actions.php:2434 +msgid "Upload failed. Please reload and try again." +msgstr "Het uploaden is niet gelukt. Ververs het scherm en probeer het nog eens." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:142 +msgid "Data erasure has failed." +msgstr "Het wissen van de gegevens is mislukt." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:67 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:141 +msgid "Erasure completed." +msgstr "Wissen afgerond." + +#: wp-admin/includes/image.php:161 +msgid "The attached file cannot be found." +msgstr "Het toegevoegde bestand kon niet worden gevonden." + +#: wp-admin/includes/template.php:2218 +msgctxt "page label" +msgid "Privacy Policy Page" +msgstr "Privacybeleidspagina" + +#: wp-admin/includes/template.php:2213 +msgctxt "page label" +msgid "Posts Page" +msgstr "Berichtenpagina" + +#: wp-admin/includes/template.php:2209 +msgctxt "page label" +msgid "Front Page" +msgstr "Voorpagina" + +#: wp-admin/includes/template.php:2200 +msgctxt "post status" +msgid "Sticky" +msgstr "Sticky" + +#: wp-admin/includes/template.php:2192 +msgctxt "post status" +msgid "Customization Draft" +msgstr "Customization concept" + +#: wp-admin/includes/template.php:2178 +msgctxt "post status" +msgid "Password protected" +msgstr "Beschermd met wachtwoord" + +#. translators: %s: The name of the late cron event. +#: wp-admin/includes/class-wp-site-health.php:1661 +msgid "The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." +msgstr "Het geplande evenement, %s, is nog niet uitgevoerd. Je site werkt nog steeds, maar dit zou er op kunnen duiden dat geplande berichten of auto-updates niet werken zoals de bedoeling is." + +#: wp-admin/includes/class-wp-site-health.php:1655 +msgid "A scheduled event is late" +msgstr "Een gepland event is laat" + +#: wp-admin/includes/class-wp-site-health.php:1509 +msgid "An HTTPS connection is a more secure way of browsing the web. Many services now have HTTPS as a requirement. HTTPS allows you to take advantage of new features that can increase site speed, improve search rankings, and gain the trust of your visitors by helping to protect their online privacy." +msgstr "Een HTTPS-verbinding is een veiligere manier om te surfen op het web. Veel diensten vereisen tegenwoordig HTTPS. Met HTTPS kun je gebruik maken van nieuwe functies die je site sneller kunnen maken, je zoekmachine-positie kunnen verbeteren, en het vertrouwen winnen van je bezoekers door hun privacy te beschermen." + +#. translators: %s: The current version of WordPress installed on this site. +#: wp-admin/includes/class-wp-site-health.php:321 +msgid "Your version of WordPress (%s) is up to date" +msgstr "Je WordPress versie (%s) is up-to-date" + +#: wp-admin/includes/ms.php:1158 wp-admin/network/site-new.php:32 +#: wp-admin/network/sites.php:45 +msgid "Documentation on Site Management" +msgstr "Documentatie over Site Management" + +#: wp-admin/includes/meta-boxes.php:807 +msgid "https://wordpress.org/support/article/introduction-to-blogging/#managing-comments" +msgstr "https://wordpress.org/support/article/introduction-to-blogging/#managing-comments" + +#: wp-admin/includes/meta-boxes.php:783 +msgid "https://wordpress.org/support/article/custom-fields/" +msgstr "https://wordpress.org/support/article/custom-fields/" + +#: wp-admin/includes/meta-boxes.php:746 +msgid "https://wordpress.org/support/article/introduction-to-blogging/#comments" +msgstr "https://wordpress.org/support/article/introduction-to-blogging/#comments" + +#. translators: Post date information. %s: Date on which the post is to be +#. published. +#: wp-admin/includes/meta-boxes.php:236 +msgid "Publish on: %s" +msgstr "Publiceer op: %s" + +#. translators: Post date information. %s: Date on which the post is to be +#. published. +#: wp-admin/includes/meta-boxes.php:233 +msgid "Schedule for: %s" +msgstr "Plan in voor: %s" + +#. translators: Post date information. %s: Date on which the post was +#. published. +#: wp-admin/includes/meta-boxes.php:228 +msgid "Published on: %s" +msgstr "Gepubliceerd op: %s" + +#. translators: Post date information. %s: Date on which the post is currently +#. scheduled to be published. +#: wp-admin/includes/meta-boxes.php:225 +msgid "Scheduled for: %s" +msgstr "Gepland voor: %s" + +#. translators: Publish box time format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/meta-boxes.php:220 wp-admin/includes/meta-boxes.php:412 +#: wp-admin/edit-form-advanced.php:177 wp-admin/edit-form-comment.php:130 +msgctxt "publish box time format" +msgid "H:i" +msgstr "H:i" + +#. translators: Publish box date format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/meta-boxes.php:218 wp-admin/includes/meta-boxes.php:410 +#: wp-admin/edit-form-advanced.php:175 wp-admin/edit-form-comment.php:128 +msgctxt "publish box date format" +msgid "M j, Y" +msgstr "j M Y" + +#. translators: 1: Marker. +#: wp-admin/includes/misc.php:136 +msgid "" +"The directives (lines) between \"BEGIN %1$s\" and \"END %1$s\" are\n" +"dynamically generated, and should only be modified via WordPress filters.\n" +"Any changes to the directives between these markers will be overwritten." +msgstr "" +"De richtlijnen (regels) tussen \"BEGIN %1$s\" en \"END %1$s\" worden\n" +"dynamisch gegenereerd en zouden alleen aangepast mogen worden via WordPress filters.\n" +"Alle wijzigingen aan de richtlijnen tussen deze markeringen worden overschreven." + +#: wp-admin/includes/image-edit.php:67 +msgid "Rotate right" +msgstr "Roteer naar rechts" + +#: wp-admin/includes/image-edit.php:66 +msgid "Rotate left" +msgstr "Roteer naar links" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:147 +msgid "All automatic updates are disabled." +msgstr "Alle auto-updates zijn uitgeschakeld." + +#: wp-admin/includes/class-wp-debug-data.php:871 +msgid "Database collation" +msgstr "Database collation" + +#: wp-admin/includes/class-wp-debug-data.php:865 +msgid "Database charset" +msgstr "Database charset" + +#: wp-admin/includes/class-wp-debug-data.php:160 +msgid "Inactive Themes" +msgstr "Inactieve thema's" + +#: wp-admin/includes/class-wp-debug-data.php:155 +msgid "Parent Theme" +msgstr "Hoofdthema" + +#. translators: %s: wp-content directory name. +#: wp-admin/includes/class-wp-debug-data.php:143 +#: wp-admin/includes/class-wp-plugins-list-table.php:668 +msgid "Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins." +msgstr "\"Drop-ins\" zijn losse bestanden in de folder %s, die WordPress-functies verbeteren of aanpassen op manieren die niet mogelijk zijn voor gewone WordPress-plugins." + +#. translators: Description for the About section in a personal data export. +#: wp-admin/includes/privacy-tools.php:361 +msgctxt "personal data group description" +msgid "Overview of export report." +msgstr "Overzicht van export rapport." + +#: wp-admin/options-writing.php:52 +msgid "Documentation on Writing Settings" +msgstr "Documentatie over Schrijven instellingen" + +#: wp-admin/edit-tags.php:311 +msgid "Documentation on Tags" +msgstr "Documentatie over Tags" + +#: wp-admin/edit-tags.php:307 +msgid "Documentation on Categories" +msgstr "Documentatie over Categorieën" + +#. translators: %s: Documentation URL. +#: wp-admin/options-reading.php:170 +msgid "Your theme determines how content is displayed in browsers. Learn more about feeds." +msgstr "Je thema bepaalt hoe inhoud wordt getoond in browsers. Meer informatie over feeds." + +#: wp-admin/options-reading.php:160 wp-admin/options-reading.php:161 +msgid "For each post in a feed, include" +msgstr "Voor elk bericht in een feed, voeg toe" + +#: wp-admin/options-reading.php:144 +msgid "Warning: these pages should not be the same as your Privacy Policy page!" +msgstr "Waarschuwing: deze pagina’s moeten niet hetzelfde zijn als je privacybeleid pagina!" + +#: wp-admin/options-reading.php:52 +msgid "Documentation on Reading Settings" +msgstr "Documentatie over de Lezen instellingen" + +#: wp-admin/options-reading.php:34 wp-admin/options-reading.php:171 +msgid "https://wordpress.org/support/article/wordpress-feeds/" +msgstr "https://wordpress.org/support/article/wordpress-feeds/" + +#. translators: %s: Site title. +#: wp-admin/ms-delete-site.php:92 +msgid "[%s] Delete My Site" +msgstr "[%s] Verwijder mijn site" + +#: wp-admin/options-discussion.php:58 +msgid "Allow people to submit comments on new posts" +msgstr "Sta toe dat mensen kunnen reageren op nieuwe berichten." + +#: wp-admin/options-discussion.php:46 wp-admin/options-discussion.php:47 +msgid "Default post settings" +msgstr "Standaard bericht-instellingen" + +#. translators: %s: Gravatar URL. +#: wp-admin/user-edit.php:590 +msgid "You can change your profile picture on Gravatar." +msgstr "Je kan je profielafbeelding wijzigen op Gravatar." + +#: wp-admin/plugins.php:704 +msgid "Plugin resumed." +msgstr "Plugin hervat." + +#: wp-admin/plugins.php:700 +msgid "Selected plugins deactivated." +msgstr "Geselecteerde plugins gedeactiveerd." + +#: wp-admin/plugins.php:698 +msgid "Plugin deactivated." +msgstr "Plugin gedeactiveerd." + +#: wp-admin/plugins.php:696 +msgid "Selected plugins activated." +msgstr "Geselecteerde plugins geactiveerd." + +#: wp-admin/plugins.php:694 +msgid "Plugin activated." +msgstr "Plugin geactiveerd." + +#: wp-admin/plugins.php:687 +msgid "The selected plugins have been deleted." +msgstr "De geselecteerde plugins zijn verwijderd." + +#: wp-admin/plugins.php:685 +msgid "The selected plugin has been deleted." +msgstr "De geselecteerde plugin is verwijderd." + +#. translators: 1: Plugin file, 2: Error message. +#: wp-admin/plugins.php:611 +msgid "The plugin %1$s has been deactivated due to an error: %2$s" +msgstr "De plugin %1$s is gedeactiveerd als gevolg van een fout: %2$s" + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/theme-editor.php:367 +msgid "If you need to tweak more than your theme’s CSS, you might want to try making a child theme." +msgstr "Als je meer dan de CSS van je thema wilt wijzigen, probeer dan een subthema te maken." + +#: wp-admin/theme-editor.php:359 +msgid "You appear to be making direct edits to your theme in the WordPress dashboard. We recommend that you don’t! Editing your theme directly could break your site and your changes may be lost in future updates." +msgstr "Het lijkt er op dat je directe wijzigingen maakt aan je thema vanuit het WordPress dashboard. We raden je aan dit niet te doen! Het direct aanpassen van je thema kan je site beschadigen en je wijzigingen kunnen verloren gaan met toekomstige updates." + +#. translators: Maximum number of words used in a preview of a draft on the +#. dashboard. +#: wp-admin/includes/dashboard.php:619 +msgctxt "draft_length" +msgid "10" +msgstr "10" + +#: wp-admin/includes/file.php:478 wp-admin/theme-editor.php:278 +#: wp-admin/plugin-editor.php:109 +msgid "File does not exist! Please double check the name and try again." +msgstr "Bestand bestaat niet! Controleer de naam goed en probeer opnieuw." + +#. translators: 1: $image, 2: WP_Image_Editor +#: wp-admin/includes/image-edit.php:286 wp-admin/includes/image-edit.php:355 +#: wp-admin/includes/image-edit.php:515 +msgid "%1$s needs to be a %2$s object." +msgstr "%1$s moet een %2$s object zijn." + +#. translators: %s: Recovery Mode exit link. +#: wp-admin/includes/update.php:1004 +msgid "You are in recovery mode. This means there may be an error with a theme or plugin. To exit recovery mode, log out or use the Exit button. Exit Recovery Mode" +msgstr "Je bevindt je in herstel mode. Dit betekent dat er een probleem kan zijn met een thema of plugin. Om herstel mode te verlaten, log uit of gebruik de sluit knop. Sluit herstel mode" + +#: wp-admin/about.php:191 +msgid "Improvements for everyone" +msgstr "Verbeteringen voor iedereen" + +#. translators: Tab heading for Site Health Info page. +#: wp-admin/site-health-info.php:62 wp-admin/site-health.php:67 +msgctxt "Site Health" +msgid "Info" +msgstr "Informatie" + +#. translators: Tab heading for Site Health Status page. +#: wp-admin/site-health-info.php:55 wp-admin/site-health.php:60 +msgctxt "Site Health" +msgid "Status" +msgstr "Status" + +#: wp-admin/includes/class-wp-debug-data.php:456 +msgid "Themes directory location" +msgstr "Locatie thema's map" + +#: wp-admin/includes/class-wp-debug-data.php:120 +msgctxt "comment status" +msgid "Closed" +msgstr "Gesloten" + +#. translators: %s: Number of critical issues found. +#: wp-admin/site-health.php:105 wp-admin/js/site-health.js:151 +msgid "%s critical issue" +msgid_plural "%s critical issues" +msgstr[0] "%s kritiek probleem" +msgstr[1] "%s kritieke problemen" + +#: wp-admin/update-core.php:249 +msgid "https://wordpress.org/support/article/updating-wordpress/" +msgstr "https://wordpress.org/support/article/updating-wordpress/" + +#: wp-admin/includes/class-wp-site-health.php:1403 +msgid "Get help resolving this issue." +msgstr "Krijg hulp met het oplossen van dit probleem." + +#. translators: 1: Name of the library, 2: Number of version. +#: wp-admin/includes/class-wp-site-health.php:1322 +#: wp-admin/includes/class-wp-site-health.php:1338 +msgid "WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator." +msgstr "Ondersteuning van utf8mb4 in WordPress vereist MySQL client library (%1$s) versie %2$s of nieuwer. Neem contact op met je server beheerder." + +#. translators: %s: Version number. +#: wp-admin/includes/class-wp-site-health.php:1287 +msgid "WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator." +msgstr "Ondersteuning van utf8mb4 in WordPress vereist MariaDB versie %s of nieuwer. Neem contact op met je server beheerder." + +#. translators: %s: Version number. +#: wp-admin/includes/class-wp-site-health.php:1267 +msgid "WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator." +msgstr "Ondersteuning van utf8mb4 in WordPress vereist MySQL versie %s of nieuwer. Neem contact op met je server beheerder." + +#: wp-admin/includes/class-wp-site-health.php:1166 +msgid "Learn more about what WordPress requires to run." +msgstr "Meer informatie over wat WordPress nodig heeft om te draaien." + +#. translators: Localized version of WordPress requirements if one exists. +#: wp-admin/includes/class-wp-site-health.php:1165 +msgid "https://wordpress.org/about/requirements/" +msgstr "https://wordpress.org/about/requirements/" + +#: wp-admin/includes/class-wp-site-health.php:1160 +msgid "The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings." +msgstr "De SQL server is software vereist voor de database die WordPress gebruikt om al je site inhoud en instellingen op te slaan." + +#: wp-admin/includes/class-wp-site-health.php:840 +msgid "PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator." +msgstr "PHP modules voeren de meeste taken op de server uit die je site laten werken. Elke wijzigingen aan deze, moeten gemaakt worden door je server beheerder." + +#: wp-admin/includes/class-wp-site-health.php:494 +msgid "Manage your themes" +msgstr "Thema's beheren" + +#: wp-admin/includes/class-wp-site-health.php:461 +msgid "Manage inactive plugins" +msgstr "Inactieve plugins beheren" + +#: wp-admin/includes/class-wp-site-health.php:412 +msgid "Update your plugins" +msgstr "Plugins bijwerken" + +#: wp-admin/includes/class-wp-site-health.php:361 +msgid "Manage your plugins" +msgstr "Plugins beheren" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:332 +msgid "View Privacy Policy Guide." +msgstr "Privacybeleid gids bekijken." + +#: wp-admin/includes/class-wp-debug-data.php:76 +msgid "User Language" +msgstr "Gebruikertaal" + +#. translators: 1: WP_DEBUG_DISPLAY, 2: WP_DEBUG +#: wp-admin/includes/class-wp-site-health.php:1478 +msgid "The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site." +msgstr "De waarde, %1$s, is ingeschakeld door %2$s of is toegevoegd in je configuratiebestand. Dit zorgt er voor dat foutmeldingen op de front-end van de site worden getoond." + +#. translators: Background update finished notification email subject. %s: Site +#. title. +#: wp-admin/includes/class-wp-automatic-updater.php:1345 +msgid "[%s] Background Update Finished" +msgstr "[%s] Achtergrond update gereed" + +#. translators: Background update failed notification email subject. %s: Site +#. title. +#: wp-admin/includes/class-wp-automatic-updater.php:1342 +msgid "[%s] Background Update Failed" +msgstr "[%s] Achtergrond update mislukt" + +#: wp-admin/plugins.php:635 +msgid "Plugin could not be resumed because it triggered a fatal error." +msgstr "Plugin kon niet hervat worden, omdat deze een fatale fout veroorzaakte." + +#: wp-admin/includes/class-wp-site-health.php:606 +#: wp-admin/includes/class-wp-site-health.php:652 +msgid "You should remove inactive themes" +msgstr "Je zou inactieve thema's moeten verwijderen" + +#: wp-admin/includes/class-wp-site-health.php:581 +msgid "Your site has 1 installed theme, and it is up to date." +msgstr "Je site heeft één thema geïnstalleerd en is up-to-date." + +#: wp-admin/includes/class-wp-site-health.php:418 +msgid "Your site has 1 active plugin, and it is up to date." +msgstr "Je site heeft 1 actieve plugin en is up-to-date." + +#: wp-admin/site-health.php:126 +msgid "Passed tests" +msgstr "Geslaagde tests" + +#: wp-admin/site-health.php:20 +msgid "Sorry, you are not allowed to access site health information." +msgstr "Je hebt geen toegang tot de sitediagnose informatie." + +#: wp-admin/site-health-info.php:100 +msgid "Copy site info to clipboard" +msgstr "Kopieer site informatie naar klembord" + +#: wp-admin/site-health-info.php:94 +msgid "If you want to export a handy list of all the information on this page, you can use the button below to copy it to the clipboard. You can then paste it in a text file and save it to your device, or paste it in an email exchange with a support engineer or theme/plugin developer for example." +msgstr "Als je een handige lijst met alle informatie op deze pagina wil exporteren, kan je de onderstaande knop gebruiken om deze naar het klembord te kopiëren. Je kan het vervolgens in een tekstbestand plakken en opslaan op je harde schijf of het in een e-mail uitwisseling plakken met bijvoorbeeld een supportmedewerker of een ontwikkelaar van een thema/plugin." + +#: wp-admin/site-health-info.php:71 wp-admin/site-health.php:76 +msgid "The Site Health check requires JavaScript." +msgstr "De sitediagnose vereist JavaScript." + +#: wp-admin/site-health-info.php:15 +msgid "Sorry, you are not allowed to access the debug data." +msgstr "Je hebt geen rechten om de foutopsporingsgegevens te benaderen." + +#: wp-admin/site-health-info.php:12 wp-admin/site-health-info.php:84 +msgid "Site Health Info" +msgstr "Informatie sitediagnose" + +#: wp-admin/update-core.php:501 wp-admin/update-core.php:680 +msgid "This update doesn’t work with your version of PHP." +msgstr "Deze update werkt niet met je PHP versie." + +#: wp-admin/includes/class-wp-posts-list-table.php:508 +msgid "All formats" +msgstr "Alle formaten" + +#: wp-admin/includes/class-wp-posts-list-table.php:506 +msgid "Filter by post format" +msgstr "Op berichtformat filteren" + +#: wp-admin/includes/plugin.php:2484 +msgid "Go to the Plugins screen" +msgstr "Ga naar het plugins scherm" + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1361 +msgid "The authenticity of %s could not be verified." +msgstr "De authenticiteit van %s kon niet geverifieerd worden." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1313 +msgid "The authenticity of %s could not be verified as no signature was found." +msgstr "De authenticiteit van %s kon niet geverifieerd worden, omdat er geen ondertekening gevonden is." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1240 wp-admin/includes/file.php:1260 +#: wp-admin/includes/file.php:1294 +msgid "The authenticity of %s could not be verified as signature verification is unavailable on this system." +msgstr "De authenticiteit van %s kon niet geverifieerd worden, omdat verificatie van ondertekening niet beschikbaar is op dit systeem." + +#. translators: %s: Eraser friendly name. +#: wp-admin/includes/ajax-actions.php:5028 +msgid "Eraser callback is not valid: %s." +msgstr "De wisser callback is ongeldig: %s." + +#. translators: %s: Eraser friendly name. +#: wp-admin/includes/ajax-actions.php:5018 +msgid "Eraser does not include a callback: %s." +msgstr "De wisser heeft geen callback toegevoegd: %s." + +#: wp-admin/includes/ajax-actions.php:4740 +#: wp-admin/includes/ajax-actions.php:4931 +msgid "Sorry, you are not allowed to perform this action." +msgstr "Je hebt geen toestemming deze actie uit te voeren." + +#. translators: 1: Name of the constant used. 2: List of allowed hostnames. +#: wp-admin/includes/class-wp-site-health.php:1888 +msgid "HTTP requests have been blocked by the %1$s constant, with some allowed hosts: %2$s." +msgstr "HTTP aanvragen zijn geblokkeerd door de %1$s constante, bij sommige toegestane hosts: %2$s." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health.php:1873 +msgid "HTTP requests have been blocked by the %s constant, with no allowed hosts." +msgstr "HTTP requests zijn geblokkeerd door de %s constante zonder gewhiteliste hosts." + +#. translators: 1: The name of the drop-in. 2: The name of the database engine. +#: wp-admin/includes/class-wp-site-health.php:1214 +msgid "You are using a %1$s drop-in which might mean that a %2$s database is not being used." +msgstr "Je gebruikt een %1$s drop-in wat mogelijk inhoud dat een %2$s database niet wordt gebruikt." + +#. translators: Localized team handbook, if one exists. +#: wp-admin/includes/class-wp-site-health.php:845 +msgid "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions" +msgstr "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions" + +#. translators: 1: Link to the hosting group page about recommended PHP +#. modules. 2: Additional link attributes. 3: Accessibility text. +#: wp-admin/includes/class-wp-site-health.php:843 +msgid "The WordPress Hosting Team maintains a list of those modules, both recommended and required, in the team handbook%3$s." +msgstr "Het WordPress Hosting Team onderhoudt een lijst van deze modules, zowel de aanbevolen als vereiste, in het teamhandboek%3$s." + +#: wp-admin/includes/class-wp-site-health.php:250 +#: wp-admin/includes/class-wp-site-health.php:722 +#: wp-admin/includes/class-wp-site-health.php:835 +#: wp-admin/includes/class-wp-site-health.php:1064 +#: wp-admin/includes/class-wp-site-health.php:1105 +#: wp-admin/includes/class-wp-site-health.php:1155 +#: wp-admin/includes/class-wp-site-health.php:1246 +#: wp-admin/includes/class-wp-site-health.php:1613 +#: wp-admin/includes/class-wp-site-health.php:1799 +#: wp-admin/includes/class-wp-site-health.php:1842 +#: wp-admin/includes/class-wp-site-health.php:1913 +#: wp-admin/includes/class-wp-site-health.php:2016 +msgid "Performance" +msgstr "Performance" + +#. translators: 1: The amount of inactive themes. 2: The default theme for +#. WordPress. 3: The currently active theme. +#: wp-admin/includes/class-wp-site-health.php:674 +msgid "Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgid_plural "Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgstr[0] "Je site heeft %1$d inactief thema, anders dan %2$s, het standaard WordPress thema, en %3$s, je actieve thema." +msgstr[1] "Je site heeft %1$d inactieve thema's, anders dan %2$s, het standaard WordPress thema, en %3$s, je actieve thema." + +#: wp-admin/includes/class-wp-site-health.php:667 +#: wp-admin/includes/class-wp-site-health.php:683 +msgid "We recommend removing any unused themes to enhance your site’s security." +msgstr "We raden aan om ongebruikte thema's te verwijderen om de beveiliging van je site te verbeteren." + +#. translators: 1: The amount of inactive themes. 2: The currently active +#. theme. +#: wp-admin/includes/class-wp-site-health.php:659 +msgid "Your site has %1$d inactive theme, other than %2$s, your active theme." +msgid_plural "Your site has %1$d inactive themes, other than %2$s, your active theme." +msgstr[0] "Je site heeft %1$d inactief thema, anders dan %2$s, je actieve thema." +msgstr[1] "Je site heeft %1$d inactieve thema's, anders dan %2$s, je actieve thema." + +#. translators: %d: The number of inactive themes. +#: wp-admin/includes/class-wp-site-health.php:613 +#: wp-admin/includes/class-wp-site-health.php:632 +msgid "Your site has %d inactive theme." +msgid_plural "Your site has %d inactive themes." +msgstr[0] "Je site heeft %d inactief thema." +msgstr[1] "Je site heeft %d inactieve thema's." + +#: wp-admin/includes/class-wp-site-health.php:455 +msgid "Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it." +msgstr "Inactieve plugins zijn een uitdagend doelwit voor aanvallers. Als je een plugin niet gaat gebruiken, raden we aan deze te verwijderen." + +#. translators: %d: The number of inactive plugins. +#: wp-admin/includes/class-wp-site-health.php:448 +msgid "Your site has %d inactive plugin." +msgid_plural "Your site has %d inactive plugins." +msgstr[0] "Je site heeft %d inactieve plugin." +msgstr[1] "Je site heeft %d inactieve plugins." + +#: wp-admin/includes/class-wp-site-health.php:311 +#: wp-admin/includes/class-wp-site-health.php:351 +#: wp-admin/includes/class-wp-site-health.php:484 +#: wp-admin/includes/class-wp-site-health.php:779 +#: wp-admin/includes/class-wp-site-health.php:1195 +#: wp-admin/includes/class-wp-site-health.php:1361 +#: wp-admin/includes/class-wp-site-health.php:1430 +#: wp-admin/includes/class-wp-site-health.php:1504 +#: wp-admin/includes/class-wp-site-health.php:1567 +#: wp-admin/includes/class-wp-site-health.php:1686 +#: wp-admin/includes/class-wp-site-health.php:1756 +#: wp-admin/includes/class-wp-site-health.php:2094 +msgid "Security" +msgstr "Beveiliging" + +#: wp-admin/erase-personal-data.php:43 +msgid "Erase personal data list" +msgstr "Wis persoonlijke gegevenslijst" + +#: wp-admin/erase-personal-data.php:42 +msgid "Erase personal data list navigation" +msgstr "Wis persoonlijke gegevenslijst navigatie" + +#: wp-admin/erase-personal-data.php:41 +msgid "Filter erase personal data list" +msgstr "Filter wis persoonlijke gegevenslijst" + +#: wp-admin/export-personal-data.php:43 +msgid "Export personal data list" +msgstr "Persoonlijke data lijst exporteren" + +#: wp-admin/export-personal-data.php:42 +msgid "Export personal data list navigation" +msgstr "Persoonlijke data lijst navigatie exporteren" + +#: wp-admin/export-personal-data.php:41 +msgid "Filter export personal data list" +msgstr "Persoonlijke data lijst filter exporteren" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:564 +#: wp-admin/includes/plugin-install.php:876 +msgctxt "plugin" +msgid "Cannot Update" +msgstr "Kan niet updaten" + +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number 5: URL to Update PHP page. +#: wp-admin/includes/update.php:523 +msgid "There is a new version of %1$s available, but it doesn’t work with your version of PHP. View version %4$s details or learn more about updating PHP." +msgstr "Er is een nieuwe versie van %1$s beschikbaar, maar deze werkt niet met je PHP versie. Versie %4$s details bekijken of meer informatie over het bijwerken van PHP." + +#: wp-admin/includes/class-wp-plugins-list-table.php:1077 +msgid "This plugin failed to load properly and is paused during recovery mode." +msgstr "Deze plugin kon niet juist geladen worden en is gepauzeerd tijdens herstel mode." + +#: wp-admin/includes/theme.php:1149 +msgid "Go to the Themes screen" +msgstr "Ga naar het thema's scherm" + +#: wp-admin/includes/class-wp-debug-data.php:1603 +msgid "Total size is not available. Some errors were encountered when determining the size of your installation." +msgstr "Totale grootte is niet beschikbaar. Enkele fouten traden op tijdens het berekenen van de grootte van je installatie." + +#: wp-admin/includes/class-wp-debug-data.php:1552 +msgid "The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions." +msgstr "De grootte kan niet berekend worden. De map is niet toegankelijk. Normaliter veroorzaakt door ongeldige permissies." + +#: wp-admin/includes/class-wp-debug-data.php:1559 +msgid "The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files." +msgstr "De foldergrootte berekening heeft een time-out gedaan. Dit wordt meestal veroorzaakt door een grote hoeveelheid subfolders en bestanden." + +#: wp-admin/includes/class-wp-debug-data.php:246 +msgid "These settings alter where and how parts of WordPress are loaded." +msgstr "Deze instellingen wijzigen waar en hoe onderdelen van WordPress worden geladen." + +#. translators: %s: Number of items with no issues. +#: wp-admin/site-health.php:135 wp-admin/js/site-health.js:161 +msgid "%s item with no issues detected" +msgid_plural "%s items with no issues detected" +msgstr[0] "%s item zonder problemen gedetecteerd" +msgstr[1] "%s items zonder problemen gedetecteerd" + +#. translators: %s: Number of recommended improvements. +#: wp-admin/site-health.php:116 wp-admin/js/site-health.js:156 +msgid "%s recommended improvement" +msgid_plural "%s recommended improvements" +msgstr[0] "%s aangeraden verbetering" +msgstr[1] "%s aangeraden verbeteringen" + +#: wp-admin/site-health.php:99 +msgid "The site health check shows critical information about your WordPress configuration and items that require your attention." +msgstr "De sitediagnose toont kritieke informatie over je WordPress configuratie en items die je aandacht vereisen." + +#: wp-admin/includes/dashboard.php:56 wp-admin/site-health.php:17 +#: wp-admin/site-health.php:96 +msgid "Site Health Status" +msgstr "Status sitediagnose" + +#: wp-admin/site-health.php:90 +msgid "Everything is running smoothly here." +msgstr "Alles hier loopt gesmeerd." + +#: wp-admin/site-health.php:86 +msgid "Great job!" +msgstr "Prima!" + +#: wp-admin/credits.php:47 wp-admin/includes/ms.php:1120 +#: wp-admin/privacy.php:44 wp-admin/nav-menus.php:696 +#: wp-admin/site-health-info.php:51 wp-admin/freedoms.php:50 +#: wp-admin/about.php:45 wp-admin/site-health.php:56 +msgid "Secondary menu" +msgstr "Secundair menu" + +#: wp-admin/includes/class-wp-site-health.php:2567 +msgid "The loopback request to your site completed successfully." +msgstr "De loopback request naar jouw site is succesvol afgerond." + +#. translators: %d: The HTTP response code returned. +#: wp-admin/includes/class-wp-site-health.php:2559 +msgid "The loopback request returned an unexpected http status code, %d, it was not possible to determine if this will prevent features from working as expected." +msgstr "Het loopback verzoek gaf een onverwachte http statuscode terug, %d, en het was niet mogelijk om te bepalen of dit de werking van bepaalde functies beïnvloedt." + +#: wp-admin/includes/class-wp-site-health.php:2543 +msgid "The loopback request to your site failed, this means features relying on them are not currently working as expected." +msgstr "Het loopback verzoek naar je site is mislukt. Dit betekent dat functies die daar vanaf hangen momenteel niet naar verwachting zullen werken." + +#: wp-admin/includes/class-wp-site-health.php:2346 +msgid "No scheduled events exist on this site." +msgstr "Er zijn geen geplande gebeurtenissen op deze site." + +#: wp-admin/includes/class-wp-site-health.php:2250 +msgid "REST API availability" +msgstr "REST API beschikbaarheid" + +#: wp-admin/includes/class-wp-site-health.php:2232 +msgid "Loopback request" +msgstr "Loopback request" + +#: wp-admin/includes/class-wp-site-health.php:2206 +msgid "Debugging enabled" +msgstr "Debuggen ingeschakeld" + +#: wp-admin/includes/class-wp-site-health.php:2202 +msgid "HTTP Requests" +msgstr "HTTP verzoeken" + +#: wp-admin/includes/class-wp-site-health.php:2198 +msgid "Scheduled events" +msgstr "Geplande evenementen" + +#: wp-admin/includes/class-wp-site-health.php:2194 +msgid "Secure communication" +msgstr "Beveiligde communicatie" + +#: wp-admin/includes/class-wp-site-health.php:2190 +msgid "HTTPS status" +msgstr "HTTPS status" + +#: wp-admin/includes/class-wp-site-health.php:2186 +msgid "MySQL utf8mb4 support" +msgstr "MySQL utf8mb4 ondersteuning" + +#: wp-admin/includes/class-wp-site-health.php:2170 +msgid "PHP Extensions" +msgstr "PHP extensies" + +#: wp-admin/includes/class-wp-site-health.php:2182 +msgid "Database Server version" +msgstr "Database server versie" + +#: wp-admin/includes/class-wp-site-health.php:2166 +msgid "PHP Version" +msgstr "PHP versie" + +#: wp-admin/includes/class-wp-site-health.php:2162 +msgid "Theme Versions" +msgstr "Thema versies" + +#: wp-admin/includes/class-wp-site-health.php:2158 +msgid "Plugin Versions" +msgstr "Plugin versies" + +#: wp-admin/includes/class-wp-site-health.php:2154 +msgid "WordPress Version" +msgstr "WordPress versie" + +#. translators: %s: The name of the query parameter being tested. +#: wp-admin/includes/class-wp-site-health.php:1994 +msgid "The REST API did not process the %s query parameter correctly." +msgstr "De REST API heeft de %s query parameter onjuist verwerkt." + +#: wp-admin/includes/class-wp-site-health.php:1988 +msgid "The REST API did not behave correctly" +msgstr "De REST API gedroeg zich niet naar verwachting" + +#. translators: 1: The HTTP error code. 2: The HTTP error message. +#: wp-admin/includes/class-wp-site-health.php:1977 +msgid "The REST API call gave the following unexpected result: (%1$d) %2$s." +msgstr "De REST API call gaf het volgende onverwachte resultaat: (%1$d) %2$s." + +#: wp-admin/includes/class-wp-site-health.php:1971 +msgid "The REST API encountered an unexpected result" +msgstr "De REST API zag een onverwachte fout resultaat" + +#: wp-admin/includes/class-wp-site-health.php:1959 +msgid "The REST API request failed due to an error." +msgstr "The REST API request mislukte vanwege een fout." + +#: wp-admin/includes/class-wp-site-health.php:1953 +msgid "The REST API encountered an error" +msgstr "De REST API kwam een onverwachte fout tegen" + +#: wp-admin/includes/class-wp-site-health.php:1918 +msgid "The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages." +msgstr "De REST API is één manier hoe WordPress en andere applicaties communiceren met de server. Eén voorbeeld is het blok-editor scherm dat hierop vertrouwt om je berichten en pagina's te tonen en op te slaan." + +#: wp-admin/includes/class-wp-site-health.php:1910 +msgid "The REST API is available" +msgstr "De REST API is beschikbaar" + +#: wp-admin/includes/class-wp-site-health.php:1882 +msgid "HTTP requests are partially blocked" +msgstr "HTTP requests worden gedeeltelijk geblokkeerd" + +#: wp-admin/includes/class-wp-site-health.php:1867 +msgid "HTTP requests are blocked" +msgstr "HTTP requests worden geblokkeerd" + +#: wp-admin/includes/class-wp-site-health.php:1847 +msgid "It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended." +msgstr "Het is mogelijk voor sitebeheerders om alle of sommige communicatie met andere sites en services te blokkeren. Als dit verkeerd is ingesteld, kan dit ertoe leiden dat plugins en thema’s niet werken als bedoeld." + +#: wp-admin/includes/class-wp-site-health.php:1839 +msgid "HTTP requests seem to be working as expected" +msgstr "HTTP requests werken naar verwachting" + +#: wp-admin/includes/class-wp-site-health.php:1815 +msgid "Your site could not complete a loopback request" +msgstr "Je site kon geen loopback request afronden" + +#: wp-admin/includes/class-wp-site-health.php:1804 +msgid "Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability." +msgstr "Loopback requests worden gebruikt om ingeplande taken uit te voeren en worden ook gebruikt door de ingebouwde editors voor thema's en plugins om stabiliteit van de code te verifiëren." + +#: wp-admin/includes/class-wp-site-health.php:1796 +msgid "Your site can perform loopback requests" +msgstr "Je site kan loopback requests uitvoeren" + +#: wp-admin/includes/class-wp-site-health.php:1720 +msgid "Background updates may not be working properly" +msgstr "Achtergrond updates werken mogelijk niet zoals verwacht" + +#: wp-admin/includes/class-wp-site-health.php:1712 +msgid "Background updates are not working as expected" +msgstr "Achtergrond updates werken niet zoals verwacht" + +#: wp-admin/includes/class-wp-site-health.php:1709 +msgid "Passed" +msgstr "Ok" + +#: wp-admin/includes/class-wp-site-health.php:1691 +msgid "Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using." +msgstr "Achtergrond updates zorgen ervoor dat WordPress automatisch kan updaten als een beveiligingsupdate wordt uitgebracht voor de versie die jij op dit moment gebruikt." + +#: wp-admin/includes/class-wp-site-health.php:1683 +msgid "Background updates are working" +msgstr "Achtergrond updates werken" + +#. translators: %s: The name of the failed cron event. +#: wp-admin/includes/class-wp-site-health.php:1648 +msgid "The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." +msgstr "De geplande gebeurtenis, %s, is niet uitgevoerd. Je site werkt nog steeds, maar dit zou er op kunnen duiden dat geplande berichten of auto-updates niet werken zoals de bedoeling is." + +#: wp-admin/includes/class-wp-site-health.php:1642 +msgid "A scheduled event has failed" +msgstr "Een gepland event is mislukt" + +#. translators: %s: The error message returned while from the cron scheduler. +#: wp-admin/includes/class-wp-site-health.php:1635 +msgid "While trying to test your site’s scheduled events, the following error was returned: %s" +msgstr "Tijdens het testen van de geplande events van je site werd de volgende fout geretourneerd: %s" + +#: wp-admin/includes/class-wp-site-health.php:1629 +msgid "It was not possible to check your scheduled events" +msgstr "Het was niet mogelijk je geplande events te controleren" + +#: wp-admin/includes/class-wp-site-health.php:1618 +msgid "Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed." +msgstr "Geplande events controleren periodiek of er updates zijn voor plugins, thema's en WordPress zelf. Het zorgt er ook voor dat ingeplande berichten op de juiste tijd gepubliceerd worden. Het is ook mogelijk dat plugins hier gebruik van maken om bepaalde geplande acties uit te voeren." + +#: wp-admin/includes/class-wp-site-health.php:1610 +msgid "Scheduled events are running" +msgstr "Geplande events draaien nu" + +#: wp-admin/includes/class-wp-site-health.php:1591 +msgid "Talk to your web host about OpenSSL support for PHP." +msgstr "Praat met je webhost over OpenSSL support voor PHP." + +#: wp-admin/includes/class-wp-site-health.php:1587 +msgid "Your site is unable to communicate securely with other services" +msgstr "Je site kan niet op een veilige manier communiceren met andere services" + +#: wp-admin/includes/class-wp-site-health.php:1583 +msgid "Your site can communicate securely with other services" +msgstr "Je site kan veilig communiceren met andere services" + +#: wp-admin/includes/class-wp-site-health.php:1572 +msgid "Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more." +msgstr "Veilige communicatie tussen servers is nodig voor het overbrengen van bestanden, het uitvoeren van verkopen op webwinkels en meer." + +#: wp-admin/includes/class-wp-site-health.php:1515 +msgid "Learn more about why you should use HTTPS" +msgstr "Meer informatie over waarom je HTTPS zou moeten gebruiken" + +#. translators: Documentation explaining HTTPS and why it should be used. +#: wp-admin/includes/class-wp-site-health.php:1514 +msgid "https://wordpress.org/support/article/why-should-i-use-https/" +msgstr "https://wordpress.org/support/article/why-should-i-use-https/" + +#: wp-admin/includes/class-wp-site-health.php:1549 +msgid "Your site does not use HTTPS" +msgstr "Je site gebruikt geen HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1501 +msgid "Your website is using an active HTTPS connection." +msgstr "Je site gebruikt een actieve HTTPS verbinding." + +#: wp-admin/includes/class-wp-site-health.php:1543 +msgid "Update your site addresses" +msgstr "Je site adres bijwerken" + +#. translators: %s: URL to General Settings screen. +#: wp-admin/includes/class-wp-site-health.php:1535 +msgid "You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default." +msgstr "Je benadert deze site middels HTTPS, maar je WordPress adres is niet standaard ingesteld op HTTPS." + +#: wp-admin/includes/class-wp-site-health.php:1529 +msgid "Only parts of your site are using HTTPS" +msgstr "Alleen gedeelten van je site gebruiken HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1465 +msgid "Your site is set to display errors to site visitors" +msgstr "Je site is zo ingesteld dat bezoekers foutmeldingen kunnen zien" + +#. translators: %s: WP_DEBUG_LOG +#: wp-admin/includes/class-wp-site-health.php:1458 +msgid "The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to all users." +msgstr "De waarde, %s is toegevoegd aan het configuratie-bestand van deze site. Dit betekent dat alle foutmeldingen van de site weg worden geschreven naar een bestand welke mogelijk beschikbaar is voor alle gebruikers." + +#: wp-admin/includes/class-wp-site-health.php:1450 +msgid "Your site is set to log errors to a potentially public file." +msgstr "Je site is ingesteld om foutmeldingen te loggen in een mogelijk publiekelijk beschikbaar bestand." + +#: wp-admin/includes/class-wp-site-health.php:1435 +msgid "Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website." +msgstr "Debug mode is vaak ingeschakeld om meer details over een fout of site-falen te verzamelen, maar het kan gevoelige informatie bevatten die niet beschikbaar mag zijn op een publieke site." + +#: wp-admin/includes/class-wp-site-health.php:1427 +msgid "Your site is not set to output debug information" +msgstr "Je site is niet ingesteld om debug informatie te tonen" + +#. translators: 1: The IP address WordPress.org resolves to. 2: The error +#. returned by the lookup. +#: wp-admin/includes/class-wp-site-health.php:1392 +msgid "Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s" +msgstr "Je site kan WordPress.org niet bereiken op %1$s en retourneerde de fout: %2$s" + +#: wp-admin/includes/class-wp-site-health.php:1383 +msgid "Could not reach WordPress.org" +msgstr "Kon WordPress.org niet bereiken" + +#: wp-admin/includes/class-wp-site-health.php:1366 +msgid "Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins." +msgstr "Communiceren met de WordPress servers wordt gebruikt om te controleren op nieuwe versies en om zowel WordPress core, thema's of plugins te installeren en updaten." + +#: wp-admin/includes/class-wp-site-health.php:1358 +msgid "Can communicate with WordPress.org" +msgstr "Kan communiceren met WordPress.org" + +#: wp-admin/includes/class-wp-site-health.php:1316 +#: wp-admin/includes/class-wp-site-health.php:1332 +msgid "utf8mb4 requires a newer client library" +msgstr "utf8mb4 vereist een nieuwere client library" + +#: wp-admin/includes/class-wp-site-health.php:1294 +msgid "Your MariaDB version supports utf8mb4." +msgstr "Je MariaDB versie ondersteunt utf8mb4." + +#: wp-admin/includes/class-wp-site-health.php:1281 +msgid "utf8mb4 requires a MariaDB update" +msgstr "utf8mb4 vereist een MariaDB update" + +#: wp-admin/includes/class-wp-site-health.php:1274 +msgid "Your MySQL version supports utf8mb4." +msgstr "Je MySQL versie ondersteunt utf8mb4." + +#: wp-admin/includes/class-wp-site-health.php:1261 +msgid "utf8mb4 requires a MySQL update" +msgstr "utf8mb4 vereist een MySQL update" + +#: wp-admin/includes/class-wp-site-health.php:1243 +msgid "UTF8MB4 is supported" +msgstr "UTF8MB4 wordt ondersteund" + +#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database +#. server minimum version number. +#: wp-admin/includes/class-wp-site-health.php:1201 +msgid "WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this." +msgstr "WordPress vereist %1$s versie %2$s of nieuwer. Neem contact op met je web hosting provider om dit te corrigeren." + +#: wp-admin/includes/class-wp-site-health.php:1194 +msgid "Severely outdated SQL server" +msgstr "Ernstig verouderde SQL server" + +#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database +#. server recommended version number. +#: wp-admin/includes/class-wp-site-health.php:1184 +msgid "For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this." +msgstr "Voor optimale performance en veiligheidsredenen raden wij aan om de %1$s versie %2$s of hoger te gebruiken. Neem contact op met je webhosting bedrijf om dit aan te passen." + +#: wp-admin/includes/class-wp-site-health.php:1178 +msgid "Outdated SQL server" +msgstr "Verouderde SQL server" + +#: wp-admin/includes/class-wp-site-health.php:1152 +msgid "SQL server is up to date" +msgstr "SQL server is up-to-date" + +#: wp-admin/includes/class-wp-site-health.php:1043 +msgid "One or more required modules are missing" +msgstr "Eén of meer vereiste modules ontbreken" + +#: wp-admin/includes/class-wp-site-health.php:1040 +msgid "One or more recommended modules are missing" +msgstr "Eén of meer aanbevolen modules ontbreken" + +#. translators: %s: The module name. +#: wp-admin/includes/class-wp-site-health.php:1012 +msgid "The optional module, %s, is not installed, or has been disabled." +msgstr "De optionele module, %s, is niet geïnstalleerd of is uitgeschakeld." + +#. translators: %s: The module name. +#: wp-admin/includes/class-wp-site-health.php:1004 +msgid "The required module, %s, is not installed, or has been disabled." +msgstr "De vereiste module, %s, is niet geïnstalleerd of is uitgeschakeld." + +#: wp-admin/includes/class-wp-site-health.php:1001 +#: wp-admin/includes/class-wp-site-health.php:1389 +#: wp-admin/includes/class-wp-site-health.php:1716 +msgid "Error" +msgstr "Fout" + +#: wp-admin/includes/class-wp-site-health.php:832 +msgid "Required and recommended modules are installed" +msgstr "Vereiste en aanbevolen modules zijn geïnstalleerd" + +#: wp-admin/includes/class-wp-site-health.php:697 +msgid "Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your chosen theme." +msgstr "Je site heeft geen enkel standaard thema. Standaard thema's worden automatisch door WordPress gebruikt als er iets mis is met je normale thema." + +#: wp-admin/includes/class-wp-site-health.php:693 +msgid "Have a default theme available" +msgstr "Heb een standaard thema beschikbaar" + +#. translators: 1: The default theme for WordPress. 2: The currently active +#. theme. 3: The active theme's parent theme. +#: wp-admin/includes/class-wp-site-health.php:641 +msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme." +msgstr "Om de beveiliging van je site te verbeteren, raden we aan om thema's die je niet gebruikt te verwijderen. Je moet %1$s, het standaard WordPress thema, %2$s, je huidige thema en %3$s, het hoofdthema behouden." + +#. translators: 1: The currently active theme. 2: The active theme's parent +#. theme. +#: wp-admin/includes/class-wp-site-health.php:622 +msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme." +msgstr "Om de beveiliging van je site te verbeteren, raden we aan om thema's die je niet gebruikt te verwijderen. Je moet je huidige thema, %1$s, en %2$s, het hoofdthema, behouden." + +#: wp-admin/includes/class-wp-site-health.php:442 +msgid "You should remove inactive plugins" +msgstr "Je zou inactieve plugins moeten verwijderen" + +#. translators: %d: The number of themes. +#: wp-admin/includes/class-wp-site-health.php:588 +msgid "Your site has %d installed theme, and it is up to date." +msgid_plural "Your site has %d installed themes, and they are all up to date." +msgstr[0] "Je site heeft %d geïnstalleerd thema en deze is up-to-date." +msgstr[1] "Je site heeft %d geïnstalleerde thema's en deze zijn alle up-to-date." + +#. translators: %d: The number of outdated themes. +#: wp-admin/includes/class-wp-site-health.php:568 +msgid "Your site has %d theme waiting to be updated." +msgid_plural "Your site has %d themes waiting to be updated." +msgstr[0] "Je site heeft %d thema waarvoor een update beschikbaar is." +msgstr[1] "Je site heeft %d thema's waarvoor updates beschikbaar zijn." + +#: wp-admin/includes/class-wp-site-health.php:562 +msgid "You have themes waiting to be updated" +msgstr "Je hebt thema's die wachten om te worden geüpdatet" + +#: wp-admin/includes/class-wp-site-health.php:489 +msgid "Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure." +msgstr "Thema's geven je sites vorm. Het is belangrijk om ze up-to-date te houden, zodat je merk consistent en je site veilig blijft." + +#: wp-admin/includes/class-wp-site-health.php:481 +msgid "Your themes are all up to date" +msgstr "Je thema's zijn allemaal up-to-date" + +#. translators: %d: The number of active plugins. +#: wp-admin/includes/class-wp-site-health.php:425 +msgid "Your site has %d active plugin, and it is up to date." +msgid_plural "Your site has %d active plugins, and they are all up to date." +msgstr[0] "Je site heeft %d actieve plugin en deze is up-to-date." +msgstr[1] "Je site heeft %d actieve plugins en deze zijn alle up-to-date." + +#. translators: %d: The number of outdated plugins. +#: wp-admin/includes/class-wp-site-health.php:400 +msgid "Your site has %d plugin waiting to be updated." +msgid_plural "Your site has %d plugins waiting to be updated." +msgstr[0] "Je site heeft %d plugin waarvoor een update beschikbaar is." +msgstr[1] "Je site heeft %d plugins waarvoor updates beschikbaar zijn." + +#: wp-admin/includes/class-wp-site-health.php:394 +msgid "You have plugins waiting to be updated" +msgstr "Je hebt plugins die wachten om te worden geüpdatet" + +#: wp-admin/includes/class-wp-site-health.php:356 +msgid "Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date." +msgstr "Plugins breiden de functionaliteit van je site uit met contactformulieren, webshops en nog veel meer. Dit betekent dat ze hecht verbonden zijn met je site en dus is het ontzettend belangrijk dat ze up-to-date blijven." + +#: wp-admin/includes/class-wp-site-health.php:348 +msgid "Your plugins are all up to date" +msgstr "Je plugins zijn allemaal up-to-date" + +#: wp-admin/includes/class-wp-site-health.php:327 +msgid "You are currently running the latest version of WordPress available, keep it up!" +msgstr "Je gebruikt op dit moment de laatste beschikbare versie van WordPress, ga zo door!" + +#: wp-admin/includes/class-wp-site-health.php:314 +msgid "A new minor update is available for your site. Because minor updates often address security, it’s important to install them." +msgstr "Een nieuwe kleine update is beschikbaar voor je site. Omdat kleine updates vaak betrekking hebben op beveiliging, is het belangrijk om deze te installeren." + +#: wp-admin/includes/class-wp-site-health.php:306 +msgid "A new version of WordPress is available." +msgstr "Een nieuwe versie van WordPress is beschikbaar." + +#: wp-admin/includes/class-wp-site-health.php:298 +msgid "Install the latest version of WordPress" +msgstr "Installeer de nieuwste versie van WordPress" + +#. translators: %s: The latest version of WordPress available. +#: wp-admin/includes/class-wp-site-health.php:291 +msgid "WordPress update available (%s)" +msgstr "WordPress update beschikbaar (%s)" + +#: wp-admin/includes/class-wp-site-health.php:278 +msgid "Check for updates manually" +msgstr "Handmatig controleren voor updates" + +#: wp-admin/includes/class-wp-site-health.php:272 +msgid "We were unable to check if any new versions of WordPress are available." +msgstr "We konden niet controleren of er nieuwere versies van WordPress beschikbaar zijn." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:449 +msgid "WordPress security and maintenance releases are blocked by the %s filter." +msgstr "WordPress beveiliging- en onderhoud releases zijn geblokkeerd door het %s filter." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:437 +msgid "WordPress security and maintenance releases are blocked by %s." +msgstr "WordPress beveiliging- en onderhoud releases zijn geblokkeerd door %s." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:417 +msgid "WordPress development updates are blocked by the %s filter." +msgstr "WordPress ontwikkel updates zijn geblokkeerd door het %s filter." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:405 +msgid "WordPress development updates are blocked by the %s constant." +msgstr "WordPress ontwikkel updates zijn geblokkeerd door de %s constante." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:381 +msgid "All of your WordPress files are writable." +msgstr "Al je WordPress bestanden zijn schrijfbaar." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:376 +msgid "Some files are not writable by WordPress:" +msgstr "Enkele bestanden zijn niet schrijfbaar door WordPress:" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:350 +msgid "This could mean that connections are failing to WordPress.org." +msgstr "Dit kan betekenen dat connecties met WordPress.org mislukken." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:347 +msgid "Couldn't retrieve a list of the checksums for WordPress %s." +msgstr "Kon geen lijst van checksums voor WordPress %s ophalen." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:295 +msgid "Your installation of WordPress doesn't require FTP credentials to perform updates." +msgstr "Je WordPress installatie vereist geen FTP-gegevens om updates uit te voeren." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:286 +msgid "(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)" +msgstr "(Je site voert updates uit via FTP wegens bestandsrechten. Neem contact op met je hosting provider.)" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:285 +msgid "Your installation of WordPress prompts for FTP credentials to perform updates." +msgstr "Je WordPress installatie vraagt om FTP-gegevens om updates uit te voeren." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:263 +msgid "No version control systems were detected." +msgstr "Er is geen versiebeheer systeem gedetecteerd." + +#. translators: 1: Folder name. 2: Version control directory. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:254 +msgid "The folder %1$s was detected as being under version control (%2$s)." +msgstr "De map %1$s is gedetecteerd als zijnde onder versiebeheer (%2$s)." + +#. translators: 1: Folder name. 2: Version control directory. 3: Filter name. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:241 +msgid "The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates." +msgstr "De map %1$s is gedetecteerd als zijnde onder versiebeheer (%2$s), maar het %3$s filter staat updates toe." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:186 +msgid "We'll try again with the next release." +msgstr "We proberen het opnieuw met de volgende release." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:181 +msgid "A previous automatic background update could not occur." +msgstr "Een eerdere achtergrond auto-update kon niet worden uitgevoerd." + +#. translators: %s: Code of error shown. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:172 +#: wp-admin/includes/class-wp-site-health-auto-updates.php:189 +msgid "The error code was %s." +msgstr "De foutcode was %s." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:169 +msgid "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts." +msgstr "Wanneer je de update hebt kunnen uitvoeren via de \"Update nu\" knop in Dashboard > Updates schonen we deze foutmelding op voor toekomstige update pogingen." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:168 +#: wp-admin/includes/class-wp-site-health-auto-updates.php:183 +msgid "You would have received an email because of this." +msgstr "Je zou een e-mail ontvangen moeten hebben vanwege dit." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:167 +msgid "A previous automatic background update ended with a critical failure, so updates are now disabled." +msgstr "Een eerdere achtergrond auto-update resulteerde in een kritieke fout, auto-updates zijn nu uitgeschakeld." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:120 +msgid "The %s filter is enabled." +msgstr "Het %s filter is ingeschakeld." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:99 +msgid "A plugin has prevented updates by disabling %s." +msgstr "Een plugin heeft updates voorkomen door %s uit te schakelen." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:77 +msgid "The %s constant is defined and enabled." +msgstr "De %s constante is gedefinieerd en ingeschakeld." + +#: wp-admin/includes/class-wp-debug-data.php:1342 +msgid "The must use plugins directory" +msgstr "De \"must use\" plugins map" + +#: wp-admin/includes/class-wp-debug-data.php:1097 +msgid "Theme features" +msgstr "Thema functies" + +#: wp-admin/includes/class-wp-debug-data.php:1092 +#: wp-admin/includes/class-theme-installer-skin.php:244 +msgid "Parent theme" +msgstr "Hoofdthema" + +#: wp-admin/includes/class-wp-debug-data.php:1087 +#: wp-admin/includes/class-wp-debug-data.php:1182 +msgid "Author website" +msgstr "Auteur site" + +#. translators: %s: Latest WordPress version number. +#. translators: %s: Latest plugin version number. +#. translators: %s: Latest theme version number. +#: wp-admin/includes/class-wp-debug-data.php:54 +#: wp-admin/includes/class-wp-debug-data.php:953 +#: wp-admin/includes/class-wp-debug-data.php:1044 +#: wp-admin/includes/class-wp-debug-data.php:1156 +#: wp-admin/includes/class-wp-debug-data.php:1276 +msgid "(Latest version: %s)" +msgstr "(Nieuwste versie: %s)" + +#. translators: 1: Plugin version number. 2: Plugin author name. +#. translators: 1: Theme version number. 2: Theme author name. +#: wp-admin/includes/class-wp-debug-data.php:888 +#: wp-admin/includes/class-wp-debug-data.php:935 +#: wp-admin/includes/class-wp-debug-data.php:1258 +msgid "Version %1$s by %2$s" +msgstr "Versie %1$s door %2$s" + +#: wp-admin/includes/class-wp-debug-data.php:883 +#: wp-admin/includes/class-wp-debug-data.php:930 +#: wp-admin/includes/class-wp-debug-data.php:1253 +msgid "No version or author information is available." +msgstr "Er is geen versie of auteurs informatie beschikbaar" + +#: wp-admin/includes/class-wp-debug-data.php:831 +msgid "Server version" +msgstr "Server versie" + +#: wp-admin/includes/class-wp-debug-data.php:826 +msgid "Extension" +msgstr "Extensie" + +#. translators: %s: .htaccess +#: wp-admin/includes/class-wp-debug-data.php:790 +msgid "Your %s file contains only core WordPress features." +msgstr "Je %s bestand bevat alleen basis WordPress functies." + +#. translators: %s: .htaccess +#: wp-admin/includes/class-wp-debug-data.php:787 +msgid "Custom rules have been added to your %s file." +msgstr "Er zijn aangepaste regels toegevoegd aan je %s bestand." + +#: wp-admin/includes/class-wp-debug-data.php:794 +msgid ".htaccess rules" +msgstr ".htaccess regels" + +#: wp-admin/includes/class-wp-debug-data.php:762 +msgid "Is the Imagick library available?" +msgstr "Is de Imagick bibliotheek beschikbaar?" + +#: wp-admin/includes/class-wp-debug-data.php:753 +msgid "Is SUHOSIN installed?" +msgstr "Is SUHOSIN geïnstalleerd?" + +#: wp-admin/includes/class-wp-debug-data.php:738 +#: wp-admin/includes/class-wp-debug-data.php:743 +msgid "cURL version" +msgstr "cURL versie" + +#: wp-admin/includes/class-wp-debug-data.php:729 +msgid "PHP post max size" +msgstr "PHP post max size" + +#: wp-admin/includes/class-wp-debug-data.php:725 +msgid "Upload max filesize" +msgstr "Upload max filesize" + +#: wp-admin/includes/class-wp-debug-data.php:721 +msgid "Max input time" +msgstr "Max input time" + +#: wp-admin/includes/class-wp-debug-data.php:706 +#: wp-admin/includes/class-wp-debug-data.php:715 +msgid "PHP memory limit" +msgstr "PHP geheugenlimiet" + +#: wp-admin/includes/class-wp-debug-data.php:700 +msgid "PHP time limit" +msgstr "PHP tijdslimiet" + +#: wp-admin/includes/class-wp-debug-data.php:696 +msgid "PHP max input variables" +msgstr "PHP max invoervariabelen" + +#. translators: %s: ini_get() +#: wp-admin/includes/class-wp-debug-data.php:533 +#: wp-admin/includes/class-wp-debug-data.php:689 +msgid "Unable to determine some settings, as the %s function has been disabled." +msgstr "Niet mogelijk om sommige instellingen te bepalen, omdat de %s functie uitgeschakeld is." + +#: wp-admin/includes/class-wp-debug-data.php:686 +msgid "Server settings" +msgstr "Server instellingen" + +#: wp-admin/includes/class-wp-debug-data.php:679 +msgid "Unable to determine PHP SAPI" +msgstr "Kon PHP-SAPI niet herkennen" + +#: wp-admin/includes/class-wp-debug-data.php:678 +msgid "PHP SAPI" +msgstr "PHP-SAPI" + +#: wp-admin/includes/class-wp-debug-data.php:645 +msgid "(Does not support 64bit values)" +msgstr "(Ondersteunt geen 64bit waarden)" + +#: wp-admin/includes/class-wp-debug-data.php:645 +msgid "(Supports 64bit values)" +msgstr "(Ondersteunt 64bit waarden)" + +#: wp-admin/includes/class-wp-debug-data.php:652 +msgid "Unable to determine PHP version" +msgstr "Kon PHP-versie niet herkennen" + +#: wp-admin/includes/class-wp-debug-data.php:673 +msgid "PHP version" +msgstr "PHP versie" + +#: wp-admin/includes/class-wp-debug-data.php:669 +msgid "Unable to determine what web server software is used" +msgstr "Het is niet mogelijk om vast te stellen welke webserver software is gebruikt." + +#: wp-admin/includes/class-wp-debug-data.php:668 +msgid "Web server" +msgstr "Webserver" + +#: wp-admin/includes/class-wp-debug-data.php:664 +msgid "Unable to determine server architecture" +msgstr "Kon server architectuur niet herkennen" + +#: wp-admin/includes/class-wp-debug-data.php:663 +msgid "Server architecture" +msgstr "Server architectuur" + +#: wp-admin/includes/class-wp-debug-data.php:625 +msgid "Ghostscript version" +msgstr "Ghostscript versie" + +#: wp-admin/includes/class-wp-debug-data.php:620 +msgid "Unable to determine if Ghostscript is installed" +msgstr "Het is niet mogelijk om vast te stellen of Ghostscript is geïnstalleerd." + +#: wp-admin/includes/class-wp-debug-data.php:604 +msgid "GD version" +msgstr "GD versie" + +#: wp-admin/includes/class-wp-debug-data.php:590 +msgid "Imagick Resource Limits" +msgstr "Imagick Resource Limits" + +#: wp-admin/includes/class-wp-debug-data.php:524 +msgid "ImageMagick version string" +msgstr "ImageMagick versie string" + +#: wp-admin/includes/class-wp-debug-data.php:519 +msgid "ImageMagick version number" +msgstr "ImageMagick versienummer" + +#: wp-admin/includes/class-wp-debug-data.php:493 +#: wp-admin/includes/class-wp-debug-data.php:515 +#: wp-admin/includes/class-wp-debug-data.php:1587 +msgid "Not available" +msgstr "Niet beschikbaar" + +#: wp-admin/includes/class-wp-debug-data.php:505 +msgid "Active editor" +msgstr "Actieve editor" + +#: wp-admin/includes/class-wp-debug-data.php:479 +msgid "Total installation size" +msgstr "Grootte totale installatie" + +#: wp-admin/includes/class-wp-debug-data.php:474 +msgid "Database size" +msgstr "Databasegrootte" + +#: wp-admin/includes/class-wp-debug-data.php:442 +msgid "WordPress directory size" +msgstr "Grootte WordPress map" + +#: wp-admin/includes/class-wp-debug-data.php:438 +msgid "WordPress directory location" +msgstr "Locatie WordPress map" + +#: wp-admin/includes/class-wp-debug-data.php:469 +msgid "Plugins directory size" +msgstr "Grootte plugins map" + +#: wp-admin/includes/class-wp-debug-data.php:465 +msgid "Plugins directory location" +msgstr "Locatie plugins map" + +#: wp-admin/includes/class-wp-debug-data.php:460 +msgid "Themes directory size" +msgstr "Grootte thema's map" + +#: wp-admin/includes/class-wp-debug-data.php:1101 +#: wp-admin/includes/class-wp-debug-data.php:1187 +msgid "Theme directory location" +msgstr "Locatie thema's map" + +#: wp-admin/includes/class-wp-debug-data.php:451 +msgid "Uploads directory size" +msgstr "Grootte uploads map" + +#: wp-admin/includes/class-wp-debug-data.php:447 +msgid "Uploads directory location" +msgstr "Locatie uploads map" + +#. translators: 1: The IP address WordPress.org resolves to. 2: The error +#. returned by the lookup. +#: wp-admin/includes/class-wp-debug-data.php:424 +msgid "Unable to reach WordPress.org at %1$s: %2$s" +msgstr "Kon WordPress.org niet bereiken op %1$s: %2$s" + +#: wp-admin/includes/class-wp-debug-data.php:416 +msgid "WordPress.org is reachable" +msgstr "WordPress.org is bereikbaar" + +#: wp-admin/includes/class-wp-debug-data.php:415 +#: wp-admin/includes/class-wp-debug-data.php:421 +#: wp-admin/includes/class-wp-site-health.php:2220 +msgid "Communication with WordPress.org" +msgstr "Communicatie met WordPress.org" + +#: wp-admin/includes/class-wp-debug-data.php:398 +msgid "Network count" +msgstr "Network count" + +#: wp-admin/includes/class-wp-debug-data.php:393 +msgid "Site count" +msgstr "Aantal sites" + +#: wp-admin/includes/class-wp-debug-data.php:388 +#: wp-admin/includes/class-wp-debug-data.php:405 +msgid "User count" +msgstr "Aantal gebruikers" + +#: wp-admin/includes/class-wp-debug-data.php:364 +msgid "The themes directory" +msgstr "De thema's map" + +#: wp-admin/includes/class-wp-debug-data.php:359 +msgid "The plugins directory" +msgstr "De plugins map" + +#: wp-admin/includes/class-wp-debug-data.php:354 +msgid "The uploads directory" +msgstr "De uploads map" + +#: wp-admin/includes/class-wp-debug-data.php:349 +msgid "The wp-content directory" +msgstr "De wp-content map" + +#: wp-admin/includes/class-wp-debug-data.php:345 +#: wp-admin/includes/class-wp-debug-data.php:350 +#: wp-admin/includes/class-wp-debug-data.php:355 +#: wp-admin/includes/class-wp-debug-data.php:360 +#: wp-admin/includes/class-wp-debug-data.php:365 +#: wp-admin/includes/class-wp-debug-data.php:1343 +msgid "Not writable" +msgstr "Niet schrijfbaar" + +#: wp-admin/includes/class-wp-debug-data.php:345 +#: wp-admin/includes/class-wp-debug-data.php:350 +#: wp-admin/includes/class-wp-debug-data.php:355 +#: wp-admin/includes/class-wp-debug-data.php:360 +#: wp-admin/includes/class-wp-debug-data.php:365 +#: wp-admin/includes/class-wp-debug-data.php:1343 +msgid "Writable" +msgstr "Schrijfbaar" + +#: wp-admin/includes/class-wp-debug-data.php:344 +msgid "The main WordPress directory" +msgstr "De WordPress hoofd map" + +#: wp-admin/includes/class-wp-debug-data.php:341 +msgid "Shows whether WordPress is able to write to the directories it needs access to." +msgstr "Toont of WordPress kan schrijven in de mappen waar het toegang nodig heeft." + +#: wp-admin/includes/class-wp-debug-data.php:340 +msgid "Filesystem Permissions" +msgstr "Rechten van het bestandssysteem" + +#: wp-admin/includes/class-wp-debug-data.php:213 +#: wp-admin/includes/class-wp-debug-data.php:222 +#: wp-admin/includes/class-wp-debug-data.php:231 +#: wp-admin/includes/class-wp-debug-data.php:240 +#: wp-admin/includes/class-wp-debug-data.php:255 +#: wp-admin/includes/class-wp-debug-data.php:260 +#: wp-admin/includes/class-wp-debug-data.php:322 +#: wp-admin/includes/class-wp-debug-data.php:327 +#: wp-admin/includes/class-wp-debug-data.php:1088 +#: wp-admin/includes/class-wp-debug-data.php:1183 +msgid "Undefined" +msgstr "Ongedefinieerd" + +#: wp-admin/includes/class-wp-debug-data.php:245 +msgid "WordPress Constants" +msgstr "WordPress constanten" + +#: wp-admin/includes/class-wp-debug-data.php:195 +msgid "Database" +msgstr "Database" + +#: wp-admin/includes/class-wp-debug-data.php:190 +msgid "The options shown below relate to your server setup. If changes are required, you may need your web host’s assistance." +msgstr "De opties hieronder gaan over je server setup. Als er wijzigingen nodig zijn, dan moet je mogelijk contact opnemen met je webhost." + +#: wp-admin/includes/class-wp-debug-data.php:189 +msgid "Server" +msgstr "Server" + +#: wp-admin/includes/class-wp-debug-data.php:184 +msgid "Media Handling" +msgstr "Media afhandeling" + +#: wp-admin/includes/class-wp-debug-data.php:178 +msgid "Inactive Plugins" +msgstr "Inactieve plugins" + +#: wp-admin/includes/class-wp-debug-data.php:172 +msgid "Active Plugins" +msgstr "Actieve plugins" + +#: wp-admin/includes/class-wp-debug-data.php:166 +msgid "Must Use Plugins" +msgstr "Must Use plugins" + +#: wp-admin/includes/class-wp-debug-data.php:150 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:904 +msgid "Active Theme" +msgstr "Actief thema" + +#: wp-admin/includes/class-wp-debug-data.php:139 +msgid "Drop-ins" +msgstr "Drop-ins" + +#: wp-admin/includes/class-wp-debug-data.php:133 +msgid "Directories and Sizes" +msgstr "Mappen en groottes" + +#: wp-admin/includes/class-wp-debug-data.php:104 +msgid "Is this a multisite?" +msgstr "Is dit een multisite?" + +#: wp-admin/includes/class-wp-debug-data.php:119 +msgid "Default comment status" +msgstr "Standaard reactiestatus" + +#: wp-admin/includes/class-wp-debug-data.php:109 +msgid "Can anyone register on this site?" +msgstr "Kan iedereen registreren op deze site?" + +#: wp-admin/includes/class-wp-debug-data.php:99 +msgid "Is this site using HTTPS?" +msgstr "Gebruikt deze site HTTPS?" + +#: wp-admin/includes/class-wp-debug-data.php:95 +msgid "No permalink structure set" +msgstr "Geen permalink-structuur ingesteld" + +#: wp-admin/includes/class-wp-debug-data.php:94 +msgid "Permalink structure" +msgstr "Permalink structuur" + +#: wp-admin/includes/class-wp-debug-data.php:89 +msgid "Site URL" +msgstr "Site URL" + +#: wp-admin/includes/class-wp-debug-data.php:84 +msgid "Home URL" +msgstr "Home URL" + +#: wp-admin/site-health-info.php:35 wp-admin/site-health.php:40 +#: wp-admin/menu.php:282 +msgid "Site Health" +msgstr "Sitediagnose" + +#. translators: %s: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:157 +msgctxt "requests" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alle (%s)" +msgstr[1] "Alle (%s)" + +#: wp-admin/menu.php:247 wp-admin/network/menu.php:107 +msgid "Plugin Editor" +msgstr "Plugin editor" + +#: wp-admin/menu.php:224 wp-admin/network/menu.php:82 +msgid "Theme Editor" +msgstr "Thema editor" + +#: wp-admin/options-discussion.php:92 +msgid "Show comments cookies opt-in checkbox, allowing comment author cookies to be set" +msgstr "Toon reactie cookie opt-in selectievakje, om toe te staan dat reactieschrijvers cookies kunnen accepteren." + +#: wp-admin/theme-install.php:408 +msgid "Next theme" +msgstr "Volgend thema" + +#: wp-admin/theme-install.php:407 +msgid "Previous theme" +msgstr "Vorig thema" + +#: wp-admin/user-edit.php:512 +msgid "If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." +msgstr "Als je dit wijzigt, sturen we een e-mail naar je nieuwe adres om het te bevestigen. Het nieuwe adres wordt niet actief totdat het bevestigd is." + +#: wp-admin/themes.php:284 +msgid "Theme resumed." +msgstr "Thema hervat." + +#: wp-admin/themes.php:288 +msgid "Theme could not be resumed because it triggered a fatal error." +msgstr "Thema kon niet hervat worden, omdat deze een fatale fout veroorzaakte." + +#: wp-admin/plugins.php:633 +msgid "If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin." +msgstr "Als je “headers al verzonden” berichten opmerkt, problemen met syndication feeds of andere problemen ervaart, probeer dan deze plugin te deactiveren of te verwijderen." + +#. translators: %d: Number of characters. +#: wp-admin/plugins.php:626 +msgid "The plugin generated %d character of unexpected output during activation." +msgid_plural "The plugin generated %d characters of unexpected output during activation." +msgstr[0] "De plugin heeft %d fout gegenereerd Onverwachte uitvoer tijdens activatie." +msgstr[1] "De plugin heeft %d fouten gegenereerd Onverwachte uitvoer tijdens activatie." + +#: wp-admin/plugins.php:431 +msgid "Sorry, you are not allowed to resume this plugin." +msgstr "Je hebt geen toestemming om deze plugin te hervatten." + +#. translators: %s: WordPress Planet URL. +#: wp-admin/index.php:95 +msgid "WordPress Events and News — Upcoming events near you as well as the latest news from the official WordPress project and the WordPress Planet." +msgstr "WordPress evenementen en nieuws — Aankomende evenementen bij jou in de buurt en het laatste nieuws van het officiële WordPress project en de WordPress planeet." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required MySQL version number, 4: Current MySQL version number. +#: wp-admin/update-core.php:121 wp-admin/upgrade.php:119 +msgid "You cannot update because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." +msgstr "Je kan niet updaten omdat WordPress %2$s MySQL versie %3$s of nieuwer vereist. Je gebruikt versie %4$s." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Current PHP version number. +#: wp-admin/update-core.php:112 wp-admin/upgrade.php:110 +msgid "You cannot update because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." +msgstr "Je kan niet updaten omdat WordPress %2$s PHP versie %3$s of nieuwer vereist. Je gebruikt versie %4$s." + +#: wp-admin/nav-menus.php:932 +msgid "Add menu items" +msgstr "Menu items toevoegen" + +#. translators: %s: URL to create a new menu. +#: wp-admin/nav-menus.php:898 +msgid "or create a new menu. Don’t forget to save your changes!" +msgstr "of maak een nieuw menu. Vergeet niet je wijzigingen te bewaren!" + +#: wp-admin/nav-menus.php:845 wp-admin/nav-menus.php:910 +msgid "Click the Save Menu button to save your changes." +msgstr "Klik op de \"Menu opslaan\" knop om je wijzigingen te bewaren." + +#. translators: %s: URL to create a new menu. +#: wp-admin/nav-menus.php:833 +msgid "Edit your menu below, or create a new menu. Don’t forget to save your changes!" +msgstr "Bewerk je menu hieronder of maak een nieuw menu. Vergeet je wijzigingen niet te bewaren!" + +#: wp-admin/nav-menus.php:826 +msgid "Fill in the Menu Name and click the Create Menu button to create your first menu." +msgstr "Vul de menunaam in en klik de \"Maak menu\" knop om je eerste menu te maken." + +#: wp-admin/nav-menus.php:825 +msgid "Create your first menu below." +msgstr "Maak hieronder je eerste menu." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required MySQL version number, 4: Current MySQL version number. +#: wp-admin/install.php:277 +msgid "You cannot install because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." +msgstr "Je kan niet installeren omdat WordPress %2$s MySQL versie %3$s of nieuwer vereist. Je gebruikt versie %4$s." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Current PHP version number. +#: wp-admin/install.php:268 +msgid "You cannot install because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." +msgstr "Je kan niet installeren omdat WordPress %2$s PHP versie %3$s of nieuwer vereist. Je gebruikt versie %4$s." + +#: wp-admin/includes/dashboard.php:1940 +msgid "Set up your homepage" +msgstr "Je homepage instellen" + +#: wp-admin/includes/class-wp-site-health.php:736 +#: wp-admin/includes/dashboard.php:1781 +msgid "Learn more about updating PHP" +msgstr "Meer informatie over het bijwerken van PHP" + +#: wp-admin/includes/dashboard.php:1765 +msgid "What is PHP and how does it affect my site?" +msgstr "Wat is PHP en welke invloed heeft het op mijn site?" + +#: wp-admin/includes/plugin.php:2482 +msgid "You can find more details and make changes on the Plugins screen." +msgstr "Je kan meer details vinden en wijzigingen maken in het plugins scherm." + +#: wp-admin/includes/plugin.php:2481 +msgid "One or more plugins failed to load properly." +msgstr "Eén of meer plugins werden niet correct geladen." + +#: wp-admin/includes/plugin.php:2454 +msgid "Could not resume the plugin." +msgstr "Kon plugin niet hervatten." + +#: wp-admin/includes/plugin.php:501 +msgid "Custom PHP fatal error handler." +msgstr "Aangepaste PHP fatal error handler." + +#: wp-admin/includes/plugin.php:500 +msgid "Custom PHP error message." +msgstr "Aangepaste PHP error message." + +#: wp-admin/includes/class-language-pack-upgrader.php:122 +msgid "Could not remove the old translation." +msgstr "Kon de oude vertaling niet verwijderen." + +#: wp-admin/includes/class-language-pack-upgrader.php:121 +msgid "Removing the old version of the translation…" +msgstr "Oudere versie van de vertaling verwijderen…" + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/plugin-install.php:831 +msgid "Click here to update WordPress." +msgstr "Klik hier om WordPress te updaten." + +#: wp-admin/includes/plugin-install.php:827 +msgid "Error: This plugin requires a newer version of WordPress." +msgstr "Fout: Deze plugin vereist een nieuwere versie van WordPress." + +#. translators: %s: URL to Update PHP page. +#: wp-admin/includes/plugin-install.php:810 +msgid "Click here to learn more about updating PHP." +msgstr "Klik hier voor meer informatie over het bijwerken van PHP." + +#: wp-admin/includes/plugin-install.php:806 +msgid "Error: This plugin requires a newer version of PHP." +msgstr "Fout: Deze plugin vereist een nieuwere PHP versie." + +#. translators: %s: Widget title. +#: wp-admin/includes/widgets.php:255 +msgid "Add widget: %s" +msgstr "Widget toevoegen: %s" + +#. translators: %s: Widgets sidebar name. +#: wp-admin/includes/widgets.php:95 +msgid "Add to: %s" +msgstr "Toevoegen aan: %s" + +#. translators: Audio file track information. %s: Audio track number. +#: wp-admin/includes/media.php:369 +msgid "Track %s." +msgstr "Track %s." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:421 +msgid "Copy this section to clipboard" +msgstr "Deze sectie naar het klembord kopiëren" + +#: wp-admin/includes/schema.php:1245 +msgid "My Network" +msgstr "Mijn netwerk" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:687 +msgid "This plugin doesn’t work with your version of PHP." +msgstr "Deze plugin werkt niet met je PHP versie." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:678 +msgid "This plugin doesn’t work with your version of WordPress." +msgstr "Deze plugin werkt niet met je WordPress versie." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:654 +msgid "This plugin doesn’t work with your versions of WordPress and PHP." +msgstr "Deze plugin werkt niet met je versies van WordPress en PHP." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:542 +#: wp-admin/includes/plugin-install.php:864 +msgctxt "plugin" +msgid "Cannot Install" +msgstr "Kan niet installeren" + +#. translators: %s: WordPress version. +#. translators: %s: WordPress version +#: wp-admin/includes/update.php:305 wp-admin/install.php:238 +#: wp-admin/update-core.php:82 wp-admin/upgrade.php:80 wp-admin/about.php:96 +msgid "https://wordpress.org/support/wordpress-version/version-%s/" +msgstr "https://wordpress.org/support/wordpress-version/version-%s/" + +#: wp-admin/includes/class-wp-plugins-list-table.php:844 +#: wp-admin/themes.php:613 +msgid "Resume" +msgstr "Hervatten" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:843 +msgctxt "plugin" +msgid "Resume %s" +msgstr "%s hervatten" + +#: wp-admin/includes/theme.php:1147 +msgid "You can find more details and make changes on the Themes screen." +msgstr "Je kan meer details vinden and wijzigingen maken in het thema's scherm." + +#: wp-admin/includes/theme.php:1146 +msgid "One or more themes failed to load properly." +msgstr "Eén of meer thema's werden niet correct geladen." + +#: wp-admin/includes/theme.php:1119 +msgid "Could not resume the theme." +msgstr "Kon thema niet hervatten." + +#. translators: %s: Default category. +#: wp-admin/edit-tags.php:603 +msgid "Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the default category %s. The default category cannot be deleted." +msgstr "Een categorie verwijderen verwijdert niet de berichten in die categorie. Berichten die waren toegewezen aan de verwijderde categorie, worden daarom toegewezen aan de standaard categorie %s. De standaard categorie kan niet verwijderd worden." + +#. translators: %s: A link to install the Classic Editor plugin. +#: wp-admin/edit-form-blocks.php:454 +msgid "The block editor requires JavaScript. Please enable JavaScript in your browser settings, or try the Classic Editor plugin." +msgstr "De blok-editor vereist JavaScript. Activeer JavaScript in je browser instellingen of probeer de Klassieke Editor-plugin." + +#: wp-admin/post.php:47 +msgid "A post type mismatch has been detected." +msgstr "Een verkeerde berichttype combinatie is ontdekt." + +#: wp-admin/includes/class-wp-screen.php:295 wp-admin/post.php:20 +msgid "A post ID mismatch has been detected." +msgstr "Een verkeerde bericht-ID combinatie is ontdekt." + +#. translators: %s: A link to use the Classic Editor plugin. +#: wp-admin/includes/template.php:1177 +msgid "Please open the classic editor to use this meta box." +msgstr "De Klassieke editor openen om deze metabox te gebruiken." + +#. translators: %s: A link to activate the Classic Editor plugin. +#: wp-admin/includes/template.php:1164 +msgid "Please activate the Classic Editor plugin to use this meta box." +msgstr "De Klassieke editor plugin activeren om deze metabox te gebruiken." + +#. translators: %s: A link to install the Classic Editor plugin. +#: wp-admin/includes/template.php:1154 +msgid "Please install the Classic Editor plugin to use this meta box." +msgstr "De Klassieke editor plugin installeren om deze metabox te gebruiken." + +#: wp-admin/includes/template.php:1145 +msgid "This meta box isn't compatible with the block editor." +msgstr "Deze metabox werkt niet samen met de Blok-editor." + +#: wp-admin/freedoms.php:93 +msgid "To distribute copies of your modified versions to others." +msgstr "Om kopieën van je gewijzigde versies met anderen te delen." + +#: wp-admin/freedoms.php:92 +msgid "The 4th Freedom" +msgstr "De vierde vrijheid" + +#: wp-admin/freedoms.php:88 +msgid "To redistribute." +msgstr "Om verder te verspreiden." + +#: wp-admin/freedoms.php:87 +msgid "The 3rd Freedom" +msgstr "De derde vrijheid" + +#: wp-admin/freedoms.php:83 +msgid "To study how the program works and change it to make it do what you wish." +msgstr "Om te leren hoe het programma werkt en aan te passen om het te laten werken zoals jij dat wilt." + +#: wp-admin/freedoms.php:82 +msgid "The 2nd Freedom" +msgstr "De tweede vrijheid" + +#: wp-admin/freedoms.php:78 +msgid "To run the program for any purpose." +msgstr "Om de software te gebruiken voor welk doel dan ook." + +#: wp-admin/freedoms.php:77 +msgid "The 1st Freedom" +msgstr "De eerste vrijheid" + +#: wp-admin/includes/class-wp-application-passwords-list-table.php:30 +msgid "Created" +msgstr "Gecreëerd" + +#. translators: Use this to specify the CSS font family for the default font. +#: wp-admin/edit-form-blocks.php:194 +msgctxt "CSS Font Family for Editor Font" +msgid "Noto Serif" +msgstr "Noto Serif" + +#. translators: First post content. %s: Site link. +#: wp-admin/includes/upgrade.php:228 +msgid "Welcome to WordPress. This is your first post. Edit or delete it, then start writing!" +msgstr "Welkom bij WordPress. Dit is je eerste bericht. Bewerk of verwijder het, start dan met schrijven!" + +#. translators: First page content. %s: Site admin URL. +#: wp-admin/includes/upgrade.php:319 +msgid "As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!" +msgstr "Als nieuwe WordPress gebruiker kan je naar je dashboard gaan om deze pagina te verwijderen en nieuwe pagina's toe te voegen voor je inhoud. Veel plezier!" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:313 +msgid "The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community." +msgstr "De XYZ Doohickey Company is opgericht in 1971 en heeft sindsdien kwalitatieve doohickeys aan het publiek geleverd. Gevestigd in Gotham City, heeft XYZ meer dan 2000 mensen in dienst en doet allerlei fantastische dingen voor de community in Gotham." + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:308 +msgid "...or something like this:" +msgstr "...of zoiets als dit:" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:303 +msgid "Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)" +msgstr "Hoi daar! Ik ben een fietskoerier in het dagelijks leven en een beginnende acteur in de avonduren, en dit is mijn site. Ik leef in Los Angeles, heb een leuke hond genaamd Jack en ik hou van piña coladas. (En overvallen worden door de regen.)" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:298 +msgid "This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:" +msgstr "Dit is een voorbeeldpagina. Het is anders dan een blog bericht omdat het op één plek blijft en tevoorschijn komt in je site navigatie (in de meeste thema's). De meeste mensen starten met een Over pagina dat hen voorstelt aan potentiële site bezoekers. Het zou iets als dit kunnen zeggen:" + +#: wp-admin/includes/class-wp-posts-list-table.php:1417 +msgid "Export as JSON" +msgstr "Als JSON exporteren" + +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-posts-list-table.php:1416 +msgid "Export “%s” as JSON" +msgstr "“%s” als JSON exporteren" + +#: wp-admin/edit.php:369 +msgid "1 block not updated, somebody is editing it." +msgstr "1 blok niet bijgewerkt, iemand is het aan het bewerken." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:377 +msgid "%s block restored from the Trash." +msgid_plural "%s blocks restored from the Trash." +msgstr[0] "%s blok teruggezet uit de prullenbak." +msgstr[1] "%s blokken teruggezet uit de prullenbak." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:375 +msgid "%s block moved to the Trash." +msgid_plural "%s blocks moved to the Trash." +msgstr[0] "%s blok verplaatst naar de prullenbak." +msgstr[1] "%s blokken verplaatst naar de prullenbak." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:373 +msgid "%s block permanently deleted." +msgid_plural "%s blocks permanently deleted." +msgstr[0] "%s blok permanent verwijderd." +msgstr[1] "%s blokken permanent verwijderd." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:368 +msgid "%s block updated." +msgid_plural "%s blocks updated." +msgstr[0] "%s blok bijgewerkt." +msgstr[1] "%s blokken bijgewerkt." + +#: wp-admin/setup-config.php:283 +msgid "Error: \"Table Prefix\" must not be empty." +msgstr "Fout: \"Table Prefix\" mag niet leeg zijn." + +#: wp-admin/includes/meta-boxes.php:1001 +#: wp-admin/includes/class-wp-posts-list-table.php:1733 +#: wp-admin/edit-form-blocks.php:173 +msgid "Default template" +msgstr "Standaard template" + +#. translators: %s: The name of the plugin that generated this meta box. +#: wp-admin/includes/template.php:1143 wp-admin/includes/template.php:1381 +msgid "This meta box, from the %s plugin, isn't compatible with the block editor." +msgstr "Deze metabox, van de %s plugin, is niet compatibel met de Blok-editor." + +#. translators: Header for the About section in a personal data export. +#: wp-admin/includes/privacy-tools.php:359 +msgctxt "personal data group label" +msgid "About" +msgstr "Over" + +#. translators: Page title of the About WordPress page in the admin. +#: wp-admin/about.php:13 +msgctxt "page title" +msgid "About" +msgstr "Over" + +#: wp-admin/includes/upgrade.php:380 wp-admin/options-privacy.php:58 +msgid "Privacy Policy" +msgstr "Privacybeleid" + +#. translators: 1: URL to edit Privacy Policy page, 2: URL to preview Privacy +#. Policy page. +#: wp-admin/options-privacy.php:161 +msgid "Edit or preview your Privacy Policy page content." +msgstr "De inhoud van je privacybeleidspagina bewerken of als voorbeeld bekijken." + +#: wp-admin/includes/file.php:39 wp-admin/options-privacy.php:123 +msgid "Privacy Policy Page" +msgstr "Privacybeleidspagina" + +#. translators: %s: Page title. +#: wp-admin/includes/misc.php:1435 +msgid "%s (Draft)" +msgstr "%s (Concept)" + +#: wp-admin/options-privacy.php:25 +msgid "Privacy Policy page updated successfully." +msgstr "Privacybeleidspagina succesvol bijgewerkt." + +#. translators: %s: admin_init +#: wp-admin/includes/plugin.php:2345 +msgid "The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation." +msgstr "De voorgestelde inhoud van het privacybeleid moet worden toegevoegd door middel van de %s (of nieuwer) actie. Bekijk de inline documentatie." + +#. translators: %s: admin_init +#: wp-admin/includes/plugin.php:2334 +msgid "The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action." +msgstr "De voorgestelde inhoud van het privacybeleid moet alleen worden toegevoegd in wp-admin door middel van de %s (of nieuwer) actie. " + +#. translators: %s: Privacy Policy Guide URL. +#: wp-admin/includes/class-wp-privacy-policy-content.php:144 +msgid "The suggested privacy policy text has changed. Please review the guide and update your privacy policy." +msgstr "De voorgestelde privacybeleid tekst is gewijzigd. Bekijk de gids en werk je privacybeleid daar waar nodig bij." + +#: wp-admin/options-privacy.php:239 +msgid "There are no pages." +msgstr "Er zijn geen pagina's." + +#: wp-admin/options-privacy.php:133 +msgid "After your Privacy Policy page is set, we suggest that you edit it." +msgstr "Nadat je privacybeleidspagina is ingesteld, stellen we voor dat je deze aanpast." + +#. translators: 1: Privacy Policy guide URL, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-admin/options-privacy.php:175 +msgid "Need help putting together your new Privacy Policy page? Check out our guide%3$s for recommendations on what content to include, along with policies suggested by your plugins and theme." +msgstr "Hulp nodig bij het maken van je privacybeleidspagina? Bekijk onze gids%3$s voor aanbevelingen over welke inhoud je moet toevoegen samen met policies die door jouw plugins en thema voorgesteld worden." + +#: wp-admin/privacy-policy-guide.php:20 +msgid "Privacy Policy Guide" +msgstr "Privacybeleid gids" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:625 +msgid "Visitor comments may be checked through an automated spam detection service." +msgstr "Mogelijk worden reacties van bezoekers gecontroleerd via een geautomatiseerde spamdetectie service." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:572 +msgid "In this subsection you should note what analytics package you use, how users can opt out of analytics tracking, and a link to your analytics provider’s privacy policy, if any." +msgstr "In dit onderdeel moet je aangeven wat voor analytics programma je gebruikt, hoe je gebruikers kunnen aangeven dat ze niet gevolgd willen worden en een link naar de privacybeleidspagina van je analytics leverancier." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:529 +msgid "In this subsection you should note what information may be disclosed by users who can upload media files. All uploaded files are usually publicly accessible." +msgstr "In deze subsectie moet je aangeven welke informatie vrijgegeven zou kunnen worden door gebruikers die mediabestanden kunnen uploaden. Alle bestanden die zijn geüpload zijn normaliter publiekelijk toegankelijk." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:516 +msgid "In this subsection you should note what information is captured through comments. We have noted the data which WordPress collects by default." +msgstr "In deze subsectie moet je aangeven welke informatie verzameld wordt door middel van reacties. We hebben de gegevens vermeld die WordPress standaard verzameld." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:500 +msgid "In this section you should note what personal data you collect from users and site visitors. This may include personal data, such as name, email address, personal account preferences; transactional data, such as purchase information; and technical data, such as information about cookies." +msgstr "In deze sectie moet je aangeven welke persoonlijke gegevens je verzamelt van gebruikers en site bezoekers. Dit kan zijn persoonlijke gegevens, zoals naam, e-mailadres, persoonlijke account voorkeuren; transactie gegevens, zoals informatie over aankopen; en technische gegevens, zoals informatie over cookies." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:473 +msgid "Suggested text:" +msgstr "Voorgestelde tekst:" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:450 +msgid "We have suggested the sections you will need. Under each section heading you will find a short summary of what information you should provide, which will help you to get started. Some sections include suggested policy content, others will have to be completed with information from your theme and plugins." +msgstr "We hebben de onderdelen voorgesteld die je nodig hebt. Onder elke onderdeel-kop vind je een korte beschrijving over welke informatie je moet geven, welke je op weg zal helpen. Enkele onderdelen bevatten voorgestelde inhoud voor het beleid, andere moeten worden aangevuld met informatie van jouw thema en plugins." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-privacy-policy-content.php:413 +msgid "Source: %s" +msgstr "Bron: %s" + +#. translators: %s: Date of privacy policy text update. +#: wp-admin/includes/class-wp-privacy-policy-content.php:399 +msgid "Updated %s." +msgstr "Bijgewerkt %s." + +#. translators: %s: Date of plugin deactivation. +#: wp-admin/includes/class-wp-privacy-policy-content.php:393 +msgid "You deactivated this plugin on %s and may no longer need this policy." +msgstr "Je hebt deze plugin op %s gedeactiveerd en hebt dit beleid mogelijk niet langer nodig." + +#. translators: %s: Date of plugin deactivation. +#: wp-admin/includes/class-wp-privacy-policy-content.php:390 +msgid "Removed %s." +msgstr "Verwijderd %s." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:378 +#: wp-admin/includes/class-wp-privacy-policy-content.php:447 +msgid "Introduction" +msgstr "Introductie" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:330 +msgid "Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme." +msgstr "Hulp nodig bij het samenstellen van je nieuwe privacybeleid pagina? Bekijk onze gids voor aanbevelingen over welke inhoud toe te voegen naast het beleid voorgesteld door je plugins en thema." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:66 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:140 +msgid "Erasing data..." +msgstr "Gegevens aan het wissen..." + +#: wp-admin/erase-personal-data.php:60 +msgid "Add Data Erasure Request" +msgstr "Toevoegen gegevens wissen aanvraag" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:133 +msgid "Send export link" +msgstr "Verzend export link" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:680 +msgid "If you are a member of a regulated industry, or if you are subject to additional privacy laws, you may be required to disclose that information here." +msgstr "Als je deel uitmaakt van een gereguleerde sector, of als er aanvullende privacy wetgeving van toepassing is, kan het verplicht zijn om dat hier te vermelden." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:676 +msgid "Industry regulatory disclosure requirements" +msgstr "Openbaarmakingsverplichtingen van de industrie" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:672 +msgid "If your web site provides a service which includes automated decision making - for example, allowing customers to apply for credit, or aggregating their data into an advertising profile - you must note that this is taking place, and include information about how that information is used, what decisions are made with that aggregated data, and what rights users have over decisions made without human intervention." +msgstr "Indien je site een dienst levert die geautomatiseerde besluiten maakt, zoals bijvoorbeeld het aanvragen van leningen of je verzamelt gegevens in een advertentieprofiel, dan moet je aangeven dat dit gebeurt. Daarnaast moet je ook aangeven hoe deze informatie gebruikt wordt, welke besluiten genomen worden op basis van de verzamelde gegevens en welke rechten gebruikers hebben over besluiten die genomen zijn zonder menselijk ingrijpen. " + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:668 +msgid "What automated decision making and/or profiling we do with user data" +msgstr "Wat voor geautomatiseerde besluitvorming en/of profilering we doen met gebruikersgegevens" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:664 +msgid "If your web site receives data about users from third parties, including advertisers, this information must be included within the section of your privacy policy dealing with third party data." +msgstr "Als je site data ontvangt van gebruikers van derde partijen, inclusief adverteerders, dan moet deze informatie toegevoegd worden aan het onderdeel over derde partijen data op je privacybeleidspagina." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:660 +msgid "What third parties we receive data from" +msgstr "Van welke derde partijen we gegevens ontvangen" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:656 +msgid "In this section you should explain what procedures you have in place to deal with data breaches, either potential or real, such as internal reporting systems, contact mechanisms, or bug bounties." +msgstr "In dit onderdeel moet je uitleggen welke procedures je volgt om om te gaan met datalekken, hetzij potentiële of echte, zoals interne rapportage systemen, contact mechanismen of bug premies." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:652 +msgid "What data breach procedures we have in place" +msgstr "Welke datalek procedures we geïmplementeerd hebben" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:648 +msgid "In this section you should explain what measures you have taken to protect your users’ data. This could include technical measures such as encryption; security measures such as two factor authentication; and measures such as staff training in data protection. If you have carried out a Privacy Impact Assessment, you can mention it here too." +msgstr "In dit onderdeel moet je uitleggen welke maatregelen je hebt genomen om de gegevens van je gebruikers te beschermen. Dit kunnen technische maatregelen zijn, zoals encryptie; beveiligingsmaatregelen zoals twee-factor authenticatie en maatregelen zoals het opleiden van personeel in gegevensbescherming. Als je een privacy impact assessment hebt laten uitvoeren, kan je die hier ook noemen." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:644 +msgid "How we protect your data" +msgstr "Hoe we jouw gegevens beschermen" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:640 +msgid "If you use your site for commercial purposes and you engage in more complex collection or processing of personal data, you should note the following information in your privacy policy in addition to the information we have already discussed." +msgstr "Als je je site voor commerciële doeleinden gebruikt en je aan de slag gaat met complexere verzameling of verwerking van persoonlijke gegevens, dan moet je de navolgende informatie in je privacybeleid vermelden in aanvulling op de informatie die we al hebben besproken." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:636 +msgid "Additional information" +msgstr "Aanvullende informatie" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:632 +msgid "In this section you should provide a contact method for privacy-specific concerns. If you are required to have a Data Protection Officer, list their name and full contact details here as well." +msgstr "In dit onderdeel verschaf je informatie over de juiste contactmethode in het geval van privacy specifieke gevallen. In het geval dat je verplicht ben om een Data Protection Officer te hebben, meld dan hier ook hun naam en volledige contactgegevens." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:628 +msgid "Your contact information" +msgstr "Jouw contactinformatie" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:621 +msgid "European data protection law requires data about European residents which is transferred outside the European Union to be safeguarded to the same standards as if the data was in Europe. So in addition to listing where data goes, you should describe how you ensure that these standards are met either by yourself or by your third party providers, whether that is through an agreement such as Privacy Shield, model clauses in your contracts, or binding corporate rules." +msgstr "De Europese data beschermingswet verplicht dat data van Europeanen die buiten de Europese Unie bewaard worden op dezelfde manier beschermd worden alsof de data in Europa bewaard zou worden. Dus, naast dat je aan moet geven waar de data bewaard wordt moet je ook aangeven hoe jij of derde partijen deze verplichten naleven. Hetzij door een overeenkomst zoals een Privacy Shield, clausules in je contracten of door bindende bedrijfsreguleringen." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:619 +msgid "In this section you should list all transfers of your site data outside the European Union and describe the means by which that data is safeguarded to European data protection standards. This could include your web hosting, cloud storage, or other third party services." +msgstr "In dit onderdeel moet je alle dataoverdracht van de gegevens van je site buiten de Europese Unie opnoemen en beschrijven op welke manier die gegevens zijn beveiligd naar Europese gegevens beveiligingsstandaarden. Dit kunnen bijvoorbeeld webhosting, cloudopslag of andere diensten van derden zijn." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:615 +msgid "Where we send your data" +msgstr "Waar we jouw gegevens naartoe sturen" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:612 +msgid "If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes." +msgstr "Als je een account hebt op deze site of je hebt reacties achter gelaten, kan je verzoeken om een exportbestand van je persoonlijke gegevens die we van je hebben, inclusief alle gegevens die je ons opgegeven hebt. Je kan ook verzoeken dat we alle persoonlijke gegevens die we van je hebben wissen. Dit bevat geen gegevens die we verplicht moeten bewaren in verband met administratieve, wettelijke of beveiligings doeleinden." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:608 +msgid "In this section you should explain what rights your users have over their data and how they can invoke those rights." +msgstr "In dit onderdeel moet je uitleggen wat voor rechten je gebruikers hebben over hun data en hoe ze deze rechten uit kunnen voeren." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:604 +msgid "What rights you have over your data" +msgstr "Welke rechten je hebt over je gegevens" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:601 +msgid "For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information." +msgstr "Voor gebruikers die zich op onze site registreren (indien aanwezig), slaan we ook de persoonlijke informatie op die ze verstrekken in hun gebruikersprofiel. Alle gebruikers kunnen op ieder moment hun persoonlijke informatie bekijken, bewerken of verwijderen (behalve dat ze hun gebruikersnaam niet kunnen wijzigen). Site beheerders kunnen deze informatie ook bekijken en bewerken." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:599 +msgid "If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue." +msgstr "Wanneer je een reactie achterlaat dan wordt die reactie en de metadata van die reactie voor altijd bewaard. Op deze manier kunnen we vervolgreacties automatisch herkennen en goedkeuren in plaats van dat we ze moeten modereren." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:595 +msgid "In this section you should explain how long you retain personal data collected or processed by the web site. While it is your responsibility to come up with the schedule of how long you keep each dataset for and why you keep it, that information does need to be listed here. For example, you may want to say that you keep contact form entries for six months, analytics records for a year, and customer purchase records for ten years." +msgstr "In dit onderdeel moet je uitleggen hoe lang je verzamelde persoonlijke gegevens of verwerkte gegevens door deze site bewaart. Ondanks dat het jouw verantwoordelijkheid is om een planning te maken hoe lang je deze gegevens bewaart en waarom, dient die informatie hier wel getoond te worden. Je kan bijvoorbeeld zeggen dat je gegevens van contactformulieren zes maanden bewaart, statistieken één jaar en klant aankopen tien jaar." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:591 +msgid "How long we retain your data" +msgstr "Hoe lang we jouw gegevens bewaren" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:584 +msgid "By default WordPress does not share any personal data with anyone." +msgstr "Standaard deelt WordPress geen enkele persoonlijke data met wie dan ook." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:582 +msgid "In this section you should name and list all third party providers with whom you share site data, including partners, cloud-based services, payment processors, and third party service providers, and note what data you share with them and why. Link to their own privacy policies if possible." +msgstr "In deze sectie moet je alle derde partijen benoemen met wie je site gegevens deelt, inclusief partners, cloud-based diensten, betalingsverwerkers en service providers, en vermelden welke gegevens je met hen deelt en waarom. Link naar hun eigen privacybeleid waar mogelijk." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:578 +msgid "Who we share your data with" +msgstr "Met wie we jouw gegevens delen" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:574 +msgid "By default WordPress does not collect any analytics data. However, many web hosting accounts collect some anonymous analytics data. You may also have installed a WordPress plugin that provides analytics services. In that case, add information from that plugin here." +msgstr "Standaard verzamelt WordPress geen enkele analytics data. Let wel, heel veel webhosting accounts verzamelen geanonimiseerde analytics data. Je kunt ook een WordPress plugin geïnstalleerd hebben die analytics services verleend. In dat geval, voeg de informatie van die plugin hier toe." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:568 +msgid "Analytics" +msgstr "Analytics" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:565 +msgid "These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website." +msgstr "Deze sites kunnen gegevens over je verzamelen, cookies gebruiken, extra tracking van derde partijen insluiten en je interactie met deze ingesloten inhoud monitoren, inclusief het vastleggen van de interactie met ingesloten inhoud als je een account hebt en ingelogd bent op die site." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:563 +msgid "Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website." +msgstr "Berichten op deze site kunnen ingesloten (embedded) inhoud bevatten (bijvoorbeeld video's, afbeeldingen, berichten, etc.). Ingesloten inhoud van andere sites gedraagt zich exact hetzelfde alsof de bezoeker deze andere site heeft bezocht." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:561 +msgid "Embedded content from other websites" +msgstr "Ingesloten inhoud van andere sites" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:558 +msgid "If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day." +msgstr "Wanneer je een bericht wijzigt of publiceert wordt een aanvullende cookie door je browser opgeslagen. Deze cookie bevat geen persoonlijke data en heeft enkel het post ID van het artikel wat je hebt bewerkt in zich. Deze cookie is na een dag verlopen." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:556 +msgid "When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed." +msgstr "Zodra je inlogt, zullen we enkele cookies bewaren in verband met jouw login informatie en schermweergave opties. Login cookies zijn 2 dagen geldig en cookies voor schermweergave opties 1 jaar. Als je "Herinner mij" selecteert, wordt je login 2 weken bewaard. Zodra je uitlogt van jouw account, worden login cookies verwijderd." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:554 +msgid "If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser." +msgstr "Indien je onze inlogpagina bezoekt, slaan we een tijdelijke cookie op om te controleren of je browser cookies accepteert. Deze cookie bevat geen persoonlijke gegevens en wordt verwijderd zodra je je browser sluit." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:552 +msgid "If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year." +msgstr "Wanneer je een reactie achterlaat op onze site, kun je aangeven of je naam, je e-mailadres en site in een cookie opgeslagen mogen worden. Dit doen we voor je gemak zodat je deze gegevens niet opnieuw hoeft in te vullen voor een nieuwe reactie. Deze cookies zijn een jaar lang geldig. " + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:548 +msgid "In this subsection you should list the cookies your web site uses, including those set by your plugins, social media, and analytics. We have provided the cookies which WordPress installs by default." +msgstr "In dit onderdeel moet je alle cookies opsommen waar jouw site gebruik van maakt. Inclusief diegene die door jouw plugins, social media en analytics gebruikt worden. We hebben een overzicht van alle cookies die WordPress standaard gebruikt toegevoegd." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:544 +msgid "Cookies" +msgstr "Cookies" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:522 +msgid "An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment." +msgstr "Een geanonimiseerde string, gemaakt op basis van je e-mailadres (dit wordt ook een hash genoemd) kan worden gestuurd naar de Gravatar service indien je dit gebruikt. De privacybeleidspagina kun je hier vinden: https://automattic.com/privacy/. Nadat je reactie is goedgekeurd, is je profielfoto publiekelijk zichtbaar in de context van je reactie." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:520 +msgid "When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection." +msgstr "Als bezoekers reacties achterlaten op de site, verzamelen we de gegevens getoond in het reactieformulier, het IP-adres van de bezoeker en de browser user agent om te helpen spam te detecteren." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:540 +msgid "By default, WordPress does not include a contact form. If you use a contact form plugin, use this subsection to note what personal data is captured when someone submits a contact form, and how long you keep it. For example, you may note that you keep contact form submissions for a certain period for customer service purposes, but you do not use the information submitted through them for marketing purposes." +msgstr "Standaard bevat WordPress geen contact formulier. Als je een contact formulier plugin gebruikt, beschrijf dan in deze subsectie welke persoonlijke gegevens worden vastgelegd als iemand een contact formulier invult en hoe lang je deze bewaart. Je kunt bijvoorbeeld aangeven dat je contact formulier inzendingen voor een bepaalde periode bewaart voor het verlenen van service aan klanten, maar dat je de ingezonden informatie niet gebruikt voor marketing doeleinden." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:536 +msgid "Contact forms" +msgstr "Contactformulieren" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:533 +msgid "If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website." +msgstr "Als je een geregistreerde gebruiker bent en afbeeldingen naar de site upload, moet je voorkomen dat je afbeeldingen uploadt met daarin EXIF GPS locatie gegevens. Bezoekers van de site kunnen de afbeeldingen van de site downloaden en de locatiegegevens inzien." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:508 +msgid "By default WordPress does not collect any personal data about visitors, and only collects the data shown on the User Profile screen from registered users. However some of your plugins may collect personal data. You should add the relevant information below." +msgstr "Standaard verzamelt WordPress geen persoonlijke gegevens over bezoekers, alleen de gegevens die getoond worden in het scherm met het gebruikersprofiel van geregistreerde gebruikers. Maar sommige van je plugins kunnen ook persoonlijke gegevens verzamelen; voeg de relevante informatie hieronder toe." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:506 +msgid "Personal data is not just created by a user’s interactions with your site. Personal data is also generated from technical processes such as contact forms, comments, cookies, analytics, and third party embeds." +msgstr "Persoonlijke gegevens worden niet alleen gecreëerd door interacties van gebruikers met je site. Persoonlijke gegevens worden ook gegenereerd door technische processen zoals, contact formulieren, reacties, analytics en insluitingen van derden." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:504 +msgid "In addition to listing what personal data you collect, you need to note why you collect it. These explanations must note either the legal basis for your data collection and retention or the active consent the user has given." +msgstr "Naast het opsommen van welke persoonlijke gegevens je verzamelt, moet je ook vermelden waarom je deze verzamelt. Deze uitleg moet hetzij de wettelijke basis voor je gegevensverzameling en -bewaring of de actieve toestemming die de gebruiker heeft gegeven, vermelden." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:502 +msgid "You should also note any collection and retention of sensitive personal data, such as data concerning health." +msgstr "Je moet ook elke verzameling en bewaring van gevoelige persoonlijke gegevens, zoals gegevens met betrekking tot gezondheid vermelden." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:496 +msgid "What personal data we collect and why we collect it" +msgstr "Welke persoonlijke gegevens we verzamelen en waarom we die verzamelen" + +#. translators: Default privacy policy text. %s: Site URL. +#: wp-admin/includes/class-wp-privacy-policy-content.php:493 +msgid "Our website address is: %s." +msgstr "Ons site-adres is: %s." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:489 +msgid "The amount of information you may be required to show will vary depending on your local or national business regulations. You may, for example, be required to display a physical address, a registered address, or your company registration number." +msgstr "De hoeveelheid informatie die je mogelijk verplicht wordt te tonen zal variëren afhankelijk van lokale of nationale bedrijfsregelgeving. Je kan bijvoorbeeld mogelijk verplicht worden om een fysiek adres, een geregistreerd adres of je bedrijfsregistratienummer weer te geven." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:487 +msgid "In this section you should note your site URL, as well as the name of the company, organization, or individual behind it, and some accurate contact information." +msgstr "In dit gedeelte zou je de URL van je site moeten vermelden, evenals de naam van het bedrijf, organisatie of individu erachter en enkele nauwkeurige contactgegevens." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:483 +msgid "Who we are" +msgstr "Wie zijn we" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:452 +msgid "It is your responsibility to write a comprehensive privacy policy, to make sure it reflects all national and international legal requirements on privacy, and to keep your policy current and accurate." +msgstr "Het is jouw verantwoordelijkheid om een uitgebreid privacybeleid te schrijven, om ervoor te zorgen dat het alle nationale en internationale wettelijke vereisten omtrent privacy weerspiegelt en om je beleid actueel en accuraat te houden." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:451 +msgid "Please edit your privacy policy content, making sure to delete the summaries, and adding any information from your theme and plugins. Once you publish your policy page, remember to add it to your navigation menu." +msgstr "Bewerk de inhoud van je privacybeleid, verwijder de beschrijvingen en voeg informatie van je thema en plugins toe. Zodra je je privacybeleidspagina gepubliceerd hebt, vergeet dan niet om deze ook toe te voegen aan je navigatiemenu." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:449 +msgid "This text template will help you to create your web site’s privacy policy." +msgstr "Deze tekst template helpt je om het privacybeleid van jouw site te maken." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:448 +msgid "Hello," +msgstr "Hallo," + +#: wp-admin/options-privacy.php:125 +msgid "As a website owner, you may need to follow national or international privacy laws. For example, you may need to create and display a Privacy Policy." +msgstr "Als site-eigenaar moet je voldoen aan nationale of internationale privacy wetgeving. Je kan bijvoorbeeld een privacybeleid maken en tonen." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:68 +msgid "Force erasure has failed." +msgstr "Geforceerd wissen is mislukt." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:136 +msgid "Email could not be sent." +msgstr "E-mail kon niet verzonden worden." + +#: wp-admin/includes/privacy-tools.php:377 +msgctxt "date/time" +msgid "On" +msgstr "Op" + +#: wp-admin/includes/privacy-tools.php:373 +msgctxt "website URL" +msgid "At URL" +msgstr "Op URL" + +#: wp-admin/includes/privacy-tools.php:369 +msgctxt "website name" +msgid "For site" +msgstr "Voor site" + +#: wp-admin/includes/privacy-tools.php:365 +msgctxt "email address" +msgid "Report generated for" +msgstr "Rapport gegenereerd voor" + +#. translators: %s: Exporter array index. +#: wp-admin/includes/ajax-actions.php:4824 +msgid "Exporter array at index %s does not include a friendly name." +msgstr "Exporterende array op index %s bevat geen beschrijvende naam." + +#: wp-admin/erase-personal-data.php:13 +msgid "Sorry, you are not allowed to erase personal data on this site." +msgstr "Je hebt geen toestemming om persoonlijke gegevens op deze site te wissen." + +#: wp-admin/export-personal-data.php:13 +msgid "Sorry, you are not allowed to export personal data on this site." +msgstr "Je hebt geen toestemming om persoonlijke data te exporteren op deze site." + +#: wp-admin/includes/ajax-actions.php:4991 +msgid "Eraser index is out of range." +msgstr "Wisser index is buiten bereik." + +#: wp-admin/includes/ajax-actions.php:4950 +msgid "Missing eraser index." +msgstr "Ontbrekende wisser index." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4875 +msgid "Expected done (boolean) in response array from exporter: %s." +msgstr "Verwachtte done (boolean) in reactie array van exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4868 +msgid "Expected data array in response array from exporter: %s." +msgstr "Verwachtte data array in reactie array van exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4861 +msgid "Expected data in response array from exporter: %s." +msgstr "Verwachtte data in reactie array van exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4854 +msgid "Expected response as an array from exporter: %s." +msgstr "Verwachtte reactie als een array van exporter: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4840 +msgid "Exporter callback is not a valid callback: %s." +msgstr "Exporter callback is geen geldige callback: %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4833 +msgid "Exporter does not include a callback: %s." +msgstr "Exporter bevat geen callback: %s." + +#. translators: %s: Exporter array index. +#: wp-admin/includes/ajax-actions.php:4817 +msgid "Expected an array describing the exporter at index %s." +msgstr "Verwachtte een array die de exporter beschrijft op index %s." + +#: wp-admin/includes/ajax-actions.php:4803 +msgid "Exporter index is out of range." +msgstr "Exporter index buiten bereik." + +#: wp-admin/includes/ajax-actions.php:4799 +msgid "Exporter index cannot be negative." +msgstr "Exporter index mag niet negatief zijn." + +#: wp-admin/includes/ajax-actions.php:4793 +msgid "An exporter has improperly used the registration filter." +msgstr "Een exporter heeft het registratie filter niet juist gebruikt." + +#: wp-admin/includes/ajax-actions.php:4764 +#: wp-admin/includes/ajax-actions.php:4956 +msgid "Missing page index." +msgstr "Ontbrekende pagina index." + +#: wp-admin/includes/ajax-actions.php:4758 +msgid "Missing exporter index." +msgstr "Ontbrekende export index." + +#: wp-admin/includes/ajax-actions.php:4749 +#: wp-admin/includes/ajax-actions.php:4940 +msgid "Invalid request type." +msgstr "Ongeldige request type." + +#: wp-admin/options-privacy.php:246 +msgid "Create New Page" +msgstr "Een nieuwe pagina maken" + +#: wp-admin/options-privacy.php:227 +msgid "Use This Page" +msgstr "Deze pagina gebruiken" + +#: wp-admin/options-privacy.php:192 +msgid "Select a Privacy Policy page" +msgstr "Een privacybeleidspagina selecteren" + +#: wp-admin/options-privacy.php:190 +msgid "Change your Privacy Policy page" +msgstr "Je privacybeleidspagina wijzigen" + +#. translators: 1: URL to edit Privacy Policy page, 2: URL to view Privacy +#. Policy page. +#: wp-admin/options-privacy.php:154 +msgid "Edit or view your Privacy Policy page content." +msgstr "De inhoud van je privacybeleidspagina bewerken of bekijken." + +#: wp-admin/options-privacy.php:134 +msgid "We would also suggest reviewing your Privacy Policy from time to time, especially after installing or updating any themes or plugins. There may be changes or new suggested information for you to consider adding to your policy." +msgstr "We bevelen ook aan om van tijd tot tijd je privacybeleid opnieuw te beoordelen, vooral na een update. Er kunnen wijzigingen zijn of nieuwe suggesties die je zou kunnen toevoegen aan je beleid." + +#: wp-admin/options-privacy.php:130 +msgid "However, it is your responsibility to use those resources correctly, to provide the information that your Privacy Policy requires, and to keep that information current and accurate." +msgstr "Echter, het is jouw verantwoordelijkheid om deze gegevensbron op correcte wijze te gebruiken, om de informatie te verstrekken die je privacybeleid vereist en om die informatie actueel en accuraat te houden." + +#: wp-admin/options-privacy.php:129 +msgid "The new page will include help and suggestions for your Privacy Policy." +msgstr "De nieuwe pagina bevat hulp en suggesties voor je privacybeleid." + +#: wp-admin/options-privacy.php:126 +msgid "If you already have a Privacy Policy page, please select it below. If not, please create one." +msgstr "Als je al een privacybeleid pagina hebt, selecteer deze hieronder. Zo niet, maak er één." + +#. translators: %s: URL to Pages Trash. +#: wp-admin/options-privacy.php:104 +msgid "The currently selected Privacy Policy page is in the Trash. Please create or select a new Privacy Policy page or restore the current page." +msgstr "De huidig geselecteerde privacybeleidspagina bevindt zich in de prullenmand. Maak of selecteer een nieuwe privacybeleidspagina of herstel de huidige pagina." + +#: wp-admin/options-privacy.php:94 +msgid "The currently selected Privacy Policy page does not exist. Please create or select a new page." +msgstr "De nu geselecteerde privacybeleidspagina bestaat niet. Maak of selecteer een nieuwe pagina." + +#: wp-admin/options-privacy.php:70 +msgid "Unable to create a Privacy Policy page." +msgstr "Het is niet gelukt een privacybeleidspagina aan te maken." + +#. translators: Privacy Policy page slug. +#: wp-admin/includes/upgrade.php:382 +msgid "privacy-policy" +msgstr "privacybeleid" + +#. translators: %s: URL to Customizer -> Menus. +#: wp-admin/options-privacy.php:42 +msgid "Privacy Policy page setting updated successfully. Remember to update your menus!" +msgstr "Privacybeleidspagina instelling is succesvol geüpdatet. Vergeet niet om je menu's te updaten!" + +#. translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are +#. placeholders. +#: wp-admin/includes/privacy-tools.php:630 +msgid "" +"Howdy,\n" +"\n" +"Your request for an export of personal data has been completed. You may\n" +"download your personal data by clicking on the link below. For privacy\n" +"and security, we will automatically delete the file on ###EXPIRATION###,\n" +"so please download it before then.\n" +"\n" +"###LINK###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hallo,\n" +"\n" +"Je verzoek voor een export van persoonlijke data is afgerond. Je kunt\n" +"je persoonlijke data downloaden door op de link hieronder te klikken. Ivm privacy\n" +"en beveiliging, zullen we het bestand automatisch verwijderen op ###EXPIRATION###,\n" +"dus download het voor die tijd.\n" +"\n" +"###LINK###\n" +"\n" +"Groeten,\n" +"Iedereen bij ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:135 +msgid "Email sent." +msgstr "E-mail verstuurd." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:134 +msgid "Sending email..." +msgstr "E-mail aan het verzenden..." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:62 +msgid "Download personal data again" +msgstr "Persoonlijke gegevens opnieuw downloaden" + +#: wp-admin/includes/privacy-tools.php:714 +msgid "Unable to send personal data export email." +msgstr "Het is niet gelukt om de geëxporteerde persoonlijke gegevens via e-mail te versturen." + +#. translators: Personal data export notification email subject. %s: Site +#. title. +#: wp-admin/includes/privacy-tools.php:604 +msgid "[%s] Personal Data Export" +msgstr "[%s] Persoonlijke gegevens exporteren" + +#: wp-admin/includes/privacy-tools.php:559 +msgid "Invalid request ID when sending personal data export email." +msgstr "Ongeldige aanvraag-ID tijdens het versturen van de persoonlijke gegevens export e-mail." + +#: wp-admin/includes/privacy-tools.php:433 +msgid "Personal Data Export" +msgstr "Persoonlijke gegevens exporteren" + +#. translators: %s: User's email address. +#: wp-admin/includes/privacy-tools.php:349 +msgid "Personal Data Export for %s" +msgstr "Persoonlijke gegevens voor %s exporteren" + +#: wp-admin/includes/ajax-actions.php:4754 +msgid "A valid email address must be given." +msgstr "Een geldig e-mailadres moet opgegeven worden." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:65 +msgid "Force erase personal data" +msgstr "Forceer wissen van persoonlijke gegevens" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:156 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:163 +msgid "Remove request" +msgstr "Aanvraag verwijderen" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:116 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:122 +msgid "Waiting for confirmation" +msgstr "Wacht op bevestiging" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:61 +msgid "Downloading data..." +msgstr "Gegevens aan het downloaden..." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:60 +msgid "Download personal data" +msgstr "Download persoonlijke gegevens" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:45 +msgid "Requested" +msgstr "Aangevraagd" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:43 +msgid "Requester" +msgstr "Aanvrager" + +#: wp-admin/erase-personal-data.php:66 wp-admin/export-personal-data.php:66 +msgid "Send Request" +msgstr "Verstuur aanvraag" + +#: wp-admin/erase-personal-data.php:64 wp-admin/export-personal-data.php:64 +msgid "Username or email address" +msgstr "Gebruikersnaam of e-mailadres" + +#: wp-admin/erase-personal-data.php:61 wp-admin/export-personal-data.php:61 +msgid "An email will be sent to the user at this email address asking them to verify the request." +msgstr "Een e-mail zal verzonden worden naar de gebruiker op dit e-mailadres met de vraag het verzoek te verifiëren." + +#: wp-admin/export-personal-data.php:60 +msgid "Add Data Export Request" +msgstr "Gegevensexportverzoek toevoegen" + +#: wp-admin/includes/privacy-tools.php:169 +msgid "Confirmation request initiated successfully." +msgstr "Bevestiging dat het gegevensexportverzoek succesvol is begonnen." + +#: wp-admin/includes/privacy-tools.php:130 +msgid "Unable to add this request. A valid email address or username must be supplied." +msgstr "Kan deze aanvraag niet toevoegen. Er moet een geldig e-mailadres of gebruikersnaam worden opgegeven." + +#: wp-admin/includes/privacy-tools.php:91 +msgid "Confirmation request sent again successfully." +msgstr "Bevestiging dat het request opnieuw succesvol is verstuurd." + +#: wp-admin/includes/privacy-tools.php:158 +msgid "Unable to initiate confirmation request." +msgstr "Het is niet gelukt om de bevestiging van het request te initiëren." + +#: wp-admin/includes/ajax-actions.php:4736 +#: wp-admin/includes/ajax-actions.php:4926 +msgid "Invalid request ID." +msgstr "Ongeldig request ID." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5100 +msgid "Expected done flag in response array from %1$s eraser (index %2$d)." +msgstr "Verwachte klaar melding in reactie array van %1$s wisser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5089 +msgid "Expected messages key to reference an array in response array from %1$s eraser (index %2$d)." +msgstr "Verwachte berichten key in referentie to een array in reactie array van %1$s wisser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5078 +msgid "Expected messages key in response array from %1$s eraser (index %2$d)." +msgstr "Verwachte berichten key in reactie array van %1$s wisser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5067 +msgid "Expected items_retained key in response array from %1$s eraser (index %2$d)." +msgstr "Verwacht items_retained key in reactie array van %1$s wisser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5056 +msgid "Expected items_removed key in response array from %1$s eraser (index %2$d)." +msgstr "Verwacht items_removed key in reactie array van %1$s wisser (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5045 +msgid "Did not receive array from %1$s eraser (index %2$d)." +msgstr "Geen array ontvangen van %1$s wisser (index %2$d)." + +#. translators: %d: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5009 +msgid "Eraser array at index %d does not include a friendly name." +msgstr "Wisser array in index %d heeft geen gebruikersvriendelijke naam." + +#. translators: %d: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5004 +msgid "Expected an array describing the eraser at index %d." +msgstr "Er wordt een array die de wisser beschreef in index %d verwacht." + +#: wp-admin/includes/ajax-actions.php:4807 +#: wp-admin/includes/ajax-actions.php:4995 +msgid "Page index cannot be less than one." +msgstr "Pagina-index kan niet minder zijn dan één." + +#: wp-admin/includes/ajax-actions.php:4987 +msgid "Eraser index cannot be less than one." +msgstr "Wisser index kan niet lager zijn dan één." + +#: wp-admin/includes/ajax-actions.php:4946 +msgid "Invalid email address in request." +msgstr "Ongeldig e-mailadres in verzoek." + +#: wp-admin/includes/plugin-install.php:676 +msgid "Requires PHP Version:" +msgstr "Vereist PHP-versie:" + +#: wp-admin/customize.php:80 +msgid "This changeset cannot be further modified." +msgstr "Deze wijzigingsset kan niet verder aangepast worden." + +#. translators: %s: https://wordpress.org/about/stats +#: wp-admin/privacy.php:64 +msgid "This data is used to provide general enhancements to WordPress, which includes helping to protect your site by finding and automatically installing new updates. It is also used to calculate statistics, such as those shown on the WordPress.org stats page." +msgstr "Deze gegevens worden gebruikt voor algehele verbeteringen aan WordPress, zoals het beschermen van je site door middel van het automatisch installeren van nieuwe updates. Ook worden deze gebruikt voor algemene statistieken, zoals deze getoond worden op de WordPress.org statistieken pagina." + +#. translators: %s: Link to Custom CSS section in the Customizer. +#: wp-admin/theme-editor.php:205 +msgid "There’s no need to change your CSS here — you can edit and live preview CSS changes in the built-in CSS editor." +msgstr "Het is niet nodig om jouw CSS hier te wijzigen — je kunt CSS wijzigingen maken en meteen voorvertonen in de ingebouwde CSS editor." + +#: wp-admin/theme-editor.php:200 +msgid "Did you know?" +msgstr "Wist je dat?" + +#: wp-admin/credits.php:149 +msgid "Noteworthy Contributors" +msgstr "Noemenswaardige bijdragers" + +#: wp-admin/theme-editor.php:373 +msgid "If you decide to go ahead with direct edits anyway, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." +msgstr "Als je besluit om door te gaan met directe wijzigingen, gebruik een FTP-programma of andere bestandsmanager om een kopie te maken met een nieuwe naam en hou het origineel bij de hand. Op die manier kan je een werkende versie herstellen als er iets fout gaat." + +#: wp-admin/plugin-editor.php:327 +msgid "If you absolutely have to make direct edits to this plugin, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." +msgstr "Als je daadwerkelijk rechtstreeks plugins wilt bewerken, gebruikt bestandsbeheer om een kopie met een nieuwe naam te maken zodat het origineel blijft behouden. Op deze manier kun je een functionele versie opnieuw inschakelen als er iets misgaat." + +#: wp-admin/plugin-editor.php:326 +msgid "You appear to be making direct edits to your plugin in the WordPress dashboard. We recommend that you don’t! Editing plugins directly may introduce incompatibilities that break your site and your changes may be lost in future updates." +msgstr "Het lijkt er op dat je directe wijzigingen maakt aan je plugin vanuit het WordPress dashboard. We raden je aan dit niet te doen! Het direct aanpassen van plugins kan je site beschadigen en je wijzigingen kunnen verloren gaan met toekomstige updates." + +#. translators: 1: Codex URL, 2: URL to Reading Settings screen. +#: wp-admin/options-writing.php:223 +msgid "WordPress is not notifying any Update Services because of your site’s visibility settings." +msgstr "WordPress zal geen Update Services informeren vanwege de zichtbaarheid instellingen van je site." + +#: wp-admin/options-writing.php:210 wp-admin/options-writing.php:224 +msgid "https://codex.wordpress.org/Update_Services" +msgstr "https://codex.wordpress.org/Update_Services" + +#. translators: 1: .htaccess, 2: Documentation URL, 3: CTRL + a +#: wp-admin/options-permalink.php:422 +msgid "If your %1$s file was writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s to select all." +msgstr "Als je %1$s bestand schrijfbaar zou zijn, konden we dit automatisch doen, maar dat is het niet, dus dit zijn de mod_rewrite regels die je %1$s bestand zou moeten bevatten. Klik in het veld en druk op %3$s om alles te selecteren." + +#. translators: 1: Documentation URL, 2: web.config, 3: CTRL + a +#: wp-admin/options-permalink.php:390 +msgid "If the root directory of your site was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %2$s file. Create a new file, called %2$s in the root directory of your site. Click in the field and press %3$s to select all. Then insert this code into the %2$s file." +msgstr "Als de root van je site schrijfbaar was konden we dit automatisch doen. Helaas is dat niet het geval, dit is de url rewrite-regel die moet worden toegevoegd in het %2$s bestand. Maak een nieuw bestand met de naam %2$s in de root van je site. Selecteer het veld en klik op %3$s om alles te selecteren. Vervolgens kan je de code invoegen in het %2$s bestand." + +#. translators: 1: web.config, 2: Documentation URL, 3: CTRL + a, 4: Element +#. code. +#: wp-admin/options-permalink.php:364 +msgid "If your %1$s file was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %1$s file. Click in the field and press %3$s to select all. Then insert this rule inside of the %4$s element in %1$s file." +msgstr "Als het %1$s bestand schrijfbaar was konden we dit automatisch doen. Helaas is dat niet het geval, dit is de url rewrite-regel die moet worden toegevoegd aan het %1$s bestand. Selecteer het veld en klik op %3$s om alles te selecteren. Vervolgens kan je de regel invoegen in het %4$s element van het %1$s bestand." + +#. translators: %s: Documentation URL. +#: wp-admin/options-general.php:99 +msgid "Enter the address here if you want your site home page to be different from your WordPress installation directory." +msgstr "Vul hier het adres in als je je site's homepage een andere wilt laten zijn dan de WordPress installatie map." + +#. translators: %s: https://wordpress.org/about/privacy +#: wp-admin/privacy.php:74 +msgid "We take privacy and transparency very seriously. To learn more about what data we collect, and how we use it, please visit WordPress.org/about/privacy." +msgstr "We nemen privacy en transparantie erg serieus. Voor meer informatie over welke gegevens we verzamelen en wat we ermee doen, bezoek WordPress.org/about/privacy." + +#: wp-admin/freedoms.php:66 wp-admin/freedoms.php:118 +msgid "https://wordpress.org/about/license/" +msgstr "https://wordpress.org/about/license/" + +#: wp-admin/privacy.php:58 +msgid "From time to time, your WordPress site may send data to WordPress.org — including, but not limited to — the version of WordPress you are using, and a list of installed plugins and themes." +msgstr "Van tijd tot tijd kan je WordPress site data versturen naar WordPress.org — inclusief, maar niet alleen — de versie van WordPress die je gebruikt en een lijst van geïnstalleerde plugins en thema's." + +#. translators: Attachment information. %s: Date the attachment was uploaded. +#: wp-admin/includes/meta-boxes.php:415 +msgid "Uploaded on: %s" +msgstr "Geüpload op: %s" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-plugin-upgrader.php:77 +#: wp-admin/includes/class-theme-upgrader.php:75 +msgid "Downloading installation package from %s…" +msgstr "Installatiepakket downloaden van %s…" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-language-pack-upgrader.php:117 +msgid "Downloading translation from %s…" +msgstr "Vertaling downloaden van %s…" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-plugin-upgrader.php:60 +#: wp-admin/includes/class-theme-upgrader.php:59 +#: wp-admin/includes/class-core-upgrader.php:33 +msgid "Downloading update from %s…" +msgstr "Update downloaden van %s…" + +#. translators: 1: wp-admin/includes/template.php, 2: add_meta_box(), 3: +#. add_meta_boxes +#: wp-admin/includes/template.php:2558 +msgid "Likely direct inclusion of %1$s in order to use %2$s. This is very wrong. Hook the %2$s call into the %3$s action instead." +msgstr "Waarschijnlijk gebruik van directe invoeging van %1$s om %2$s te gebruiken. Dit is niet goed. Maak gebruik van %2$s-hook voor de %3$s-actie." + +#: wp-admin/includes/template.php:2187 +msgid "Customization Draft" +msgstr "Concept" + +#. translators: %s: URL to the Customizer. +#: wp-admin/includes/meta-boxes.php:289 +msgid "This draft comes from your unpublished customization changes. You can edit, but there’s no need to publish now. It will be published automatically with those changes." +msgstr "Dit concept is afkomstig uit de niet gepubliceerde aanpassingen. Je kan het bewerken, maar er is geen noodzaak deze nu te publiceren. Het wordt automatisch gepubliceerd met de wijzigingen." + +#: wp-admin/theme-editor.php:251 +msgid "Theme Files" +msgstr "Themabestanden" + +#: wp-admin/includes/misc.php:388 wp-admin/includes/misc.php:477 +msgid "folder" +msgstr "map" + +#: wp-admin/includes/file.php:571 +msgid "Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP." +msgstr "Communicatie met de site niet mogelijk om te controleren op fouten, de PHP aanpassing is teruggedraaid. De PHP-bestandswijziging moet op een andere manier worden gewijzigd, bijvoorbeeld door SFTP te gebruiken." + +#: wp-admin/press-this.php:75 wp-admin/press-this.php:81 +msgid "Installation Required" +msgstr "Installatie vereist" + +#. translators: %s: Plugin filename. +#: wp-admin/includes/plugin.php:1037 +msgid "Could not fully remove the plugin %s." +msgstr "Kon de plugin %s niet volledig verwijderen." + +#: wp-admin/user-new.php:350 +msgid "User has been created, but could not be added to this site." +msgstr "Gebruiker is aangemaakt, maar kon niet aan deze site toegevoegd worden." + +#: wp-admin/user-new.php:347 +msgid "That user could not be added to this site." +msgstr "Die gebruiker kon niet toegevoegd worden aan deze site." + +#: wp-admin/user-edit.php:291 +msgid "Disable syntax highlighting when editing code" +msgstr "Syntaxismarkering uitschakelen tijdens bewerken code" + +#: wp-admin/user-edit.php:288 +msgid "Syntax Highlighting" +msgstr "Syntaxmarkering" + +#: wp-admin/setup-config.php:418 wp-admin/setup-config.php:451 +msgid "Run the installation" +msgstr "De installatie uitvoeren" + +#: wp-admin/privacy.php:75 +msgid "https://wordpress.org/about/privacy/" +msgstr "https://wordpress.org/about/privacy/" + +#: wp-admin/press-this.php:80 +msgid "Press This is not available. Please contact your site administrator." +msgstr "Press This is niet beschikbaar. Neem contact op met de beheerder van je site." + +#. translators: %s: URL to Press This bookmarklet on the main site. +#: wp-admin/press-this.php:68 +msgid "Press This is not installed. Please install Press This from the main site." +msgstr "Press This is niet geïnstalleerd. Installeer Press This vanaf de hoofd site." + +#: wp-admin/press-this.php:44 +msgid "Activate Press This" +msgstr "Press This activeren" + +#: wp-admin/theme-editor.php:377 wp-admin/plugin-editor.php:331 +msgid "I understand" +msgstr "Ik begrijp het" + +#: wp-admin/theme-editor.php:356 wp-admin/plugin-editor.php:325 +msgid "Heads up!" +msgstr "Let op!" + +#: wp-admin/plugin-editor.php:282 +msgid "Warning: Making changes to active plugins is not recommended." +msgstr "Waarschuwing: Wijzigingen maken aan actieve plugins is niet aangeraden." + +#: wp-admin/theme-editor.php:284 wp-admin/plugin-editor.php:263 +msgid "Selected file content:" +msgstr "Inhoud geselecteerd bestand:" + +#: wp-admin/theme-editor.php:193 wp-admin/plugin-editor.php:188 +msgid "There was an error while trying to update the file. You may need to fix something and try updating again." +msgstr "Er is een fout opgetreden tijdens het bijwerken van het bestand. Wellicht moet je iets repareren en opnieuw proberen bij te werken." + +#. translators: %s: Select field to choose the front page. +#: wp-admin/options-reading.php:109 +msgid "Homepage: %s" +msgstr "Homepagina: %s" + +#: wp-admin/options-permalink.php:306 +msgid "Available tags:" +msgstr "Beschikbare tags:" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:302 +msgid "%s (already used in permalink structure)" +msgstr "%s (reeds gebruikt in permalink structuur)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:299 +msgid "%s added to permalink structure" +msgstr "%s toegevoegd aan permalink structuur" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:286 +msgid "%s (A sanitized version of the author name.)" +msgstr "%s (Een opgeschoonde versie van de auteursnaam.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:284 +msgid "%s (Category slug. Nested sub-categories appear as nested directories in the URL.)" +msgstr "%s (Categorie-slug. Geneste sub-categorieën worden getoond als geneste mappen in de URL.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:282 +msgid "%s (The sanitized post title (slug).)" +msgstr "%s (De schone berichttitel (slug).)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:280 +msgid "%s (The unique ID of the post, for example 423.)" +msgstr "%s (de unieke ID van het bericht, bijvoorbeeld 423.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:278 +msgid "%s (Second of the minute, for example 33.)" +msgstr "%s (seconde van de minuut, bijvoorbeeld 33.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:276 +msgid "%s (Minute of the hour, for example 43.)" +msgstr "%s (minuut van het uur, bijvoorbeeld 43.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:274 +msgid "%s (Hour of the day, for example 15.)" +msgstr "%s (uur van de dag, bijvoorbeeld 15.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:272 +msgid "%s (Day of the month, for example 28.)" +msgstr "%s (dag van de maand, bijvoorbeeld 28.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:270 +msgid "%s (Month of the year, for example 05.)" +msgstr "%s (maand van het jaar, bijvoorbeeld 05.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:268 +msgid "%s (The year of the post, four digits, for example 2004.)" +msgstr "%s (het jaar van het bericht, vier getallen, bijvoorbeeld 2004.)" + +#: wp-admin/includes/theme-install.php:245 +msgid "Theme Installation" +msgstr "Thema installatie" + +#. translators: %s: User's display name. +#: wp-admin/includes/post.php:1747 +msgid "%s is currently editing this post." +msgstr "%s is dit bericht al aan het bewerken." + +#. translators: %s: User's display name. +#: wp-admin/includes/post.php:1744 +msgid "%s is currently editing this post. Do you want to take over?" +msgstr "%s is dit bericht al aan het bewerken. Wil je het overnemen?" + +#: wp-admin/includes/plugin.php:497 +msgid "Custom installation script." +msgstr "Aangepast installatiescript." + +#: wp-admin/includes/plugin-install.php:683 +msgid "Active Installations:" +msgstr "Actieve installaties:" + +#: wp-admin/includes/plugin-install.php:598 wp-admin/update.php:126 +msgid "Plugin Installation" +msgstr "Plugin-installatie" + +#: wp-admin/includes/ms.php:1145 +msgid "Settings — This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database." +msgstr "Instellingen — Deze pagina toont een lijst van alle instellingen van deze site. Sommige zijn gemaakt door WordPress en anderen door plugins die je geactiveerd hebt. Sommige velden zijn lichtgrijs en tonen Serialized Data. Je kan deze waarden niet wijzigen vanwege de manier waarop deze zijn opgeslagen in de database." + +#. translators: %s: URL to Network Themes screen. +#: wp-admin/includes/ms.php:1142 +msgid "Themes — This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen." +msgstr "Thema's — Dit gebied toont thema's die nog niet ingeschakeld zijn in het netwerk. Een thema inschakelen in dit menu maakt het toegankelijk voor deze site. Het activeert het thema niet, maar maakt het mogelijk te worden getoond in het Weergave menu van de site. Om een thema in te schakelen voor het hele netwerk, bekijk het Netwerk thema's scherm." + +#: wp-admin/includes/ms.php:1139 +msgid "Users — This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network." +msgstr "Gebruikers — Dit toont de gebruikers geassocieerd met deze site. Je kan ook hun rol aanpassen, hun wachtwoord wijzigen of ze verwijderen van de site. Een gebruiker van de site verwijderen, verwijdert deze niet uit het netwerk." + +#: wp-admin/includes/ms.php:1138 +msgid "Info — The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable." +msgstr "Info — De site-URL wordt bijna nooit gewijzigd, omdat dit ervoor kan zorgen dat de site niet meer goed werkt. De aanmaakdatum en laatste wijzigingsdatum worden getoond. Netwerkbeheerders kunnen een site archiveren, als spam markeren, verwijderen of laten vervallen om deze uit publieke lijsten te halen." + +#: wp-admin/includes/ms.php:1137 +msgid "The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable." +msgstr "Het menu is voor het bewerken van informatie voor individuele sites, met name als het beheerdersgedeelte van de site niet beschikbaar is." + +#: wp-admin/includes/file.php:504 +msgid "Unable to write to file." +msgstr "Niet mogelijk om naar bestand te schrijven." + +#. translators: 1: Line number, 2: File path. +#: wp-admin/includes/file.php:311 +msgid "Your PHP code changes were rolled back due to an error on line %1$s of file %2$s. Please fix and try saving again." +msgstr "Je wijzigingen in de PHP-code zijn teruggedraaid vanwege een fout op regel %1$s in het bestand %2$s. Los dit op en probeer opnieuw op te slaan." + +#. translators: If a Rosetta site exists (e.g. https://es.wordpress.org/news/), +#. then use that. Otherwise, leave untranslated. +#: wp-admin/includes/dashboard.php:1265 +msgctxt "Events and News dashboard widget" +msgid "https://wordpress.org/news/" +msgstr "https://nl.wordpress.org/nieuws/" + +#: wp-admin/includes/dashboard.php:75 wp-admin/includes/dashboard.php:616 +msgid "Your Recent Drafts" +msgstr "Je recente concepten" + +#: wp-admin/includes/class-wp-users-list-table.php:546 +#: wp-admin/includes/class-wp-ms-users-list-table.php:307 +msgctxt "name" +msgid "Unknown" +msgstr "Onbekend" + +#. translators: %s: Author's display name. +#: wp-admin/includes/class-wp-users-list-table.php:468 +msgid "View posts by %s" +msgstr "Berichten tonen van %s" + +#: wp-admin/includes/class-wp-terms-list-table.php:548 +msgid "No description" +msgstr "Geen beschrijving" + +#. translators: %s: Number of installations. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:756 +msgid "%s Active Installations" +msgstr "%s actieve installaties" + +#: wp-admin/includes/class-theme-upgrader.php:81 +msgid "Theme installation failed." +msgstr "Thema-installatie mislukt." + +#: wp-admin/includes/class-plugin-upgrader.php:83 +msgid "Plugin installation failed." +msgstr "Plugin-installatie mislukt." + +#: wp-admin/includes/class-plugin-installer-skin.php:110 +msgid "Activate Plugin & Go to Press This" +msgstr "Plugin activeren & ga naar Press This" + +#: wp-admin/customize.php:71 +msgid "Your scheduled changes just published" +msgstr "De ingeplande wijzigingen zijn zojuist gepubliceerd" + +#. translators: %s: Theme name. +#: wp-admin/themes.php:540 wp-admin/themes.php:888 wp-admin/themes.php:1101 +#: wp-admin/theme-install.php:350 wp-admin/theme-install.php:413 +#: wp-admin/js/updates.js:1384 +msgctxt "theme" +msgid "Activate %s" +msgstr "Activeer %s" + +#: wp-admin/options-discussion.php:54 +msgid "Allow link notifications from other blogs (pingbacks and trackbacks) on new posts" +msgstr "Sta linkmeldingen van andere blogs (pingbacks en trackbacks) op nieuwe berichten toe" + +#: wp-admin/menu-header.php:278 wp-admin/js/common.js:1907 +msgid "Collapse Main menu" +msgstr "Hoofdmenu inklappen" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:800 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:593 +#: wp-admin/js/updates.js:734 +msgctxt "plugin" +msgid "Network Activate %s" +msgstr "Netwerk activeer %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:854 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:580 +#: wp-admin/js/updates.js:745 +msgctxt "plugin" +msgid "Activate %s" +msgstr "Activeer %s" + +#: wp-admin/includes/class-wp-media-list-table.php:249 +msgid "No media files found." +msgstr "Geen mediabestanden gevonden." + +#: wp-admin/import.php:133 wp-admin/import.php:182 wp-admin/js/updates.js:848 +msgid "Run Importer" +msgstr "Begin met importeren" + +#. translators: %s: Importer name. +#: wp-admin/import.php:132 wp-admin/import.php:181 wp-admin/js/updates.js:844 +msgid "Run %s" +msgstr "Start %s" + +#: wp-admin/includes/class-wp-debug-data.php:120 +msgctxt "comment status" +msgid "Open" +msgstr "Open" + +#. translators: %s: Meetup organization documentation URL. +#: wp-admin/includes/dashboard.php:1419 +msgid "There aren’t any events scheduled near you at the moment. Would you like to organize a WordPress event?" +msgstr "Er zijn momenteel geen evenementen gepland bij jou in de buurt. Wil je een WordPress evenement organiseren?" + +#. translators: %s: User's display name. +#: wp-admin/user-edit.php:38 +msgid "Edit User %s" +msgstr "Gebruiker %s bewerken" + +#. translators: %s: Widget title. +#: wp-admin/includes/widgets.php:249 +msgid "Edit widget: %s" +msgstr "Widget: %s bewerken" + +#: wp-admin/includes/dashboard.php:1411 wp-admin/includes/dashboard.php:1420 +msgid "https://make.wordpress.org/community/handbook/meetup-organizer/welcome/" +msgstr "https://make.wordpress.org/community/handbook/meetup-organizer/welcome/" + +#. translators: 1: The city the user searched for, 2: Meetup organization +#. documentation URL. +#: wp-admin/includes/dashboard.php:1409 +msgid "There aren’t any events scheduled near %1$s at the moment. Would you like to organize a WordPress event?" +msgstr "Er zijn momenteel geen evenementen gepland in de buurt van %1$s. Wil je een WordPress evenement organiseren?" + +#. translators: %s: The name of a city. +#: wp-admin/includes/dashboard.php:1360 +msgid "Attend an upcoming event near %s." +msgstr "Een aankomend evenement bijwonen in de buurt van %s." + +#: wp-admin/includes/dashboard.php:1330 +msgid "Cincinnati" +msgstr "Utrecht" + +#: wp-admin/includes/dashboard.php:1318 +msgid "City:" +msgstr "Stad:" + +#: wp-admin/includes/dashboard.php:1311 +msgid "Edit city" +msgstr "Stad bewerken" + +#: wp-admin/includes/dashboard.php:1253 +msgid "WordCamps" +msgstr "WordCamps" + +#: wp-admin/includes/dashboard.php:1241 +msgid "Meetups" +msgstr "Meetups" + +#: wp-admin/includes/dashboard.php:1290 wp-admin/js/dashboard.js:585 +msgid "An error occurred. Please try again." +msgstr "Er is een fout opgetreden. Probeer het opnieuw." + +#: wp-admin/includes/dashboard.php:80 +msgid "WordPress Events and News" +msgstr "WordPress evenementen en nieuws" + +#. translators: Date format for upcoming events on the dashboard. Include the +#. day of the week. See https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/class-wp-community-events.php:396 +#: wp-admin/includes/class-wp-community-events.php:401 +#: wp-admin/js/dashboard.js:774 +msgid "l, M j, Y" +msgstr "l, j F Y" + +#: wp-admin/includes/class-wp-community-events.php:124 +msgid "Unknown API error." +msgstr "Onbekende API fout." + +#. translators: %d: Numeric HTTP status code, e.g. 400, 403, 500, 504, etc. +#: wp-admin/includes/class-wp-community-events.php:119 +msgid "Invalid API response code (%d)." +msgstr "Ongeldige API reactiecode (%d)." + +#: wp-admin/edit-tags.php:498 wp-admin/edit-tag-form.php:183 +msgid "Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band." +msgstr "Een hoofdterm toevoegen om een hiërarchie aan te maken. Bijvoorbeeld de categorie Jazz zou de hoofdterm zijn van Bebop en Big Band." + +#: wp-admin/users.php:180 wp-admin/users.php:229 +msgid "Sorry, you are not allowed to delete users." +msgstr "Je hebt geen toestemming om gebruikers te verwijderen." + +#: wp-admin/user-new.php:23 wp-admin/user-new.php:183 +msgid "Sorry, you are not allowed to create users." +msgstr "Je hebt geen toestemming om gebruikers aan te maken." + +#: wp-admin/customize.php:233 +msgid "The Customizer allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements." +msgstr "De Customizer staat je toe om wijzigingen in je site te bekijken voordat je ze publiceert. Je kunt naar verschillende pagina's op je site navigeren binnen het voorbeeld. Snelkoppelingen voor bewerken worden getoond voor sommige bewerkbare elementen." + +#: wp-admin/customize.php:247 +msgctxt "short (~12 characters) label for hide controls button" +msgid "Hide Controls" +msgstr "Verbergen" + +#: wp-admin/theme-install.php:70 +msgid "Expand Sidebar" +msgstr "Zijbalk uitklappen" + +#: wp-admin/nav-menus.php:1042 +msgid "Display location" +msgstr "Locatie tonen" + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:432 +msgid "ID #%1$s: %2$s Sorry, you are not allowed to remove this user." +msgstr "ID #%1$s: %2$s Je hebt geen rechten om deze gebruiker te verwijderen." + +#: wp-admin/user-edit.php:55 +msgid "You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see." +msgstr "Je kunt de taal selecteren die je wilt gebruiken voor het WordPress administratiescherm, dit staat los van de sitetaal die bezoekers zien." + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:69 +msgid "If you need to re-install version %s, you can do so here:" +msgstr "Indien je versie %s opnieuw moet installeren, kun je dit hier doen:" + +#: wp-admin/theme-install.php:237 +msgid "Edit Filters" +msgstr "Filters bewerken" + +#: wp-admin/theme-install.php:209 wp-admin/theme-install.php:232 +msgid "Clear current filters" +msgstr "Huidige filters wissen" + +#. translators: Accessibility text. +#: wp-admin/theme-install.php:72 +msgid "Select one or more Theme features to filter by" +msgstr "Eén of meerdere themafuncties selecteren om op te filteren" + +#. translators: %s: Number of ratings. +#: wp-admin/includes/theme.php:825 wp-admin/theme-install.php:450 +msgid "(%s ratings)" +msgstr "(%s waarderingen)" + +#: wp-admin/includes/template.php:2325 +msgid "Current Background Image" +msgstr "Huidige achtergrond afbeelding" + +#: wp-admin/includes/template.php:2305 +msgid "Current Header Image" +msgstr "Huidige kopafbeelding" + +#: wp-admin/includes/plugin-install.php:338 +msgid "Search plugins..." +msgstr "Plugins zoeken..." + +#: wp-admin/includes/meta-boxes.php:138 +msgid "Set status" +msgstr "Status instellen" + +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-posts-list-table.php:943 +msgid "“%s” is locked" +msgstr "“%s” is geblokkeerd" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:751 +#: wp-admin/includes/plugin-install.php:693 +msgctxt "Active plugin installations" +msgid "Less Than 10" +msgstr "Minder dan 10" + +#: wp-admin/includes/ajax-actions.php:2513 +msgid "Sorry, you are not allowed to attach files to this post." +msgstr "Je hebt geen toestemming om bestanden aan dit bericht te koppelen." + +#: wp-admin/includes/plugin-install.php:273 +#: wp-admin/includes/plugin-install.php:700 wp-admin/freedoms.php:111 +#: wp-admin/plugins.php:550 wp-admin/plugin-install.php:89 +msgid "https://wordpress.org/plugins/" +msgstr "https://nl.wordpress.org/plugins/" + +#: wp-admin/customize.php:72 wp-admin/customize.php:81 +msgid "Customize New Changes" +msgstr "Nieuwe wijzigingen aanpassen" + +#: wp-admin/includes/class-custom-background.php:446 +#: wp-admin/includes/class-custom-background.php:447 +msgctxt "Background Scroll" +msgid "Scroll" +msgstr "Scrollen" + +#: wp-admin/includes/class-custom-background.php:438 +#: wp-admin/includes/class-custom-background.php:439 +msgctxt "Background Repeat" +msgid "Repeat" +msgstr "Herhalen" + +#: wp-admin/options-reading.php:53 wp-admin/edit-tags.php:314 +#: wp-admin/link-manager.php:79 wp-admin/options-writing.php:53 +#: wp-admin/includes/class-custom-background.php:100 +#: wp-admin/includes/class-custom-image-header.php:135 wp-admin/my-sites.php:52 +#: wp-admin/options-general.php:49 wp-admin/comment.php:71 +#: wp-admin/theme-editor.php:55 wp-admin/plugin-editor.php:144 +#: wp-admin/nav-menus.php:659 wp-admin/update-core.php:971 +#: wp-admin/options-permalink.php:62 wp-admin/user-new.php:295 +#: wp-admin/index.php:112 wp-admin/plugins.php:589 wp-admin/themes.php:208 +#: wp-admin/edit-comments.php:197 wp-admin/media.php:97 +#: wp-admin/revision.php:157 wp-admin/upload.php:76 wp-admin/upload.php:253 +#: wp-admin/edit-form-advanced.php:320 wp-admin/edit-form-advanced.php:338 +#: wp-admin/edit-form-advanced.php:356 wp-admin/tools.php:56 +#: wp-admin/import.php:32 wp-admin/widgets.php:84 wp-admin/options-media.php:38 +#: wp-admin/edit-link-form.php:77 wp-admin/user-edit.php:72 +#: wp-admin/users.php:76 wp-admin/media-new.php:61 +#: wp-admin/theme-install.php:132 wp-admin/options-discussion.php:32 +#: wp-admin/edit.php:285 wp-admin/edit.php:310 wp-admin/plugin-install.php:110 +#: wp-admin/export.php:58 wp-admin/network.php:81 +#: wp-admin/network/themes.php:325 wp-admin/network/upgrade.php:32 +#: wp-admin/network/settings.php:64 +msgid "Support" +msgstr "Ondersteuningsforum" + +#. translators: %s: Number of failed updates. +#: wp-admin/includes/update.php:902 +msgid "%s updates failed." +msgstr "%s updates mislukt." + +#. translators: %s: Number of failed updates. +#: wp-admin/includes/update.php:897 +msgid "%s update failed." +msgstr "%s update mislukt." + +#: wp-admin/includes/class-wp-plugins-list-table.php:447 +msgid "Search installed plugins..." +msgstr "Geïnstalleerde plugins zoeken..." + +#: wp-admin/plugin-install.php:91 +msgid "You can find new plugins to install by searching or browsing the directory right here in your own Plugins section." +msgstr "Je kunt nieuwe plugins vinden om te installeren door te zoeken of bladeren in de directory hier in je eigen plugin-sectie." + +#. translators: %s: https://wordpress.org/plugins +#: wp-admin/plugin-install.php:88 +msgid "Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official WordPress Plugin Directory are compatible with the license WordPress uses." +msgstr "Plugins haken in op WordPress om de functionaliteit uit te breiden met maatwerk. Plugins worden onafhankelijk van de WordPress applicatie zelf ontwikkeld door duizenden ontwikkelaars van over de hele wereld. Alle plugins in de officiële WordPress Plugin Directory zijn compatible met de licentie die WordPress gebruikt." + +#: wp-admin/includes/plugin-install.php:331 +msgid "Search plugins by:" +msgstr "Plugins zoeken via:" + +#: wp-admin/includes/import.php:227 +msgid "Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file." +msgstr "Berichten, pagina's, reacties, aangepaste velden, categorieën, en tags importeren uit een WordPress exportbestand." + +#: wp-admin/includes/import.php:221 +msgid "Import posts & media from Tumblr using their API." +msgstr "Berichten & media van Tumblr importeren met behulp van hun API." + +#: wp-admin/includes/import.php:215 +msgid "Import posts from an RSS feed." +msgstr "Berichten importeren van een RSS-feed." + +#: wp-admin/includes/import.php:209 +msgid "Import posts and comments from a Movable Type or TypePad blog." +msgstr "Berichten en reacties importeren van een Movable Type of TypePad blog." + +#: wp-admin/includes/import.php:203 +msgid "Import posts from LiveJournal using their API." +msgstr "Berichten van LiveJournal importeren met behulp van hun API." + +#: wp-admin/includes/import.php:197 +msgid "Convert existing categories to tags or tags to categories, selectively." +msgstr "Bestaande categorieën omzetten naar tags, of bestaande tags naar categorieën." + +#: wp-admin/includes/import.php:191 +msgid "Import posts, comments, and users from a Blogger blog." +msgstr "Berichten, reacties en gebruikers importeren van een Blogger blog." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:832 +msgctxt "plugin" +msgid "Deactivate %s" +msgstr "%s deactiveren" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:811 +#: wp-admin/includes/class-wp-plugins-list-table.php:865 +msgctxt "plugin" +msgid "Delete %s" +msgstr "%s verwijderen" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:789 +msgctxt "plugin" +msgid "Network Deactivate %s" +msgstr "Netwerk deactiveren %s " + +#: wp-admin/user-new.php:264 +msgid "By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you don’t want to send the new user a welcome email." +msgstr "Standaard ontvangen nieuwe gebruikers een e-mail om te bevestigen dat ze als gebruiker zijn toegevoegd aan je site. Deze e-mail bevat tevens een link waarmee het wachtwoord gewijzigd kan worden. Verwijder het vinkje indien je nieuwe gebruikers geen welkomst e-mail wenst te sturen." + +#: wp-admin/user-new.php:262 +msgid "New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added." +msgstr "Nieuwe gebruikers worden automatisch een wachtwoord toegekend. Dit wachtwoord kan gewijzigd worden na inloggen. Bekijk of wijzig het toegekende wachtwoord via de Toon Wachtwoord knop. De gebruikersnaam kan niet gewijzigd worden nadat de gebruiker toegevoegd werd." + +#. translators: %s: Plugin name. +#: wp-admin/includes/update.php:965 +msgctxt "plugin" +msgid "%s was successfully deleted." +msgstr "%s is verwijderd." + +#: wp-admin/plugins.php:546 +msgid "The search for installed plugins will search for terms in their name, description, or author." +msgstr "Het zoeken naar geïnstalleerde plugins vindt plaats op basis van termen in hun naam, beschrijving of auteur. " + +#: wp-admin/includes/theme.php:309 +msgid "Custom Logo" +msgstr "Aangepast logo" + +#: wp-admin/users.php:368 wp-admin/users.php:400 +#: wp-admin/network/site-users.php:120 +msgid "Sorry, you are not allowed to remove users." +msgstr "Je hebt geen toestemming om gebruikers te verwijderen." + +#: wp-admin/user-new.php:16 wp-admin/user-new.php:56 +#: wp-admin/network/user-new.php:14 +msgid "Sorry, you are not allowed to add users to this network." +msgstr "Je hebt geen toestemming om gebruikers toe te voegen aan dit netwerk." + +#: wp-admin/customize.php:35 +msgid "Sorry, you are not allowed to edit this changeset." +msgstr "Je hebt geen toestemming om deze wijzigingen te bewerken." + +#: wp-admin/includes/ajax-actions.php:4154 wp-admin/update.php:202 +#: wp-admin/update.php:223 +msgid "Sorry, you are not allowed to update themes for this site." +msgstr "Je hebt geen toestemming om thema's voor deze site bij te werken." + +#: wp-admin/update-core.php:23 wp-admin/update-core.php:1049 +#: wp-admin/update-core.php:1085 wp-admin/update-core.php:1125 +#: wp-admin/update-core.php:1165 wp-admin/update-core.php:1194 +msgid "Sorry, you are not allowed to update this site." +msgstr "Je hebt geen toestemming om deze site bij te werken." + +#: wp-admin/themes.php:395 wp-admin/themes.php:734 +msgid "New version available. " +msgstr "Er is een nieuwe versie beschikbaar. " + +#: wp-admin/theme-install.php:161 +msgid "The Theme Installer screen requires JavaScript." +msgstr "Het Thema installatiescherm vereist JavaScript." + +#: wp-admin/includes/file.php:425 wp-admin/theme-editor.php:18 +msgid "Sorry, you are not allowed to edit templates for this site." +msgstr "Je hebt geen toestemming om templates voor deze site te bewerken." + +#: wp-admin/setup-config.php:321 +msgid "Error: \"Table Prefix\" is invalid." +msgstr "Fout: \"Table Prefix\" is ongeldig." + +#: wp-admin/plugins.php:225 +msgid "Sorry, you are not allowed to deactivate plugins for this site." +msgstr "Je hebt geen toestemming om plugins voor deze site te deactiveren." + +#: wp-admin/plugins.php:92 +msgid "Sorry, you are not allowed to activate plugins for this site." +msgstr "Je hebt geen toestemming om plugins voor deze site te activeren." + +#: wp-admin/includes/file.php:393 wp-admin/plugin-editor.php:18 +msgid "Sorry, you are not allowed to edit plugins for this site." +msgstr "Je hebt geen toestemming om plugins voor deze site te bewerken." + +#: wp-admin/options.php:248 +msgid "Sorry, you are not allowed to modify unregistered settings for this site." +msgstr "Je hebt geen toestemming om ongeregistreerde instellingen voor deze site aan te passen." + +#: wp-admin/options-reading.php:13 wp-admin/options-writing.php:13 +#: wp-admin/options-general.php:16 wp-admin/options-permalink.php:13 +#: wp-admin/options.php:50 wp-admin/options-media.php:13 +#: wp-admin/options-discussion.php:12 wp-admin/network.php:19 +msgid "Sorry, you are not allowed to manage options for this site." +msgstr "Je hebt geen toestemming om opties voor deze site te beheren." + +#: wp-admin/nav-menus.php:681 wp-admin/widgets.php:409 +msgid "Manage with Live Preview" +msgstr "Beheren via Live Preview" + +#: wp-admin/ms-delete-site.php:17 +msgid "Sorry, you are not allowed to delete this site." +msgstr "Je hebt geen toestemming om deze site te verwijderen." + +#: wp-admin/link-add.php:13 +msgid "Sorry, you are not allowed to add links to this site." +msgstr "Je hebt geen toestemming om links op deze site toe te voegen." + +#: wp-admin/includes/upgrade.php:271 +msgid "" +"Hi, this is a comment.\n" +"To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\n" +"Commenter avatars come from Gravatar." +msgstr "" +"Hoi, dit is een reactie.\n" +"Om te beginnen met beheren, bewerken en verwijderen van reacties, ga je naar het Reacties scherm op het dashboard.\n" +"Avatars van auteurs komen van Gravatar." + +#: wp-admin/includes/upgrade.php:268 +msgid "A WordPress Commenter" +msgstr "Een WordPress commentator" + +#. translators: %s: Theme name. +#: wp-admin/includes/update.php:973 +msgctxt "theme" +msgid "%s was successfully deleted." +msgstr "%s is verwijderd." + +#. translators: %s: Number of themes. +#: wp-admin/includes/update.php:887 +msgid "%s themes successfully updated." +msgstr "%s thema's bijgewerkt." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/update.php:882 +msgid "%s plugins successfully updated." +msgstr "%s plugins bijgewerkt." + +#. translators: %s: Number of themes. +#: wp-admin/includes/update.php:875 +msgid "%s theme successfully updated." +msgstr "%s thema bijgewerkt." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/update.php:870 +msgid "%s plugin successfully updated." +msgstr "%s plugin bijgewerkt." + +#. translators: 1: URL to WordPress release notes, 2: New WordPress version. +#: wp-admin/includes/update.php:321 +msgid "WordPress %2$s is available! Please notify the site administrator." +msgstr "WordPress %2$s is beschikbaar. Informeer de site-beheerder." + +#: wp-admin/includes/update.php:316 +msgid "Please update WordPress now" +msgstr "WordPress nu bijwerken" + +#. translators: 1: URL to WordPress release notes, 2: New WordPress version, 3: +#. URL to network admin, 4: Accessibility text. +#: wp-admin/includes/update.php:312 +msgid "WordPress %2$s is available! Please update now." +msgstr "WordPress %2$s is beschikbaar. Nu bijwerken." + +#: wp-admin/includes/theme.php:299 +msgid "Portfolio" +msgstr "Portfolio" + +#: wp-admin/includes/theme.php:298 +msgid "Photography" +msgstr "Fotografie" + +#: wp-admin/includes/theme.php:297 wp-admin/includes/dashboard.php:1266 +msgid "News" +msgstr "Nieuws" + +#: wp-admin/includes/theme.php:295 +msgid "Food & Drink" +msgstr "Eten & drinken" + +#: wp-admin/includes/theme.php:294 +msgid "Entertainment" +msgstr "Vermaak" + +#: wp-admin/includes/theme.php:293 +msgid "Education" +msgstr "Opleiding" + +#: wp-admin/includes/theme.php:292 +msgid "E-Commerce" +msgstr "E-Commerce" + +#: wp-admin/includes/theme.php:291 +msgid "Blog" +msgstr "Blog" + +#: wp-admin/includes/theme.php:313 +msgid "Footer Widgets" +msgstr "Footer Widgets" + +#: wp-admin/includes/theme.php:322 +msgid "Grid Layout" +msgstr "Grid Lay-out" + +#: wp-admin/includes/template.php:2588 +msgid "This will replace the current editor content with the last backup version. You can use undo and redo in the editor to get the old content back or to return to the restored version." +msgstr "Dit zal de huidige tekstinhoud vervangen door de vorige versie. Je kunt de optie 'Ongedaan maken' en 'Opnieuw' in de editor gebruiken om de oude inhoud terug te halen of om terug te gaan naar de herstelde versie." + +#: wp-admin/includes/template.php:1931 +msgid "Close media attachment panel" +msgstr "Mediabijlagescherm sluiten" + +#: wp-admin/includes/ms.php:1054 +msgid "Info" +msgstr "Informatie" + +#: wp-admin/includes/meta-boxes.php:1021 +msgid "Need help? Use the Help tab above the screen title." +msgstr "Hulp nodig? Gebruik de Hulp-tab boven de schermtitel." + +#: wp-admin/includes/menu.php:350 wp-admin/my-sites.php:17 +#: wp-admin/network/site-info.php:32 wp-admin/network/user-new.php:37 +#: wp-admin/network/index.php:17 wp-admin/network/site-users.php:50 +#: wp-admin/network/upgrade.php:38 wp-admin/network/users.php:14 +#: wp-admin/network/users.php:24 wp-admin/network/users.php:46 +#: wp-admin/network/users.php:60 wp-admin/network/users.php:150 +#: wp-admin/network/site-themes.php:57 wp-admin/network/settings.php:17 +#: wp-admin/network/site-settings.php:32 wp-admin/network/sites.php:14 +#: wp-admin/network/sites.php:140 +msgid "Sorry, you are not allowed to access this page." +msgstr "Je hebt geen toestemming om deze pagina te bekijken." + +#: wp-admin/includes/file.php:51 +msgid "Embed Footer Template" +msgstr "Embed Footer Template" + +#: wp-admin/includes/file.php:50 +msgid "Embed Header Template" +msgstr "Embed Header Template" + +#: wp-admin/includes/file.php:49 +msgid "Embed Content Template" +msgstr "Embed Content Template" + +#: wp-admin/includes/file.php:48 +msgid "Embed 404 Template" +msgstr "Embed 404 Template" + +#: wp-admin/includes/file.php:47 +msgid "Embed Template" +msgstr "Embed Template" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:575 +msgctxt "plugin" +msgid "Active" +msgstr "Actief" + +#: wp-admin/includes/class-wp-media-list-table.php:524 +msgid "(Private post)" +msgstr "(Privé bericht)" + +#: wp-admin/link-manager.php:12 wp-admin/link-manager.php:91 +#: wp-admin/includes/bookmark.php:32 wp-admin/includes/bookmark.php:350 +msgid "Sorry, you are not allowed to edit the links for this site." +msgstr "Je hebt geen toestemming om links voor deze site te bewerken." + +#: wp-admin/privacy-policy-guide.php:13 wp-admin/options-privacy.php:13 +msgid "Sorry, you are not allowed to manage privacy options on this site." +msgstr "Je hebt geen toestemming om privacy opties te beheren op deze site." + +#: wp-admin/includes/ajax-actions.php:4579 +msgid "Plugin could not be deleted." +msgstr "Plugin kon niet verwijderd worden." + +#: wp-admin/includes/ajax-actions.php:4433 wp-admin/update.php:29 +#: wp-admin/update.php:57 wp-admin/update.php:79 +msgid "Sorry, you are not allowed to update plugins for this site." +msgstr "Je hebt geen toestemming om plugins op deze site bij te werken." + +#: wp-admin/includes/ajax-actions.php:4309 +#: wp-admin/includes/ajax-actions.php:4418 +#: wp-admin/includes/ajax-actions.php:4526 +msgid "No plugin specified." +msgstr "Geen plugin opgegeven." + +#: wp-admin/includes/ajax-actions.php:4285 +msgid "Theme could not be deleted." +msgstr "Thema kon niet verwijderd worden." + +#: wp-admin/includes/ajax-actions.php:4247 +msgid "Sorry, you are not allowed to delete themes on this site." +msgstr "Je hebt geen toestemming om thema's van deze site te verwijderen." + +#: wp-admin/includes/ajax-actions.php:4030 wp-admin/update.php:251 +#: wp-admin/update.php:291 wp-admin/update.php:324 +#: wp-admin/theme-install.php:16 +msgid "Sorry, you are not allowed to install themes on this site." +msgstr "Je hebt geen toestemming om thema's op deze site te installeren." + +#: wp-admin/includes/ajax-actions.php:4017 +#: wp-admin/includes/ajax-actions.php:4140 +#: wp-admin/includes/ajax-actions.php:4235 +msgid "No theme specified." +msgstr "Geen thema opgegeven." + +#: wp-admin/admin.php:305 wp-admin/import.php:15 +msgid "Sorry, you are not allowed to import content into this site." +msgstr "Je hebt geen toestemming om gegevens te importeren op deze site." + +#: wp-admin/export.php:13 +msgid "Sorry, you are not allowed to export the content of this site." +msgstr "Je hebt geen toestemming om de inhoud van deze site te exporteren." + +#: wp-admin/edit.php:252 +msgid "You can filter the list of posts by post status using the text links above the posts list to only show posts with that status. The default view is to show all posts." +msgstr "Je kunt de lijst met berichten filteren op berichtstatus met gebruik van de tekstlinks boven de berichtenlijst om alleen berichten met de betreffende status weer te geven. Standaard worden alle berichten weergegeven." + +#: wp-admin/customize.php:206 +msgid "Close the Customizer and go back to the previous page" +msgstr "De Customizer sluiten en ga terug naar de vorige pagina." + +#: wp-admin/includes/class-custom-image-header.php:1029 +msgid "Sorry, you are not allowed to customize headers." +msgstr "Je hebt geen toestemming om headers aan te passen." + +#: wp-admin/credits.php:154 +msgid "Release Deputy" +msgstr "Release Deputy" + +#: wp-admin/credits.php:153 +msgid "Release Design Lead" +msgstr "Release Design Lead" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:806 +msgid "Allow trackbacks and pingbacks on this page" +msgstr "Trackbacks en pingbacks toestaan op deze pagina." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:782 +msgid "Custom fields can be used to add extra metadata to a post that you can use in your theme." +msgstr "Aangepaste velden kunnen worden gebruikt om extra metadata aan een bericht toe te voegen wat gebruikt kan worden in je thema." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:745 +msgid "Trackbacks are a way to notify legacy blog systems that you’ve linked to them. If you link other WordPress sites, they’ll be notified automatically using pingbacks, no other action necessary." +msgstr "Trackbacks zijn een manier om verouderde blogsystemen te informeren dat jij naar ze verwijst. Wanneer je verwijst naar andere WordPress sites, worden deze automatisch op de hoogte gebracht met pingbacks, geen andere actie is nodig." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:707 +msgid "Excerpts are optional hand-crafted summaries of your content that can be used in your theme. Learn more about manual excerpts." +msgstr "Samenvattingen zijn optionele hand-geschreven samenvattingen van je inhoud die gebruikt kunnen worden in je thema. Meer informatie over handmatige samenvattingen." + +#: wp-admin/edit-form-advanced.php:295 +msgid "The Text mode allows you to enter HTML along with your post text. Note that <p> and <br> tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing <br>, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically." +msgstr "Tekstmodus maakt het mogelijk HTML in te voeren. Let op dat <p> en <br> worden omgezet naar paragrafen bij het schakelen naar de tekstmodus. Wanneer je aan het typen bent kun je een regeleinde invoeren in plaats van <br>. Regeleindes worden automatisch vertaald naar tags." + +#: wp-admin/edit-form-advanced.php:294 +msgid "Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls." +msgstr "De visuele modus geeft je een visuele editor (What You See is What You Get). Klik op het laatste pictogram in de eerste rij om een tweede rij met pictogrammen te krijgen." + +#: wp-admin/upload.php:360 +msgid "Error saving media file." +msgstr "Fout bij opslaan mediabestand." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:352 +msgid "%s media file restored from the Trash." +msgid_plural "%s media files restored from the Trash." +msgstr[0] "%s mediabestand hersteld uit de prullenbak." +msgstr[1] "%s mediabestanden hersteld uit de prullenbak." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:339 +msgid "%s media file moved to the Trash." +msgid_plural "%s media files moved to the Trash." +msgstr[0] "%s mediabestand verplaatst naar de prullenbak." +msgstr[1] "%s mediabestanden verplaatst naar de prullenbak." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:327 +msgid "%s media file permanently deleted." +msgid_plural "%s media files permanently deleted." +msgstr[0] "%s mediabestand permanent verwijderd." +msgstr[1] "%s mediabestanden permanent verwijderd." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:315 +msgid "%s media file detached." +msgid_plural "%s media files detached." +msgstr[0] "%s mediabestand ontkoppeld." +msgstr[1] "%s mediabestanden ontkoppeld." + +#: wp-admin/upload.php:312 +msgid "Media file detached." +msgstr "Mediabestand ontkoppeld." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:303 +msgid "%s media file attached." +msgid_plural "%s media files attached." +msgstr[0] "%s mediabestand gekoppeld." +msgstr[1] "%s mediabestanden gekoppeld." + +#: wp-admin/upload.php:300 +msgid "Media file attached." +msgstr "Mediabestand gekoppeld." + +#: wp-admin/media.php:108 wp-admin/upload.php:293 wp-admin/upload.php:358 +#: wp-admin/edit-form-advanced.php:210 +msgid "Media file updated." +msgstr "Mediabestand bijgewerkt." + +#. translators: 1: Theme name, 2: Version number. +#. translators: 1: Plugin name, 2: Version number. +#: wp-admin/includes/theme.php:210 wp-admin/includes/theme.php:223 +#: wp-admin/includes/theme.php:236 wp-admin/includes/update.php:483 +#: wp-admin/includes/update.php:496 wp-admin/includes/update.php:510 +#: wp-admin/includes/update.php:529 wp-admin/includes/update.php:676 +#: wp-admin/includes/update.php:689 wp-admin/includes/update.php:702 +#: wp-admin/update-core.php:527 +msgid "View %1$s version %2$s details" +msgstr "Details %1$s versie %2$s tonen" + +#. translators: 1: Relative date, 2: Time. +#: wp-admin/includes/dashboard.php:992 +msgctxt "dashboard" +msgid "%1$s, %2$s" +msgstr "%1$s, %2$s" + +#: wp-admin/edit-form-advanced.php:376 +msgid "Publish — You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post." +msgstr "Publiceren — Je kunt de voorwaarden voor publicatie van je bericht instellen in het Publiceren vak. Voor Status, Zichtbaarheid en (onmiddellijk) publiceren klik je op de Bewerken link om meer opties te tonen. Zichtbaarheid bevat opties om je bericht te beschermen met een wachtwoord of om het op de voorpagina van je site te plakken (sticky). (Onmiddellijk) publiceren laat je toe om een datum en tijdstip in de toekomst of in het verleden in te stellen, zodat je de publicatie op een later tijdstip kunt plannen of een bericht kunt terugdateren. Het met een wachtwoord beschermen biedt de mogelijkheid om een wachtwoord in te stellen voor elk bericht. De privé-optie verbergt het bericht voor iedereen met uitzondering van redacteurs of beheerders." + +#. translators: %s: New email. +#: wp-admin/user-edit.php:525 +msgid "There is a pending change of your email to %s." +msgstr "Er is ook een wachtende verandering van je e-mailadres naar %s." + +#: wp-admin/user-edit.php:212 +msgid "Error while saving the new email address. Please try again." +msgstr "Fout bij het opslaan van het nieuwe e-mailadres. Probeer het opnieuw." + +#: wp-admin/upload.php:229 +msgid "You can narrow the list by file type/status or by date using the dropdown menus above the media table." +msgstr "Het is mogelijk de lijst te verkleinen door te filteren op type/status of op datum door gebruik te maken van de dropdown boven de mediatabel." + +#: wp-admin/themes.php:575 wp-admin/network/themes.php:429 +msgid "The following themes are installed but incomplete." +msgstr "De volgende thema's zijn geïnstalleerd, maar incompleet." + +#: wp-admin/themes.php:271 +msgid "New theme activated." +msgstr "Nieuwe thema geactiveerd." + +#: wp-admin/themes.php:267 +msgid "Settings saved and theme activated." +msgstr "Instellingen opgeslagen en thema geactiveerd." + +#: wp-admin/freedoms.php:112 wp-admin/themes.php:156 +#: wp-admin/theme-install.php:99 +msgid "https://wordpress.org/themes/" +msgstr "https://wordpress.org/themes/" + +#: wp-admin/users.php:188 +msgid "Sorry, you are not allowed to delete that user." +msgstr "Je hebt geen toestemming om deze gebruiker te verwijderen." + +#: wp-admin/setup-config.php:229 +msgid "Your database password." +msgstr "Het wachtwoord van de database." + +#: wp-admin/setup-config.php:224 +msgid "Your database username." +msgstr "De gebruikersnaam van de database." + +#: wp-admin/setup-config.php:219 +msgid "The name of the database you want to use with WordPress." +msgstr "De naam van de database die je wilt gebruiken voor WordPress." + +#. translators: 1: Plugin name, 2: Plugin author. +#: wp-admin/plugins.php:364 +msgctxt "plugin" +msgid "%1$s by %2$s" +msgstr "%1$s door %2$s" + +#. translators: 1: Plugin name, 2: Plugin author. +#: wp-admin/plugins.php:360 +msgid "%1$s by %2$s (will also delete its data)" +msgstr "%1$s door %2$s (zal ook zijn data verwijderen)" + +#. translators: %s: New admin email. +#: wp-admin/options-general.php:123 +msgid "There is a pending change of the admin email to %s." +msgstr "Er is een wachtende wijziging van het beheerders e-mailadres naar %s." + +#: wp-admin/install.php:419 +msgid "WordPress has been installed. Thank you, and enjoy!" +msgstr "WordPress is geïnstalleerd. Bedankt en veel plezier!" + +#. translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES +#: wp-admin/install.php:309 +msgid "The constant %s cannot be defined when installing WordPress." +msgstr "De constante %s kan niet gedefinieerd zijn tijdens het installeren van WordPress." + +#. translators: %s: wp-config.php +#: wp-admin/install.php:296 +msgid "Your %s file has an empty database table prefix, which is not supported." +msgstr "Het %s bestand heeft een lege prefix voor de databasetabel, dit wordt niet ondersteund." + +#: wp-admin/index.php:164 +msgid "Dismiss the welcome panel" +msgstr "Het welkomspaneel negeren" + +#: wp-admin/includes/theme-install.php:185 +msgid "Theme zip file" +msgstr "Thema zip bestand" + +#: wp-admin/includes/template.php:1930 +msgid "Attach to existing content" +msgstr "Aan bestaande inhoud koppelen" + +#: wp-admin/includes/post.php:1562 +msgid "Click the image to edit or update" +msgstr "Op de afbeelding klikken om te bewerken of te wijzigen" + +#. translators: 1: Number of stars (used to determine singular/plural), 2: +#. Number of reviews. +#: wp-admin/includes/plugin-install.php:741 +msgid "Reviews with %1$d star: %2$s. Opens in a new tab." +msgid_plural "Reviews with %1$d stars: %2$s. Opens in a new tab." +msgstr[0] "Beoordelingen met %1$d ster: %2$s. Opent in een nieuw tabblad." +msgstr[1] "Beoordelingen met %1$d sterren: %2$s. Opent in een nieuw tabblad." + +#: wp-admin/includes/plugin-install.php:733 +msgid "Read all reviews on WordPress.org or write your own!" +msgstr "Alle beoordelingen op WordPress.org lezen of je eigen beoordeling schrijven!" + +#: wp-admin/includes/plugin-install.php:732 +msgid "Reviews" +msgstr "Beoordelingen" + +#. translators: %s: URL to "Features as Plugins" page. +#: wp-admin/includes/plugin-install.php:407 +msgid "You are using a development version of WordPress. These feature plugins are also under development. Learn more." +msgstr "Je maakt gebruik van een ontwikkelversie van WordPress. Deze feature plugins zijn ook in ontwikkeling. Meer informatie." + +#: wp-admin/includes/image-edit.php:212 +msgid "Thumbnail Settings Help" +msgstr "Hulp voor thumbnail-instellingen" + +#: wp-admin/includes/image-edit.php:197 +msgid "selection height" +msgstr "Selectie hoogte" + +#: wp-admin/includes/image-edit.php:194 +msgid "selection width" +msgstr "Selectie breedte" + +#: wp-admin/includes/image-edit.php:186 +msgid "crop ratio height" +msgstr "Bijsnijden hoogte-ratio" + +#: wp-admin/includes/image-edit.php:183 +msgid "crop ratio width" +msgstr "Bijsnijden breedte-ratio" + +#: wp-admin/includes/image-edit.php:167 +msgid "Image Crop Help" +msgstr "Hulp voor afbeelding bijsnijden" + +#: wp-admin/includes/image-edit.php:129 +msgid "scale height" +msgstr "hoogte schalen" + +#: wp-admin/includes/image-edit.php:126 +msgid "scale width" +msgstr "breedte schalen" + +#: wp-admin/includes/image-edit.php:124 +msgid "New dimensions:" +msgstr "Nieuwe dimensies:" + +#: wp-admin/includes/image-edit.php:106 +msgid "Scale Image Help" +msgstr "Help over afbeelding schalen" + +#: wp-admin/includes/file.php:37 +msgid "Single Page" +msgstr "Enkelvoudige pagina" + +#: wp-admin/includes/file.php:35 +msgid "Singular Template" +msgstr "Template voor individuele pagina's" + +#: wp-admin/includes/file.php:33 +msgid "Date Template" +msgstr "Datum-template" + +#: wp-admin/includes/file.php:28 +msgid "Taxonomy Template" +msgstr "Taxonomie-template" + +#: wp-admin/includes/dashboard.php:1645 +msgid "Dismiss the browser warning panel" +msgstr "Het waarschuwingspaneel van de browser negeren" + +#: wp-admin/includes/dashboard.php:1060 +msgid "View more comments" +msgstr "Meer reacties tonen" + +#. translators: 1: Type of comment, 2: Post link, 3: Notification if the +#. comment is pending. +#: wp-admin/includes/dashboard.php:852 +msgctxt "dashboard" +msgid "%1$s on %2$s %3$s" +msgstr "%1$s op %2$s %3$s" + +#: wp-admin/includes/dashboard.php:751 +msgid "View this comment" +msgstr "Deze reactie bekijken" + +#: wp-admin/includes/class-core-upgrader.php:30 +msgid "Another update is currently in progress." +msgstr "Een andere update wordt momenteel verwerkt." + +#: wp-admin/includes/class-plugin-upgrader-skin.php:85 +#: wp-admin/update-core.php:1108 wp-admin/update-core.php:1148 +msgid "Update progress" +msgstr "Updateproces" + +#. translators: %s: Taxonomy term name. +#: wp-admin/includes/class-wp-terms-list-table.php:506 +msgid "View “%s” archive" +msgstr "“%s” archief tonen" + +#. translators: %s: Taxonomy term name. +#: wp-admin/includes/class-wp-terms-list-table.php:497 +msgid "Delete “%s”" +msgstr "“%s” verwijderen" + +#. translators: %s: Taxonomy term name. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-terms-list-table.php:488 +#: wp-admin/includes/class-wp-posts-list-table.php:1353 +msgid "Quick edit “%s” inline" +msgstr "“%s” snel bewerken" + +#: wp-admin/includes/class-wp-plugins-list-table.php:414 +msgid "Search for plugins in the WordPress Plugin Directory." +msgstr "Plugins zoeken in de WordPress Plugin Directory." + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:751 +#: wp-admin/includes/class-wp-posts-list-table.php:1365 +msgid "Restore “%s” from the Trash" +msgstr "“%s” herstellen vanuit de prullenbak" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:713 +#: wp-admin/includes/class-wp-media-list-table.php:770 +#: wp-admin/includes/class-wp-posts-list-table.php:1382 +msgid "Delete “%s” permanently" +msgstr "“%s” permanent verwijderen" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:703 +#: wp-admin/includes/class-wp-media-list-table.php:759 +#: wp-admin/includes/class-wp-posts-list-table.php:1373 +msgid "Move “%s” to the Trash" +msgstr "“%s” naar prullenbak verplaatsen" + +#. translators: %s: Attachment title. +#: wp-admin/includes/class-wp-media-list-table.php:554 +#: wp-admin/includes/class-wp-media-list-table.php:731 +msgid "Attach “%s” to existing content" +msgstr "Koppel “%s” aan bestaande inhoud" + +#. translators: %s: Title of the post the attachment is attached to. +#: wp-admin/includes/class-wp-media-list-table.php:540 +msgid "Detach from “%s”" +msgstr "Loskoppelen van “%s”" + +#. translators: %s: Taxonomy term name. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-terms-list-table.php:419 +#: wp-admin/includes/class-wp-media-list-table.php:414 +#: wp-admin/includes/class-wp-posts-list-table.php:1030 +msgid "“%s” (Edit)" +msgstr "“%s” (bewerken)" + +#: wp-admin/includes/class-wp-media-list-table.php:160 +msgctxt "attachment filter" +msgid "Trash" +msgstr "Prullenbak" + +#: wp-admin/includes/class-wp-comments-list-table.php:788 +msgid "Quick edit this comment inline" +msgstr "Deze reactie snel bewerken" + +#: wp-admin/includes/class-wp-comments-list-table.php:776 +#: wp-admin/includes/dashboard.php:709 +msgid "Edit this comment" +msgstr "Deze reactie bewerken" + +#: wp-admin/includes/class-wp-comments-list-table.php:739 +msgid "Restore this comment from the spam" +msgstr "Deze reactie herstellen vanuit de prullenbak" + +#. translators: 1: User login, 2: User email address. +#: wp-admin/includes/ajax-actions.php:325 +msgctxt "user autocomplete result" +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#. translators: %s: Importer slug. +#: wp-admin/import.php:67 +msgid "The %s importer is invalid or is not installed." +msgstr "De %s importeerfunctie is ongeldig of niet geïnstalleerd." + +#: wp-admin/edit-form-comment.php:117 +msgctxt "comment status" +msgid "Pending" +msgstr "Wachtend" + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:596 +msgid "Suggested height is %s." +msgstr "Aangeraden hoogte is %s." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:585 +msgid "Suggested width is %s." +msgstr "Aangeraden breedte is %s." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:572 +msgid "Images should be at least %s tall." +msgstr "Afbeeldingen moeten minimaal %s hoog zijn." + +#. translators: %d: Custom header width. +#. translators: %d: Custom header height. +#: wp-admin/includes/class-custom-image-header.php:563 +#: wp-admin/includes/class-custom-image-header.php:575 +#: wp-admin/includes/class-custom-image-header.php:588 +#: wp-admin/includes/class-custom-image-header.php:599 +msgid "%d pixels" +msgstr "%d pixels" + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:560 +msgid "Images should be at least %s wide." +msgstr "Afbeeldingen moeten minimaal %s breed zijn." + +#: wp-admin/user-new.php:597 +msgid "Send the new user an email about their account." +msgstr "Nieuwe gebruiker een e-mailbericht versturen over hun account." + +#: wp-admin/user-new.php:594 +msgid "Send User Notification" +msgstr "Gebruikersmelding versturen" + +#. translators: %s: Menu name. +#: wp-admin/nav-menus.php:1055 +msgctxt "menu location" +msgid "(Currently set to: %s)" +msgstr "(Nu ingesteld op: %s)" + +#. translators: %s: WordPress version number. +#: wp-admin/about.php:312 +msgid "Version %s addressed one security issue." +msgstr "Versie %s heeft één beveiligingsprobleem opgelost." + +#: wp-admin/user-edit.php:591 +msgid "https://en.gravatar.com/" +msgstr "https://en.gravatar.com/" + +#: wp-admin/user-edit.php:582 +msgid "Profile Picture" +msgstr "Profielfoto" + +#: wp-admin/about.php:309 +msgid "Maintenance and Security Releases" +msgstr "Onderhoud en beveiliging releases" + +#: wp-admin/about.php:306 +msgid "Security Releases" +msgstr "Beveiligingsreleases" + +#: wp-admin/about.php:303 +msgid "Maintenance Releases" +msgstr "Onderhoudsreleases" + +#: wp-admin/options-permalink.php:235 +msgid "Plain" +msgstr "Eenvoudig" + +#. translators: %s: Documentation URL. +#: wp-admin/options-permalink.php:211 +msgid "WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A number of tags are available, and here are some examples to get you started." +msgstr "WordPress geeft je de mogelijkheid om een aangepaste URL structuur te maken voor je permalinks en archieven. Aangepaste URL structuren kunnen de schoonheid, bruikbaarheid en compatibiliteit van je links verbeteren. Een aantal tags zijn beschikbaar en hier zijn wat voorbeelden om je op weg te helpen." + +#: wp-admin/options-permalink.php:33 +msgid "Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure." +msgstr "Permalinks kunnen bruikbare informatie bevatten, zoals publicatie datum, titel of andere elementen. Je kunt kiezen uit diverse voorgestelde formaten of je kunt je eigen aangepaste structuur creëren." + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:407 +msgid "You can create the %s file manually and paste the following text into it." +msgstr "Je kunt het %s bestand handmatig creëren en de volgende tekst erin plakken." + +#. translators: %s: localhost +#: wp-admin/setup-config.php:237 +msgid "You should be able to get this info from your web host, if %s doesn’t work." +msgstr "Je zou deze informatie van je webhost moeten kunnen krijgen als %s niet werkt." + +#. translators: %s: Documentation URL. +#: wp-admin/setup-config.php:193 +msgid "Need more help? We got it." +msgstr "Meer hulp nodig? We zijn er voor je." + +#. translators: 1: wp-config-sample.php, 2: wp-config.php +#: wp-admin/setup-config.php:184 +msgid "If for any reason this automatic file creation doesn’t work, don’t worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s." +msgstr "Als het automatisch aanmaken mislukt, maak je dan geen zorgen. Het enige wat dit proces doet is de database informatie in een configuratiebestand zetten. Je kunt ook %1$s in een tekstbewerker openen, de informatie toevoegen en opslaan als %2$s." + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:176 +msgid "We’re going to use this information to create a %s file." +msgstr "Wij zullen deze informatie gebruiken om een %s bestand te maken." + +#. translators: %s: wp-content/uploads +#: wp-admin/options-media.php:123 +msgid "Default is %s" +msgstr "Standaard is %s" + +#. translators: 1: .po, 2: .mo +#: wp-admin/includes/class-language-pack-upgrader.php:352 +msgid "The language pack is missing either the %1$s or %2$s files." +msgstr "Het taalpakket mist of %1$s of de %2$s bestanden." + +#. translators: %s: index.php +#: wp-admin/includes/class-theme-upgrader.php:585 +msgid "The theme is missing the %s file." +msgstr "Het thema mist het %s bestand." + +#. translators: %s: style.css +#: wp-admin/includes/class-theme-upgrader.php:572 +msgid "The %s stylesheet doesn’t contain a valid theme header." +msgstr "Het %s stylesheet bevat geen geldige thema-header." + +#. translators: %s: style.css +#: wp-admin/includes/class-theme-upgrader.php:547 +msgid "The theme is missing the %s stylesheet." +msgstr "Het thema heeft geen %s stylesheet." + +#: wp-admin/theme-install.php:196 +msgid "If you have marked themes as favorites on WordPress.org, you can browse them here." +msgstr "Als je thema's als favoriet gemarkeerd hebt op WordPress.org, kun je ze hier bekijken." + +#: wp-admin/theme-install.php:179 +msgctxt "themes" +msgid "Favorites" +msgstr "Favorieten" + +#: wp-admin/maint/repair.php:71 +msgid "Database repair results" +msgstr "Resultaten databasereparatie" + +#: wp-admin/maint/repair.php:30 +msgid "Allow automatic database repair" +msgstr "Automatische databasereparatie toestaan" + +#: wp-admin/setup-config.php:448 +msgid "Successful database connection" +msgstr "Database-connectie gelukt" + +#: wp-admin/setup-config.php:212 +msgid "Set up your database connection" +msgstr "De database-verbinding instellen" + +#: wp-admin/setup-config.php:163 +msgid "Before getting started" +msgstr "Voorafgaande aan het starten" + +#: wp-admin/maint/repair.php:159 +msgid "WordPress database repair" +msgstr "WordPressdatabase repareren" + +#: wp-admin/maint/repair.php:64 +msgid "Check secret keys" +msgstr "Geheime sleutels controleren" + +#. translators: %s: Nav menu title. +#: wp-admin/includes/nav-menu.php:1243 +msgid "%s has been updated." +msgstr "%s is bijgewerkt." + +#. translators: %s: Walker class name. +#: wp-admin/includes/nav-menu.php:1059 +msgid "The Walker class named %s does not exist." +msgstr "De Walker class met de naam %s bestaat niet." + +#. translators: 1: Drop-in constant name, 2: wp-config.php +#: wp-admin/includes/class-wp-plugins-list-table.php:763 +msgid "Requires %1$s in %2$s file." +msgstr "Vereist %1$s in het %2$s bestand." + +#. translators: %s: Date and time. +#: wp-admin/options-general.php:289 +msgid "Standard time begins on: %s." +msgstr "Standaard tijd begint om: %s." + +#. translators: %s: Date and time. +#: wp-admin/options-general.php:287 +msgid "Daylight saving time begins on: %s." +msgstr "Zomertijd begint op: %s." + +#. translators: %s: File name. +#: wp-admin/includes/media.php:1729 +msgid "You are about to delete %s." +msgstr "Je staat op het punt om %s te verwijderen." + +#. translators: %s: mu-plugins directory name. +#: wp-admin/includes/class-wp-plugins-list-table.php:662 +msgid "Files in the %s directory are executed automatically." +msgstr "Bestanden in de %s map worden automatisch uitgevoerd." + +#: wp-admin/widgets.php:496 +msgid "This will clear all items from the inactive widgets list. You will not be able to restore any customizations." +msgstr "Hiermee zal de lijst met inactieve widgets worden opgeschoond. Het is dan niet mogelijk om aanpassingen te herstellen." + +#: wp-admin/widgets.php:486 +msgid "Clear Inactive Widgets" +msgstr "Inactieve widgets sluiten" + +#: wp-admin/users.php:146 wp-admin/network/site-users.php:164 +msgid "One of the selected users is not a member of this site." +msgstr "Eén van de geselecteerde gebruikers is niet lid van deze site." + +#: wp-admin/users.php:83 wp-admin/network/users.php:238 +msgid "Users list" +msgstr "Gebruikerslijst" + +#: wp-admin/users.php:82 wp-admin/network/users.php:237 +msgid "Users list navigation" +msgstr "Gebruikerslijst navigatie" + +#: wp-admin/users.php:81 wp-admin/network/users.php:236 +msgid "Filter users list" +msgstr "Gebruikerslijst filteren" + +#: wp-admin/upload.php:260 +msgid "Media items list" +msgstr "Mediabestandenlijst" + +#: wp-admin/upload.php:259 +msgid "Media items list navigation" +msgstr "Mediabestandenlijst navigatie" + +#: wp-admin/upload.php:258 +msgid "Filter media items list" +msgstr "Mediabestandenlijst filteren" + +#: wp-admin/themes.php:651 +msgid "Install Parent Theme" +msgstr "Hoofdthema installeren" + +#: wp-admin/theme-install.php:241 wp-admin/network/themes.php:332 +msgid "Themes list" +msgstr "Themalijst" + +#: wp-admin/theme-install.php:168 wp-admin/network/themes.php:330 +msgid "Filter themes list" +msgstr "Themalijst filteren" + +#: wp-admin/plugins.php:702 +msgid "All selected plugins are up to date." +msgstr "Alle geselecteerde plugins zijn bijgewerkt." + +#: wp-admin/plugins.php:596 wp-admin/plugin-install.php:117 +msgid "Plugins list" +msgstr "Pluginlijst" + +#: wp-admin/plugins.php:595 wp-admin/plugin-install.php:116 +msgid "Plugins list navigation" +msgstr "Pluginlijst navigatie" + +#: wp-admin/plugins.php:594 wp-admin/plugin-install.php:115 +msgid "Filter plugins list" +msgstr "Pluginlijst filteren" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:211 +msgid "Browsing %s (inactive)" +msgstr "%s bekijken (inactief)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:208 +msgid "Editing %s (inactive)" +msgstr "%s bewerken (inactief)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:203 +msgid "Browsing %s (active)" +msgstr "Bladeren %s (actief)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:200 +msgid "Editing %s (active)" +msgstr "%s bewerken (actief)" + +#. translators: %s: Local time. +#: wp-admin/options-general.php:256 +msgid "Local time is %s." +msgstr "Lokale tijd is %s" + +#: wp-admin/my-sites.php:72 wp-admin/network/menu.php:53 +#: wp-admin/network/sites.php:369 +msgctxt "site" +msgid "Add New" +msgstr "Nieuwe toevoegen" + +#: wp-admin/link-manager.php:84 +msgid "Links list" +msgstr "Linklijst" + +#. translators: %s: WordPress version. +#: wp-admin/includes/update.php:270 +msgid "Get Version %s" +msgstr "Bijwerken naar versie %s" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1361 +msgid "Toggle panel: %s" +msgstr "paneel %s verbergen" + +#: wp-admin/includes/post.php:1787 +msgid "Saving revision…" +msgstr "Revisie bewaren…" + +#: wp-admin/includes/post.php:1489 +msgid "Edit permalink" +msgstr "Permalink bewerken" + +#. translators: 1: Site Wide Only: true, 2: Network: true +#: wp-admin/includes/plugin.php:91 +msgid "The %1$s plugin header is deprecated. Use %2$s instead." +msgstr "De %1$s plugin-header is verlopen. Gebruik in plaats daarvoor %2$s." + +#: wp-admin/includes/class-wp-site-health.php:1009 +#: wp-admin/includes/class-wp-site-health.php:1724 +msgid "Warning" +msgstr "Waarschuwing" + +#: wp-admin/includes/template.php:1322 wp-admin/options.php:351 +#: wp-admin/includes/network.php:128 wp-admin/includes/network.php:203 +#: wp-admin/includes/network.php:263 wp-admin/includes/network.php:312 +#: wp-admin/includes/network.php:325 wp-admin/includes/network.php:427 +#: wp-admin/includes/network.php:615 wp-admin/includes/network.php:668 +msgid "Warning:" +msgstr "Waarschuwing:" + +#: wp-admin/includes/ms.php:983 +msgid "Once you hit “Confirm Deletion”, these users will be permanently removed." +msgstr "Zodra je klikt op “Verwijdering bevestigen” worden deze gebruikers permanent verwijderd." + +#: wp-admin/includes/ms.php:981 +msgid "Once you hit “Confirm Deletion”, the user will be permanently removed." +msgstr "Zodra je klikt op “Verwijdering bevestigen” worden deze gebruiker permanent verwijderd." + +#: wp-admin/includes/ms.php:966 +msgid "User has no sites or content and will be deleted." +msgstr "Gebruiker heeft geen sites of publicaties en zal worden verwijderd." + +#. translators: %s: Link to user's site. +#: wp-admin/includes/ms.php:951 +msgid "Site: %s" +msgstr "Site: %s" + +#: wp-admin/includes/ms.php:930 +msgid "Select a user" +msgstr "Een gebruiker selecteren" + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:914 +msgid "What should be done with content owned by %s?" +msgstr "Wat moet er gebeuren met de inhoud van %s?" + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:895 +msgid "Warning! User cannot be deleted. The user %s is a network administrator." +msgstr "Waarschuwing. Gebruiker kan niet verwijderd worden. De gebruiker %s is een netwerkbeheerder." + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:885 +msgid "Warning! User %s cannot be deleted." +msgstr "Waarschuwing! Gebruiker %s kan niet verwijderd worden." + +#: wp-admin/includes/ms.php:864 +msgid "You have chosen to delete the following users from all networks and sites." +msgstr "Je hebt ervoor gekozen om de volgende gebruikers te verwijderen van alle netwerken en sites." + +#: wp-admin/includes/ms.php:862 +msgid "You have chosen to delete the user from all networks and sites." +msgstr "Je hebt ervoor gekozen om de gebruiker van alle netwerken en sites te verwijderen." + +#: wp-admin/includes/media.php:1008 +msgid "Invalid image URL." +msgstr "Ongeldige afbeelding-URL." + +#: wp-admin/includes/file.php:17 +msgid "Theme Header" +msgstr "Thema-header" + +#: wp-admin/includes/file.php:18 +msgid "Theme Footer" +msgstr "Themavoettekst" + +#. translators: Date and time format for recent posts on the dashboard, from a +#. different calendar year, see https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/dashboard.php:979 +msgid "M jS Y" +msgstr "j M Y" + +#. translators: 1: Comment author, 2: Notification if the comment is pending. +#: wp-admin/includes/dashboard.php:823 +msgid "From %1$s %2$s" +msgstr "Van %1$s %2$s" + +#: wp-admin/includes/dashboard.php:613 +msgid "View all drafts" +msgstr "Alle concepten bekijken" + +#: wp-admin/includes/class-wp-users-list-table.php:627 +msgctxt "no user roles" +msgid "None" +msgstr "Geen" + +#: wp-admin/includes/class-wp-users-list-table.php:243 +msgid "No role" +msgstr "Geen rol" + +#. translators: 1: Title of an update, 2: Error message. +#: wp-admin/includes/class-bulk-upgrader-skin.php:43 +msgid "An error occurred while updating %1$s: %2$s" +msgstr "Er is een fout opgetreden bij het bijwerken van %1$s: %2$s." + +#: wp-admin/includes/class-wp-screen.php:1329 +msgid "View mode" +msgstr "Weergavemodus" + +#: wp-admin/includes/class-wp-screen.php:1276 +msgid "Pagination" +msgstr "Paginering" + +#. translators: %s: Number of columns on the page. +#: wp-admin/includes/class-wp-screen.php:1214 +msgid "%s column" +msgid_plural "%s columns" +msgstr[0] "%s kolom" +msgstr[1] "%s kolommen" + +#: wp-admin/includes/class-wp-screen.php:1002 +msgid "Additional settings" +msgstr "Overige instellingen" + +#: wp-admin/includes/class-wp-screen.php:762 +msgid "Items list" +msgstr "Itemlijst" + +#: wp-admin/includes/class-wp-screen.php:761 +msgid "Items list navigation" +msgstr "Itemlijst navigatie" + +#: wp-admin/includes/class-wp-screen.php:760 +msgid "Filter items list" +msgstr "Itemlijst filteren" + +#: wp-admin/includes/class-wp-plugins-list-table.php:823 +msgid "Network Only" +msgstr "Alleen netwerk" + +#: wp-admin/includes/class-wp-plugins-list-table.php:819 +msgid "Network Active" +msgstr "Netwerk actief" + +#: wp-admin/includes/class-wp-list-table.php:787 +msgid "No pending comments" +msgstr "Geen wachtende reacties" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ssh2.php:174 +msgid "Failed to initialize a SFTP subsystem session with the SSH2 Server %s" +msgstr "Het is niet gelukt een SFTP-sessie tot stand te brengen met de SSH2-server %s." + +#: wp-admin/includes/class-wp-comments-list-table.php:469 +msgctxt "column name" +msgid "Submitted on" +msgstr "Verzonden op" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:275 +msgctxt "comments" +msgid "Trash (%s)" +msgid_plural "Trash (%s)" +msgstr[0] "Prullenbak (%s)" +msgstr[1] "Prullenbak (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:268 +msgctxt "comments" +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Spam (%s)" +msgstr[1] "Spam (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:261 +msgctxt "comments" +msgid "Approved (%s)" +msgid_plural "Approved (%s)" +msgstr[0] "Goedgekeurd (%s)" +msgstr[1] "Goedgekeurd (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:254 +msgctxt "comments" +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "Wachtend (%s)" +msgstr[1] "Wachtend (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:240 +msgctxt "comments" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alles (%s)" +msgstr[1] "Alles (%s)" + +#. translators: %s: The new user. +#: wp-admin/includes/ajax-actions.php:1702 +msgid "User %s added" +msgstr "Gebruiker %s toegevoegd" + +#: wp-admin/export.php:214 wp-admin/export.php:261 wp-admin/export.php:301 +msgid "End date:" +msgstr "Einddatum:" + +#: wp-admin/export.php:178 +msgid "Content to export" +msgstr "Content om te exporteren" + +#: wp-admin/edit.php:253 +msgid "You can view posts in a simple title list or with an excerpt using the Screen Options tab." +msgstr "Je kunt de berichtweergave wisselen tussen een simpel overzicht met titels of een overzicht met titels en samenvatting door de tab Schermopties te kiezen." + +#. translators: %s: Comment date. +#: wp-admin/edit-form-comment.php:136 +msgid "Submitted on: %s" +msgstr "Geplaatst op: %s" + +#: wp-admin/edit-form-comment.php:32 +msgctxt "comment" +msgid "Permalink:" +msgstr "Permalink:" + +#: wp-admin/edit-form-advanced.php:208 +msgid "Page draft updated." +msgstr "Pagina concept bijgewerkt." + +#. translators: %s: Scheduled date for the page. +#: wp-admin/edit-form-advanced.php:207 +msgid "Page scheduled for: %s." +msgstr "Pagina gepland voor: %s." + +#: wp-admin/edit-form-advanced.php:205 +msgid "Page submitted." +msgstr "Pagina ingediend." + +#: wp-admin/edit-form-advanced.php:193 +msgid "Post draft updated." +msgstr "Conceptbericht bijgewerkt." + +#. translators: %s: Scheduled date for the post. +#: wp-admin/edit-form-advanced.php:192 +msgid "Post scheduled for: %s." +msgstr "Bericht ingepland voor: %s." + +#: wp-admin/edit-form-advanced.php:190 +msgid "Post submitted." +msgstr "Bericht geplaatst." + +#: wp-admin/edit-form-advanced.php:166 +msgid "View page" +msgstr "Pagina bekijken" + +#: wp-admin/edit-form-advanced.php:152 wp-admin/edit-form-advanced.php:159 +msgid "Preview page" +msgstr "Preview pagina" + +#: wp-admin/edit-form-advanced.php:131 wp-admin/edit-form-advanced.php:138 +msgid "Preview post" +msgstr "Voorbeeld bericht" + +#: wp-admin/edit-comments.php:204 +msgid "Comments list" +msgstr "Reactielijst" + +#: wp-admin/edit-comments.php:203 +msgid "Comments list navigation" +msgstr "Navigatie reactielijst" + +#: wp-admin/edit-comments.php:202 +msgid "Filter comments list" +msgstr "Reactielijst filteren" + +#: wp-admin/edit-comments.php:187 +msgid "In the Submitted on column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site." +msgstr "In de verzonden op kolom wordt de datum en tijd getoond wanneer de reactie was achtergelaten op de site. Een klik op de datum/tijd link brengt je naar de reactie op de live site." + +#: wp-admin/edit-comments.php:185 +msgid "In the Comment column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment." +msgstr "Beweeg in de kolom Reactie met de cursor over een reactie om de opties goedkeuren, antwoorden (en goedkeuren), snel bewerken, als spam markeren, of verwijderen voor die reactie zichtbaar te maken." + +#. translators: %s: Comments count. +#: wp-admin/edit-comments.php:160 wp-admin/js/edit-comments.js:196 +#: wp-admin/js/edit-comments.js:216 +msgid "Comments (%s)" +msgstr "Reacties (%s)" + +#. translators: 1: Comments count, 2: Post title. +#: wp-admin/edit-comments.php:144 +msgid "Comments (%1$s) on “%2$s”" +msgstr "Reacties (%1$s) op “%2$s”" + +#: wp-admin/includes/ajax-actions.php:5369 +msgid "Sorry, you are not allowed to modify themes." +msgstr "Je hebt geen toestemming om thema's te bewerken." + +#: wp-admin/includes/class-custom-image-header.php:948 +msgid "The current theme does not support a flexible sized header image." +msgstr "Het huidige thema ondersteunt geen flexibele kopafbeelding." + +#: wp-admin/includes/class-custom-image-header.php:776 +#: wp-admin/includes/class-custom-image-header.php:940 +msgid "The current theme does not support uploading a custom header image." +msgstr "Het huidige thema ondersteunt helaas geen aangepaste kopafbeelding." + +#: wp-admin/includes/user.php:525 +msgid "You’re using the auto-generated password for your account. Would you like to change it?" +msgstr "Je maakt gebruikt van het automatisch gegenereerde wachtwoord voor je account. Wil je dit wijzigen?" + +#: wp-admin/users.php:419 +msgid "You have specified this user for removal:" +msgstr "Deze gebruiker is aangemerkt voor verwijdering:" + +#. translators: %s: User's display name. +#: wp-admin/user-edit.php:704 +msgid "Log %s out of all locations." +msgstr "%s uitloggen op alle locaties." + +#: wp-admin/user-edit.php:692 +msgid "Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here." +msgstr "Je telefoon verloren of ben je vergeten uit te loggen op een publieke computer? Je kunt jezelf overal uitloggen, behalve op je huidige computer." + +#: wp-admin/user-edit.php:680 wp-admin/user-edit.php:690 +msgid "Log Out Everywhere Else" +msgstr "Overal uitloggen" + +#: wp-admin/user-edit.php:678 wp-admin/user-edit.php:688 +#: wp-admin/user-edit.php:698 +msgid "Sessions" +msgstr "Sessies" + +#: wp-admin/user-edit.php:644 +msgid "Cancel password change" +msgstr "Wachtwoordaanpassingen annuleren" + +#: wp-admin/user-new.php:563 +msgid "Generate password" +msgstr "Wachtwoord genereren" + +#: wp-admin/user-edit.php:629 +msgid "Account Management" +msgstr "Gebruikersbeheer" + +#. translators: The non-breaking space prevents 1Password from thinking the +#. text "log in" should trigger a password save prompt. +#: wp-admin/install.php:153 +msgid "You will need this password to log in. Please store it in a secure location." +msgstr "Dit wachtwoord is nodig om in te loggen. Zorg ervoor dat je het bewaart op een geheime locatie." + +#: wp-admin/includes/class-wp-list-table.php:764 +msgid "No approved comments" +msgstr "Geen goedgekeurde reacties" + +#: wp-admin/includes/class-wp-list-table.php:734 +#: wp-admin/includes/class-wp-list-table.php:764 +#: wp-admin/includes/class-wp-list-table.php:787 +msgid "No comments" +msgstr "Geen reacties" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:726 +msgid "%s pending comment" +msgid_plural "%s pending comments" +msgstr[0] "%s wachtende reactie" +msgstr[1] "%s wachtende reacties" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:720 +msgid "%s approved comment" +msgid_plural "%s approved comments" +msgstr[0] "%s toegelaten reactie" +msgstr[1] "%s toegelaten reacties" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:714 +msgid "%s comment" +msgid_plural "%s comments" +msgstr[0] "%s reactie" +msgstr[1] "%s reacties" + +#: wp-admin/includes/ajax-actions.php:3877 +msgid "Image could not be processed." +msgstr "Afbeelding kon niet worden verwerkt." + +#: wp-admin/install.php:167 wp-admin/user-new.php:585 +#: wp-admin/user-edit.php:664 +msgid "Confirm Password" +msgstr "Wachtwoord bevestigen" + +#. translators: 1: wp-config.php, 2: Secret key service URL. +#: wp-admin/maint/repair.php:67 +msgid "While you are editing your %1$s file, take a moment to make sure you have all 8 keys and that they are unique. You can generate these using the WordPress.org secret key service." +msgstr "Wanneer je je %1$s-bestand gaat bewerken, neem een moment om te controleren dat alle 8 sleutels beschikbaar en uniek zijn. De sleutels kunnen gegenereerd worden via de WordPress geheime sleutel service." + +#: wp-admin/includes/update.php:905 +#: wp-admin/includes/class-wp-comments-list-table.php:847 +#: wp-admin/includes/class-wp-list-table.php:572 +#: wp-admin/includes/class-wp-list-table.php:1458 +#: wp-admin/includes/class-wp-application-passwords-list-table.php:259 +msgid "Show more details" +msgstr "Meer details tonen" + +#. translators: %s: Number of menus. +#: wp-admin/nav-menus.php:725 +msgid "Your theme supports %s menu. Select which menu appears in each location." +msgid_plural "Your theme supports %s menus. Select which menu appears in each location." +msgstr[0] "Je thema ondersteunt nu %s menu. Selecteer welk menu moet worden getoond." +msgstr[1] "Je thema ondersteunt nu %s menu’s. Selecteer per locatie welk menu moet worden getoond." + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-users-list-table.php:564 +msgid "%s post by this author" +msgid_plural "%s posts by this author" +msgstr[0] "%s bericht door deze auteur" +msgstr[1] "%s berichten door deze auteur" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-installer-skin.php:133 +#: wp-admin/includes/class-theme-upgrader-skin.php:105 +msgid "Live Preview “%s”" +msgstr "Live voorbeeld “%s”" + +#: wp-admin/includes/class-wp-list-table.php:970 +msgid "Last page" +msgstr "Laatste pagina" + +#: wp-admin/includes/class-wp-list-table.php:918 +msgid "First page" +msgstr "Eerste pagina" + +#. translators: %s: Post link. +#: wp-admin/edit-form-comment.php:160 +msgid "In response to: %s" +msgstr "In antwoord op: %s" + +#: wp-admin/includes/meta-boxes.php:275 wp-admin/edit-form-comment.php:141 +msgid "Date and time" +msgstr "Datum en tijd" + +#: wp-admin/edit-form-comment.php:115 +msgid "Comment status" +msgstr "Reactiestatus" + +#: wp-admin/edit-form-advanced.php:362 +msgid "You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. Learn more about embeds." +msgstr "Je kunt ook media van vele populaire sites waaronder Twitter, YouTube, Flickr en anderen insluiten door de media-URL op een eigen regel in de inhoud van je bericht/pagina te plakken. Meer informatie over insluitingen." + +#: wp-admin/includes/class-custom-background.php:99 +msgid "Documentation on Custom Background" +msgstr "Documentatie over aangepaste achtergrond" + +#: wp-admin/edit-tags.php:309 +msgid "Documentation on Link Categories" +msgstr "Documentatie over linkcategorieën" + +#: wp-admin/edit-link-form.php:76 +msgid "Documentation on Creating Links" +msgstr "Documentatie over het aanmaken van links" + +#: wp-admin/link-manager.php:78 +msgid "Documentation on Managing Links" +msgstr "Documentatie over het beheren van links" + +#: wp-admin/includes/class-custom-image-header.php:134 +msgid "Documentation on Custom Header" +msgstr "Documentatie over aangepaste kopafbeeldingen" + +#: wp-admin/my-sites.php:51 +msgid "Documentation on My Sites" +msgstr "Documentatie over mijn sites" + +#: wp-admin/widgets.php:88 +msgid "The theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions." +msgstr "Het thema dat je gebruikt is niet geschikt voor gebruik van widgets, omdat het geen zijbalk heeft welke je kunt aanpassen. Voor informatie over hoe je een thema geschikt kunt maken voor widgets, volg deze instructies." + +#. translators: %s: Codex URL. +#: wp-admin/options-writing.php:209 +msgid "When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see Update Services on the Codex. Separate multiple service URLs with line breaks." +msgstr "Als je een nieuw bericht publiceert, zal WordPress automatisch de volgende site update services informeren. Update Services op de Codex bezoeken voor meer informatie. Meerdere service-URL's scheiden met een nieuwe regel." + +#: wp-admin/includes/options.php:133 +msgid "The character encoding of your site (UTF-8 is recommended)" +msgstr "De character encoding van je site (UTF-8 wordt aanbevolen)" + +#: wp-admin/includes/file.php:2204 +msgid "example: www.wordpress.org" +msgstr "Bijvoorbeeld: www.wordpress.org" + +#: wp-admin/themes.php:137 +msgid "The search for installed themes will search for terms in their name, description, author, or tag." +msgstr "Het zoeken naar geïnstalleerde thema's maakt gebruik van termen in de naam, beschrijving, auteur of tags van de thema's." + +#: wp-admin/theme-install.php:102 +msgid "Alternately, you can browse the themes that are Featured, Popular, or Latest. When you find a theme you like, you can preview it or install it." +msgstr "Als alternatief kun je bladeren door de thema's via Uitgelicht, Populair of Laatste. Wanneer je een thema leuk vindt kun je het bekijken of installeren." + +#: wp-admin/theme-install.php:101 +msgid "You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter." +msgstr "Het is mogelijk om te zoeken naar thema's op trefwoord, auteur of tag. Daarnaast kun je specifieker zoeken door de criteria te gebruiken in het filter." + +#. translators: %d: Number of themes. +#: wp-admin/themes.php:234 wp-admin/theme-install.php:67 +msgid "Number of Themes found: %d" +msgstr "Aantal gevonden thema's: %d" + +#: wp-admin/options-general.php:371 +msgid "Custom time format:" +msgstr "Aangepast tijdsformaat:" + +#: wp-admin/options-general.php:370 +msgid "enter a custom time format in the following field" +msgstr "een aangepast tijdsformaat invoeren in het volgende veld" + +#: wp-admin/options-general.php:334 +msgid "Custom date format:" +msgstr "Aangepast datumformaat:" + +#: wp-admin/options-general.php:333 +msgid "enter a custom date format in the following field" +msgstr "een aangepast datumformaat invoeren in het volgende veld" + +#: wp-admin/includes/class-plugin-upgrader.php:66 +msgid "Plugins updated successfully." +msgstr "Plugins zijn bijgewerkt." + +#. translators: %s: Number of millions. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:747 +#: wp-admin/includes/plugin-install.php:689 +msgctxt "Active plugin installations" +msgid "%s+ Million" +msgid_plural "%s+ Million" +msgstr[0] "%s+ miljoen" +msgstr[1] "%s+ miljoen" + +#. translators: 1: Error message, 2: Line number. +#: wp-admin/link-parse-opml.php:89 +msgid "XML Error: %1$s at line %2$s" +msgstr "XML-fout: %1$s op regel %2$s" + +#: wp-admin/includes/class-wp-media-list-table.php:541 +msgid "Detach" +msgstr "Loskoppelen" + +#: wp-admin/menu-header.php:286 +msgid "Main menu" +msgstr "Hoofdmenu" + +#: wp-admin/includes/file.php:2255 +msgid "Enter the location on the server where the public and private keys are located. If a passphrase is needed, enter that in the password field above." +msgstr "Vul de locatie in waar de publieke en privésleutels staan op de server. Als een wachtwoord nodig is, vul deze dan in het bovenstaande veld in." + +#. translators: %s: Number of users. +#: wp-admin/users.php:490 +msgid "%s user deleted." +msgid_plural "%s users deleted." +msgstr[0] "%s gebruiker verwijderd." +msgstr[1] "%s gebruikers verwijderd." + +#: wp-admin/users.php:313 +msgid "What should be done with content owned by these users?" +msgstr "Wat moet er worden gedaan met de bijdragen van deze gebruikers?" + +#: wp-admin/users.php:284 +msgid "You have specified these users for deletion:" +msgstr "Je hebt deze gebruikers geselecteerd om te verwijderen:" + +#: wp-admin/plugins.php:350 +msgid "You are about to remove the following plugins:" +msgstr "Je staat op het punt de volgende plugins te verwijderen:" + +#: wp-admin/plugins.php:348 +msgid "These plugins may be active on other sites in the network." +msgstr "Deze plugins kunnen actief zijn op andere sites in het netwerk." + +#: wp-admin/plugins.php:346 +msgid "Delete Plugins" +msgstr "Plugins verwijderen" + +#: wp-admin/edit.php:356 +msgid "1 page not updated, somebody is editing it." +msgstr "1 pagina is niet bijgewerkt, omdat deze momenteel in bewerking is." + +#: wp-admin/edit.php:343 +msgid "1 post not updated, somebody is editing it." +msgstr "1 bericht is niet bijgewerkt, omdat deze momenteel in bewerking is." + +#: wp-admin/user-edit.php:57 +msgid "You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button." +msgstr "Het is mogelijk om uit te loggen bij andere apparaten, zoals je telefoon of publieke computer, door te klikken op de 'Overal uitloggen' knop." + +#: wp-admin/update-core.php:765 +msgid "New translations are available." +msgstr "Er zijn nieuwe vertalingen beschikbaar." + +#: wp-admin/theme-install.php:455 +msgid "This theme has not been rated yet." +msgstr "Dit thema is nog niet beoordeeld." + +#. translators: Date and time format for exact current time, mainly about +#. timezones, see https://www.php.net/manual/datetime.format.php +#: wp-admin/options-general.php:22 +msgctxt "timezone date format" +msgid "Y-m-d H:i:s" +msgstr "d-m-Y H:i:s" + +#: wp-admin/nav-menus.php:630 +msgid "To add a custom link, expand the Custom Links section, enter a URL and link text, and click Add to Menu" +msgstr "Voor het toevoegen van aangepaste links, breidt de aangepaste link-sectie uit, voer een URL met linktekst toe en klik op Aan menu toevoegen" + +#. translators: Do not translate USERNAME, URL_DELETE, SITENAME, SITEURL: those +#. are placeholders. +#: wp-admin/ms-delete-site.php:56 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently clicked the 'Delete Site' link on your site and filled in a\n" +"form on that page.\n" +"\n" +"If you really want to delete your site, click the link below. You will not\n" +"be asked to confirm again so only click this link if you are absolutely certain:\n" +"###URL_DELETE###\n" +"\n" +"If you delete your site, please consider opening a new site here\n" +"some time in the future! (But remember your current site and username\n" +"are gone forever.)\n" +"\n" +"Thanks for using the site,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hallo ###USERNAME###,\n" +"\n" +"Je hebt recentelijk geklikt op de 'Site verwijderen' link op je site en een formulier ingevuld op deze pagina.\n" +"\n" +"Wanneer je daadwerkelijk de site wil verwijderen klik op de onderstaande link. Je zal niet opnieuw gevraagd worden om bevestiging. Weet dus zeker wat je doet als je hier op klikt:\n" +"###URL_DELETE###\n" +"\n" +"Als je je site verwijdert overweeg om in de toekomst een hier nieuwe site te openen. (Maar wees je ervan bewust dat je huidige site en gebruikersnaam definitief zijn verwijderd.)\n" +"\n" +"Bedankt voor het gebruiken van de site,\n" +"Iedereen bij ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/theme.php:789 wp-admin/themes.php:911 +msgid "Close details dialog" +msgstr "Detaildialoogvenster sluiten" + +#: wp-admin/includes/template.php:2669 +msgid "You are currently editing the page that shows your latest posts." +msgstr "Je bent op dit moment een pagina aan het bewerken die de laatste berichten toont." + +#: wp-admin/includes/file.php:31 +msgid "Posts Page" +msgstr "Berichtenpagina" + +#: wp-admin/includes/class-wp-screen.php:1236 +msgid "Number of items per page:" +msgstr "Aantal items per pagina:" + +#: wp-admin/includes/revision.php:241 wp-admin/includes/revision.php:284 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "j M @ H:i" + +#: wp-admin/includes/ms.php:302 wp-admin/network/settings.php:386 +msgid "Size in megabytes" +msgstr "Grootte in megabytes" + +#: wp-admin/includes/ms.php:299 +msgid "Site Upload Space Quota" +msgstr "Site uploadgroottelimiet" + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-admin/includes/misc.php:1357 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the administration email address on\n" +"your site changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hallo ###USERNAME###,\n" +"\n" +"Je hebt onlangs aangevraagd om het e-mailadres van de beheerder voor de site te wijzigen.\n" +"\n" +"Als dat correct is, kun je de volgende link volgen om het definitief te maken:\n" +"###ADMIN_URL###\n" +"\n" +"Je kan dit bericht negeren als je geen actie wilt ondernemen.\n" +"\n" +"Deze e-mail is verstuurd naar ###EMAIL###\n" +"\n" +"Met vriendelijke groet,\n" +"Iedereen bij ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/class-wp-automatic-updater.php:1349 +msgid "" +"UPDATE LOG\n" +"==========" +msgstr "" +"UPDATE LOG\n" +"==========" + +#: wp-admin/includes/class-wp-automatic-updater.php:1326 +msgid "" +"BETA TESTING?\n" +"=============\n" +"\n" +"This debugging email is sent when you are using a development version of WordPress.\n" +"\n" +"If you think these failures might be due to a bug in WordPress, could you report it?\n" +" * Open a thread in the support forums: https://wordpress.org/support/forum/alphabeta\n" +" * Or, if you're comfortable writing a bug report: https://core.trac.wordpress.org/\n" +"\n" +"Thanks! -- The WordPress Team" +msgstr "" +"BETA TESTING?\n" +"=============\n" +"\n" +"Deze debug e-mail wordt verstuurd wanneer je een ontwikkelversie gebruikt van WordPress.\n" +"\n" +"Wanneer je van mening bent dat deze fouten worden veroorzaakt door een bug in WordPress, wil je deze dan rapporteren?\n" +" * Open een nieuwe discussie op het supportforum: https://wordpress.org/support/forum/alphabeta\n" +" * Of, wanneer je bekend met het schrijven van bugreports: https://core.trac.wordpress.org/\n" +"\n" +"Bedankt. -- Het WordPress team" + +#: wp-admin/includes/revision.php:240 wp-admin/includes/revision.php:283 +msgid "M j, Y @ H:i" +msgstr "j F Y H:i" + +#: wp-admin/comment.php:212 +msgid "Submitted on" +msgstr "Geschreven op" + +#. translators: Column name or table row header. +#: wp-admin/includes/class-wp-comments-list-table.php:466 +#: wp-admin/comment.php:186 +msgid "In response to" +msgstr "In reactie op" + +#. translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. +#: wp-admin/includes/template.php:833 wp-admin/js/comment.js:89 +#: wp-admin/js/post.js:783 +msgid "%1$s %2$s, %3$s at %4$s:%5$s" +msgstr "%1$s %2$s, %3$s om %4$s:%5$s" + +#. translators: Localized Support reference. +#: wp-admin/includes/class-wp-site-health.php:1402 +msgid "https://wordpress.org/support" +msgstr "https://nl.wordpress.org/support" + +#: wp-admin/user-edit.php:682 +msgid "You are only logged in at this location." +msgstr "Je bent alleen ingelogd op deze locatie." + +#: wp-admin/includes/plugin-install.php:402 +msgid "These suggestions are based on the plugins you and other users have installed." +msgstr "Deze suggesties zijn gebaseerd op de plugins die jij en andere gebruikers hebben geïnstalleerd." + +#: wp-admin/edit-form-advanced.php:297 +msgid "You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options." +msgstr "Je kunt de afleidingsvrije schrijfmodus inschakelen met het pictogram aan de rechterkant. Deze functie is niet beschikbaar voor oude browsers of apparaten met kleine schermen en vereist dat de editor op volledige hoogte is ingeschakeld in de Schermopties." + +#: wp-admin/user-edit.php:700 +msgid "Log Out Everywhere" +msgstr "Overal uitloggen" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:111 +msgctxt "Plugin Installer" +msgid "Recommended" +msgstr "Aanbevolen" + +#. translators: New site notification email. 1: New site URL, 2: User login, 3: +#. User password or password reset link, 4: Login URL. +#: wp-admin/includes/upgrade.php:610 +msgid "" +"Your new WordPress site has been successfully set up at:\n" +"\n" +"%1$s\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"\n" +"Username: %2$s\n" +"Password: %3$s\n" +"Log in here: %4$s\n" +"\n" +"We hope you enjoy your new site. Thanks!\n" +"\n" +"--The WordPress Team\n" +"https://wordpress.org/\n" +msgstr "" +"Je nieuwe WordPress site is geïnstalleerd op:\n" +"\n" +"%1$s\n" +"\n" +"Je kunt als beheerder inloggen met de volgende gegevens:\n" +"\n" +"Gebruikersnaam: %2$s\n" +"Wachtwoord: %3$s\n" +"Inloggen kan hier: %4$s\n" +"\n" +"We hopen dat je veel plezier hebt van je nieuwe site. Bedankt.\n" +"\n" +"-- Het WordPress team\n" +"https://nl.wordpress.org/\n" + +#: wp-admin/themes.php:280 +msgid "You cannot delete a theme while it has an active child theme." +msgstr "Je kunt een thema niet verwijderen als deze een actief subthema heeft." + +#: wp-admin/options-general.php:34 wp-admin/network/settings.php:55 +msgid "You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable)." +msgstr "Je kunt de taal instellen, waarna de vertaalbestanden automatisch gedownload en geïnstalleerd worden (beschikbaar als je bestandssysteem beschrijfbaar is)." + +#: wp-admin/options-discussion.php:275 +msgid "Mystery Person" +msgstr "Mysterieus persoon" + +#: wp-admin/install.php:127 +msgid "Usernames can have only alphanumeric characters, spaces, underscores, hyphens, periods, and the @ symbol." +msgstr "Gebruikersnamen mogen alleen alfanumerieke karakters, spaties, underscores, koppeltekens, punten en het @ symbool bevatten." + +#: wp-admin/includes/class-wp-screen.php:1004 +msgid "Enable full-height editor and distraction-free functionality." +msgstr "Editor op volledige hoogte en afleidingsvrij functionaliteit inschakelen." + +#: wp-admin/includes/dashboard.php:1488 +msgid "https://planet.wordpress.org/feed/" +msgstr "https://nl.wordpress.org/feed/" + +#: wp-admin/includes/dashboard.php:1479 wp-admin/index.php:96 +msgid "https://planet.wordpress.org/" +msgstr "https://nl.wordpress.org/" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:762 +msgid "Untested with your version of WordPress" +msgstr "Niet getest met jouw WordPress versie" + +#: wp-admin/includes/class-wp-links-list-table.php:117 +#: wp-admin/includes/class-wp-posts-list-table.php:459 +msgid "Filter by category" +msgstr "Op categorie filteren" + +#: wp-admin/includes/meta-boxes.php:1118 +msgid "All categories" +msgstr "Alle categorieën " + +#: wp-admin/includes/class-wp-comments-list-table.php:499 +msgid "Filter by comment type" +msgstr "Op reactietype filteren" + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:3852 +msgid "%s has been logged out." +msgstr "%s is uitgelogd." + +#: wp-admin/includes/ajax-actions.php:3848 +msgid "You are now logged out everywhere else." +msgstr "Je bent nu op alle andere plekken uitgelogd." + +#: wp-admin/includes/ajax-actions.php:3839 +msgid "Could not log out user sessions. Please try again." +msgstr "Kon gebruikersessies niet uitloggen. Probeer het opnieuw." + +#: wp-admin/includes/ajax-actions.php:3726 +msgid "This preview is unavailable in the editor." +msgstr "Dit voorbeeld is niet beschikbaar in de editor." + +#: wp-admin/edit-form-advanced.php:296 +msgid "You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode." +msgstr "Je kan mediabestanden invoegen door op de knop boven de bericht-editor te klikken en de instructies te volgen. Je kan afbeeldingen uitlijnen of bewerken door de toolbar voor opmaak te gebruiken in de visuele mode." + +#: wp-admin/edit-form-advanced.php:293 +msgid "Post editor — Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab." +msgstr "Bericht editor - Voer hier de tekst in van het bericht. Er zijn twee modi voor bewerken: WYSIWYG en tekst. Kies de modus door de desbetreffende tab te selecteren." + +#. translators: %s: URL to header image configuration in Customizer. +#: wp-admin/includes/class-custom-image-header.php:483 +msgid "You can now manage and live-preview Custom Header in the Customizer." +msgstr "Je kunt nu aangepaste headers beheren en live een voorbeeld bekijken in de Customizer." + +#. translators: %s: URL to background image configuration in Customizer. +#: wp-admin/includes/class-custom-background.php:234 +msgid "You can now manage and live-preview Custom Backgrounds in the Customizer." +msgstr "Je kunt nu aangepaste achtergronden beheren en live een voorbeeld bekijken in de Customizer." + +#: wp-admin/includes/class-wp-screen.php:1137 +msgctxt "Welcome panel" +msgid "Welcome" +msgstr "Welkom" + +#. translators: %s: Number of users. +#. translators: Number of users. +#: wp-admin/includes/class-wp-users-list-table.php:203 +#: wp-admin/includes/class-wp-ms-users-list-table.php:148 +msgctxt "users" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alle (%s)" +msgstr[1] "Alle (%s)" + +#: wp-admin/includes/class-wp-links-list-table.php:133 +#: wp-admin/edit-link-form.php:114 +msgctxt "link name" +msgid "Name" +msgstr "Naam" + +#. translators: %s: Placeholder that must come at the start of the URL. +#: wp-admin/options-permalink.php:334 +msgid "If you like, you may enter custom structures for your category and tag URLs here. For example, using topics as your category base would make your category links like %s/topics/uncategorized/. If you leave these blank the defaults will be used." +msgstr "Als je wilt kun je aangepaste structuren maken voor je categorie en tag-URL's. Onderwerpen als categoriebasis levert bijvoorbeeld categorielinks op als %s/onderwerpen/geencategorie/. Als je deze leeg laat, worden de standaardwaardes gebruikt." + +#: wp-admin/credits.php:152 +msgid "Release Lead" +msgstr "Release-manager" + +#: wp-admin/upload.php:68 +msgid "Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly." +msgstr "Gebruik de pijltjesknoppen bovenin het dialoogvenster of de linker en rechter pijltjesknop op je toetsenbord om eenvoudig door de media-onderdelen te bladeren." + +#: wp-admin/upload.php:69 +msgid "You can also delete individual items and access the extended edit screen from the details dialog." +msgstr "Het is ook mogelijk individuele items te verwijderen en om het uitgebreide bewerkingsscherm te benaderen vanuit het detail dialoogvenster." + +#: wp-admin/upload.php:67 +msgid "Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved." +msgstr "Klikken op een item toont het bijlage-detail-dialoogvenster. Dit geeft de mogelijkheid om een voorbeeld te bekijken en snelle bewerkingen te doen. Elke wijziging aan de bijlagedetails wordt automatisch opgeslagen." + +#: wp-admin/upload.php:58 +msgid "To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media." +msgstr "Om media-onderdelen te verwijderen klik je op de bulk selectieknop bovenin het scherm. Media-items selecteren die je wilt verwijderen en klik daarna op de Geselecteerde items verwijderen knop. Klikken op de Selectie annuleren knop om terug te keren naar het bekijken van je media." + +#: wp-admin/upload.php:57 wp-admin/upload.php:230 +msgid "You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media." +msgstr "Je kunt je media bekijken in een eenvoudig visueel raster of een lijst met kolommen. Schakel tussen deze weergaven met de pictogrammen links boven de media." + +#: wp-admin/upload.php:56 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first." +msgstr "Alle bestanden die je hebt geüpload bevinden zich in de mediabibliotheek, met de laatste uploads als eerste getoond." + +#: wp-admin/plugin-install.php:101 +msgid "If you just want to get an idea of what’s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly." +msgstr "Als je een overzicht wilt krijgen van hetgeen er beschikbaar is, kun je bladeren door Uitgelichte en Populaire plugins. Klik hiervoor op de links boven de plugins lijst. De rubrieken wisselen regelmatig." + +#: wp-admin/plugin-install.php:139 +msgid "Browse Plugins" +msgstr "Door plugins bladeren" + +#: wp-admin/plugin-install.php:50 +msgid "Add Plugins" +msgstr "Plugins toevoegen" + +#. translators: 1: WPLANG, 2: wp-config.php +#: wp-admin/options-general.php:191 +msgid "The %1$s constant in your %2$s file is no longer needed." +msgstr "De %1$s constante in je %2$s bestand is niet langer nodig." + +#: wp-admin/includes/translation-install.php:24 +msgid "Invalid translation type." +msgstr "Ongeldig vertaaltype." + +#: wp-admin/install.php:358 +msgid "Welcome to the famous five-minute WordPress installation process! Just fill in the information below and you’ll be on your way to using the most extendable and powerful personal publishing platform in the world." +msgstr "Welkom bij het bekende vijf minuten installatieproces van WordPress. Vul gewoon de informatie hieronder in en je bent klaar om het meeste krachtige en uitbreidbare publicatieplatform van de wereld te gebruiken." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:766 +msgid "Compatible with your version of WordPress" +msgstr "Compatibel met je huidige versie van WordPress" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:764 +msgid "Incompatible with your version of WordPress" +msgstr "Niet ondersteund met je huidige versie van WordPress" + +#. translators: %s: Number of stars. +#: wp-admin/includes/plugin-install.php:759 +msgid "%d star" +msgid_plural "%d stars" +msgstr[0] "%d ster" +msgstr[1] "%d sterren" + +#: wp-admin/includes/class-wp-list-table.php:486 +msgid "Select bulk action" +msgstr "Bulkactie selecteren" + +#: wp-admin/user-new.php:453 wp-admin/user-new.php:620 +msgid "Add the user without sending an email that requires their confirmation." +msgstr "Gebruiker toevoegen zonder dat er een e-mail voor bevestiging wordt verstuurd." + +#. translators: %s: List view URL. +#: wp-admin/upload.php:102 +msgid "The grid view for the Media Library requires JavaScript. Switch to the list view." +msgstr "De raster weergave voor de mediabibliotheek vereist JavaScript. Naar lijst weergave omschakelen." + +#: wp-admin/includes/plugin-install.php:773 +msgid "Contributors" +msgstr "Contributors" + +#: wp-admin/includes/plugin-install.php:704 +#: wp-admin/includes/plugin-install.php:791 +msgid "Donate to this plugin »" +msgstr "Doneren aan deze plugin »" + +#: wp-admin/includes/plugin-install.php:574 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Beoordelingen" + +#. translators: %s: Support email address. +#: wp-admin/includes/class-wp-automatic-updater.php:797 +msgid "The WordPress team is willing to help you. Forward this email to %s and the team will work with you to make sure your site is working." +msgstr "Het WordPress team is bereid je te helpen. Stuur deze e-mail door naar %s en het team zal met je samenwerken om ervoor te zorgen dat je site werkt." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:67 +msgctxt "themes" +msgid "Recently Updated" +msgstr "Recent bijgewerkt" + +#: wp-admin/includes/class-wp-terms-list-table.php:195 +msgctxt "Number/count of items" +msgid "Count" +msgstr "Aantal" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1046 +msgid "View details" +msgstr "Details bekijken" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:624 +msgid "More Details" +msgstr "Meer details" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:467 +msgctxt "Plugin installer group title" +msgid "Tools" +msgstr "Gereedschappen" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:466 +msgctxt "Plugin installer group title" +msgid "Social" +msgstr "Sociaal" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:465 +msgctxt "Plugin installer group title" +msgid "Performance" +msgstr "Performance" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:106 +msgctxt "Plugin Installer" +msgid "Beta Testing" +msgstr "Beta testen" + +#. translators: %s: URL that could not be embedded. +#: wp-admin/includes/ajax-actions.php:3692 +msgid "%s failed to embed." +msgstr "Insluiten van %s mislukt." + +#: wp-admin/includes/class-wp-automatic-updater.php:812 +msgid "If you reach out to us, we'll also ensure you'll never have this problem again." +msgstr "Als je contact met ons opneemt, zorgen we er ook voor dat je dit probleem nooit meer zult hebben." + +#: wp-admin/theme-install.php:235 +msgid "Filtering by:" +msgstr "Gefilterd op:" + +#: wp-admin/includes/media.php:3253 +msgid "Displayed on attachment pages." +msgstr "Weergeven op bijlage pagina's." + +#: wp-admin/includes/image-edit.php:214 +msgid "You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image." +msgstr "Je kunt de afbeelding bewerken voor de thumbnail. Je kunt bijvoorbeeld een vierkante thumbnail hebben die een gedeelte van de afbeelding toont." + +#: wp-admin/includes/image-edit.php:176 +msgid "Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings." +msgstr "Nadat je een selectie hebt gemaakt kun je dit aanpassen door het aantal pixels op te geven. De minimale afmeting hiervoor is de thumbnailgrootte zoals die gedefinieerd is in de Media-instellingen." + +#: wp-admin/includes/image-edit.php:173 +msgid "The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc." +msgstr "De aspect ratio is de relatie tussen de breedte en de hoogte. Je kunt de aspect ratio bewaren door op de shift toets te drukken terwijl je de selectie schaalt. Gebruik de input box om de aspect ratio te specificeren. Bijv: 1:1 (vierkant), 4:3, 16:9, etc." + +#: wp-admin/includes/image-edit.php:170 +msgid "To crop the image, click on it and drag to make your selection." +msgstr "Om de afbeelding bij te snijden klik je erop en maak je selectie." + +#: wp-admin/includes/image-edit.php:108 +msgid "You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up." +msgstr "Je kunt de oorspronkelijke afbeelding proportioneel schalen. Om de beste resultaten te krijgen moet je eerst schalen voordat je bijsnijdt, spiegelt of roteert. Afbeeldingen kunnen enkel kleiner geschaald worden, niet groter." + +#. translators: %s: Alt + F10 +#: wp-admin/edit-form-advanced.php:300 +msgid "Keyboard users: When you’re working in the visual editor, you can use %s to access the toolbar." +msgstr "Toetsenbord gebruikers: Wanneer je in de visuele editor werkt kun je %s gebruiken om de toolbar te bedienen." + +#: wp-admin/edit-comments.php:183 +msgid "A red bar on the left means the comment is waiting for you to moderate it." +msgstr "Een rode balk aan de linkerzijde geeft aan dat een reactie wacht op moderatie." + +#: wp-admin/includes/class-wp-comments-list-table.php:503 +msgid "All comment types" +msgstr "Alle reactietypen" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:66 +#: wp-admin/theme-install.php:178 +msgctxt "themes" +msgid "Latest" +msgstr "Nieuwste" + +#: wp-admin/theme-install.php:177 +msgctxt "themes" +msgid "Popular" +msgstr "Populair" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:64 +#: wp-admin/theme-install.php:176 +msgctxt "themes" +msgid "Featured" +msgstr "Uitgelicht" + +#: wp-admin/includes/ms.php:957 wp-admin/users.php:320 +msgid "Attribute all content to:" +msgstr "Alle inhoud koppelen aan:" + +#: wp-admin/includes/ms.php:955 wp-admin/users.php:317 +msgid "Delete all content." +msgstr "Alle inhoud verwijderen." + +#: wp-admin/users.php:311 +msgid "What should be done with content owned by this user?" +msgstr "Wat moet er gebeuren met inhoud die van deze gebruiker is?" + +#: wp-admin/users.php:58 +msgid "Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using bulk actions." +msgstr "Verwijderen brengt je naar het 'Gebruikers verwijderen' scherm, waar je gebruikers en hun inhoud permanent van je site kunt verwijderen. Je kunt ook meerdere gebruikers tegelijk verwijderen door bulkacties te gebruiken." + +#: wp-admin/users.php:56 +msgid "Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using bulk actions." +msgstr "Verwijderen laat je een gebruiker verwijderen van je site. Dit verwijdert niet hun inhoud. Je kunt ook meerdere gebruikers tegelijk verwijderen door gebruik te maken van bulkacties." + +#: wp-admin/theme-install.php:334 +msgctxt "theme" +msgid "Details & Preview" +msgstr "Details & voorbeeld" + +#: wp-admin/theme-install.php:57 +msgid "Search themes..." +msgstr "Thema's doorzoeken..." + +#: wp-admin/theme-install.php:56 +msgid "Search Themes" +msgstr "Thema's zoeken" + +#: wp-admin/theme-install.php:24 +msgid "Add Themes" +msgstr "Thema's toevoegen" + +#: wp-admin/maint/repair.php:147 +msgid "https://wordpress.org/support/forum/how-to-and-troubleshooting" +msgstr "https://wordpress.org/support/forum/how-to-and-troubleshooting" + +#: wp-admin/index.php:84 +msgid "At a Glance — Displays a summary of the content on your site and identifies which theme and version of WordPress you are using." +msgstr "In een oogopslag — Toont een samenvatting van de inhoud op je site en identificeert welk thema en versie van WordPress je gebruikt." + +#: wp-admin/index.php:63 +msgid "Box Controls — Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a “Configure” link in the title bar if you hover over it." +msgstr "Boxopties - Klik op de titelbalk van een box om deze in- of uit te vouwen. Sommige (door plugins) toegevoegde boxen hebben instelbare inhoud, deze kun je aanpassen door in de titel van de box boven de titel te hoveren en op “Configureren” te klikken." + +#: wp-admin/themes.php:43 +msgid "Sorry, you are not allowed to resume this theme." +msgstr "Je hebt geen toestemming om dit thema te hervatten." + +#: wp-admin/includes/meta-boxes.php:272 wp-admin/edit-form-comment.php:139 +msgid "Edit date and time" +msgstr "Datum en tijd bewerken" + +#: wp-admin/includes/meta-boxes.php:259 +msgid "Browse revisions" +msgstr "Revisies tonen" + +#: wp-admin/includes/meta-boxes.php:186 +msgid "Edit visibility" +msgstr "Zichtbaarheid bewerken" + +#: wp-admin/includes/meta-boxes.php:134 +msgid "Edit status" +msgstr "Status bewerken" + +#: wp-admin/includes/dashboard.php:1952 +msgid "Manage menus" +msgstr "Menu's beheren" + +#: wp-admin/includes/dashboard.php:1949 +msgid "Manage widgets" +msgstr "Widgets beheren" + +#: wp-admin/credits.php:67 wp-admin/credits.php:82 +msgid "https://make.wordpress.org/" +msgstr "https://make.wordpress.org/" + +#: wp-admin/includes/ms.php:1159 wp-admin/network/user-new.php:30 +#: wp-admin/network/index.php:56 wp-admin/network/users.php:231 +#: wp-admin/network/site-new.php:33 wp-admin/network/sites.php:46 +msgid "Support Forums" +msgstr "NL supportforums" + +#. translators: %s: https://wordpress.org +#: wp-admin/admin-footer.php:37 +msgid "Thank you for creating with WordPress." +msgstr "Bedankt voor het gebruiken van WordPress." + +#: wp-admin/themes.php:232 +msgid "Search installed themes..." +msgstr "Geïnstalleerde thema's doorzoeken..." + +#: wp-admin/update-core.php:939 +msgid "Translations — The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can click the “Update Translations” button." +msgstr "Vertalingen — De bestanden die ervoor zorgen om WordPress in je eigen taal te tonen worden bijgewerkt zodra er een nieuwe versie van uitkomt. Wanneer de bestanden verouderd zijn, kun je op de Vertaling bijwerken knop klikken." + +#: wp-admin/update-core.php:935 +msgid "In most cases, WordPress will automatically apply maintenance and security updates in the background for you." +msgstr "In de meeste gevallen zal WordPress zich automatisch bijwerken naar de laatste onderhoud- of beveiligingsupdate op de achtergrond." + +#: wp-admin/update-core.php:935 +msgid "WordPress — Updating your WordPress installation is a simple one-click procedure: just click on the “Update Now” button when you are notified that a new version is available." +msgstr "WordPress — Het updaten van je WordPress installatie is een simpele één-klik procedure: gewoon klikken op de “Update nu”knop wanneer je een bericht krijgt dat er een nieuwe versie beschikbaar is." + +#: wp-admin/update-core.php:925 +msgid "If an update is available, you᾿ll see a notification appear in the Toolbar and navigation menu." +msgstr "Zodra er een update beschikbaar is wordt deze getoond in een melding in de toolbar en navigatiemenu." + +#: wp-admin/update-core.php:936 +msgid "Themes and Plugins — To update individual themes or plugins from this screen, use the checkboxes to make your selection, then click on the appropriate “Update” button. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button." +msgstr "Thema's en plugins — Om afzonderlijke thema's en plugins vanaf dit scherm bij te werken, gebruik je de selectievakjes om je selectie te maken, vervolgens klik je op de juiste “Bijwerken” knop. Om alle thema's of plugins in één keer bij te werken, kun je om alles te selecteren de box bovenaan de sectie aanvinken alvorens op de bijwerken knop te klikken." + +#: wp-admin/update-core.php:924 +msgid "On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories." +msgstr "Via dit scherm kun je WordPress bijwerken naar de laatste versie. Ook kun je je thema's, plugins en vertalingen updaten vanuit de WordPress.org directories." + +#. translators: %s: https://wordpress.org/themes +#: wp-admin/themes.php:155 +msgid "If you would like to see more themes to choose from, click on the “Add New” button and you will be able to browse or search for additional themes from the WordPress Theme Directory. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "Als je meer thema's wilt zien om uit te kiezen, klik op de “Nieuwe toevoegen” knop en je kunt bladeren of zoeken naar extra thema's uit de WordPress Thema Directory. Thema's in de WordPress Thema Directory zijn ontworpen en ontwikkeld door andere partijen en ze vallen onder de licentie die WordPress gebruikt. Oh en ze zijn gratis!" + +#. translators: 1: Number of megabytes, 2: Percentage. +#: wp-admin/includes/dashboard.php:1582 +msgid "%1$s MB (%2$s%%) Space Used" +msgstr "%1$s MB (%2$s%%) ruimte in gebruik" + +#. translators: %s: Number of megabytes. +#: wp-admin/includes/dashboard.php:1568 +msgid "%s MB Space Allowed" +msgstr "%s MB Toegestane ruimte" + +#. translators: Date and time format for recent posts on the dashboard, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/dashboard.php:982 +msgid "M jS" +msgstr "j M" + +#. translators: %s: Number of pages. +#: wp-admin/includes/dashboard.php:300 +msgid "%s Page" +msgid_plural "%s Pages" +msgstr[0] "%s pagina" +msgstr[1] "%s pagina's" + +#. translators: %s: Number of posts. +#: wp-admin/includes/dashboard.php:297 +msgid "%s Post" +msgid_plural "%s Posts" +msgstr[0] "%s bericht" +msgstr[1] "%s berichten" + +#: wp-admin/options-reading.php:46 +msgid "When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search engines discouraged”, to remind you that you have directed search engines to not crawl your site." +msgstr "Als deze instelling actief is, wordt er een herinnering getoond in de In een Oogopslag box van het dashboard dat zegt, “Zoekmachines ontmoedigd,”, om je te helpen herinneren dat je hebt aangegeven dat zoekmachines je site niet mogen crawlen." + +#: wp-admin/includes/dashboard.php:61 +msgid "At a Glance" +msgstr "In een oogopslag" + +#: wp-admin/themes.php:526 wp-admin/themes.php:873 +msgctxt "theme" +msgid "Active:" +msgstr "Actief:" + +#: wp-admin/includes/theme.php:303 +msgid "Accessibility Ready" +msgstr "Toegankelijkheid voorbereid" + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:916 wp-admin/themes.php:1081 +msgid "This is a child theme of %s." +msgstr "Dit is een subthema van %s." + +#: wp-admin/themes.php:174 +msgid "When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again." +msgstr "Bij gebruik op een kleinere monitor kun je op het 'inklappen' pictogram links onderin klikken. Dit verbergt het paneel en geeft je meer ruimte om een voorbeeld te bekijken van je site met een nieuw thema. Om het paneel weer te tonen klik je wederom op het 'inklappen' pictogram." + +#: wp-admin/themes.php:173 +msgid "The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Publish & Activate button above the menu." +msgstr "De voorvertoning van het thema is volledig interactief — navigeer naar verschillende pagina's om te zien hoe het thema omgaat met berichten, archieven en andere pagina templates. De instellingen kunnen per thema verschillend zijn op basis van wat het voorvertoonde thema ondersteunt. Om de nieuwe instellingen op te slaan en het thema te activeren klik je op de Publiceer & activeer knop boven het menu." + +#: wp-admin/themes.php:172 +msgid "Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way." +msgstr "Tik of hover over een thema en klik dan op de Live voorbeeld knop om een live voorbeeld te zien van dat thema en thema opties te wijzigen, in een aparte weergave op volledig scherm. Je kunt ook een Live voorbeeld knop onderaan het thema detailscherm vinden. Elk geïnstalleerd thema kan op deze manier bekeken en aangepast worden." + +#: wp-admin/themes.php:136 +msgid "The current theme is displayed highlighted as the first theme." +msgstr "Het huidige thema wordt uitgelicht getoond als eerste thema." + +#: wp-admin/themes.php:135 +msgid "Click Customize for the current theme or Live Preview for any other theme to see a live preview" +msgstr "Op de Customizer klikken voor het huidige thema of op voorbeeld voor elk ander thema om een daadwerkelijk voorbeeld te tonen" + +#: wp-admin/themes.php:134 +msgid "Click on the theme to see the theme name, version, author, description, tags, and the Delete link" +msgstr "Op het thema klikken om de themanaam, versie, auteur, beschrijving tags en verwijder-link te zien." + +#: wp-admin/themes.php:133 +msgid "Hover or tap to see Activate and Live Preview buttons" +msgstr "Ga er met de muis overheen of druk op het scherm om de Activeren en Live Preview knoppen te zien" + +#: wp-admin/themes.php:131 +msgid "This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties." +msgstr "Dit scherm wordt gebruikt om je geïnstalleerde thema's te beheren. Anders dan de standaard thema's die geleverd worden bij je WordPress installatie, worden de thema's ontworpen en ontwikkeld door andere partijen." + +#: wp-admin/widgets.php:449 +msgid "To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back." +msgstr "Om een widget te activeren sleep het naar een zijbalk en klik erop. Om een widget te deactiveren en de instellingen te verwijderen sleep het terug." + +#. translators: %s: The rating. +#: wp-admin/includes/template.php:2645 +msgid "%s rating" +msgstr "%s waardering" + +#. translators: 1: The rating, 2: The number of ratings. +#: wp-admin/includes/template.php:2641 +msgid "%1$s rating based on %2$s rating" +msgid_plural "%1$s rating based on %2$s ratings" +msgstr[0] "%1$s waardering gebaseerd op %2$s waardering" +msgstr[1] "%1$s waardering gebaseerd op %2$s waarderingen" + +#: wp-admin/my-sites.php:45 +msgid "This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the front end or the dashboard for that site." +msgstr "Dit scherm toont een individuele gebruiker alle sites in zijn netwerk en geeft de mogelijk om een primaire site te selecteren. De links onder de sites kunnen gebruikt worden om de site te bekijken of om het dashboard van die site te bezoeken." + +#. translators: 1: Error code, 2: Error message. +#: wp-admin/includes/class-wp-automatic-updater.php:1382 +msgid "Error: [%1$s] %2$s" +msgstr "Fout: [%1$s] %2$s" + +#. translators: 1: Error code, 2: Error message. +#: wp-admin/includes/class-wp-automatic-updater.php:1379 +msgid "Rollback Error: [%1$s] %2$s" +msgstr "Rollback fout: [%1$s] %2$s" + +#: wp-admin/includes/class-wp-automatic-updater.php:1308 +msgid "The following translations failed to update:" +msgstr "De volgende vertalingen konden niet bijgewerkt worden:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1307 +msgid "The following themes failed to update:" +msgstr "De volgende thema's konden niet bijgewerkt worden:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1306 +msgid "The following plugins failed to update:" +msgstr "De volgende plugins konden niet bijgewerkt worden:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1294 +msgid "The following translations were successfully updated:" +msgstr "De volgende vertalingen zijn bijgewerkt:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1293 +msgid "The following themes were successfully updated:" +msgstr "De volgende thema's zijn bijgewerkt:" + +#: wp-admin/includes/class-wp-automatic-updater.php:1292 +msgid "The following plugins were successfully updated:" +msgstr "De volgende plugins zijn bijgewerkt:" + +#: wp-admin/widgets.php:570 +msgid "Add Widget" +msgstr "Widget toevoegen" + +#: wp-admin/includes/theme.php:788 wp-admin/themes.php:910 +msgid "Show next theme" +msgstr "Volgende thema tonen" + +#: wp-admin/includes/theme.php:787 wp-admin/themes.php:909 +msgid "Show previous theme" +msgstr "Vorige thema tonen" + +#: wp-admin/includes/theme.php:837 wp-admin/themes.php:997 +msgid "Update Available" +msgstr "Nieuwe versie beschikbaar" + +#: wp-admin/themes.php:230 wp-admin/theme-install.php:55 +msgid "Add New Theme" +msgstr "Nieuw thema toevoegen" + +#: wp-admin/themes.php:226 +msgid "" +"Are you sure you want to delete this theme?\n" +"\n" +"Click 'Cancel' to go back, 'OK' to confirm the delete." +msgstr "" +"Weet je zeker dat je dit thema wilt verwijderen?\n" +"\n" +"Klik op 'Annuleren' om terug te gaan, 'OK' om te verwijderen." + +#: wp-admin/post.php:82 +msgid "Unable to submit this form, please refresh and try again." +msgstr "Niet mogelijk om dit formulier te versturen. Vernieuw het scherm en probeer opnieuw." + +#: wp-admin/index.php:90 +msgid "Quick Draft — Allows you to create a new post and save it as a draft. Also displays links to the 3 most recent draft posts you've started." +msgstr "Snel concept — Hiermee kan je een nieuw bericht maken en deze opslaan als concept. Ook toont het een overzicht van de 3 meest recente concepten die je gestart bent." + +#: wp-admin/index.php:87 +msgid "Activity — Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them." +msgstr "Activiteit — Toont de komende ingeplande berichten, recent gepubliceerde berichten en de meest recente reacties op je berichten en stelt je in staat om deze te modereren." + +#: wp-admin/index.php:61 +msgid "Screen Options — Use the Screen Options tab to choose which Dashboard boxes to show." +msgstr "Schermopties — Gebruik de Schermopties tab om te kiezen welke Dashboard boxen te tonen." + +#: wp-admin/includes/dashboard.php:1575 wp-admin/includes/dashboard.php:1590 +msgid "Manage Uploads" +msgstr "Uploads beheren" + +#: wp-admin/includes/deprecated.php:1380 +msgid "Popular Plugin" +msgstr "Populaire plugin" + +#: wp-admin/includes/dashboard.php:976 +msgid "Tomorrow" +msgstr "Morgen" + +#: wp-admin/includes/dashboard.php:912 +msgid "No activity yet!" +msgstr "Nog geen activiteit!" + +#: wp-admin/includes/dashboard.php:903 +msgid "Recently Published" +msgstr "Recent gepubliceerd" + +#: wp-admin/includes/dashboard.php:894 +msgid "Publishing Soon" +msgstr "Binnenkort publiceren" + +#: wp-admin/includes/dashboard.php:558 +msgid "What’s on your mind?" +msgstr "Wat houdt je bezig?" + +#. translators: 1: Version number, 2: Theme name. +#: wp-admin/includes/update.php:357 +msgid "WordPress %1$s running %2$s theme." +msgstr "WordPress %1$s gebruikt thema: %2$s." + +#: wp-admin/includes/dashboard.php:75 +msgid "Quick Draft" +msgstr "Eenvoudig een concept maken" + +#: wp-admin/includes/dashboard.php:70 +msgid "Activity" +msgstr "Activiteit" + +#. translators: %s: Name of plugin / theme / translation. +#: wp-admin/includes/class-wp-automatic-updater.php:1315 +msgid "FAILED: %s" +msgstr "FOUT: %s" + +#. translators: %s: Name of plugin / theme / translation. +#: wp-admin/includes/class-wp-automatic-updater.php:1300 +msgid "SUCCESS: %s" +msgstr "SUCCES: %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:1278 +msgid "FAILED: WordPress failed to update to %s" +msgstr "FOUT: Bijwerken van WordPress naar %s is mislukt" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:1275 +msgid "SUCCESS: WordPress was successfully updated to %s" +msgstr "SUCCES: WordPress is bijgewerkt naar %s" + +#. translators: %s: Network home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:1268 +msgid "WordPress site: %s" +msgstr "WordPress site: %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:826 +msgid "Your site was running version %s." +msgstr "Je site draaide op versie %s." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:772 +msgid "Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s." +msgstr "Je site op %1$s liep tegen een kritieke fout aan toen WordPress probeerde te updaten naar versie %2$s." + +#. translators: %s: WordPress latest version. +#: wp-admin/includes/class-wp-automatic-updater.php:740 +msgid "WordPress %s is also now available." +msgstr "WordPress %s is nu ook beschikbaar." + +#: wp-admin/includes/update-core.php:945 wp-admin/includes/update-core.php:1092 +#: wp-admin/includes/update-core.php:1117 +#: wp-admin/includes/class-core-upgrader.php:160 +#: wp-admin/includes/class-wp-upgrader.php:165 +msgid "The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions." +msgstr "De update kon niet worden geïnstalleerd omdat we sommige bestanden niet konden kopiëren. Dit komt meestal door inconsistente bestandsrechten." + +#: wp-admin/includes/class-language-pack-upgrader.php:114 +#: wp-admin/update-core.php:756 +msgid "Your translations are all up to date." +msgstr "Alle vertalingen zijn bijgewerkt." + +#: wp-admin/update-core.php:755 wp-admin/update-core.php:763 +msgid "Translations" +msgstr "Vertalingen" + +#. translators: %s: Error code. +#: wp-admin/includes/class-wp-automatic-updater.php:845 +msgid "Error code: %s" +msgstr "Foutcode: %s" + +#: wp-admin/includes/class-wp-automatic-updater.php:828 +msgid "Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:" +msgstr "Je hostingprovider, vrijwilligers van het supportforum of een vriendelijke ontwikkelaar zullen deze informatie nodig hebben om je te helpen:" + +#: wp-admin/includes/class-wp-automatic-updater.php:827 +msgid "We have some data that describes the error your site encountered." +msgstr "We hebben wat data welke de foutmelding beschrijft die je site net tegen kwam." + +#: wp-admin/includes/class-wp-automatic-updater.php:821 +#: wp-admin/includes/class-wp-automatic-updater.php:1217 +msgid "The WordPress Team" +msgstr "Het WordPress team" + +#: wp-admin/includes/class-wp-automatic-updater.php:817 +msgid "You also have some plugins or themes with updates available. Update them now:" +msgstr "Je hebt enkele plugins of thema's die bijgewerkt kunnen worden. Werk ze nu bij:" + +#: wp-admin/includes/class-wp-automatic-updater.php:802 +#: wp-admin/includes/class-wp-automatic-updater.php:1215 +msgid "If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help." +msgstr "Indien je problemen ervaart of hulp nodig hebt; de vrijwilligers van de WordPress.org supportforums kunnen je waarschijnlijk helpen." + +#: wp-admin/includes/class-wp-automatic-updater.php:808 +#: wp-admin/update-core.php:925 +msgid "Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers." +msgstr "Je site up-to-date houden is belangrijk voor de veiligheid. Het maakt het internet daarmee ook een veiligere plek voor jou en je lezers." + +#: wp-admin/includes/class-wp-automatic-updater.php:787 +msgid "Please check out your site now. It's possible that everything is working. If it says you need to update, you should do so:" +msgstr "Controleer je site nu. Het is mogelijk dat alles goed werkt. Indien er aangegeven wordt dat je moet bijwerken dan zou je dat ook moeten doen:" + +#: wp-admin/includes/class-wp-automatic-updater.php:785 +msgid "This means your site may be offline or broken. Don't panic; this can be fixed." +msgstr "Dit betekent dat je site misschien offline is of kapot. Geen paniek nodig, want dit is op te lossen." + +#. translators: 1: Home URL, 2: WordPress latest version. +#: wp-admin/includes/class-wp-automatic-updater.php:779 +msgid "Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s." +msgstr "Je site op %1$s toonde een kritieke fout tijdens het updaten naar de laatste versie van WordPress, %2$s." + +#: wp-admin/includes/class-wp-automatic-updater.php:741 +#: wp-admin/includes/class-wp-automatic-updater.php:764 +msgid "Updating is easy and only takes a few moments:" +msgstr "Bijwerken van WordPress is makkelijk en het duurt maar eventjes:" + +#: wp-admin/includes/class-wp-automatic-updater.php:761 +msgid "We tried but were unable to update your site automatically." +msgstr "We hebben het geprobeerd, maar we konden je site niet automatisch bijwerken." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:751 +msgid "Please update your site at %1$s to WordPress %2$s." +msgstr "Je site op %1$s naar WordPress %2$s bijwerken." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:735 +msgid "For more on version %s, see the About WordPress screen:" +msgstr "Om meer te leren over versie %s, kijk je op het Over WordPress scherm:" + +#: wp-admin/includes/class-wp-automatic-updater.php:729 +msgid "No further action is needed on your part." +msgstr "Er is geen actie van jouw kant nodig." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:723 +msgid "Howdy! Your site at %1$s has been updated automatically to WordPress %2$s." +msgstr "Je site op %1$s is automatisch geüpdatet naar WordPress %2$s." + +#. translators: Site down notification email subject. 1: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:706 +msgid "[%1$s] URGENT: Your site may be down due to a failed update" +msgstr "[%1$s] URGENT: Je site is wellicht offline door een mislukte update" + +#. translators: Update available notification email subject. 1: Site title, 2: +#. WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:701 +msgid "[%1$s] WordPress %2$s is available. Please update!" +msgstr "[%1$s] WordPress %2$s is beschikbaar. Graag bijwerken." + +#. translators: Site updated notification email subject. 1: Site title, 2: +#. WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:695 +msgid "[%1$s] Your site has updated to WordPress %2$s" +msgstr "[%1$s] Je site is bijgewerkt naar WordPress %2$s" + +#. translators: %s: Project name (plugin, theme, or WordPress). +#: wp-admin/includes/class-wp-automatic-updater.php:374 +msgid "Translations for %s" +msgstr "Vertalingen voor %s" + +#. translators: 1: Project name (plugin, theme, or WordPress), 2: Language. +#: wp-admin/includes/class-wp-automatic-updater.php:376 +#: wp-admin/includes/class-language-pack-upgrader-skin.php:51 +msgid "Updating translations for %1$s (%2$s)…" +msgstr "Vertalingen updaten voor %1$s (%2$s)…" + +#: wp-admin/includes/class-language-pack-upgrader-skin.php:31 +#: wp-admin/update-core.php:767 wp-admin/update-core.php:1175 +msgid "Update Translations" +msgstr "Update vertalingen" + +#: wp-admin/includes/class-wp-site-health.php:2226 +msgid "Background updates" +msgstr "Achtergrond updates" + +#: wp-admin/includes/update-core.php:1158 +msgid "There is not enough free disk space to complete the update." +msgstr "Er is onvoldoende schijfruimte om het bijwerken te voltooien." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-automatic-updater.php:369 +msgid "Updating plugin: %s" +msgstr "Bijwerken plugin: %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-automatic-updater.php:357 +msgid "Updating theme: %s" +msgstr "Bijwerken thema: %s" + +#: wp-admin/includes/class-language-pack-upgrader.php:120 +msgid "Translation updated successfully." +msgstr "Vertaling is succesvol geüpdatet." + +#: wp-admin/includes/class-language-pack-upgrader.php:119 +msgid "Translation update failed." +msgstr "Vertaling bijwerken is mislukt." + +#: wp-admin/includes/class-language-pack-upgrader.php:113 +msgid "Some of your translations need updating. Sit tight for a few more seconds while we update them as well." +msgstr "Enkele vertalingen moeten bijgewerkt worden. Wacht enkele seconden terwijl we deze ook bijwerken." + +#: wp-admin/user-new.php:482 +msgid "Create a brand new user and add them to this site." +msgstr "Nieuwe gebruiker aanmaken en koppelen aan deze site." + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/theme-editor.php:42 +msgid "Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead." +msgstr "Bijwerken naar een nieuwere versie van hetzelfde thema zal de wijzigingen hier gemaakt overschrijven. Om dit te voorkomen, overweeg een subthema te maken." + +#: wp-admin/options-media.php:52 +msgid "The sizes listed below determine the maximum dimensions in pixels to use when adding an image to the Media Library." +msgstr "De aangegeven waardes hieronder geven de maximale afmetingen aan in pixels die worden gebruikt om afbeeldingen aan de mediabibliotheek toe te voegen." + +#: wp-admin/options-discussion.php:182 +msgid "Comment must be manually approved" +msgstr "Reactie moet handmatig worden goedgekeurd" + +#: wp-admin/nav-menus.php:628 +msgid "Clicking the arrow to the right of any menu item in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab." +msgstr "Een klik op de pijl rechts naast het menu-item in de editor zal inzage geven in standaard groepsinstellingen. Extra instellingen zoals target link, CSS classes, link relaties en link beschrijvingen kunnen in- en uitgeschakeld worden via de schermopties tab." + +#. translators: 1: URL to Widgets screen, 2 and 3: The names of the default +#. themes. +#: wp-admin/nav-menus.php:597 +msgid "Menus can be displayed in locations defined by your theme, even used in sidebars by adding a “Navigation Menu” widget on the Widgets screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the Documentation link to the side." +msgstr "" +"Menu's kunnen weergegeven worden op locaties die aangegeven zijn door je thema. Ze kunnen zelfs toegevoegd worden aan zijbalken door een “Aangepast menu”-widget toe te voegen in het Widgets scherm.\n" +"Als je thema geen aangepaste menus ondersteunt (de standaard thema's %2$s en %3$s doen dit wel), kun je dit toevoegen door de documentatie-link hiernaast te volgen." + +#. translators: %s: URL to Widgets screen. +#: wp-admin/nav-menus.php:588 +msgid "Your theme does not natively support menus, but you can use them in sidebars by adding a “Navigation Menu” widget on the Widgets screen." +msgstr "Je thema biedt geen ondersteuning voor menu's, maar je kunt ze gebruiken in de zijbalken door een “Aangepast menu”-widget toe te voegen op het Widgets scherm." + +#: wp-admin/install.php:408 +msgid "Sorry, that isn’t a valid email address. Email addresses look like username@example.com." +msgstr "Dit is geen geldig e-mailadres. E-mailadressen zien er als volgt uit: gebruikersnaam@voorbeeld.nl." + +#: wp-admin/install.php:404 +msgid "You must provide an email address." +msgstr "Je moet een e-mailadres opgeven." + +#: wp-admin/install.php:400 +msgid "Your passwords do not match. Please try again." +msgstr "Je wachtwoorden komen niet overeen. Probeer het opnieuw." + +#: wp-admin/install.php:396 +msgid "The username you provided has invalid characters." +msgstr "De opgegeven gebruikersnaam bevat ongeldige tekens." + +#: wp-admin/install.php:393 +msgid "Please provide a valid username." +msgstr "Voer een geldige gebruikersnaam in." + +#: wp-admin/includes/update-core.php:1106 +msgid "Copying the required files…" +msgstr "Vereiste bestanden kopiëren…" + +#: wp-admin/includes/update-core.php:1036 +msgid "Preparing to install the latest version…" +msgstr "Voorbereidingen gestart om installatie te starten naar de laatste versie…" + +#: wp-admin/includes/file.php:2219 +msgid "This password will not be stored on the server." +msgstr "Het wachtwoord wordt niet opgeslagen op de server." + +#. translators: 1: File checksum, 2: Expected checksum value. +#: wp-admin/includes/file.php:1211 +msgid "The checksum of the file (%1$s) does not match the expected checksum value (%2$s)." +msgstr "De checksum van de bestanden (%1$s) komt niet overeen met de verwachte checksum waarde (%2$s)." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:345 +msgid "WordPress %s" +msgstr "WordPress %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:343 +msgid "Updating to WordPress %s" +msgstr "Bijwerken naar WordPress %s" + +#: wp-admin/includes/class-core-upgrader.php:38 +msgid "Due to an error during updating, WordPress has rolled back to your previous version." +msgstr "Vanwege een fout tijdens het bijwerken, heeft WordPress de vorige versie hersteld." + +#: wp-admin/includes/class-core-upgrader.php:37 +msgid "Attempting to roll back to previous version." +msgstr "Poging wordt ondernomen om installatie terug te draaien naar de vorige versie." + +#. translators: 1: Folder to locate, 2: Folder to start searching from. +#: wp-admin/includes/class-wp-filesystem-base.php:266 +msgid "Looking for %1$s in %2$s" +msgstr "Zoeken naar %1$s in %2$s" + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:364 +msgid "%s page restored from the Trash." +msgid_plural "%s pages restored from the Trash." +msgstr[0] "%s pagina hersteld uit de prullenbak." +msgstr[1] "%s pagina's hersteld uit de prullenbak." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:362 +msgid "%s page moved to the Trash." +msgid_plural "%s pages moved to the Trash." +msgstr[0] "%s pagina verplaatst naar de prullenbak." +msgstr[1] "%s pagina's verplaatst naar de prullenbak." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:360 +msgid "%s page permanently deleted." +msgid_plural "%s pages permanently deleted." +msgstr[0] "%s pagina permanent verwijderd." +msgstr[1] "%s pagina's permanent verwijderd." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:358 +msgid "%s page not updated, somebody is editing it." +msgid_plural "%s pages not updated, somebody is editing them." +msgstr[0] "%s pagina niet bijgewerkt, iemand is aan het bewerken." +msgstr[1] "%s pagina's niet bijgewerkt, iemand is ze aan het bewerken." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:355 +msgid "%s page updated." +msgid_plural "%s pages updated." +msgstr[0] "%s pagina bijgewerkt." +msgstr[1] "%s pagina's bijgewerkt." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:351 +msgid "%s post restored from the Trash." +msgid_plural "%s posts restored from the Trash." +msgstr[0] "%s bericht hersteld uit de prullenbak." +msgstr[1] "%s berichten hersteld uit de prullenbak." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:349 +msgid "%s post moved to the Trash." +msgid_plural "%s posts moved to the Trash." +msgstr[0] "%s bericht verplaatst naar de prullenbak." +msgstr[1] "%s berichten verplaatst naar de prullenbak." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:347 +msgid "%s post permanently deleted." +msgid_plural "%s posts permanently deleted." +msgstr[0] "%s bericht permanent verwijderd." +msgstr[1] "%s berichten permanent verwijderd." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:345 +msgid "%s post not updated, somebody is editing it." +msgid_plural "%s posts not updated, somebody is editing them." +msgstr[0] "%s bericht niet bijgewerkt, iemand is het aan het bewerken." +msgstr[1] "%s berichten niet bijgewerkt, iemand is ze aan het bewerken." + +#: wp-admin/includes/edit-tag-messages.php:39 +msgid "Tags deleted." +msgstr "Tags verwijderd." + +#: wp-admin/includes/edit-tag-messages.php:38 +msgid "Tag not updated." +msgstr "Tag niet bijgewerkt." + +#: wp-admin/includes/edit-tag-messages.php:37 +msgid "Tag not added." +msgstr "Tag niet toegevoegd." + +#: wp-admin/includes/edit-tag-messages.php:36 +msgid "Tag updated." +msgstr "Tag bijgewerkt." + +#: wp-admin/includes/edit-tag-messages.php:35 +msgid "Tag deleted." +msgstr "Tag verwijderd." + +#: wp-admin/includes/edit-tag-messages.php:34 +msgid "Tag added." +msgstr "Tag toegevoegd." + +#: wp-admin/includes/edit-tag-messages.php:29 +msgid "Categories deleted." +msgstr "Categorieën verwijderd." + +#: wp-admin/includes/edit-tag-messages.php:28 +msgid "Category not updated." +msgstr "Categorie niet bijgewerkt." + +#: wp-admin/includes/edit-tag-messages.php:27 +msgid "Category not added." +msgstr "Categorie niet toegevoegd." + +#: wp-admin/includes/edit-tag-messages.php:26 +msgid "Category updated." +msgstr "Categorie bijgewerkt." + +#: wp-admin/includes/edit-tag-messages.php:25 +msgid "Category deleted." +msgstr "Categorie verwijderd." + +#: wp-admin/includes/edit-tag-messages.php:24 +msgid "Category added." +msgstr "Categorie toegevoegd." + +#: wp-admin/revision.php:144 +msgid "Compare two different revisions by selecting the “Compare any two revisions” box to the side." +msgstr "Vergelijk twee verschillende revisies door de “Twee revisies vergelijken” box te selecteren aan de zijkant." + +#: wp-admin/includes/revision.php:380 +msgid "Compare any two revisions" +msgstr "Twee revisies vergelijken" + +#: wp-admin/includes/revision.php:439 +msgid "Restore This Autosave" +msgstr "Deze autosave herstellen" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:411 +msgid "Current Revision by %s" +msgstr "Huidige revisie door %s" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:401 +msgid "Autosave by %s" +msgstr "Automatisch opgeslagen door %s" + +#: wp-admin/includes/meta-boxes.php:259 +msgctxt "revisions" +msgid "Browse" +msgstr "Bladeren" + +#. translators: Post revisions heading. %s: The number of available revisions. +#: wp-admin/includes/meta-boxes.php:257 +msgid "Revisions: %s" +msgstr "Revisies: %s" + +#. translators: %s: Audio track title. +#: wp-admin/includes/media.php:340 +msgid "\"%s\"." +msgstr "\"%s\"." + +#. translators: 1: Audio track title, 2: Artist name. +#: wp-admin/includes/media.php:337 +msgid "\"%1$s\" by %2$s." +msgstr "\"%1$s\" door %2$s." + +#. translators: 1: Audio track title, 2: Album title. +#: wp-admin/includes/media.php:334 +msgid "\"%1$s\" from %2$s." +msgstr "\"%1$s\" van %2$s." + +#. translators: 1: Audio track title, 2: Album title, 3: Artist name. +#: wp-admin/includes/media.php:331 +msgid "\"%1$s\" from %2$s by %3$s." +msgstr "\"%1$s\" van %2$s door %3$s." + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:421 +msgid "Revision by %s" +msgstr "Revisie door %s" + +#: wp-admin/edit-form-advanced.php:451 +msgid "We’re backing up this post in your browser, just in case." +msgstr "We slaan dit artikel voor alle zekerheid ook op in je browser." + +#: wp-admin/edit-form-advanced.php:450 +msgid "Connection lost. Saving has been disabled until you’re reconnected." +msgstr "Internetverbinding verloren. Opslaan is uitgeschakeld tot verbinding hersteld is." + +#: wp-admin/includes/revision.php:453 +msgid "Sorry, something went wrong. The requested comparison could not be loaded." +msgstr "Er ging helaas iets mis. De aangevraagde vergelijking kon niet getoond worden." + +#: wp-admin/install.php:158 wp-admin/user-new.php:578 +msgid "Repeat Password" +msgstr "Wachtwoord herhalen" + +#: wp-admin/user-edit.php:653 +msgid "Repeat New Password" +msgstr "Nieuw wachtwoord herhalen" + +#: wp-admin/includes/nav-menu.php:1035 +msgid "Add menu items from the column on the left." +msgstr "Voeg nieuwe menu-onderdelen toe vanuit de linkerkolom." + +#. translators: %s: https://wordpress.org/plugins +#: wp-admin/includes/plugin-install.php:272 +msgid "Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the WordPress Plugin Directory or upload a plugin in .zip format by clicking the button at the top of this page." +msgstr "Plugins breiden de functionaliteiten van WordPress aanzienlijk uit. Je kunt plugins automatisch installeren vanaf de WordPress plugin map of een plugin in .zip format uploaden door op de knop bovenaan deze pagina te klikken." + +#. Plugin URI of the plugin +msgid "http://wordpress.org/plugins/hello-dolly/" +msgstr "http://nl.wordpress.org/plugins/hello-dolly/" + +#: wp-admin/includes/class-theme-upgrader.php:80 +msgid "The theme contains no files." +msgstr "Het thema bevat geen bestanden." + +#: wp-admin/includes/class-wp-upgrader.php:161 +msgid "The package contains no files." +msgstr "Dit pakket bevat geen bestanden." + +#: wp-admin/revision.php:143 +msgid "To navigate between revisions, drag the slider handle left or right or use the Previous or Next buttons." +msgstr "Om te navigeren tussen revisies, sleep je de slider naar links of rechts of gebruik de Vorige of Volgende knoppen." + +#: wp-admin/includes/class-wp-debug-data.php:434 +#: wp-admin/includes/dashboard.php:1107 wp-admin/includes/dashboard.php:1297 +#: wp-admin/customize.php:147 +msgid "Loading…" +msgstr "Laden…" + +#: wp-admin/post.php:308 +msgid "This item has already been deleted." +msgstr "Het object is reeds verwijderd." + +#: wp-admin/post.php:279 +msgid "The item you are trying to restore from the Trash no longer exists." +msgstr "Het object dat je probeert te herstellen van de prullenbak bestaat niet meer." + +#: wp-admin/post.php:242 +msgid "The item you are trying to move to the Trash no longer exists." +msgstr "Het object wat je probeert te verplaatsen naar de prullenbak bestaat niet meer." + +#: wp-admin/nav-menus.php:984 +msgid "Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options." +msgstr "Sleep de items in de volgorde die je wenst. Klik op de pijl rechts van het item om extra configuratie opties te tonen." + +#: wp-admin/nav-menus.php:616 +msgid "If you haven’t yet created any menus, click the ’create a new menu’ link to get started" +msgstr "Als je nog geen menu's hebt aangemaakt, klik de ’creëer een nieuw menu’ link om te beginnen" + +#: wp-admin/revision.php:145 +msgid "To restore a revision, click Restore This Revision." +msgstr "Om een revisie terug te plaatsen, klik op Deze revisie terugplaatsen." + +#: wp-admin/revision.php:142 +msgid "From this screen you can review, compare, and restore revisions:" +msgstr "Vanuit dit scherm kun je revisies beoordelen, vergelijken en herstellen:" + +#: wp-admin/revision.php:141 +msgid "Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added." +msgstr "Revisies zijn opgeslagen kopieën van je bericht of pagina, die periodiek worden aangemaakt tijdens het bijwerken van je inhoud. De rode tekst links toont de inhoud die is verwijderd. De groene tekst rechts toont de inhoud die is toegevoegd." + +#: wp-admin/revision.php:140 +msgid "This screen is used for managing your content revisions." +msgstr "Dit scherm wordt gebruikt voor het beheren van je content revisies/wijzigingen." + +#: wp-admin/includes/revision.php:391 +msgctxt "Followed by post revision info" +msgid "To:" +msgstr "Naar:" + +#: wp-admin/includes/revision.php:366 +msgctxt "Button label for a next revision" +msgid "Next" +msgstr "Volgende" + +#: wp-admin/includes/revision.php:362 +msgctxt "Button label for a previous revision" +msgid "Previous" +msgstr "Vorige" + +#: wp-admin/includes/revision.php:389 +msgctxt "Followed by post revision info" +msgid "From:" +msgstr "Van:" + +#: wp-admin/nav-menus.php:799 +msgctxt "menu" +msgid "Use new menu" +msgstr "Nieuw menu gebruiken" + +#: wp-admin/nav-menus.php:780 +msgctxt "menu" +msgid "Edit" +msgstr "Bewerken" + +#: wp-admin/nav-menus.php:749 +msgid "Select a Menu" +msgstr "Een menu selecteren" + +#: wp-admin/nav-menus.php:740 +msgid "Assigned Menu" +msgstr "Toegewezen menu" + +#: wp-admin/nav-menus.php:739 +msgid "Theme Location" +msgstr "Themalocatie" + +#: wp-admin/nav-menus.php:708 +msgid "Manage Locations" +msgstr "Locaties beheren" + +#: wp-admin/nav-menus.php:697 +msgid "Edit Menus" +msgstr "Menu's bewerken" + +#: wp-admin/nav-menus.php:645 +msgid "To add a new menu instead of assigning an existing one, click the ’Use new menu’ link. Your new menu will be automatically assigned to that theme location" +msgstr "Om een menu toe te voegen in plaats van een bestaande toe te wijzen, klik ’Gebruik nieuw menu’. Je nieuwe menu zal automatisch aan die themalocatie gekoppeld worden." + +#: wp-admin/nav-menus.php:644 +msgid "To edit a menu currently assigned to a theme location, click the adjacent ’Edit’ link" +msgstr "Om een menu aan te passen dat reeds aan een themalocatie is gekoppeld, klik de naastgelegen ’Bewerken’ link" + +#: wp-admin/nav-menus.php:643 +msgid "To assign menus to one or more theme locations, select a menu from each location’s drop down. When you’re finished, click Save Changes" +msgstr "Om menu's toe te wijzen aan één of meer themalocaties, selecteer een menu uit de dropdown van elke locatie. Als je klaar bent, klik op Wijzigingen opslaan" + +#: wp-admin/nav-menus.php:642 +msgid "This screen is used for globally assigning menus to locations defined by your theme." +msgstr "Dit scherm wordt gebruikt om globaal menu's toe te kennen aan locaties gedefinieerd in je thema." + +#: wp-admin/nav-menus.php:637 +msgid "Editing Menus" +msgstr "Menu's bewerken" + +#: wp-admin/nav-menus.php:632 +msgid "Delete a menu item by expanding it and clicking the Remove link" +msgstr "Verwijder een menu-onderdeel door deze uit te vouwen en Verwijderen te klikken" + +#: wp-admin/nav-menus.php:631 +msgid "To reorganize menu items, drag and drop items with your mouse or use your keyboard. Drag or move a menu item a little to the right to make it a submenu" +msgstr "Om menu-onderdelen te herschikken, versleep onderdelen met je muis of gebruik je toetsenbord. Sleep of verplaats een menu-onderdeel iets naar rechts om er een submenu van te maken." + +#: wp-admin/nav-menus.php:629 +msgid "Add one or several items at once by selecting the checkbox next to each item and clicking Add to Menu" +msgstr "Voeg één of meerdere items tegelijk toe door het keuzevak aan te vinken voor ieder object en te klikken op Voeg toe aan menu" + +#: wp-admin/nav-menus.php:627 +msgid "Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below." +msgstr "Ieder aangepast menu kan verschillende links bevatten, naar pagina's, categorieën, aangepaste URLs of andere soorten inhoud. Menulinks worden toegevoegd door objecten te selecteren vanuit de uitvouwbare kaders in de kolom hieronder aan de linkerzijde." + +#: wp-admin/nav-menus.php:622 +msgid "Menu Management" +msgstr "Menubeheer" + +#: wp-admin/nav-menus.php:617 +msgid "You can assign theme locations to individual menus by selecting the desired settings at the bottom of the menu editor. To assign menus to all theme locations at once, visit the Manage Locations tab at the top of the screen." +msgstr "Je kunt themalocaties toekennen aan individuele menu's door de gewenste instellingen te selecteren aan de onderkant van de menu-editor. Om menu's in één keer toe te kennen aan alle themalocaties, klik de Beheer locaties tab bovenaan het scherm." + +#: wp-admin/nav-menus.php:615 +msgid "To edit an existing menu, choose a menu from the drop down and click Select" +msgstr "Om een bestaand menu te bewerken, kies een menu uit de dropdown en klik Selecteren" + +#: wp-admin/nav-menus.php:614 +msgid "The menu management box at the top of the screen is used to control which menu is opened in the editor below." +msgstr "Het onderdeel Menubeheer bovenaan het scherm wordt gebruikt om aan te geven welk menu geopend is in de editor hieronder." + +#: wp-admin/nav-menus.php:604 +msgid "Add, organize, and modify individual menu items" +msgstr "Individuele menu items toevoegen, organiseren en bewerken" + +#: wp-admin/nav-menus.php:603 +msgid "Create, edit, and delete menus" +msgstr "Menu's aanmaken, bewerken en verwijderen" + +#: wp-admin/nav-menus.php:602 wp-admin/themes.php:132 +msgid "From this screen you can:" +msgstr "Vanuit dit scherm kun je:" + +#: wp-admin/nav-menus.php:594 +msgid "This screen is used for managing your navigation menus." +msgstr "Dit scherm wordt gebruikt om de aangepaste menu navigatie te beheren." + +#: wp-admin/nav-menus.php:451 +msgid "Menu locations updated." +msgstr "Menu locaties bijgewerkt." + +#: wp-admin/includes/post.php:1788 +msgid "Your latest changes were saved as a revision." +msgstr "De meest recente wijzigingen zijn opgeslagen als een revisie." + +#: wp-admin/includes/media.php:3429 +msgid "Audio Codec:" +msgstr "Audiocodec:" + +#: wp-admin/includes/media.php:3428 +msgid "Audio Format:" +msgstr "Audioformaat:" + +#. translators: Audio file genre information. %s: Audio genre name. +#: wp-admin/includes/media.php:375 +msgid "Genre: %s." +msgstr "Genre: %s." + +#. translators: Audio file track information. 1: Audio track number, 2: Total +#. audio tracks. +#: wp-admin/includes/media.php:366 +msgid "Track %1$s of %2$s." +msgstr "Track %1$s van %2$s." + +#. translators: Audio file track information. %d: Year of audio track release. +#: wp-admin/includes/media.php:358 +msgid "Released: %d." +msgstr "Gepubliceerd: %d." + +#. translators: 1: Audio album title, 2: Artist name. +#: wp-admin/includes/media.php:346 +msgid "%1$s by %2$s." +msgstr "%1$s door %2$s." + +#: wp-admin/includes/revision.php:441 +msgid "Restore This Revision" +msgstr "Deze revisie terugzetten" + +#. translators: %s: Capability name. +#: wp-admin/user-edit.php:838 +msgid "Denied: %s" +msgstr "Verboden: %s" + +#: wp-admin/user-edit.php:824 +msgid "Capabilities" +msgstr "Rechten" + +#: wp-admin/nav-menus.php:1017 wp-admin/network/settings.php:473 +msgid "Menu Settings" +msgstr "Menu instellingen" + +#: wp-admin/nav-menus.php:940 +msgid "Menu structure" +msgstr "Menustructuur" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:251 +msgid "To the top" +msgstr "Naar boven" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:248 +msgid "Down one" +msgstr "Eén omlaag" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:247 +msgid "Up one" +msgstr "Eén omhoog" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:246 +msgid "Move" +msgstr "Verplaatsen" + +#. translators: 1: Post creation date, 2: Post creation time. +#: wp-admin/includes/ajax-actions.php:1564 +msgid "Draft created on %1$s at %2$s" +msgstr "Concept gecreëerd op %1$s om %2$s" + +#. translators: %s: User's display name. +#: wp-admin/post.php:257 +msgid "You cannot move this item to the Trash. %s is currently editing." +msgstr "Je kunt dit item niet verplaatsen naar de prullenbak. %s is hem nu aan het bewerken." + +#. translators: %s: User's display name. +#: wp-admin/includes/misc.php:1128 +msgid "%s has taken over and is currently editing." +msgstr "%s is het bericht nu aan het bewerken." + +#: wp-admin/nav-menus.php:850 +msgid "Select a menu to edit:" +msgstr "Een menu selecteren om te wijzigen:" + +#. translators: %s: URL to Upgrade Network screen. +#: wp-admin/includes/ms.php:708 +msgid "Thank you for Updating! Please visit the Upgrade Network page to update all your sites." +msgstr "Bedankt voor het updaten. Bezoek de Netwerk bijwerken pagina om al je sites bij te werken." + +#: wp-admin/setup-config.php:449 +msgid "All right, sparky! You’ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to…" +msgstr "Woohoo. Je bent door het eerste gedeelte gekomen van de installatie. WordPress heeft verbinding kunnen maken met de database. Als je er klaar voor bent is het tijd om te beginnen met de installatie …" + +#: wp-admin/includes/class-wp-debug-data.php:836 +msgid "Client version" +msgstr "Client versie" + +#: wp-admin/nav-menus.php:1033 +msgid "Auto add pages" +msgstr "Automatisch pagina's toevoegen" + +#: wp-admin/nav-menus.php:1002 +msgid "Give your menu a name, then click Create Menu." +msgstr "Geef je menu een naam en klik vervolgens op 'Menu aanmaken'." + +#: wp-admin/nav-menus.php:982 +msgid "Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes." +msgstr "Bewerk je standaard menu door items toe te voegen of te verwijderen. Sleep de items in de gewenste volgorde. Klik op \"Menu aanmaken\" om je wijzigingen op te slaan." + +#: wp-admin/nav-menus.php:310 +msgid "Selected menus have been successfully deleted." +msgstr "De geselecteerde menu's zijn verwijderd." + +#: wp-admin/includes/class-walker-nav-menu-edit.php:121 +msgid "sub item" +msgstr "subitem" + +#: wp-admin/theme-editor.php:31 +msgid "For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function." +msgstr "Voor PHP-bestanden kun je het Documentatiemenu gebruiken om herkende functies in dat bestand te selecteren. 'Zoek Op' leidt je naar een webpagina met referentiemateriaal over die specifieke functie." + +#: wp-admin/theme-editor.php:295 wp-admin/plugin-editor.php:274 +msgid "Look Up" +msgstr "Opzoeken" + +#: wp-admin/plugin-editor.php:128 +msgid "The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function." +msgstr "Het Documentatiemenu onder de editor toont de PHP functies die worden herkend in het pluginbestand. Klikken op 'Zoek Op' leidt je naar een webpagina over die specifieke functie." + +#. translators: %s: User's display name. +#: wp-admin/includes/misc.php:1078 +#: wp-admin/includes/class-wp-posts-list-table.php:1011 +msgid "%s is currently editing" +msgstr "%s is aan het bewerken" + +#: wp-admin/edit-form-advanced.php:361 +msgid "You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the “Create a new gallery” button." +msgstr "Je kunt media (afbeeldingen, audio, documenten, enz.) uploaden en invoegen door te klikken op de 'Media toevoegen' knop. Je kunt afbeeldingen en bestanden selecteren die al zijn geüpload naar de mediabibliotheek, of nieuwe media uploaden en toevoegen naar een pagina of een bericht. Om een afbeelding galerij te maken, selecteer de toe te voegen afbeeldingen en klik op de 'Maak een galerij' knop." + +#: wp-admin/includes/image-edit.php:70 +msgid "Image rotation is not supported by your web host." +msgstr "Afbeeldingen roteren wordt niet ondersteund door je hostingprovider." + +#. translators: %s: URL to install the Link Manager plugin. +#: wp-admin/includes/bookmark.php:347 +msgid "If you are looking to use the link manager, please install the Link Manager plugin." +msgstr "Als je op zoek bent naar de link beheerder, installeer dan de Link Manager plugin." + +#: wp-admin/widgets.php:77 +msgid "When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved." +msgstr "Bij het wisselen van thema, zijn er vaak ook wijzigingen in het aantal en de setup van de widgetruimten en zijbalken welke soms met elkaar in conflict komen, waardoor de overgang minder vlot verloopt. Als je een ander thema instelt en er lijken widgets te ontbreken, scroll dan naar beneden naar de inactieve widgets, daar zijn alle widgets en hun instellingen opgeslagen." + +#: wp-admin/edit-tags.php:288 +msgid "Parent — Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown." +msgstr "Hoofd - Categorieën kunnen, in tegenstelling tot tags, een hiërarchie hebben. Binnen de categorie Muziek zouden de subcategorieën Classic Rock en Hardrock kunnen bestaan. Dit is volledig optioneel, waarbij het de keuze is aan de gebruiker. Om een subcategorie aan te maken, kies een andere categorie in het Hoofd dropdown-menu." + +#: wp-admin/edit-form-advanced.php:374 +msgid "Several boxes on this screen contain settings for how your content will be published, including:" +msgstr "Meerdere blokken op dit scherm bevatten instellingen voor de manier waarop je inhoud zal worden gepubliceerd, met inbegrip van:" + +#: wp-admin/edit-form-advanced.php:367 +msgid "Inserting Media" +msgstr "Media invoegen" + +#: wp-admin/edit-form-advanced.php:282 +msgid "The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen." +msgstr "Het titel veld en het grote bericht-bewerk gebied zitten nu vast op hun plek, maar je kunt ze wel van positie veranderen via verslepen. Je kunt ze ook minimaliseren of uitvouwen door op de titelbalk te klikken van elke box. Gebruik de Schermopties tab om bepaalde boxen wel of niet te tonen (Samenvatting, Trackbacks, Extra velden, Reacties, Slug, Auteur) of kies tussen een enkel of twee kolom lay-out voor dit scherm. " + +#: wp-admin/includes/class-custom-image-header.php:128 +msgid "Don’t forget to click “Save Changes” when you’re done!" +msgstr "Vergeet niet op de “Wijzigingen opslaan” te klikken wanneer je klaar bent." + +#: wp-admin/includes/class-custom-background.php:91 +msgid "To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the “Choose Image” button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site." +msgstr "Om een achtergrondafbeelding te gebruiken, upload deze simpelweg of kies een afbeelding die al naar je mediabibliotheek is geüpload door op de knop “Afbeelding selecteren ” te klikken. Het is mogelijk een enkele afbeelding te tonen of deze te herhalen om het scherm te vullen. Een afbeelding kan vastgezet worden zodat de site-inhoud onafhankelijk hiervan verplaatst of de afbeelding kan mee scrollen met de site." + +#. translators: 1: URL to browser uploader, 2: Additional link attributes. +#: wp-admin/includes/media.php:3019 +msgid "You are using the multi-file uploader. Problems? Try the browser uploader instead." +msgstr "Je maakt gebruik van de multi-bestand uploader. Problemen? Probeer in plaats daarvan de browser uploader." + +#: wp-admin/async-upload.php:56 +msgctxt "media item" +msgid "Edit" +msgstr "Bewerken" + +#. translators: %s: Default text color. +#: wp-admin/includes/class-custom-image-header.php:738 +msgctxt "color" +msgid "Default: %s" +msgstr "Standaard: %s" + +#: wp-admin/includes/class-wp-media-list-table.php:341 +msgctxt "column name" +msgid "Uploaded to" +msgstr "Geüpload naar" + +#: wp-admin/includes/class-custom-background.php:492 +#: wp-admin/includes/class-custom-image-header.php:899 +#: wp-admin/includes/ajax-actions.php:2540 +msgid "The uploaded file is not a valid image. Please try again." +msgstr "Het geüploade bestand is geen geldige afbeelding. Probeer het opnieuw." + +#: wp-admin/includes/class-custom-image-header.php:631 +msgid "Choose a Custom Header" +msgstr "Kies een aangepaste header" + +#: wp-admin/includes/class-custom-background.php:338 +msgid "Choose a Background Image" +msgstr "Kies een achtergrondafbeelding" + +#: wp-admin/includes/class-custom-image-header.php:127 +msgid "In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker." +msgstr "Je kunt kiezen of je de headertekst wilt tonen of verbergen. Je kunt ook een tekstkleur kiezen door op de 'Een kleurknop selecteren' te klikken waarna een kleurenkiezer tevoorschijn komt. Een andere manier om een kleur te selecteren is de legitieme waarde in te geven zoals “#ff0000” voor rood." + +#: wp-admin/includes/class-custom-background.php:92 +msgid "You can also choose a background color by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker." +msgstr "Je kunt ook een achtergrondkleur kiezen door op de 'Een kleur selecteren'-knop te klikken waarna een kleurenkiezer tevoorschijn komt. Een andere manier om een kleur te selecteren is de geldige waarde in te geven zoals “#ff0000” voor rood." + +#: wp-admin/includes/dashboard.php:1957 +msgid "Learn more about getting started" +msgstr "Meer informatie over het starten met WordPress" + +#: wp-admin/includes/dashboard.php:1955 +msgid "Turn comments on or off" +msgstr "Reacties in- of uitschakelen" + +#: wp-admin/includes/dashboard.php:1946 +msgid "More Actions" +msgstr "Meer acties" + +#: wp-admin/edit-comments.php:186 +msgid "In the In response to column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post." +msgstr "In de In antwoord op-kolom bevinden zich drie elementen. De tekst is de naam van het bericht waarop gereageerd is en linkt naar de berichteditor voor dat bericht. De 'Bericht bekijken' link verwijst naar het bericht aan de voorkant van je site. Het ballonnetje met een getal erin toont hoeveel goedgekeurde reacties op het bericht zijn binnengekomen. Als er reacties wachten op moderatie, dan is er een rood ballonnetje met het aantal wachtende reacties. Klikken op het ballonnetje zal de wachtende reacties tonen die alleen op dat bericht gegeven zijn." + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:297 wp-admin/users.php:435 +msgid "ID #%1$s: %2$s" +msgstr "ID #%1$s: %2$s" + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:294 +msgid "ID #%1$s: %2$s The current user will not be deleted." +msgstr "ID #%1$s: %2$s De huidige gebruiker wordt niet verwijderd." + +#. translators: Storage space that's been used. 1: Percentage of used space, 2: +#. Total space allowed in megabytes or gigabytes. +#: wp-admin/includes/ms.php:259 +msgid "Used: %1$s%% of %2$s" +msgstr "Gebruikt: %1$s%% van %2$s" + +#: wp-admin/users.php:277 +msgid "Please select an option." +msgstr "Een optie selecteren." + +#: wp-admin/setup-config.php:417 +msgid "After you’ve done that, click “Run the installation”." +msgstr "Nadat je dat gedaan hebt, klik “Starten met installeren.”" + +#: wp-admin/setup-config.php:214 +msgid "Below you should enter your database connection details. If you’re not sure about these, contact your host." +msgstr "Hieronder moet je de gegevens van je databaseverbinding invullen. Als je niet zeker bent van de gegevens, neem dan contact op met je webhost." + +#: wp-admin/plugin-install.php:103 +msgid "If you want to install a plugin that you’ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin." +msgstr "Wanneer je een plugin wil installeren die je ergens anders hebt gedownload, klik je op de Plugin uploaden knop boven de plugins lijst. Je zult dan verzocht worden om het .zip bestand te uploaden, en zodra het geüpload is, kun je de nieuwe plugin activeren." + +#: wp-admin/plugin-install.php:102 +msgid "You can also browse a user’s favorite plugins, by using the Favorites link above the plugins list and entering their WordPress.org username." +msgstr "Je kunt ook bladeren door de favoriete plugins van gebruikers. Dit doe je door de WordPress.org gebruikersnaam van betreffende gebruiker in te voeren bij Favorieten Link boven de plugins lijst." + +#: wp-admin/plugin-install.php:100 +msgid "If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag." +msgstr "Als je weet waar je naar op zoek bent, dan is de Zoek optie de beste keuze om het te vinden. Het Zoek scherm biedt opties om in de WordPress Plugin Directory op een specifieke term, auteur of tag te zoeken. Je kunt de directory ook doorzoeken via de populaire tags. Tags die groter in beeld verschijnen betekent dat meerdere plugins met die tag gelabeld zijn." + +#: wp-admin/options-reading.php:206 wp-admin/install.php:201 +msgid "It is up to search engines to honor this request." +msgstr "Het is aan de zoekmachines of ze gehoor geven aan dit verzoek." + +#: wp-admin/options-reading.php:185 wp-admin/options-reading.php:205 +#: wp-admin/install.php:192 wp-admin/install.php:200 +msgid "Discourage search engines from indexing this site" +msgstr "Zoekmachines ontmoedigen om deze site te indexeren" + +#: wp-admin/options-reading.php:183 wp-admin/install.php:190 +msgid "Allow search engines to index this site" +msgstr "Zoekmachines toestaan deze site te indexeren" + +#: wp-admin/options-reading.php:43 wp-admin/options-reading.php:179 +#: wp-admin/options-reading.php:180 wp-admin/install.php:182 +#: wp-admin/install.php:185 +msgid "Search engine visibility" +msgstr "Zoekmachine zichtbaarheid" + +#. translators: 1: WordPress version, 2: URL to About screen. +#: wp-admin/includes/update-core.php:1442 wp-admin/update-core.php:857 +msgid "Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click here." +msgstr "Welkom bij WordPress %1$s. Je wordt doorverwezen naar het Over WordPress scherm. Zo niet, klik hier." + +#: wp-admin/includes/plugin-install.php:378 wp-admin/theme-install.php:202 +msgid "Get Favorites" +msgstr "Favorieten ophalen" + +#: wp-admin/includes/plugin-install.php:376 wp-admin/theme-install.php:199 +msgid "Your WordPress.org username:" +msgstr "Je WordPress.org gebruikersnaam:" + +#: wp-admin/includes/plugin-install.php:372 +msgid "If you have marked plugins as favorites on WordPress.org, you can browse them here." +msgstr "Als je plugins als favoriet gemarkeerd hebt op WordPress.org, kun je er hier doorheen bladeren." + +#: wp-admin/includes/dashboard.php:1942 +msgid "View your site" +msgstr "Je site bekijken" + +#: wp-admin/includes/dashboard.php:1939 +msgid "Add an About page" +msgstr "Een “Over mij” pagina toevoegen" + +#: wp-admin/includes/dashboard.php:1938 +msgid "Write your first blog post" +msgstr "Je eerste blogbericht schrijven" + +#: wp-admin/includes/dashboard.php:1936 +msgid "Add a blog post" +msgstr "Blogbericht toevoegen" + +#: wp-admin/includes/dashboard.php:1932 wp-admin/includes/dashboard.php:1935 +msgid "Add additional pages" +msgstr "Extra pagina's toevoegen" + +#: wp-admin/includes/dashboard.php:1931 wp-admin/includes/dashboard.php:1934 +msgid "Edit your front page" +msgstr "Startpagina bewerken" + +#: wp-admin/includes/dashboard.php:1928 +msgid "Next Steps" +msgstr "Vervolgstappen" + +#. translators: %s: URL to Themes panel in Customizer or Themes screen. +#: wp-admin/includes/dashboard.php:1922 +msgid "or, change your theme completely" +msgstr "of, verander je thema volledig" + +#: wp-admin/includes/dashboard.php:1913 +msgid "Get Started" +msgstr "Aan de slag" + +#: wp-admin/includes/dashboard.php:1909 +msgid "We’ve assembled some links to get you started:" +msgstr "Hieronder staan diverse links om te starten met WordPress:" + +#: wp-admin/includes/dashboard.php:1908 +msgid "Welcome to WordPress!" +msgstr "Welkom bij WordPress." + +#: wp-admin/includes/dashboard.php:381 +msgid "Search engines discouraged" +msgstr "Zoekmachines worden ontmoedigd" + +#. translators: 1: Link to documentation on child themes, 2: Name of parent +#. theme. +#: wp-admin/includes/class-wp-themes-list-table.php:285 +msgid "This child theme requires its parent theme, %2$s." +msgstr "Dit subthema heeft het hoofdthema nodig, %2$s." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:112 +msgctxt "Plugin Installer" +msgid "Favorites" +msgstr "Favorieten" + +#: wp-admin/theme-install.php:119 +msgid "To install the theme so you can preview it with your site’s content and customize its theme options, click the \"Install\" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the \"Activate\" link, or by navigating to your Manage Themes screen and clicking the \"Live Preview\" link under any installed theme’s thumbnail image." +msgstr "Klik op de \"Installeren\" knop linksboven om een thema te installeren. Je kunt het thema en thema instellingen vervolgens bekijken en wijzigen. De themabestanden worden automatisch gedownload naar de site. Zodra dit is afgerond is het thema beschikbaar voor activatie. Activeer het thema door op de \"Activeren\" link te klikken of door het Thema's scherm te openen en op \"Voorbeeld bekijken\" knop te klikken onder de thumbnail van een thema." + +#: wp-admin/includes/widgets.php:262 +msgctxt "widget" +msgid "Add" +msgstr "Toevoegen" + +#: wp-admin/includes/widgets.php:261 +msgctxt "widget" +msgid "Edit" +msgstr "Bewerken" + +#: wp-admin/includes/theme-install.php:117 +msgid "Search by tag" +msgstr "Op tag zoeken" + +#: wp-admin/includes/theme-install.php:114 +msgid "Search by author" +msgstr "Op auteur zoeken" + +#: wp-admin/includes/theme-install.php:111 +#: wp-admin/includes/theme-install.php:123 +msgid "Search by keyword" +msgstr "Op trefwoord zoeken" + +#: wp-admin/includes/theme-install.php:101 +msgid "Type of search" +msgstr "Zoektype" + +#: wp-admin/includes/class-wp-screen.php:1064 +msgid "Screen Options Tab" +msgstr "Schermopties tabblad" + +#: wp-admin/includes/class-wp-screen.php:870 +msgid "Contextual Help Tab" +msgstr "Help tabblad" + +#. translators: %s: Link name. +#. translators: %s: Plugin name. +#. translators: %s: Taxonomy term name. +#. translators: %s: User login. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#. translators: %s: Theme name. +#. translators: %s: Site URL. +#: wp-admin/includes/class-wp-links-list-table.php:177 +#: wp-admin/includes/class-wp-plugins-list-table.php:961 +#: wp-admin/includes/class-wp-terms-list-table.php:372 +#: wp-admin/includes/class-wp-users-list-table.php:494 +#: wp-admin/includes/class-wp-media-list-table.php:386 +#: wp-admin/includes/class-wp-posts-list-table.php:933 +#: wp-admin/update-core.php:541 wp-admin/update-core.php:705 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:409 +#: wp-admin/includes/class-wp-ms-users-list-table.php:241 +msgid "Select %s" +msgstr "%s selecteren" + +#: wp-admin/includes/class-wp-comments-list-table.php:858 +msgid "Select comment" +msgstr "Reactie selecteren" + +#. translators: %s: URL to Categories to Tags Converter tool. +#: wp-admin/edit-tags.php:627 +msgid "Tags can be selectively converted to categories using the tag to category converter." +msgstr "Tags kunnen selectief geconverteerd worden naar categorieën met behulp van tag naar categorie verplaatsen." + +#: wp-admin/edit-tags.php:260 +msgid "You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category." +msgstr "Linkcategorieën kunnen worden verwijderd met de bulkactie dropdown. Hoewel de categorieën worden verwijderd geldt dit niet voor de links in deze categorieën, deze worden verplaatst naar de standaard linkcategorie." + +#: wp-admin/edit-form-advanced.php:324 +msgid "Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box." +msgstr "Aanmaken van een Pagina lijkt veel op het aanmaken van een Bericht en de schermen kunnen op dezelfde manier worden aangepast door middel van verslepen, de Schermopties tab en het in- en uitvouwen van boxen naar keuze. Dit scherm heeft ook de afleidingsvrije schrijf ruimte, beschikbaar in zowel de visuele- als tekstmodus via de Volledig scherm knoppen. De Pagina-editor werkt grotendeels hetzelfde als de Bericht-editor, maar er zijn enkele Pagina-specifieke functies in de Pagina attributenbox." + +#: wp-admin/includes/class-custom-image-header.php:551 +msgid "You can select an image to be shown at the top of your site by uploading from your computer or choosing from your media library. After selecting an image you will be able to crop it." +msgstr "Een afbeelding selecteren om aan de bovenkant van je site te tonen. Je kunt kiezen een afbeelding van de computer te uploaden of een afbeelding te kiezen uit de mediabibliotheek. Na selectie kan de afbeelding worden bewerkt." + +#: wp-admin/menu-header.php:287 +msgid "Skip to main content" +msgstr "Spring naar de hoofdinhoud" + +#: wp-admin/includes/class-custom-image-header.php:109 +msgid "You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the “Choose Image” button." +msgstr "Je kunt een aangepaste kopafbeelding voor je site instellen. Upload een afbeelding en snij deze op maat. Daarna wordt deze afbeelding direct gebruikt als kopafbeelding. Je kunt als alternatief ook een afbeelding gebruiken die je al eerder hebt geupload naar je Mediabibliotheek. Klik daarvoor op het “Kies afbeelding” knop." + +#: wp-admin/includes/class-custom-image-header.php:878 +msgid "Skip Cropping, Publish Image as Is" +msgstr "Bijsnijden overslaan en publiceer afbeelding zoals hij nu is" + +#: wp-admin/includes/class-custom-background.php:339 +#: wp-admin/includes/class-custom-image-header.php:632 +msgid "Choose Image" +msgstr "Afbeelding selecteren" + +#: wp-admin/includes/class-custom-background.php:336 +#: wp-admin/includes/class-custom-image-header.php:628 +msgid "Or choose an image from your media library:" +msgstr "Of kies een afbeelding uit de mediabibliotheek:" + +#: wp-admin/includes/class-custom-background.php:326 +#: wp-admin/includes/class-custom-image-header.php:549 +msgid "Select Image" +msgstr "Afbeelding selecteren" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:394 +#: wp-admin/theme-install.php:527 +msgid "Collapse" +msgstr "Inklappen" + +#: wp-admin/includes/class-custom-image-header.php:112 +msgid "If you don’t want a header image to be displayed on your site at all, click the “Remove Header Image” button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click “Save Changes”." +msgstr "Als je geen headerafbeelding wil tonen op je site, klik dan op de “Verwijder headerafbeelding” knop onderaan het Headerafbeelding gedeelte van deze pagina. Indien je deze optie later weer wilt toevoegen hoef je enkel een andere optie te selecteren en op “Opslaan” te klikken." + +#: wp-admin/media.php:70 +msgid "You attempted to edit an item that isn’t an attachment. Please go back and try again." +msgstr "Je hebt geprobeerd een item te bewerken dat geen bijlage is. Ga terug en probeer opnieuw." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:316 +#: wp-admin/includes/class-wp-theme-install-list-table.php:474 +msgid "This theme is already installed and is up to date" +msgstr "Dit thema is al geïnstalleerd en up-to-date." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:606 +msgctxt "plugin" +msgid "Installed" +msgstr "Geïnstalleerd" + +#: wp-admin/themes.php:179 +msgid "Previewing and Customizing" +msgstr "Voorbeeld bekijken en aanpassen via de Customizer" + +#: wp-admin/theme-install.php:124 +msgid "Previewing and Installing" +msgstr "Voorbeeld en installeren" + +#: wp-admin/theme-install.php:118 +msgid "Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you’re interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look." +msgstr "Zodra er een lijst van thema's is gegenereerd, kun je ze vooraf bekijken of installeren. Klik op de thumbnail van het thema welke je vooraf wilt bekijken. Een nieuw volledig scherm zal geopend worden om je een beter idee te geven van het uiterlijk van het thema." + +#: wp-admin/includes/media.php:3036 +msgid "You are using the browser’s built-in file uploader. The WordPress uploader includes multiple file selection and drag and drop capability. Switch to the multi-file uploader." +msgstr "Je gebruikt de ingebouwde bestand uploader van de browser. De WordPress uploader bevat meerdere bestanden selectie en de mogelijkheid tot verslepen. Schakel om naar de multi-bestandsuploader." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-theme-install-list-table.php:336 +msgid "Preview %s" +msgstr "%s voorvertonen" + +#: wp-admin/tools.php:49 +msgid "The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin & Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa." +msgstr "De categorieën en tags converterlink brengt je naar de importeerpagina, waar de Converteer mogelijkheid één van de plugins is welke je kunt installeren. Eenmaal geïnstalleerd, brengt de link op deze pagina je naar een scherm waar je kunt kiezen wat je wilt omzetten." + +#: wp-admin/tools.php:48 +msgid "Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content." +msgstr "Categorieën hebben een hiërarchie, wat betekent dat ze ondergebracht kunnen worden in subcategorieën. Tags hebben geen hiërarchie en kunnen niet genest worden. Soms starten mensen met gebruik van één van deze op hun berichten, terwijl ze later bedenken dat de andere beter werkt voor hun inhoud." + +#. translators: %s: URL to General Settings screen. +#: wp-admin/includes/class-custom-image-header.php:123 +msgid "For most themes, the header text is your Site Title and Tagline, as defined in the General Settings section." +msgstr "Voor de meeste thema's bestaat de headertekst uit je site titel en site slogan zoals ingesteld in de Algemene instellingen sectie." + +#: wp-admin/includes/class-custom-image-header.php:111 +msgid "If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the “Random” radio button next to the Uploaded Images or Default Images section to enable this feature." +msgstr "Indien je thema meer dan één standaard header afbeelding heeft, of wanneer je meer dan één afbeelding hebt geüpload, dan kun je ervoor kiezen dat WordPress willekeurig een andere afbeelding toont op elke pagina van je site. Klik op de knop “Willekeurig” naast de afbeelding om deze optie aan te zetten." + +#: wp-admin/includes/class-custom-image-header.php:110 +msgid "Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the “Save Changes” button." +msgstr "Sommige thema’ hebben zelf kopafbeeldingen toegevoegd. Wanneer je meerdere afbeeldingen ziet, selecteer dan degene die je wilt en klik op de “Opslaan” knop." + +#: wp-admin/includes/class-custom-image-header.php:100 +msgid "You can choose from the theme’s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed." +msgstr "Je kunt kiezen uit de standaard afbeeldingen van een thema, of je kunt een afbeelding van jezelf gebruiken. Je kunt ook aanpassen hoe je site titel en slogan worden weergegeven." + +#: wp-admin/includes/class-custom-image-header.php:99 +msgid "This screen is used to customize the header section of your theme." +msgstr "Dit scherm wordt gebruikt om de header van je thema aan te passen." + +#: wp-admin/install.php:293 wp-admin/install.php:306 +msgid "Configuration Error" +msgstr "Configuratiefout" + +#: wp-admin/media-new.php:54 +msgid "Revert to the Browser Uploader by clicking the link below the drag and drop box." +msgstr "Ga terug naar de Browser Uploader door op de link onder de versleep box te klikken." + +#: wp-admin/users.php:487 wp-admin/network/users.php:250 +msgid "User deleted." +msgstr "Gebruiker verwijderd." + +#: wp-admin/includes/class-core-upgrader.php:36 wp-admin/includes/file.php:1546 +#: wp-admin/includes/file.php:1673 +msgid "Could not copy files. You may have run out of disk space." +msgstr "Kon bestanden niet kopiëren. Mogelijk is er niet voldoende schijfruimte beschikbaar." + +#: wp-admin/includes/theme-install.php:140 +msgid "Find a theme based on specific features." +msgstr "Thema zoeken op basis van specifieke kenmerken." + +#: wp-admin/includes/theme-install.php:95 +msgid "Search for themes by keyword." +msgstr "Op trefwoord zoeken naar thema's." + +#: wp-admin/setup-config.php:198 +msgid "In all likelihood, these items were supplied to you by your Web Host. If you don’t have this information, then you will need to contact them before you can continue. If you’re all ready…" +msgstr "Hoogstwaarschijnlijk zijn deze items toegevoegd door je hostingprovider. Als je deze informatie niet hebt, dan zul je eerst contact met hun op moeten nemen voordat je verder kunt. Als je helemaal klaar bent… " + +#: wp-admin/theme-editor.php:246 +msgid "This theme is broken." +msgstr "Dit thema is kapot." + +#: wp-admin/includes/class-custom-image-header.php:632 +msgid "Set as header" +msgstr "Instellen als kop" + +#: wp-admin/includes/class-custom-background.php:339 +msgid "Set as background" +msgstr "Instellen als achtergrond" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-upgrader-skin.php:94 +msgid "Customize “%s”" +msgstr "“%s” Aanpassen via de Customizer" + +#: wp-admin/install.php:159 wp-admin/user-new.php:507 wp-admin/user-new.php:511 +#: wp-admin/user-new.php:558 wp-admin/user-new.php:578 +#: wp-admin/user-edit.php:458 wp-admin/user-edit.php:506 +msgid "(required)" +msgstr "(vereist)" + +#: wp-admin/link.php:111 +msgid "Edit Link" +msgstr "Link bewerken" + +#: wp-admin/includes/user.php:151 +msgid "Error: Please enter a nickname." +msgstr "Fout: Voer een schermnaam in." + +#: wp-admin/credits.php:66 +msgid "https://wordpress.org/about/" +msgstr "https://nl.wordpress.org/about/" + +#: wp-admin/includes/class-wp-list-table.php:1192 +#: wp-admin/includes/nav-menu.php:663 wp-admin/includes/nav-menu.php:894 +#: wp-admin/update-core.php:453 wp-admin/update-core.php:573 +#: wp-admin/update-core.php:615 wp-admin/update-core.php:737 +msgid "Select All" +msgstr "Alles selecteren" + +#: wp-admin/includes/meta-boxes.php:175 wp-admin/js/post.js:874 +msgid "Public, Sticky" +msgstr "Openbaar, sticky" + +#: wp-admin/includes/meta-boxes.php:108 wp-admin/includes/meta-boxes.php:143 +#: wp-admin/js/post.js:797 wp-admin/js/post.js:799 +msgid "Privately Published" +msgstr "Gepubliceerd als privé" + +#: wp-admin/includes/meta-boxes.php:59 wp-admin/js/post.js:828 +msgid "Save as Pending" +msgstr "Bewaar in wachtrij" + +#: wp-admin/includes/media.php:1406 wp-admin/includes/media.php:2980 +msgid "Enter a link URL or click above for presets." +msgstr "Een link-URL invoeren of hierboven klikken voor voorbeelden." + +#: wp-admin/includes/media.php:1403 +msgid "Link URL" +msgstr "Link-URL" + +#: wp-admin/includes/image-edit.php:132 +msgid "Scale" +msgstr "Schalen" + +#: wp-admin/includes/meta-boxes.php:862 +msgid "No comments yet." +msgstr "Nog geen reacties." + +#: wp-admin/includes/class-wp-themes-list-table.php:279 +#: wp-admin/includes/class-wp-theme-install-list-table.php:509 +#: wp-admin/includes/plugin-install.php:654 +msgid "Version:" +msgstr "Versie:" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:392 +#: wp-admin/theme-install.php:69 wp-admin/theme-install.php:525 +msgid "Collapse Sidebar" +msgstr "Zijbalk inklappen" + +#: wp-admin/includes/class-wp-plugins-list-table.php:462 +msgid "Plugin" +msgstr "Plugin" + +#: wp-admin/includes/media.php:2569 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:370 +msgid "Actions" +msgstr "Acties" + +#: wp-admin/includes/class-wp-media-list-table.php:174 +#: wp-admin/includes/class-wp-media-list-table.php:752 +#: wp-admin/includes/class-wp-comments-list-table.php:366 +#: wp-admin/includes/class-wp-comments-list-table.php:750 +#: wp-admin/includes/class-wp-posts-list-table.php:408 +#: wp-admin/includes/class-wp-posts-list-table.php:1366 +msgid "Restore" +msgstr "Herstellen" + +#. translators: %s: Number of words. +#: wp-admin/edit-form-advanced.php:614 +msgid "Word count: %s" +msgstr "Aantal woorden: %s" + +#: wp-admin/edit-comments.php:308 wp-admin/edit-comments.php:314 +msgid "Edit comment" +msgstr "Reactie bewerken" + +#: wp-admin/options-general.php:337 wp-admin/options-general.php:374 +msgid "Preview:" +msgstr "Voorbeeld:" + +#: wp-admin/includes/theme-install.php:103 +#: wp-admin/includes/plugin-install.php:333 +msgid "Keyword" +msgstr "Trefwoord" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-upgrader.php:93 +msgid "The parent theme could not be found. You will need to install the parent theme, %s, before you can use this child theme." +msgstr "Het hoofdthema kon niet worden gevonden. Je moet het hoofdthema %s installeren, voordat je dit child-thema kunt gebruiken." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:91 +msgid "Successfully installed the parent theme, %1$s %2$s." +msgstr "Het hoofdthema is geïnstaleerd, %1$s %2$s." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:89 +msgid "The parent theme, %1$s %2$s, is currently installed." +msgstr "Het hoofdthema, %1$s %2$s, is op dit moment geïnstalleerd." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:87 +msgid "Preparing to install %1$s %2$s…" +msgstr "Installatie van %1$s %2$s voorbereiden." + +#: wp-admin/includes/class-theme-upgrader.php:85 +msgid "This theme requires a parent theme. Checking if it is installed…" +msgstr "Dit thema vereist een hoofdthema. Controleren of deze is geïnstalleerd." + +#: wp-admin/includes/class-custom-image-header.php:710 +msgid "Show header text with your image." +msgstr "Laat de headertekst en je afbeelding zien." + +#: wp-admin/includes/class-custom-image-header.php:119 +#: wp-admin/includes/class-custom-image-header.php:702 +#: wp-admin/includes/class-custom-image-header.php:707 +msgid "Header Text" +msgstr "Koptekst" + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number, 5: Update URL, 6: Additional link attributes. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number, 5: Update URL, 6: Additional link attributes. +#: wp-admin/includes/theme.php:230 wp-admin/includes/update.php:504 +#: wp-admin/includes/update.php:696 +msgid "There is a new version of %1$s available. View version %4$s details or update now." +msgstr "Er is een nieuwe versie van %1$s beschikbaar. Details van %4$s bekijken of nu updaten." + +#. translators: %s: Plugin author. +#: wp-admin/includes/plugin.php:214 +msgid "By %s." +msgstr "Door %s." + +#: wp-admin/includes/meta-boxes.php:848 wp-admin/includes/template.php:494 +msgid "Add Comment" +msgstr "Reactie toevoegen" + +#: wp-admin/includes/template.php:455 +msgid "Add new Comment" +msgstr "Nieuwe reactie toevoegen" + +#. Author URI of the plugin +msgid "http://ma.tt/" +msgstr "http://ma.tt/" + +#. Description of the plugin +msgid "This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from Hello, Dolly in the upper right of your admin screen on every page." +msgstr "Dit is niet zomaar een plugin, deze plugin symboliseert de hoop en het enthousiasme van een hele generatie opgesomd en gezongen in twee beroemde woorden door Louis Armstrong: Hello, Dolly. Wanneer je de plugin activeert worden er willekeurige verses getoond uit Hello, Dolly rechts bovenaan je Dashboard op elke pagina." + +#. Plugin Name of the plugin +msgid "Hello Dolly" +msgstr "Hallo Dolly" + +#: wp-admin/index.php:76 +msgid "Welcome — Shows links for some of the most common tasks when setting up a new site." +msgstr "Welkom — Dit toont links voor de meest voorkomende taken bij het opzetten van een nieuwe site." + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/theme.php:217 wp-admin/includes/update.php:683 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this theme." +msgstr "Er is een nieuwe versie van %1$s beschikbaar. Details van %4$s bekijken. Automatisch bijwerken is niet beschikbaar voor dit thema." + +#: wp-admin/install.php:108 wp-admin/install.php:357 +msgctxt "Howdy" +msgid "Welcome" +msgstr "Welkom" + +#: wp-admin/ms-delete-site.php:131 +msgid "Delete My Site Permanently" +msgstr "Mijn site permanent verwijderen" + +#. translators: %s: Site address. +#: wp-admin/ms-delete-site.php:126 +msgid "I'm sure I want to permanently delete my site, and I am aware I can never get it back or use %s again." +msgstr "Ik weet zeker dat ik permanent mijn site wil verwijderen, en ben er van op de hoogte dat ik niet meer terug kan en %s niet meer kan gebruiken." + +#: wp-admin/ms-delete-site.php:117 +msgid "Remember, once deleted your site cannot be restored." +msgstr "Onthoudt dat als deze site eenmaal is verwijderd het niet kan worden hersteld." + +#. translators: %s: Network title. +#: wp-admin/ms-delete-site.php:112 +msgid "If you do not want to use your %s site any more, you can delete it using the form below. When you click Delete My Site Permanently you will be sent an email with a link in it. Click on this link to delete your site." +msgstr "Als je de %s site niet meer wil gebruiken, kun je deze verwijderen met het onderstaande formulier. Wanneer je klikt op Mijn site definitief verwijderen wordt er een e-mailbericht verstuurd met een link. Klik op deze link om je site definitief te verwijderen." + +#: wp-admin/ms-delete-site.php:103 +msgid "Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked." +msgstr "Bedankt. Controleer je e-mail voor een link om je actie te bevestigen. Je site wordt niet verwijderd totdat op de link wordt geklikt om de actie te bevestigen." + +#: wp-admin/ms-delete-site.php:31 +msgid "Sorry, the link you clicked is stale. Please select another option." +msgstr "De link waarop je hebt geklikt is verouderd. Een andere optie selecteren." + +#. translators: %s: Network title. +#: wp-admin/ms-delete-site.php:26 +msgid "Thank you for using %s, your site has been deleted. Happy trails to you until we meet again." +msgstr "Bedankt voor het gebruik van %s, je site is verwijderd. Hopelijk tot een volgende keer." + +#. translators: My Sites label. +#: wp-admin/includes/ms.php:765 +msgid "Primary Site" +msgstr "Primaire site" + +#: wp-admin/includes/ms.php:655 +msgid "British English" +msgstr "Brits Engels" + +#: wp-admin/includes/ms.php:651 +msgid "American English" +msgstr "Amerikaans Engels" + +#: wp-admin/includes/ms.php:608 +msgid "View Site" +msgstr "Site bekijken" + +#: wp-admin/includes/ms.php:607 +msgid "Visit Dashboard" +msgstr "Ga naar Dashboard" + +#: wp-admin/includes/ms.php:601 +msgid "Your Sites" +msgstr "Je sites" + +#: wp-admin/includes/ms.php:599 +msgid "If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way." +msgstr "Als je per ongeluk op dit scherm terechtgekomen bent en je dacht één van je eigen sites te bezoeken, hier zijn enkele snelkoppelingen die je kunnen helpen de weg te vinden." + +#. translators: 1: Site title. +#: wp-admin/includes/ms.php:587 wp-admin/includes/ms.php:596 +msgid "You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator." +msgstr "Je probeert toegang te krijgen tot het \"%1$s\" dashboard, maar je hebt momenteel onvoldoende rechten op deze site. Als je denkt dat je toegang moet hebben op het \"%1$s\" dashboard, neem dan contact op met je netwerkbeheerder." + +#: wp-admin/includes/ms.php:302 +msgid "MB (Leave blank for network default)" +msgstr "MB (Laat leeg voor de netwerk standaard)" + +#. translators: New admin email address notification email subject. %s: Site +#. title. +#: wp-admin/includes/misc.php:1410 +msgid "[%s] New Admin Email Address" +msgstr "[%s] Nieuw admin e-mailadres" + +#: wp-admin/includes/class-wp-debug-data.php:200 +#: wp-admin/includes/class-wp-debug-data.php:210 +#: wp-admin/includes/class-wp-debug-data.php:219 +#: wp-admin/includes/class-wp-debug-data.php:228 +#: wp-admin/includes/class-wp-debug-data.php:237 +#: wp-admin/includes/class-wp-debug-data.php:277 +#: wp-admin/includes/class-wp-debug-data.php:282 +#: wp-admin/includes/class-wp-debug-data.php:292 +#: wp-admin/includes/class-wp-debug-data.php:297 +#: wp-admin/includes/class-wp-debug-data.php:548 +#: wp-admin/includes/class-wp-debug-data.php:1133 +#: wp-admin/includes/class-wp-debug-data.php:1219 +msgid "Disabled" +msgstr "Uitgeschakeld" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:546 +msgid "Paused (%s)" +msgid_plural "Paused (%s)" +msgstr[0] "Gepauzeerd (%s)" +msgstr[1] "Gepauzeerd (%s)" + +#: wp-admin/my-sites.php:112 +msgid "Global Settings" +msgstr "Algemene instellingen" + +#: wp-admin/my-sites.php:77 +msgid "You must be a member of at least one site to use this page." +msgstr "Je moet lid zijn van minimaal één site om deze pagina te gebruiken." + +#: wp-admin/my-sites.php:33 +msgid "The primary site you chose does not exist." +msgstr "De primaire site die je gekozen hebt bestaat niet." + +#: wp-admin/setup-config.php:244 +msgid "If you want to run multiple WordPress installations in a single database, change this." +msgstr "Wanneer je meerdere WordPress installaties wilt gebruiken in een database moet je dit aanpassen." + +#: wp-admin/setup-config.php:242 +msgid "Table Prefix" +msgstr "Tabelprefix" + +#: wp-admin/setup-config.php:232 +msgid "Database Host" +msgstr "Hostnaam" + +#: wp-admin/setup-config.php:228 +msgctxt "example password" +msgid "password" +msgstr "wachtwoord" + +#: wp-admin/setup-config.php:223 +msgctxt "example username" +msgid "username" +msgstr "gebruikersnaam" + +#: wp-admin/setup-config.php:217 +msgid "Database Name" +msgstr "Databasenaam" + +#: wp-admin/setup-config.php:200 +msgid "Let’s go!" +msgstr "Laten we starten." + +#: wp-admin/setup-config.php:170 +msgid "Table prefix (if you want to run more than one WordPress in a single database)" +msgstr "Tabelprefix (wanneer je meerdere WordPress installaties wilt draaien in een database)" + +#: wp-admin/includes/class-wp-debug-data.php:847 wp-admin/setup-config.php:169 +msgid "Database host" +msgstr "Host van de database" + +#: wp-admin/setup-config.php:168 +msgid "Database password" +msgstr "Wachtwoord van de database" + +#: wp-admin/includes/class-wp-debug-data.php:841 wp-admin/setup-config.php:167 +msgid "Database username" +msgstr "Gebruikersnaam van de database" + +#: wp-admin/includes/class-wp-debug-data.php:853 wp-admin/setup-config.php:166 +msgid "Database name" +msgstr "Naam van de database" + +#: wp-admin/setup-config.php:164 +msgid "Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding." +msgstr "Welkom bij WordPress. Voordat we beginnen hebben we wat informatie nodig over de database. Je moet de volgende informatie hebben voordat we verder kunnen gaan." + +#: wp-admin/setup-config.php:114 +msgid "WordPress › Setup Configuration File" +msgstr "WordPress › Setup configuratiebestand" + +#. translators: 1: wp-config.php, 2: install.php +#: wp-admin/setup-config.php:76 +msgid "The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." +msgstr "Het bestand %1$s is al aanwezig een niveau boven de WordPress installatie. Wanneer je configuratie-onderdelen wilt aanpassen in dit bestand moet je het eerst verwijderen. Je mag proberen het nu te installeren." + +#. translators: 1: wp-config.php, 2: install.php +#: wp-admin/setup-config.php:63 +msgid "The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." +msgstr "Het bestand %1$s bestaat al. Als je sommige configuraties in dit bestand moet herstellen, verwijder dit bestand dan eerst. Probeer nu te installeren." + +#. translators: %s: wp-config-sample.php +#: wp-admin/setup-config.php:52 +msgid "Sorry, I need a %s file to work from. Please re-upload this file to your WordPress installation." +msgstr "Ik heb een %s bestand nodig om vanuit te werken. Graag deze opnieuw uploaden vanuit je WordPress installatie." + +#. translators: %s: wp-config.php +#: wp-admin/maint/repair.php:35 +msgid "To allow use of this page to automatically repair database problems, please add the following line to your %s file. Once this line is added to your config, reload this page." +msgstr "Om op deze pagina toestemming te geven automatisch database problemen te repareren, voeg je de volgende regel toe aan je %s bestand. Zodra deze regel is toegevoegd aan je configuratie, laad je deze pagina opnieuw." + +#: wp-admin/includes/class-wp-comments-list-table.php:219 +msgid "No comments awaiting moderation." +msgstr "Geen reactie in afwachting van moderatie." + +#: wp-admin/includes/plugin-install.php:575 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Overige notities" + +#: wp-admin/includes/plugin-install.php:573 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Changelog" + +#: wp-admin/includes/plugin-install.php:572 +msgctxt "Plugin installer section title" +msgid "Screenshots" +msgstr "Schermafbeeldingen" + +#: wp-admin/includes/plugin-install.php:571 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: wp-admin/includes/plugin-install.php:570 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installatie" + +#: wp-admin/includes/plugin-install.php:569 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Beschrijving" + +#: wp-admin/includes/plugin-install.php:702 +msgid "Plugin Homepage »" +msgstr "Plugin-homepagina »" + +#: wp-admin/export.php:50 +msgid "You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status." +msgstr "Je kunt een bestand exporteren van je site-inhoud om het te importeren in een andere installatie of platform. Het export-bestand wordt een XML-bestandsformaat en WXR genoemd. Berichten, pagina's, reacties, aangepaste velden, categorieën en tags kunnen ingesloten worden. Je kunt kiezen of het WXR-bestand alleen bepaalde berichten of pagina's bevat door de dropdownfilters in te stellen om de export te limiteren op categorie, auteur, datumbereik op maand, of publicatiestatus. " + +#. translators: 1: Table name, 2: Error message. +#: wp-admin/maint/repair.php:114 +msgid "Failed to repair the %1$s table. Error: %2$s" +msgstr "Mislukt om de %1$s tabel te repareren. Fout: %2$s" + +#: wp-admin/user-new.php:260 +msgid "New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you don’t want the user to receive a welcome email." +msgstr "Nieuwe gebruikers ontvangen een e-mail om ze te laten weten dat ze zijn toegevoegd als een gebruiker van je site. Deze e-mail zal ook hun wachtwoord bevatten. Vink de box aan als je niet wilt dat de gebruiker een welkomst e-mail ontvangt." + +#: wp-admin/includes/image-edit.php:251 +msgid "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." +msgstr "Er zijn niet-bewaarde wijzigingen die verloren zullen gaan. 'OK' om verder te gaan, 'Annuleren' om terug te keren naar de afbeeldingseditor." + +#: wp-admin/options-writing.php:34 +msgid "Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it’s a good idea to keep this address very secret." +msgstr "Publiceren via e-mailinstellingen geeft je de mogelijkheid je WordPress installatie een e-mail te sturen met de inhoud van je bericht. Gebruik hiervoor een geheim e-mailaccount met POP3-toegang, en elke e-mail die ontvangen wordt zal als bericht gepubliceerd worden. Het is aan te raden dit e-mailadres goed geheim te houden." + +#: wp-admin/users.php:45 +msgid "You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed." +msgstr "Je kunt de lijst van gebruikers filteren op Gebruikersrol met behulp van de tekstlinks boven de gebruikerslijst om alle te tonen, Beheerder, Redacteur, Auteur, Schrijver of Abonnee. Standaard worden alle gebruikers getoond. Niet gebruikte Gebruikersrollen worden niet getoond." + +#: wp-admin/import.php:25 +msgid "In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently." +msgstr "In voorgaande versies van WordPress, waren alle importeerfuncties ingebouwd. Het zijn nu plugins, omdat de meeste mensen ze niet vaak of eenmalig gebruiken." + +#. translators: %s: URL to view the autosave. +#: wp-admin/edit-form-advanced.php:253 +msgid "There is an autosave of this post that is more recent than the version below. View the autosave" +msgstr "Er is een automatisch opgeslagen versie van dit bericht dat recenter is dan onderstaande versie. Toon de automatisch opgeslagen versie" + +#: wp-admin/options-discussion.php:220 +msgid "An avatar is an image that follows you from weblog to weblog appearing beside your name when you comment on avatar enabled sites. Here you can enable the display of avatars for people who comment on your site." +msgstr "Een avatar is een afbeelding die je volgt van weblog tot weblog. Deze afbeelding staat naast je naam wanneer je een reactie achter laat op een site waar avatars zijn ingeschakeld. Hier kun je de weergave van avatars voor mensen die reageren op je site aanzetten." + +#: wp-admin/includes/class-custom-image-header.php:838 +#: wp-admin/includes/class-custom-image-header.php:981 +#: wp-admin/includes/class-custom-image-header.php:1317 +msgid "Image could not be processed. Please go back and try again." +msgstr "De afbeelding kon niet verwerkt worden. Ga terug en probeer opnieuw." + +#: wp-admin/themes.php:262 +msgid "The active theme is broken. Reverting to the default theme." +msgstr "Het actieve thema is kapot. Terugdraaien naar het standaard thema." + +#: wp-admin/maint/repair.php:168 +msgid "WordPress can also attempt to optimize the database. This improves performance in some situations. Repairing and optimizing the database can take a long time and the database will be locked while optimizing." +msgstr "WordPress kan proberen de database te optimaliseren. Dit geeft in sommige situaties een prestatieverbetering. Het repareren en optimaliseren van de database kan enige tijd in beslag nemen, gedurende dit proces zal de database geblokkeerd zijn." + +#: wp-admin/maint/repair.php:164 +msgid "WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient." +msgstr "WordPress kan automatisch zoeken voor de meest voorkomende database problemen en deze herstellen. Het repareren kan even duren, dus wees geduldig." + +#: wp-admin/maint/repair.php:155 +msgid "Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users." +msgstr "Reparatie is voltooid. Verwijder de volgende regel code uit wp-config.php om te voorkomen dat deze pagina gebruikt word door ongeautoriseerde gebruikers." + +#. translators: 1: Table name, 2: Error message. +#: wp-admin/maint/repair.php:104 +msgid "The %1$s table is not okay. It is reporting the following error: %2$s. WordPress will attempt to repair this table…" +msgstr "De %1$s tabel is niet correct. Het geeft de volgende foutmelding: %2$s. WordPress zal proberen deze tabel te repareren…" + +#: wp-admin/user-new.php:418 +msgid "Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Vul het e-mailadres of de gebruikersnaam in van een bestaande gebruiker op dit netwerk om een uitnodiging voor deze site te versturen. Deze persoon zal een e-mail ontvangen met de vraag om de uitnodiging te bevestigen." + +#: wp-admin/user-new.php:414 +msgid "Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Vul het e-mailadres in van een bestaande gebruiker op dit netwerk om een uitnodiging voor deze site te versturen. Deze persoon zal een e-mail ontvangen met de vraag om de uitnodiging te bevestigen." + +#: wp-admin/user-edit.php:337 +msgid "Show Toolbar when viewing site" +msgstr "Toolbar tonen tijdens bekijken van de site" + +#. translators: %s: HelpHub URL +#. translators: %s: Documentation URL. +#: wp-admin/about.php:93 wp-admin/about.php:335 +msgid "For more information, see the release notes." +msgstr "Voor meer informatie, bekijk de versie opmerkingen." + +#. translators: 1: WordPress version number, 2: Plural number of bugs. More +#. than one security issue. +#: wp-admin/about.php:329 +msgid "Version %1$s addressed some security issues and fixed %2$s bug." +msgid_plural "Version %1$s addressed some security issues and fixed %2$s bugs." +msgstr[0] "Versie %1$s heeft enkele beveiligingsproblemen verholpen en %2$s bug opgelost." +msgstr[1] "Versie %1$s heeft enkele beveiligingsproblemen verholpen en %2$s bugs opgelost." + +#. translators: 1: WordPress version number, 2: Plural number of bugs. Singular +#. security issue. +#: wp-admin/about.php:323 +msgid "Version %1$s addressed a security issue and fixed %2$s bug." +msgid_plural "Version %1$s addressed a security issue and fixed %2$s bugs." +msgstr[0] "Versie %1$s loste een beveiligingsprobleem op en loste %2$s bug op." +msgstr[1] "Versie %1$s loste een beveiligingsprobleem op en loste %2$s bugs op." + +#. translators: 1: WordPress version number, 2: Plural number of bugs. +#: wp-admin/about.php:81 wp-admin/about.php:317 +msgid "Version %1$s addressed %2$s bug." +msgid_plural "Version %1$s addressed %2$s bugs." +msgstr[0] "Versie %1$s bevat %2$s bugfix." +msgstr[1] "Versie %1$s bevat %2$s bugfixes." + +#: wp-admin/index.php:35 +msgid "Welcome to your WordPress Dashboard! This is the screen you will see when you log in to your site, and gives you access to all the site management features of WordPress. You can get help for any screen by clicking the Help tab above the screen title." +msgstr "Welkom bij je WordPress Dashboard. Dit is het scherm dat je krijgt te zien zodra je inlogt op je site. Het geeft je toegang tot alle beheerfuncties van WordPress. Wanneer je klikt op de Hulp tab rechtsboven de schermtitel, krijg je meer informatie te zien over de functionaliteiten en werking van het betreffende onderdeel. " + +#. translators: %s: WordPress version number. +#: wp-admin/about.php:314 +msgid "Version %s addressed some security issues." +msgstr "Versie %s loste enkele beveiligingsproblemen op." + +#: wp-admin/about.php:308 +msgid "Maintenance and Security Release" +msgstr "Onderhoud en beveiliging versie" + +#: wp-admin/about.php:305 +msgid "Security Release" +msgstr "Beveiligingsversie" + +#: wp-admin/about.php:76 wp-admin/about.php:302 +msgid "Maintenance Release" +msgstr "Onderhoudsversie" + +#: wp-admin/credits.php:48 wp-admin/privacy.php:45 wp-admin/freedoms.php:51 +#: wp-admin/about.php:46 +msgid "What’s New" +msgstr "Wat is er nieuw" + +#: wp-admin/options-permalink.php:24 +msgid "This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures." +msgstr "Dit scherm stelt je in staat om je permalinkstructuur te kiezen. Je kunt uit de diverse mogelijkheden kiezen of een eigen structuur gebruiken." + +#. translators: 1: WordPress version, 2: URL to About screen. +#: wp-admin/includes/update-core.php:1450 wp-admin/update-core.php:865 +msgid "Welcome to WordPress %1$s. Learn more." +msgstr "Welkom bij WordPress %1$s. Meer informatie." + +#: wp-admin/media-new.php:50 +msgid "You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:" +msgstr "Mediabestanden kunnen geüpload worden zonder dat eerst een bericht gemaakt wordt. Dit geeft de mogelijkheid bestanden te uploaden om later te gebruiken in berichten en pagina's en/of om een weblink te gebruiken voor een bijzonder bestand wat je kunt delen. Er zijn drie opties om bestanden te uploaden:" + +#: wp-admin/edit-tags.php:298 +msgid "Adding Tags" +msgstr "Tags toevoegen" + +#: wp-admin/edit-tags.php:298 +msgid "Adding Categories" +msgstr "Categorieën toevoegen" + +#: wp-admin/plugins.php:557 +msgid "Troubleshooting" +msgstr "Probleemoplossing" + +#: wp-admin/update-core.php:945 +msgid "How to Update" +msgstr "Hoe bijwerken" + +#: wp-admin/export.php:173 +msgid "Once you’ve saved the download file, you can use the Import function in another WordPress installation to import the content from this site." +msgstr "Zodra je het gedownloade bestand hebt opgeslagen, kun je de Importeerfunctie van een andere WordPress installatie gebruiken om de inhoud van deze site te importeren." + +#: wp-admin/upload.php:244 +msgid "Attaching Files" +msgstr "Bestanden toevoegen" + +#: wp-admin/edit.php:278 +msgid "When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears." +msgstr "Als je voor meerdere bewerkingen tegelijk uitvoeren kiest, kun je de metadata (categorieën, auteur, enz.) voor alle geselecteerde berichten in één keer bewerken. Om een bericht van deze selectie te verwijderen, klik dan op de x naast de naam in de Acties menu ruimte." + +#: wp-admin/edit.php:277 +msgid "You can also edit or move multiple posts to the Trash at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk actions menu and click Apply." +msgstr "Je kunt ook meerdere berichten tegelijk verplaatsen naar de prullenmand. Selecteer de berichten door op de selectievakjes te klikken, selecteer dan de actie die je wil uitvoeren via het bulkacties menu en klik op toepassen." + +#: wp-admin/upload.php:236 wp-admin/users.php:66 wp-admin/edit.php:261 +msgid "Available Actions" +msgstr "Beschikbare acties" + +#: wp-admin/edit.php:249 +msgid "You can customize the display of this screen’s contents in a number of ways:" +msgstr "Je kunt de weergave van de inhoud van dit scherm op een aantal manieren aanpassen:" + +#: wp-admin/users.php:41 wp-admin/edit.php:247 +msgid "Screen Content" +msgstr "Scherminhoud" + +#: wp-admin/edit.php:241 +msgid "This screen provides access to all of your posts. You can customize the display of this screen to suit your workflow." +msgstr "Dit scherm geeft je toegang tot al je berichten. Je kunt de weergave van dit scherm aanpassen." + +#. translators: %s: URL to Add Plugins screen. +#: wp-admin/import.php:228 +msgid "If the importer you need is not listed, search the plugin directory to see if an importer is available." +msgstr "Als de importer zich niet in de lijst bevindt, zoek in de Plugin Directory, misschien is daar de importer beschikbaar." + +#: wp-admin/edit-comments.php:181 +msgid "Moderating Comments" +msgstr "Reacties modereren" + +#. translators: %s: URL to Import screen. +#: wp-admin/tools.php:77 +msgid "If you want to convert your categories to tags (or vice versa), use the Categories and Tags Converter available from the Import screen." +msgstr "Als je de categorieën wilt converteren naar tags (of andersom), gebruik dan de Categorieën en Tags converteermogelijkheid die beschikbaar is via het Importeerscherm." + +#: wp-admin/plugin-install.php:98 +msgid "Adding Plugins" +msgstr "Plugins toevoegen" + +#: wp-admin/themes.php:163 +msgid "Adding Themes" +msgstr "Thema's toevoegen" + +#: wp-admin/user-new.php:283 +msgid "Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content." +msgstr "Abonnees kun reacties lezen/reacties geven/nieuwsbrieven ontvangen, enz. maar ze kunnen geen normale siteberichten schrijven." + +#: wp-admin/user-new.php:285 +msgid "Authors can publish and manage their own posts, and are able to upload files." +msgstr "Auteurs kunnen publiceren en hun eigen berichten beheren, en kunnen ook bestanden uploaden." + +#: wp-admin/user-new.php:281 +msgid "Here is a basic overview of the different user roles and the permissions associated with each one:" +msgstr "Hier is een basisoverzicht van de verschillende gebruikersrollen en de rechten welke met elke rol zijn geassocieerd:" + +#: wp-admin/user-new.php:280 +msgid "User Roles" +msgstr "Gebruikersrollen" + +#: wp-admin/user-new.php:267 +msgid "Remember to click the Add New User button at the bottom of this screen when you are finished." +msgstr "Vergeet niet op de Nieuwe gebruiker toevoegen knop onderaan dit scherm te klikken wanneer je klaar bent." + +#: wp-admin/user-new.php:256 +msgid "To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom." +msgstr "Teneinde een nieuwe gebruiker aan je site toe te voegen, gaarne het formulier op dit scherm invullen en onderaan op de Nieuwe gebruiker toevoegen knop klikken." + +#: wp-admin/options-permalink.php:52 +msgid "Custom Structures" +msgstr "Aan te passen structuren" + +#: wp-admin/options-permalink.php:232 +msgid "Common Settings" +msgstr "Algemene instellingen" + +#: wp-admin/options-permalink.php:23 +msgid "Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change — hence the name permalink." +msgstr "Permalinks zijn de URLs naar de individuele pagina's, siteberichten, categorie en tag archief. Een permalink is het webadres welke wordt gebruikt als link naar je inhoud. De URL moet permanent zijn en nooit wijzigen, vandaar de naam permalink. " + +#: wp-admin/options-writing.php:23 +msgid "You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links." +msgstr "" +"Je kunt inhoud op verschillende manieren plaatsen; dit scherm bevat de instellingen voor elk van hen. De bovenste sectie stuurt de editor in het dashboard aan, terwijl de rest de externe publicatiemethoden aanstuurt.\n" +"Gebruik de documentatielinks voor meer informatie over één van deze methoden." + +#: wp-admin/options-media.php:22 +msgid "Uploading Files allows you to choose the folder and path for storing your uploaded files." +msgstr "Bestanden uploaden laat je de map en het pad kiezen waar de geüploade bestanden worden bewaard." + +#: wp-admin/themes.php:151 +msgid "Installing themes on Multisite can only be done from the Network Admin section." +msgstr "Thema's voor een multisite kunnen alleen via de Netwerk admin-sectie worden geïnstalleerd." + +#: wp-admin/options-general.php:31 +msgid "If you want site visitors to be able to register themselves, as opposed to by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site admin." +msgstr "Als je wilt dat bezoekers van de site zichzelf kunnen registreren, in tegenstelling tot door de sitebeheerder, vink dan de lidmaatschap box aan. Een standaard gebruikersrol kan worden ingesteld voor alle nieuwe gebruikers, ongeacht of ze zelf zijn geregistreerd of zijn geregistreerd door de sitebeheerder." + +#: wp-admin/options-writing.php:45 +msgid "If desired, WordPress will automatically alert various services of your new posts." +msgstr "Indien gewenst, zal WordPress automatisch bericht geven aan verschillende diensten van je berichten." + +#: wp-admin/options-writing.php:33 +msgid "Post Via Email" +msgstr "Bericht via e-mail" + +#: wp-admin/options-discussion.php:24 +msgid "This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation links to get information on what each discussion setting does." +msgstr "Dit scherm bevat vele instellingen voor controle van het beheer en weergave van reacties en houdt verband met je berichten/pagina's. Zoveel, in feite, dat ze hier niet allemaal passen! :) Gebruik de documentatie links om informatie te krijgen over wat elke discussie-instelling doet." + +#: wp-admin/user-edit.php:54 +msgid "You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens." +msgstr "Je kunt je wachtwoord wijzigen, de sneltoetsen inschakelen, het kleurenschema van je Dashboard wijzigen en de WYSIWYG (What-You-See-Is-What-You-Get) editor uitschakelen, en wat andere dingen. Je kunt de toolbar (voorheen adminbar genoemd) verbergen van de voorkant van je site. Deze toolbar kan echter niet verwijderd worden op de dashboardschermen." + +#: wp-admin/widgets.php:110 +msgid "This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar." +msgstr "Deze zijbalk is niet langer beschikbaar en wordt nergens getoond op je site. Verwijder elke onderstaande widget om de inactieve zijbalk volledig te verwijderen." + +#: wp-admin/widgets.php:107 +msgid "Inactive Sidebar (not used)" +msgstr "Inactieve zijbalk (niet gebruikt)" + +#: wp-admin/media-new.php:53 +msgid "Clicking Select Files opens a navigation window showing you files in your operating system. Selecting Open after clicking on the file you want activates a progress bar on the uploader screen." +msgstr "Klikken op Bestanden selecteren opent een navigatiescherm wat je bestanden van je computer toont. Open selecteren nadat je op het bestand geklikt hebt wat je wilt activeren, vervolgens wordt een voortgangsbalk op het uploadscherm getoond." + +#: wp-admin/media-new.php:52 +msgid "Drag and drop your files into the area below. Multiple files are allowed." +msgstr "Versleep je bestanden naar de onderstaande ruimte. Meerdere bestanden zijn toegestaan." + +#: wp-admin/edit-tags.php:256 +msgid "You can assign keywords to your posts using tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another." +msgstr "Je kunt trefwoorden aan je berichten meegeven met gebruik van tags. Anders dan in categorieën hebben tags geen hiërarchie, dit betekent dat er geen relatie hoeft te zijn tussen de ene tag en de andere." + +#: wp-admin/edit-tags.php:254 +msgid "You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts." +msgstr "Je kunt groepen van links maken door gebruik te maken van Linkcategorieën. Linkcategorienamen moeten uniek zijn. Linkcategorieën zijn gescheiden van de categorieën die je gebruikt voor berichten." + +#: wp-admin/widgets.php:74 +msgid "Missing Widgets" +msgstr "Ontbrekende widgets" + +#: wp-admin/widgets.php:64 +msgid "Removing and Reusing" +msgstr "Verwijderen en opnieuw gebruiken" + +#: wp-admin/upload.php:246 +msgid "If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file." +msgstr "Als een mediabestand aan geen enkele inhoud is toegevoegd, zie je dat in de kolom Geüpload naar en kan je op Bijvoegen klikken om een ​​kleine pop-up te openen waarmee je naar bestaande inhoud kunt zoeken en het bestand kunt bijvoegen." + +#: wp-admin/upload.php:238 +msgid "Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file." +msgstr "Hoveren over een rij toont actielinks: Bewerken, Permanent verwijderen en Bekijken. Klikken op Bewerken of klikken op de mediabestandsnaam toont een eenvoudig scherm om de individuele bestandsmetadata te bewerken. Klikken op Permanent verwijderen zal het bestand uit de mediabibliotheek verwijderen (en ook van elk bericht/pagina waar het aan is toegevoegd). Bekijken brengt je naar de schermpagina van het bestand." + +#: wp-admin/upload.php:228 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen." +msgstr "Alle bestanden die geüpload zijn bevinden zich in de mediabibliotheek, met de laatst geüploade bovenaan. Je kunt de Schermopties tab gebruiken om het uiterlijk van het scherm te wijzigen." + +#: wp-admin/edit.php:303 +msgid "You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk actions menu to edit the metadata for multiple pages at once." +msgstr "Je kunt ook dezelfde soorten acties, zoals het specificeren van de lijst met behulp van filter, uitvoeren op een pagina met de actielinks die verschijnen als je over een rij hovert. Of je kan het menu Bulkacties gebruiken om de metadata van meerdere pagina's tegelijk te bewerken." + +#: wp-admin/edit.php:302 +msgid "Managing pages is very similar to managing posts, and the screens can be customized in the same way." +msgstr "Pagina's beheren lijkt erg op Berichten beheren en de schermen kunnen op dezelfde manier worden aangepast." + +#: wp-admin/edit-form-advanced.php:323 wp-admin/edit.php:294 +msgid "Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages." +msgstr "Pagina's zijn gelijk aan berichten omdat ze een titel, tekstinhoud en geassocieerde metadata bevatten. Ze zijn echter verschillend omdat ze geen deel uitmaken van de chronologische sitestream, je kunt het vergelijken met statische berichten. Pagina's hebben geen categorie of tags, maar ze kunnen wel een hiërarchie bevatten. Pagina's kunnen genest worden door er één “Hoofd” te maken van de ander, bij het maken van een groep pagina's." + +#: wp-admin/edit-comments.php:188 +msgid "Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more." +msgstr "Veel mensen maken gebruik van de sneltoetsen om de reacties sneller te modereren. Gebruik de link aan de zijkant voor meer informatie." + +#: wp-admin/edit-comments.php:184 +msgid "In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address." +msgstr "In de Auteur kolom, naast de auteursnaam, het e-mailadres en de site URL, wordt het IP-adres van de afzender getoond. Als je op deze link klikt worden alle reacties getoond die vanaf dit IP-adres gemaakt zijn." + +#: wp-admin/edit-comments.php:175 +msgid "You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions." +msgstr "Je kunt reacties op je site beheren net zoals je berichten en andere inhoud beheert. Dit scherm is aanpasbaar op dezelfde manier als andere beheerschermen, en je kunt ook bij reacties gebruik maken van de on-hover-actielinks of de bulkacties." + +#: wp-admin/index.php:50 +msgid "Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information." +msgstr "De links in de toolbar aan de bovenkant van het scherm verbinden je Dashboard en de voorkant van je site en geven je toegang tot je profiel en handige WordPress informatie." + +#: wp-admin/link-manager.php:70 +msgid "Deleting Links" +msgstr "Links verwijderen" + +#: wp-admin/link-manager.php:63 +msgid "Links may be separated into Link Categories; these are different than the categories used on your posts." +msgstr "Links kunnen gescheiden worden in linkcategorieën; deze zijn anders dan de categorieën die gebruikt worden in je berichten." + +#. translators: 1: URL to About screen, 2: WordPress version. +#: wp-admin/update-core.php:273 +msgid "Learn more about WordPress %2$s." +msgstr "Meer informatie over WordPress %2$s." + +#: wp-admin/users.php:53 +msgid "Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username." +msgstr "Bewerken brengt je naar het bewerkscherm van deze gebruiker. Je kunt dat scherm ook bereiken door op de gebruikersnaam te klikken." + +#: wp-admin/users.php:51 +msgid "Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:" +msgstr "Hoveren over een rij in de gebruikerslijst toont actielinks die je toestaan gebruikers te beheren. Je hebt de keuze uit de volgende acties:" + +#: wp-admin/users.php:46 +msgid "You can view all posts made by a user by clicking on the number under the Posts column." +msgstr "Je kunt alle berichten gemaakt door een gebruiker bekijken door te klikken op het getal onder de berichtenkolom." + +#: wp-admin/users.php:44 +msgid "You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab." +msgstr "Je kunt kolommen verbergen/weergeven op basis van je behoeften en beslissen hoeveel gebruikers per scherm worden getoond met behulp van de Schermopties tab." + +#: wp-admin/edit.php:300 +msgid "Managing Pages" +msgstr "Pagina's beheren" + +#: wp-admin/edit.php:268 +msgid "Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status." +msgstr "Voorbeeld toont hoe je concept-bericht eruit ziet als je het gaat publiceren. Bekijken brengt je naar de voorkant van de site om je bericht te bekijken. Welke link beschikbaar is hangt af van de berichtstatus." + +#: wp-admin/edit.php:267 +msgid "Trash removes your post from this list and places it in the Trash, from which you can permanently delete it." +msgstr "Verwijderen verwijdert je bericht van deze lijst en plaatst het in de prullenbak, van waaruit je het permanent kunt verwijderen." + +#: wp-admin/edit.php:266 +msgid "Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen." +msgstr "Snel bewerken geeft toegang tot de metadata van je bericht en laat je de berichtdetails updaten zonder dit scherm te verlaten." + +#: wp-admin/edit.php:265 +msgid "Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title." +msgstr "Bewerken brengt je naar het bewerkscherm van dat bericht. Je kunt dat scherm ook bereiken door op de berichttitel te klikken." + +#: wp-admin/user-new.php:259 +msgid "Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users." +msgstr "Omdat dit een multisite installatie is, kun je accounts toevoegen die al bestaan op het netwerk door een gebruikersnaam of e-mail te specificeren en een rol toe te wijzen. Voor meer opties, zoals een wachtwoord instellen moet je een netwerkbeheerder zijn en de hover link onder een bestaande gebruiksnaam klikken om het gebruikersprofiel te bewerken via Netwerk Beheer -> Alle gebruikers." + +#. translators: %s: The current WordPress version number. +#: wp-admin/about.php:58 +msgid "Welcome to WordPress %s." +msgstr "Welkom bij WordPress %s." + +#: wp-admin/about.php:292 +msgid "Go to Dashboard → Home" +msgstr "Ga naar Dashboard → Home" + +#: wp-admin/about.php:289 +msgid "Go to Dashboard → Updates" +msgstr "Ga naar Dashboard → Updates" + +#: wp-admin/credits.php:75 +msgid "WordPress is created by a worldwide team of passionate individuals." +msgstr "WordPress is gemaakt door een wereldwijd team van enthousiaste en gepassioneerde mensen." + +#: wp-admin/about.php:221 +msgid "For developers" +msgstr "Voor ontwikkelaars" + +#: wp-admin/includes/dashboard.php:1914 wp-admin/includes/dashboard.php:1916 +msgid "Customize Your Site" +msgstr "Thema wijzigen en aanpassen" + +#: wp-admin/user-edit.php:200 +msgid "Profile updated." +msgstr "Profiel bijgewerkt." + +#. translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. +#: wp-admin/user-new.php:116 +msgid "" +"Hi,\n" +"\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"\n" +"Please click the following link to confirm the invite:\n" +"%4$s" +msgstr "" +"Hallo,\n" +"\n" +"Je bent uitgenodigd om mee te doen met de site '%1$s' op\n" +"%2$s met de rol van %3$s.\n" +"\n" +"Klik op de volgende link om de uitnodiging te bevestigen:\n" +"%4$s" + +#: wp-admin/credits.php:155 +msgid "Core Developer" +msgstr "Ontwikkelaar" + +#: wp-admin/includes/class-plugin-upgrader.php:440 +msgid "No valid plugins were found." +msgstr "Er zijn geen geldige plugins gevonden." + +#: wp-admin/includes/class-plugin-upgrader.php:82 +msgid "The plugin contains no files." +msgstr "De plugin bevat geen bestanden." + +#: wp-admin/includes/class-wp-upgrader.php:164 +msgid "The package could not be installed." +msgstr "Het pakket kon niet geïnstalleerd worden." + +#: wp-admin/includes/media.php:1253 +msgid "Attachment Post URL" +msgstr "URL van bijlagebericht" + +#: wp-admin/menu.php:81 +msgctxt "admin menu" +msgid "All Links" +msgstr "Alle links" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/plugin-install.php:310 +msgid "%s plugins" +msgstr "%s plugins" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/plugin-install.php:308 +msgid "%s plugin" +msgstr "%s plugin" + +#. translators: 1: Table name. 2: Error message. +#: wp-admin/maint/repair.php:136 +msgid "Failed to optimize the %1$s table. Error: %2$s" +msgstr "Mislukt om de %1$s tabel te optimaliseren. Fout: %2$s" + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:133 +msgid "Successfully optimized the %s table." +msgstr "%s tabel is geoptimaliseerd." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:126 +msgid "The %s table is already optimized." +msgstr "De %s tabel is al geoptimaliseerd." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:111 +msgid "Successfully repaired the %s table." +msgstr "De %s tabel is hersteld." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:101 +msgid "The %s table is okay." +msgstr "De %s tabel is oké." + +#. translators: %s: Plugin version. +#: wp-admin/update-core.php:529 +msgid "View version %s details." +msgstr "Details van versie %s bekijken." + +#: wp-admin/includes/import.php:220 +msgid "Tumblr" +msgstr "Tumblr" + +#. translators: 1: Browser update URL, 2: Browser name, 3: Browse Happy URL. +#: wp-admin/includes/dashboard.php:1640 +msgid "Update %2$s or learn how to browse happy" +msgstr "%2$s bijwerken of leer hoe je goed en veilig kunt bladeren" + +#. translators: 1: Link start tag, 2: Link end tag, 3: Width, 4: Height. +#: wp-admin/includes/media.php:3068 +msgid "Scale images to match the large size selected in %1$simage options%2$s (%3$d × %4$d)." +msgstr "Afbeeldingen schalen om te laten overeenkomen met het grote formaat zoals geselecteerd in de %1$s afbeeldingsopties %2$s (%3$d × %4$d)." + +#: wp-admin/includes/media.php:2927 +msgid "Audio, Video, or Other File" +msgstr "Audio, video, of een ander bestand" + +#: wp-admin/includes/media.php:2399 +msgid "Insert media from another website" +msgstr "Media toevoegen vanaf andere site" + +#: wp-admin/includes/file.php:2127 +msgid "Error: Could not connect to the server. Please verify the settings are correct." +msgstr "Fout: Kon niet verbinden met de server, controleer of de instellingen juist zijn." + +#: wp-admin/index.php:62 +msgid "Drag and Drop — To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box." +msgstr "Verslepen - Om de boxen te herschikken, versleep ze door te klikken op de titelbalk van de geselecteerde box. Wanneer je een grijze stippellijn ziet verschijnen op de plaats waar je de box wilt plaatsen kun je de muisknop loslaten." + +#: wp-admin/index.php:60 +msgid "You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well." +msgstr "Je kunt de volgende besturingselementen gebruiken om je dashboardscherm aan je workflow aan te passen. Dit geldt ook voor de meeste andere beheerderschermen." + +#: wp-admin/index.php:55 +msgid "Navigation" +msgstr "Navigatie" + +#: wp-admin/index.php:49 +msgid "The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimize this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom." +msgstr "Het navigatiemenu aan de linkerkant geeft links naar alle WordPress dashboardschermen, met submenu-items die worden getoond als je er overheen hovert. Je kunt dit menu verkleinen naar een smalle strip met pictogrammen door te klikken op de 'Menu invouwen' pijl aan de onderkant." + +#: wp-admin/options-reading.php:24 wp-admin/edit-tags.php:268 +#: wp-admin/link-manager.php:56 wp-admin/options-writing.php:22 +#: wp-admin/includes/class-custom-background.php:88 +#: wp-admin/includes/ms.php:1135 wp-admin/includes/class-wp-screen.php:853 +#: wp-admin/includes/class-custom-image-header.php:97 wp-admin/my-sites.php:43 +#: wp-admin/options-general.php:41 wp-admin/comment.php:61 +#: wp-admin/theme-editor.php:27 wp-admin/plugin-editor.php:124 +#: wp-admin/nav-menus.php:609 wp-admin/nav-menus.php:650 +#: wp-admin/update-core.php:930 wp-admin/options-permalink.php:22 +#: wp-admin/user-new.php:272 wp-admin/index.php:42 wp-admin/plugins.php:543 +#: wp-admin/themes.php:142 wp-admin/edit-comments.php:173 wp-admin/media.php:85 +#: wp-admin/revision.php:150 wp-admin/upload.php:54 wp-admin/upload.php:226 +#: wp-admin/edit-form-advanced.php:344 wp-admin/import.php:23 +#: wp-admin/widgets.php:55 wp-admin/options-media.php:30 +#: wp-admin/edit-link-form.php:66 wp-admin/user-edit.php:64 +#: wp-admin/users.php:32 wp-admin/media-new.php:48 +#: wp-admin/theme-install.php:112 wp-admin/options-discussion.php:23 +#: wp-admin/edit.php:239 wp-admin/edit.php:292 wp-admin/plugin-install.php:84 +#: wp-admin/export.php:49 wp-admin/network/user-new.php:20 +#: wp-admin/network/index.php:33 wp-admin/network/themes.php:297 +#: wp-admin/network/upgrade.php:21 wp-admin/network/users.php:217 +#: wp-admin/network/site-new.php:23 wp-admin/network/settings.php:48 +#: wp-admin/network/sites.php:28 +msgid "Overview" +msgstr "Overzicht" + +#. translators: %s: Number of pending updates. +#. translators: %s: Number of available updates. +#: wp-admin/menu.php:49 wp-admin/network/menu.php:30 +msgid "Updates %s" +msgstr "Updates %s" + +#: wp-admin/menu.php:242 wp-admin/network/menu.php:105 +msgid "Installed Plugins" +msgstr "Geïnstalleerde plugins" + +#. translators: %s: Number of pending plugin updates. +#. translators: %s: Number of available plugin updates. +#: wp-admin/menu.php:240 wp-admin/network/menu.php:88 +msgid "Plugins %s" +msgstr "Plugins %s" + +#: wp-admin/menu.php:260 wp-admin/network/menu.php:56 +msgid "All Users" +msgstr "Alle gebruikers" + +#: wp-admin/user-edit.php:231 wp-admin/users.php:566 wp-admin/menu.php:262 +#: wp-admin/menu.php:264 wp-admin/network/users.php:276 +#: wp-admin/network/menu.php:57 +msgctxt "user" +msgid "Add New" +msgstr "Nieuwe toevoegen" + +#: wp-admin/includes/ms.php:987 wp-admin/users.php:345 +msgid "Confirm Deletion" +msgstr "Verwijdering bevestigen" + +#: wp-admin/includes/class-wp-users-list-table.php:359 +#: wp-admin/user-new.php:442 wp-admin/user-new.php:603 +#: wp-admin/user-edit.php:414 wp-admin/network/site-users.php:312 +#: wp-admin/network/site-users.php:350 +msgid "Role" +msgstr "Rol" + +#: wp-admin/user-new.php:372 wp-admin/user-new.php:411 +#: wp-admin/user-new.php:472 wp-admin/network/site-users.php:303 +msgid "Add Existing User" +msgstr "Bestaande gebruiker toevoegen" + +#: wp-admin/includes/dashboard.php:473 wp-admin/includes/dashboard.php:475 +#: wp-admin/users.php:589 wp-admin/network/site-users.php:279 +#: wp-admin/network/users.php:296 +msgid "Search Users" +msgstr "Gebruikers zoeken" + +#: wp-admin/users.php:526 wp-admin/network/site-users.php:260 +msgid "User removed from this site." +msgstr "Gebruiker verwijderd van deze site." + +#: wp-admin/users.php:515 wp-admin/network/site-users.php:254 +msgid "Changed roles." +msgstr "Rollen gewijzigd." + +#: wp-admin/users.php:359 wp-admin/users.php:391 +msgid "You can’t remove users." +msgstr "Je kunt gebruikers niet verwijderen." + +#: wp-admin/comment.php:166 wp-admin/theme-editor.php:305 +#: wp-admin/plugins.php:342 wp-admin/plugins.php:348 +#: wp-admin/includes/network.php:444 wp-admin/includes/network.php:452 +#: wp-admin/includes/network.php:460 wp-admin/network/themes.php:137 +#: wp-admin/network/themes.php:141 +msgid "Caution:" +msgstr "Waarschuwing:" + +#: wp-admin/user-new.php:248 wp-admin/user-new.php:370 +#: wp-admin/user-new.php:479 wp-admin/user-new.php:631 wp-admin/menu.php:272 +#: wp-admin/menu.php:274 wp-admin/network/user-new.php:101 +#: wp-admin/network/user-new.php:107 wp-admin/network/site-users.php:337 +#: wp-admin/network/site-users.php:364 +msgid "Add New User" +msgstr "Nieuwe gebruiker toevoegen" + +#: wp-admin/user-new.php:361 wp-admin/network/user-new.php:91 +#: wp-admin/network/site-users.php:242 wp-admin/network/users.php:262 +msgid "User added." +msgstr "Gebruikers toegevoegd." + +#: wp-admin/includes/class-wp-terms-list-table.php:507 +#: wp-admin/includes/class-wp-users-list-table.php:469 +#: wp-admin/includes/class-wp-media-list-table.php:723 +#: wp-admin/includes/class-wp-media-list-table.php:781 +#: wp-admin/includes/class-wp-posts-list-table.php:1406 +#: wp-admin/includes/dashboard.php:752 +#: wp-admin/includes/class-wp-ms-users-list-table.php:412 +msgid "View" +msgstr "Bekijken" + +#: wp-admin/includes/class-wp-users-list-table.php:438 +#: wp-admin/user-edit.php:437 +#: wp-admin/includes/class-wp-ms-users-list-table.php:285 +msgid "Super Admin" +msgstr "Superbeheerder" + +#. translators: %s: Plugin version number. +#. translators: %s: Theme version number. +#. translators: %s: WordPress version. +#. translators: %s: Plugin version. +#. translators: %s: Theme version. +#: wp-admin/includes/class-wp-debug-data.php:899 +#: wp-admin/includes/class-wp-debug-data.php:946 +#: wp-admin/includes/class-wp-debug-data.php:1269 +#: wp-admin/includes/class-wp-plugins-list-table.php:1022 +#: wp-admin/includes/update.php:231 wp-admin/includes/update.php:276 +#: wp-admin/includes/ajax-actions.php:4443 +#: wp-admin/includes/ajax-actions.php:4486 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:713 +msgid "Version %s" +msgstr "Versie: %s" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:554 +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "Update beschikbaar (%s)" +msgstr[1] "Updates beschikbaar (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:605 +#: wp-admin/includes/class-wp-plugins-list-table.php:833 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:700 +msgid "Deactivate" +msgstr "Deactiveren" + +#: wp-admin/includes/class-wp-links-list-table.php:88 +#: wp-admin/includes/class-wp-links-list-table.php:336 +#: wp-admin/includes/class-wp-themes-list-table.php:233 +#: wp-admin/includes/theme.php:992 +#: wp-admin/includes/class-wp-plugins-list-table.php:614 +#: wp-admin/includes/class-wp-plugins-list-table.php:812 +#: wp-admin/includes/class-wp-plugins-list-table.php:866 +#: wp-admin/includes/meta-boxes.php:1079 +#: wp-admin/includes/class-wp-terms-list-table.php:164 +#: wp-admin/includes/class-wp-terms-list-table.php:498 +#: wp-admin/includes/class-wp-users-list-table.php:273 +#: wp-admin/includes/class-wp-users-list-table.php:455 +#: wp-admin/includes/media.php:1726 wp-admin/includes/widgets.php:295 +#: wp-admin/includes/template.php:645 wp-admin/themes.php:633 +#: wp-admin/themes.php:1120 wp-admin/widgets.php:351 +#: wp-admin/edit-tag-form.php:278 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:290 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:716 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:479 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:630 +#: wp-admin/includes/class-wp-ms-users-list-table.php:115 +#: wp-admin/includes/class-wp-ms-users-list-table.php:514 +msgid "Delete" +msgstr "Verwijderen" + +#: wp-admin/ms-delete-site.php:38 wp-admin/menu.php:286 +msgid "Delete Site" +msgstr "Site verwijderen" + +#. translators: %s: Plugin name. +#: wp-admin/includes/theme.php:1003 +#: wp-admin/includes/class-wp-theme-install-list-table.php:483 +#: wp-admin/includes/deprecated.php:1383 wp-admin/theme-install.php:388 +#: wp-admin/theme-install.php:425 wp-admin/includes/network.php:374 +msgid "Install" +msgstr "Installeren" + +#: wp-admin/my-sites.php:58 wp-admin/options-head.php:15 +#: wp-admin/options.php:335 wp-admin/network/settings.php:141 +#: wp-admin/network/sites.php:351 +msgid "Settings saved." +msgstr "Instellingen opgeslagen." + +#: wp-admin/options-reading.php:51 wp-admin/edit-tags.php:304 +#: wp-admin/link-manager.php:77 wp-admin/options-writing.php:51 +#: wp-admin/includes/class-custom-background.php:98 +#: wp-admin/includes/ms.php:1157 +#: wp-admin/includes/class-custom-image-header.php:133 wp-admin/my-sites.php:50 +#: wp-admin/options-general.php:47 wp-admin/comment.php:69 +#: wp-admin/theme-editor.php:50 wp-admin/plugin-editor.php:141 +#: wp-admin/nav-menus.php:657 wp-admin/update-core.php:968 +#: wp-admin/options-permalink.php:59 wp-admin/user-new.php:293 +#: wp-admin/index.php:110 wp-admin/plugins.php:586 wp-admin/themes.php:205 +#: wp-admin/edit-comments.php:193 wp-admin/media.php:95 +#: wp-admin/revision.php:155 wp-admin/upload.php:74 wp-admin/upload.php:251 +#: wp-admin/edit-form-advanced.php:318 wp-admin/edit-form-advanced.php:335 +#: wp-admin/edit-form-advanced.php:354 wp-admin/tools.php:54 +#: wp-admin/import.php:30 wp-admin/widgets.php:82 wp-admin/options-media.php:36 +#: wp-admin/edit-link-form.php:75 wp-admin/user-edit.php:70 +#: wp-admin/users.php:73 wp-admin/media-new.php:59 +#: wp-admin/theme-install.php:130 wp-admin/options-discussion.php:30 +#: wp-admin/edit.php:283 wp-admin/edit.php:308 wp-admin/plugin-install.php:108 +#: wp-admin/export.php:56 wp-admin/network.php:65 wp-admin/network.php:78 +#: wp-admin/network/user-new.php:28 wp-admin/network/index.php:54 +#: wp-admin/network/themes.php:322 wp-admin/network/upgrade.php:30 +#: wp-admin/network/users.php:229 wp-admin/network/site-new.php:31 +#: wp-admin/network/settings.php:62 wp-admin/network/sites.php:44 +msgid "For more information:" +msgstr "Voor meer informatie:" + +#: wp-admin/edit-form-advanced.php:329 +msgid "About Pages" +msgstr "Over pagina's" + +#: wp-admin/edit-form-advanced.php:307 +msgid "Title and Post Editor" +msgstr "Titel- en bericht-editor" + +#: wp-admin/edit-form-advanced.php:287 +msgid "Customizing This Display" +msgstr "Dit scherm aanpassen" + +#: wp-admin/options-reading.php:186 wp-admin/install.php:193 +msgid "Note: Neither of these options blocks access to your site — it is up to search engines to honor your request." +msgstr "Opmerking: geen van deze opties blokkeert de toegang tot je site — het is aan de zoekmachines om gehoor te geven aan dit verzoek." + +#: wp-admin/options-permalink.php:251 +msgid "Post name" +msgstr "Berichtnaam" + +#: wp-admin/options-permalink.php:240 wp-admin/options-permalink.php:244 +#: wp-admin/options-permalink.php:252 +msgctxt "sample permalink structure" +msgid "sample-post" +msgstr "voorbeeld-bericht" + +#: wp-admin/options-permalink.php:228 wp-admin/options-permalink.php:248 +msgctxt "sample permalink base" +msgid "archives" +msgstr "archieven" + +#. translators: %s: URL to Import screen on the main site. +#: wp-admin/import.php:165 +msgid "This importer is not installed. Please install importers from the main site." +msgstr "De importeerfunctie is niet geïnstalleerd. Installeer de importeerfuncties vanaf de hoofdsite." + +#: wp-admin/includes/class-wp-debug-data.php:72 +#: wp-admin/options-general.php:166 wp-admin/network/site-new.php:233 +msgid "Site Language" +msgstr "Site taal" + +#: wp-admin/options-discussion.php:50 +msgid "Attempt to notify any blogs linked to from the post" +msgstr "Probeer elk ander blog gelinkt in dit bericht een melding te sturen" + +#. translators: 1: Site title, 2: Site URL, 3: User role. +#: wp-admin/includes/user.php:582 +msgid "" +"Hi,\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"If you do not want to join this site please ignore\n" +"this email. This invitation will expire in a few days.\n" +"\n" +"Please click the following link to activate your user account:\n" +"%%s" +msgstr "" +"Hallo,\n" +"Je bent uitgenodigd mee te doen met '%1$s' op\n" +"%2$s met de rol %3$s.\n" +"Als je niet wilt meedoen met deze site negeer \n" +"deze e-mail. Deze uitnodiging vervalt binnen een paar dagen.\n" +"\n" +"Klik op de volgende link om je gebruikersaccount te activeren:\n" +"%%s" + +#: wp-admin/includes/theme.php:316 wp-admin/includes/meta-boxes.php:494 +msgid "Post Formats" +msgstr "Bericht formats" + +#: wp-admin/includes/theme.php:315 +msgid "Full Width Template" +msgstr "Volledige breedte template" + +#: wp-admin/includes/theme.php:312 +msgid "Featured Images" +msgstr "Uitgelichte afbeeldingen" + +#: wp-admin/includes/theme.php:311 +msgid "Featured Image Header" +msgstr "Uitgelichte kopafbeelding" + +#. translators: %s: Browser name and link. +#: wp-admin/includes/dashboard.php:1618 +msgid "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." +msgstr "Het lijkt erop dat je een oude versie van %s gebruikt. Graag je browser bijwerken voor de beste WordPress ervaring." + +#. translators: %s: Browser name and link. +#: wp-admin/includes/dashboard.php:1612 +msgid "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." +msgstr "Het lijkt erop dat je een oude versie van %s gebruikt. Het gebruiken van een gedateerde browser maakt je computer onveilig. Werk nu je browser bij voor de beste WordPress ervaring." + +#: wp-admin/includes/nav-menu.php:1081 +msgid "There are some invalid menu items. Please check or delete them." +msgstr "Er zijn enkele ongeldige menu onderdelen. Corrigeer deze of verwijder ze." + +#: wp-admin/edit-tags.php:445 +#: wp-admin/includes/class-wp-terms-list-table.php:187 +#: wp-admin/includes/class-wp-terms-list-table.php:651 +#: wp-admin/edit-tag-form.php:132 +msgctxt "term name" +msgid "Name" +msgstr "Naam" + +#: wp-admin/includes/template.php:571 wp-admin/includes/template.php:586 +#: wp-admin/includes/template.php:718 +msgctxt "meta name" +msgid "Name" +msgstr "Naam" + +#: wp-admin/themes.php:584 +msgctxt "theme name" +msgid "Name" +msgstr "Naam" + +#. translators: %s: Theme Directory URL. +#: wp-admin/theme-install.php:98 +msgid "You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses." +msgstr "Extra thema''s voor je site kun je vinden door gebruik te maken van de Thema Browser/Installer op dit scherm. Deze laat de thema''s zien van de WordPress Thema Directory. Deze thema''s zijn vormgegeven en ontwikkeld door derden en zijn gratis beschikbaar en compatibel met de licentie die WordPress gebruikt." + +#. translators: %s: WordPress Plugin Directory URL. +#: wp-admin/plugins.php:549 +msgid "If you would like to see more plugins to choose from, click on the “Add New” button and you will be able to browse or search for additional plugins from the WordPress Plugin Directory. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "Als je meer plugins wil zien om uit te kiezen, klik op de “Nieuwe plugin” knop. Je kunt dan bladeren door of zoeken naar aanvullende plugins uit de WordPress Plugin Directory. Plugins in de WordPress Plugin Directory zijn ontworpen en ontwikkeld door derden en zijn compatibel met de licentie die WordPress gebruikt. Oh, en ze zijn gratis!" + +#: wp-admin/update-core.php:70 +msgid "Re-install Now" +msgstr "Nu opnieuw installeren" + +#. translators: %s: MAX_FILE_SIZE +#: wp-admin/includes/file.php:793 +msgid "The uploaded file exceeds the %s directive that was specified in the HTML form." +msgstr "Het geüploade bestand overschrijdt de %s aanwijzing die staat aangegeven in het HTML formulier." + +#: wp-admin/credits.php:156 +msgid "External Libraries" +msgstr "Externe bibliotheken" + +#: wp-admin/menu.php:289 wp-admin/network.php:52 wp-admin/network/menu.php:112 +msgid "Network Setup" +msgstr "Netwerk instellen" + +#: wp-admin/menu.php:279 +msgid "Available Tools" +msgstr "Beschikbare hulpmiddelen" + +#: wp-admin/includes/credits.php:104 +msgctxt "Translate this to be the equivalent of English Translators in your language for the credits page Translators section" +msgid "Translators" +msgstr "Vertalers" + +#. translators: 1: URL to Plugins screen, 2: URL to Themes screen, 3: +#. https://wordpress.org/about/license +#: wp-admin/freedoms.php:115 +msgid "Every plugin and theme in WordPress.org’s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress license, we don’t recommend them." +msgstr "Elke plugin en elk thema in de WordPress.org’s directory is 100%% GPL of heeft een gelijkwaardige gratis en compatibele licentie. Dus je kunt daar veilig plugins en thema's vinden. Als je een plugin of thema vanaf een andere bron krijgt, vraag ze eerst of het een GPL is. Als ze de WordPress licentie niet respecteren, bevelen we ze niet aan." + +#. translators: %s: https://wordpressfoundation.org/trademark-policy +#: wp-admin/freedoms.php:103 +msgid "WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We’re flattered every time someone spreads the good word, just make sure to check out our trademark guidelines first." +msgstr "WordPress groeit als mensen zoals jij erover vertellen aan hun vrienden, en de duizenden bedrijven en services die gebouwd zijn met en rond WordPress dit delen (en te kennen geven) met hun gebruikers. We voelen ons iedere keer vereerd als de naam WordPress gebruikt en verspreid wordt. Bekijk eerst onze handelsmerken richtlijnen." + +#. translators: %s: https://wordpress.org/about/license +#: wp-admin/freedoms.php:65 +msgid "WordPress is Free and open source software, built by a distributed community of mostly volunteer developers from around the world. WordPress comes with some awesome, worldview-changing rights courtesy of its license, the GPL." +msgstr "WordPress is vrije en open software, gebouwd door een gedistribueerde community van veelal ontwikkelaars die zich vrijwillig inzetten van over de hele wereld. WordPress wordt geleverd met een aantal geweldige, wereldbeeld veranderende rechten, dankzij de licentie van de GPL." + +#: wp-admin/menu.php:109 +msgid "All Comments" +msgstr "Alle reacties" + +#: wp-admin/credits.php:151 +msgid "Lead Developer" +msgstr "Hoofdontwikkelaar" + +#: wp-admin/credits.php:150 +msgid "Cofounder, Project Lead" +msgstr "Mede-oprichter, projectleider" + +#. translators: %s: The current WordPress version number. +#: wp-admin/credits.php:148 +msgid "Core Contributors to WordPress %s" +msgstr "Core bijdragers aan WordPress %s" + +#: wp-admin/credits.php:146 +msgid "Project Leaders" +msgstr "Projectleiders" + +#. translators: %s: https://make.wordpress.org +#: wp-admin/credits.php:81 +msgid "Want to see your name in lights on this page? Get involved in WordPress." +msgstr "Wil je je naam uitgelicht zien staan op deze pagina? Zorg er dan voor dat je betrokken raakt bij WordPress." + +#. translators: 1: https://wordpress.org/about/, 2: https://make.wordpress.org +#: wp-admin/credits.php:65 +msgid "WordPress is created by a worldwide team of passionate individuals. Get involved in WordPress." +msgstr "WordPress is gemaakt door een wereldwijd team van gepassioneerde individuen. Help mee aan WordPress." + +#: wp-admin/credits.php:13 wp-admin/credits.php:49 wp-admin/credits.php:57 +#: wp-admin/privacy.php:46 wp-admin/freedoms.php:52 wp-admin/about.php:47 +msgid "Credits" +msgstr "Credits" + +#: wp-admin/widgets.php:445 +msgctxt "removing-widget" +msgid "Deactivate" +msgstr "Deactiveren" + +#: wp-admin/includes/dashboard.php:34 +msgid "Your browser is out of date!" +msgstr "Je browser is verouderd!" + +#: wp-admin/includes/dashboard.php:32 +msgid "You are using an insecure browser!" +msgstr "Je maakt gebruik van een onveilige browser." + +#: wp-admin/freedoms.php:123 +msgid "Don’t you wish all software came with these freedoms? So do we! For more information, check out the Free Software Foundation." +msgstr "Zou je het niet geweldig vinden als alle software deze vrijheden biedt? Wij in ieder geval wel. Voor meer informatie, ga naar: Free Software Foundation." + +#: wp-admin/credits.php:50 wp-admin/privacy.php:47 wp-admin/freedoms.php:18 +#: wp-admin/freedoms.php:53 wp-admin/freedoms.php:59 wp-admin/about.php:48 +msgid "Freedoms" +msgstr "Vrijheden" + +#: wp-admin/includes/class-custom-image-header.php:665 +msgid "You can use one of these cool headers or show a random one on each page." +msgstr "Je kunt één van deze coole afbeeldingen gebruiken of deze willekeurig tonen op elke pagina." + +#: wp-admin/includes/class-custom-image-header.php:663 +msgid "If you don‘t want to upload your own image, you can use one of these cool headers, or show a random one." +msgstr "Als je geen eigen afbeelding wilt uploaden, kun je één van deze fantastische afbeeldingen gebruiken of een willekeurige laten tonen." + +#: wp-admin/includes/class-custom-image-header.php:649 +msgid "You can choose one of your previously uploaded headers, or show a random one." +msgstr "Je kunt een van je eerder geüploade headers kiezen of een willekeurige weergeven." + +#: wp-admin/menu-header.php:280 +msgid "Collapse menu" +msgstr "Menu invouwen" + +#: wp-admin/includes/class-custom-image-header.php:647 +msgid "Uploaded Images" +msgstr "Geüploade afbeeldingen" + +#: wp-admin/includes/class-custom-image-header.php:294 +msgid "Random: Show a different image on each page." +msgstr "Willekeurig: Toon een andere afbeelding op iedere pagina." + +#: wp-admin/includes/theme.php:321 wp-admin/includes/theme.php:357 +#: wp-admin/includes/class-wp-screen.php:1207 wp-admin/index.php:68 +msgid "Layout" +msgstr "Lay-out" + +#: wp-admin/users.php:282 +msgid "You have specified this user for deletion:" +msgstr "Je hebt deze gebruiker gemarkeerd om te verwijderen:" + +#. translators: 1: Current page, 2: Total pages. +#: wp-admin/includes/class-wp-list-table.php:948 +msgctxt "paging" +msgid "%1$s of %2$s" +msgstr "%1$s van %2$s" + +#. translators: %s: Template name. +#: wp-admin/includes/file.php:92 +msgid "%s Page Template" +msgstr "%s Paginatemplate" + +#: wp-admin/includes/ajax-actions.php:4548 wp-admin/plugins.php:622 +msgid "You cannot delete a plugin while it is active on the main site." +msgstr "Het is niet mogelijk een plugin te verwijderen die actief is op de hoofdsite." + +#: wp-admin/plugins.php:342 +msgid "This plugin may be active on other sites in the network." +msgstr "Deze plugin kan actief zijn op andere sites in het netwerk." + +#: wp-admin/options-writing.php:98 +msgid "Default Post Format" +msgstr "Standaard berichtformat" + +#: wp-admin/user-edit.php:233 wp-admin/users.php:568 +msgctxt "user" +msgid "Add Existing" +msgstr "Bestaande toevoegen" + +#: wp-admin/theme-editor.php:45 wp-admin/plugin-editor.php:136 +msgid "Any edits to files from this screen will be reflected on all sites in the network." +msgstr "De bewerkingen op bestanden van dit scherm zullen worden weergegeven op alle sites van het netwerk." + +#: wp-admin/users.php:33 +msgid "This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role." +msgstr "Dit scherm geeft een overzicht van alle bestaande gebruikers voor je site. Elke gebruiker heeft één van vijf gedefinieerde rollen zoals vastgesteld door de sitebeheerder: Site beheerder, redacteur, auteur, bijdrager, of abonnee. Gebruikers met rollen anders dan beheerder zien minder mogelijkheden in de dashboard navigatie wanneer ze zijn ingelogd, gebaseerd op hun rol." + +#: wp-admin/plugin-editor.php:135 +msgid "If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below." +msgstr "Als je wijzigingen wilt maken, maar je wilt niet dat het overschreven wordt wanneer de plugin wordt bijgewerkt, kun je overwegen om een eigen plugin te schrijven. Voor informatie hoe je plugins kunt bewerken, een plugin kunt schrijven vanaf 0, of om de anatomie te begrijpen, klik op de onderstaande links." + +#: wp-admin/index.php:73 +msgid "The boxes on your Dashboard screen are:" +msgstr "De boxen op je Dashboardscherm zijn:" + +#. translators: Default page slug. +#: wp-admin/includes/upgrade.php:337 +msgid "sample-page" +msgstr "voorbeeld-pagina" + +#: wp-admin/includes/upgrade.php:335 +msgid "Sample Page" +msgstr "Voorbeeld pagina" + +#: wp-admin/options-discussion.php:281 +msgid "Retro (Generated)" +msgstr "Retro (Gegenereerd)" + +#. translators: %s: URL to Themes tab on Edit Site screen. +#: wp-admin/includes/class-wp-themes-list-table.php:111 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes." +msgstr "Je hebt nu maar 1 thema geactiveerd voor deze site. Bezoek de netwerk Admin om meer thema's aan te zetten." + +#. translators: 1: URL to Themes tab on Edit Site screen, 2: URL to Add Themes +#. screen. +#: wp-admin/includes/class-wp-themes-list-table.php:102 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable or install more themes." +msgstr "Je hebt maar ßßn thema geactiveerd voor deze site nu. Bezoek de netwerk Admin om meer thema's aan te zetten of installeer meer thema's." + +#: wp-admin/user-edit.php:442 +msgid "Super admin privileges cannot be removed because this user has the network admin email." +msgstr "Super beheer privileges kunnen niet verwijderd worden omdat deze gebruiker de eigenaar is van netwerkbeheer e-mail." + +#. translators: %s: URL to Add Themes screen. +#: wp-admin/includes/class-wp-themes-list-table.php:122 +msgid "You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress Theme Directory at any time: just click on the Install Themes tab above." +msgstr "Je hebt op dit moment slechts één thema geïnstalleerd. Kom op, leef je uit. Je kunt kiezen uit meer dan 1000 gratis thema's bij de WordPress Thema Directory. Je hoeft alleen maar op de tab Thema's Installeren hierboven te klikken." + +#: wp-admin/maint/repair.php:162 +msgid "One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the “Repair Database” button. Repairing can take a while, so please be patient." +msgstr "Eén of meer database tabellen zijn niet beschikbaar. Om WordPress toestemming te geven deze tabellen te repareren, klik op de “Database repareren” knop. Repareren kan even duren, dus wees geduldig." + +#: wp-admin/includes/file.php:55 +msgid "Visual Editor RTL Stylesheet" +msgstr "Visuele editor RTL-stylesheet" + +#: wp-admin/theme-editor.php:307 +msgid "This is a file in your current parent theme." +msgstr "Dit is een bestand in je huidige hoofdthema." + +#. translators: %s: Link to edit parent theme. +#: wp-admin/theme-editor.php:258 +msgid "This child theme inherits templates from a parent theme, %s." +msgstr "Dit subthema overerft templates van een hoofdthema, %s." + +#: wp-admin/includes/class-theme-installer-skin.php:150 +#: wp-admin/js/updates.js:1377 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:469 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:577 +msgid "Network Enable" +msgstr "Netwerk activeren" + +#: wp-admin/upgrade.php:153 +msgid "Your WordPress database has been successfully updated!" +msgstr "Je WordPress database is bijgewerkt." + +#: wp-admin/upgrade.php:152 +msgid "Update Complete" +msgstr "Update afgerond" + +#: wp-admin/upgrade.php:142 +msgid "Update WordPress Database" +msgstr "WordPress database bijwerken" + +#: wp-admin/upgrade.php:141 wp-admin/network/upgrade.php:143 +msgid "The database update process may take a little while, so please be patient." +msgstr "Het database updateproces kan enige tijd duren, even geduld dus." + +#: wp-admin/upgrade.php:140 +msgid "WordPress has been updated! Before we send you on your way, we have to update your database to the newest version." +msgstr "WordPress is vernieuwd. Voordat we je je eigen gang laten gaan, moeten wij de database bijwerken naar de nieuwste versie." + +#: wp-admin/upgrade.php:139 wp-admin/network/upgrade.php:139 +msgid "Database Update Required" +msgstr "Bijwerken database vereist" + +#: wp-admin/upgrade.php:72 +msgid "No Update Required" +msgstr "Bijwerken niet vereist" + +#: wp-admin/upgrade.php:64 +msgid "WordPress › Update" +msgstr "WordPress › bijwerken" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:176 +msgid "You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localized version to be released." +msgstr "Je staat op het punt WordPress %s te installeren in de Engelse taal(US). Er bestaat een kans dat deze update je vertaling verwijdert. Misschien wil je wachten tot WordPress in je eigen taal beschikbaar is?" + +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/update.php:490 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin." +msgstr "Er is een nieuwe versie van %1$s beschikbaar. Details van %4$s bekijken. Automatisch bijwerken is niet beschikbaar voor deze plugin." + +#: wp-admin/includes/class-theme-upgrader-skin.php:44 wp-admin/update.php:209 +msgid "Update Theme" +msgstr "Thema bijwerken" + +#: wp-admin/includes/class-plugin-upgrader-skin.php:62 wp-admin/update.php:62 +msgid "Update Plugin" +msgstr "Plugin bijwerken" + +#: wp-admin/includes/class-theme-upgrader.php:64 +#: wp-admin/includes/class-theme-upgrader.php:101 +msgid "Theme updated successfully." +msgstr "Thema is bijgewerkt." + +#: wp-admin/includes/class-theme-upgrader.php:63 +#: wp-admin/includes/class-theme-upgrader.php:100 +#: wp-admin/includes/ajax-actions.php:4214 +msgid "Theme update failed." +msgstr "Bijwerken thema mislukt." + +#: wp-admin/includes/class-plugin-upgrader.php:65 +#: wp-admin/includes/class-plugin-upgrader.php:92 +msgid "Plugin updated successfully." +msgstr "Plugin is bijgewerkt." + +#: wp-admin/includes/class-plugin-upgrader.php:64 +#: wp-admin/includes/class-plugin-upgrader.php:91 +#: wp-admin/includes/ajax-actions.php:4505 +msgid "Plugin update failed." +msgstr "Bijwerken plugin mislukt." + +#: wp-admin/includes/class-plugin-upgrader.php:58 +#: wp-admin/includes/class-theme-upgrader.php:57 +#: wp-admin/includes/class-core-upgrader.php:31 +#: wp-admin/includes/class-language-pack-upgrader.php:115 +msgid "Update package not available." +msgstr "Update pakket niet beschikbaar." + +#: wp-admin/export.php:208 wp-admin/export.php:255 wp-admin/export.php:295 +msgid "Date range:" +msgstr "Datumbereik:" + +#: wp-admin/export.php:191 wp-admin/export.php:238 +msgid "Authors:" +msgstr "Auteurs:" + +#: wp-admin/export.php:181 +msgid "This will contain all of your posts, pages, comments, custom fields, terms, navigation menus, and custom posts." +msgstr "Dit bevat alle berichten, pagina's, reacties, aangepaste velden, termen, navigatie menu's en aangepaste berichttypen." + +#: wp-admin/export.php:180 +msgid "All content" +msgstr "Gehele inhoud" + +#: wp-admin/export.php:175 +msgid "Choose what to export" +msgstr "Kiezen wat je wilt exporteren" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:247 +msgctxt "comments" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Mijn (%s)" +msgstr[1] "Mijn (%s)" + +#. translators: Admin screen title. %s: Admin screen name. +#: wp-admin/admin-header.php:49 +msgid "%s — WordPress" +msgstr "%s — WordPress" + +#: wp-admin/widgets.php:58 +msgid "The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget." +msgstr "De beschikbare widgetsectie bevat alle widgets waaruit je kunt kiezen. Op het moment dat je een widget naar een zijbalk sleept, zal deze openen zodat je de instellingen kunt configureren. Als je tevreden bent met de widgetinstellingen, klik je op Opslaan en zal de widget op je site worden getoond. Als je op Verwijderen klikt, zal de widget worden verwijderd." + +#: wp-admin/media.php:90 wp-admin/edit-form-advanced.php:349 +msgid "Remember to click Update Media to save metadata entered or changed." +msgstr "Let erop dat je op Media bijwerken klikt om de wijzigingen op te slaan." + +#: wp-admin/media.php:89 wp-admin/edit-form-advanced.php:348 +msgid "Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping." +msgstr "Let erop dat het bijsnijden van een afbeelding gebeurt door erop te klikken (het bijsnijden pictogram is al geselecteerd) en het naar het gewenste onderdeel te slepen. Klik vervolgens op Opslaan om de bewerking te behouden." + +#: wp-admin/media.php:88 wp-admin/edit-form-advanced.php:347 +msgid "For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information." +msgstr "Alleen voor afbeeldingen geldt dat je kunt klikken op de Bewerk afbeelding onder de thumbnail om een in-line afbeeldingseditor uit te vouwen. Deze kan gebruikt worden om afbeeldingen bij te snijden, te roteren, te spiegelen of handelingen ongedaan te maken en opnieuw te doen. De boxen aan de rechterkant geven je meer opties om de afbeelding bij te snijden en te schalen en om de thumbnail op een andere manier bij te snijden dan de originele afbeelding. Je kunt op de help in deze boxen klikken voor meer informatie." + +#: wp-admin/media.php:87 wp-admin/edit-form-advanced.php:346 +msgid "This screen allows you to edit fields for metadata in a file within the media library." +msgstr "Dit scherm staat je toe velden voor metadata te bewerken in een bestand dat zich in de mediabibliotheek bevindt." + +#: wp-admin/user-new.php:419 +msgid "Email or Username" +msgstr "E-mail of gebruikersnaam" + +#: wp-admin/themes.php:231 wp-admin/network/themes.php:422 +#: wp-admin/network/site-themes.php:215 +msgid "Search Installed Themes" +msgstr "Geïnstalleerde thema's zoeken" + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/update-core.php:603 +msgid "Please Note: Any customizations you have made to theme files will be lost. Please consider using child themes for modifications." +msgstr "Let op: Alle aanpassingen die je aan een thema maakt, raak je kwijt. De oplossing is een subthema te maken om daar aanpassingen in te maken." + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:378 +msgctxt "posts" +msgid "Sticky (%s)" +msgid_plural "Sticky (%s)" +msgstr[0] "Sticky (%s)" +msgstr[1] "Sticky (%s)" + +#: wp-admin/update-core.php:1011 +msgid "Check again." +msgstr "Opnieuw controleren." + +#. translators: 1: Date, 2: Time. +#: wp-admin/update-core.php:1010 +msgid "Last checked on %1$s at %2$s." +msgstr "Laatste controle op %1$s om %2$s." + +#: wp-admin/update-core.php:991 +msgid "Please select one or more plugins to update." +msgstr "Eén of meerdere plugins selecteren om bij te werken." + +#: wp-admin/update-core.php:989 +msgid "Please select one or more themes to update." +msgstr "Eén of meerdere thema's selecteren om bij te werken." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:41 +msgid "The update process is starting. This process may take a while on some hosts, so please be patient." +msgstr "Het updateproces gaat starten. Dit proces kan op sommige hosts enige tijd duren, even geduld." + +#: wp-admin/theme-install.php:208 wp-admin/theme-install.php:231 +msgid "Apply Filters" +msgstr "Filters toepassen" + +#: wp-admin/includes/theme.php:310 +msgid "Editor Style" +msgstr "Editor stijl" + +#: wp-admin/includes/file.php:2175 +msgid "To perform the requested action, WordPress needs to access your web server." +msgstr "Om de gewenste actie uit te voeren heeft WordPress toegang tot de webserver nodig." + +#: wp-admin/includes/class-wp-list-table.php:936 +#: wp-admin/includes/class-wp-list-table.php:940 +msgid "Current Page" +msgstr "Huidige pagina" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:168 +msgid "No themes match your request." +msgstr "Geen thema's gevonden die overeenkomen met je criteria." + +#: wp-admin/includes/dashboard.php:481 wp-admin/includes/dashboard.php:483 +#: wp-admin/network/sites.php:391 +msgid "Search Sites" +msgstr "Sites zoeken" + +#: wp-admin/includes/dashboard.php:433 +msgid "Create a New User" +msgstr "Nieuwe gebruiker aanmaken" + +#. translators: 1: Text indicating the number of sites on the network, 2: Text +#. indicating the number of users on the network. +#: wp-admin/includes/dashboard.php:445 +msgid "You have %1$s and %2$s." +msgstr "Je hebt %1$s en %2$s." + +#. translators: %s: Number of sites on the network. +#: wp-admin/includes/dashboard.php:442 +msgid "%s site" +msgid_plural "%s sites" +msgstr[0] "%s site" +msgstr[1] "%s sites" + +#. translators: %s: Number of users on the network. +#: wp-admin/includes/dashboard.php:440 +msgid "%s user" +msgid_plural "%s users" +msgstr[0] "%s gebruiker" +msgstr[1] "%s gebruikers" + +#: wp-admin/includes/dashboard.php:1455 +msgid "https://wordpress.org/news/feed/" +msgstr "https://nl.wordpress.org/news/feed/" + +#: wp-admin/includes/dashboard.php:1446 +msgid "https://wordpress.org/news/" +msgstr "http://wordpress.org/news/" + +#: wp-admin/options-discussion.php:73 +msgid "(Signup has been disabled. Only members of this site can comment.)" +msgstr "(Aanmelden is uitgeschakeld. Alleen leden van deze site kunnen reageren.)" + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number. +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/theme.php:204 wp-admin/includes/update.php:477 +#: wp-admin/includes/update.php:670 +msgid "There is a new version of %1$s available. View version %4$s details." +msgstr "Er is een nieuwe versie van %1$s beschikbaar. Details van %4$s bekijken." + +#: wp-admin/includes/class-theme-installer-skin.php:164 +#: wp-admin/includes/class-theme-upgrader-skin.php:127 +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:51 +msgid "Go to Themes page" +msgstr "Ga naar de thema's pagina" + +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:56 +#: wp-admin/includes/class-language-pack-upgrader-skin.php:78 +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:56 +msgid "Go to WordPress Updates page" +msgstr "Ga naar de WordPress Updates pagina" + +#: wp-admin/includes/class-plugin-installer-skin.php:151 +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:51 +#: wp-admin/includes/class-plugin-upgrader-skin.php:101 +msgid "Go to Plugins page" +msgstr "Ga naar de plugins pagina." + +#: wp-admin/includes/nav-menu.php:1077 +msgid "Click Save Menu to make pending menu items public." +msgstr "Klik op Menu Opslaan om menu items in de wachtrij te publiceren." + +#: wp-admin/includes/dashboard.php:1561 +msgid "Storage Space" +msgstr "Opslagruimte " + +#: wp-admin/includes/dashboard.php:430 +msgid "Create a New Site" +msgstr "Een nieuwe site aanmaken" + +#. translators: 1: Image width in pixels, 2: Image height in pixels. +#: wp-admin/includes/class-custom-image-header.php:555 +msgid "Images of exactly %1$d × %2$d pixels will be used as-is." +msgstr "Afbeeldingen die precies %1$d × %2$d pixels zijn worden gebruikt zoals ze zijn." + +#: wp-admin/includes/class-custom-image-header.php:875 +msgid "Crop and Publish" +msgstr "Bijsnijden en publiceren" + +#: wp-admin/edit-link-form.php:70 +msgid "XFN stands for XHTML Friends Network, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking." +msgstr "XFN staat voor XHTML Friends Network, deze is optioneel. WordPress accepteert het genereren van XFN attributen om te laten zien hoe je gerelateerd bent aan de auteurs/eigenaars van de site waar je naar linkt." + +#: wp-admin/includes/file.php:2185 +msgid "FTP Password" +msgstr "FTP Wachtwoord" + +#: wp-admin/includes/file.php:2184 +msgid "FTP Username" +msgstr "FTP-gebruikersnaam" + +#: wp-admin/includes/file.php:2181 +msgid "FTP/SSH Password" +msgstr "FTP/SSH-wachtwoord" + +#: wp-admin/includes/file.php:2180 +msgid "FTP/SSH Username" +msgstr "FTP/SSH Gebruikersnaam" + +#: wp-admin/widgets.php:76 +msgid "Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area." +msgstr "Veel thema's tonen standaard enkele zijbalk widgets totdat je de zijbalken gaat bewerken, maar ze worden niet automatisch weergegeven in je zijbalk management tool. Nadat je je eerste widget wijzigt, kun je de standaard widgets opnieuw toevoegen uit het Beschikbare Widgets gebied." + +#. translators: %s: URL to create a new page. +#: wp-admin/options-reading.php:28 +msgid "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." +msgstr "Je kunt kiezen wat er wordt weergegeven op de homepagina van je site. Het kunnen berichten zijn in omgekeerde chronologische volgorde (klassiek blog), of een vaste / statische pagina. Als je een statische homepagina wilt, moet je eerst twee pagina's maken. De een zal de voorpagina geworden, en de andere zal de pagina worden waarop je berichten worden weergegeven." + +#: wp-admin/options-permalink.php:53 +msgid "The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be /topics/uncategorized instead of /category/uncategorized." +msgstr "Met optionele velden kun je de “categorie” en “tag” basisnamen aanpassen die zullen verschijnen in de archief URL's. Bijvoorbeeld, de pagina met alle berichten in de “Geen categorie” categorie kan worden /onderwerpen/geen-categorie in plaats van /categorie/geen-categorie." + +#. translators: 1: %category%, 2: %tag% +#: wp-admin/options-permalink.php:41 +msgid "When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s." +msgstr "Wanneer je meerdere categoriën of tags toewijst aan een bericht, wordt er slechts één getoond in de permalink: de laagst genummerde categorie. Dit geldt alleen wanneer je aangepaste structuur %1$s of %2$s bevat." + +#. translators: %s: Percent sign (%). +#: wp-admin/options-permalink.php:36 +msgid "If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there." +msgstr "Als je kiest voor een andere optie dan standaard, zal je algemene URL-pad met de structuur tags (omringd door %s), ook verschijnen in het aangepaste structuur veld en je pad kan er verder worden bewerkt." + +#: wp-admin/widgets.php:66 +msgid "If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas." +msgstr "Als je de widget wilt verwijderen, maar de instellingen voor mogelijk toekomstig gebruik wilt opslaan, sleep de widget dan gewoon naar het inactieve widgetgebied. Je kunt de widget daarvandaan op elk moment weer toevoegen. Dit is vooral handig wanneer je overschakelt naar een thema met minder of andere widgetgebieden." + +#: wp-admin/users.php:34 +msgid "To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section." +msgstr "Om een nieuwe gebruiker voor je site toe te voegen, klik je op de Nieuwe toevoegen knop boven aan het scherm of op Nieuwe toevoegen in het Gebruikersmenu gedeelte." + +#: wp-admin/options-media.php:19 +msgid "You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size." +msgstr "Je kunt de maximale afmetingen voor afbeeldingen die ingevoegd kunnen worden in de geschreven inhoud aanpassen; je kunt ook een afbeelding invoegen als Full Size." + +#: wp-admin/options-general.php:27 +msgid "Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes." +msgstr "De meeste thema's geven de titel van de site weer bovenin elke pagina, in de titelbalk van de browser, en als de identificatienaam voor samengevatte feeds. De ondertitel wordt ook weergegeven door vele thema's." + +#: wp-admin/edit-form-advanced.php:414 +msgid "Order — Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field." +msgstr "Volgorde - Pagina's zijn meestal op alfabetische volgorde gesorteerd, maar je kunt hier je eigen volgorde kiezen door een nummer in te voeren (1 voor de eerste enz.)." + +#: wp-admin/includes/file.php:2189 +msgid "If you do not remember your credentials, you should contact your web host." +msgstr "Wanneer je deze gegevens niet meer weet, kun je contact opnemen met je webhost." + +#: wp-admin/includes/file.php:2183 +msgid "Please enter your FTP credentials to proceed." +msgstr "Geef je FTP inloggegevens op om verder te gaan." + +#: wp-admin/includes/file.php:2179 +msgid "Please enter your FTP or SSH credentials to proceed." +msgstr "Vul je FTP of SSH inloggegevens in om verder te gaan." + +#: wp-admin/user-edit.php:53 +msgid "Your profile contains information about you (your “account”) as well as some personal options related to using WordPress." +msgstr "Je profiel bevat informatie over jou (je “account”) evenals een aantal persoonlijke opties met betrekking tot het gebruik van WordPress." + +#. translators: %s: /wp-content/themes +#: wp-admin/theme-install.php:105 +msgid "You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your %s directory." +msgstr "Je kunt een thema handmatig uploaden als je deze reeds als ZIP-archief hebt gedownload (zorg ervoor dat het van een betrouwbare en originele bron afkomstig is). Je kunt het ook doen op de ouderwetse manier en de gedownloade themamap via FTP naar je %s map uploaden." + +#: wp-admin/edit-form-advanced.php:401 +msgid "Send Trackbacks — Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary." +msgstr "Trackbacks verzenden - Met trackbacks kun je andere blogsystemen inlichten dat je naar hen linkt. Voer de links in waarnaar je trackbacks wilt verzenden. Andere WordPress sites waar je naar verwijst, worden automatisch ingelicht met behulp van pingbacks. Voor deze sites is dit veld niet nodig." + +#: wp-admin/user-new.php:284 +msgid "Contributors can write and manage their posts but not publish posts or upload media files." +msgstr "Bijdragers kunnen berichten schrijven en beheren maar niet publiceren en geen mediabestanden uploaden." + +#: wp-admin/user-new.php:287 +msgid "Administrators have access to all the administration features." +msgstr "Beheerders hebben toegang tot alle administratieve functies." + +#: wp-admin/plugin-editor.php:126 +msgid "You can use the plugin editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations." +msgstr "Je kan de plugin editor gebruiken om wijzigingen in één van de PHP-bestanden van je plugins te maken. Hou er rekening mee dat wijzigingen overschreven worden bij het updaten van de plugin." + +#: wp-admin/link-manager.php:72 +msgid "If you delete a link, it will be removed permanently, as Links do not have a Trash function yet." +msgstr "Het verwijderen van een link is permanent aangezien er nog geen prullenbak functionaliteit aanwezig is voor Links." + +#. translators: %s: URL to Widgets screen. +#: wp-admin/link-manager.php:60 +msgid "You can add links here to be displayed on your site, usually using Widgets. By default, links to several sites in the WordPress community are included as examples." +msgstr "Je kunt links op je site tonen, normaal gesproken doe je dat middels Widgets. Als voorbeeld worden er standaard links toegevoegd naar diverse sites in de WordPress community." + +#: wp-admin/edit-tags.php:284 +msgid "Slug — The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "Slug - De “slug” is de URL-vriendelijke versie van de naam. Het bestaat gewoonlijk uit alleen kleine letters en bevat alleen letters, cijfers en koppeltekens." + +#. translators: %s: URL to Press This bookmarklet. +#: wp-admin/edit-form-advanced.php:315 +msgid "You can also create posts with the Press This bookmarklet." +msgstr "Het is mogelijk berichten aan te maken met de Press This bookmarklet." + +#: wp-admin/includes/class-custom-background.php:93 +msgid "Don’t forget to click on the Save Changes button when you are finished." +msgstr "Vergeet niet op de Wijzigingen opslaan-knop te klikken als je klaar bent." + +#: wp-admin/includes/class-custom-background.php:90 +msgid "You can customize the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a color." +msgstr "Je kunt het uiterlijk van je site aanpassen zonder enige code van je thema aan te raken door een aangepaste achtergrond te gebruiken. Je achtergrond kan een afbeelding of een kleur zijn." + +#: wp-admin/user-new.php:286 +msgid "Editors can publish posts, manage posts as well as manage other people’s posts, etc." +msgstr "Redacteuren kunnen berichten publiceren, berichten beheren en tevens berichten van andere mensen beheren." + +#: wp-admin/user-edit.php:59 +msgid "Remember to click the Update Profile button when you are finished." +msgstr "Vergeet niet om op de Update profiel knop te klikken als je klaar bent." + +#: wp-admin/user-edit.php:58 +msgid "Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so." +msgstr "Vereiste velden zijn aangegeven; de overige velden zijn optioneel. Profiel informatie wordt alleen weergegeven als je thema is ingesteld om dit te doen." + +#: wp-admin/user-edit.php:56 +msgid "Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts." +msgstr "Je gebruikersnaam kan niet worden gewijzigd, maar je kunt gebruik maken van andere velden om je echte naam of een nickname in te voeren, en wijzigen welke naam je wil tonen bij je berichten." + +#: wp-admin/comment.php:64 +msgid "You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment." +msgstr "Je kunt de reactie modereren vanaf dit scherm via het Status vak, waar je ook de datum en het tijdstip van de reactie kunt veranderen." + +#: wp-admin/comment.php:63 +msgid "You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error." +msgstr "Je kunt een reactie bewerken mocht dat nodig zijn. Dit kan handig zijn bij gemaakte typefouten." + +#. translators: %s: Documentation URL. +#: wp-admin/options-reading.php:33 +msgid "You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or a summary. Learn more about feeds." +msgstr "Je kunt ook de weergave van je inhoud in RSS-feeds beheren, waaronder het maximum aantal te tonen berichten en of er volledige tekst of een samenvatting moet worden getoond. Meer informatie over feeds." + +#: wp-admin/options-reading.php:25 +msgid "This screen contains the settings that affect the display of your content." +msgstr "Dit scherm bevat de instellingen die effect hebben op de weergave van de inhoud." + +#: wp-admin/options-general.php:35 +msgid "UTC means Coordinated Universal Time." +msgstr "UTC betekent Coordinated Universal Time (gecoördineerde wereldtijd)." + +#: wp-admin/options-general.php:30 +msgid "The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory." +msgstr "De WordPress URL en de site URL kunnen hetzelfde zijn (voorbeeld.nl) of verschillend; zoals bijvoorbeeld de core bestanden van WordPress in een submap (voorbeeld.nl/wordpress) in plaats van in de root folder." + +#: wp-admin/options-general.php:26 +msgid "The fields on this screen determine some of the basics of your site setup." +msgstr "Met de velden op dit scherm worden enkele basis-instellingen voor je site bepaald." + +#: wp-admin/options-reading.php:36 wp-admin/options-writing.php:24 +#: wp-admin/options-general.php:36 wp-admin/options-permalink.php:25 +#: wp-admin/options-permalink.php:45 wp-admin/options-permalink.php:54 +#: wp-admin/options-media.php:25 wp-admin/options-discussion.php:25 +msgid "You must click the Save Changes button at the bottom of the screen for new settings to take effect." +msgstr "Je moet onder aan het scherm op de Wijzigingen opslaan knop klikken om nieuwe instellingen door te voeren." + +#: wp-admin/edit-link-form.php:69 +msgid "The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don’t use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box." +msgstr "De vakken voor de naam van de link, het webadres en de beschrijving hebben een vaste plaats, terwijl je de andere kunt verplaatsen d.m.v. verslepen. Je kunt de vakken die je niet gebruikt verbergen in de Schermopties tab, of de vakken minimaliseren door op de titelbalk van de box te klikken." + +#: wp-admin/update-core.php:591 +msgid "Your themes are all up to date." +msgstr "Alle thema's zijn bijgewerkt." + +#: wp-admin/update-core.php:432 +msgid "Your plugins are all up to date." +msgstr "Alle plugins zijn bijgewerkt." + +#: wp-admin/update-core.php:268 +msgid "While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, this mode will be deactivated." +msgstr "Tijdens het updaten van je site zal WordPress in onderhoudsmodus actief zijn. Zodra het updaten is afgerond zal deze modus worden gedeactiveerd." + +#: wp-admin/update-core.php:241 +msgid "An updated version of WordPress is available." +msgstr "Een nieuwe versie van WordPress is beschikbaar." + +#: wp-admin/update-core.php:255 +msgid "You have the latest version of WordPress." +msgstr "De meest recente versie van WordPress is geïnstalleerd." + +#: wp-admin/theme-editor.php:167 wp-admin/plugin-editor.php:169 +msgid "Function Name…" +msgstr "Functienaam…" + +#: wp-admin/includes/class-plugin-installer-skin.php:104 +msgid "Activate Plugin & Run Importer" +msgstr "Plugin activeren & importeren uitvoeren" + +#: wp-admin/edit-link-form.php:68 +msgid "You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields." +msgstr "Je kunt links toevoegen of bewerken op dit scherm door het invoeren van gegevens in elk van de vakken. Alleen het link webadres en de naam (de tekst die je wilt weergeven op je site als de link) zijn vereiste velden." + +#. translators: %s: URL to Categories to Tags Converter tool. +#: wp-admin/edit-tags.php:614 +msgid "Categories can be selectively converted to tags using the category to tag converter." +msgstr "Categorieën kunnen selectief worden geconverteerd naar tags met behulp van de categorie naar tag converter." + +#: wp-admin/import.php:24 +msgid "This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform." +msgstr "Dit scherm toont links naar plugins om gegevens uit sites en content management platformen te importeren. Kies vanuit welk platform je wilt importeren en klik op Nu installeren wanneer hierom wordt gevraagd in het popup-venster. Indien je platform niet in de lijst voorkomt, klik op de link om in de Plugin Directory voor andere importeerfunctie plugins zoeken." + +#: wp-admin/export.php:51 +msgid "Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format." +msgstr "Zodra het WXR-bestand is gegenereerd, kun je dit importeren in een andere WordPress site of een ander blogplatform die overweg kan met dit formaat." + +#: wp-admin/plugin-editor.php:127 +msgid "Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished." +msgstr "Kies een plugin om te bewerken uit het dropdown-menu en klik vervolgens op Selecteren. Klik eenmaal op een bestandsnaam om het bestand in de editor te laden en breng vervolgens je wijzigingen aan. Vergeet niet om je wijzigingen op te slaan (Bestand bijwerken) als je klaar bent." + +#: wp-admin/link-manager.php:64 +msgid "You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table." +msgstr "Je kunt aanpassen hoe dit scherm er uit ziet, door gebruik te maken van het Schermopties tabblad en/of de dropdown filters boven de links tabel." + +#: wp-admin/plugins.php:559 +msgid "Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue." +msgstr "Meestal werken plugins goed samen met de core van WordPress en met andere plugins. Soms kan het toch gebeuren dat de code van de ene plugin in de weg loopt van een andere plugin en zo compatibiliteitsproblemen geeft. Als je site vreemde dingen begint te doen, kan dit het probleem zijn. Probeer om alle plugins te deactiveren en ze te heractiveren in verschillende combinaties totdat je de problematische plugin(s) hebt geïsoleerd." + +#: wp-admin/widgets.php:68 +msgid "Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop." +msgstr "Het activeren van de Toegankelijkheidsmodus, via Schermopties, geeft je de mogelijkheid Toevoegen en Bewerken knoppen te gebruiken in plaats van verslepen." + +#: wp-admin/widgets.php:67 +msgid "Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required." +msgstr "Widgets kunnen meerdere keren gebruikt worden. Je kunt elke widget een titel geven om weer te geven op je site, maar dat is niet vereist." + +#: wp-admin/widgets.php:57 +msgid "Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them." +msgstr "Widgets zijn onafhankelijke secties met inhoud die je in elk widget gebied van je thema kunt plaatsen (ook wel zijbalken genoemd). Om je zijbalken of widget gebieden te voorzien van widgets, versleep de titelbalken naar het gewenste gebied. Standaard wordt alleen de eerste widget uitgevouwen. Om widgets in te stellen, klik op de titelbalk om deze uit te vouwen." + +#: wp-admin/theme-editor.php:39 +msgid "Advice: Think very carefully about your site crashing if you are live-editing the theme currently in use." +msgstr "Advies: je site kan crashen als je het actieve thema gaat bewerken." + +#: wp-admin/theme-editor.php:38 +msgid "After typing in your edits, click Update File." +msgstr "Klik na het bewerken op Bestand bijwerken." + +#: wp-admin/theme-editor.php:30 +msgid "Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme’s template files. Clicking once on any file name causes the file to appear in the large Editor box." +msgstr "Begin met het kiezen van een thema in het dropdown-menu om te bewerken en klik daarna op Selecteren. Vervolgens verschijnt er een overzicht van alle template-bestanden van het gekozen thema. Om een bestand te laten verschijnen in de grote Editor box, klik je eenmaal op de bestandsnaam naar keuze." + +#: wp-admin/theme-editor.php:29 +msgid "You can use the theme editor to edit the individual CSS and PHP files which make up your theme." +msgstr "Je kan de thema editor gebruiken om de afzonderlijke CSS- en PHP-bestanden te bewerken waaruit je thema bestaat." + +#: wp-admin/includes/meta-boxes.php:948 +msgid "(no parent)" +msgstr "(geen hoofd)" + +#: wp-admin/edit-form-advanced.php:413 +msgid "Template — Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu." +msgstr "Template - Sommige thema's hebben aangepaste templates die je kunt gebruiken voor bepaalde pagina's met extra functies of aangepaste lay-outs. Als dit het geval is, vind je deze in dit dropdown-menu." + +#: wp-admin/edit-form-advanced.php:412 +msgid "Parent — You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages." +msgstr "Hoofd - Je kunt de pagina's in hiërarchieën onderbrengen (nesten). Je kunt bijvoorbeeld een “Over mij” pagina hebben met daaronder de pagina's “Levensverhaal” en “Mijn hond”. Er zijn geen limieten op het aantal niveau's waarin pagina's genest kunnen zijn." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:48 +msgid "All updates have been completed." +msgstr "Alle updates zijn afgerond." + +#: wp-admin/edit-tags.php:293 +msgid "You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table." +msgstr "Je kunt de weergave van dit scherm wijzigen met het Schermopties tabblad door te kiezen hoeveel items per scherm worden weergegeven en door kolommen in de tabel te tonen of verbergen." + +#: wp-admin/edit-tags.php:291 +msgid "Description — The description is not prominent by default; however, some themes may display it." +msgstr "Beschrijving - De beschrijving wordt standaard niet gebruikt; er zijn echter thema's die dit wel doen." + +#: wp-admin/edit-tags.php:281 +msgid "Name — The name is how it appears on your site." +msgstr "Naam - De naam zoals het wordt getoond op de site." + +#: wp-admin/edit-tags.php:277 +msgid "When adding a new tag on this screen, you’ll fill in the following fields:" +msgstr "Wanneer je een nieuwe tag toevoegt op dit scherm dienen de volgende velden te worden ingevuld:" + +#: wp-admin/edit-tags.php:275 +msgid "When adding a new category on this screen, you’ll fill in the following fields:" +msgstr "Wanneer je een nieuwe categorie toevoegt op dit scherm dienen de volgende velden te worden ingevuld:" + +#: wp-admin/edit-tags.php:262 +msgid "What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index." +msgstr "Wat is het verschil tussen de categorieën en tags? Normaal gesproken zijn tags ad-hoc trefwoorden die belangrijke informatie in je bericht (namen, onderwerpen, enz.) bevatten. Die kunnen al dan niet voorkomen in andere berichten. Categorieën zijn vooraf bepaalde secties. Als je je site vergelijkt met een boek, zijn de categorieën de inhoudsopgave en de tags zijn de termen in de index." + +#. translators: %s: URL to Writing Settings screen. +#: wp-admin/edit-tags.php:250 +msgid "You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your writing settings." +msgstr "Je kunt categorieën gebruiken om onderverdelingen te maken in je site en verwante berichten te groeperen. De standaard bericht categorie is “Geen categorie” totdat je deze verandert in de instellingen voor schrijven." + +#: wp-admin/includes/class-custom-image-header.php:857 +msgid "You need JavaScript to choose a part of the image." +msgstr "Je hebt Javascript nodig om een deel van een afbeelding te kiezen." + +#: wp-admin/includes/class-custom-image-header.php:853 +msgid "Crop Header Image" +msgstr "Kopafbeelding bijsnijden" + +#: wp-admin/includes/class-custom-image-header.php:905 +msgid "Image Upload Error" +msgstr "Afbeeldingsupload-fout" + +#: wp-admin/includes/class-custom-image-header.php:693 +msgid "Restore Original Header Image" +msgstr "Originele kopafbeelding herstellen" + +#: wp-admin/includes/class-custom-image-header.php:692 +msgid "This will restore the original header image. You will not be able to restore any customizations." +msgstr "Dit zal de standaard kopafbeelding terugzetten. Het is niet mogelijk aanpassingen te herstellen. " + +#: wp-admin/includes/class-custom-image-header.php:690 +msgid "Reset Image" +msgstr "Afbeelding herstellen" + +#: wp-admin/includes/class-custom-image-header.php:680 +msgid "Remove Header Image" +msgstr "Kopafbeelding verwijderen" + +#: wp-admin/includes/class-custom-image-header.php:679 +msgid "This will remove the header image. You will not be able to restore any customizations." +msgstr "Dit verwijdert de header afbeelding. Het is niet mogelijk aanpassingen te herstellen." + +#: wp-admin/includes/class-custom-image-header.php:660 +msgid "Default Images" +msgstr "Standaard afbeeldingen" + +#: wp-admin/includes/class-wp-comments-list-table.php:759 +#: wp-admin/includes/dashboard.php:735 +msgid "Delete this comment permanently" +msgstr "Deze reactie permanent verwijderen" + +#: wp-admin/includes/class-wp-comments-list-table.php:749 +msgid "Restore this comment from the Trash" +msgstr "Deze reactie herstellen vanuit de prullenbak" + +#: wp-admin/edit-form-advanced.php:402 +msgid "Discussion — You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them." +msgstr "Reacties - Je kunt reacties en pings aan en uit zetten, als er reacties op het bericht zijn, worden deze hier getoond en kun je direct modereren. " + +#. translators: %s: Featured image. +#: wp-admin/edit-form-advanced.php:386 +msgid "%s — This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc." +msgstr "%s - Dit stelt je in staat om een afbeelding te associëren met een bericht zonder het in te voegen. Dit is alleen nuttig wanneer een thema geschikt is om een uitgelichte afbeelding als een thumbnail te tonen op de homepagina, een aangepaste header enz." + +#: wp-admin/edit-form-advanced.php:292 +msgid "Title — Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit." +msgstr "Titel - Vul een titel in voor je bericht. Nadat je een titel in hebt gevuld, zie je de permalink hieronder die je kunt wijzigen. " + +#: wp-admin/edit.php:263 +msgid "Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:" +msgstr "Hover over een rij in de lijst van berichten om actielinks weer te geven om je bericht te beheren. Je kunt de volgende acties uitvoeren:" + +#: wp-admin/edit.php:254 +msgid "You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list." +msgstr "Je kunt de lijst verfijnen om enkel berichten in een specifieke categorie of van een specifieke maand te tonen door gebruik te maken van de dropdown-menu's boven de lijst van berichten. Klik op de Filteren knop nadat je je keuze hebt gemaakt. Je kunt ook de lijst verfijnen door op de bericht-auteur, categorie of tag in de lijst te klikken." + +#: wp-admin/edit.php:251 +msgid "You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab." +msgstr "Je kunt kolommen verbergen/weergeven op basis van je behoeften en beslissen hoeveel berichten per scherm worden getoond met behulp van de Schermopties tab." + +#: wp-admin/users.php:42 +msgid "You can customize the display of this screen in a number of ways:" +msgstr "Je kunt de weergave van dit scherm op een aantal manieren aanpassen:" + +#: wp-admin/plugins.php:761 +msgid "Search Installed Plugins" +msgstr "Geïnstalleerde plugins zoeken" + +#: wp-admin/nav-menus.php:721 +msgid "Your theme supports one menu. Select which menu you would like to use." +msgstr "Je thema ondersteunt één menu. Selecteer welk menu je wilt gebruiken." + +#: wp-admin/nav-menus.php:19 +msgid "Your theme does not support navigation menus or widgets." +msgstr "Dit thema ondersteund geen navigatie menu's of widgets." + +#: wp-admin/includes/import.php:196 wp-admin/tools.php:47 wp-admin/tools.php:72 +msgid "Categories and Tags Converter" +msgstr "Categorieën en tags converteren" + +#: wp-admin/includes/nav-menu.php:513 wp-admin/includes/nav-menu.php:528 +msgid "Most Recent" +msgstr "Meest recent" + +#: wp-admin/export.php:209 wp-admin/export.php:256 wp-admin/export.php:296 +msgid "Start date:" +msgstr "Startdatum:" + +#: wp-admin/includes/theme-install.php:105 +msgctxt "Theme Installer" +msgid "Tag" +msgstr "Tag" + +#: wp-admin/includes/plugin-install.php:335 +msgctxt "Plugin Installer" +msgid "Tag" +msgstr "Tag" + +#: wp-admin/includes/media.php:2560 +msgctxt "verb" +msgid "Clear" +msgstr "Wissen" + +#: wp-admin/includes/class-wp-comments-list-table.php:362 +#: wp-admin/comment.php:132 +msgctxt "comment" +msgid "Mark as spam" +msgstr "Markeer als spam" + +#: wp-admin/includes/class-custom-background.php:303 +msgid "Remove Background Image" +msgstr "Verwijder achtergrondafbeelding" + +#. translators: %s: Post title. +#. translators: %s: Link to post. +#: wp-admin/edit-comments.php:151 wp-admin/edit-comments.php:217 +msgid "Comments on “%s”" +msgstr "Reacties op “%s”" + +#: wp-admin/includes/nav-menu.php:1103 +msgid "Show advanced menu properties" +msgstr "Geavanceerde menu eigenschappen tonen" + +#. translators: 1: Plugin version, 2: New version. +#. translators: 1: Theme version, 2: New version. +#: wp-admin/update-core.php:552 wp-admin/update-core.php:716 +msgid "You have version %1$s installed. Update to %2$s." +msgstr "Je hebt versie %1$s geïnstalleerd. Naar versie %2$s bijwerken." + +#: wp-admin/includes/class-wp-debug-data.php:205 +#: wp-admin/includes/class-wp-debug-data.php:210 +#: wp-admin/includes/class-wp-debug-data.php:219 +#: wp-admin/includes/class-wp-debug-data.php:228 +#: wp-admin/includes/class-wp-debug-data.php:237 +#: wp-admin/includes/class-wp-debug-data.php:277 +#: wp-admin/includes/class-wp-debug-data.php:282 +#: wp-admin/includes/class-wp-debug-data.php:292 +#: wp-admin/includes/class-wp-debug-data.php:297 +#: wp-admin/includes/class-wp-debug-data.php:548 +#: wp-admin/includes/class-wp-debug-data.php:1131 +#: wp-admin/includes/class-wp-debug-data.php:1217 +msgid "Enabled" +msgstr "Ingeschakeld" + +#: wp-admin/includes/class-wp-comments-list-table.php:740 +msgctxt "comment" +msgid "Not Spam" +msgstr "Geen spam" + +#: wp-admin/includes/class-custom-background.php:318 +msgid "This will restore the original background image. You will not be able to restore any customizations." +msgstr "Dit zal de originele achtergrondafbeelding herstellen. Het is niet mogelijk om aanpassingen te herstellen." + +#: wp-admin/includes/dashboard.php:1464 +msgid "WordPress Blog" +msgstr "WordPress site" + +#: wp-admin/users.php:416 +msgid "Remove Users from Site" +msgstr "Gebruikers van site verwijderen " + +#: wp-admin/user-edit.php:426 wp-admin/user-edit.php:428 +msgid "— No role for this site —" +msgstr "— Geen rol voor deze site —" + +#: wp-admin/includes/upgrade.php:635 +msgid "New WordPress Site" +msgstr "Nieuwe WordPress-site" + +#: wp-admin/includes/schema.php:403 +msgid "My Site" +msgstr "Mijn site" + +#: wp-admin/includes/post.php:829 +msgid "Sorry, you are not allowed to create posts or drafts on this site." +msgstr "Je hebt geen toestemming om berichten of concepten aan te maken op deze site." + +#: wp-admin/includes/post.php:827 +msgid "Sorry, you are not allowed to create pages on this site." +msgstr "Je hebt geen rechten om pagina's aan te maken op deze site." + +#: wp-admin/includes/plugin.php:508 +msgid "Custom site suspended message." +msgstr "Aangepaste site uitgeschakeld bericht." + +#: wp-admin/includes/plugin.php:507 +msgid "Custom site inactive message." +msgstr "Aangepaste site inactief bericht." + +#: wp-admin/includes/plugin.php:506 +msgid "Custom site deleted message." +msgstr "Aangepaste site verwijderd bericht." + +#: wp-admin/import.php:72 +msgid "If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:" +msgstr "Je kunt berichten of reacties uit andere systemen importeren naar deze site. Kies hieronder uit welk systeem je wilt importeren." + +#: wp-admin/includes/nav-menu.php:443 wp-admin/includes/nav-menu.php:722 +msgid "No items." +msgstr "Geen items." + +#. translators: %s: Asterisk symbol (*). +#: wp-admin/includes/schema.php:1105 +msgid "To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool." +msgstr "Voor het gebruik van een subdomein-configuratie, moet een wildcard gedefinieerd zijn in je DNS. Dit betekent meestal het toevoegen van een %s hostname-record dat verwijst naar je webserver in je DNS-configuratietool." + +#. translators: %s: Host name. +#: wp-admin/includes/schema.php:1094 +msgid "The installer attempted to contact a random hostname (%s) on your domain." +msgstr "De installer probeerde een willekeurige hostnaam (%s) te bereiken op je domein. " + +#: wp-admin/nav-menus.php:265 +msgid "The menu item has been successfully deleted." +msgstr "Het menu-item is verwijderd." + +#: wp-admin/includes/ajax-actions.php:1612 +msgid "Please provide a custom field name." +msgstr "Geef een aangepaste veldnaam." + +#: wp-admin/includes/class-custom-background.php:348 +msgid "Display Options" +msgstr "Weergave opties" + +#: wp-admin/includes/class-custom-background.php:299 +#: wp-admin/includes/class-custom-image-header.php:677 +msgid "Remove Image" +msgstr "Afbeelding verwijderen" + +#: wp-admin/users.php:530 +msgid "Other users have been removed." +msgstr "Andere gebruikers zijn verwijderd." + +#: wp-admin/users.php:529 +msgid "You can't remove the current user." +msgstr "Niet mogelijk om de huidige gebruiker te verwijderen." + +#: wp-admin/users.php:445 +msgid "There are no valid users selected for removal." +msgstr "Geen geldige gebruikers geselecteerd voor verwijdering." + +#: wp-admin/users.php:443 +msgid "Confirm Removal" +msgstr "Verwijderen bevestigen" + +#: wp-admin/users.php:421 +msgid "You have specified these users for removal:" +msgstr "De volgende gebruikers zijn aangemerkt voor verwijdering:" + +#: wp-admin/users.php:160 wp-admin/users.php:218 +msgid "User deletion is not allowed from this screen." +msgstr "Verwijderen van gebruikers is niet toegestaan vanaf dit scherm." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:153 +msgid "Show details." +msgstr "Details tonen." + +#. translators: %s: Title of an update. +#: wp-admin/includes/class-bulk-upgrader-skin.php:47 +msgid "%s updated successfully." +msgstr "%s succesvol bijgewerkt." + +#: wp-admin/includes/user.php:528 +msgid "No thanks, do not remind me again" +msgstr "Nee bedankt, herinner mij hier niet meer aan." + +#: wp-admin/includes/user.php:527 +msgid "Yes, take me to my profile page" +msgstr "Ja, breng mij naar mijn profielpagina" + +#: wp-admin/includes/upgrade.php:96 +msgid "Your chosen password." +msgstr "Je gekozen wachtwoord." + +#: wp-admin/post.php:287 wp-admin/upload.php:176 wp-admin/edit.php:144 +msgid "Sorry, you are not allowed to restore this item from the Trash." +msgstr "Je hebt geen toestemming om dit item te herstellen uit de prullenbak." + +#: wp-admin/post.php:250 wp-admin/upload.php:155 wp-admin/edit.php:111 +msgid "Sorry, you are not allowed to move this item to the Trash." +msgstr "Je hebt geen toestemming om dit item naar de prullenbak te verplaatsen." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:295 +msgid "%s comment restored from the Trash." +msgid_plural "%s comments restored from the Trash." +msgstr[0] "%s reactie hersteld vanuit de prullenbak." +msgstr[1] "%s reacties hersteld vanuit de prullenbak." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:290 +msgid "%s comment moved to the Trash." +msgid_plural "%s comments moved to the Trash." +msgstr[0] "%s reactie verplaatst naar de prullenbak." +msgstr[1] "%s reacties verplaatst naar de prullenbak." + +#: wp-admin/update-core.php:598 +msgid "The following themes have new versions available. Check the ones you want to update and then click “Update Themes”." +msgstr "Voor de volgende thema's zijn nieuwe versies beschikbaar. Geef aan welke je wilt bijwerken en klik op “Thema's bijwerken”. " + +#: wp-admin/user-new.php:344 +msgid "That user is already a member of this site." +msgstr "Die gebruiker is al lid van deze site." + +#: wp-admin/user-new.php:335 +msgid "User has been added to your site." +msgstr "De gebruiker is toegevoegd aan je site." + +#: wp-admin/user-new.php:332 +msgid "Invitation email sent to user. A confirmation link must be clicked for them to be added to your site." +msgstr "E-mail met uitnodiging verzonden naar de gebruiker. Een bevestiging link moet worden aangeklikt om de gebruiker aan de site toe te voegen." + +#: wp-admin/update-core.php:445 +msgid "The following plugins have new versions available. Check the ones you want to update and then click “Update Plugins”." +msgstr "Voor de volgende plugins zijn nieuwe versies beschikbaar. Geef aan welke je wilt bijwerken en klik op “Plugins bijwerken”. " + +#: wp-admin/includes/class-custom-background.php:304 +msgid "This will remove the background image. You will not be able to restore any customizations." +msgstr "Hierdoor wordt de achtergrondafbeelding verwijderd. Eventuele aanpassingen gaan definitief verloren." + +#. translators: %s: Network title. +#: wp-admin/includes/class-wp-themes-list-table.php:132 +msgid "Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes." +msgstr "Alleen het huidige thema is beschikbaar. Neem contact op met de beheerder van %s voor meer informatie over de toegang tot aanvullende thema's." + +#: wp-admin/includes/file.php:30 +msgid "Tag Template" +msgstr "Tagtemplate" + +#: wp-admin/includes/file.php:27 +msgid "Author Template" +msgstr "Auteurstemplate" + +#: wp-admin/includes/file.php:54 +msgid "Visual Editor Stylesheet" +msgstr "Stylesheet visuele editor" + +#: wp-admin/edit-form-advanced.php:204 +msgid "Page saved." +msgstr "Pagina opgeslagen." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:559 +#: wp-admin/update-core.php:58 wp-admin/js/updates.js:629 +msgid "Update Now" +msgstr "Nu updaten" + +#. translators: %s: Plugin name. +#. translators: %s: Plugin name and version. +#. translators: %s: Importer name. +#: wp-admin/includes/class-wp-plugins-list-table.php:1044 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:622 +#: wp-admin/import.php:204 +msgid "More information about %s" +msgstr "Meer informatie over %s" + +#: wp-admin/user-edit.php:440 +msgid "Grant this user super admin privileges for the Network." +msgstr "Geef deze gebruiker super beheerrechten voor het netwerk." + +#: wp-admin/user-edit.php:195 +msgid "This user has super admin privileges." +msgstr "Deze gebruiker heeft super beheerrechten." + +#: wp-admin/install.php:151 wp-admin/user-edit.php:195 +msgid "Important:" +msgstr "Belangrijk:" + +#. translators: %s: Theme version. +#: wp-admin/includes/class-wp-theme-install-list-table.php:308 +#: wp-admin/includes/class-wp-theme-install-list-table.php:466 +msgid "Update to version %s" +msgstr "Bijwerken naar versie %s" + +#: wp-admin/setup-config.php:288 +msgid "Error: \"Table Prefix\" can only contain numbers, letters, and underscores." +msgstr "Fout: \"Table Prefix\" kan alleen nummers, letters en underscores bevatten." + +#: wp-admin/user-edit.php:410 +msgid "Usernames cannot be changed." +msgstr "Gebruikersnamen kunnen niet worden veranderd." + +#: wp-admin/options-reading.php:157 +msgid "items" +msgstr "items" + +#: wp-admin/nav-menus.php:288 +msgid "The menu has been successfully deleted." +msgstr "Het menu is verwijderd." + +#: wp-admin/options-reading.php:43 wp-admin/options-reading.php:179 +#: wp-admin/options-reading.php:180 wp-admin/install.php:182 +#: wp-admin/install.php:185 +msgid "Site visibility" +msgstr "Zichtbaarheid site" + +#: wp-admin/options-general.php:71 +msgid "In a few words, explain what this site is about." +msgstr "Geef met enkele woorden aan wat de inhoud van deze site is." + +#: wp-admin/includes/class-walker-nav-menu-edit.php:212 +msgid "CSS Classes (optional)" +msgstr "CSS Class (optioneel)" + +#: wp-admin/includes/nav-menu.php:1105 +msgid "Link Target" +msgstr "Linkdoel" + +#: wp-admin/nav-menus.php:966 wp-admin/nav-menus.php:1101 +msgid "Save Menu" +msgstr "Menu opslaan" + +#. translators: 1: Theme name, 2: Number of the theme, 3: Total number of +#. themes being updated. +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:24 +msgid "Updating Theme %1$s (%2$d/%3$d)" +msgstr "Thema %1$s (%2$d/%3$d) bijwerken" + +#: wp-admin/includes/schema.php:1109 +msgid "You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message." +msgstr "Je kunt nog steeds gebruik maken van je site, maar elk subdomein dat je aanmaakt, zal niet toegankelijk zijn. Als je weet dat je DNS klopt, kun je dit bericht negeren." + +#. translators: %s: Error message. +#: wp-admin/includes/schema.php:1099 +msgid "This resulted in an error message: %s" +msgstr "Dit resulteerde in een foutbericht: %s" + +#: wp-admin/includes/schema.php:997 +msgid "You must provide a valid email address." +msgstr "Je moet een geldig e-mailadres opgeven." + +#: wp-admin/includes/schema.php:988 wp-admin/includes/schema.php:992 +msgid "The network already exists." +msgstr "Het netwerk bestaat al." + +#: wp-admin/includes/schema.php:981 +msgid "You must provide a name for your network of sites." +msgstr "Je moet een naam geven voor je netwerk van sites." + +#: wp-admin/includes/schema.php:978 +msgid "You must provide a domain name." +msgstr "Er moet een domeinnaam worden opgegeven." + +#: wp-admin/includes/user.php:524 +msgid "Notice:" +msgstr "Opmerking:" + +#: wp-admin/edit-form-advanced.php:546 +msgid "Get Shortlink" +msgstr "Verkorte URL verkrijgen" + +#. translators: %s: Title of an update. +#: wp-admin/includes/class-bulk-upgrader-skin.php:45 +msgid "The update of %s failed." +msgstr "Het bijwerken van %s is mislukt." + +#. translators: 1: Plugin name, 2: Number of the plugin, 3: Total number of +#. plugins being updated. +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:24 +msgid "Updating Plugin %1$s (%2$d/%3$d)" +msgstr "Plugin %1$s bijwerken (%2$d/%3$d)" + +#: wp-admin/includes/upgrade.php:117 +msgid "The password you chose during installation." +msgstr "Het wachtwoord dat je gekozen hebt tijdens de installatie." + +#: wp-admin/includes/upgrade.php:100 +msgid "User already exists. Password inherited." +msgstr "Gebruiker bestaat al. Wachtwoord overgenomen." + +#: wp-admin/includes/update-core.php:1436 +#: wp-admin/includes/class-wp-automatic-updater.php:418 +#: wp-admin/update-core.php:853 +msgid "WordPress updated successfully." +msgstr "WordPress met succes geüpdatet." + +#: wp-admin/update-core.php:806 +msgid "Update WordPress" +msgstr "Update WordPress" + +#: wp-admin/update-core.php:448 wp-admin/update-core.php:577 +#: wp-admin/update-core.php:1102 wp-admin/update-core.php:1107 +#: wp-admin/plugins.php:156 +msgid "Update Plugins" +msgstr "Update plugins" + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Minimum required MySQL version +#. number, 5: Current PHP version number, 6: Current MySQL version number. +#: wp-admin/update-core.php:101 wp-admin/upgrade.php:99 +msgid "You cannot update because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." +msgstr "Je kan niet updaten omdat WordPress %2$s PHP versie %3$s of nieuwer en MySQL versie %4$s of nieuwer vereist. Je gebruikt PHP versie %5$s en MySQL versie %6$s." + +#: wp-admin/update-core.php:921 wp-admin/update-core.php:982 +msgid "WordPress Updates" +msgstr "WordPress updates" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:175 +msgid "Edit menu item" +msgstr "Menu-item bewerken" + +#: wp-admin/about.php:292 wp-admin/includes/network.php:148 +msgid "Go to Dashboard" +msgstr "Naar het dashboard" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:538 +msgid "Drop-in (%s)" +msgid_plural "Drop-ins (%s)" +msgstr[0] "Drop-in (%s)" +msgstr[1] "Drop-ins (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:530 +msgid "Must-Use (%s)" +msgid_plural "Must-Use (%s)" +msgstr[0] "Verplicht (%s)" +msgstr[1] "Verplicht (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:760 +msgid "Inactive:" +msgstr "Niet actief:" + +#: wp-admin/plugins.php:392 +msgid "Yes, delete these files and data" +msgstr "Ja, deze bestanden en data verwijderen" + +#: wp-admin/plugins.php:374 +msgid "Are you sure you want to delete these files and data?" +msgstr "Weet je zeker dat je deze bestanden en gegevens wilt verwijderen?" + +#: wp-admin/plugins.php:344 +msgid "You are about to remove the following plugin:" +msgstr "Je staat op het punt om de volgende plugin te verwijderen:" + +#: wp-admin/plugins.php:340 +msgid "Delete Plugin" +msgstr "Plugin verwijderen" + +#: wp-admin/options-general.php:295 +msgid "This timezone does not observe daylight saving time." +msgstr "Deze tijdzone neemt de zomertijd niet in acht." + +#: wp-admin/options-general.php:272 +msgid "This timezone is currently in daylight saving time." +msgstr "Deze tijdzone is momenteel in de zomertijd." + +#: wp-admin/options-general.php:113 wp-admin/network/settings.php:164 +msgid "This address is used for admin purposes. If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." +msgstr "Dit adres wordt gebruikt voor administratieve doeleinden. Als je het wijzigt, sturen wij een e-mail naar je nieuwe adres om het te bevestigen. Het nieuwe adres zal niet actief worden voordat het is bevestigd." + +#: wp-admin/includes/nav-menu.php:518 wp-admin/includes/nav-menu.php:804 +msgid "View All" +msgstr "Alles tonen" + +#: wp-admin/nav-menus.php:383 wp-admin/nav-menus.php:405 +msgid "Please enter a valid menu name." +msgstr "Een geldige menu-naam invoeren." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Minimum required MySQL version +#. number, 5: Current PHP version number, 6: Current MySQL version number. +#: wp-admin/install.php:257 +msgid "You cannot install because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." +msgstr "Je kan niet installeren omdat WordPress %2$s PHP versie %3$s of nieuwer en MySQL versie %4$s of nieuwer vereist. Je gebruikt PHP versie %5$s en MySQL versie %6$s." + +#: wp-admin/includes/plugin.php:505 +msgid "Executed before Multisite is loaded." +msgstr "Uitvoeren voordat Multisite is geladen." + +#: wp-admin/includes/plugin.php:499 +msgid "External object cache." +msgstr "Externe object cache." + +#: wp-admin/includes/plugin.php:498 +msgid "Custom maintenance message." +msgstr "Aangepast onderhoudsbericht:" + +#: wp-admin/includes/plugin.php:496 +msgid "Custom database error message." +msgstr "Aangepast database-foutbericht." + +#: wp-admin/includes/plugin.php:495 +msgid "Custom database class." +msgstr "Aangepaste database class." + +#: wp-admin/includes/plugin.php:494 +msgid "Advanced caching plugin." +msgstr "Geavanceerde cache plugin." + +#: wp-admin/includes/file.php:832 +msgid "File is empty. Please upload something more substantial." +msgstr "Bestand is leeg. Upload iets met meer inhoud." + +#: wp-admin/edit-comments.php:314 +msgid "This comment is already marked as spam." +msgstr "Deze reactie is al als spam gemarkeerd." + +#: wp-admin/edit-comments.php:311 +msgid "View Trash" +msgstr "Prullenbak bekijken" + +#: wp-admin/edit-comments.php:311 +msgid "This comment is already in the Trash." +msgstr "Deze reactie bevindt zich al in de prullenbak." + +#: wp-admin/edit-comments.php:308 +msgid "This comment is already approved." +msgstr "Deze reactie is al toegelaten." + +#: wp-admin/comment.php:158 +msgid "This comment is currently in the Trash." +msgstr "Deze reactie bevindt zich momenteel in de prullenbak." + +#: wp-admin/comment.php:155 +msgid "This comment is currently marked as spam." +msgstr "Deze reactie is momenteel gemarkeerd als spam." + +#: wp-admin/comment.php:152 +msgid "This comment is currently approved." +msgstr "Deze reactie is momenteel toegelaten." + +#: wp-admin/comment.php:99 +msgid "Moderate Comment" +msgstr "Reactie modereren" + +#: wp-admin/export.php:186 +msgid "Categories:" +msgstr "Categorieën:" + +#: wp-admin/widgets.php:129 +msgid "Drag widgets here to remove them from the sidebar but keep their settings." +msgstr "Sleep de widgets hierheen om deze te verwijderen van de zijbalk, maar om de instellingen te bewaren." + +#: wp-admin/widgets.php:442 wp-admin/widgets.php:445 +msgid "Available Widgets" +msgstr "Beschikbare widgets" + +#: wp-admin/widgets.php:383 +msgid "Error in displaying the widget settings form." +msgstr "Fout bij het tonen van het widget instellingen formulier." + +#: wp-admin/includes/misc.php:1246 wp-admin/includes/post.php:1958 +#: wp-admin/widgets.php:382 +msgid "Error while saving." +msgstr "Fout tijdens het opslaan." + +#: wp-admin/widgets.php:378 wp-admin/js/inline-edit-tax.js:227 +#: wp-admin/js/inline-edit-post.js:438 +msgid "Changes saved." +msgstr "Wijzigingen opgeslagen." + +#: wp-admin/widgets.php:360 +msgid "Save Widget" +msgstr "Widget opslaan" + +#: wp-admin/widgets.php:315 +msgid "Position" +msgstr "Positie" + +#: wp-admin/widgets.php:313 +msgid "Select both the sidebar for this widget and the position of the widget in that sidebar." +msgstr "Selecteer zowel de zijbalk als de positie voor deze widget in de zijbalk." + +#. translators: %s: Widget name. +#: wp-admin/widgets.php:298 +msgid "Widget %s" +msgstr "Widget %s" + +#: wp-admin/widgets.php:126 +msgid "Inactive Widgets" +msgstr "Gedeactiveerde widgets" + +#: wp-admin/includes/class-wp-users-list-table.php:300 +msgid "Change" +msgstr "Wijzigen" + +#: wp-admin/includes/class-wp-users-list-table.php:294 +#: wp-admin/includes/class-wp-users-list-table.php:296 +msgid "Change role to…" +msgstr "Rol wijzigen naar…" + +#. translators: 1: User role name, 2: Number of users. +#: wp-admin/includes/class-wp-users-list-table.php:227 +#: wp-admin/includes/class-wp-users-list-table.php:246 +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#: wp-admin/users.php:523 +msgid "Other users have been deleted." +msgstr "Andere gebruikers zijn verwijderd." + +#: wp-admin/users.php:522 +msgid "You can’t delete the current user." +msgstr "Je kunt de huidige gebruiker niet verwijderen." + +#: wp-admin/users.php:519 +msgid "Other user roles have been changed." +msgstr "Overige gebruikersrollen zijn gewijzigd." + +#: wp-admin/users.php:518 +msgid "The current user’s role must have user editing capabilities." +msgstr "De huidige gebruiker moet de rechten hebben om gebruikers te kunnen bewerken." + +#: wp-admin/users.php:495 +msgid "New user created." +msgstr "Nieuwe gebruiker gemaakt." + +#: wp-admin/users.php:347 +msgid "There are no valid users selected for deletion." +msgstr "Er zijn geen geldige gebruikers geselecteerd om te verwijderen." + +#: wp-admin/users.php:274 +msgid "Delete Users" +msgstr "Gebruikers verwijderen" + +#: wp-admin/user-new.php:450 wp-admin/user-new.php:617 +msgid "Skip Confirmation Email" +msgstr "Bevestigingbericht overslaan." + +#: wp-admin/user-new.php:329 +msgid "Invitation email sent to new user. A confirmation link must be clicked before their account is created." +msgstr "De uitnodiging is verzonden naar de nieuwe gebruiker. De bevestigingslink moet worden aangeklikt voordat het account wordt aangemaakt." + +#. translators: Joining confirmation notification email subject. %s: Site +#. title. +#: wp-admin/user-new.php:129 +msgid "[%s] Joining Confirmation" +msgstr "[%s] Bevestiging van deelname" + +#: wp-admin/user-edit.php:852 +msgid "Update User" +msgstr "Update gebruiker" + +#: wp-admin/user-edit.php:852 +msgid "Update Profile" +msgstr "Update profiel" + +#: wp-admin/user-edit.php:821 +msgid "Additional Capabilities" +msgstr "Aanvullende rechten" + +#: wp-admin/user-edit.php:657 +msgid "Type your new password again." +msgstr "Type je nieuwe wachtwoord nogmaals in." + +#: wp-admin/user-edit.php:632 +msgid "New Password" +msgstr "Nieuw wachtwoord" + +#: wp-admin/user-edit.php:577 +msgid "Share a little biographical information to fill out your profile. This may be shown publicly." +msgstr "Vertel iets over jezelf. Dit kan voor iedereen zichtbaar zijn." + +#: wp-admin/user-edit.php:575 +msgid "Biographical Info" +msgstr "Biografie" + +#: wp-admin/user-edit.php:571 +msgid "About the user" +msgstr "Over de gebruiker" + +#: wp-admin/user-edit.php:571 +msgid "About Yourself" +msgstr "Over jezelf" + +#: wp-admin/user-edit.php:502 +msgid "Contact Info" +msgstr "Contactinformatie" + +#: wp-admin/user-edit.php:463 +msgid "Display name publicly as" +msgstr "Toon naam openbaar als" + +#: wp-admin/user-edit.php:458 +msgid "Nickname" +msgstr "Schermnaam" + +#: wp-admin/user-new.php:520 wp-admin/user-edit.php:453 +msgid "Last Name" +msgstr "Achternaam" + +#: wp-admin/user-new.php:516 wp-admin/user-edit.php:448 +msgid "First Name" +msgstr "Voornaam" + +#: wp-admin/user-edit.php:325 +msgid "Enable keyboard shortcuts for comment moderation." +msgstr "Toetsenbord snelkoppelingen inschakelen voor het modereren van reacties." + +#: wp-admin/includes/misc.php:952 wp-admin/user-edit.php:299 +msgid "Admin Color Scheme" +msgstr "Kleurenschema beheren" + +#: wp-admin/user-edit.php:268 +msgid "Disable the visual editor when writing" +msgstr "De visuele editor uitschakelen tijdens het schrijven" + +#: wp-admin/user-edit.php:265 +msgid "Visual Editor" +msgstr "Visuele editor" + +#: wp-admin/user-edit.php:260 +msgid "Personal Options" +msgstr "Persoonlijke opties" + +#: wp-admin/user-edit.php:202 +msgid "User updated." +msgstr "Gebruiker bijgewerkt." + +#: wp-admin/includes/user.php:565 +msgid "Always use https when visiting the admin" +msgstr "Altijd HTTPS gebruiken voor beheerhandelingen" + +#: wp-admin/includes/user.php:564 +msgid "Use https" +msgstr "HTTPS gebruiken" + +#: wp-admin/user-new.php:338 wp-admin/users.php:508 +#: wp-admin/network/user-new.php:94 +msgid "Edit user" +msgstr "Bewerk gebruiker" + +#: wp-admin/upload.php:349 wp-admin/upload.php:362 +msgid "Media file restored from the Trash." +msgstr "Mediabestand hersteld vanuit de prullenbak." + +#: wp-admin/upload.php:336 wp-admin/upload.php:361 +msgid "Media file moved to the Trash." +msgstr "Mediabestand verplaatst naar de prullenbak." + +#: wp-admin/upload.php:324 wp-admin/upload.php:359 +msgid "Media file permanently deleted." +msgstr "Media permanent verwijderd." + +#: wp-admin/edit-tags.php:137 wp-admin/options.php:78 +msgid "Sorry, you are not allowed to delete these items." +msgstr "Je hebt geen toestemming om deze berichten te verwijderen." + +#: wp-admin/upgrade.php:73 +msgid "Your WordPress database is already up to date!" +msgstr "Je WordPress-database is al up-to-date!" + +#. translators: %s: File name. +#: wp-admin/update.php:305 +msgid "Installing theme from uploaded file: %s" +msgstr "Bezig met installeren van thema vanuit geüploade bestand: %s" + +#: wp-admin/update.php:298 wp-admin/theme-install.php:58 +#: wp-admin/theme-install.php:152 wp-admin/theme-install.php:154 +msgid "Upload Theme" +msgstr "Thema uploaden" + +#. translators: %s: Theme name and version. +#: wp-admin/update.php:278 +msgid "Installing Theme: %s" +msgstr "Thema %s aan het installeren." + +#. translators: %s: File name. +#: wp-admin/update.php:162 +msgid "Installing plugin from uploaded file: %s" +msgstr "Bezig met installeren van plugin vanuit geüploade bestand: %s" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:117 +#: wp-admin/update.php:156 wp-admin/plugin-install.php:138 +msgid "Upload Plugin" +msgstr "Plugin uploaden" + +#. translators: %s: Plugin name and version. +#: wp-admin/update.php:132 +msgid "Installing Plugin: %s" +msgstr "Plugin %s wordt geïnstalleerd." + +#: wp-admin/update.php:95 +msgid "Plugin failed to reactivate due to a fatal error." +msgstr "Plugin kan niet opnieuw worden geactiveerd vanwege een fatale fout." + +#: wp-admin/update.php:91 +msgid "Plugin reactivated successfully." +msgstr "Plugin met succes opnieuw geactiveerd." + +#: wp-admin/update.php:89 +msgid "Plugin Reactivation" +msgstr "Plugin reactivatie" + +#: wp-admin/includes/class-wp-automatic-updater.php:416 +#: wp-admin/update-core.php:847 wp-admin/js/updates.js:809 +#: wp-admin/js/updates.js:1464 +msgid "Installation failed." +msgstr "Installatie mislukt." + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:484 wp-admin/update-core.php:493 +msgid "Compatibility with WordPress %s: Unknown" +msgstr "Compatibiliteit met WordPress %s: Onbekend" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:481 wp-admin/update-core.php:490 +msgid "Compatibility with WordPress %s: 100%% (according to its author)" +msgstr "Compatibiliteit met WordPress %s: 100%% (volgens de auteur)" + +#: wp-admin/update-core.php:200 +msgid "Hide hidden updates" +msgstr "Verborgen updates verbergen" + +#: wp-admin/update-core.php:199 wp-admin/update-core.php:210 +msgid "Show hidden updates" +msgstr "Verborgen updates tonen" + +#: wp-admin/update-core.php:165 +msgid "Bring back this update" +msgstr "Terugkeren naar deze update" + +#: wp-admin/update-core.php:163 +msgid "Hide this update" +msgstr "Deze update verbergen" + +#: wp-admin/themes.php:574 +msgid "Broken Themes" +msgstr "Incomplete thema's" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-themes-list-table.php:232 +msgid "" +"You are about to delete this theme '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Je staat op het punt dit thema '%s' te verwijderen.\n" +" 'Annuleren' om te stoppen, 'OK' om te verwijderen." + +#: wp-admin/includes/theme.php:802 wp-admin/themes.php:924 +msgid "Current Theme" +msgstr "Huidig thema" + +#: wp-admin/themes.php:276 wp-admin/network/themes.php:389 +msgid "Theme deleted." +msgstr "Thema verwijderd." + +#: wp-admin/theme-editor.php:225 +msgid "Select theme to edit:" +msgstr "Thema selecteren om te bewerken:" + +#: wp-admin/theme-editor.php:21 +msgid "Edit Themes" +msgstr "Thema's bewerken" + +#: wp-admin/includes/theme.php:981 wp-admin/themes.php:1087 +msgid "Tags:" +msgstr "Tags:" + +#. translators: %s: Post title. +#: wp-admin/revision.php:109 +msgid "Compare Revisions of “%s”" +msgstr "Revisies van “%s” vergelijken" + +#: wp-admin/post.php:143 +msgid "You can’t edit this item because it is in the Trash. Please restore it and try again." +msgstr "Niet mogelijk om dit item te bewerken omdat het in de prullenbak zit. Herstel het item en probeer het opnieuw." + +#: wp-admin/edit-tags.php:173 wp-admin/includes/post.php:1964 +#: wp-admin/includes/class-wp-screen.php:295 wp-admin/post.php:20 +#: wp-admin/post.php:47 wp-admin/post.php:139 wp-admin/term.php:43 +#: wp-admin/media-upload.php:47 +msgid "Sorry, you are not allowed to edit this item." +msgstr "Je hebt geen toestemming om dit item te bewerken." + +#: wp-admin/edit-tags.php:160 wp-admin/edit-tags.php:180 wp-admin/post.php:127 +#: wp-admin/term.php:31 +msgid "You attempted to edit an item that doesn’t exist. Perhaps it was deleted?" +msgstr "Je probeerde iets te bewerken dat niet bestaat. Misschien is het verwijderd?" + +#: wp-admin/includes/class-wp-plugins-list-table.php:417 +msgid "No plugins found." +msgstr "Geen plugins gevonden." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:522 +msgid "Inactive (%s)" +msgid_plural "Inactive (%s)" +msgstr[0] "Inactief (%s)" +msgstr[1] "Inactief (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:514 +msgid "Recently Active (%s)" +msgid_plural "Recently Active (%s)" +msgstr[0] "Recentelijk actief (%s)" +msgstr[1] "Recentelijk actief (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:506 +msgid "Active (%s)" +msgid_plural "Active (%s)" +msgstr[0] "Actief (%s)" +msgstr[1] "Actief (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:497 +msgctxt "plugins" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alles (%s)" +msgstr[1] "Alles (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:658 +msgid "Clear List" +msgstr "Lijst wissen" + +#: wp-admin/includes/class-wp-plugins-list-table.php:1052 +msgid "Visit plugin site" +msgstr "Bezoek plugin site" + +#: wp-admin/includes/class-wp-plugins-list-table.php:601 +#: wp-admin/includes/class-wp-plugins-list-table.php:801 +#: wp-admin/includes/class-plugin-installer-skin.php:124 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:591 +#: wp-admin/js/updates.js:738 +msgid "Network Activate" +msgstr "Netwerk activeren" + +#: wp-admin/includes/class-wp-plugins-list-table.php:605 +#: wp-admin/includes/class-wp-plugins-list-table.php:790 +msgid "Network Deactivate" +msgstr "Netwerk deactiveren" + +#. translators: %s: Error message. +#: wp-admin/plugins.php:674 +msgid "Plugin could not be deleted due to an error: %s" +msgstr "Plugin kon niet worden verwijderd vanwege een fout: %s" + +#: wp-admin/plugins.php:637 +msgid "Plugin could not be activated because it triggered a fatal error." +msgstr "Plugin kon niet worden geactiveerd omdat hij een fatale fout veroorzaakt." + +#. translators: %s: WP_PLUGIN_DIR constant value. +#: wp-admin/plugins.php:562 +msgid "If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated." +msgstr "Als er iets misgaat met een plugin en WordPress werkt niet meer, verwijder of hernoem dan het betreffende bestand in de %s map en de plugin wordt automatisch gedeactiveerd." + +#: wp-admin/plugins.php:545 +msgid "Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here." +msgstr "Met plugins kun je de functionaliteit van WordPress uitbreiden. Is een plugin eenmaal geïnstalleerd, dan kun je hem hier activeren en deactiveren." + +#: wp-admin/plugins.php:400 +msgid "No, return me to the plugin list" +msgstr "Nee, laat me terugkeren naar de pluginlijst" + +#: wp-admin/plugins.php:392 +msgid "Yes, delete these files" +msgstr "Ja, verwijder deze bestanden" + +#: wp-admin/plugins.php:376 +msgid "Are you sure you want to delete these files?" +msgstr "Weet je zeker dat je deze bestanden wilt verwijderen?" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:110 +msgctxt "Plugin Installer" +msgid "Popular" +msgstr "Populairste" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:109 +msgctxt "Plugin Installer" +msgid "Featured" +msgstr "Uitgelicht" + +#: wp-admin/theme-editor.php:314 wp-admin/plugin-editor.php:287 +msgid "Update File" +msgstr "Bestand bijwerken" + +#: wp-admin/theme-editor.php:293 wp-admin/plugin-editor.php:272 +msgid "Documentation:" +msgstr "Documentatie:" + +#: wp-admin/plugin-editor.php:242 +msgid "Plugin Files" +msgstr "Pluginbestanden" + +#: wp-admin/plugin-editor.php:219 +msgid "Select plugin to edit:" +msgstr "Plugin selecteren om te bewerken:" + +#: wp-admin/includes/ajax-actions.php:4716 wp-admin/theme-editor.php:189 +#: wp-admin/plugin-editor.php:184 +msgid "File edited successfully." +msgstr "Bestand is bijgewerkt." + +#: wp-admin/includes/file.php:486 wp-admin/plugin-editor.php:116 +msgid "Files of this type are not editable." +msgstr "Bestanden van dit type zijn niet bewerkbaar." + +#: wp-admin/plugin-editor.php:21 +msgid "Edit Plugins" +msgstr "Plugins bewerken" + +#: wp-admin/options.php:348 +msgid "All Settings" +msgstr "Alle instellingen" + +#: wp-admin/options-writing.php:44 wp-admin/options-writing.php:201 +msgid "Update Services" +msgstr "Update Services" + +#: wp-admin/options-writing.php:172 +msgid "Default Mail Category" +msgstr "Standaard e-mailcategorie" + +#: wp-admin/options-writing.php:162 +msgid "Login Name" +msgstr "Inlognaam" + +#: wp-admin/options-writing.php:157 +msgid "Port" +msgstr "Poort" + +#: wp-admin/options-writing.php:155 +msgid "Mail Server" +msgstr "POP3-server" + +#. translators: 1, 2, 3: Examples of random email addresses. +#: wp-admin/options-writing.php:145 +msgid "To post to WordPress by email, you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it’s a good idea to keep this address very secret. Here are three random strings you could use: %1$s, %2$s, %3$s." +msgstr "Om berichten via e-mail te kunnen plaatsen, moet je een geheim e-mail account instellen met POP3-toegang. Elke e-mail ontvangen op dit adres zal worden geplaatst, dus het is een goed idee om dit e-mailadres uiterst geheim te houden. Hier zijn drie willekeurige tekenreeksen die je kunt gebruiken: %1$s, %2$s, %3$s." + +#: wp-admin/options-writing.php:140 +msgid "Post via email" +msgstr "Bericht via e-mail" + +#: wp-admin/options-writing.php:112 +msgid "Default Link Category" +msgstr "Standaard link-categorie" + +#: wp-admin/options-writing.php:78 +msgid "Default Post Category" +msgstr "Standaard berichtcategorie" + +#: wp-admin/options-writing.php:73 +msgid "WordPress should correct invalidly nested XHTML automatically" +msgstr "Automatisch ongeldig geneste XHTML corrigeren" + +#: wp-admin/options-writing.php:72 +msgid "Convert emoticons like :-) and :-P to graphics on display" +msgstr "Emoticons als :-) en :-P omzetten naar afbeeldingen" + +#: wp-admin/options-writing.php:68 wp-admin/options-writing.php:69 +msgid "Formatting" +msgstr "Formattering" + +#: wp-admin/options-writing.php:16 +msgid "Writing Settings" +msgstr "Schrijven instellingen" + +#: wp-admin/options-reading.php:67 +msgid "Encoding for pages and feeds" +msgstr "Tekstcodering voor pagina's en feeds" + +#: wp-admin/options-reading.php:164 +msgid "Summary" +msgstr "Samenvatting" + +#: wp-admin/options-reading.php:163 +msgid "Full text" +msgstr "Volledige tekst" + +#: wp-admin/options-reading.php:156 +msgid "Syndication feeds show the most recent" +msgstr "RSS-feeds tonen de meest recente" + +#: wp-admin/options-reading.php:150 +msgid "Blog pages show at most" +msgstr "Sitepagina's tonen maximaal" + +#: wp-admin/options-reading.php:141 +msgid "Warning: these pages should not be the same!" +msgstr "Waarschuwing: deze pagina's mogen niet dezelfde zijn." + +#. translators: %s: Select field to choose the page for posts. +#: wp-admin/options-reading.php:126 +msgid "Posts page: %s" +msgstr "Berichtenpagina: %s" + +#. translators: %s: URL to Pages screen. +#: wp-admin/options-reading.php:98 +msgid "A static page (select below)" +msgstr "Een statische pagina (hieronder kiezen)" + +#: wp-admin/options-reading.php:16 +msgid "Reading Settings" +msgstr "Lezen instellingen" + +#: wp-admin/options-privacy.php:115 +msgid "Privacy Settings" +msgstr "Privacy instellingen" + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:405 +msgid "If you temporarily make your site’s root directory writable for us to generate the %s file automatically, do not forget to revert the permissions after the file has been created." +msgstr "Als je ervoor gekozen hebt om de hoofdmap van je site tijdelijk schrijfbaar te maken voor ons om het %s bestand automatisch te genereren, vergeet dan niet om de rechten weer terug te zetten nadat deze actie is uitgevoerd." + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:380 +msgid "If you temporarily make your %s file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after rule has been saved." +msgstr "Als je ervoor gekozen hebt om je %s bestand tijdelijk schrijfbaar te maken voor ons om de rewrite url automatisch te genereren, vergeet dan niet om de rechten weer terug te zetten nadat deze actie is uitgevoerd." + +#: wp-admin/options-permalink.php:344 +msgid "Tag base" +msgstr "Tagbasis" + +#. translators: Prefix for category permalinks. +#: wp-admin/options-permalink.php:340 +msgid "Category base" +msgstr "Categoriebasis" + +#: wp-admin/options-permalink.php:330 +msgid "Optional" +msgstr "Optioneel" + +#: wp-admin/options-permalink.php:257 +msgid "Custom Structure" +msgstr "Aangepaste structuur" + +#: wp-admin/options-permalink.php:247 +msgid "Numeric" +msgstr "Numeriek" + +#: wp-admin/options-permalink.php:243 +msgid "Month and name" +msgstr "Jaar, maand en naam" + +#: wp-admin/options-permalink.php:239 +msgid "Day and name" +msgstr "Jaar, maand, dag en naam" + +#: wp-admin/options-permalink.php:161 +msgid "Permalink structure updated." +msgstr "Permalinkstructuur bijgewerkt." + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:174 +msgid "Permalink structure updated. Remove write access on %s file now!" +msgstr "Permalink structuur bijgewerkt. Verwijder schrijfrechten nu van %s bestand!" + +#: wp-admin/options-permalink.php:16 wp-admin/options-permalink.php:32 +msgid "Permalink Settings" +msgstr "Permalink instellingen" + +#: wp-admin/options-media.php:143 +msgid "Organize my uploads into month- and year-based folders" +msgstr "Uploads bewaren in mappen op basis van maand en jaar" + +#: wp-admin/options-media.php:132 +msgid "Configuring this is optional. By default, it should be blank." +msgstr "Deze optie is optioneel. Standaard zou het leeg moeten zijn." + +#: wp-admin/options-media.php:130 +msgid "Full URL path to files" +msgstr "Volledige URL-pad naar bestanden" + +#: wp-admin/options-media.php:118 +msgid "Store uploads in this folder" +msgstr "Uploads opslaan in deze map" + +#: wp-admin/options-media.php:107 +msgid "Uploading Files" +msgstr "Bestanden uploaden" + +#: wp-admin/options-media.php:81 wp-admin/options-media.php:82 +msgid "Large size" +msgstr "Grote afmeting" + +#: wp-admin/options-media.php:75 wp-admin/options-media.php:86 +msgid "Max Height" +msgstr "Maximale hoogte" + +#: wp-admin/options-media.php:72 wp-admin/options-media.php:83 +msgid "Max Width" +msgstr "Maximale breedte" + +#: wp-admin/options-media.php:70 wp-admin/options-media.php:71 +msgid "Medium size" +msgstr "Gemiddelde afmeting" + +#: wp-admin/options-media.php:65 +msgid "Crop thumbnail to exact dimensions (normally thumbnails are proportional)" +msgstr "Thumbnail aanpassen aan vermelde afmetingen (normaal zijn thumbnails in verhouding)" + +#: wp-admin/options-media.php:56 wp-admin/options-media.php:57 +msgid "Thumbnail size" +msgstr "Thumbnailgrootte" + +#: wp-admin/options-media.php:51 +msgid "Image sizes" +msgstr "Afmetingen van afbeeldingen" + +#: wp-admin/options-media.php:16 +msgid "Media Settings" +msgstr "Media-instellingen" + +#: wp-admin/options-general.php:383 +msgid "Week Starts On" +msgstr "Week begint op" + +#: wp-admin/options-general.php:333 wp-admin/options-general.php:370 +msgid "Custom:" +msgstr "Aangepast:" + +#: wp-admin/options-general.php:274 +msgid "This timezone is currently in standard time." +msgstr "Deze tijdzone is momenteel in de wintertijd." + +#: wp-admin/includes/class-wp-debug-data.php:80 +#: wp-admin/options-general.php:224 +msgid "Timezone" +msgstr "Tijdzone" + +#: wp-admin/options-general.php:149 +msgid "New User Default Role" +msgstr "Standaard rol voor nieuwe gebruikers" + +#: wp-admin/options-general.php:144 +msgid "Anyone can register" +msgstr "Iedereen kan registreren" + +#: wp-admin/options-general.php:141 wp-admin/options-general.php:142 +msgid "Membership" +msgstr "Lidmaatschap" + +#: wp-admin/options-general.php:19 +msgid "General Settings" +msgstr "Algemene instellingen" + +#: wp-admin/options-discussion.php:280 +msgid "MonsterID (Generated)" +msgstr "MonsterID (gegenereerd)" + +#: wp-admin/options-discussion.php:279 +msgid "Wavatar (Generated)" +msgstr "Wavatar (gegenereerd)" + +#: wp-admin/options-discussion.php:278 +msgid "Identicon (Generated)" +msgstr "Identicon (gegenereerd)" + +#: wp-admin/options-discussion.php:277 +msgid "Gravatar Logo" +msgstr "Gravatar logo" + +#: wp-admin/options-discussion.php:276 +msgid "Blank" +msgstr "Leeg" + +#: wp-admin/options-discussion.php:270 +msgid "For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address." +msgstr "Voor gebruikers zonder eigen avatar, kan een algemeen logo worden getoond of een gegenereerd logo gebaseerd op hun e-mailadres." + +#: wp-admin/options-discussion.php:266 wp-admin/options-discussion.php:267 +msgid "Default Avatar" +msgstr "Standaard avatar" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:255 +msgid "X — Even more mature than above" +msgstr "X — Nog meer voor volwassenen dan hierboven" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:253 +msgid "R — Intended for adult audiences above 17" +msgstr "R — Bedoeld voor volwassen publiek van 18 jaar en ouder" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:251 +msgid "PG — Possibly offensive, usually for audiences 13 and above" +msgstr "PG — Misschien schokkend, gewoonlijk geschikt voor publiek van 13 jaar en ouder" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:249 +msgid "G — Suitable for all audiences" +msgstr "G — Geschikt voor elke bezoeker" + +#: wp-admin/options-discussion.php:243 wp-admin/options-discussion.php:244 +msgid "Maximum Rating" +msgstr "Maximum waardering" + +#: wp-admin/options-discussion.php:238 +msgid "Show Avatars" +msgstr "Avatars tonen" + +#: wp-admin/options-discussion.php:234 +msgid "Avatar Display" +msgstr "Avatarweergave" + +#: wp-admin/options-discussion.php:218 +msgid "Avatars" +msgstr "Avatars" + +#: wp-admin/options-discussion.php:209 +msgid "When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be put in the Trash. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." +msgstr "Wanneer een reactie één van deze woorden bevat in zijn inhoud, auteursnaam, URL, e-mail, IP-adres of browser user agent string, wordt deze in de prullenbak geplaatst. Eén woord of IP-adres per regel. Het zal matchen binnen woorden, dus “press” zal matchen met “WordPress”." + +#: wp-admin/options-discussion.php:200 +msgid "When a comment contains any of these words in its content, author name, URL, email, IP address, or browser’s user agent string, it will be held in the moderation queue. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." +msgstr "Wanneer een reactie één van deze woorden bevat in zijn inhoud, naam, URL, e-mail of IP-adres, wordt deze in de moderatiewachtrij vastgehouden. Eén woord of IP-adres per regel. Het zal matchen binnen woorden, dus “press” zal matchen met “WordPress”." + +#. translators: %s: Number of links. +#: wp-admin/options-discussion.php:194 +msgid "Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)" +msgstr "Een reactie in de wachtrij houden als er meer dan %s links vermeld worden (een typisch kenmerk van spam in reacties is een groot aantal links)." + +#: wp-admin/options-discussion.php:188 wp-admin/options-discussion.php:189 +msgid "Comment Moderation" +msgstr "Reacties modereren" + +#: wp-admin/options-discussion.php:184 +msgid "Comment author must have a previously approved comment" +msgstr "De afzender moet een eerder toegelaten reactie geplaatst hebben" + +#: wp-admin/options-discussion.php:178 wp-admin/options-discussion.php:179 +msgid "Before a comment appears" +msgstr "Voor een reactie verschijnt" + +#: wp-admin/options-discussion.php:174 +msgid "A comment is held for moderation" +msgstr "Een reactie wacht op moderatie" + +#: wp-admin/options-discussion.php:170 +msgid "Anyone posts a comment" +msgstr "Iemand een reactie plaatst" + +#: wp-admin/options-discussion.php:166 wp-admin/options-discussion.php:167 +msgid "Email me whenever" +msgstr "Stuur mij een e-mail wanneer" + +#. translators: %s: Form field control for 'older' or 'newer' comments. +#: wp-admin/options-discussion.php:159 +msgid "Comments should be displayed with the %s comments at the top of each page" +msgstr "Reacties tonen met de %s reacties bovenin elke pagina" + +#: wp-admin/options-discussion.php:156 +msgid "newer" +msgstr "nieuwere" + +#: wp-admin/options-discussion.php:152 +msgid "older" +msgstr "oudere" + +#. translators: 1: Form field control for number of top level comments per +#. page, 2: Form field control for the 'first' or 'last' page. +#: wp-admin/options-discussion.php:138 +msgid "Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default" +msgstr "Reacties over meerdere pagina's verdelen met %1$s reacties per pagina en de %2$s pagina standaard getoond" + +#: wp-admin/options-discussion.php:135 +msgid "first" +msgstr "eerste" + +#: wp-admin/options-discussion.php:131 +msgid "last" +msgstr "laatste" + +#. translators: %s: Number of levels. +#: wp-admin/options-discussion.php:119 +msgid "Enable threaded (nested) comments %s levels deep" +msgstr "Geneste reacties toestaan tot %s niveaus diep" + +#. translators: %s: Number of days. +#: wp-admin/options-discussion.php:83 +msgid "Automatically close comments on posts older than %s days" +msgstr "Automatisch reacties uitschakelen bij berichten ouder dan %s dagen" + +#: wp-admin/options-discussion.php:70 +msgid "Users must be registered and logged in to comment" +msgstr "Gebruikers moeten ingelogd zijn om te kunnen reageren" + +#: wp-admin/options-discussion.php:66 +msgid "Comment author must fill out name and email" +msgstr "Schrijvers van reacties moeten naam en e-mailadres opgeven" + +#: wp-admin/options-discussion.php:64 wp-admin/options-discussion.php:65 +msgid "Other comment settings" +msgstr "Overige reactie-instellingen" + +#: wp-admin/options-discussion.php:60 +msgid "These settings may be overridden for individual posts." +msgstr "Deze instellingen zijn per bericht te overschrijven." + +#: wp-admin/edit-form-advanced.php:407 wp-admin/options-discussion.php:15 +msgid "Discussion Settings" +msgstr "Discussie-instellingen" + +#: wp-admin/includes/class-wp-users-list-table.php:159 +#: wp-admin/includes/deprecated.php:570 +#: wp-admin/includes/class-wp-ms-users-list-table.php:126 +msgid "No users found." +msgstr "Geen gebruikers gevonden." + +#: wp-admin/update-core.php:610 wp-admin/update-core.php:741 +#: wp-admin/update-core.php:1142 wp-admin/update-core.php:1147 +#: wp-admin/network/themes.php:84 +msgid "Update Themes" +msgstr "Thema's bijwerken" + +#: wp-admin/my-sites.php:124 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:720 +#: wp-admin/network/site-info.php:137 wp-admin/network/site-users.php:229 +#: wp-admin/network/site-themes.php:179 wp-admin/network/site-settings.php:94 +msgid "Visit" +msgstr "Bezoek" + +#: wp-admin/my-sites.php:13 wp-admin/ms-delete-site.php:13 +#: wp-admin/network/admin.php:17 +msgid "Multisite support is not enabled." +msgstr "Multisite-ondersteuning is niet geactiveerd." + +#: wp-admin/menu.php:298 +msgid "Permalinks" +msgstr "Permalinks" + +#: wp-admin/credits.php:51 wp-admin/privacy.php:12 wp-admin/privacy.php:48 +#: wp-admin/privacy.php:54 wp-admin/freedoms.php:54 wp-admin/about.php:49 +#: wp-admin/menu.php:299 +msgid "Privacy" +msgstr "Privacy" + +#: wp-admin/menu.php:295 +msgid "Reading" +msgstr "Lezen" + +#: wp-admin/menu.php:294 +msgid "Writing" +msgstr "Schrijven" + +#: wp-admin/menu.php:293 +msgctxt "settings screen" +msgid "General" +msgstr "Algemeen" + +#: wp-admin/user-edit.php:35 wp-admin/user/menu.php:14 wp-admin/menu.php:255 +#: wp-admin/menu.php:267 wp-admin/menu.php:270 +msgid "Profile" +msgstr "Profiel" + +#. translators: Add new plugin. +#: wp-admin/plugins.php:725 wp-admin/menu.php:246 wp-admin/network/menu.php:106 +msgctxt "plugin" +msgid "Add New" +msgstr "Nieuwe plugin" + +#. translators: %s: Number of comments. +#: wp-admin/menu.php:98 +msgid "Comments %s" +msgstr "Reacties %s" + +#. translators: Add new file. +#: wp-admin/media.php:129 wp-admin/upload.php:90 wp-admin/upload.php:273 +#: wp-admin/menu.php:69 +msgctxt "file" +msgid "Add New" +msgstr "Nieuw bestand" + +#: wp-admin/menu.php:67 +msgid "Library" +msgstr "Bibliotheek" + +#: wp-admin/media.php:136 wp-admin/media.php:156 +msgid "Update Media" +msgstr "Wijzigingen opslaan" + +#: wp-admin/media.php:73 +msgid "You can’t edit this attachment because it is in the Trash. Please move it out of the Trash and try again." +msgstr "Het is niet mogelijk deze bijlage te bewerken omdat deze in de prullenbak zit. Zet de bijlage terug en probeer opnieuw." + +#: wp-admin/media.php:67 +msgid "You attempted to edit an attachment that doesn’t exist. Perhaps it was deleted?" +msgstr "Je probeert een bijlage te bewerken die niet bestaat. Misschien is deze verwijderd?" + +#: wp-admin/media.php:23 wp-admin/media.php:61 +msgid "Sorry, you are not allowed to edit this attachment." +msgstr "Je hebt geen toestemming om deze bijlage te bewerken." + +#: wp-admin/media-new.php:42 +msgid "Upload New Media" +msgstr "Nieuwe uploaden" + +#: wp-admin/maint/repair.php:169 +msgid "Repair and Optimize Database" +msgstr "Database repareren en optimaliseren" + +#: wp-admin/maint/repair.php:167 +msgid "Repair Database" +msgstr "Database repareren" + +#. translators: %s: URL to "Fixing WordPress" forum. +#: wp-admin/maint/repair.php:146 +msgid "Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance." +msgstr "Sommige databaseproblemen konden niet worden gerepareerd. Kopieer en plak de volgende lijst van fouten op de WordPress supportforums om extra hulp te krijgen." + +#: wp-admin/maint/repair.php:20 +msgid "WordPress › Database Repair" +msgstr "WordPress › Databaseherstel" + +#: wp-admin/link.php:117 +msgid "Link not found." +msgstr "Link niet gevonden." + +#: wp-admin/includes/class-wp-links-list-table.php:80 +msgid "No links found." +msgstr "Geen links gevonden." + +#: wp-admin/link-manager.php:132 +msgid "Search Links" +msgstr "Links zoeken" + +#. translators: %s: Number of links. +#: wp-admin/link-manager.php:124 +msgid "%s link deleted." +msgid_plural "%s links deleted." +msgstr[0] "%s link verwijderd." +msgstr[1] "%s links verwijderd." + +#. translators: Add new links. +#: wp-admin/link-manager.php:103 wp-admin/edit-link-form.php:90 +#: wp-admin/menu.php:83 +msgctxt "link" +msgid "Add New" +msgstr "Nieuwe link" + +#: wp-admin/link-add.php:16 +msgid "Add New Link" +msgstr "Nieuwe link toevoegen" + +#: wp-admin/install.php:417 +msgid "Success!" +msgstr "Voltooid." + +#: wp-admin/install.php:361 +msgid "Please provide the following information. Don’t worry, you can always change these settings later." +msgstr "De volgende informatie invoeren. Geen zorgen, deze gegevens kunnen in een later stadium worden gewijzigd." + +#: wp-admin/install.php:360 +msgid "Information needed" +msgstr "Benodigde informatie" + +#: wp-admin/install.php:207 +msgid "Install WordPress" +msgstr "WordPress installeren" + +#: wp-admin/install.php:179 +msgid "Double-check your email address before continuing." +msgstr "Controleer zorgvuldig of je het e-mailadres goed hebt ingevuld voordat je verder gaat." + +#: wp-admin/install.php:177 +msgid "Your Email" +msgstr "Je e-mailadres" + +#: wp-admin/install.php:122 +msgid "User(s) already exists." +msgstr "Gebruiker(s) bestaan al." + +#: wp-admin/install.php:73 +msgid "WordPress › Installation" +msgstr "WordPress › installatie" + +#: wp-admin/includes/user.php:201 +msgid "Error: Please enter an email address." +msgstr "Fout: Voer een e-mailadres in." + +#: wp-admin/includes/user.php:172 +msgid "Error: Passwords may not contain the character \"\\\"." +msgstr "Fout: Wachtwoorden mogen het teken \"\\\" niet bevatten." + +#: wp-admin/includes/user.php:167 +msgid "Error: Please enter a password." +msgstr "Fout: Voer een wachtwoord in." + +#. translators: Default post slug. +#: wp-admin/includes/upgrade.php:242 wp-admin/includes/upgrade.php:556 +msgctxt "Default post slug" +msgid "hello-world" +msgstr "hallo-wereld" + +#: wp-admin/includes/upgrade.php:240 +msgid "Hello world!" +msgstr "Hallo wereld!" + +#. translators: %s: Site link. +#. translators: First post content. %s: Site link. +#: wp-admin/includes/schema.php:1258 wp-admin/includes/upgrade.php:213 +msgid "Welcome to %s. This is your first post. Edit or delete it, then start writing!" +msgstr "Welkom bij %s. Dit is je eerste bericht. Bewerk of verwijder het, start dan met schrijven!" + +#. translators: Default category slug. +#: wp-admin/includes/upgrade.php:160 +msgctxt "Default category slug" +msgid "Uncategorized" +msgstr "Geen categorie" + +#: wp-admin/includes/upgrade.php:89 +msgid "Note that password carefully! It is a random password that was generated just for you." +msgstr "Ga zorgvuldig met het wachtwoord om. Het is een willekeurig wachtwoord, speciaal voor jou aangemaakt." + +#: wp-admin/includes/update.php:835 +msgid "An automated WordPress update has failed to complete! Please notify the site administrator." +msgstr "Een geautomatiseerde WordPress update is niet afgerond! Stel de sitebeheerder op de hoogte." + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/update.php:831 +msgid "An automated WordPress update has failed to complete - please attempt the update again now." +msgstr "Een geautomatiseerde WordPress update is niet voltooid - probeer de update nu opnieuw." + +#. translators: %s: WordPress version number, or 'Latest' string. +#: wp-admin/includes/update.php:351 +msgid "Latest" +msgstr "Laatste" + +#. translators: %s: WordPress version number, or 'Latest' string. +#: wp-admin/includes/update.php:351 +msgid "Update to %s" +msgstr "Bijwerken naar %s" + +#. translators: 1: WordPress version number, 2: URL to WordPress Updates +#. screen. +#: wp-admin/includes/update.php:260 +msgid "You are using a development version (%1$s). Cool! Please stay updated." +msgstr "Je gebruikt een ontwikkelversie (%1$s). Cool. Blijf bij met de meest recente release. " + +#: wp-admin/includes/update-core.php:1289 +msgid "Upgrading database…" +msgstr "Database bijwerken…" + +#: wp-admin/includes/update-core.php:933 +msgid "The update could not be unpacked" +msgstr "De update kon niet worden uitgepakt" + +#: wp-admin/includes/update-core.php:920 +msgid "Verifying the unpacked files…" +msgstr "Uitgepakte bestanden verifiëren…" + +#. translators: 1: WordPress version number, 2: Minimum required MySQL version +#. number, 3: Current MySQL version number. +#: wp-admin/includes/update-core.php:1014 +msgid "The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." +msgstr "De bijgewerkte versie kan niet worden geïnstalleerd. WordPress %1$s vereist MySQL-versie %2$s of hoger. Je gebruikt versie: %3$s." + +#. translators: 1: WordPress version number, 2: Minimum required PHP version +#. number, 3: Current PHP version number. +#: wp-admin/includes/update-core.php:1003 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." +msgstr "De bijgewerkte versie kan niet worden geïnstalleerd. WordPress %1$s vereist PHP-versie %2$s of hoger. Je gebruikt versie: %3$s." + +#. translators: 1: WordPress version number, 2: Minimum required PHP version +#. number, 3: Minimum required MySQL version number, 4: Current PHP version +#. number, 5: Current MySQL version number. +#: wp-admin/includes/update-core.php:990 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." +msgstr "De bijgewerkte versie kan niet worden geïnstalleerd. WordPress %1$s vereist PHP-versie %2$s of hoger en MySQL-versie %3$s of hoger. Je gebruikt PHP-versie: %4$s en MySQL-versie %5$s." + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:83 +msgid "Could not fully remove the theme %s." +msgstr "Kon het thema %s niet volledig verwijderen." + +#: wp-admin/includes/theme.php:72 wp-admin/includes/class-wp-upgrader.php:155 +msgid "Unable to locate WordPress theme directory." +msgstr "Kan de WordPress themamap niet lokaliseren." + +#: wp-admin/includes/class-theme-installer-skin.php:224 +msgid "This theme is already installed." +msgstr "Dit thema is al geïnstalleerd." + +#. translators: %s: Theme version. +#: wp-admin/includes/theme.php:807 wp-admin/themes.php:929 +#: wp-admin/theme-install.php:461 +msgid "Version: %s" +msgstr "Versie: %s" + +#: wp-admin/includes/theme-install.php:182 +msgid "If you have a theme in a .zip format, you may install or update it by uploading it here." +msgstr "Wanneer je een thema in .zip formaat hebt, kun je die installeren door het hier te uploaden." + +#: wp-admin/includes/theme-install.php:172 +msgid "Find Themes" +msgstr "Thema's zoeken" + +#: wp-admin/includes/theme.php:296 +msgid "Holiday" +msgstr "Vakantie" + +#: wp-admin/includes/theme.php:290 wp-admin/includes/theme.php:359 +msgid "Subject" +msgstr "Onderwerp" + +#: wp-admin/includes/theme.php:317 +msgid "Sticky Post" +msgstr "Sticky berichten" + +#: wp-admin/includes/theme.php:318 +msgid "Theme Options" +msgstr "Thema opties" + +#: wp-admin/includes/theme.php:307 +msgid "Custom Colors" +msgstr "Aangepaste kleuren" + +#: wp-admin/includes/theme.php:302 wp-admin/includes/theme.php:358 +msgid "Features" +msgstr "Eigenschappen" + +#: wp-admin/includes/theme.php:328 +msgid "Right Sidebar" +msgstr "Zijbalk rechts" + +#: wp-admin/includes/theme.php:327 +msgid "Left Sidebar" +msgstr "Zijbalk links" + +#: wp-admin/includes/theme.php:326 +msgid "Four Columns" +msgstr "Vier kolommen" + +#: wp-admin/includes/theme.php:325 +msgid "Three Columns" +msgstr "Drie kolommen" + +#: wp-admin/includes/theme.php:324 +msgid "Two Columns" +msgstr "Twee kolommen" + +#: wp-admin/includes/theme.php:323 +msgid "One Column" +msgstr "Eén kolom" + +#: wp-admin/includes/theme-install.php:139 wp-admin/theme-install.php:182 +msgid "Feature Filter" +msgstr "Eigenschapfilter" + +#: wp-admin/includes/class-wp-screen.php:969 +msgid "Screen Options" +msgstr "Schermopties" + +#: wp-admin/widgets.php:416 +msgid "Disable accessibility mode" +msgstr "Toegankelijkheidsmodus deactiveren" + +#: wp-admin/widgets.php:416 +msgid "Enable accessibility mode" +msgstr "Toegankelijkheidsmodus activeren" + +#: wp-admin/themes.php:126 +msgid "Manage Themes" +msgstr "Thema's beheren" + +#: wp-admin/update.php:272 +msgid "Install Themes" +msgstr "Thema's installeren" + +#: wp-admin/includes/template.php:992 +msgid "Upload file and import" +msgstr "Bestand uploaden en importeren" + +#. translators: %s: Maximum allowed file size. +#: wp-admin/includes/template.php:985 +msgid "Maximum size: %s" +msgstr "Maximale grootte: %s" + +#: wp-admin/includes/template.php:983 +msgid "Choose a file from your computer:" +msgstr "Kies een bestand van je computer:" + +#: wp-admin/includes/template.php:973 +msgid "Before you can upload your import file, you will need to fix the following error:" +msgstr "Voordat je je importbestand kan uploaden, zul je de volgende fout moeten oplossen:" + +#: wp-admin/includes/template.php:753 +msgid "Add Custom Field" +msgstr "Extra veld toevoegen" + +#: wp-admin/includes/template.php:740 +msgid "Enter new" +msgstr "Nieuwe toevoegen" + +#: wp-admin/includes/template.php:714 +msgid "Add New Custom Field:" +msgstr "Nieuw extra veld toevoegen:" + +#: wp-admin/includes/template.php:642 +msgid "Key" +msgstr "Sleutel" + +#: wp-admin/includes/template.php:572 wp-admin/includes/template.php:587 +#: wp-admin/includes/template.php:652 wp-admin/includes/template.php:719 +msgid "Value" +msgstr "Waarde" + +#. translators: %s: Comment author, filled by Ajax. +#: wp-admin/includes/template.php:549 +msgid "Comment by %s marked as spam." +msgstr "Reactie van %s gemarkeerd als spam." + +#. translators: %s: Comment author, filled by Ajax. +#: wp-admin/includes/template.php:540 +msgid "Comment by %s moved to the Trash." +msgstr "Reactie van %s verplaatst naar de prullenbak." + +#: wp-admin/includes/template.php:496 +msgid "Submit Reply" +msgstr "Reactie verzenden" + +#: wp-admin/includes/template.php:454 +msgid "Reply to Comment" +msgstr "Op deze reactie reageren" + +#: wp-admin/includes/class-wp-posts-list-table.php:1096 +msgid "Missed schedule" +msgstr "Planning mislukt" + +#: wp-admin/includes/class-wp-posts-list-table.php:1861 +msgid "Make this post sticky" +msgstr "Dit bericht sticky maken" + +#: wp-admin/includes/class-wp-posts-list-table.php:1853 +msgid "Not Sticky" +msgstr "Niet sticky" + +#: wp-admin/includes/class-wp-posts-list-table.php:1849 +#: wp-admin/includes/class-wp-posts-list-table.php:1852 +msgid "Sticky" +msgstr "Sticky" + +#: wp-admin/includes/class-wp-posts-list-table.php:1811 +msgid "Allow Pings" +msgstr "Pings toestaan" + +#: wp-admin/includes/class-wp-posts-list-table.php:1802 +msgid "Allow Comments" +msgstr "Reacties toestaan" + +#: wp-admin/includes/class-wp-posts-list-table.php:1773 +#: wp-admin/includes/class-wp-posts-list-table.php:1786 +msgid "Do not allow" +msgstr "Niet toestaan" + +#: wp-admin/includes/class-wp-posts-list-table.php:1772 +#: wp-admin/includes/class-wp-posts-list-table.php:1785 +msgid "Allow" +msgstr "Toestaan" + +#. translators: Between password field and private checkbox on post quick edit +#. interface. +#: wp-admin/includes/class-wp-posts-list-table.php:1630 +msgid "–OR–" +msgstr "–OF–" + +#: wp-admin/includes/class-wp-posts-list-table.php:1587 +#: wp-admin/includes/class-wp-posts-list-table.php:1690 +#: wp-admin/includes/class-wp-posts-list-table.php:1729 +#: wp-admin/includes/class-wp-posts-list-table.php:1771 +#: wp-admin/includes/class-wp-posts-list-table.php:1784 +#: wp-admin/includes/class-wp-posts-list-table.php:1828 +#: wp-admin/includes/class-wp-posts-list-table.php:1851 +#: wp-admin/includes/class-wp-posts-list-table.php:1876 +msgid "— No Change —" +msgstr "— Geen wijzigingen —" + +#: wp-admin/includes/class-wp-posts-list-table.php:1532 +msgid "Bulk Edit" +msgstr "Bulkbewerken" + +#: wp-admin/includes/class-wp-links-list-table.php:137 +msgid "Visible" +msgstr "Wysiwyg" + +#: wp-admin/includes/class-wp-links-list-table.php:136 +msgid "Relationship" +msgstr "Relatie (XFN)" + +#: wp-admin/includes/class-wp-comments-list-table.php:462 +#: wp-admin/includes/class-wp-post-comments-list-table.php:27 +msgctxt "column name" +msgid "Comment" +msgstr "Reactie" + +#. translators: Column name. +#: wp-admin/includes/class-wp-media-list-table.php:347 +msgctxt "column name" +msgid "Date" +msgstr "Datum" + +#. translators: Column name. +#: wp-admin/includes/class-wp-media-list-table.php:311 +msgctxt "column name" +msgid "File" +msgstr "Bestand" + +#. translators: Posts screen column name. +#: wp-admin/includes/class-wp-posts-list-table.php:619 +msgctxt "column name" +msgid "Title" +msgstr "Titel" + +#: wp-admin/includes/class-wp-terms-list-table.php:489 +#: wp-admin/includes/class-wp-comments-list-table.php:789 +#: wp-admin/includes/class-wp-posts-list-table.php:1354 +msgid "Quick Edit" +msgstr "Snel bewerken" + +#: wp-admin/includes/class-wp-terms-list-table.php:648 +#: wp-admin/includes/class-wp-posts-list-table.php:1532 +msgid "Quick Edit" +msgstr "Snel bewerken" + +#: wp-admin/includes/schema.php:1090 +msgid "Warning! Wildcard DNS may not be configured correctly!" +msgstr "Let op. Wildcard DNS is mogelijk niet goed geconfigureerd." + +#. translators: %s: Network title. +#: wp-admin/includes/schema.php:556 +msgid "Just another %s site" +msgstr "Een andere %s site" + +#. translators: Site tagline. +#: wp-admin/includes/schema.php:405 +msgid "Just another WordPress site" +msgstr "En nog een WordPress site" + +#: wp-admin/includes/post.php:1474 +msgid "Change Permalinks" +msgstr "Permalinks aanpassen" + +#: wp-admin/includes/post.php:1461 wp-admin/includes/post.php:1486 +msgid "Permalink:" +msgstr "Permalink:" + +#: wp-admin/includes/post.php:685 +msgid "Auto Draft" +msgstr "Automatische concepten" + +#: wp-admin/includes/post.php:36 wp-admin/includes/post.php:81 +msgid "Sorry, you are not allowed to edit posts as this user." +msgstr "Je hebt geen toestemming om berichten te bewerken als deze gebruiker." + +#: wp-admin/includes/post.php:34 wp-admin/includes/post.php:79 +msgid "Sorry, you are not allowed to edit pages as this user." +msgstr "Je hebt geen toestemming om pagina's te bewerken als deze gebruiker." + +#: wp-admin/includes/plugin.php:1108 +msgid "The plugin does not have a valid header." +msgstr "De plugin heeft geen geldige “header”" + +#: wp-admin/includes/plugin.php:1103 +msgid "Plugin file does not exist." +msgstr "Pluginbestand bestaat niet." + +#: wp-admin/includes/plugin.php:1100 +msgid "Invalid plugin path." +msgstr "Ongeldig pluginpad." + +#. translators: %s: Comma-separated list of plugin filenames. +#: wp-admin/includes/plugin.php:1040 +msgid "Could not fully remove the plugins %s." +msgstr "Kon de plugins %s niet volledig verwijderen." + +#: wp-admin/includes/plugin.php:883 +msgid "One of the plugins is invalid." +msgstr "Eén van de plugins is ongeldig." + +#: wp-admin/includes/plugin.php:733 +msgid "The plugin generated unexpected output." +msgstr "De plugin heeft onverwachte uitvoer gegenereerd. " + +#: wp-admin/includes/plugin-install.php:823 +msgid "Warning: This plugin has not been tested with your current version of WordPress." +msgstr "Waarschuwing: Deze plugin is niet getest met je huidige versie van WordPress." + +#: wp-admin/includes/plugin-install.php:708 +msgid "Average Rating" +msgstr "Gemiddelde waardering" + +#: wp-admin/includes/plugin-install.php:700 +msgid "WordPress.org Plugin Page »" +msgstr "WordPress.org plugin pagina" + +#: wp-admin/includes/plugin-install.php:673 +msgid "Compatible up to:" +msgstr "Compatible tot:" + +#. translators: %s: Version number. +#: wp-admin/includes/plugin-install.php:669 +#: wp-admin/includes/plugin-install.php:679 +msgid "%s or higher" +msgstr "%s of hoger" + +#: wp-admin/includes/plugin-install.php:666 +msgid "Requires WordPress Version:" +msgstr "Vereist WordPress versie:" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:735 +#: wp-admin/includes/plugin-install.php:658 +msgid "Last Updated:" +msgstr "Laatst bijgewerkt:" + +#: wp-admin/includes/plugin-install.php:886 +msgid "Latest Version Installed" +msgstr "Meest recente versie geïnstalleerd" + +#. translators: %s: Plugin version. +#: wp-admin/includes/plugin-install.php:883 +msgid "Newer Version (%s) Installed" +msgstr "Nieuwere versie (%s) geïnstalleerd" + +#: wp-admin/includes/plugin-install.php:872 +msgid "Install Update Now" +msgstr "Update nu installeren" + +#. translators: %s: Number of ratings. +#: wp-admin/includes/plugin-install.php:722 +msgid "(based on %s rating)" +msgid_plural "(based on %s ratings)" +msgstr[0] "(Gebaseerd op %s waardering)" +msgstr[1] "(Gebaseerd op %s waarderingen)" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:537 +#: wp-admin/includes/theme-install.php:187 +#: wp-admin/includes/class-wp-theme-install-list-table.php:327 +#: wp-admin/includes/plugin-install.php:357 +#: wp-admin/includes/plugin-install.php:860 wp-admin/press-this.php:63 +#: wp-admin/import.php:160 wp-admin/js/updates.js:899 +#: wp-admin/js/updates.js:2192 wp-admin/js/updates.js:2235 +msgid "Install Now" +msgstr "Nu installeren" + +#: wp-admin/includes/plugin-install.php:355 +msgid "Plugin zip file" +msgstr "Plugin zip bestand" + +#: wp-admin/includes/plugin-install.php:352 +msgid "If you have a plugin in a .zip format, you may install or update it by uploading it here." +msgstr "Wanneer je een plugin in .zip formaat hebt, kun je deze installeren of updaten door het hier te uploaden." + +#: wp-admin/includes/plugin-install.php:337 +#: wp-admin/includes/plugin-install.php:339 +msgid "Search Plugins" +msgstr "Plugins zoeken" + +#: wp-admin/includes/plugin-install.php:282 +msgid "You may also browse based on the most popular tags in the Plugin Directory:" +msgstr "Je kunt ook zoeken met behulp van de populairste tags in de Plugin Directory:" + +#: wp-admin/includes/plugin-install.php:281 +msgid "Popular tags" +msgstr "Populaire tags" + +#: wp-admin/includes/meta-boxes.php:1372 +msgid "(Leave at 0 for no rating.)" +msgstr "(0 is geen waardering)." + +#: wp-admin/includes/class-wp-links-list-table.php:138 +#: wp-admin/includes/meta-boxes.php:1361 +msgid "Rating" +msgstr "Waardering" + +#: wp-admin/includes/meta-boxes.php:1357 +msgid "Notes" +msgstr "Notities" + +#: wp-admin/includes/meta-boxes.php:1353 +msgid "RSS Address" +msgstr "RSS-adres" + +#: wp-admin/includes/meta-boxes.php:1349 +msgid "Image Address" +msgstr "Adres van de afbeelding" + +#: wp-admin/includes/meta-boxes.php:1334 +msgid "If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out XFN." +msgstr "Als de link naar een persoon is, kun je je relatie met hen specificeren met behulp van het bovenstaande formulier. Mocht je meer informatie willen over het idee, bezoek dan XFN." + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1328 +msgid "sweetheart" +msgstr "schat" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1325 +msgid "date" +msgstr "afspraakje" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1322 +msgid "crush" +msgstr "stuk" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1319 +msgid "muse" +msgstr "muze" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1316 wp-admin/includes/meta-boxes.php:1317 +msgid "romantic" +msgstr "romantisch" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1308 +msgid "spouse" +msgstr "echtgeno(o)t(e)" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1305 +msgid "sibling" +msgstr "broer/zus" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1302 +msgid "parent" +msgstr "hoofd" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1299 +msgid "kin" +msgstr "naaste familie" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1296 +msgid "child" +msgstr "kind" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1293 wp-admin/includes/meta-boxes.php:1294 +msgid "family" +msgstr "familie" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1285 +msgid "neighbor" +msgstr "buurman/-vrouw" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1282 +msgid "co-resident" +msgstr "medebewoner" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1279 wp-admin/includes/meta-boxes.php:1280 +msgid "geographical" +msgstr "geografisch" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1274 +msgid "colleague" +msgstr "collega" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1271 +msgid "co-worker" +msgstr "medewerker" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1268 wp-admin/includes/meta-boxes.php:1269 +msgid "professional" +msgstr "beroepsmatig" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1263 +msgid "met" +msgstr "ontmoet" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1260 wp-admin/includes/meta-boxes.php:1261 +msgid "physical" +msgstr "fysiek" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1255 wp-admin/includes/meta-boxes.php:1288 +#: wp-admin/includes/meta-boxes.php:1311 +msgid "none" +msgstr "geen" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1252 +msgid "friend" +msgstr "vriend(in)" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1249 +msgid "acquaintance" +msgstr "kennis" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1246 +msgid "contact" +msgstr "contact" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1243 wp-admin/includes/meta-boxes.php:1244 +msgid "friendship" +msgstr "vriendschap" + +#: wp-admin/includes/meta-boxes.php:1239 +msgid "another web address of mine" +msgstr "een ander webadres van mij" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1235 wp-admin/includes/meta-boxes.php:1236 +msgid "identity" +msgstr "identiteit" + +#. translators: xfn: https://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1231 +msgid "rel:" +msgstr "rel:" + +#: wp-admin/includes/meta-boxes.php:1175 +msgid "Choose the target frame for your link." +msgstr "Kies het doelframe voor je link." + +#: wp-admin/includes/meta-boxes.php:1173 +msgid "_none — same window or tab." +msgstr "_none — hetzelfde venster of tabblad." + +#: wp-admin/includes/meta-boxes.php:1170 +msgid "_top — current window or tab, with no frames." +msgstr "_top — huidig venster of tabblad, zonder frames." + +#: wp-admin/includes/meta-boxes.php:1167 +msgid "_blank — new window or tab." +msgstr "_blank — nieuw venster of tabblad" + +#. translators: %s: Link name. +#: wp-admin/includes/class-wp-links-list-table.php:335 +#: wp-admin/includes/meta-boxes.php:1078 +msgid "" +"You are about to delete this link '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Je staat op het punt deze link '%s' te verwijderen.\n" +" 'Annuleren' om te stoppen, 'OK' om te verwijderen." + +#: wp-admin/includes/meta-boxes.php:1060 +msgid "Keep this link private" +msgstr "Houd deze link privé" + +#: wp-admin/includes/meta-boxes.php:1052 +msgid "Visit Link" +msgstr "Link bezoeken" + +#: wp-admin/includes/class-wp-posts-list-table.php:1684 +msgid "Main Page (no parent)" +msgstr "Hoofdpagina (geen hoofd)" + +#: wp-admin/includes/meta-boxes.php:967 +#: wp-admin/includes/class-wp-posts-list-table.php:1678 +msgid "Parent" +msgstr "Hoofd" + +#: wp-admin/includes/meta-boxes.php:872 +msgid "Show comments" +msgstr "Reacties tonen" + +#: wp-admin/includes/meta-boxes.php:740 +msgid "Separate multiple URLs with spaces" +msgstr "Scheid meerdere URL's met spaties" + +#: wp-admin/includes/meta-boxes.php:737 +msgid "Send trackbacks to:" +msgstr "Trackbacks verzenden naar:" + +#: wp-admin/includes/meta-boxes.php:727 +msgid "Already pinged:" +msgstr "Reeds gepingd:" + +#: wp-admin/includes/meta-boxes.php:1144 +msgid "New category name" +msgstr "Nieuwe categorienaam" + +#: wp-admin/includes/meta-boxes.php:1141 wp-admin/includes/meta-boxes.php:1143 +msgid "+ Add New Category" +msgstr "+ Nieuwe categorie toevoegen" + +#: wp-admin/includes/meta-boxes.php:230 wp-admin/includes/meta-boxes.php:244 +msgid "Publish immediately" +msgstr "Onmiddellijk publiceren" + +#: wp-admin/includes/meta-boxes.php:198 +msgid "Stick this post to the front page" +msgstr "Dit bericht op de startpagina plakken" + +#: wp-admin/includes/meta-boxes.php:103 wp-admin/edit-form-comment.php:98 +#: wp-admin/export.php:222 wp-admin/export.php:269 +msgid "Status:" +msgstr "Status:" + +#: wp-admin/includes/meta-boxes.php:71 +msgid "Preview Changes" +msgstr "Wijzigingen bekijken" + +#: wp-admin/includes/media.php:2948 +msgid "Link text, e.g. “Ransom Demands (PDF)”" +msgstr "Linktekst, bijvoorbeeld “Programma Wordcamp.nl (PDF)”" + +#: wp-admin/includes/media.php:2979 +msgid "Link to image" +msgstr "Naar afbeelding koppelen" + +#: wp-admin/includes/media.php:2974 +msgid "Link Image To:" +msgstr "Afbeelding linken aan:" + +#: wp-admin/includes/media.php:2904 +msgid "Image Caption" +msgstr "Onderschrift" + +#: wp-admin/includes/media.php:2856 +msgid "Filter »" +msgstr "Filter »" + +#: wp-admin/includes/media.php:2764 +msgid "All Types" +msgstr "Alle soorten" + +#: wp-admin/includes/media.php:2727 wp-admin/includes/media.php:2729 +msgid "Search Media" +msgstr "Media zoeken" + +#: wp-admin/includes/media.php:2668 +msgid "Update gallery settings" +msgstr "Galerij-instellingen bijwerken" + +#: wp-admin/includes/media.php:2647 +msgid "Gallery columns:" +msgstr "Galerijkolommen:" + +#: wp-admin/includes/media.php:2632 +msgid "Order:" +msgstr "Volgorde:" + +#: wp-admin/includes/media.php:2624 +msgid "Random" +msgstr "Willekeurig" + +#: wp-admin/includes/media.php:2623 +msgid "Date/Time" +msgstr "Datum/tijd" + +#: wp-admin/includes/media.php:2621 +msgid "Menu order" +msgstr "Menuvolgorde" + +#: wp-admin/includes/media.php:2616 +msgid "Order images by:" +msgstr "Afbeeldingen sorteren op:" + +#: wp-admin/includes/media.php:2606 +msgid "Image File" +msgstr "Afbeeldingsbestand" + +#: wp-admin/includes/media.php:2601 +msgid "Link thumbnails to:" +msgstr "Thumbnails koppelen aan:" + +#: wp-admin/includes/media.php:2559 wp-admin/includes/media.php:2640 +msgid "Descending" +msgstr "Aflopend" + +#: wp-admin/includes/media.php:2558 wp-admin/includes/media.php:2637 +msgid "Ascending" +msgstr "Oplopend" + +#: wp-admin/includes/media.php:2557 +msgid "Sort Order:" +msgstr "Sorteervolgorde:" + +#: wp-admin/includes/media.php:2553 +msgid "All Tabs:" +msgstr "Alle tabbladen:" + +#: wp-admin/includes/media.php:2361 wp-admin/includes/media.php:2580 +#: wp-admin/includes/media.php:2883 +msgid "Save all changes" +msgstr "Alle wijzigingen opslaan" + +#: wp-admin/includes/media.php:2331 +msgid "Add media files from your computer" +msgstr "Mediabestanden van je computer toevoegen" + +#: wp-admin/includes/media.php:1718 wp-admin/includes/media.php:2985 +#: wp-admin/includes/media.php:2991 +msgid "Insert into Post" +msgstr "Invoegen in bericht" + +#: wp-admin/includes/media.php:1692 +msgid "Upload date:" +msgstr "Uploaddatum:" + +#: wp-admin/includes/media.php:1609 wp-admin/includes/media.php:2555 +#: wp-admin/install.php:146 wp-admin/user-new.php:571 +#: wp-admin/user-edit.php:642 wp-admin/js/user-profile.js:74 +msgid "Hide" +msgstr "Verbergen" + +#: wp-admin/includes/media.php:1608 wp-admin/includes/media.php:2554 +#: wp-admin/js/user-profile.js:74 +msgid "Show" +msgstr "Tonen" + +#: wp-admin/includes/media.php:1417 +msgid "Location of the uploaded file." +msgstr "Locatie van het geüploade bestand." + +#: wp-admin/includes/media.php:1331 +msgid "Empty Title filled from filename." +msgstr "Lege titel wordt ingevuld vanuit de bestandsnaam." + +#: wp-admin/includes/media.php:1474 wp-admin/includes/media.php:2955 +msgid "Alt text for the image, e.g. “The Mona Lisa”" +msgstr "Alternatieve tekst voor de afbeelding, bijvoorbeeld “De nachtwacht”" + +#: wp-admin/includes/media.php:1252 wp-admin/includes/media.php:1413 +msgid "File URL" +msgstr "Bestand-URL" + +#: wp-admin/credits.php:34 wp-admin/includes/class-wp-debug-data.php:64 +#: wp-admin/includes/class-wp-privacy-policy-content.php:724 +#: wp-admin/includes/media.php:520 wp-admin/includes/template.php:2023 +#: wp-admin/privacy.php:31 wp-admin/install.php:77 wp-admin/freedoms.php:37 +#: wp-admin/upgrade.php:68 wp-admin/about.php:32 wp-admin/setup-config.php:118 +#: wp-admin/maint/repair.php:24 +msgid "WordPress" +msgstr "WordPress" + +#: wp-admin/includes/media.php:520 +msgid "Uploads" +msgstr "Uploads" + +#. translators: %s: Number of attachments. +#: wp-admin/includes/media.php:64 +msgid "Gallery (%s)" +msgstr "Galerij (%s)" + +#: wp-admin/includes/media.php:19 +msgid "From URL" +msgstr "Van URL" + +#: wp-admin/includes/media.php:18 +msgid "From Computer" +msgstr "Van computer" + +#: wp-admin/includes/image-edit.php:995 +msgid "Image saved" +msgstr "Afbeelding opgeslagen" + +#: wp-admin/includes/image-edit.php:867 +msgid "Unable to save the image." +msgstr "Kan de afbeelding niet opslaan." + +#: wp-admin/includes/image-edit.php:818 +msgid "Nothing to save, the image has not changed." +msgstr "Niets opgeslagen, de afbeelding is niet gewijzigd." + +#: wp-admin/includes/image-edit.php:809 +msgid "Error while saving the scaled image. Please reload the page and try again." +msgstr "Er is een fout opgetreden tijdens het opslaan van de geschaalde afbeelding. Ververs de pagina en probeer het opnieuw." + +#: wp-admin/includes/image-edit.php:785 +msgid "Unable to create new image." +msgstr "Kan nieuwe afbeelding niet maken." + +#: wp-admin/includes/image-edit.php:758 +msgid "Image restored successfully." +msgstr "Afbeelding is hersteld." + +#: wp-admin/includes/image-edit.php:756 +msgid "Image metadata is inconsistent." +msgstr "Metagegevens van de afbeelding zijn inconsistent." + +#: wp-admin/includes/image-edit.php:751 +msgid "Cannot save image metadata." +msgstr "Kan metagegevens van de afbeelding niet opslaan." + +#: wp-admin/includes/image-edit.php:691 +msgid "Cannot load image metadata." +msgstr "Kan afbeeldingsmetagegevens niet laden." + +#: wp-admin/includes/image-edit.php:239 +msgid "All sizes except thumbnail" +msgstr "Alle formaten, behalve de thumbnail" + +#: wp-admin/includes/image-edit.php:229 +msgid "All image sizes" +msgstr "Alle afbeeldingsafmetingen" + +#: wp-admin/includes/image-edit.php:225 +msgid "Apply changes to:" +msgstr "Wijzigingen toepassen op:" + +#: wp-admin/includes/image-edit.php:220 +msgid "Current thumbnail" +msgstr "Huidige thumbnail" + +#: wp-admin/includes/image-edit.php:211 +msgid "Thumbnail Settings" +msgstr "Thumbnail instellingen" + +#: wp-admin/includes/image-edit.php:192 +msgid "Selection:" +msgstr "Selectie:" + +#: wp-admin/includes/image-edit.php:181 +msgid "Aspect ratio:" +msgstr "Aspect ratio:" + +#: wp-admin/includes/image-edit.php:175 +msgid "Crop Selection" +msgstr "Selectie bijsnijden" + +#: wp-admin/includes/image-edit.php:172 +msgid "Crop Aspect Ratio" +msgstr "Bijsnijden aspect ratio" + +#: wp-admin/includes/image-edit.php:166 +msgid "Image Crop" +msgstr "Afbeelding bijsnijden" + +#: wp-admin/includes/image-edit.php:156 +msgid "Restore image" +msgstr "Afbeelding herstellen" + +#: wp-admin/includes/image-edit.php:151 +msgid "Previously edited copies of the image will not be deleted." +msgstr "Eerder bewerkte kopieën van de afbeelding zullen niet worden verwijderd." + +#: wp-admin/includes/image-edit.php:148 +msgid "Discard any changes and restore the original image." +msgstr "Negeer alle wijzigingen en herstel de oorspronkelijke afbeelding." + +#: wp-admin/includes/class-custom-background.php:313 +#: wp-admin/includes/class-custom-background.php:317 +msgid "Restore Original Image" +msgstr "Oorspronkelijke afbeelding herstellen" + +#. translators: %s: Image width and height in pixels. +#: wp-admin/includes/image-edit.php:115 +msgid "Original dimensions %s" +msgstr "Originele afmetingen %s" + +#: wp-admin/includes/image-edit.php:105 +msgid "Scale Image" +msgstr "Afbeelding schalen" + +#: wp-admin/includes/image-edit.php:77 +msgid "Flip horizontal" +msgstr "Horizontaal spiegelen" + +#: wp-admin/includes/image-edit.php:76 +msgid "Flip vertical" +msgstr "Verticaal spiegelen" + +#: wp-admin/includes/image-edit.php:28 wp-admin/includes/image-edit.php:826 +msgid "Image data does not exist. Please re-upload the image." +msgstr "Afbeeldinggegevens bestaan niet. Probeer de afbeelding opnieuw te uploaden." + +#: wp-admin/includes/file.php:2269 +msgid "Proceed" +msgstr "Doorgaan" + +#: wp-admin/includes/file.php:2225 +msgid "Connection Type" +msgstr "Soort verbinding" + +#: wp-admin/includes/file.php:2252 +msgid "Private Key:" +msgstr "Privésleutel:" + +#: wp-admin/includes/file.php:2248 +msgid "Public Key:" +msgstr "Publieke sleutel:" + +#: wp-admin/includes/file.php:2246 +msgid "Authentication Keys" +msgstr "Autorisatiesleutels" + +#: wp-admin/includes/file.php:2203 +msgid "Hostname" +msgstr "Hostnaam" + +#: wp-admin/includes/file.php:2169 +msgid "Connection Information" +msgstr "Verbindingsinformatie" + +#: wp-admin/includes/file.php:2142 +msgid "SSH2" +msgstr "SSH2" + +#: wp-admin/includes/file.php:2139 +msgid "FTPS (SSL)" +msgstr "FTPS (SSL)" + +#: wp-admin/includes/file.php:2136 +msgid "FTP" +msgstr "FTP" + +#: wp-admin/includes/file.php:1649 +msgid "Empty archive." +msgstr "Leeg archief." + +#: wp-admin/includes/update-core.php:1240 +#: wp-admin/includes/update-core.php:1368 wp-admin/includes/file.php:1602 +#: wp-admin/includes/file.php:1720 wp-admin/includes/file.php:1759 +msgid "Could not copy file." +msgstr "Kon bestand niet kopiëren." + +#: wp-admin/includes/file.php:1598 +msgid "Could not extract file from archive." +msgstr "Kon bestand niet uitpakken vanuit het archief." + +#: wp-admin/includes/file.php:1513 wp-admin/includes/file.php:1580 +msgid "Could not retrieve file from archive." +msgstr "Kon bestand niet ophalen uit het archief." + +#: wp-admin/includes/file.php:1046 +msgid "Could not create Temporary file." +msgstr "Kon geen tijdelijk bestand aanmaken." + +#: wp-admin/includes/file.php:1039 +msgid "Invalid URL Provided." +msgstr "URL is niet geldig" + +#: wp-admin/includes/file.php:825 +msgid "Specified file failed upload test." +msgstr "Het bestand is niet door de uploadtest gekomen." + +#: wp-admin/includes/file.php:815 +msgid "Invalid form submission." +msgstr "Ongeldige invoer in formulier." + +#: wp-admin/includes/file.php:801 +msgid "File upload stopped by extension." +msgstr "Bestandsoverdracht gestopt door extentie." + +#: wp-admin/includes/file.php:800 +msgid "Failed to write file to disk." +msgstr "Opslaan van bestand naar schijf is mislukt." + +#: wp-admin/includes/file.php:799 +msgid "Missing a temporary folder." +msgstr "Er ontbreekt een tijdelijke map." + +#: wp-admin/includes/file.php:797 +msgid "No file was uploaded." +msgstr "Geen bestand geüpload." + +#: wp-admin/includes/file.php:796 +msgid "The uploaded file was only partially uploaded." +msgstr "Het geüploade bestand is slechts gedeeltelijk geüpload." + +#: wp-admin/includes/file.php:405 wp-admin/includes/file.php:465 +#: wp-admin/includes/file.php:705 wp-admin/includes/file.php:711 +msgid "Sorry, that file cannot be edited." +msgstr "Dat bestand kan niet worden bewerkt." + +#: wp-admin/includes/file.php:63 +msgid "Popup Comments Template" +msgstr "Popup reactie template" + +#: wp-admin/includes/file.php:62 +msgid "Comments Template" +msgstr "Reactie template" + +#: wp-admin/includes/file.php:59 +msgid ".htaccess (for rewrite rules )" +msgstr ".htaccess (voor rewrite regels)" + +#: wp-admin/includes/file.php:58 +msgid "my-hacks.php (legacy hacks support)" +msgstr "my-hacks.php (ondersteuning verouderde hacks)" + +#: wp-admin/includes/file.php:45 +msgid "Application Attachment Template" +msgstr "Applicatie bijlage template" + +#: wp-admin/includes/file.php:44 +msgid "Audio Attachment Template" +msgstr "Audio bijlage template" + +#: wp-admin/includes/file.php:43 +msgid "Video Attachment Template" +msgstr "Video bijlage template" + +#: wp-admin/includes/file.php:42 +msgid "Image Attachment Template" +msgstr "Afbeelding bijlage template" + +#: wp-admin/includes/file.php:41 +msgid "Attachment Template" +msgstr "Bijlage template" + +#: wp-admin/includes/file.php:16 +msgid "Theme Functions" +msgstr "Themafuncties" + +#: wp-admin/includes/file.php:23 +msgid "Links Template" +msgstr "Links-template" + +#: wp-admin/includes/file.php:22 +msgid "404 Template" +msgstr "404 Template" + +#: wp-admin/includes/file.php:36 +msgid "Single Post" +msgstr "Enkelvoudig bericht" + +#: wp-admin/includes/file.php:21 +msgid "Search Form" +msgstr "Zoekformulier" + +#: wp-admin/erase-personal-data.php:77 wp-admin/export-personal-data.php:77 +msgid "Search Requests" +msgstr "Zoek aanvragen" + +#: wp-admin/includes/file.php:29 +msgid "Category Template" +msgstr "Categorietemplate" + +#: wp-admin/includes/file.php:64 +msgid "Popup Comments" +msgstr "Popup reacties" + +#: wp-admin/includes/file.php:56 +msgid "RTL Stylesheet" +msgstr "RTL-stylesheet" + +#: wp-admin/includes/file.php:25 +msgid "Main Index Template" +msgstr "Hoofdtemplate" + +#: wp-admin/includes/dashboard.php:1107 wp-admin/includes/dashboard.php:1286 +msgid "This widget requires JavaScript." +msgstr "Deze widget heeft JavaScript nodig." + +#. translators: 1: Type of comment, 2: Notification if the comment is pending. +#: wp-admin/includes/dashboard.php:860 +msgctxt "dashboard" +msgid "%1$s %2$s" +msgstr "%1$s op %2$s" + +#: wp-admin/includes/dashboard.php:818 wp-admin/includes/dashboard.php:825 +#: wp-admin/includes/dashboard.php:855 wp-admin/includes/dashboard.php:862 +msgid "[Pending]" +msgstr "[Wachtend]" + +#. translators: 1: Comment author, 2: Post link, 3: Notification if the comment +#. is pending. +#: wp-admin/includes/dashboard.php:815 +msgid "From %1$s on %2$s %3$s" +msgstr "Van %1$s op %2$s%3$s" + +#: wp-admin/includes/class-wp-media-list-table.php:704 +#: wp-admin/includes/class-wp-media-list-table.php:760 +#: wp-admin/includes/class-wp-comments-list-table.php:768 +#: wp-admin/includes/class-wp-posts-list-table.php:1374 +#: wp-admin/includes/dashboard.php:744 +msgctxt "verb" +msgid "Trash" +msgstr "Prullenbak" + +#: wp-admin/includes/class-wp-comments-list-table.php:767 +#: wp-admin/includes/dashboard.php:743 +msgid "Move this comment to the Trash" +msgstr "Deze reactie naar de prullenbak verplaatsen" + +#. translators: "Mark as spam" link. +#: wp-admin/includes/class-wp-comments-list-table.php:732 +#: wp-admin/includes/dashboard.php:727 +msgctxt "verb" +msgid "Spam" +msgstr "Spam" + +#: wp-admin/includes/class-wp-comments-list-table.php:730 +#: wp-admin/includes/dashboard.php:725 +msgid "Mark this comment as spam" +msgstr "Deze reactie markeren als spam" + +#: wp-admin/includes/class-wp-comments-list-table.php:798 +#: wp-admin/includes/dashboard.php:717 +msgid "Reply to this comment" +msgstr "Deze reactie beantwoorden" + +#: wp-admin/includes/class-wp-comments-list-table.php:695 +#: wp-admin/includes/class-wp-comments-list-table.php:720 +#: wp-admin/includes/dashboard.php:702 +msgid "Unapprove this comment" +msgstr "Deze reactie weigeren" + +#: wp-admin/includes/class-wp-comments-list-table.php:703 +#: wp-admin/includes/class-wp-comments-list-table.php:712 +#: wp-admin/includes/dashboard.php:694 +msgid "Approve this comment" +msgstr "Deze reactie toelaten" + +#: wp-admin/edit-form-comment.php:105 +msgid "Pending" +msgstr "In wachtrij" + +#: wp-admin/includes/nav-menu.php:465 wp-admin/includes/nav-menu.php:751 +msgid "Page" +msgstr "Pagina" + +#: wp-admin/includes/dashboard.php:196 +msgid "Configure" +msgstr "Configureren" + +#: wp-admin/includes/dashboard.php:136 +msgid "View all" +msgstr "Alles tonen" + +#: wp-admin/includes/dashboard.php:1497 +msgid "Other WordPress News" +msgstr "Overig WordPress nieuws" + +#: wp-admin/includes/dashboard.php:65 +msgid "Right Now" +msgstr "Op dit moment" + +#. translators: %s: Destination file path. +#: wp-admin/includes/file.php:915 +msgid "The uploaded file could not be moved to %s." +msgstr "Het geüploade bestand kan niet verplaatst worden naar %s." + +#: wp-admin/includes/class-file-upload-upgrader.php:56 +#: wp-admin/includes/class-file-upload-upgrader.php:95 +#: wp-admin/includes/class-file-upload-upgrader.php:111 +msgid "Please select a file" +msgstr "Een bestand selecteren" + +#. translators: %s: Theme name. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-theme-install-list-table.php:273 +#: wp-admin/includes/class-wp-posts-list-table.php:1396 +msgid "Preview “%s”" +msgstr "Voorbeeld “%s”" + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:84 +msgid "Successfully installed the theme %1$s %2$s." +msgstr "Thema %1$s %2$s is geïnstalleerd." + +#. translators: 1: Plugin name, 2: Plugin version. +#: wp-admin/includes/class-plugin-upgrader.php:86 +msgid "Successfully installed the plugin %1$s %2$s." +msgstr "Plugin %1$s %2$s is succesvol geïnstalleerd." + +#: wp-admin/includes/class-plugin-installer-skin.php:116 +#: wp-admin/includes/class-plugin-upgrader-skin.php:96 +msgid "Activate Plugin" +msgstr "Plugin activeren" + +#: wp-admin/includes/class-core-upgrader.php:35 +msgid "Could not copy files." +msgstr "Kon bestanden niet kopiëren." + +#: wp-admin/includes/class-core-upgrader.php:29 +msgid "WordPress is at the latest version." +msgstr "Dit is de meest recente versie van WordPress." + +#: wp-admin/includes/class-theme-upgrader.php:82 +msgid "Theme installed successfully." +msgstr "Thema is geïnstalleerd." + +#: wp-admin/includes/class-theme-upgrader.php:77 +msgid "Installing the theme…" +msgstr "Thema installeren…" + +#: wp-admin/includes/class-theme-upgrader.php:62 +#: wp-admin/includes/class-theme-upgrader.php:79 +msgid "Could not remove the old theme." +msgstr "Kon het oude thema niet verwijderen." + +#: wp-admin/includes/class-theme-upgrader.php:61 +#: wp-admin/includes/class-theme-upgrader.php:78 +msgid "Removing the old version of the theme…" +msgstr "Verwijderen van oudere versie van het thema…" + +#: wp-admin/includes/class-theme-upgrader.php:56 +msgid "The theme is at the latest version." +msgstr "Het thema is bijgewerkt tot de meest recente versie." + +#: wp-admin/includes/class-plugin-upgrader.php:84 +msgid "Plugin installed successfully." +msgstr "Plugin is succesvol geïnstalleerd." + +#: wp-admin/includes/class-plugin-upgrader.php:79 +msgid "Installing the plugin…" +msgstr "De plugin installeren…" + +#: wp-admin/includes/class-plugin-upgrader.php:78 +#: wp-admin/includes/class-theme-upgrader.php:76 +msgid "Unpacking the package…" +msgstr "Uitpakken van pakket…" + +#: wp-admin/includes/class-plugin-upgrader.php:75 +#: wp-admin/includes/class-theme-upgrader.php:73 +msgid "Installation package not available." +msgstr "Installatiepakket niet beschikbaar." + +#: wp-admin/includes/class-plugin-upgrader.php:63 +msgid "Could not remove the old plugin." +msgstr "Kon de oude plugin niet verwijderen." + +#: wp-admin/includes/class-plugin-upgrader.php:62 +msgid "Removing the old version of the plugin…" +msgstr "Verwijderen van oudere versie van de plugin…" + +#: wp-admin/includes/class-plugin-upgrader.php:61 +#: wp-admin/includes/class-theme-upgrader.php:60 +#: wp-admin/includes/class-core-upgrader.php:34 +#: wp-admin/includes/class-language-pack-upgrader.php:118 +msgid "Unpacking the update…" +msgstr "Uitpakken update…" + +#: wp-admin/includes/class-plugin-upgrader.php:57 +msgid "The plugin is at the latest version." +msgstr "De plugin is bijgewerkt tot de meest recente versie." + +#: wp-admin/includes/update-core.php:1195 +#: wp-admin/includes/class-wp-upgrader.php:168 +msgid "Disabling Maintenance mode…" +msgstr "Onderhoudsmodus uitschakelen…" + +#: wp-admin/includes/update-core.php:1098 +#: wp-admin/includes/class-wp-upgrader.php:167 +msgid "Enabling Maintenance mode…" +msgstr "Onderhoudsmodus inschakelen…" + +#: wp-admin/includes/file.php:1505 wp-admin/includes/file.php:1645 +msgid "Incompatible Archive." +msgstr "Archief is niet compatible" + +#: wp-admin/includes/update-core.php:1379 +#: wp-admin/includes/class-wp-upgrader.php:163 wp-admin/includes/file.php:1572 +#: wp-admin/includes/file.php:1699 wp-admin/includes/file.php:1767 +msgid "Could not create directory." +msgstr "Folder kon niet aangemaakt worden." + +#: wp-admin/includes/class-wp-upgrader.php:162 +msgid "Destination folder already exists." +msgstr "Doelmap bestaat al." + +#: wp-admin/includes/class-wp-upgrader.php:160 +msgid "Installing the latest version…" +msgstr "De laatste versie installeren…" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:63 +#: wp-admin/includes/class-wp-upgrader.php:159 +msgid "Download failed." +msgstr "Download mislukt." + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-upgrader.php:157 +msgid "Unable to locate needed folder (%s)." +msgstr "Kan de desbetreffende map (%s) niet lokaliseren." + +#: wp-admin/includes/class-wp-upgrader.php:154 wp-admin/includes/plugin.php:955 +msgid "Unable to locate WordPress plugin directory." +msgstr "Kan de WordPress pluginmap niet lokaliseren." + +#: wp-admin/includes/class-wp-upgrader.php:153 +msgid "Unable to locate WordPress content directory (wp-content)." +msgstr "Kan de WordPress contentmap (wp-content) niet lokaliseren." + +#: wp-admin/includes/class-wp-upgrader.php:152 +msgid "Unable to locate WordPress root directory." +msgstr "Kan de WordPress-map niet lokaliseren." + +#: wp-admin/includes/theme.php:66 wp-admin/includes/class-wp-upgrader.php:151 +#: wp-admin/includes/plugin.php:949 +msgid "Filesystem error." +msgstr "Bestandssysteemfout." + +#: wp-admin/includes/theme.php:62 +#: wp-admin/includes/class-wp-automatic-updater.php:401 +#: wp-admin/includes/class-wp-upgrader.php:150 wp-admin/includes/file.php:1428 +#: wp-admin/includes/plugin.php:945 +msgid "Could not access filesystem." +msgstr "Kon geen toegang krijgen tot het bestandssysteem." + +#: wp-admin/includes/class-wp-upgrader.php:149 +msgid "Invalid data provided." +msgstr "Ongeldige gegevens verstrekt." + +#. translators: %s: Command. +#: wp-admin/includes/class-wp-filesystem-ssh2.php:226 +msgid "Unable to perform command: %s" +msgstr "Niet mogelijk om commando %s uit te voeren" + +#. translators: %s: Username. +#: wp-admin/includes/class-wp-filesystem-ssh2.php:158 +msgid "Public and Private keys incorrect for %s" +msgstr "Publieke en privésleutels onjuist voor %s" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ssh2.php:131 +msgid "Failed to connect to SSH2 Server %s" +msgstr "Verbinden mislukt met SSH2-server %s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:105 +msgid "SSH2 password is required" +msgstr "SSH2-wachtwoord is vereist" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:95 +msgid "SSH2 username is required" +msgstr "SSH2-gebruikersnaam is vereist" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:81 +msgid "SSH2 hostname is required" +msgstr "SSH2-hostnaam is vereist" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:69 +msgid "The ssh2 PHP extension is not available" +msgstr "De SSH2 PHP-extensie is niet beschikbaar" + +#. translators: %s: Username. +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:113 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:110 +#: wp-admin/includes/class-wp-filesystem-ssh2.php:145 +msgid "Username/Password incorrect for %s" +msgstr "Gebruikersnaam/wachtwoord onjuist voor %s" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:87 +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:100 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:97 +msgid "Failed to connect to FTP Server %s" +msgstr "Verbinden mislukt met FTP-server %s" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:62 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:66 +msgid "FTP password is required" +msgstr "FTP-wachtwoord is vereist" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:56 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:60 +msgid "FTP username is required" +msgstr "FTP-gebruikersnaam is vereist" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:49 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:53 +msgid "FTP hostname is required" +msgstr "FTP-hostnaam is vereist" + +#: wp-admin/includes/class-wp-filesystem-ftpext.php:37 +msgid "The ftp PHP extension is not available" +msgstr "De FTP PHP-extensie is niet beschikbaar" + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-filesystem-base.php:313 +msgid "Found %s" +msgstr " %s gevonden" + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-filesystem-base.php:295 +msgid "Changing to %s" +msgstr "Over naar %s" + +#: wp-admin/includes/bookmark.php:237 +msgid "Could not insert link into the database." +msgstr "Kon de link niet invoegen in de database." + +#: wp-admin/includes/bookmark.php:229 +msgid "Could not update link in the database." +msgstr "Kon de link niet updaten in de database." + +#: wp-admin/includes/import.php:208 +msgid "Movable Type and TypePad" +msgstr "Movable Type en Typepad" + +#: wp-admin/includes/import.php:202 +msgid "LiveJournal" +msgstr "LiveJournal" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:281 +#: wp-admin/includes/class-wp-theme-install-list-table.php:151 +#: wp-admin/theme-install.php:65 wp-admin/setup-config.php:280 +msgid "Try Again" +msgstr "Probeer opnieuw" + +#: wp-admin/includes/import.php:190 +msgid "Blogger" +msgstr "Blogger" + +#: wp-admin/import.php:96 +msgid "No importers are available." +msgstr "Er zijn geen importers beschikbaar." + +#: wp-admin/export.php:320 +msgid "Download Export File" +msgstr "Exportbestand downloaden" + +#: wp-admin/export.php:172 +msgid "This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags." +msgstr "Dit format, dat we WordPress eXtended RSS ofwel WXR noemen, bevat al je berichten, pagina's, reacties, extra velden, categorieën en tags." + +#: wp-admin/export.php:171 +msgid "When you click the button below WordPress will create an XML file for you to save to your computer." +msgstr "Als je op onderstaande knop klikt, zal WordPress een XML-bestand aanmaken dat je op je computer kunt opslaan." + +#: wp-admin/export.php:18 wp-admin/menu.php:281 +msgid "Export" +msgstr "Exporteren" + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:328 +msgctxt "posts" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Alle (%s)" +msgstr[1] "Alle (%s)" + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:307 +msgctxt "posts" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Mijn (%s)" +msgstr[1] "Mijn (%s) " + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:371 +msgid "%s block not updated, somebody is editing it." +msgid_plural "%s blocks not updated, somebody is editing them." +msgstr[0] "%s blok kan niet bijgewerkt worden, het wordt momenteel door iemand bewerkt." +msgstr[1] "%s blokken kunnen niet bijgewerkt worden, ze worden momenteel door iemand bewerkt." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:342 +msgid "%s post updated." +msgid_plural "%s posts updated." +msgstr[0] "%s bericht bijgewerkt." +msgstr[1] "%s berichten bijgewerkt." + +#: wp-admin/edit-tags.php:117 wp-admin/post.php:316 wp-admin/themes.php:63 +#: wp-admin/upload.php:191 wp-admin/edit.php:164 +msgid "Sorry, you are not allowed to delete this item." +msgstr "Je hebt geen toestemming om dit item te verwijderen. " + +#: wp-admin/includes/edit-tag-messages.php:19 +msgid "Items deleted." +msgstr "Items verwijderd." + +#: wp-admin/includes/edit-tag-messages.php:17 +msgid "Item not added." +msgstr "Item niet toegevoegd." + +#: wp-admin/includes/edit-tag-messages.php:16 +msgid "Item updated." +msgstr "Item bijgewerkt." + +#: wp-admin/includes/edit-tag-messages.php:15 +msgid "Item deleted." +msgstr "Item verwijderd." + +#: wp-admin/edit-tags.php:496 wp-admin/edit-tag-form.php:181 +msgid "Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional." +msgstr "Categorieën kunnen, in tegenstelling tot tags, een hiërarchie hebben. Je zou een categorie Muziek kunnen hebben en daaronder subcategorieën voor Classic Rock en Hardrock. Dit is optioneel." + +#: wp-admin/edit-tags.php:447 wp-admin/edit-tag-form.php:134 +msgid "The name is how it appears on your site." +msgstr "De naam zoals het getoond wordt op de site." + +#: wp-admin/edit-link-form.php:133 +msgid "This will be shown when someone hovers over the link in the blogroll, or optionally below the link." +msgstr "Dit wordt getoond als iemand in het blok met links over of vlak onder de link hovert." + +#: wp-admin/edit-link-form.php:125 +msgid "Example: https://wordpress.org/ — don’t forget the https://" +msgstr "Voorbeeld: https://wordpress.org/ — vergeet de https:// niet." + +#: wp-admin/edit-link-form.php:122 +msgid "Web Address" +msgstr "Webadres" + +#: wp-admin/edit-link-form.php:117 +msgid "Example: Nifty blogging software" +msgstr "Voorbeeld: Handige software" + +#: wp-admin/edit-link-form.php:95 +msgid "Link added." +msgstr "Link toegevoegd." + +#. translators: %s: URL to Links screen. +#: wp-admin/edit-link-form.php:22 +msgid "Links / Add New Link" +msgstr "Links / Nieuwe link toevoegen" + +#: wp-admin/includes/meta-boxes.php:1087 wp-admin/edit-link-form.php:17 +msgid "Update Link" +msgstr "Link bijwerken" + +#. translators: %s: URL to Links screen. +#: wp-admin/edit-link-form.php:16 +msgid "Links / Edit Link" +msgstr "Links / Link bewerken" + +#: wp-admin/edit-tags.php:505 wp-admin/edit-tag-form.php:191 +msgid "The description is not prominent by default; however, some themes may show it." +msgstr "De beschrijving is standaard niet prominent maar wordt door sommige thema's getoond." + +#: wp-admin/edit-tags.php:453 wp-admin/edit-tag-form.php:156 +msgid "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "De “slug” is de URL-vriendelijke versie van de naam. Een slug bevat alleen (kleine) letters, cijfers en koppeltekens." + +#: wp-admin/themes.php:267 wp-admin/themes.php:271 +msgid "Visit site" +msgstr "Site bekijken" + +#: wp-admin/includes/template.php:495 +msgid "Update Comment" +msgstr "Reactie bijwerken" + +#. translators: 1: Date of last edit, 2: Time of last edit. +#. translators: 1: Post edited date, 2: Post edited time. +#: wp-admin/includes/ajax-actions.php:2816 wp-admin/edit-form-advanced.php:630 +msgid "Last edited on %1$s at %2$s" +msgstr "Laatst bewerkt op %1$s om %2$s" + +#. translators: 1: User's display name, 2: Date of last edit, 3: Time of last +#. edit. +#. translators: 1: Name of most recent post author, 2: Post edited date, 3: +#. Post edited time. +#: wp-admin/includes/ajax-actions.php:2813 wp-admin/edit-form-advanced.php:627 +msgid "Last edited by %1$s on %2$s at %3$s" +msgstr "Laatst bewerkt door %1$s op %2$s om %3$s" + +#: wp-admin/includes/meta-boxes.php:1520 +msgid "Custom Fields" +msgstr "Extra velden" + +#: wp-admin/includes/meta-boxes.php:1514 +msgid "Send Trackbacks" +msgstr "Trackbacks verzenden" + +#. translators: %s: Date and time of the revision. +#: wp-admin/edit-form-advanced.php:202 +msgid "Page restored to revision from %s." +msgstr "Pagina hersteld naar revisie van %s." + +#: wp-admin/edit-form-advanced.php:189 +msgid "Post saved." +msgstr "Bericht opgeslagen." + +#. translators: %s: Date and time of the revision. +#: wp-admin/edit-form-advanced.php:187 +msgid "Post restored to revision from %s." +msgstr "Bericht hersteld naar revisie van %s." + +#: wp-admin/edit-form-advanced.php:184 wp-admin/edit-form-advanced.php:199 +msgid "Custom field deleted." +msgstr "Extra veld verwijderd." + +#: wp-admin/edit-form-advanced.php:183 wp-admin/edit-form-advanced.php:198 +msgid "Custom field updated." +msgstr "Extra veld bijgewerkt." + +#: wp-admin/includes/class-wp-comments-list-table.php:223 +msgid "No comments found." +msgstr "Geen reacties gevonden." + +#: wp-admin/includes/class-wp-media-list-table.php:210 +#: wp-admin/includes/class-wp-comments-list-table.php:418 +#: wp-admin/includes/class-wp-posts-list-table.php:568 +msgid "Empty Trash" +msgstr "Prullenbak leegmaken" + +#: wp-admin/includes/class-wp-comments-list-table.php:418 +msgid "Empty Spam" +msgstr "Spam leegmaken" + +#: wp-admin/includes/class-wp-links-list-table.php:121 +#: wp-admin/includes/class-wp-media-list-table.php:207 +#: wp-admin/includes/class-wp-comments-list-table.php:412 +#: wp-admin/includes/class-wp-posts-list-table.php:563 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:340 +msgid "Filter" +msgstr "Filter" + +#: wp-admin/includes/class-wp-comments-list-table.php:494 +#: wp-admin/includes/class-wp-posts-list-table.php:1782 +msgid "Pings" +msgstr "Pings" + +#: wp-admin/includes/class-wp-comments-list-table.php:359 +#: wp-admin/includes/class-wp-comments-list-table.php:704 +#: wp-admin/includes/class-wp-comments-list-table.php:713 +#: wp-admin/includes/dashboard.php:695 +msgid "Approve" +msgstr "Toelaten" + +#: wp-admin/includes/class-wp-comments-list-table.php:356 +#: wp-admin/includes/class-wp-comments-list-table.php:696 +#: wp-admin/includes/class-wp-comments-list-table.php:721 +#: wp-admin/includes/dashboard.php:703 +msgid "Unapprove" +msgstr "Weigeren" + +#: wp-admin/includes/class-wp-list-table.php:488 wp-admin/edit.php:275 +msgid "Bulk actions" +msgstr "Bulkacties" + +#. translators: 1: Starting number of users on the current page, 2: Ending +#. number of users, 3: Total number of users. +#: wp-admin/includes/deprecated.php:605 +msgid "Displaying %1$s–%2$s of %3$s" +msgstr "Tonen %1$s–%2$s van %3$s" + +#: wp-admin/edit-comments.php:329 +msgid "Search Comments" +msgstr "Reacties zoeken" + +#: wp-admin/edit-form-comment.php:102 +msgid "Approved" +msgstr "Toegelaten" + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:300 +msgid "%s comment permanently deleted." +msgid_plural "%s comments permanently deleted." +msgstr[0] "%s reactie permanent verwijderd." +msgstr[1] "%s reacties permanent verwijderd." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:284 +msgid "%s comment restored from the spam." +msgid_plural "%s comments restored from the spam." +msgstr[0] "%s reactie hersteld vanuit spam." +msgstr[1] "%s reacties hersteld vanuit spam." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:279 +msgid "%s comment marked as spam." +msgid_plural "%s comments marked as spam." +msgstr[0] "%s reactie aangemerkt als spam." +msgstr[1] "%s reacties aangemerkt als spam." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:273 +msgid "%s comment approved." +msgid_plural "%s comments approved." +msgstr[0] "%s reactie goedgekeurd." +msgstr[1] "%s reacties goedgekeurd." + +#: wp-admin/includes/class-wp-media-list-table.php:184 +#: wp-admin/includes/class-wp-media-list-table.php:555 +#: wp-admin/includes/class-wp-media-list-table.php:732 +msgid "Attach" +msgstr "Bijvoegen" + +#: wp-admin/includes/class-wp-media-list-table.php:545 +msgid "(Unattached)" +msgstr "Niet gekoppeld" + +#: wp-admin/includes/class-wp-media-list-table.php:478 +#: wp-admin/includes/class-wp-posts-list-table.php:1076 +msgid "Unpublished" +msgstr "Niet gepubliceerd" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:722 +#: wp-admin/includes/class-wp-media-list-table.php:780 +#: wp-admin/includes/class-wp-posts-list-table.php:1405 +msgid "View “%s”" +msgstr "“%s” bekijken" + +#: wp-admin/includes/media.php:1724 +#: wp-admin/includes/class-wp-media-list-table.php:714 +#: wp-admin/includes/class-wp-media-list-table.php:771 +#: wp-admin/includes/class-wp-comments-list-table.php:760 +#: wp-admin/includes/class-wp-posts-list-table.php:1383 +#: wp-admin/includes/dashboard.php:736 wp-admin/edit-form-comment.php:205 +msgid "Delete Permanently" +msgstr "Permanent verwijderen" + +#. translators: %s: Link name. +#. translators: %s: Taxonomy term name. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-links-list-table.php:197 +#: wp-admin/includes/class-wp-terms-list-table.php:482 +#: wp-admin/includes/class-wp-media-list-table.php:693 +#: wp-admin/includes/class-wp-media-list-table.php:741 +#: wp-admin/includes/class-wp-posts-list-table.php:1345 +#: wp-admin/includes/dashboard.php:630 wp-admin/includes/dashboard.php:995 +msgid "Edit “%s”" +msgstr "Bewerk “%s”" + +#: wp-admin/includes/class-custom-image-header.php:856 +msgid "Choose the part of the image you want to use as your header." +msgstr "Het deel van de afbeelding kiezen die je als header wilt gebruiken." + +#: wp-admin/includes/class-custom-image-header.php:838 +#: wp-admin/includes/class-custom-image-header.php:981 +msgid "Image Processing Error" +msgstr "Afbeeldingsverwerkingsfout" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-custom-image-header.php:496 +msgid "Header updated. Visit your site to see how it looks." +msgstr "Header bijgewerkt. Bezoek je site om te zien hoe het er uit ziet." + +#: wp-admin/includes/theme.php:308 +#: wp-admin/includes/class-custom-image-header.php:475 +msgid "Custom Header" +msgstr "Header aanpassen" + +#: wp-admin/includes/template.php:2481 wp-admin/nav-menus.php:808 +#: wp-admin/options.php:402 +msgid "Save Changes" +msgstr "Wijzigingen opslaan" + +#: wp-admin/includes/class-custom-background.php:329 +#: wp-admin/includes/class-custom-image-header.php:609 +msgid "Choose an image from your computer:" +msgstr "Een afbeelding kiezen op je computer:" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-custom-background.php:247 +msgid "Background updated. Visit your site to see how it looks." +msgstr "Achtergrond bijgewerkt. De site bekijken om het resultaat te zien." + +#: wp-admin/includes/class-custom-background.php:226 +#: wp-admin/includes/theme.php:306 +msgid "Custom Background" +msgstr "Aangepaste achtergrond" + +#: wp-admin/comment.php:367 +msgid "Unknown action." +msgstr "Onbekende actie." + +#: wp-admin/comment.php:144 +msgid "Approve comment" +msgstr "Reactie goedkeuren" + +#: wp-admin/comment.php:143 +msgid "You are about to approve the following comment:" +msgstr "Je staat op het punt de volgende reactie toe te laten:" + +#: wp-admin/comment.php:140 +msgid "Permanently delete comment" +msgstr "Reactie permanent verwijderen" + +#: wp-admin/comment.php:139 +msgid "You are about to delete the following comment:" +msgstr "Je staat op het punt de volgende reactie te verwijderen:" + +#: wp-admin/comment.php:135 +msgid "You are about to move the following comment to the Trash:" +msgstr "Je staat op het punt de volgende reactie naar de prullenbak te verplaatsen:" + +#: wp-admin/comment.php:131 +msgid "You are about to mark the following comment as spam:" +msgstr "Je staat op het punt de volgende reactie als spam te markeren:" + +#: wp-admin/comment.php:86 +msgid "This comment is in the Trash. Please move it out of the Trash if you want to edit it." +msgstr "Deze reactie bevindt zich in de prullenbak. Haal het uit de prullenbak als je deze wilt bewerken." + +#: wp-admin/includes/comment.php:55 wp-admin/comment.php:279 +#: wp-admin/edit-comments.php:253 +msgid "Sorry, you are not allowed to edit comments on this post." +msgstr "Je hebt geen toestemming om reacties bij dit bericht te bewerken." + +#: wp-admin/authorize-application.php:97 wp-admin/authorize-application.php:115 +msgid "Go Back" +msgstr "Ga terug" + +#: wp-admin/includes/template.php:453 wp-admin/comment.php:56 +#: wp-admin/edit-form-comment.php:17 +msgid "Edit Comment" +msgstr "Reactie bewerken" + +#: wp-admin/admin.php:329 wp-admin/import.php:18 wp-admin/menu.php:280 +msgid "Import" +msgstr "Importeren" + +#. translators: %s: Admin page generated by a plugin. +#: wp-admin/admin.php:269 +msgid "Cannot load %s." +msgstr "Kan %s niet laden." + +#: wp-admin/admin.php:262 +msgid "Invalid plugin page." +msgstr "Ongeldige pluginpagina." + +#: wp-admin/includes/meta-boxes.php:114 wp-admin/includes/meta-boxes.php:145 +#: wp-admin/includes/ajax-actions.php:2195 +#: wp-admin/includes/class-wp-posts-list-table.php:1098 +#: wp-admin/includes/class-wp-posts-list-table.php:1833 +msgid "Scheduled" +msgstr "Gepland" + +#: wp-admin/includes/edit-tag-messages.php:18 +#: wp-admin/includes/ajax-actions.php:2131 +#: wp-admin/includes/ajax-actions.php:2137 +msgid "Item not updated." +msgstr "Item is niet bijgewerkt." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:2008 +msgid "Saving is disabled: %s is currently editing this post." +msgstr "Opslaan is uitgeschakeld: %s bewerkt dit bericht momenteel." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:2012 +msgid "Saving is disabled: %s is currently editing this page." +msgstr "Opslaan is uitgeschakeld: %s bewerkt deze pagina momenteel." + +#: wp-admin/includes/ajax-actions.php:2005 +msgid "Someone" +msgstr "Iemand" + +#. translators: %s: Date and time. +#: wp-admin/includes/misc.php:1254 +msgid "Draft saved at %s." +msgstr "Concept opgeslagen op %s." + +#. translators: Draft saved date format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-admin/includes/misc.php:1250 +msgid "g:i:s a" +msgstr "H:i" + +#: wp-admin/includes/ajax-actions.php:1581 +#: wp-admin/includes/ajax-actions.php:1589 +msgid "Please provide a custom field value." +msgstr "Geef een waarde voor een extra veld." + +#: wp-admin/includes/ajax-actions.php:1301 +msgid "Sorry, you must be logged in to reply to a comment." +msgstr "Je moet ingelogd zijn om een reactie te geven." + +#: wp-admin/includes/taxonomy.php:136 +msgid "You did not enter a category name." +msgstr "Je hebt geen categorienaam ingevoerd." + +#. translators: %d: Comment ID. +#: wp-admin/includes/ajax-actions.php:960 +msgid "Comment %d does not exist" +msgstr "Reactie %d bestaat niet" + +#: wp-admin/includes/media.php:2807 wp-admin/includes/nav-menu.php:464 +#: wp-admin/includes/nav-menu.php:750 +msgid "»" +msgstr "»" + +#: wp-admin/includes/media.php:2806 wp-admin/includes/nav-menu.php:463 +#: wp-admin/includes/nav-menu.php:749 +msgid "«" +msgstr "«" \ No newline at end of file diff --git a/wp-content/languages/continents-cities-nl_NL.mo b/wp-content/languages/continents-cities-nl_NL.mo new file mode 100644 index 00000000..21e2031e Binary files /dev/null and b/wp-content/languages/continents-cities-nl_NL.mo differ diff --git a/wp-content/languages/continents-cities-nl_NL.po b/wp-content/languages/continents-cities-nl_NL.po new file mode 100644 index 00000000..b456be07 --- /dev/null +++ b/wp-content/languages/continents-cities-nl_NL.po @@ -0,0 +1,2117 @@ +# Translation of WordPress - 5.6.x - Development - Continents & Cities in Dutch +# This file is distributed under the same license as the WordPress - 5.6.x - Development - Continents & Cities package. +msgid "" +msgstr "" +"PO-Revision-Date: 2020-12-04 18:04:05+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: nl\n" +"Project-Id-Version: WordPress - 5.6.x - Development - Continents & Cities\n" + +#: wp-admin/includes/continents-cities.php:478 +msgid "Saratov" +msgstr "Saratov" + +#: wp-admin/includes/continents-cities.php:353 +msgid "Yangon" +msgstr "Rangoon" + +#: wp-admin/includes/continents-cities.php:287 +msgid "Famagusta" +msgstr "Famagusta" + +#: wp-admin/includes/continents-cities.php:266 +msgid "Atyrau" +msgstr "Atıraw" + +#: wp-admin/includes/continents-cities.php:204 +msgid "Punta Arenas" +msgstr "Punta Arenas" + +#: wp-admin/includes/continents-cities.php:542 +msgid "Pohnpei" +msgstr "Pohnpei" + +#: wp-admin/includes/continents-cities.php:516 +msgid "Chuuk" +msgstr "Chuuk" + +#: wp-admin/includes/continents-cities.php:514 +msgid "Bougainville" +msgstr "Bougainville" + +#: wp-admin/includes/continents-cities.php:486 +msgid "Ulyanovsk" +msgstr "Oeljanovsk" + +#: wp-admin/includes/continents-cities.php:457 +msgid "Kirov" +msgstr "Kirov" + +#: wp-admin/includes/continents-cities.php:445 +msgid "Busingen" +msgstr "Büsingen" + +#: wp-admin/includes/continents-cities.php:436 +msgid "Astrakhan" +msgstr "Astrachan" + +#: wp-admin/includes/continents-cities.php:349 +msgid "Ust-Nera" +msgstr "Oest-Nera" + +#: wp-admin/includes/continents-cities.php:344 +msgid "Tomsk" +msgstr "Tomsk" + +#: wp-admin/includes/continents-cities.php:335 +msgid "Srednekolymsk" +msgstr "Srednekolymsk" + +#: wp-admin/includes/continents-cities.php:318 +msgid "Novokuznetsk" +msgstr "Novokoeznetsk" + +#: wp-admin/includes/continents-cities.php:305 +msgid "Khandyga" +msgstr "Chandyga" + +#: wp-admin/includes/continents-cities.php:303 +msgid "Kathmandu" +msgstr "Kathmandu" + +#: wp-admin/includes/continents-cities.php:290 +msgid "Hebron" +msgstr "Hebron" + +#: wp-admin/includes/continents-cities.php:276 +msgid "Chita" +msgstr "Tsjita" + +#: wp-admin/includes/continents-cities.php:271 +msgid "Barnaul" +msgstr "Barnaoel" + +#: wp-admin/includes/continents-cities.php:251 +msgid "Troll" +msgstr "Troll" + +#: wp-admin/includes/continents-cities.php:244 +msgid "Macquarie" +msgstr "Macquarie" + +#: wp-admin/includes/continents-cities.php:219 +msgid "Sitka" +msgstr "Sitka" + +#: wp-admin/includes/continents-cities.php:213 +msgid "Santarem" +msgstr "Santarém" + +#: wp-admin/includes/continents-cities.php:212 +msgid "Santa Isabel" +msgstr "Santa Isabel" + +#: wp-admin/includes/continents-cities.php:194 +msgid "Ojinaga" +msgstr "Ojinaga" + +#: wp-admin/includes/continents-cities.php:191 +msgid "Beulah" +msgstr "Beulah" + +#: wp-admin/includes/continents-cities.php:177 +msgid "Metlakatla" +msgstr "Metlakatla" + +#: wp-admin/includes/continents-cities.php:172 +msgid "Matamoros" +msgstr "Matamoros" + +#: wp-admin/includes/continents-cities.php:166 +msgid "Lower Princes" +msgstr "Lower Princes" + +#: wp-admin/includes/continents-cities.php:161 +msgid "Kralendijk" +msgstr "Kralendijk" + +#: wp-admin/includes/continents-cities.php:127 +msgid "Fort Nelson" +msgstr "Fort Nelson" + +#: wp-admin/includes/continents-cities.php:114 +msgid "Creston" +msgstr "Creston" + +#: wp-admin/includes/continents-cities.php:93 +msgid "Bahia Banderas" +msgstr "Bahia Banderas" + +#: wp-admin/includes/continents-cities.php:83 +msgid "Salta" +msgstr "Salta" + +#: wp-admin/includes/continents-cities.php:39 +msgid "Juba" +msgstr "Djoeba" + +#: wp-admin/includes/continents-cities.php:554 +msgid "Yap" +msgstr "Yap" + +#: wp-admin/includes/continents-cities.php:553 +msgid "Wallis" +msgstr "Wallis" + +#: wp-admin/includes/continents-cities.php:552 +msgid "Wake" +msgstr "Wake" + +#: wp-admin/includes/continents-cities.php:551 +msgid "Truk" +msgstr "Chuuk" + +#: wp-admin/includes/continents-cities.php:550 +msgid "Tongatapu" +msgstr "Tongatapu" + +#: wp-admin/includes/continents-cities.php:549 +msgid "Tarawa" +msgstr "Tarawa" + +#: wp-admin/includes/continents-cities.php:548 +msgid "Tahiti" +msgstr "Tahiti" + +#: wp-admin/includes/continents-cities.php:547 +msgid "Samoa" +msgstr "Samoa" + +#: wp-admin/includes/continents-cities.php:546 +msgid "Saipan" +msgstr "Saipan" + +#: wp-admin/includes/continents-cities.php:545 +msgid "Rarotonga" +msgstr "Rarotonga" + +#: wp-admin/includes/continents-cities.php:544 +msgid "Port Moresby" +msgstr "Port Moresby" + +#: wp-admin/includes/continents-cities.php:543 +msgid "Ponape" +msgstr "Pohnpei" + +#: wp-admin/includes/continents-cities.php:541 +msgid "Pitcairn" +msgstr "Pitcairn" + +#: wp-admin/includes/continents-cities.php:540 +msgid "Palau" +msgstr "Palau" + +#: wp-admin/includes/continents-cities.php:539 +msgid "Pago Pago" +msgstr "Pago Pago" + +#: wp-admin/includes/continents-cities.php:538 +msgid "Noumea" +msgstr "Nouméa" + +#: wp-admin/includes/continents-cities.php:537 +msgid "Norfolk" +msgstr "Norfolk" + +#: wp-admin/includes/continents-cities.php:536 +msgid "Niue" +msgstr "Niue" + +#: wp-admin/includes/continents-cities.php:535 +msgid "Nauru" +msgstr "Nauru" + +#: wp-admin/includes/continents-cities.php:534 +msgid "Midway" +msgstr "Midway" + +#: wp-admin/includes/continents-cities.php:533 +msgid "Marquesas" +msgstr "Marquesaseilanden" + +#: wp-admin/includes/continents-cities.php:532 +msgid "Majuro" +msgstr "Majuro" + +#: wp-admin/includes/continents-cities.php:531 +msgid "Kwajalein" +msgstr "Kwajalein" + +#: wp-admin/includes/continents-cities.php:530 +msgid "Kosrae" +msgstr "Kosrae" + +#: wp-admin/includes/continents-cities.php:529 +msgid "Kiritimati" +msgstr "Kiritimati" + +#: wp-admin/includes/continents-cities.php:528 +msgid "Johnston" +msgstr "Johnston" + +#: wp-admin/includes/continents-cities.php:527 +msgid "Honolulu" +msgstr "Honolulu" + +#: wp-admin/includes/continents-cities.php:526 +msgid "Guam" +msgstr "Guam" + +#: wp-admin/includes/continents-cities.php:525 +msgid "Guadalcanal" +msgstr "Guadalcanal" + +#: wp-admin/includes/continents-cities.php:524 +msgid "Gambier" +msgstr "Gambier" + +#: wp-admin/includes/continents-cities.php:523 +msgid "Galapagos" +msgstr "Galapagos" + +#: wp-admin/includes/continents-cities.php:522 +msgid "Funafuti" +msgstr "Funafuti" + +#: wp-admin/includes/continents-cities.php:521 +msgid "Fiji" +msgstr "Fiji" + +#: wp-admin/includes/continents-cities.php:520 +msgid "Fakaofo" +msgstr "Fakaofo" + +#: wp-admin/includes/continents-cities.php:519 +msgid "Enderbury" +msgstr "Enderbury" + +#: wp-admin/includes/continents-cities.php:518 +msgid "Efate" +msgstr "Efate" + +#: wp-admin/includes/continents-cities.php:517 +msgid "Easter" +msgstr "Paas" + +#: wp-admin/includes/continents-cities.php:515 +msgid "Chatham" +msgstr "Chatham" + +#: wp-admin/includes/continents-cities.php:513 +msgid "Auckland" +msgstr "Auckland" + +#: wp-admin/includes/continents-cities.php:512 +msgid "Apia" +msgstr "Apia" + +#: wp-admin/includes/continents-cities.php:511 +msgid "Pacific" +msgstr "Pacific" + +#: wp-admin/includes/continents-cities.php:509 +msgid "Reunion" +msgstr "Réunion" + +#: wp-admin/includes/continents-cities.php:508 +msgid "Mayotte" +msgstr "Mayotte" + +#: wp-admin/includes/continents-cities.php:507 +msgid "Mauritius" +msgstr "Mauritius" + +#: wp-admin/includes/continents-cities.php:506 +msgid "Maldives" +msgstr "Malediven" + +#: wp-admin/includes/continents-cities.php:505 +msgid "Mahe" +msgstr "Mahé" + +#: wp-admin/includes/continents-cities.php:504 +msgid "Kerguelen" +msgstr "Kerguelen" + +#: wp-admin/includes/continents-cities.php:503 +msgid "Comoro" +msgstr "Comoren" + +#: wp-admin/includes/continents-cities.php:502 +msgid "Cocos" +msgstr "Cocos" + +#: wp-admin/includes/continents-cities.php:501 +msgid "Christmas" +msgstr "Kerst" + +#: wp-admin/includes/continents-cities.php:500 +msgid "Chagos" +msgstr "Chagosarchipel" + +#: wp-admin/includes/continents-cities.php:499 +msgid "Antananarivo" +msgstr "Antananarivo" + +#: wp-admin/includes/continents-cities.php:498 +msgid "Indian" +msgstr "Indische" + +#: wp-admin/includes/continents-cities.php:496 +msgid "Zurich" +msgstr "Zürich" + +#: wp-admin/includes/continents-cities.php:495 +msgid "Zaporozhye" +msgstr "Zaporizja" + +#: wp-admin/includes/continents-cities.php:494 +msgid "Zagreb" +msgstr "Zagreb" + +#: wp-admin/includes/continents-cities.php:493 +msgid "Warsaw" +msgstr "Warschau" + +#: wp-admin/includes/continents-cities.php:492 +msgid "Volgograd" +msgstr "Wolgograd" + +#: wp-admin/includes/continents-cities.php:491 +msgid "Vilnius" +msgstr "Vilnius" + +#: wp-admin/includes/continents-cities.php:490 +msgid "Vienna" +msgstr "Wenen" + +#: wp-admin/includes/continents-cities.php:489 +msgid "Vatican" +msgstr "Vaticaanstad" + +#: wp-admin/includes/continents-cities.php:488 +msgid "Vaduz" +msgstr "Vaduz" + +#: wp-admin/includes/continents-cities.php:487 +msgid "Uzhgorod" +msgstr "Oezjhorod" + +#: wp-admin/includes/continents-cities.php:485 +msgid "Tiraspol" +msgstr "Tiraspol" + +#: wp-admin/includes/continents-cities.php:484 +msgid "Tirane" +msgstr "Tirana" + +#: wp-admin/includes/continents-cities.php:483 +msgid "Tallinn" +msgstr "Tallinn" + +#: wp-admin/includes/continents-cities.php:482 +msgid "Stockholm" +msgstr "Stockholm" + +#: wp-admin/includes/continents-cities.php:481 +msgid "Sofia" +msgstr "Sofia" + +#: wp-admin/includes/continents-cities.php:480 +msgid "Skopje" +msgstr "Skopje" + +#: wp-admin/includes/continents-cities.php:479 +msgid "Simferopol" +msgstr "Simferopol" + +#: wp-admin/includes/continents-cities.php:477 +msgid "Sarajevo" +msgstr "Sarajevo" + +#: wp-admin/includes/continents-cities.php:476 +msgid "San Marino" +msgstr "San Marino" + +#: wp-admin/includes/continents-cities.php:475 +msgid "Samara" +msgstr "Samara" + +#: wp-admin/includes/continents-cities.php:474 +msgid "Rome" +msgstr "Rome" + +#: wp-admin/includes/continents-cities.php:473 +msgid "Riga" +msgstr "Riga" + +#: wp-admin/includes/continents-cities.php:472 +msgid "Prague" +msgstr "Praag" + +#: wp-admin/includes/continents-cities.php:471 +msgid "Podgorica" +msgstr "Podgorica" + +#: wp-admin/includes/continents-cities.php:470 +msgid "Paris" +msgstr "Parijs" + +#: wp-admin/includes/continents-cities.php:469 +msgid "Oslo" +msgstr "Oslo" + +#: wp-admin/includes/continents-cities.php:467 +msgid "Moscow" +msgstr "Moskou" + +#: wp-admin/includes/continents-cities.php:466 +msgid "Monaco" +msgstr "Monaco" + +#: wp-admin/includes/continents-cities.php:465 +msgid "Minsk" +msgstr "Minsk" + +#: wp-admin/includes/continents-cities.php:464 +msgid "Mariehamn" +msgstr "Mariehamn" + +#: wp-admin/includes/continents-cities.php:463 +msgid "Malta" +msgstr "Malta" + +#: wp-admin/includes/continents-cities.php:462 +msgid "Madrid" +msgstr "Madrid" + +#: wp-admin/includes/continents-cities.php:461 +msgid "Luxembourg" +msgstr "Luxemburg" + +#: wp-admin/includes/continents-cities.php:460 +msgid "London" +msgstr "Londen" + +#: wp-admin/includes/continents-cities.php:459 +msgid "Ljubljana" +msgstr "Ljubljana" + +#: wp-admin/includes/continents-cities.php:458 +msgid "Lisbon" +msgstr "Lissabon" + +#: wp-admin/includes/continents-cities.php:456 +msgid "Kiev" +msgstr "Kiëv" + +#: wp-admin/includes/continents-cities.php:455 +msgid "Kaliningrad" +msgstr "Kaliningrad" + +#: wp-admin/includes/continents-cities.php:454 +msgid "Jersey" +msgstr "Jersey" + +#: wp-admin/includes/continents-cities.php:452 +msgid "Isle of Man" +msgstr "Man" + +#: wp-admin/includes/continents-cities.php:451 +msgid "Helsinki" +msgstr "Helsinki" + +#: wp-admin/includes/continents-cities.php:450 +msgid "Guernsey" +msgstr "Guernsey" + +#: wp-admin/includes/continents-cities.php:449 +msgid "Gibraltar" +msgstr "Gibraltar" + +#: wp-admin/includes/continents-cities.php:448 +msgid "Dublin" +msgstr "Dublin" + +#: wp-admin/includes/continents-cities.php:447 +msgid "Copenhagen" +msgstr "Kopenhagen" + +#: wp-admin/includes/continents-cities.php:446 +msgid "Chisinau" +msgstr "Chisinau" + +#: wp-admin/includes/continents-cities.php:444 +msgid "Budapest" +msgstr "Boedapest" + +#: wp-admin/includes/continents-cities.php:443 +msgid "Bucharest" +msgstr "Boekarest " + +#: wp-admin/includes/continents-cities.php:442 +msgid "Brussels" +msgstr "Brussel" + +#: wp-admin/includes/continents-cities.php:441 +msgid "Bratislava" +msgstr "Bratislava" + +#: wp-admin/includes/continents-cities.php:440 +msgid "Berlin" +msgstr "Berlijn" + +#: wp-admin/includes/continents-cities.php:439 +msgid "Belgrade" +msgstr "Belgrado" + +#: wp-admin/includes/continents-cities.php:438 +msgid "Belfast" +msgstr "Belfast" + +#: wp-admin/includes/continents-cities.php:437 +msgid "Athens" +msgstr "Athene" + +#: wp-admin/includes/continents-cities.php:435 +msgid "Andorra" +msgstr "Andorra" + +#: wp-admin/includes/continents-cities.php:434 +msgid "Amsterdam" +msgstr "Amsterdam" + +#: wp-admin/includes/continents-cities.php:433 +msgid "Europe" +msgstr "Europa" + +#: wp-admin/includes/continents-cities.php:431 +msgid "Zulu" +msgstr "Zulu" + +#: wp-admin/includes/continents-cities.php:429 +msgid "UTC" +msgstr "UTC" + +#: wp-admin/includes/continents-cities.php:430 +msgid "Universal" +msgstr "Universeel" + +#: wp-admin/includes/continents-cities.php:428 +msgid "UCT" +msgstr "UCT" + +#: wp-admin/includes/continents-cities.php:427 +msgid "Greenwich" +msgstr "Greenwich" + +#: wp-admin/includes/continents-cities.php:426 +msgid "GMT0" +msgstr "GMT0" + +#: wp-admin/includes/continents-cities.php:425 +msgid "GMT-9" +msgstr "GMT-9" + +#: wp-admin/includes/continents-cities.php:424 +msgid "GMT-8" +msgstr "GMT-8" + +#: wp-admin/includes/continents-cities.php:423 +msgid "GMT-7" +msgstr "GMT-7" + +#: wp-admin/includes/continents-cities.php:422 +msgid "GMT-6" +msgstr "GMT-6" + +#: wp-admin/includes/continents-cities.php:421 +msgid "GMT-5" +msgstr "GMT-5" + +#: wp-admin/includes/continents-cities.php:420 +msgid "GMT-4" +msgstr "GMT-4" + +#: wp-admin/includes/continents-cities.php:419 +msgid "GMT-3" +msgstr "GMT-3" + +#: wp-admin/includes/continents-cities.php:418 +msgid "GMT-2" +msgstr "GMT-2" + +#: wp-admin/includes/continents-cities.php:417 +msgid "GMT-14" +msgstr "GMT-14" + +#: wp-admin/includes/continents-cities.php:416 +msgid "GMT-13" +msgstr "GMT-13" + +#: wp-admin/includes/continents-cities.php:415 +msgid "GMT-12" +msgstr "GMT-12" + +#: wp-admin/includes/continents-cities.php:414 +msgid "GMT-11" +msgstr "GMT-11" + +#: wp-admin/includes/continents-cities.php:413 +msgid "GMT-10" +msgstr "GMT-10" + +#: wp-admin/includes/continents-cities.php:412 +msgid "GMT-1" +msgstr "GMT-1" + +#: wp-admin/includes/continents-cities.php:411 +msgid "GMT-0" +msgstr "GMT-0" + +#: wp-admin/includes/continents-cities.php:410 +msgid "GMT+9" +msgstr "GMT+9" + +#: wp-admin/includes/continents-cities.php:409 +msgid "GMT+8" +msgstr "GMT+8" + +#: wp-admin/includes/continents-cities.php:408 +msgid "GMT+7" +msgstr "GMT+7" + +#: wp-admin/includes/continents-cities.php:407 +msgid "GMT+6" +msgstr "GMT+6" + +#: wp-admin/includes/continents-cities.php:406 +msgid "GMT+5" +msgstr "GMT+5" + +#: wp-admin/includes/continents-cities.php:405 +msgid "GMT+4" +msgstr "GMT+4" + +#: wp-admin/includes/continents-cities.php:404 +msgid "GMT+3" +msgstr "GMT+3" + +#: wp-admin/includes/continents-cities.php:403 +msgid "GMT+2" +msgstr "GMT+2" + +#: wp-admin/includes/continents-cities.php:402 +msgid "GMT+12" +msgstr "GMT+12" + +#: wp-admin/includes/continents-cities.php:401 +msgid "GMT+11" +msgstr "GMT+11" + +#: wp-admin/includes/continents-cities.php:400 +msgid "GMT+10" +msgstr "GMT+10" + +#: wp-admin/includes/continents-cities.php:399 +msgid "GMT+1" +msgstr "GMT+1" + +#: wp-admin/includes/continents-cities.php:398 +msgid "GMT+0" +msgstr "GMT+0" + +#: wp-admin/includes/continents-cities.php:397 +msgid "GMT" +msgstr "GMT" + +#: wp-admin/includes/continents-cities.php:396 +msgid "Etc" +msgstr "Enz" + +#: wp-admin/includes/continents-cities.php:394 +msgid "Yancowinna" +msgstr "Yancowinna" + +#: wp-admin/includes/continents-cities.php:393 +msgid "West" +msgstr "West" + +#: wp-admin/includes/continents-cities.php:392 +msgid "Victoria" +msgstr "Victoria" + +#: wp-admin/includes/continents-cities.php:391 +msgid "Tasmania" +msgstr "Tasmanië" + +#: wp-admin/includes/continents-cities.php:390 +msgid "Sydney" +msgstr "Sydney" + +#: wp-admin/includes/continents-cities.php:389 +msgid "South" +msgstr "Zuid" + +#: wp-admin/includes/continents-cities.php:388 +msgid "Queensland" +msgstr "Queensland" + +#: wp-admin/includes/continents-cities.php:387 +msgid "Perth" +msgstr "Perth" + +#: wp-admin/includes/continents-cities.php:385 +msgid "NSW" +msgstr "NSW" + +#: wp-admin/includes/continents-cities.php:386 +msgid "North" +msgstr "Noord" + +#: wp-admin/includes/continents-cities.php:384 +msgid "Melbourne" +msgstr "Melbourne" + +#: wp-admin/includes/continents-cities.php:383 +msgid "Lord Howe" +msgstr "Lord Howe" + +#: wp-admin/includes/continents-cities.php:382 +msgid "Lindeman" +msgstr "Lindeman" + +#: wp-admin/includes/continents-cities.php:381 +msgid "LHI" +msgstr "LHI" + +#: wp-admin/includes/continents-cities.php:380 +msgid "Hobart" +msgstr "Hobart" + +#: wp-admin/includes/continents-cities.php:379 +msgid "Eucla" +msgstr "Eucla" + +#: wp-admin/includes/continents-cities.php:378 +msgid "Darwin" +msgstr "Darwin" + +#: wp-admin/includes/continents-cities.php:377 +msgid "Currie" +msgstr "Currie" + +#: wp-admin/includes/continents-cities.php:376 +msgid "Canberra" +msgstr "Canberra" + +#: wp-admin/includes/continents-cities.php:375 +msgid "Broken Hill" +msgstr "Broken Hill" + +#: wp-admin/includes/continents-cities.php:374 +msgid "Brisbane" +msgstr "Brisbane" + +#: wp-admin/includes/continents-cities.php:373 +msgid "Adelaide" +msgstr "Adelaide" + +#: wp-admin/includes/continents-cities.php:372 +msgid "ACT" +msgstr "ACT" + +#: wp-admin/includes/continents-cities.php:371 +msgid "Australia" +msgstr "Australië" + +#: wp-admin/includes/continents-cities.php:369 +msgid "Stanley" +msgstr "Stanley" + +#: wp-admin/includes/continents-cities.php:368 +msgid "St Helena" +msgstr "St Helena" + +#: wp-admin/includes/continents-cities.php:367 +msgid "South Georgia" +msgstr "Zuid-Geogië" + +#: wp-admin/includes/continents-cities.php:366 +msgid "Reykjavik" +msgstr "Reykjavik" + +#: wp-admin/includes/continents-cities.php:365 +msgid "Madeira" +msgstr "Madeira" + +#: wp-admin/includes/continents-cities.php:364 +msgid "Jan Mayen" +msgstr "Jan Mayen" + +#: wp-admin/includes/continents-cities.php:363 +msgid "Faroe" +msgstr "Faroe" + +#: wp-admin/includes/continents-cities.php:362 +msgid "Faeroe" +msgstr "Faroe" + +#: wp-admin/includes/continents-cities.php:361 +msgid "Cape Verde" +msgstr "Kaapverdië" + +#: wp-admin/includes/continents-cities.php:360 +msgid "Canary" +msgstr "Canarische" + +#: wp-admin/includes/continents-cities.php:359 +msgid "Bermuda" +msgstr "Bermuda" + +#: wp-admin/includes/continents-cities.php:358 +msgid "Azores" +msgstr "Azoren" + +#: wp-admin/includes/continents-cities.php:357 +msgid "Atlantic" +msgstr "Atlantische" + +#: wp-admin/includes/continents-cities.php:355 +msgid "Yerevan" +msgstr "Yerevan" + +#: wp-admin/includes/continents-cities.php:354 +msgid "Yekaterinburg" +msgstr "Yekaterinburg" + +#: wp-admin/includes/continents-cities.php:352 +msgid "Yakutsk" +msgstr "Jakoetsk" + +#: wp-admin/includes/continents-cities.php:351 +msgid "Vladivostok" +msgstr "Vladivostok" + +#: wp-admin/includes/continents-cities.php:350 +msgid "Vientiane" +msgstr "Vientiane" + +#: wp-admin/includes/continents-cities.php:348 +msgid "Urumqi" +msgstr "Urumqi" + +#: wp-admin/includes/continents-cities.php:347 +msgid "Ulan Bator" +msgstr "Ulan Bator" + +#: wp-admin/includes/continents-cities.php:346 +msgid "Ulaanbaatar" +msgstr "Ulaanbaatar" + +#: wp-admin/includes/continents-cities.php:345 +msgid "Ujung Pandang" +msgstr "Ujung Pandang" + +#: wp-admin/includes/continents-cities.php:343 +msgid "Tokyo" +msgstr "Tokyo" + +#: wp-admin/includes/continents-cities.php:342 +msgid "Thimphu" +msgstr "Thimphu" + +#: wp-admin/includes/continents-cities.php:341 +msgid "Thimbu" +msgstr "Thimbu" + +#: wp-admin/includes/continents-cities.php:340 +msgid "Tel Aviv" +msgstr "Tel Aviv" + +#: wp-admin/includes/continents-cities.php:339 +msgid "Tehran" +msgstr "Teheran" + +#: wp-admin/includes/continents-cities.php:338 +msgid "Tbilisi" +msgstr "Tbilisi" + +#: wp-admin/includes/continents-cities.php:337 +msgid "Tashkent" +msgstr "Tashkent" + +#: wp-admin/includes/continents-cities.php:336 +msgid "Taipei" +msgstr "Taipei" + +#: wp-admin/includes/continents-cities.php:334 +msgid "Singapore" +msgstr "Singapore" + +#: wp-admin/includes/continents-cities.php:333 +msgid "Shanghai" +msgstr "Shanghai" + +#: wp-admin/includes/continents-cities.php:332 +msgid "Seoul" +msgstr "Seoul" + +#: wp-admin/includes/continents-cities.php:331 +msgid "Samarkand" +msgstr "Samarkand" + +#: wp-admin/includes/continents-cities.php:330 +msgid "Sakhalin" +msgstr "Sachalin" + +#: wp-admin/includes/continents-cities.php:329 +msgid "Saigon" +msgstr "Ho Chi Minhstad" + +#: wp-admin/includes/continents-cities.php:328 +msgid "Riyadh" +msgstr "Riyad" + +#: wp-admin/includes/continents-cities.php:327 +msgid "Rangoon" +msgstr "Rangoon" + +#: wp-admin/includes/continents-cities.php:326 +msgid "Qyzylorda" +msgstr "Qızılorda" + +#: wp-admin/includes/continents-cities.php:325 +msgid "Qatar" +msgstr "Qatar" + +#: wp-admin/includes/continents-cities.php:324 +msgid "Pyongyang" +msgstr "Pyongyang" + +#: wp-admin/includes/continents-cities.php:323 +msgid "Pontianak" +msgstr "Pontianak" + +#: wp-admin/includes/continents-cities.php:322 +msgid "Phnom Penh" +msgstr "Phnom-Penh" + +#: wp-admin/includes/continents-cities.php:321 +msgid "Oral" +msgstr "Oral" + +#: wp-admin/includes/continents-cities.php:320 +msgid "Omsk" +msgstr "Omsk" + +#: wp-admin/includes/continents-cities.php:319 +msgid "Novosibirsk" +msgstr "Novosibirsk" + +#: wp-admin/includes/continents-cities.php:317 +#: wp-admin/includes/continents-cities.php:468 +msgid "Nicosia" +msgstr "Nicosia" + +#: wp-admin/includes/continents-cities.php:316 +msgid "Muscat" +msgstr "Masqat" + +#: wp-admin/includes/continents-cities.php:315 +msgid "Manila" +msgstr "Manilla" + +#: wp-admin/includes/continents-cities.php:314 +msgid "Makassar" +msgstr "Makassar" + +#: wp-admin/includes/continents-cities.php:313 +msgid "Magadan" +msgstr "Magadan" + +#: wp-admin/includes/continents-cities.php:312 +msgid "Macau" +msgstr "Macau" + +#: wp-admin/includes/continents-cities.php:311 +msgid "Macao" +msgstr "Macao" + +#: wp-admin/includes/continents-cities.php:310 +msgid "Kuwait" +msgstr "Koeweit" + +#: wp-admin/includes/continents-cities.php:309 +msgid "Kuching" +msgstr "Kuching" + +#: wp-admin/includes/continents-cities.php:308 +msgid "Kuala Lumpur" +msgstr "Kuala Lumpur" + +#: wp-admin/includes/continents-cities.php:307 +msgid "Krasnoyarsk" +msgstr "Krasnojarsk" + +#: wp-admin/includes/continents-cities.php:306 +msgid "Kolkata" +msgstr "Calcutta" + +#: wp-admin/includes/continents-cities.php:304 +msgid "Katmandu" +msgstr "Kathmandu" + +#: wp-admin/includes/continents-cities.php:302 +msgid "Kashgar" +msgstr "Kashgar" + +#: wp-admin/includes/continents-cities.php:301 +msgid "Karachi" +msgstr "Karachi" + +#: wp-admin/includes/continents-cities.php:300 +msgid "Kamchatka" +msgstr "Kamtsjatka" + +#: wp-admin/includes/continents-cities.php:299 +msgid "Kabul" +msgstr "Kaboel" + +#: wp-admin/includes/continents-cities.php:298 +msgid "Jerusalem" +msgstr "Jeruzalem" + +#: wp-admin/includes/continents-cities.php:297 +msgid "Jayapura" +msgstr "Jayapura" + +#: wp-admin/includes/continents-cities.php:296 +msgid "Jakarta" +msgstr "Jakarta" + +#: wp-admin/includes/continents-cities.php:295 +#: wp-admin/includes/continents-cities.php:453 +msgid "Istanbul" +msgstr "Istanbul" + +#: wp-admin/includes/continents-cities.php:294 +msgid "Irkutsk" +msgstr "Irkoetsk" + +#: wp-admin/includes/continents-cities.php:293 +msgid "Hovd" +msgstr "Hovd" + +#: wp-admin/includes/continents-cities.php:292 +msgid "Hong Kong" +msgstr "Hong Kong" + +#: wp-admin/includes/continents-cities.php:291 +msgid "Ho Chi Minh" +msgstr "Ho Chi Minhstad" + +#: wp-admin/includes/continents-cities.php:289 +msgid "Harbin" +msgstr "Harbin" + +#: wp-admin/includes/continents-cities.php:288 +msgid "Gaza" +msgstr "Gaza" + +#: wp-admin/includes/continents-cities.php:286 +msgid "Dushanbe" +msgstr "Dushanbe" + +#: wp-admin/includes/continents-cities.php:285 +msgid "Dubai" +msgstr "Dubai" + +#: wp-admin/includes/continents-cities.php:284 +msgid "Dili" +msgstr "Dili" + +#: wp-admin/includes/continents-cities.php:283 +msgid "Dhaka" +msgstr "Dhaka" + +#: wp-admin/includes/continents-cities.php:282 +msgid "Damascus" +msgstr "Damascus" + +#: wp-admin/includes/continents-cities.php:281 +msgid "Dacca" +msgstr "Dhaka" + +#: wp-admin/includes/continents-cities.php:280 +msgid "Colombo" +msgstr "Colombo" + +#: wp-admin/includes/continents-cities.php:279 +msgid "Chungking" +msgstr "Chungking" + +#: wp-admin/includes/continents-cities.php:278 +msgid "Chongqing" +msgstr "Tsjoengking" + +#: wp-admin/includes/continents-cities.php:277 +msgid "Choibalsan" +msgstr "Choibalsan" + +#: wp-admin/includes/continents-cities.php:275 +msgid "Calcutta" +msgstr "Calcutta" + +#: wp-admin/includes/continents-cities.php:274 +msgid "Brunei" +msgstr "Brunei" + +#: wp-admin/includes/continents-cities.php:273 +msgid "Bishkek" +msgstr "Bisjkek" + +#: wp-admin/includes/continents-cities.php:272 +msgid "Beirut" +msgstr "Beiroet" + +#: wp-admin/includes/continents-cities.php:270 +msgid "Bangkok" +msgstr "Bangkok" + +#: wp-admin/includes/continents-cities.php:269 +msgid "Baku" +msgstr "Bakoe" + +#: wp-admin/includes/continents-cities.php:268 +msgid "Bahrain" +msgstr "Bahrein" + +#: wp-admin/includes/continents-cities.php:267 +msgid "Baghdad" +msgstr "Bagdad" + +#: wp-admin/includes/continents-cities.php:265 +msgid "Ashkhabad" +msgstr "Asjchabad" + +#: wp-admin/includes/continents-cities.php:264 +msgid "Ashgabat" +msgstr "Asjchabad" + +#: wp-admin/includes/continents-cities.php:263 +msgid "Aqtobe" +msgstr "Aqtöbe" + +#: wp-admin/includes/continents-cities.php:262 +msgid "Aqtau" +msgstr "Aqtau" + +#: wp-admin/includes/continents-cities.php:261 +msgid "Anadyr" +msgstr "Anadyr" + +#: wp-admin/includes/continents-cities.php:260 +msgid "Amman" +msgstr "Amman" + +#: wp-admin/includes/continents-cities.php:259 +msgid "Almaty" +msgstr "Alma-Ata" + +#: wp-admin/includes/continents-cities.php:258 +msgid "Aden" +msgstr "Aden" + +#: wp-admin/includes/continents-cities.php:257 +msgid "Asia" +msgstr "Azië" + +#: wp-admin/includes/continents-cities.php:255 +msgid "Longyearbyen" +msgstr "Longyearbyen" + +#: wp-admin/includes/continents-cities.php:254 +msgid "Arctic" +msgstr "Arctis" + +#: wp-admin/includes/continents-cities.php:252 +msgid "Vostok" +msgstr "Vostok" + +#: wp-admin/includes/continents-cities.php:250 +msgid "Syowa" +msgstr "Showa Station" + +#: wp-admin/includes/continents-cities.php:249 +msgid "South Pole" +msgstr "Zuidpool" + +#: wp-admin/includes/continents-cities.php:248 +msgid "Rothera" +msgstr "Rothera" + +#: wp-admin/includes/continents-cities.php:247 +msgid "Palmer" +msgstr "Palmer" + +#: wp-admin/includes/continents-cities.php:246 +msgid "McMurdo" +msgstr "McMurdo" + +#: wp-admin/includes/continents-cities.php:245 +msgid "Mawson" +msgstr "Mawson Peak" + +#: wp-admin/includes/continents-cities.php:243 +msgid "DumontDUrville" +msgstr "Dumont d'Urville" + +#: wp-admin/includes/continents-cities.php:242 +msgid "Davis" +msgstr "Davis" + +#: wp-admin/includes/continents-cities.php:241 +msgid "Casey" +msgstr "Casey" + +#: wp-admin/includes/continents-cities.php:240 +msgid "Antarctica" +msgstr "Antarctica" + +#: wp-admin/includes/continents-cities.php:238 +msgid "Yellowknife" +msgstr "Yellowknife" + +#: wp-admin/includes/continents-cities.php:237 +msgid "Yakutat" +msgstr "Yakutat" + +#: wp-admin/includes/continents-cities.php:236 +msgid "Winnipeg" +msgstr "Winnipeg" + +#: wp-admin/includes/continents-cities.php:235 +msgid "Whitehorse" +msgstr "Whitehorse" + +#: wp-admin/includes/continents-cities.php:234 +msgid "Virgin" +msgstr "Maagden" + +#: wp-admin/includes/continents-cities.php:233 +msgid "Vancouver" +msgstr "Vancouver" + +#: wp-admin/includes/continents-cities.php:232 +msgid "Tortola" +msgstr "Tortola" + +#: wp-admin/includes/continents-cities.php:231 +msgid "Toronto" +msgstr "Toronto" + +#: wp-admin/includes/continents-cities.php:230 +msgid "Tijuana" +msgstr "Tijuana" + +#: wp-admin/includes/continents-cities.php:229 +msgid "Thunder Bay" +msgstr "Thunder Bay" + +#: wp-admin/includes/continents-cities.php:228 +msgid "Thule" +msgstr "Thule" + +#: wp-admin/includes/continents-cities.php:227 +msgid "Tegucigalpa" +msgstr "Tegucigalpa" + +#: wp-admin/includes/continents-cities.php:226 +msgid "Swift Current" +msgstr "Swift Current" + +#: wp-admin/includes/continents-cities.php:225 +msgid "St Vincent" +msgstr "Saint Vincent en de Grenadines" + +#: wp-admin/includes/continents-cities.php:224 +msgid "St Thomas" +msgstr "Saint Thomas" + +#: wp-admin/includes/continents-cities.php:223 +msgid "St Lucia" +msgstr "Saint Lucia" + +#: wp-admin/includes/continents-cities.php:222 +msgid "St Kitts" +msgstr "Saint Kitts" + +#: wp-admin/includes/continents-cities.php:221 +msgid "St Johns" +msgstr "St. John's" + +#: wp-admin/includes/continents-cities.php:220 +msgid "St Barthelemy" +msgstr "Sint-Bartholomeus" + +#: wp-admin/includes/continents-cities.php:218 +msgid "Shiprock" +msgstr "Shiprock" + +#: wp-admin/includes/continents-cities.php:217 +msgid "Scoresbysund" +msgstr "Scoresbysund" + +#: wp-admin/includes/continents-cities.php:216 +msgid "Sao Paulo" +msgstr "Sao Paulo" + +#: wp-admin/includes/continents-cities.php:215 +msgid "Santo Domingo" +msgstr "Santo Domingo" + +#: wp-admin/includes/continents-cities.php:214 +msgid "Santiago" +msgstr "Santiago" + +#: wp-admin/includes/continents-cities.php:211 +msgid "Rosario" +msgstr "Rosario" + +#: wp-admin/includes/continents-cities.php:210 +msgid "Rio Branco" +msgstr "Rio Branco" + +#: wp-admin/includes/continents-cities.php:209 +msgid "Resolute" +msgstr "Resolute" + +#: wp-admin/includes/continents-cities.php:208 +msgid "Regina" +msgstr "Regina" + +#: wp-admin/includes/continents-cities.php:207 +msgid "Recife" +msgstr "Recife" + +#: wp-admin/includes/continents-cities.php:206 +msgid "Rankin Inlet" +msgstr "Rankin Inlet" + +#: wp-admin/includes/continents-cities.php:205 +msgid "Rainy River" +msgstr "Rainy River" + +#: wp-admin/includes/continents-cities.php:203 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#: wp-admin/includes/continents-cities.php:202 +msgid "Porto Velho" +msgstr "Porto Velho" + +#: wp-admin/includes/continents-cities.php:201 +msgid "Porto Acre" +msgstr "Porto Acre" + +#: wp-admin/includes/continents-cities.php:199 +msgid "Port of Spain" +msgstr "Port of Spain" + +#: wp-admin/includes/continents-cities.php:200 +msgid "Port-au-Prince" +msgstr "Port-au-Prince" + +#: wp-admin/includes/continents-cities.php:198 +msgid "Phoenix" +msgstr "Phoenix" + +#: wp-admin/includes/continents-cities.php:197 +msgid "Paramaribo" +msgstr "Paramaribo" + +#: wp-admin/includes/continents-cities.php:196 +msgid "Pangnirtung" +msgstr "Pangnirtung" + +#: wp-admin/includes/continents-cities.php:195 +msgid "Panama" +msgstr "Panama" + +#: wp-admin/includes/continents-cities.php:193 +msgid "New Salem" +msgstr "New Salem" + +#: wp-admin/includes/continents-cities.php:192 +msgid "Center" +msgstr "Centrum" + +#: wp-admin/includes/continents-cities.php:190 +msgid "North Dakota" +msgstr "Noord-Dakota" + +#: wp-admin/includes/continents-cities.php:189 +msgid "Noronha" +msgstr "Noronha" + +#: wp-admin/includes/continents-cities.php:188 +msgid "Nome" +msgstr "Nome" + +#: wp-admin/includes/continents-cities.php:187 +msgid "Nipigon" +msgstr "Nipigon" + +#: wp-admin/includes/continents-cities.php:186 +msgid "New York" +msgstr "New York" + +#: wp-admin/includes/continents-cities.php:185 +msgid "Nassau" +msgstr "Nassau" + +#: wp-admin/includes/continents-cities.php:184 +msgid "Montserrat" +msgstr "Montserrat" + +#: wp-admin/includes/continents-cities.php:183 +msgid "Montreal" +msgstr "Montreal" + +#: wp-admin/includes/continents-cities.php:182 +msgid "Montevideo" +msgstr "Montevideo" + +#: wp-admin/includes/continents-cities.php:181 +msgid "Monterrey" +msgstr "Monterrey" + +#: wp-admin/includes/continents-cities.php:180 +msgid "Moncton" +msgstr "Moncton" + +#: wp-admin/includes/continents-cities.php:179 +msgid "Miquelon" +msgstr "Miquelon" + +#: wp-admin/includes/continents-cities.php:178 +msgid "Mexico City" +msgstr "Mexicostad" + +#: wp-admin/includes/continents-cities.php:176 +msgid "Merida" +msgstr "Merida" + +#: wp-admin/includes/continents-cities.php:175 +msgid "Menominee" +msgstr "Menominee" + +#: wp-admin/includes/continents-cities.php:173 +msgid "Mazatlan" +msgstr "Mazatlan" + +#: wp-admin/includes/continents-cities.php:171 +msgid "Martinique" +msgstr "Martinique" + +#: wp-admin/includes/continents-cities.php:170 +msgid "Marigot" +msgstr "Marigot" + +#: wp-admin/includes/continents-cities.php:169 +msgid "Manaus" +msgstr "Manaus" + +#: wp-admin/includes/continents-cities.php:168 +msgid "Managua" +msgstr "Managua" + +#: wp-admin/includes/continents-cities.php:167 +msgid "Maceio" +msgstr "Maceio" + +#: wp-admin/includes/continents-cities.php:164 +msgid "Los Angeles" +msgstr "Los Angeles" + +#: wp-admin/includes/continents-cities.php:163 +msgid "Lima" +msgstr "Lima" + +#: wp-admin/includes/continents-cities.php:162 +msgid "La Paz" +msgstr "La Paz" + +#: wp-admin/includes/continents-cities.php:160 +msgid "Knox IN" +msgstr "Knox IN" + +#: wp-admin/includes/continents-cities.php:159 +msgid "Monticello" +msgstr "Monticello" + +#: wp-admin/includes/continents-cities.php:158 +#: wp-admin/includes/continents-cities.php:165 +msgid "Louisville" +msgstr "Louisville" + +#: wp-admin/includes/continents-cities.php:157 +msgid "Kentucky" +msgstr "Kentucky" + +#: wp-admin/includes/continents-cities.php:156 +msgid "Juneau" +msgstr "Juneau" + +#: wp-admin/includes/continents-cities.php:154 +msgid "Jamaica" +msgstr "Jamaica" + +#: wp-admin/includes/continents-cities.php:153 +msgid "Iqaluit" +msgstr "Iqaluit" + +#: wp-admin/includes/continents-cities.php:152 +msgid "Inuvik" +msgstr "Inuvik" + +#: wp-admin/includes/continents-cities.php:150 +msgid "Winamac" +msgstr "Winamac" + +#: wp-admin/includes/continents-cities.php:149 +msgid "Vincennes" +msgstr "Vincennes" + +#: wp-admin/includes/continents-cities.php:148 +msgid "Vevay" +msgstr "Vevay" + +#: wp-admin/includes/continents-cities.php:147 +msgid "Tell City" +msgstr "Tell City" + +#: wp-admin/includes/continents-cities.php:146 +msgid "Petersburg" +msgstr "Petersburg" + +#: wp-admin/includes/continents-cities.php:145 +msgid "Marengo" +msgstr "Marengo" + +#: wp-admin/includes/continents-cities.php:144 +msgid "Knox" +msgstr "Knox" + +#: wp-admin/includes/continents-cities.php:143 +#: wp-admin/includes/continents-cities.php:151 +msgid "Indianapolis" +msgstr "Indianapolis" + +#: wp-admin/includes/continents-cities.php:142 +msgid "Indiana" +msgstr "Indiana" + +#: wp-admin/includes/continents-cities.php:141 +msgid "Hermosillo" +msgstr "Hermosillo" + +#: wp-admin/includes/continents-cities.php:140 +msgid "Havana" +msgstr "Havana" + +#: wp-admin/includes/continents-cities.php:139 +msgid "Halifax" +msgstr "Halifax" + +#: wp-admin/includes/continents-cities.php:138 +msgid "Guyana" +msgstr "Guyana" + +#: wp-admin/includes/continents-cities.php:137 +msgid "Guayaquil" +msgstr "Guayaquil" + +#: wp-admin/includes/continents-cities.php:136 +msgid "Guatemala" +msgstr "Guatemala" + +#: wp-admin/includes/continents-cities.php:135 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#: wp-admin/includes/continents-cities.php:134 +msgid "Grenada" +msgstr "Grenada" + +#: wp-admin/includes/continents-cities.php:133 +msgid "Grand Turk" +msgstr "Grand Turk" + +#: wp-admin/includes/continents-cities.php:132 +msgid "Goose Bay" +msgstr "Goose Bay" + +#: wp-admin/includes/continents-cities.php:131 +msgid "Godthab" +msgstr "Godthåb" + +#: wp-admin/includes/continents-cities.php:130 +msgid "Glace Bay" +msgstr "Glace Bay" + +#: wp-admin/includes/continents-cities.php:129 +msgid "Fortaleza" +msgstr "Fortaleza" + +#: wp-admin/includes/continents-cities.php:128 +msgid "Fort Wayne" +msgstr "Fort Wayne" + +#: wp-admin/includes/continents-cities.php:126 +msgid "Ensenada" +msgstr "Ensenada" + +#: wp-admin/includes/continents-cities.php:125 +msgid "El Salvador" +msgstr "El Salvador" + +#: wp-admin/includes/continents-cities.php:124 +msgid "Eirunepe" +msgstr "Eirunepé" + +#: wp-admin/includes/continents-cities.php:123 +msgid "Edmonton" +msgstr "Edmonton" + +#: wp-admin/includes/continents-cities.php:122 +msgid "Dominica" +msgstr "Dominica" + +#: wp-admin/includes/continents-cities.php:121 +msgid "Detroit" +msgstr "Detroit" + +#: wp-admin/includes/continents-cities.php:120 +msgid "Denver" +msgstr "Denver" + +#: wp-admin/includes/continents-cities.php:119 +msgid "Dawson Creek" +msgstr "Dawson Creek" + +#: wp-admin/includes/continents-cities.php:118 +msgid "Dawson" +msgstr "Dawson" + +#: wp-admin/includes/continents-cities.php:117 +msgid "Danmarkshavn" +msgstr "Danmarkshavn" + +#: wp-admin/includes/continents-cities.php:116 +msgid "Curacao" +msgstr "Curaçao" + +#: wp-admin/includes/continents-cities.php:115 +msgid "Cuiaba" +msgstr "Cuiabá" + +#: wp-admin/includes/continents-cities.php:113 +msgid "Costa Rica" +msgstr "Costa Rica" + +#: wp-admin/includes/continents-cities.php:111 +msgid "Coral Harbour" +msgstr "Coral Harbour" + +#: wp-admin/includes/continents-cities.php:110 +msgid "Chihuahua" +msgstr "Chihuahua" + +#: wp-admin/includes/continents-cities.php:109 +msgid "Chicago" +msgstr "Chicago" + +#: wp-admin/includes/continents-cities.php:108 +msgid "Cayman" +msgstr "Kaaiman" + +#: wp-admin/includes/continents-cities.php:107 +msgid "Cayenne" +msgstr "Cayenne" + +#: wp-admin/includes/continents-cities.php:105 +msgid "Caracas" +msgstr "Caracas" + +#: wp-admin/includes/continents-cities.php:104 +msgid "Cancun" +msgstr "Cancun" + +#: wp-admin/includes/continents-cities.php:103 +msgid "Campo Grande" +msgstr "Campo Grande" + +#: wp-admin/includes/continents-cities.php:102 +msgid "Cambridge Bay" +msgstr "Cambridge Bay" + +#: wp-admin/includes/continents-cities.php:100 +msgid "Boise" +msgstr "Boise" + +#: wp-admin/includes/continents-cities.php:99 +msgid "Bogota" +msgstr "Bogota" + +#: wp-admin/includes/continents-cities.php:98 +msgid "Boa Vista" +msgstr "Boa Vista" + +#: wp-admin/includes/continents-cities.php:97 +msgid "Blanc-Sablon" +msgstr "Blanc-Sablon" + +#: wp-admin/includes/continents-cities.php:96 +msgid "Belize" +msgstr "Belize" + +#: wp-admin/includes/continents-cities.php:95 +msgid "Belem" +msgstr "Belém" + +#: wp-admin/includes/continents-cities.php:94 +msgid "Barbados" +msgstr "Barbados" + +#: wp-admin/includes/continents-cities.php:92 +msgid "Bahia" +msgstr "Bahia" + +#: wp-admin/includes/continents-cities.php:91 +msgid "Atka" +msgstr "Atka" + +#: wp-admin/includes/continents-cities.php:90 +msgid "Atikokan" +msgstr "Atikokan" + +#: wp-admin/includes/continents-cities.php:89 +msgid "Asuncion" +msgstr "Asunción" + +#: wp-admin/includes/continents-cities.php:88 +msgid "Aruba" +msgstr "Aruba" + +#: wp-admin/includes/continents-cities.php:87 +msgid "Ushuaia" +msgstr "Ushuaia" + +#: wp-admin/includes/continents-cities.php:86 +msgid "Tucuman" +msgstr "Tucumán" + +#: wp-admin/includes/continents-cities.php:85 +msgid "San Luis" +msgstr "San Luis" + +#: wp-admin/includes/continents-cities.php:84 +msgid "San Juan" +msgstr "San Juan" + +#: wp-admin/includes/continents-cities.php:82 +msgid "Rio Gallegos" +msgstr "Río Gallegos" + +#: wp-admin/includes/continents-cities.php:81 +#: wp-admin/includes/continents-cities.php:174 +msgid "Mendoza" +msgstr "Mendoza" + +#: wp-admin/includes/continents-cities.php:80 +msgid "La Rioja" +msgstr "La Rioja" + +#: wp-admin/includes/continents-cities.php:79 +#: wp-admin/includes/continents-cities.php:155 +msgid "Jujuy" +msgstr "Jujuy" + +#: wp-admin/includes/continents-cities.php:78 +#: wp-admin/includes/continents-cities.php:112 +msgid "Cordoba" +msgstr "Córdoba" + +#: wp-admin/includes/continents-cities.php:77 +msgid "ComodRivadavia" +msgstr "ComodRivadavia" + +#: wp-admin/includes/continents-cities.php:76 +#: wp-admin/includes/continents-cities.php:106 +msgid "Catamarca" +msgstr "Catamarca" + +#: wp-admin/includes/continents-cities.php:75 +#: wp-admin/includes/continents-cities.php:101 +msgid "Buenos Aires" +msgstr "Buenos Aires" + +#: wp-admin/includes/continents-cities.php:74 +msgid "Argentina" +msgstr "Argentinië" + +#: wp-admin/includes/continents-cities.php:73 +msgid "Araguaina" +msgstr "Araguaína" + +#: wp-admin/includes/continents-cities.php:72 +msgid "Antigua" +msgstr "Antigua" + +#: wp-admin/includes/continents-cities.php:71 +msgid "Anguilla" +msgstr "Anguilla" + +#: wp-admin/includes/continents-cities.php:70 +msgid "Anchorage" +msgstr "Anchorage" + +#: wp-admin/includes/continents-cities.php:69 +msgid "Adak" +msgstr "Adak" + +#: wp-admin/includes/continents-cities.php:68 +msgid "America" +msgstr "Amerika" + +#: wp-admin/includes/continents-cities.php:66 +msgid "Windhoek" +msgstr "Windhoek" + +#: wp-admin/includes/continents-cities.php:65 +msgid "Tunis" +msgstr "Tunis" + +#: wp-admin/includes/continents-cities.php:64 +msgid "Tripoli" +msgstr "Tripoli" + +#: wp-admin/includes/continents-cities.php:63 +msgid "Timbuktu" +msgstr "Timboektoe" + +#: wp-admin/includes/continents-cities.php:62 +msgid "Sao Tome" +msgstr "Sao Tomé" + +#: wp-admin/includes/continents-cities.php:61 +msgid "Porto-Novo" +msgstr "Porto-Novo" + +#: wp-admin/includes/continents-cities.php:60 +msgid "Ouagadougou" +msgstr "Ouagadougou" + +#: wp-admin/includes/continents-cities.php:59 +msgid "Nouakchott" +msgstr "Nouakchott" + +#: wp-admin/includes/continents-cities.php:58 +msgid "Niamey" +msgstr "Niamey" + +#: wp-admin/includes/continents-cities.php:57 +msgid "Ndjamena" +msgstr "Ndjamena" + +#: wp-admin/includes/continents-cities.php:56 +msgid "Nairobi" +msgstr "Nairobi" + +#: wp-admin/includes/continents-cities.php:55 +msgid "Monrovia" +msgstr "Monrovia" + +#: wp-admin/includes/continents-cities.php:54 +msgid "Mogadishu" +msgstr "Mogadishu" + +#: wp-admin/includes/continents-cities.php:53 +msgid "Mbabane" +msgstr "Mbabane" + +#: wp-admin/includes/continents-cities.php:52 +msgid "Maseru" +msgstr "Maseru" + +#: wp-admin/includes/continents-cities.php:51 +msgid "Maputo" +msgstr "Maputo" + +#: wp-admin/includes/continents-cities.php:50 +msgid "Malabo" +msgstr "Malabo" + +#: wp-admin/includes/continents-cities.php:49 +msgid "Lusaka" +msgstr "Lusaka" + +#: wp-admin/includes/continents-cities.php:48 +msgid "Lubumbashi" +msgstr "Lubumbashi" + +#: wp-admin/includes/continents-cities.php:47 +msgid "Luanda" +msgstr "Luanda" + +#: wp-admin/includes/continents-cities.php:46 +msgid "Lome" +msgstr "Lomé" + +#: wp-admin/includes/continents-cities.php:45 +msgid "Libreville" +msgstr "Libreville" + +#: wp-admin/includes/continents-cities.php:44 +msgid "Lagos" +msgstr "Lagos" + +#: wp-admin/includes/continents-cities.php:43 +msgid "Kinshasa" +msgstr "Kinshasa" + +#: wp-admin/includes/continents-cities.php:42 +msgid "Kigali" +msgstr "Kigali" + +#: wp-admin/includes/continents-cities.php:41 +msgid "Khartoum" +msgstr "Khartoem" + +#: wp-admin/includes/continents-cities.php:40 +msgid "Kampala" +msgstr "Kampala" + +#: wp-admin/includes/continents-cities.php:38 +msgid "Johannesburg" +msgstr "Johannesburg" + +#: wp-admin/includes/continents-cities.php:37 +msgid "Harare" +msgstr "Harare" + +#: wp-admin/includes/continents-cities.php:36 +msgid "Gaborone" +msgstr "Gaborone" + +#: wp-admin/includes/continents-cities.php:35 +msgid "Freetown" +msgstr "Freetown" + +#: wp-admin/includes/continents-cities.php:34 +msgid "El Aaiun" +msgstr "Al-Ajoen" + +#: wp-admin/includes/continents-cities.php:33 +msgid "Douala" +msgstr "Douala" + +#: wp-admin/includes/continents-cities.php:32 +msgid "Djibouti" +msgstr "Djibouti" + +#: wp-admin/includes/continents-cities.php:31 +msgid "Dar es Salaam" +msgstr "Dar es Salaam" + +#: wp-admin/includes/continents-cities.php:30 +msgid "Dakar" +msgstr "Dakar" + +#: wp-admin/includes/continents-cities.php:29 +msgid "Conakry" +msgstr "Conakry" + +#: wp-admin/includes/continents-cities.php:28 +msgid "Ceuta" +msgstr "Ceuta" + +#: wp-admin/includes/continents-cities.php:27 +msgid "Casablanca" +msgstr "Casablanca" + +#: wp-admin/includes/continents-cities.php:26 +msgid "Cairo" +msgstr "Caïro" + +#: wp-admin/includes/continents-cities.php:25 +msgid "Bujumbura" +msgstr "Bujumbura" + +#: wp-admin/includes/continents-cities.php:24 +msgid "Brazzaville" +msgstr "Brazzaville" + +#: wp-admin/includes/continents-cities.php:23 +msgid "Blantyre" +msgstr "Blantyre" + +#: wp-admin/includes/continents-cities.php:22 +msgid "Bissau" +msgstr "Bissau" + +#: wp-admin/includes/continents-cities.php:21 +msgid "Banjul" +msgstr "Banjul" + +#: wp-admin/includes/continents-cities.php:20 +msgid "Bangui" +msgstr "Bangui" + +#: wp-admin/includes/continents-cities.php:19 +msgid "Bamako" +msgstr "Bamako" + +#: wp-admin/includes/continents-cities.php:18 +msgid "Asmera" +msgstr "Asmara" + +#: wp-admin/includes/continents-cities.php:17 +msgid "Asmara" +msgstr "Asmara" + +#: wp-admin/includes/continents-cities.php:16 +msgid "Algiers" +msgstr "Algiers" + +#: wp-admin/includes/continents-cities.php:15 +msgid "Addis Ababa" +msgstr "Addis Ababa" + +#: wp-admin/includes/continents-cities.php:14 +msgid "Accra" +msgstr "Accra" + +#: wp-admin/includes/continents-cities.php:13 +msgid "Abidjan" +msgstr "Abidjan" + +#: wp-admin/includes/continents-cities.php:12 +msgid "Africa" +msgstr "Afrika" \ No newline at end of file diff --git a/wp-content/languages/en_GB-0cc31205f20441b3df1d1b46100f6b8d.json b/wp-content/languages/en_GB-0cc31205f20441b3df1d1b46100f6b8d.json new file mode 100644 index 00000000..d846acad --- /dev/null +++ b/wp-content/languages/en_GB-0cc31205f20441b3df1d1b46100f6b8d.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"This user’s personal data export link was sent.":["This user’s personal data export link was sent."],"This user’s personal data export file was downloaded.":["This user’s personal data export file was downloaded."],"No personal data export file was generated.":["No personal data export file was generated."],"An error occurred while attempting to export personal data.":["An error occurred while attempting to export personal data."],"No personal data was found for this user.":["No personal data was found for this user."],"Personal data was found for this user but was not erased.":["Personal data was found for this user, but was not erased."],"All of the personal data found for this user was erased.":["All of the personal data found for this user was erased."],"Personal data was found for this user but some of the personal data found was not erased.":["Personal data was found for this user, but some of the personal data found was not erased."],"An error occurred while attempting to find and erase personal data.":["An error occurred while attempting to find and erase personal data."],"The section has been copied to your clipboard.":["The section has been copied to your clipboard."]}},"comment":{"reference":"wp-admin\/js\/privacy-tools.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-0ce75ad2f775d1cac9696967d484808c.json b/wp-content/languages/en_GB-0ce75ad2f775d1cac9696967d484808c.json new file mode 100644 index 00000000..e8d5cd11 --- /dev/null +++ b/wp-content/languages/en_GB-0ce75ad2f775d1cac9696967d484808c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Editor tips":["Editor tips"],"Disable tips":["Disable tips"],"Got it":["Got it"],"See next tip":["See next tip"]}},"comment":{"reference":"wp-includes\/js\/dist\/nux.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-0eebe503220d4a00341eb011b92769b4.json b/wp-content/languages/en_GB-0eebe503220d4a00341eb011b92769b4.json new file mode 100644 index 00000000..05ff7d7f --- /dev/null +++ b/wp-content/languages/en_GB-0eebe503220d4a00341eb011b92769b4.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"%1$s is deprecated since version %2$s! Use %3$s instead. Please consider writing more inclusive code.":["%1$s is deprecated since version %2$s! Use %3$s instead. Please consider writing more inclusive code."]}},"comment":{"reference":"wp-admin\/js\/password-strength-meter.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-1780a2033cf98d69ce13c2e5c8510004.json b/wp-content/languages/en_GB-1780a2033cf98d69ce13c2e5c8510004.json new file mode 100644 index 00000000..f7bf02b5 --- /dev/null +++ b/wp-content/languages/en_GB-1780a2033cf98d69ce13c2e5c8510004.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Block deleted.":["Block deleted."],"Block created.":["Block created."],"Untitled Reusable Block":["Untitled Reusable Block"],"Add to Reusable blocks":["Add to reusable blocks"],"Remove from Reusable blocks":["Remove from reusable blocks"]}},"comment":{"reference":"wp-includes\/js\/dist\/reusable-blocks.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-1a0cd6a7128913b15c1a10dd68951869.json b/wp-content/languages/en_GB-1a0cd6a7128913b15c1a10dd68951869.json new file mode 100644 index 00000000..a576ecd0 --- /dev/null +++ b/wp-content/languages/en_GB-1a0cd6a7128913b15c1a10dd68951869.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"%1$s Block. Row %2$d":["%1$s Block. Row %2$d"],"Design":["Design"],"%s Block":["%s Block"],"%1$s Block. %2$s":["%1$s Block. %2$s"],"%1$s Block. Column %2$d. %3$s":["%1$s Block. Column %2$d. %3$s"],"%1$s Block. Row %2$d. %3$s":["%1$s Block. Row %2$d. %3$s"],"%1$s Block. Column %2$d":["%1$s Block. Column %2$d"],"Embeds":["Embeds"],"Reusable blocks":["Reusable blocks"],"Text":["Text"],"Widgets":["Widgets"],"Media":["Media"]}},"comment":{"reference":"wp-includes\/js\/dist\/blocks.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-1bba9045bb07c89671c88a3f328548e8.json b/wp-content/languages/en_GB-1bba9045bb07c89671c88a3f328548e8.json new file mode 100644 index 00000000..dcd687e3 --- /dev/null +++ b/wp-content/languages/en_GB-1bba9045bb07c89671c88a3f328548e8.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"You are probably offline.":["You are probably offline."],"Media upload failed. If this is a photo or a large image, please scale it down and try again.":["Media upload failed. If this is a photo or a large image, please scale it down and try again."],"The response is not a valid JSON response.":["The response is not a valid JSON response."],"An unknown error occurred.":["An unknown error occurred."]}},"comment":{"reference":"wp-includes\/js\/dist\/api-fetch.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-1c4303f02ff93b290e9faad991eeb06f.json b/wp-content/languages/en_GB-1c4303f02ff93b290e9faad991eeb06f.json new file mode 100644 index 00000000..859db636 --- /dev/null +++ b/wp-content/languages/en_GB-1c4303f02ff93b290e9faad991eeb06f.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Submitted on:":["Submitted on:"],"%1$s %2$s, %3$s at %4$s:%5$s":["%1$s %2$s, %3$s at %4$s:%5$s"]}},"comment":{"reference":"wp-admin\/js\/comment.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-1d17475f620f63a92e2c5d2681c51ee8.json b/wp-content/languages/en_GB-1d17475f620f63a92e2c5d2681c51ee8.json new file mode 100644 index 00000000..402fcab6 --- /dev/null +++ b/wp-content/languages/en_GB-1d17475f620f63a92e2c5d2681c51ee8.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Could not load the preview image. Please reload the page and try again.":["Could not load the preview image. Please reload the page and try again."],"Could not load the preview image.":["Could not load the preview image."]}},"comment":{"reference":"wp-admin\/js\/image-edit.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-28b3c3d595952907e08d98287077426c.json b/wp-content/languages/en_GB-28b3c3d595952907e08d98287077426c.json new file mode 100644 index 00000000..f7cb3503 --- /dev/null +++ b/wp-content/languages/en_GB-28b3c3d595952907e08d98287077426c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Unknown error":["Unknown error"],"Reusable block imported successfully!":["Reusable block imported successfully!"],"Invalid Reusable Block JSON file":["Invalid Reusable Block JSON file"],"Invalid JSON file":["Invalid JSON file"],"Import from JSON":["Import from JSON"],"button label\u0004Import":["Import"],"File":["File"]}},"comment":{"reference":"wp-includes\/js\/dist\/list-reusable-blocks.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-2b390f85a3048c5b4255fb45960b6514.json b/wp-content/languages/en_GB-2b390f85a3048c5b4255fb45960b6514.json new file mode 100644 index 00000000..56efd587 --- /dev/null +++ b/wp-content/languages/en_GB-2b390f85a3048c5b4255fb45960b6514.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Search results for: %s":["Search results for: %s"],"Are you sure you want to delete the selected plugins and their data?":["Are you sure you want to delete the selected plugins and their data?"],"Caution: These themes may be active on other sites in the network. Are you sure you want to proceed?":["Caution: these themes may be active on other sites in the network. Are you sure you want to proceed?"],"Number of plugins found: %d":["Number of plugins found: %d"],"Enabling...":["Enabling..."],"Disabling...":["Disabling..."],"The request could not be completed.":["The request could not be completed."],"Deletion failed: %s":["Deletion failed: %s"],"Connection lost or the server is busy. Please try again later.":["Connection lost or the server is busy. Please try again later."],"Updates may not complete if you navigate away from this page.":["Updates may not complete if you navigate away from this page."],"plugin\u0004Update %s now":["Update %s now"],"Update canceled.":["Update cancelled."],"Are you sure you want to delete %s and its data?":["Are you sure you want to delete %s and its data?"],"Please select at least one item to perform this action on.":["Please select at least one item to perform this action on."],"theme\u0004Installing %s...":["Installing %s..."],"theme\u0004%s installed!":["%s installed!"],"theme\u0004%s installation failed":["%s installation failed"],"theme\u0004Deleted!":["Deleted!"],"theme\u0004Network Activate %s":["Network Activate %s"],"Installing...":["Installing..."],"plugin\u0004Installing %s...":["Installing %s..."],"Installing... please wait.":["Installing... please wait."],"plugin\u0004%s installed!":["%s installed!"],"plugin\u0004Installed!":["Installed!"],"Installation completed successfully.":["Installation completed successfully."],"Installation failed: %s":["Installation failed: %s"],"plugin\u0004%s installation failed":["%s installation failed"],"Importer installed successfully. Run importer<\/a>":["Importer installed successfully. Run importer<\/a>"],"plugin\u0004Install %s now":["Install %s now"],"Deleting...":["Deleting..."],"plugin\u0004Deleted!":["Deleted!"],"Updating... please wait.":["Updating... please wait."],"theme\u0004Updated!":["Updated!"],"plugin\u0004Updating %s...":["Updating %s..."],"Updating...":["Updating..."],"plugin\u0004%s updated!":["%s updated!"],"plugin\u0004Updated!":["Updated!"],"Update completed successfully.":["Update completed successfully."],"plugin\u0004%s update failed.":["%s update failed."],"Update failed: %s":["Update failed: %s"],"No plugins found. Try a different search.":["No plugins found. Try a different search."],"No plugins are currently available.":["No plugins are currently available."],"Disable auto-updates":["Disable auto-updates"],"Enable auto-updates":["Enable auto-updates"],"Auto-updates enabled":["Auto-updates enabled"],"Auto-updates disabled":["Auto-updates disabled"],"theme\u0004Activate %s":["Activate %s"],"plugin\u0004Activate %s":["Activate %s"],"plugin\u0004Network Activate %s":["Network Activate %s"],"Run %s":["Run %s"],"Run Importer":["Run Importer"],"Update failed.":["Update failed."],"theme\u0004Installed!":["Installed!"],"Are you sure you want to delete %s?":["Are you sure you want to delete %s?"],"Network Enable":["Network Enable"],"Update Now":["Update Now"],"Network Activate":["Network Activate"],"You do not appear to have any plugins available at this time.":["You do not appear to have any plugins available at this time."],"Installation failed.":["Installation failed."],"Install Now":["Install Now"],"Something went wrong.":["Something went wrong."],"Search Results":["Search Results"],"Live Preview":["Live Preview"],"An error has occurred. Please reload the page and try again.":["An error has occurred. Please reload the page and try again."],"Activate":["Activate"]}},"comment":{"reference":"wp-admin\/js\/updates.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-2c5d274ea625dd91556554ad82901529.json b/wp-content/languages/en_GB-2c5d274ea625dd91556554ad82901529.json new file mode 100644 index 00000000..e384298c --- /dev/null +++ b/wp-content/languages/en_GB-2c5d274ea625dd91556554ad82901529.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Annotation":["Annotation"]}},"comment":{"reference":"wp-includes\/js\/dist\/annotations.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-320f4ad9792aaa6dedb1e71cbdf85d57.json b/wp-content/languages/en_GB-320f4ad9792aaa6dedb1e71cbdf85d57.json new file mode 100644 index 00000000..6e12a568 --- /dev/null +++ b/wp-content/languages/en_GB-320f4ad9792aaa6dedb1e71cbdf85d57.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Notifications":["Notifications"]}},"comment":{"reference":"wp-includes\/js\/dist\/a11y.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-49c6d4acf36cf3aca9f0b2a77617304f.json b/wp-content/languages/en_GB-49c6d4acf36cf3aca9f0b2a77617304f.json new file mode 100644 index 00000000..035efa81 --- /dev/null +++ b/wp-content/languages/en_GB-49c6d4acf36cf3aca9f0b2a77617304f.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Comment":["Comment"],"Menu Item":["Menu Item"],"Site":["Site"],"Widget areas":["Widget areas"],"Taxonomy":["Taxonomy"],"Post Type":["Post Type"],"Menu Location":["Menu Location","Menu Locations"],"Menu":["Menu"],"User":["User"],"Base":["Base"],"Site Title":["Site Title"],"Widgets":["Widgets"],"Media":["Media"]}},"comment":{"reference":"wp-includes\/js\/dist\/core-data.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-4a38fe1c0c45989e44682ba6109d9f46.json b/wp-content/languages/en_GB-4a38fe1c0c45989e44682ba6109d9f46.json new file mode 100644 index 00000000..39142002 --- /dev/null +++ b/wp-content/languages/en_GB-4a38fe1c0c45989e44682ba6109d9f46.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"No details available":["No details available"],"Unavailable":["Unavailable"],"A test is unavailable":["A test is unavailable"],"All site health tests have finished running. There are items that should be addressed, and the results are now available on the page.":["All site health tests have finished running. There are items that should be addressed, and the results are now available on the page."],"Should be improved":["Should be improved"],"Good":["Good"],"%s critical issue":["%s critical issue","%s critical issues"],"%s item with no issues detected":["%s item with no issues detected","%s items with no issues detected"],"%s recommended improvement":["%s recommended improvement","%s recommended improvements"],"Please wait...":["Please wait..."],"All site health tests have finished running.":["All site health tests have finished running."],"All site health tests have finished running. Your site is looking good, and the results are now available on the page.":["All site health tests have finished running. Your site is looking good, and the results are now available on the page."],"Site information has been copied to your clipboard.":["Site information has been copied to your clipboard."]}},"comment":{"reference":"wp-admin\/js\/site-health.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-4bfa11da57ff2600004bb500368247f4.json b/wp-content/languages/en_GB-4bfa11da57ff2600004bb500368247f4.json new file mode 100644 index 00000000..2770e55c --- /dev/null +++ b/wp-content/languages/en_GB-4bfa11da57ff2600004bb500368247f4.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Saving\u2026":["Saving\u2026"],"Use as featured image":["Use as featured image"],"Could not set that as the thumbnail image. Try a different attachment.":["Could not set that as the thumbnail image. Try a different attachment."],"Done":["Done"]}},"comment":{"reference":"wp-admin\/js\/set-post-thumbnail.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-50278328b502f4eb3f2b8b7ab49324a1.json b/wp-content/languages/en_GB-50278328b502f4eb3f2b8b7ab49324a1.json new file mode 100644 index 00000000..4cf85e78 --- /dev/null +++ b/wp-content/languages/en_GB-50278328b502f4eb3f2b8b7ab49324a1.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"The box is on the first position":["The box is on the first position"],"The box is on the last position":["The box is on the last position"],"The boxes order has been saved.":["The boxes order has been saved."],"Add boxes from the Screen Options menu":["Add boxes from the Screen Options menu"],"Drag boxes here":["Drag boxes here"]}},"comment":{"reference":"wp-admin\/js\/postbox.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-5251f7623766a714c8207c7edb938628.json b/wp-content/languages/en_GB-5251f7623766a714c8207c7edb938628.json new file mode 100644 index 00000000..67130a64 --- /dev/null +++ b/wp-content/languages/en_GB-5251f7623766a714c8207c7edb938628.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Widget has been added to the selected sidebar":["Widget has been added to the selected sidebar"],"Saved":["Saved"],"The changes you made will be lost if you navigate away from this page.":["The changes you made will be lost if you navigate away from this page."],"Save":["Save"]}},"comment":{"reference":"wp-admin\/js\/widgets.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-529362903a5a05b34b06b5e793fb4cf8.json b/wp-content/languages/en_GB-529362903a5a05b34b06b5e793fb4cf8.json new file mode 100644 index 00000000..4c64088f --- /dev/null +++ b/wp-content/languages/en_GB-529362903a5a05b34b06b5e793fb4cf8.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Are you sure you want to revoke this password? This action cannot be undone.":["Are you sure you want to revoke this password? This action cannot be undone."],"Application password revoked.":["Application password revoked."],"Are you sure you want to revoke all passwords? This action cannot be undone.":["Are you sure you want to revoke all passwords? This action cannot be undone."],"All application passwords revoked.":["All application passwords revoked."],"Dismiss this notice.":["Dismiss this notice."]}},"comment":{"reference":"wp-admin\/js\/application-passwords.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-569e85ef168299eb8c8f24d8ef8c8a78.json b/wp-content/languages/en_GB-569e85ef168299eb8c8f24d8ef8c8a78.json new file mode 100644 index 00000000..f5e55bd8 --- /dev/null +++ b/wp-content/languages/en_GB-569e85ef168299eb8c8f24d8ef8c8a78.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Saving Draft\u2026":["Saving Draft\u2026"],"Schedule for:":["Schedule for:"],"Publish on:":["Publish on:"],"Published on:":["Published on:"],"Permalink saved":["Permalink saved"],"Show more comments":["Show more comments"],"No more comments found.":["No more comments found."],"post action\/button label\u0004Schedule":["Schedule"],"%1$s %2$s, %3$s at %4$s:%5$s":["%1$s %2$s, %3$s at %4$s:%5$s"],"Save as Pending":["Save as Pending"],"Privately Published":["Privately Published"],"Public, Sticky":["Public, Sticky"],"The file URL has been copied to your clipboard":["The file URL has been copied to your clipboard"],"The changes you made will be lost if you navigate away from this page.":["The changes you made will be lost if you navigate away from this page."],"Password Protected":["Password Protected"],"Could not set that as the thumbnail image. Try a different attachment.":["Could not set that as the thumbnail image. Try a different attachment."],"Publish":["Publish"],"Cancel":["Cancel"],"Save Draft":["Save Draft"],"OK":["OK"],"Private":["Private"],"Public":["Public"],"Update":["Update"],"Published":["Published"]}},"comment":{"reference":"wp-admin\/js\/post.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-6025add6bde16aaeb12787d250f9b414.json b/wp-content/languages/en_GB-6025add6bde16aaeb12787d250f9b414.json new file mode 100644 index 00000000..63c1fbb8 --- /dev/null +++ b/wp-content/languages/en_GB-6025add6bde16aaeb12787d250f9b414.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Approve and Reply":["Approve and Reply"],"Are you sure you want to edit this comment?\nThe changes you made will be lost.":["Are you sure you want to edit this comment?\nThe changes you made will be lost."],"Are you sure you want to do this?\nThe comment changes you made will be lost.":["Are you sure you want to do this?\nThe comment changes you made will be lost."],"Comments (%s)":["Comments (%s)"],"Comments":["Comments"],"Reply":["Reply"]}},"comment":{"reference":"wp-admin\/js\/edit-comments.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-68f2cec7514bf8563c723a4d675fcfe6.json b/wp-content/languages/en_GB-68f2cec7514bf8563c723a4d675fcfe6.json new file mode 100644 index 00000000..2b104626 --- /dev/null +++ b/wp-content/languages/en_GB-68f2cec7514bf8563c723a4d675fcfe6.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Inline Code":["Inline Code"],"Link edited.":["Link edited."],"Link removed.":["Link removed."],"media":["media"],"Inline image":["Inline image"],"photo":["photo"],"Warning: the link has been inserted but may have errors. Please test it.":["Warning: the link has been inserted but may have errors. Please test it."],"Link inserted.":["Link inserted."],"Text Color":["Text Colour"],"Link":["Link"],"Bold":["Bold"],"Italic":["Italic"],"Underline":["Underline"],"Strikethrough":["Strikethrough"],"Subscript":["Subscript"],"Superscript":["Superscript"],"Unlink":["Unlink"],"Width":["Width"],"Apply":["Apply"]}},"comment":{"reference":"wp-includes\/js\/dist\/format-library.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-7289286ed59e90a8f36ae797df62220b.json b/wp-content/languages/en_GB-7289286ed59e90a8f36ae797df62220b.json new file mode 100644 index 00000000..495981ce --- /dev/null +++ b/wp-content/languages/en_GB-7289286ed59e90a8f36ae797df62220b.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"An error has occurred. Please reload the page and try again.":["An error has occurred. Please reload the page and try again."]}},"comment":{"reference":"wp-admin\/js\/media.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-7436b7ee9e4f11ac0d618d8cc886eb66.json b/wp-content/languages/en_GB-7436b7ee9e4f11ac0d618d8cc886eb66.json new file mode 100644 index 00000000..6c0acd11 --- /dev/null +++ b/wp-content/languages/en_GB-7436b7ee9e4f11ac0d618d8cc886eb66.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Plugin: %s":["Plugin: %s"],"Plugin details":["Plugin details"]}},"comment":{"reference":"wp-admin\/js\/plugin-install.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-77fdfadaf2e1ca3a027d1956b910bc50.json b/wp-content/languages/en_GB-77fdfadaf2e1ca3a027d1956b910bc50.json new file mode 100644 index 00000000..1603b722 --- /dev/null +++ b/wp-content/languages/en_GB-77fdfadaf2e1ca3a027d1956b910bc50.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"%1$s is deprecated since version %2$s with no alternative available.":["%1$s is deprecated since version %2$s with no alternative available."],"%1$s is deprecated since version %2$s! Use %3$s instead.":["%1$s is deprecated since version %2$s! Use %3$s instead."],"Expand Main menu":["Expand Main menu"],"Dismiss this notice.":["Dismiss this notice."],"You are about to permanently delete these items from your site.\nThis action cannot be undone.\n'Cancel' to stop, 'OK' to delete.":["You are about to permanently delete these items from your site.\nThis action cannot be undone.\n'Cancel' to stop, 'OK' to delete."],"Collapse Main menu":["Collapse Main menu"]}},"comment":{"reference":"wp-admin\/js\/common.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-7b74c8457eaa7fcc50db41b431f8a003.json b/wp-content/languages/en_GB-7b74c8457eaa7fcc50db41b431f8a003.json new file mode 100644 index 00000000..7223a097 --- /dev/null +++ b/wp-content/languages/en_GB-7b74c8457eaa7fcc50db41b431f8a003.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Something went wrong.":["Something went wrong."],"Sorry, you are not allowed to do that.":["Sorry, you are not allowed to do that."]}},"comment":{"reference":"wp-admin\/js\/tags.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-7d5ca435e60d92f024d46c9257aaa0f7.json b/wp-content/languages/en_GB-7d5ca435e60d92f024d46c9257aaa0f7.json new file mode 100644 index 00000000..2ff7914b --- /dev/null +++ b/wp-content/languages/en_GB-7d5ca435e60d92f024d46c9257aaa0f7.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Term selected.":["Term selected."],"tag delimiter\u0004,":[","]}},"comment":{"reference":"wp-admin\/js\/tags-suggest.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-7f13c36c641b114bf18cd0bcc9ecc7e0.json b/wp-content/languages/en_GB-7f13c36c641b114bf18cd0bcc9ecc7e0.json new file mode 100644 index 00000000..1777af16 --- /dev/null +++ b/wp-content/languages/en_GB-7f13c36c641b114bf18cd0bcc9ecc7e0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Select unit":["Select unit"],"Coordinated Universal Time":["Coordinated Universal Time"],"Media preview":["Media preview"],"Linear":["Linear"],"Radial":["Radial"],"Edit color value":["Edit colour value"],"Color name":["Colour name"],"Edit color name":["Edit colour name"],"Remove color":["Remove colour"],"Additional color settings":["Additional colour settings"],"Color palette":["Colour palette"],"Color value in RGBA":["Colour value in RGBA"],"Color value in HSLA":["Colour value in HSLA"],"Unlink Sides":["Unlink Sides"],"Link Sides":["Link Sides"],"Box Control":["Box Control"],"Top Center":["Top Centre"],"Center Left":["Centre Left"],"Center Center":["Centre Centre"],"Center Right":["Centre Right"],"Bottom Center":["Bottom Centre"],"Alignment Matrix Control":["Alignment Matrix Control"],"Slug":["Slug"],"Finish":["Finish"],"Page %1$d of %2$d":["Page %1$d of %2$d"],"Guide controls":["Guide controls"],"Gradient: %s":["Gradient: %s"],"Gradient code: %s":["Gradient code: %s"],"Remove Control Point":["Remove Control Point"],"Use your left or right arrow keys or drag and drop with the mouse to change the gradient position. Press the button to change the color or remove the control point.":["Use your left or right arrow keys or drag and drop with the mouse to change the gradient position. Press the button to change the colour or remove the control point."],"Gradient control point at position %1$s with color code %2$s.":["Gradient control point at position %1$s with colour code %2$s."],"Extra Large":["Extra Large"],"Small":["Small"],"Separate with commas, spaces, or the Enter key.":["Separate with commas, spaces, or the Enter key."],"Separate with commas or the Enter key.":["Separate with commas or the Enter key."],"Number of items":["Number of items"],"Reset":["Reset"],"Dismiss this notice":["Dismiss this notice"],"Item removed.":["Item removed."],"Item added.":["Item added."],"A \u2192 Z":["A \t Z"],"Category":["Category"],"Order by":["Order by"],"Z \u2192 A":["Z \t A"],"%1$s (%2$s of %3$s)":["%1$s (%2$s of %3$s)"],"Remove item":["Remove item"],"Add item":["Add item"],"Newest to oldest":["Newest to oldest"],"Oldest to newest":["Oldest to newest"],"No results.":["No results."],"%d result found, use up and down arrow keys to navigate.":["%d result found, use up and down arrow keys to navigate.","%d results found, use up and down arrow keys to navigate."],"Color: %s":["Colour: %s"],"Custom color picker":["Custom colour picker"],"Color code: %s":["Colour code: %s"],"(opens in a new tab)":["(opens in a new tab)"],"Minutes":["Minutes"],"Go to the first (home) or last (end) day of a week.":["Go to the first (home) or last (end) day of a week."],"Home\/End":["Home\/End"],"Home and End":["Home and End"],"Move backward (PgUp) or forward (PgDn) by one month.":["Move backward (PgUp) or forward (PgDn) by one month."],"PgUp\/PgDn":["PgUp\/PgDn"],"Page Up and Page Down":["Page Up and Page Down"],"Up and Down Arrows":["Up and Down Arrows"],"Left and Right Arrows":["Left and Right Arrows"],"Select the date in focus.":["Select the date in focus."],"Navigating with a keyboard":["Navigating with a keyboard"],"Click the desired day to select it.":["Click the desired day to select it."],"Click to Select":["Click to Select"],"Calendar Help":["Calendar Help"],"Choose a shade":["Choose a shade"],"Change color format":["Change colour format"],"Color value in HSL":["Colour value in HSL"],"Color value in RGB":["Colour value in RGB"],"Color value in hexadecimal":["Colour value in hexadecimal"],"RGB mode active":["RGB mode active"],"Hex color mode active":["Hex colour mode active"],"Hue\/saturation\/lightness mode active":["Hue\/saturation\/lightness mode active"],"Move the arrow left or right to change hue.":["Move the arrow left or right to change hue."],"Hue value in degrees, from 0 to 359.":["Hue value in degrees, from 0 to 359."],"Alpha value, from 0 (transparent) to 1 (fully opaque).":["Alpha value, from 0 (transparent) to 1 (fully opaque)."],"Move backward (left) or forward (right) by one day.":["Move backward (left) or forward (right) by one day."],"Click the right or left arrows to select other months in the past or the future.":["Click the right or left arrows to select other months in the past or the future."],"Move backward (up) or forward (down) by one week.":["Move backward (up) or forward (down) by one week."],"keyboard button\u0004Enter":["Enter"],"Use your arrow keys to change the base color. Move up to lighten the color, down to darken, left to decrease saturation, and right to increase saturation.":["Use your arrow keys to change the base colour. Move up to lighten the colour, down to darken, left to decrease saturation, and right to increase saturation."],"Time":["Time"],"Day":["Day"],"Month":["Month"],"Date":["Date"],"Hours":["Hours"],"Item selected.":["Item selected."],"Close dialog":["Close dialogue"],"Previous":["Previous"],"Custom color":["Custom colour"],"Custom Size":["Custom Size"],"Year":["Year"],"Back":["Back"],"Large":["Large"],"Drop files to upload":["Drop files to upload"],"Clear":["Clear"],"Mixed":["Mixed"],"Custom":["Custom"],"May":["May"],"Top":["Top"],"Bottom":["Bottom"],"Type":["Type"],"AM":["AM"],"PM":["PM"],"Next":["Next"],"Top Left":["Top Left"],"Top Right":["Top Right"],"Bottom Left":["Bottom Left"],"Bottom Right":["Bottom Right"],"December":["December"],"January":["January"],"February":["February"],"March":["March"],"April":["April"],"June":["June"],"July":["July"],"August":["August"],"September":["September"],"October":["October"],"November":["November"],"Font size":["Font size"],"Default":["Default"],"All":["All"],"Author":["Author"],"Save":["Save"],"Categories":["Categories"],"Name":["Name"],"None":["None"],"Cancel":["Cancel"],"Left":["Left"],"Right":["Right"],"Medium":["Medium"],"OK":["OK"],"Close":["Close"]}},"comment":{"reference":"wp-includes\/js\/dist\/components.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-803bf1ce2131e13efc590c1bc47851fc.json b/wp-content/languages/en_GB-803bf1ce2131e13efc590c1bc47851fc.json new file mode 100644 index 00000000..f4a0f9c8 --- /dev/null +++ b/wp-content/languages/en_GB-803bf1ce2131e13efc590c1bc47851fc.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Uncategorized":["Uncategorised"],"Block pattern \"%s\" inserted.":["Block pattern \"%s\" inserted."],"Search for a reusable block":["Search for a reusable block"],"Search for a pattern":["Search for a pattern"],"Create: %s<\/mark>":["Create: %s<\/mark>"],"Modes":["Modes"],"Filter patterns":["Filter patterns"],"Drag blocks":["Drag blocks"],"Remove blocks":["Remove blocks"],"Drag block":["Drag block","Drag blocks"],"Child Blocks":["Child Blocks"],"Tablet":["Tablet"],"Mobile":["Mobile"],"Desktop":["Desktop"],"An unknown error occurred during creation. Please try again.":["An unknown error occurred during creation. Please try again."],"Creating":["Creating"],"Block variations":["Block variations"],"Current media URL:":["Current media URL:"],"Navigation item":["Navigation item"],"Image size presets":["Image size presets"],"Move the selected block(s) up.":["Move the selected block(s) up."],"Move the selected block(s) down.":["Move the selected block(s) down."],"Patterns":["Patterns"],"Block %1$d of %2$d, Level %3$d":["Block %1$d of %2$d, Level %3$d"],"Add block at position %1$d, Level %2$d":["Add block at position %1$d, Level %2$d"],"Block navigation structure":["Block navigation structure"],"Copied \"%s\" to clipboard.":["Copied \"%s\" to clipboard."],"Moved \"%s\" to clipboard.":["Moved \"%s\" to clipboard."],"%d block added.":["%d block added.","%d blocks added"],"A tip for using the block editor":["A tip for using the block editor"],"Select parent (%s)":["Select parent (%s)"],"Go to block":["Go to block"],"Use the Tab key and Arrow keys to choose new block location. Use Left and Right Arrow keys to move between nesting levels. Once location is selected press Enter or Space to move the block.":["Use the Tab key and Arrow keys to choose new block location. Use Left and Right Arrow keys to move between nesting levels. Once location is selected, press Enter or Space to move the block."],"Browse all. This will open the main inserter panel in the editor toolbar.":["Browse all. This will open the main inserter panel in the editor toolbar."],"Browse all":["Browse all"],"Move To":["Move To"],"Copied %d block to clipboard.":["Copied %d block to clipboard.","Copied %d blocks to clipboard."],"Moved %d block to clipboard.":["Moved %d block to clipboard.","Moved %d blocks to clipboard."],"You are currently in navigation mode. Navigate blocks using the Tab key and Arrow keys. Use Left and Right Arrow keys to move between nesting levels. To exit navigation mode and edit the selected block, press Enter.":["You are currently in navigation mode. Navigate blocks using the Tab key and Arrow keys. Use Left and Right Arrow keys to move between nesting levels. To exit navigation mode and edit the selected block, press Enter."],"Open Colors Selector":["Open colours selector"],"Indent a list by pressing space<\/kbd> at the beginning of a line.":["Indent a list by pressing space<\/kbd> at the beginning of a line."],"Outdent a list by pressing backspace<\/kbd> at the beginning of a line.":["Outdent a list by pressing backspace<\/kbd> at the beginning of a line."],"Drag files into the editor to automatically insert media blocks.":["Drag files into the editor to automatically insert media blocks."],"Change a block's type by pressing the block icon on the toolbar.":["Change a block's type by pressing the block icon on the toolbar."],"Line height":["Line height"],"Typography":["Typography"],"Change matrix alignment":["Change matrix alignment"],"Padding":["Padding"],"Spacing":["Spacing"],"Reset search":["Reset search"],"Block %1$s is at the beginning of the content and can\u2019t be moved left":["Block %1$s is at the beginning of the content and can\u2019t be moved left"],"Block %1$s is at the beginning of the content and can\u2019t be moved up":["Block %1$s is at the beginning of the content and can\u2019t be moved up"],"Block %1$s is at the end of the content and can\u2019t be moved left":["Block %1$s is at the end of the content and can\u2019t be moved left"],"Block %1$s is at the end of the content and can\u2019t be moved down":["Block %1$s is at the end of the content and can\u2019t be moved down"],"Remove multiple selected blocks.":["Remove multiple selected blocks."],"Move %1$s block from position %2$d right to position %3$d":["Move %1$s block from position %2$d right to position %3$d"],"Move %1$s block from position %2$d left to position %3$d":["Move %1$s block from position %2$d left to position %3$d"],"Tools offer different interactions for block selection & editing. To select, press Escape, to go back to editing, press Enter.":["Tools offer different interactions for block selection & editing. To select, press Escape, to go back to editing, press Enter."],"Toggle between using the same value for all screen sizes or using a unique value per screen size.":["Toggle between using the same value for all screen sizes or using a unique value per screen size."],"Use the same %s on all screensizes.":["Use the same %s on all screen sizes."],"Large screens":["Large screens"],"Medium screens":["Medium screens"],"Small screens":["Small screens"],"Text labelling a interface as controlling a given layout property (eg: margin) for a given screen size.\u0004Controls the %1$s property for %2$s viewports.":["Controls the %1$s property for %2$s viewports."],"Recently updated":["Recently updated"],"Search or type url":["Search or type URL"],"Press ENTER to add this link":["Press ENTER to add this link"],"Currently selected link settings":["Currently selected link settings"],"Open Media Library":["Open Media Library"],"The media file has been replaced":["The media file has been replaced"],"Currently selected":["Currently selected"],"Image size":["Image size"],"Gradient Presets":["Gradient Presets"],"Select a variation to start with.":["Select a variation to start with."],"Choose variation":["Choose variation"],"Generic label for block inserter button\u0004Add block":["Add block"],"directly add the only allowed block\u0004Add %s":["Add %s"],"%s block added":["%s block added"],"Multiple selected blocks":["Multiple selected blocks"],"You are currently in edit mode. To return to the navigation mode, press Escape.":["You are currently in edit mode. To return to the navigation mode, press Escape."],"Midnight":["Midnight"],"Electric grass":["Electric grass"],"Pale ocean":["Pale ocean"],"Luminous dusk":["Luminous dusk"],"Blush bordeaux":["Blush bordeaux"],"Blush light purple":["Blush light purple"],"Cool to warm spectrum":["Cool to warm spectrum"],"Very light gray to cyan bluish gray":["Very light grey to cyan bluish grey"],"Luminous vivid orange to vivid red":["Luminous vivid orange to vivid red"],"Luminous vivid amber to luminous vivid orange":["Luminous vivid amber to luminous vivid orange"],"Light green cyan to vivid green cyan":["Light green cyan to vivid green cyan"],"Vivid cyan blue to vivid purple":["Vivid cyan blue to vivid purple"],"Block breadcrumb":["Block breadcrumb"],"Gradient":["Gradient"],"Solid":["Solid"],"(Gradient: %s)":["(Gradient: %s)"],"(Color: %s)":["(Colour: %s)"],"(%s: gradient %s)":["(%s: gradient %s)"],"(%s: color %s)":["(%s: colour %s)"],"No Preview Available.":["No Preview Available."],"List view":["List view"],"Move left":["Move left"],"Move right":["Move right"],"Open in new tab":["Open in new tab"],"Separate multiple classes with spaces.":["Separate multiple classes with spaces."],"Learn more about anchors":["Learn more about anchors"],"Enter a word or two \u2014 without spaces \u2014 to make a unique web address just for this heading, called an \u201canchor.\u201d Then, you\u2019ll be able to link directly to this section of your page.":["Enter a word or two \u2014\u00a0without spaces \u2014\u00a0to make a unique web address just for this heading, called an \u201canchor\". Then, you\u2019ll be able to link directly to this section of your page."],"Default Style":["Default Style"],"Upload an image file, pick one from your media library, or add one with a URL.":["Upload an image file, pick one from your media library, or add one with a URL."],"Upload a video file, pick one from your media library, or add one with a URL.":["Upload a video file, pick one from your media library, or add one with a URL."],"Add a block":["Add a block"],"This color combination may be hard for people to read.":["This colour combination may be hard for people to read."],"Skip":["Skip"],"Upload a media file or pick one from your media library.":["Upload a media file or pick one from your media library."],"Upload an audio file, pick one from your media library, or add one with a URL.":["Upload an audio file, pick one from your media library, or add one with a URL."],"While writing, you can press \/<\/kbd> to quickly insert new blocks.":["While writing, you can press \/<\/kbd> to quickly insert new blocks."],"Block vertical alignment setting\u0004Vertically Align Top":["Vertically Align Top"],"Block vertical alignment setting\u0004Vertically Align Middle":["Vertically Align Middle"],"Block vertical alignment setting\u0004Vertically Align Bottom":["Vertically Align Bottom"],"Block vertical alignment setting label\u0004Change vertical alignment":["Change vertical alignment"],"Vivid purple":["Vivid purple"],"Change block type or style":["Change block type or style"],"block style\u0004Default":["Default"],"Attempt Block Recovery":["Attempt Block Recovery"],"More rich text controls":["More rich text controls"],"%d word":["%d word","%d words"],"To edit this block, you need permission to upload media.":["To edit this block, you need permission to upload media."],"(selected block)":["(selected block)"],"Block tools":["Block Tools"],"Block icon":["Block icon"],"Start writing or type \/ to choose a block":["Start writing or type \/ to choose a block"],"%s block selected.":["%s block selected.","%s blocks selected."],"Align text left":["Align text left"],"Align text center":["Align text centre"],"Align text right":["Align text right"],"Image dimensions":["Image dimensions"],"Outline":["Outline"],"Color settings":["Colour settings"],"Document":["Document"],"Insert a new block before the selected block(s).":["Insert a new block before the selected block(s)."],"Remove the selected block(s).":["Remove the selected block(s)."],"Duplicate the selected block(s).":["Duplicate the selected block(s)."],"Select all text when typing. Press again to select all blocks.":["Select all text when typing. Press again to select all blocks."],"Insert a new block after the selected block(s).":["Insert a new block after the selected block(s)."],"Navigate to the nearest toolbar.":["Navigate to the nearest toolbar."],"%d block":["%d block","%d blocks"],"Reusable blocks":["Reusable blocks"],"Cyan bluish gray":["Cyan bluish grey"],"Light green cyan":["Light green cyan"],"Luminous vivid amber":["Luminous vivid amber"],"Luminous vivid orange":["Luminous vivid orange"],"Pale cyan blue":["Pale cyan blue"],"Pale pink":["Pale pink"],"Vivid cyan blue":["Vivid cyan blue"],"Vivid green cyan":["Vivid green cyan"],"Vivid red":["Vivid red"],"font size name\u0004Huge":["Huge"],"font size name\u0004Large":["Large"],"font size name\u0004Medium":["Medium"],"font size name\u0004Small":["Small"],"Link settings":["Link settings"],"HTML anchor":["HTML anchor"],"Additional CSS class(es)":["Additional CSS class(es)"],"Skip to the selected block":["Skip to the selected block"],"Search for a block":["Search for a block"],"Blocks cannot be moved down as they are already at the bottom":["Blocks cannot be moved down as they are already at the bottom"],"Edit as HTML":["Edit as HTML"],"Edit visually":["Edit visually"],"Duplicate":["Duplicate"],"Blocks cannot be moved up as they are already at the top":["Blocks cannot be moved up as they are already at the top"],"This color combination may be hard for people to read. Try using a brighter background color and\/or a darker text color.":["This colour combination may be hard for people to read. Try using a brighter background colour and\/or a darker text colour."],"This color combination may be hard for people to read. Try using a darker background color and\/or a brighter text color.":["This colour combination may be hard for people to read. Try using a darker background colour and\/or a brighter text colour."],"Reusable":["Reusable"],"Insert After":["Insert After"],"Insert Before":["Insert Before"],"Move %1$d block from position %2$d down by one place":["Move %1$d block from position %2$d down by one place","Move %1$d blocks from position %2$d down by one place"],"Move %1$d block from position %2$d up by one place":["Move %1$d block from position %2$d up by one place","Move %1$d blocks from position %2$d up by one place"],"More options":["More options"],"Change type of %d block":["Change type of %d block","Change type of %d blocks"],"%d result found.":["%d result found.","%d results found."],"Paste or type URL":["Paste or type URL"],"Block %1$s is at the beginning of the content and can\u2019t be moved right":["Block %1$s is at the beginning of the content and can\u2019t be moved right"],"Manage all reusable blocks":["Manage all reusable blocks"],"blocks\u0004Most used":["Most used"],"Transform to":["Transform to"],"Remove block":["Remove block","Remove blocks"],"Move %1$s block from position %2$d up to position %3$d":["Move %1$s block from position %2$d up to position %3$d"],"Block %1$s is at the end of the content and can\u2019t be moved right":["Block %1$s is at the end of the content and can\u2019t be moved right"],"Add block":["Add block"],"Block %s is the only block, and cannot be moved":["Block %s is the only block, and cannot be moved"],"Convert to Blocks":["Convert to Blocks"],"Block: %s":["Block: %s"],"This block has encountered an error and cannot be previewed.":["This block has encountered an error and cannot be previewed."],"No block selected.":["No block selected."],"Reset":["Reset"],"Move %1$s block from position %2$d down to position %3$d":["Move %1$s block from position %2$d down to position %3$d"],"Convert to Classic Block":["Convert to Classic Block"],"Current":["Current"],"After Conversion":["After Conversion"],"This block contains unexpected or invalid content.":["This block contains unexpected or invalid content."],"Resolve Block":["Resolve Block"],"Convert to HTML":["Convert to HTML"],"imperative verb\u0004Resolve":["Resolve"],"font size name\u0004Normal":["Normal"],"Change text alignment":["Change text alignment"],"Change alignment":["Change alignment"],"Wide width":["Wide width"],"Full width":["Full width"],"No results.":["No results."],"%d result found, use up and down arrow keys to navigate.":["%d result found, use up and down arrow keys to navigate.","%d results found, use up and down arrow keys to navigate."],"Blocks":["Blocks"],"Search Results":["Search Results"],"Link selected.":["Link selected."],"Paste URL or type to search":["Paste URL or type to search"],"Link CSS Class":["Link CSS Class"],"Align center":["Align centre"],"Align left":["Align left"],"Replace":["Replace"],"Move down":["Move down"],"Move up":["Move up"],"Align right":["Align right"],"Not set":["Not set"],"Insert from URL":["Insert from URL"],"Video":["Video"],"Audio":["Audio"],"Large":["Large"],"Media Library":["Media Library"],"Attachment Page":["Attachment Page"],"Media File":["Media File"],"Clear selection.":["Clear selection."],"Background Color":["Background Colour"],"Text Color":["Text Colour"],"Upload":["Upload"],"Styles":["Styles"],"Link Color":["Link Colour"],"Copy":["Copy"],"Link Rel":["Link Rel"],"Insert link":["Insert link"],"Remove link":["Remove link"],"Image":["Image"],"Black":["Black"],"White":["White"],"Width":["Width"],"Height":["Height"],"All":["All"],"No results found.":["No results found."],"Edit link":["Edit link"],"Search results for \"%s\"":["Search results for \"%s\""],"URL":["URL"],"Edit":["Edit"],"Apply":["Apply"],"Advanced":["Advanced"],"Submit":["Submit"],"Preview":["Preview"],"Cancel":["Cancel"],"Thumbnail":["Thumbnail"],"Medium":["Medium"],"Full Size":["Full Size"],"Close":["Close"],"Select":["Select"],"Media":["Media"]}},"comment":{"reference":"wp-includes\/js\/dist\/block-editor.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-81c889563f09dd13de1701135dc62941.json b/wp-content/languages/en_GB-81c889563f09dd13de1701135dc62941.json new file mode 100644 index 00000000..474d539a --- /dev/null +++ b/wp-content/languages/en_GB-81c889563f09dd13de1701135dc62941.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"The file URL has been copied to your clipboard":["The file URL has been copied to your clipboard"],"%s item selected":["%s item selected","%s items selected"]}},"comment":{"reference":"wp-includes\/js\/media-views.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-81d6f084cb273e02e15b01bd9ece87f7.json b/wp-content/languages/en_GB-81d6f084cb273e02e15b01bd9ece87f7.json new file mode 100644 index 00000000..b2da1379 --- /dev/null +++ b/wp-content/languages/en_GB-81d6f084cb273e02e15b01bd9ece87f7.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Your new password has not been saved.":["Your new password has not been saved."],"Show":["Show"],"Hide":["Hide"],"Confirm use of weak password":["Confirm use of weak password"],"Hide password":["Hide password"],"Show password":["Show password"]}},"comment":{"reference":"wp-admin\/js\/user-profile.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-8240df461220d1d3a028a9a4c5652a5b.json b/wp-content/languages/en_GB-8240df461220d1d3a028a9a4c5652a5b.json new file mode 100644 index 00000000..7605b77d --- /dev/null +++ b/wp-content/languages/en_GB-8240df461220d1d3a028a9a4c5652a5b.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP.":["Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP."],"There is %s error which must be fixed before you can update this file.":["There is %s error which must be fixed before you can update this file.","There are %s errors which must be fixed before you can update this file."],"The changes you made will be lost if you navigate away from this page.":["The changes you made will be lost if you navigate away from this page."]}},"comment":{"reference":"wp-admin\/js\/theme-plugin-editor.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-8860e58c20c6a2ab5876a0f07be43bd9.json b/wp-content/languages/en_GB-8860e58c20c6a2ab5876a0f07be43bd9.json new file mode 100644 index 00000000..9e067779 --- /dev/null +++ b/wp-content/languages/en_GB-8860e58c20c6a2ab5876a0f07be43bd9.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Uncategorized":["Uncategorised"],"%s (selected)":["%s (selected)"],"Open the block list view.":["Open the block list view."],"Preferences":["Preferences"],"Review settings such as categories and tags.":["Review settings such as categories and tags."],"Include pre-publish checklist":["Include pre-publish checklist"],"Places the most frequent blocks in the block library.":["Places the most frequent blocks in the block library."],"Show most used blocks":["Show most used blocks"],"Keyboard":["Keyboard"],"Aids screen readers by stopping text caret from leaving blocks.":["Aids screen readers by stopping text caret from leaving blocks."],"Appearance":["Appearance"],"Compacts options and outlines in the toolbar.":["Compacts options and outlines in the Toolbar."],"Reduce the interface":["Reduce the interface"],"Highlights the current block and fades other content.":["Highlights the current block and fades other content."],"Shows text instead of icons in toolbar.":["Shows text instead of icons in Toolbar."],"Display button labels":["Display button labels"],"Make the editor look like your theme.":["Make the editor look like your theme."],"Use theme styles":["Use theme styles"],"Choose what displays in the panel.":["Choose what displays in the panel."],"Additional panels":["Additional panels"],"Add extra areas to the editor.":["Add extra areas to the editor."],"Modes":["Modes"],"Hide More Settings":["Hide More Settings"],"Show More Settings":["Show More Settings"],"Drawer":["Drawer"],"Open save panel":["Open save panel"],"Block library":["Block library"],"Preview in new tab":["Preview in new tab"],"Contain text cursor inside block":["Contain text cursor inside block"],"Left sidebar":["Left sidebar"],"Open document settings":["Open document settings"],"Open block settings":["Open block settings"],"Here's a detailed guide.":["Here's a detailed guide."],"All of the blocks available to you live in the block library. You\u2019ll find it wherever you see the icon.":["All of the blocks available to you live in the block library. You\u2019ll find it wherever you see the icon."],"Learn how to use the block editor":["Learn how to use the block editor"],"New to the block editor? Want to learn more about using it? ":["New to the block editor? Want to learn more about using it? "],"Each block comes with its own set of controls for changing things like color, width, and alignment. These will show and hide automatically when you have a block selected.":["Each block comes with its own set of controls for changing things like colour, width and alignment. These will show and hide automatically when you have a block selected."],"Get to know the block library":["Get to know the block library"],"Make each block your own":["Make each block your own"],"In the WordPress editor, each paragraph, image, or video is presented as a distinct \u201cblock\u201d of content.":["In the WordPress editor, each paragraph, image or video is presented as a distinct \u201cblock\u201d of content."],"Get started":["Get started"],"inserter":["inserter"],"View post":["View post"],"Welcome to the block editor":["Welcome to the block editor"],"Page attributes":["Page attributes"],"https:\/\/wordpress.org\/support\/article\/wordpress-editor\/":["https:\/\/wordpress.org\/support\/article\/wordpress-editor\/"],"Welcome Guide":["Welcome Guide"],"Keyboard shortcuts":["Keyboard shortcuts"],"Editor footer":["Editor footer"],"Generic label for block inserter button\u0004Add block":["Add block"],"All content copied.":["All content copied."],"Disable & Reload":["Disable & Reload"],"Display these keyboard shortcuts.":["Display these keyboard shortcuts."],"A page reload is required for this change. Make sure your content is saved before reloading.":["A page reload is required for this change. Make sure your content is saved before reloading."],"Enable & Reload":["Enable & Reload"],"%d block is disabled.":["%d block is disabled.","%d blocks are disabled."],"Read about permalinks":["Read about permalinks"],"The last part of the URL.":["The last part of the URL. "],"URL Slug":["URL Slug"],"Fullscreen mode deactivated":["Fullscreen mode deactivated"],"Fullscreen mode activated":["Fullscreen mode activated"],"Spotlight mode deactivated":["Spotlight mode deactivated"],"Spotlight mode activated":["Spotlight mode activated"],"Top toolbar deactivated":["Top toolbar deactivated"],"Top toolbar activated":["Top toolbar activated"],"Feature activated":["Feature activated"],"Feature deactivated":["Feature deactivated"],"Block Manager":["Block Manager"],"Block (selected)":["Block (selected)"],"Top toolbar":["Top toolbar"],"Permalink":["Permalink"],"Custom fields":["Custom fields"],"Discussion":["Discussion"],"Code editor selected":["Code editor selected"],"Visual editor selected":["Visual editor selected"],"Transform into:":["Transform into:"],"Document settings":["Document settings"],"Close settings":["Close settings"],"Editor content":["Editor content"],"Block settings closed":["Block settings closed"],"Close plugin":["Close plugin"],"Document":["Document"],"Editor settings":["Editor settings"],"Find original":["Find original"],"Visibility":["Visibility"],"Pin to toolbar":["Pin to toolbar"],"Unpin from toolbar":["Unpin from toolbar"],"Open publish panel":["Open publish panel"],"Editor publish":["Editor publish"],"Block shortcuts":["Block shortcuts"],"Selection shortcuts":["Selection shortcuts"],"Navigate to the previous part of the editor.":["Navigate to the previous part of the editor."],"Show or hide the settings sidebar.":["Show or hide the settings sidebar."],"Remove a link.":["Remove a link."],"Convert the selected text into a link.":["Convert the selected text into a link."],"Underline the selected text.":["Underline the selected text."],"Make the selected text italic.":["Make the selected text italic."],"Make the selected text bold.":["Make the selected text bold."],"Text formatting":["Text formatting"],"Change the block type after adding a new paragraph.":["Change the block type after adding a new paragraph."],"Navigate to the next part of the editor.":["Navigate to the next part of the editor."],"Forward-slash":["Forward-slash"],"This block can only be used once.":["This block can only be used once."],"Additional settings are now available in the Editor block settings sidebar":["Additional settings are now available in the Block Editor settings sidebar"],"Status & visibility":["Status & visibility"],"Copy all content":["Copy all content"],"Switch between visual editor and code editor.":["Switch between visual editor and code editor."],"Editing code":["Editing code"],"Exit code editor":["Exit code editor"],"Editor":["Editor"],"Global shortcuts":["Global shortcuts"],"noun\u0004View":["View"],"Work without distraction":["Work without distraction"],"Focus on one block at a time":["Focus on one block at a time"],"Access all block and document tools in a single place":["Access all block and document tools in a single place"],"Options":["Options"],"Visual editor":["Visual editor"],"Code editor":["Code editor"],"Spotlight mode":["Spotlight mode"],"Fullscreen mode":["Fullscreen mode"],"Editor top bar":["Editor top bar"],"Document tools":["Document tools"],"Document and block tools":["Document and block tools"],"Copied!":["Copied!"],"Search for a block":["Search for a block"],"Available block types":["Available block types"],"Manage all reusable blocks":["Manage all reusable blocks"],"No blocks found.":["No blocks found."],"(opens in a new tab)":["(opens in a new tab)"],"Site Icon":["Site Icon"],"Back":["Back"],"Block":["Block"],"Tools":["Tools"],"Footer":["Footer"],"Remove":["Remove"],"Featured image":["Featured image"],"General":["General"],"Toggle fullscreen mode.":["Toggle fullscreen mode."],"Help":["Help"],"Settings":["Settings"],"Edit":["Edit"],"Publish":["Publish"],"Excerpt":["Excerpt"],"Plugins":["Plugins"],"Content":["Content"],"Header":["Header"],"Close":["Close"],"Select":["Select"],"(no title)":["(no title)"],"Add":["Add"]}},"comment":{"reference":"wp-includes\/js\/dist\/edit-post.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-93882e8f9976382d7f724ac595ed7151.json b/wp-content/languages/en_GB-93882e8f9976382d7f724ac595ed7151.json new file mode 100644 index 00000000..1e9d9b9f --- /dev/null +++ b/wp-content/languages/en_GB-93882e8f9976382d7f724ac595ed7151.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Your session has expired. You can log in again from this page or go to the login page.":["Your session has expired. You can log in again from this page or go to the login page."]}},"comment":{"reference":"wp-includes\/js\/wp-auth-check.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-947c76bb5095da30e16668eec15406b2.json b/wp-content/languages/en_GB-947c76bb5095da30e16668eec15406b2.json new file mode 100644 index 00000000..678f55c2 --- /dev/null +++ b/wp-content/languages/en_GB-947c76bb5095da30e16668eec15406b2.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Your site doesn\u2019t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely.":["Your site doesn\u2019t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely."],"Your site doesn\u2019t include support for the %s block. You can try installing the block or remove it entirely.":["Your site doesn\u2019t include support for the %s block. You can try installing the block or remove it entirely."],"%d+ Million active installations":["%d+ Million active installations"],"Less than 10 active installations":["Less than ten active installations"],"This author has %1$d block.":["This author has %1$d block.","This author has %1$d blocks."],"Adding\u2026":["Adding\u2026"],"An error occurred.":["An error occurred."],"Added: %d block":["Added: %d block","Added: %d blocks"],"The following block has been added to your site.":["The following block has been added to your site.","The following blocks have been added to your site."],"Error registering block. Try reloading the page.":["Error registering block. Try reloading the page."],"This block is already installed. Try reloading the page.":["This block is already installed. Try reloading the page."],"Error installing block. You can reload the page and try again.":["Error installing block. You can reload the page and try again."],"Reload":["Reload"],"%s block icon":["%s block icon"],"No blocks found in your library. These blocks can be downloaded and installed:":["No blocks found in your library. These blocks can be downloaded and installed:"],"No blocks found in your library. We did find %d block available for download.":["No blocks found in your library. We did find %d block available for download.","No blocks found in your library. We did find %d blocks available for download."],"No blocks found in your library.":["No blocks found in your library."],"Retry":["Retry"],"Authored by %s":["Authored by %s"],"%d total rating":["%d total rating","%d total ratings"],"%s out of 5 stars":["%s out of 5 stars"],"This author has %1$d block, with an average rating of %2$.1f.":["This author has %1$d block, with an average rating of %2$.1f.","This author has %1$d blocks, with an average rating of %2$.1f."],"%d+ active installations":["%d+ active installations"],"Keep as HTML":["Keep as HTML"],"Add block":["Add block"],"Install %s":["Install %s"],"Updated %s":["Updated %s"],"By %s":["By %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/block-directory.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-9b256ea9cd54df92095e04c76758ceb0.json b/wp-content/languages/en_GB-9b256ea9cd54df92095e04c76758ceb0.json new file mode 100644 index 00000000..f2ac24ee --- /dev/null +++ b/wp-content/languages/en_GB-9b256ea9cd54df92095e04c76758ceb0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Error while saving the changes.":["Error while saving the changes."],"Remove From Bulk Edit":["Remove From Bulk Edit"],"Changes saved.":["Changes saved."],"tag delimiter\u0004,":[","],"(no title)":["(no title)"]}},"comment":{"reference":"wp-admin\/js\/inline-edit-post.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-9c3519f4870fac83dc0dbf18cb6bd4c4.json b/wp-content/languages/en_GB-9c3519f4870fac83dc0dbf18cb6bd4c4.json new file mode 100644 index 00000000..acbe02a3 --- /dev/null +++ b/wp-content/languages/en_GB-9c3519f4870fac83dc0dbf18cb6bd4c4.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Color value":["Colour value"],"Select default color":["Select default colour"],"Clear color":["Clear colour"],"Select Color":["Select Colour"],"Clear":["Clear"],"Default":["Default"]}},"comment":{"reference":"wp-admin\/js\/color-picker.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-9d47a87c240c1d10701cd6a02b28aa1b.json b/wp-content/languages/en_GB-9d47a87c240c1d10701cd6a02b28aa1b.json new file mode 100644 index 00000000..c3234946 --- /dev/null +++ b/wp-content/languages/en_GB-9d47a87c240c1d10701cd6a02b28aa1b.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Term removed.":["Term removed."],"Term added.":["Term added."],"Remove term:":["Remove term:"],"tag delimiter\u0004,":[","]}},"comment":{"reference":"wp-admin\/js\/tags-box.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-a25d1cc7bf7ca0b4e114f6bea64943f4.json b/wp-content/languages/en_GB-a25d1cc7bf7ca0b4e114f6bea64943f4.json new file mode 100644 index 00000000..b28cc2bb --- /dev/null +++ b/wp-content/languages/en_GB-a25d1cc7bf7ca0b4e114f6bea64943f4.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Period":["Period"],"Comma":["Comma"],"Backtick":["Backtick"]}},"comment":{"reference":"wp-includes\/js\/dist\/keycodes.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-a9dc201dcd011fe71849743133052619.json b/wp-content/languages/en_GB-a9dc201dcd011fe71849743133052619.json new file mode 100644 index 00000000..c588cead --- /dev/null +++ b/wp-content/languages/en_GB-a9dc201dcd011fe71849743133052619.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"You are about to permanently delete this menu.\n'Cancel' to stop, 'OK' to delete.":["You are about to permanently delete this menu.\n'Cancel' to stop, 'OK' to delete."],"missing menu item navigation label\u0004(no label)":["(no label)"],"The changes you made will be lost if you navigate away from this page.":["The changes you made will be lost if you navigate away from this page."],"No results found.":["No results found."]}},"comment":{"reference":"wp-admin\/js\/nav-menu.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-aabfce98c410957228848dc581e3c420.json b/wp-content/languages/en_GB-aabfce98c410957228848dc581e3c420.json new file mode 100644 index 00000000..74b6368b --- /dev/null +++ b/wp-content/languages/en_GB-aabfce98c410957228848dc581e3c420.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Your new password for %s is:":["Your new password for %s is:"],"Be sure to save this in a safe location. You will not be able to retrieve it.":["Be sure to save this in a safe location. You will not be able to retrieve it."]}},"comment":{"reference":"wp-admin\/js\/auth-app.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-ac23eee47530ac63a1178c827db28087.json b/wp-content/languages/en_GB-ac23eee47530ac63a1178c827db28087.json new file mode 100644 index 00000000..21667b6b --- /dev/null +++ b/wp-content/languages/en_GB-ac23eee47530ac63a1178c827db28087.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"text direction\u0004ltr":["ltr"]}},"comment":{"reference":"wp-includes\/js\/dist\/i18n.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-bf0f094965d3d4a95b47babcb35fc136.json b/wp-content/languages/en_GB-bf0f094965d3d4a95b47babcb35fc136.json new file mode 100644 index 00000000..86cd3153 --- /dev/null +++ b/wp-content/languages/en_GB-bf0f094965d3d4a95b47babcb35fc136.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Word count type. Do not translate!\u0004words":["words"],"Characters":["Characters"],"Save draft":["Save draft"],"template part":["template part","template parts"],"template":["template","templates"],"page":["page","pages"],"site":["site","sites"],"There are no changes.":["There are no changes."],"Changes have been made to your %s.":["Changes have been made to your %s."],"Changes have been made to your %1$s and %2$s.":["Changes have been made to your %1$s and %2$s."],"Changes have been made to your %1$s, %2$s, and %3$s.":["Changes have been made to your %1$s, %2$s, and %3$s."],"Changes have been made to your %1$s, %2$s, %3$s, and %4$s.":["Changes have been made to your %1$s, %2$s, %3$s, and %4$s."],"Changes have been made to your %1$s, %2$s, %3$s, %4$s, and %5$s.":["Changes have been made to your %1$s, %2$s, %3$s, %4$s, and %5$s."],"Changes have been made to multiple entity types.":["Changes have been made to multiple entity types."],"Are you ready to save?":["Are you ready to save?"],"Hide changes.":["Hide changes."],"Review changes.":["Review changes."],"Slug":["Slug"],"Update\u2026":["Update\u2026"],"Submit for Review\u2026":["Submit for Review\u2026"],"Pending review":["Pending review"],"https:\/\/wordpress.org\/support\/article\/excerpt\/":["https:\/\/wordpress.org\/support\/article\/excerpt\/"],"verb\u0004Group":["Group"],"Ungrouping blocks from within a Group block back into individual blocks within the Editor \u0004Ungroup":["Ungroup"],"Restore the backup":["Restore the backup"],"The backup of this post in your browser is different from the version below.":["The backup of this post in your browser is different from the version below."],"Details":["Details"],"Search Terms":["Search Terms"],"Stick to the top of the blog":["Stick to the top of the blog"],"Exit the Editor":["Exit the Editor"],"The current image has no alternative text. The file name is: %s":["The current image has no alternative text. The file name is: %s"],"To edit the featured image, you need permission to upload media.":["To edit the featured image, you need permission to upload media."],"Start writing with text or HTML":["Start writing with text or HTML"],"Type text or HTML":["Type text or HTML"],"post":["post"],"Redo your last undo.":["Redo your last undo."],"Undo your last changes.":["Undo your last changes."],"Save your changes.":["Save your changes."],"Trashing failed":["Binning failed"],"You have unsaved changes. If you proceed, they will be lost.":["You have unsaved changes. If you proceed, they will be lost."],"Reset the template":["Reset the template"],"Keep it as is":["Keep it as is"],"The content of your post doesn\u2019t match the template assigned to your post type.":["The content of your post doesn\u2019t match the template assigned to your post type."],"Publishing failed.":["Publishing failed."],"Scheduling failed.":["Scheduling failed."],"Updating failed.":["Updating failed."],"Add title":["Add title"],"term\u0004%s removed":["%s removed"],"term\u0004%s added":["%s added"],"Document Outline":["Document Outline"],"Paragraphs":["Paragraphs"],"Headings":["Headings"],"Protected with a password you choose. Only those with the password can view this post.":["Protected with a password you choose. Only those with the password can view this post."],"Only visible to site admins and editors.":["Only visible to site admins and editors."],"Visible to everyone.":["Visible to everyone."],"Post Visibility":["Post Visibility"],"Would you like to privately publish this post now?":["Would you like to privately publish this post now?"],"Use a secure password":["Use a secure password"],"Create password":["Create password"],"Move to trash":["Move to bin"],"Parent Term":["Parent Term"],"Add new term":["Add new term"],"Add new category":["Add new category"],"Term":["Term"],"Tag":["Tag"],"Are you sure you want to unpublish this post?":["Are you sure you want to unpublish this post?"],"Immediately":["Immediately"],"Saving":["Saving"],"Resetting the template may result in loss of content, do you want to continue?":["Resetting the template may result in loss of content, do you want to continue?"],"Document Statistics":["Document Statistics"],"term\u0004Remove %s":["Remove %s"],"Autosaving":["Autosaving"],"There is an autosave of this post that is more recent than the version below.":["There is an autosave of this post that is more recent than the version below."],"View the autosave":["View the autosave"],"Are you sure you want to unschedule this post?":["Are you sure you want to unschedule this post?"],"Terms":["Terms"],"Switch to draft":["Switch to draft"],"Add new Term":["Add new term"],"Are you ready to publish?":["Are you ready to publish?"],"Publish:":["Publish:"],"Visibility:":["Visibility:"],"When you\u2019re ready, submit your work for review, and an Editor will be able to approve it for you.":["When you\u2019re ready, submit your work for review, and an Editor will be able to approve it for you."],"Are you ready to schedule?":["Are you ready to schedule?"],"Your work will be published at the specified date and time.":["Your work will be published at the specified date and time."],"Double-check your settings before publishing.":["Double-check your settings before publishing."],"Copy Link":["Copy Link"],"Copied!":["Copied!"],"Are you ready to submit for review?":["Are you ready to submit for review?"],"What\u2019s next?":["What\u2019s next?"],"%s address":["%s address"],"Submit for Review":["Submit for Review"],"Updating\u2026":["Updating\u2026"],"Publishing\u2026":["Publishing\u2026"],"is now scheduled. It will go live on":["is now scheduled. It will go live on"],"Scheduling\u2026":["Scheduling\u2026"],"is now live.":["is now live."],"Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post.":["Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post."],"Add tags":["Add tags"],"Apply the \"%1$s\" format.":["Apply the \"%1$s\" format."],"Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling.":["Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling."],"Use a post format":["Use a post format"],"Close panel":["Close panel"],"Always show pre-publish checks.":["Always show pre-publish checks."],"imperative verb\u0004Preview":["Preview"],"%d Revision":["%d Revision","%d Revisions"],"Post Format":["Post Format"],"Chat":["Chat"],"Standard":["Standard"],"Aside":["Aside"],"Learn more about manual excerpts":["Learn more about manual excerpts"],"Write an excerpt (optional)":["Write an excerpt (optional)"],"no title":["no title"],"Order":["Order"],"Copy Error":["Copy Error"],"Copy Post Text":["Copy Post Text"],"Attempt Recovery":["Attempt Recovery"],"The editor has encountered an unexpected error.":["The editor has encountered an unexpected error."],"(Multiple H1 headings are not recommended)":["(Multiple H1 headings are not recommended)"],"(Your theme may already use a H1 for the post title)":["(Your theme may already use a H1 for the post title)"],"(Incorrect heading level)":["(Incorrect heading level)"],"(Empty heading)":["(Empty heading)"],"%d result found.":["%d result found.","%d results found."],"Take Over":["Take Over"],"Another user is currently working on this post, which means you cannot make changes, unless you take over.":["Another user is currently working on this post, which means you cannot make changes, unless you take over."],"%s is currently working on this post, which means you cannot make changes, unless you take over.":["%s is currently working on this post, which means you cannot make changes, unless you take over."],"Avatar":["Avatar"],"This post is already being edited.":["This post is already being edited."],"Someone else has taken over this post.":["Someone else has taken over this post."],"Generating preview\u2026":["Generating preview\u2026"],"Edit or update the image":["Edit or update the image"],"Another user now has editing control of this post. Don\u2019t worry, your changes up to this moment have been saved.":["Another user now has editing control of this post. Don\u2019t worry, your changes up to this moment have been saved."],"%s now has editing control of this post. Don\u2019t worry, your changes up to this moment have been saved.":["%s now has editing control of this post. Don\u2019t worry, your changes up to this moment have been saved."],"Allow comments":["Allow comments"],"Allow pingbacks & trackbacks":["Allow pingbacks & trackbacks"],"Category":["Category"],"(opens in a new tab)":["(opens in a new tab)"],"Blocks":["Blocks"],"Gallery":["Gallery"],"Schedule\u2026":["Schedule\u2026"],"Current image: %s":["Current image: %s"],"Replace Image":["Replace Image"],"Status":["Status"],"Template:":["Template:"],"Set featured image":["Set featured image"],"Video":["Video"],"Audio":["Audio"],"Selected":["Selected"],"Saved":["Saved"],"Remove image":["Remove Image"],"Featured image":["Featured image"],"Link":["Link"],"Words":["Words"],"Parent Category":["Parent Category"],"Untitled":["Untitled"],"Quote":["Quote"],"Image":["Image"],"Password Protected":["Password Protected"],"Suggestion:":["Suggestion:"],"Author":["Author"],"Undo":["Undo"],"Publish":["Publish"],"Save":["Save"],"Cancel":["Cancel"],"Redo":["Redo"],"Private":["Private"],"Public":["Public"],"Schedule":["Schedule"],"Update":["Update"],"Select":["Select"],"(no title)":["(no title)"],"Add new tag":["Add new tag"],"Save as pending":["Save as pending"],"Title":["Title"],"Draft":["Draft"]}},"comment":{"reference":"wp-includes\/js\/dist\/editor.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-bf23b24175490c2e46aaf92ff6a0c70f.json b/wp-content/languages/en_GB-bf23b24175490c2e46aaf92ff6a0c70f.json new file mode 100644 index 00000000..42c89add --- /dev/null +++ b/wp-content/languages/en_GB-bf23b24175490c2e46aaf92ff6a0c70f.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Dismiss":["Dismiss"]}},"comment":{"reference":"wp-includes\/js\/wp-pointer.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-ca28138671823450e87dfd354f7afc6b.json b/wp-content/languages/en_GB-ca28138671823450e87dfd354f7afc6b.json new file mode 100644 index 00000000..cd53a254 --- /dev/null +++ b/wp-content/languages/en_GB-ca28138671823450e87dfd354f7afc6b.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Error while saving the changes.":["Error while saving the changes."],"Changes saved.":["Changes saved."]}},"comment":{"reference":"wp-admin\/js\/inline-edit-tax.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-daeb084aab42199d26393a56c3465bc0.json b/wp-content/languages/en_GB-daeb084aab42199d26393a56c3465bc0.json new file mode 100644 index 00000000..a9f416bc --- /dev/null +++ b/wp-content/languages/en_GB-daeb084aab42199d26393a56c3465bc0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Select or Upload Media":["Select or Upload Media"],"Error while uploading file %s to the media library.":["Error while uploading file %s to the media library."],"Sorry, this file type is not supported here.":["Sorry, this file type is not supported here."],"This file is empty.":["This file is empty."],"Sorry, this file type is not permitted for security reasons.":["Sorry, this file type is not permitted for security reasons."],"This file exceeds the maximum upload size for this site.":["This file exceeds the maximum upload size for this site."]}},"comment":{"reference":"wp-includes\/js\/dist\/media-utils.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-e2791ba830489d23043be8650a22a22b.json b/wp-content/languages/en_GB-e2791ba830489d23043be8650a22a22b.json new file mode 100644 index 00000000..275de69f --- /dev/null +++ b/wp-content/languages/en_GB-e2791ba830489d23043be8650a22a22b.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Block rendered as empty.":["Block rendered as empty."],"Error loading block: %s":["Error loading block: %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/server-side-render.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-e2e4c4b80f3adf2c70b431bfdb1b4872.json b/wp-content/languages/en_GB-e2e4c4b80f3adf2c70b431bfdb1b4872.json new file mode 100644 index 00000000..f04d9af4 --- /dev/null +++ b/wp-content/languages/en_GB-e2e4c4b80f3adf2c70b431bfdb1b4872.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 19:03:35+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Attend an upcoming event near you.":["Attend an upcoming event near you."],"Events widget offset prefix\u0004GMT":["GMT"],"%1$s %2$d \u2013 %3$s %4$d, %5$d":["%1$s %2$d \u2013 %3$s %4$d, %5$d"],"upcoming events year format\u0004Y":["Y"],"upcoming events day format\u0004j":["j"],"%1$s %2$d\u2013%3$d, %4$d":["%1$s %2$d\u2013%3$d, %4$d"],"upcoming events month format\u0004F":["F"],"City updated. Listing events near %s.":["City updated. Listing events near %s."],"Enter your closest city to find nearby events.":["Enter your closest city to find nearby events."],"l, M j, Y":["l, j M Y"],"An error occurred. Please try again.":["An error occurred. Please try again."],"We couldn\u2019t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland.":["We couldn\u2019t locate %s. Please try another nearby city. For example: Edinburgh; London; Cardiff."]}},"comment":{"reference":"wp-admin\/js\/dashboard.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-f575f481034e90e21d832e415fd95fcf.json b/wp-content/languages/en_GB-f575f481034e90e21d832e415fd95fcf.json new file mode 100644 index 00000000..1de911eb --- /dev/null +++ b/wp-content/languages/en_GB-f575f481034e90e21d832e415fd95fcf.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Could not set that as the thumbnail image. Try a different attachment.":["Could not set that as the thumbnail image. Try a different attachment."]}},"comment":{"reference":"wp-includes\/js\/media-editor.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB-f8f49d9fc4a9cf7d78ec99285417bd9c.json b/wp-content/languages/en_GB-f8f49d9fc4a9cf7d78ec99285417bd9c.json new file mode 100644 index 00000000..dee53cfc --- /dev/null +++ b/wp-content/languages/en_GB-f8f49d9fc4a9cf7d78ec99285417bd9c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2021-01-28 20:06:07+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"en_GB"},"Convert to blocks":["Convert to blocks"],"Open links in new tab":["Open links in new tab"],"Tracks can be subtitles, captions, chapters, or descriptions. They help make your content more accessible to a wider range of users.":["Tracks can be subtitles, captions, chapters, or descriptions. They help make your content more accessible to a wider range of users."],"Edit %s":["Edit %s"],"Text tracks":["Text tracks"],"Edit track":["Edit track"],"Label":["Label"],"Title of track":["Title of track"],"Source language":["Source language"],"Language tag (en, fr, etc.)":["Language tag (en, fr, etc)"],"Kind":["Kind"],"Remove track":["Remove track"],"Add tracks":["Add tracks"],"Subtitles":["Subtitles"],"Captions":["Captions"],"Combine blocks into a group.":["Combine blocks into a group."],"read more":["read more"],"Toggle search label":["Toggle search label"],"Change button position":["Change button position"],"No Button":["No Button"],"Button Outside":["Button Outside"],"Button Inside":["Button Inside"],"Use button with icon":["Use button with icon"],"Find out more":["Find out more"],"picture":["picture"],"Add link to featured image":["Add link to featured image"],"Read more link text":["Read more link text"],"100":["100"],"One column":["One column"],"Repeated background":["Repeated background"],"by %s":["by %s"],"33 \/ 33 \/ 33":["33\/33\/33"],"25 \/ 50 \/ 25":["25\/50\/25"],"Minimum height of cover":["Minimum height of cover"]," \u2026 ":[" \u2026 "],"Change content position":["Change content position"],"Opacity":["Opacity"],"Display author name":["Display author name"],"social":["social"],"survey":["survey"],"50 \/ 50":["50\/50"],"30 \/ 70":["30\/70"],"70 \/ 30":["70\/30"],"Browser default":["Browser default"],"This column count exceeds the recommended amount and may cause visual breakage.":["This column count exceeds the recommended amount and may cause visual breakage."],"Aspect Ratio":["Aspect Ratio"],"Landscape":["Landscape"],"16:10":["16:10"],"16:9":["16:9"],"4:3":["4:3"],"3:2":["3:2"],"Portrait":["Portrait"],"10:16":["10:16"],"9:16":["9:16"],"3:4":["3:4"],"2:3":["2:3"],"Zoom":["Zoom"],"Rotate":["Rotate"],"Crop":["Crop"],"Color Settings":["Colour Settings"],"Could not edit image. %s":["Could not edit image. %s"],"Image uploaded.":["Image uploaded."],"Upload external image":["Upload external image"],"Edit gallery image":["Edit gallery image"],"Display an icon linking to a social media profile or website.":["Display an icon linking to a social media profile or website."],"Briefly describe the link to help screen reader users.":["Briefly describe the link to help screen reader users."],"Link label":["Link label"],"%s label":["%s label"],"Social Icon":["Social Icon"],"block keywords\u0004links":["links"],"Display icons linking to your social media profiles or websites.":["Display icons linking to your social media profiles or websites."],"Social Icons":["Social Icons"],"Select poster image":["Select poster image"],"Poster image":["Poster image"],"poem":["poem"],"WHAT was he doing, the great god Pan,\n\tDown in the reeds by the river?\nSpreading ruin and scattering ban,\nSplashing and paddling with hoofs of a goat,\nAnd breaking the golden lilies afloat\n With the dragon-fly on the river.":["WHAT was he doing, the great god Pan,\n\tDown in the reeds by the river?\nSpreading ruin and scattering ban,\nSplashing and paddling with hooves of a goat,\nAnd breaking the golden lilies afloat\n With the dragonfly on the river."],"Footer label":["Footer label"],"Header label":["Header label"],"Matt Mullenweg":["Matt Mullenweg"],"EXT. XANADU - FAINT DAWN - 1940 (MINIATURE)\nWindow, very small in the distance, illuminated.\nAll around this is an almost totally black screen. Now, as the camera moves slowly towards the window which is almost a postage stamp in the frame, other forms appear;":["EXT. XANADU - FAINT DAWN - 1940 (MINIATURE)\nWindow, very small in the distance, illuminated.\nAll around this is an almost totally black screen. Now, as the camera moves slowly towards the window, which is almost a postage stamp in the frame, other forms appear;"],"Unsupported":["Unsupported"],"Show:":["Show:"],"Image alignment":["Image alignment"],"Display featured image":["Display featured image"],"Featured image settings":["Featured image settings"],"Full post":["Full post"],"download":["download"],"Media file":["Media file"],"Suspendisse commodo neque lacus, a dictum orci interdum et.":["Suspendisse commodo neque lacus, a dictum orci interdum et."],"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis.":["Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis."],"\/\/ A \"block\" is the abstract term used\n\/\/ to describe units of markup that\n\/\/ when composed together, form the\n\/\/ content or layout of a page.\nregisterBlockType( name, settings );":["\/\/ A \"block\" is the abstract term used\n\/\/ to describe units of markup that\n\/\/ when composed together, form the\n\/\/ content or layout of a page.\nregisterBlockType( name, settings );"],"Prompt visitors to take action with a group of button-style links.":["Prompt visitors to take action with a group of button-style links."],"Buttons":["Buttons"],"recording":["recording"],"podcast":["podcast"],"Link to":["Link to"],"Gallery settings":["Gallery settings"],"ADD MEDIA":["ADD MEDIA"],"Level %1$s. %2$s":["Level %1$s. %2$s"],"Level %s. Empty.":["Level %s. Empty."],"Change heading level":["Change heading level"],"(Note: many devices and browsers do not display this text.)":["(Note: many devices and browsers do not display this text.)"],"Describe the role of this image on the page.":["Describe the role of this image on the page."],"Title attribute":["Title attribute"],"Embed a TikTok video.":["Embed a TikTok video."],"Open Media Library":["Open Media Library"],"Image size":["Image size"],"Pill Shape":["Pill Shape"],"Logos Only":["Logos Only"],"Grid view":["Grid view"],"List view":["List view"],"Post content":["Post Content"],"Post meta settings":["Post meta settings"],"Sorting and filtering":["Sorting and filtering"],"Enter address":["Enter address"],"Post content settings":["Post content settings"],"Play inline":["Play inline"],"The current poster image url is %s":["The current poster image URL is %s"],"There is no poster image currently selected":["There is no poster image currently selected"],"Note: Autoplaying audio may cause usability issues for some visitors.":["Note: autoplaying audio may cause usability issues for some visitors."],"Note: Autoplaying videos may cause usability issues for some visitors.":["Note: autoplaying videos may cause usability issues for some visitors."],"Column settings":["Column settings"],"Percentage Width":["Percentage Width"],"Nam risus massa, ullamcorper consectetur eros fermentum, porta aliquet ligula. Sed vel mauris nec enim.":["Nam risus massa, ullamcorper consectetur eros fermentum, porta aliquet ligula. Sed vel mauris nec enim."],"Etiam et egestas lorem. Vivamus sagittis sit amet dolor quis lobortis. Integer sed fermentum arcu, id vulputate lacus. Etiam fermentum sem eu quam hendrerit.":["Etiam et egestas lorem. Vivamus sagittis sit amet dolor quis lobortis. Integer sed fermentum arcu, id vulputate lacus. Etiam fermentum sem eu quam hendrerit."],"Two columns; one-third, two-thirds split":["Two columns; one-third, two-thirds split"],"Two columns; two-thirds, one-third split":["Two columns; two-thirds, one-third split"],"Three columns; equal split":["Three columns; equal split"],"Three columns; wide center column":["Three columns; wide centre column"],"Two columns; equal split":["Two columns; equal split"],"Fill":["Fill"],"Call to Action":["Call to Action"],"Link rel":["Link rel"],"Welcome to the wonderful world of blocks\u2026":["Welcome to the wonderful world of blocks\u2026"],"Border radius":["Border radius"],"In quoting others, we cite ourselves.":["In quoting others, we cite ourselves."],"cite":["cite"],"One of the hardest things to do in technology is disrupt yourself.":["One of the hardest things to do in technology is disrupt yourself."],"Ordered list settings":["Ordered list settings"],"Start value":["Start value"],"Reverse list numbering":["Reverse list numbering"],"Upload a file or pick one from your media library.":["Upload a file or pick one from your media library."],"Open in new tab":["Open in new tab"],"Header section":["Header section"],"Footer section":["Footer section"],"Insert a table for sharing data.":["Insert a table for sharing data."],"Create Table":["Create Table"],"Upload an image or video file, or pick one from your media library.":["Upload an image or video file, or pick one from your media library."],"Change column alignment":["Change column alignment"],"Attachment page":["Attachment page"],"Release Date":["Release Date"],"Jazz Musician":["Jazz Musician"],"Snow Patrol<\/strong>":["Snow Patrol<\/strong>"],"Clear Media":["Clear Media"],"Mont Blanc appears\u2014still, snowy, and serene.":["Mont Blanc appears\u2014still, snowy, and serene."],"December 6, 2018":["6 December 2018"],"February 21, 2019":["21 February 2019"],"May 7, 2019":["7 May 2019"],"Align column left":["Align column left"],"Align column center":["Align column centre"],"Align column right":["Align column right"],"\u2014 Kobayashi Issa (\u4e00\u8336)":["\u2014 Kobayashi Issa (\u4e00\u8336)"],"Describe the purpose of the image":["Describe the purpose of the image"],"Leave empty if the image is purely decorative.":["Leave empty if the image is purely decorative."],"Crop image to fill entire column":["Crop image to fill entire column"],"The wren
Earns his living
Noiselessly.":["The wren
Earns his living
Noiselessly."],"Write gallery caption\u2026":["Write gallery caption\u2026"],"Code is Poetry":["Code is Poetry"],"Move image forward":["Move image forward"],"Move image backward":["Move image backward"],"In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.":["In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing."],"Group":["Group"],"container":["container"],"wrapper":["wrapper"],"row":["row"],"section":["section"],"Paste a link to the content you want to display on your site.":["Paste a link to the content you want to display on your site."],"https:\/\/wordpress.org\/support\/article\/embeds\/":["https:\/\/wordpress.org\/support\/article\/embeds\/"],"Learn more about embeds":["Learn more about embeds"],"Six.":["Six."],"Five.":["Five."],"Four.":["Four."],"Three.":["Three."],"Two.":["Two."],"One.":["One."],"- Select -":["- Select -"],"feed":["feed"],"atom":["atom"],"Display entries from any RSS or Atom feed.":["Display entries from any RSS or Atom feed."],"Max number of words in excerpt":["Max number of words in excerpt"],"Display excerpt":["Display excerpt"],"Display date":["Display date"],"Display author":["Display author"],"Edit RSS URL":["Edit RSS URL"],"Use URL":["Use URL"],"Enter URL here\u2026":["Enter URL here\u2026"],"find":["find"],"Help visitors find your content.":["Help visitors find your content."],"Add button text\u2026":["Add button text\u2026"],"Button text":["Button text"],"Optional placeholder\u2026":["Optional placeholder\u2026"],"Optional placeholder text":["Optional placeholder text"],"Add label\u2026":["Add label\u2026"],"RSS settings":["RSS settings"],"Tag Cloud settings":["Tag Cloud settings"],"Label text":["Label text"],"Content before this block will be shown in the excerpt on your archives page.":["Content before this block will be shown in the excerpt on your archives page."],"Hide the excerpt on the full content page":["Hide the excerpt on the full content page"],"The excerpt is visible.":["The excerpt is visible."],"The excerpt is hidden.":["The excerpt is hidden."],"archive":["archive"],"posts":["posts"],"A calendar of your site\u2019s posts.":["A calendar of your site\u2019s posts."],"link":["link"],"Prompt visitors to take action with a button-style link.":["Prompt visitors to take action with a button-style link."],"image %1$d of %2$d in gallery":["image %1$d of %2$d in gallery"],"Embedded content from %s can't be previewed in the editor.":["Embedded content from %s can't be previewed in the editor."],"Sorry, this content could not be embedded.":["Sorry, this content could not be embedded."],"Embed Amazon Kindle content.":["Embed Amazon Kindle content."],"ebook":["ebook"],"Focal point picker":["Focal point picker"],"block style\u0004Default":["Default"],"keyboard key\u0004Space":["Space"],"keyboard key\u0004Backspace":["Backspace"],"Embed Crowdsignal (formerly Polldaddy) content.":["Embed Crowdsignal (formerly Polldaddy) content."],"content placeholder\u0004Content\u2026":["Content\u2026"],"button label\u0004Convert to link":["Convert to link"],"button label\u0004Try again":["Try again"],"This image has an empty alt attribute":["This image has an empty alt attribute"],"This image has an empty alt attribute; its file name is %s":["This image has an empty alt attribute; its file name is %s"],"Start writing or type \/ to choose a block":["Start writing or type \/ to choose a block"],"Empty block; start writing or type forward slash to choose a block":["Empty block; start writing or type forward slash to choose a block"],"Paragraph block":["Paragraph block"],"Page Break":["Page Break"],"Stack on mobile":["Stack on mobile"],"poetry":["poetry"],"Verse":["Verse"],"New Column":["New Column"],"Write\u2026":["Write\u2026"],"Muted":["Muted"],"movie":["movie"],"Text Columns (deprecated)":["Text Columns (deprecated)"],"This block is deprecated. Please use the Columns block instead.":["This block is deprecated. Please use the Columns block instead."],"Stripes":["Stripes"],"Insert a table \u2014 perfect for sharing charts and data.":["Insert a table \u2014 perfect for sharing charts and data."],"Embed a video from your media library or upload a new one.":["Embed a video from your media library or upload a new one."],"Insert poetry. Use special spacing formats. Or quote song lyrics.":["Insert poetry. Use special spacing formats. Or quote song lyrics."],"Playback controls":["Playback controls"],"Video settings":["Video settings"],"divider":["divider"],"horizontal-line":["horizontal-line"],"Separator":["Separator"],"Shortcode":["Shortcode"],"Write shortcode here\u2026":["Write shortcode here\u2026"],"Height in pixels":["Height in pixels"],"Spacer":["Spacer"],"Write subheading\u2026":["Write subheading\u2026"],"Fixed width table cells":["Fixed width table cells"],"Dots":["Dots"],"Wide Line":["Wide Line"],"blockquote":["blockquote"],"Subheading (deprecated)":["Subheading (deprecated)"],"This block is deprecated. Please use the Paragraph block instead.":["This block is deprecated. Please use the Paragraph block instead."],"Add white space between blocks and customize its height.":["Add white space between blocks and customise its height."],"Insert additional custom elements with a WordPress shortcode.":["Insert additional custom elements with a WordPress shortcode."],"Create a break between ideas or sections with a horizontal separator.":["Create a break between ideas or sections with a horizontal separator."],"block style\u0004Large":["Large"],"Give quoted text visual emphasis. \"In quoting others, we cite ourselves.\" \u2014 Julio Cort\u00e1zar":["Give quoted text visual emphasis. \"In quoting others, we cite ourselves.\" \u2014 Julio Cort\u00e1zar"],"Edit table":["Edit table"],"Spacer settings":["Spacer settings"],"Table settings":["Table settings"],"Column count":["Column count"],"Row count":["Row count"],"Write preformatted text\u2026":["Write preformatted text\u2026"],"Write citation\u2026":["Write citation\u2026"],"Write quote\u2026":["Write quote\u2026"],"Pullquote":["Pullquote"],"Give special visual emphasis to a quote from your text.":["Give special visual emphasis to a quote from your text."],"Main color":["Main colour"],"Solid color":["Solid colour"],"text":["text"],"Display post date":["Display post date"],"photo":["photo"],"Convert to ordered list":["Convert to ordered list"],"Convert to unordered list":["Convert to unordered list"],"Indent list item":["Indent list item"],"Latest Posts":["Latest Posts"],"next page":["next page"],"numbered list":["numbered list"],"Outdent list item":["Outdent list item"],"pagination":["pagination"],"recent posts":["recent posts"],"Write list\u2026":["Write list\u2026"],"Showing large initial letter.":["Showing large initial letter."],"Toggle to show a large initial letter.":["Toggle to show a large initial letter."],"Add text that respects your spacing and tabs, and also allows styling.":["Add text that respects your spacing and tabs, and also allows styling."],"Display a list of your most recent posts.":["Display a list of your most recent posts."],"Latest Comments":["Latest Comments"],"recent comments":["recent comments"],"Keep as HTML":["Keep as HTML"],"block name\u0004More":["More"],"Media area":["Media area"],"Media & Text":["Media & Text"],"Show media on right":["Show media on right"],"Show media on left":["Show media on left"],"Start with the building block of all narrative.":["Start with the building block of all narrative."],"Separate your content into a multi-page experience.":["Separate your content into a multi-page experience."],"Create a bulleted or numbered list.":["Create a bulleted or numbered list."],"Display a list of your most recent comments.":["Display a list of your most recent comments."],"Insert an image to make a visual statement.":["Insert an image to make a visual statement."],"Your site doesn\u2019t include support for this block.":["Your site doesn\u2019t include support for this block."],"Your site doesn\u2019t include support for the \"%s\" block. You can leave this block intact or remove it entirely.":["Your site doesn\u2019t include support for the \"%s\" block. You can leave this block intact or remove it entirely."],"Your site doesn\u2019t include support for the \"%s\" block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely.":["Your site doesn\u2019t include support for the \"%s\" block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely."],"Set media and words side-by-side for a richer layout.":["Set media and words side-by-side for a richer layout."],"Text settings":["Text settings"],"Drop cap":["Drop cap"],"Number of comments":["Number of comments"],"Latest comments settings":["Latest comments settings"],"Display avatar":["Display avatar"],"Media & Text settings":["Media & Text settings"],"embed":["embed"],"Edit image":["Edit image"],"Heading":["Heading"],"images":["images"],"photos":["photos"],"subtitle":["subtitle"],"Thumbnails are cropped to align.":["Thumbnails are cropped to align."],"Thumbnails are not cropped.":["Thumbnails are not cropped."],"title":["title"],"Write heading\u2026":["Write heading\u2026"],"Heading %d":["Heading %d"],"Copy URL":["Copy URL"],"document":["document"],"Write file name\u2026":["Write file name\u2026"],"Write HTML\u2026":["Write HTML\u2026"],"pdf":["pdf"],"Add custom HTML code and preview it as you edit.":["Add custom HTML code and preview it as you edit."],"Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.":["Introduce new sections and organise content to help visitors (and search engines) understand the structure of your content."],"Display multiple images in a rich gallery.":["Display multiple images in a rich gallery."],"Drag images, upload new ones or select files from your library.":["Drag images, upload new ones or select files from your library."],"button label\u0004Download":["Download"],"Add a link to a downloadable file.":["Add a link to a downloadable file."],"Download button settings":["Download button settings"],"Show download button":["Show download button"],"Text link settings":["Text link settings"],"Crop images":["Crop images"],"Image settings":["Image settings"],"Alt text (alternative text)":["Alt text (alternative text)"],"video":["video"],"audio":["audio"],"music":["music"],"image":["image"],"blog":["blog"],"post":["post"],"%s URL":["%s URL"],"Embedded content from %s":["Embedded content from %s"],"Embedding\u2026":["Embedding\u2026"],"Enter URL to embed here\u2026":["Enter URL to embed here\u2026"],"Write title\u2026":["Write title\u2026"],"Add a block that displays content pulled from other sites, like Twitter, Instagram or YouTube.":["Add a block that displays content pulled from other sites, like Twitter, Instagram or YouTube."],"Edit URL":["Edit URL"],"Overlay":["Overlay"],"block title\u0004Embed":["Embed"],"button label\u0004Embed":["Embed"],"Resize for smaller devices":["Resize for smaller devices"],"This embed may not preserve its aspect ratio when the browser is resized.":["This embed may not preserve its aspect ratio when the browser is resized."],"This embed will preserve its aspect ratio when the browser is resized.":["This embed will preserve its aspect ratio when the browser is resized."],"Add an image or video with a text overlay \u2014 great for headers.":["Add an image or video with a text overlay \u2014 great for headers."],"Embed a WordPress.tv video.":["Embed a WordPress.tv video."],"Embed a VideoPress video.":["Embed a VideoPress video."],"Embed a Tumblr post.":["Embed a Tumblr post."],"Embed a TED video.":["Embed a TED video."],"Embed Speaker Deck content.":["Embed Speaker Deck content."],"Embed SmugMug content.":["Embed SmugMug content."],"Embed Slideshare content.":["Embed Slideshare content."],"Embed Scribd content.":["Embed Scribd content."],"Embed Screencast content.":["Embed Screencast content."],"Embed ReverbNation content.":["Embed ReverbNation content."],"Embed a Reddit thread.":["Embed a Reddit thread."],"Embed Mixcloud content.":["Embed Mixcloud content."],"Embed Meetup.com content.":["Embed Meetup.com content."],"Embed Kickstarter content.":["Embed Kickstarter content."],"Embed Issuu content.":["Embed Issuu content."],"Embed Imgur content.":["Embed Imgur content."],"Embed a Dailymotion video.":["Embed a Dailymotion video."],"Embed CollegeHumor content.":["Embed CollegeHumor content."],"Embed Cloudup content.":["Embed Cloudup content."],"Embed an Animoto video.":["Embed an Animoto video."],"Embed a Vimeo video.":["Embed a Vimeo video."],"Embed Flickr content.":["Embed Flickr content."],"Embed Spotify content.":["Embed Spotify content."],"Embed SoundCloud content.":["Embed SoundCloud content."],"Embed an Instagram post.":["Embed an Instagram post."],"Embed a Facebook post.":["Embed a Facebook post."],"Embed a YouTube video.":["Embed a YouTube video."],"Embed a tweet.":["Embed a tweet."],"Fixed background":["Fixed background"],"Media settings":["Media settings"],"Border settings":["Border settings"],"Add a block that displays content in multiple columns, then add whatever content blocks you\u2019d like.":["Add a block that displays content in multiple columns, then add whatever content blocks you\u2019d like."],"Cover":["Cover"],"Add text\u2026":["Add text\u2026"],"Button":["Button"],"Write code\u2026":["Write code\u2026"],"A single column within a columns block.":["A single column within a columns block."],"Outline":["Outline"],"Classic":["Classic Edit"],"Display code snippets that respect your spacing and tabs.":["Display code snippets that respect your spacing and tabs."],"Use the classic WordPress editor.":["Use the classic WordPress editor."],"Display a list of all categories.":["Display a list of all categories."],"block style\u0004Rounded":["Rounded"],"block title\u0004Classic":["Classic Block"],"Categories settings":["Categories settings"],"Color settings":["Colour settings"],"Create and save content to reuse across your site. Update the block, and the changes apply everywhere it\u2019s used.":["Create and save content to reuse across your site. Update the block, and the changes apply everywhere it\u2019s used."],"Block has been deleted or is unavailable.":["Block has been deleted or is unavailable."],"Write caption\u2026":["Write caption\u2026"],"Reusable Block":["Reusable Block"],"Display a monthly archive of your posts.":["Display a monthly archive of your posts."],"Embed a simple audio player.":["Embed a simple audio player."],"Archives settings":["Archives settings"],"Audio settings":["Audio settings"],"Link settings":["Link settings"],"Copied!":["Copied!"],"Replace image":["Replace image"],"Convert to regular blocks":["Convert to regular blocks"],"Number of items":["Number of items"],"Block updated.":["Block updated."],"Gallery":["Gallery"],"English":["English"],"Chapters":["Chapters"],"Custom HTML":["Custom HTML"],"Contact us":["Contact us"],"Original":["Original"],"(Untitled)":["(Untitled)"],"Read more":["Read more"],"Embed a WordPress post.":["Embed a WordPress post."],"Taxonomy":["Taxonomy"],"Color":["Colour"],"Display Settings":["Display Settings"],"editor button\u0004Left to right":["Left to right"],"Auto":["Auto"],"Metadata":["Metadata"],"Autoplay":["Autoplay"],"Delete column":["Delete column"],"Background color":["Background colour"],"Text color":["Text colour"],"Page break":["Page break"],"Replace":["Replace"],"Table":["Table"],"bullet list":["bullet list"],"File":["File"],"A cloud of your most used tags.":["A cloud of your most used tags."],"Empty":["Empty"],"Video":["Video"],"Audio":["Audio"],"Columns":["Columns"],"Attachment Page":["Attachment Page"],"Media File":["Media File"],"Background Color":["Background Colour"],"Text Color":["Text Colour"],"Remove image":["Remove Image"],"Upload":["Upload"],"Remove":["Remove"],"Link":["Link"],"Square":["Square"],"Preload":["Preload"],"Display as dropdown":["Display as dropdown"],"Descriptions":["Descriptions"],"Show post counts":["Show post counts"],"Calendar":["Calendar"],"Show hierarchy":["Show hierarchy"],"Tag Cloud":["Tag Cloud"],"Insert row before":["Insert row before"],"Insert row after":["Insert row after"],"Delete row":["Delete row"],"Insert column before":["Insert column before"],"Insert column after":["Insert column after"],"Column":["Column"],"Paragraph":["Paragraph"],"Preformatted":["Preformatted"],"Code":["Code"],"Dimensions":["Dimensions"],"List":["List"],"Loop":["Loop"],"Quote":["Quote"],"Image":["Image"],"ordered list":["ordered list"],"Unlink":["Unlink"],"Name:":["Name:"],"sound":["sound"],"Width":["Width"],"Default":["Default"],"HTML":["HTML"],"URL":["URL"],"Edit":["Edit"],"Apply":["Apply"],"Excerpt":["Excerpt"],"Save":["Save"],"Categories":["Categories"],"None":["None"],"RSS":["RSS"],"Preview":["Preview"],"Cancel":["Cancel"],"Archives":["Archives"],"Search":["Search"],"Version":["Version"],"Close":["Close"],"Select":["Select"],"(no title)":["(no title)"],"No posts found.":["No posts found."]}},"comment":{"reference":"wp-includes\/js\/dist\/block-library.js"}} \ No newline at end of file diff --git a/wp-content/languages/en_GB.mo b/wp-content/languages/en_GB.mo new file mode 100644 index 00000000..4863750d Binary files /dev/null and b/wp-content/languages/en_GB.mo differ diff --git a/wp-content/languages/en_GB.po b/wp-content/languages/en_GB.po new file mode 100644 index 00000000..912074a1 --- /dev/null +++ b/wp-content/languages/en_GB.po @@ -0,0 +1,15672 @@ +# Translation of WordPress - 5.6.x - Development in English (UK) +# This file is distributed under the same license as the WordPress - 5.6.x - Development package. +msgid "" +msgstr "" +"PO-Revision-Date: 2021-01-28 20:06:07+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: en_GB\n" +"Project-Id-Version: WordPress - 5.6.x - Development\n" + +#: wp-includes/script-loader.php:1473 +msgctxt "Google Font Name and Variants" +msgid "Noto Serif:400,400i,700,700i" +msgstr "Noto Serif:400,400i,700,700i" + +#: wp-includes/comment-template.php:915 +msgctxt "Comment number declension: on or off" +msgid "off" +msgstr "off" + +#: wp-includes/general-template.php:842 +msgid "html_lang_attribute" +msgstr "en-GB" + +#: wp-includes/functions.php:334 +msgctxt "decline months names: on or off" +msgid "off" +msgstr "off" + +#: wp-includes/script-loader.php:1651 wp-includes/formatting.php:3887 +#: wp-includes/js/dist/editor.js:11968 +msgctxt "Word count type. Do not translate!" +msgid "words" +msgstr "words" + +#: wp-login.php:122 wp-includes/admin-bar.php:165 +#: wp-includes/widgets/class-wp-widget-meta.php:90 wp-admin/upgrade.php:68 +#: wp-admin/admin-footer.php:38 wp-admin/maint/repair.php:24 +msgid "https://wordpress.org/" +msgstr "https://en-gb.wordpress.org/" + +#: wp-includes/script-loader.php:1383 +msgctxt "Open Sans font: on or off" +msgid "on" +msgstr "on" + +#. translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. +#: wp-includes/class-wp-locale.php:217 wp-includes/js/dist/i18n.js:1092 +msgctxt "text direction" +msgid "ltr" +msgstr "ltr" + +#. translators: Opening curly double quote. +#: wp-includes/formatting.php:84 wp-includes/formatting.php:5454 +msgctxt "opening curly double quote" +msgid "“" +msgstr "“" + +#. translators: Closing curly double quote. +#: wp-includes/formatting.php:86 +msgctxt "closing curly double quote" +msgid "”" +msgstr "”" + +#. translators: Opening curly single quote. +#: wp-includes/formatting.php:97 +msgctxt "opening curly single quote" +msgid "‘" +msgstr "‘" + +#. translators: Closing curly single quote. +#: wp-includes/formatting.php:99 +msgctxt "closing curly single quote" +msgid "’" +msgstr "’" + +#. translators: $thousands_sep argument for https://www.php.net/number_format, +#. default is ',' +#: wp-includes/class-wp-locale.php:200 +msgid "number_format_thousands_sep" +msgstr "," + +#. translators: $dec_point argument for https://www.php.net/number_format, +#. default is '.' +#: wp-includes/class-wp-locale.php:208 +msgid "number_format_decimal_point" +msgstr "." + +#: wp-includes/category-template.php:161 +#: wp-includes/js/dist/block-editor.js:27452 +#: wp-includes/js/dist/block-editor.js:27457 +#: wp-includes/js/dist/block-editor.js:27763 +#: wp-includes/js/dist/edit-post.js:5050 wp-admin/includes/upgrade.php:158 +msgid "Uncategorized" +msgstr "Uncategorised" + +#: wp-includes/block-patterns/large-header-button.php:10 +msgid "Thou hast seen
nothing yet" +msgstr "Thou hast seen
nothing yet" + +#: wp-includes/class-wp-feed-cache.php:15 +msgid "This file is only loaded for backward compatibility with SimplePie 1.2.x. Please consider switching to a recent SimplePie version." +msgstr "This file is only loaded for backward compatibility with SimplePie 1.2.x. Please consider switching to a recent SimplePie version." + +#: wp-includes/media.php:4296 +msgid "← Go to library" +msgstr "← Go to library" + +#: wp-includes/taxonomy.php:607 +msgid "← Go to Tags" +msgstr "← Go to Tags" + +#: wp-includes/js/dist/edit-post.js:5395 wp-admin/menu.php:188 +msgid "Appearance" +msgstr "Appearance" + +#. translators: New site notification email subject. %s: Network title. +#: wp-includes/ms-functions.php:1748 +msgid "[%s] New Site Created" +msgstr "[%s] New Site Created" + +#. translators: New site notification email. 1: User login, 2: Site URL, 3: +#. Site title. +#: wp-includes/ms-functions.php:1754 +msgid "" +"New site created by %1$s\n" +"\n" +"Address: %2$s\n" +"Name: %3$s" +msgstr "" +"New site created by %1$s\n" +"\n" +"Address: %2$s\n" +"Name: %3$s" + +#: wp-includes/ms-functions.php:1767 +msgctxt "email \"From\" field" +msgid "Site Admin" +msgstr "Site Admin" + +#: wp-includes/user.php:4071 +msgid "This user privacy request is missing the confirmation key." +msgstr "This user privacy request is missing the confirmation key." + +#: wp-includes/user.php:4090 +msgid "This user privacy request confirmation key is invalid." +msgstr "This user privacy request confirmation key is invalid." + +#: wp-includes/user.php:4094 +msgid "This user privacy request confirmation key has expired." +msgstr "This user privacy request confirmation key has expired." + +#. translators: %s: PHP function name. +#: wp-includes/class-wp-image-editor-imagick.php:742 +msgid "%s failed while writing image to stream." +msgstr "%s failed while writing image to stream." + +#: wp-includes/post.php:267 +msgid "Add New Reusable Block" +msgstr "Add New Reusable Block" + +#: wp-includes/post.php:268 +msgid "New Reusable Block" +msgstr "New Reusable Block" + +#: wp-includes/post.php:269 +msgid "Edit Reusable Block" +msgstr "Edit Reusable Block" + +#: wp-includes/post.php:270 +msgid "View Reusable Block" +msgstr "View Reusable Block" + +#: wp-includes/post.php:271 +msgid "All Reusable Blocks" +msgstr "All Reusable Blocks" + +#: wp-includes/post.php:272 +msgid "Search Reusable Blocks" +msgstr "Search Reusable Blocks" + +#: wp-includes/post.php:273 +msgid "No reusable blocks found." +msgstr "No reusable blocks found." + +#: wp-includes/post.php:274 +msgid "No reusable blocks found in Trash." +msgstr "No reusable blocks found in Bin." + +#: wp-includes/post.php:275 +msgid "Filter reusable blocks list" +msgstr "Filter reusable blocks list" + +#: wp-includes/post.php:276 +msgid "Reusable Blocks list navigation" +msgstr "Reusable Blocks list navigation" + +#: wp-includes/post.php:277 +msgid "Reusable Blocks list" +msgstr "Reusable Blocks list" + +#: wp-includes/post.php:278 +msgid "Reusable Block published." +msgstr "Reusable Block published." + +#: wp-includes/post.php:279 +msgid "Reusable Block published privately." +msgstr "Reusable Block published privately." + +#: wp-includes/post.php:280 +msgid "Reusable Block reverted to draft." +msgstr "Reusable Block reverted to draft." + +#: wp-includes/post.php:281 +msgid "Reusable Block scheduled." +msgstr "Reusable Block scheduled." + +#: wp-includes/post.php:282 +msgid "Reusable Block updated." +msgstr "Reusable Block updated." + +#: wp-includes/user.php:437 +msgid "The provided password is an invalid application password." +msgstr "The provided password is an invalid application password." + +#: wp-includes/user.php:3875 wp-includes/user.php:4063 +#: wp-admin/includes/privacy-tools.php:23 +#: wp-admin/includes/privacy-tools.php:52 +msgid "Invalid user privacy request." +msgstr "Invalid user privacy request." + +#: wp-includes/user.php:4067 +msgid "This user privacy request has expired." +msgstr "This user privacy request has expired." + +#: wp-includes/post.php:262 +msgctxt "post type general name" +msgid "Reusable Blocks" +msgstr "Reusable Blocks" + +#: wp-includes/post.php:263 +msgctxt "post type singular name" +msgid "Reusable Block" +msgstr "Reusable Block" + +#: wp-includes/post.php:264 +msgctxt "admin menu" +msgid "Reusable Blocks" +msgstr "Reusable Blocks" + +#: wp-includes/post.php:265 +msgctxt "add new on admin bar" +msgid "Reusable Block" +msgstr "Reusable Block" + +#: wp-includes/post.php:266 +msgctxt "Reusable Block" +msgid "Add New" +msgstr "Add New" + +#: wp-includes/media-template.php:463 wp-includes/media-template.php:681 +msgid "Used as:" +msgstr "Used as:" + +#: wp-includes/media-template.php:513 wp-includes/media-template.php:742 +#: wp-admin/includes/media.php:3332 +msgid "Copy URL to clipboard" +msgstr "Copy URL to clipboard" + +#: wp-includes/class-wp-application-passwords.php:69 +msgid "An application name is required to create an application password." +msgstr "An application name is required to create an application password." + +#: wp-includes/class-wp-application-passwords.php:90 +#: wp-includes/class-wp-application-passwords.php:194 +#: wp-includes/class-wp-application-passwords.php:243 +msgid "Could not save application password." +msgstr "Could not save application password." + +#: wp-includes/class-wp-application-passwords.php:212 +#: wp-includes/class-wp-application-passwords.php:250 +#: wp-includes/class-wp-application-passwords.php:288 +msgid "Could not find an application password with that id." +msgstr "Could not find an application password with that ID." + +#: wp-includes/class-wp-application-passwords.php:271 +msgid "Could not delete application password." +msgstr "Could not delete application password." + +#: wp-includes/class-wp-application-passwords.php:306 +msgid "Could not delete application passwords." +msgstr "Could not delete application passwords." + +#. translators: 1: Parameter, 2: Schema title, 3: Reason. +#: wp-includes/rest-api.php:1686 +msgid "%1$s is not a valid %2$s. Reason: %3$s" +msgstr "%1$s is not a valid %2$s. Reason: %3$s" + +#. translators: 1: Parameter, 2: Reason. +#: wp-includes/rest-api.php:1694 +msgid "%1$s does not match the expected format. Reason: %2$s" +msgstr "%1$s does not match the expected format. Reason: %2$s" + +#. translators: 1: Parameter, 2: Schema titles. +#: wp-includes/rest-api.php:1761 +msgid "%1$s is not a valid %2$l." +msgstr "%1$s is not a valid %2$l." + +#. translators: 1: Parameter. +#: wp-includes/rest-api.php:1765 +msgid "%1$s does not match any of the expected formats." +msgstr "%1$s does not match any of the expected formats." + +#. translators: 1: Parameter, 2: Schema titles. +#: wp-includes/rest-api.php:1861 +msgid "%1$s matches %2$l, but should match only one." +msgstr "%1$s matches %2$l, but should match only one." + +#. translators: 1: Parameter. +#: wp-includes/rest-api.php:1869 +msgid "%1$s matches more than one of the expected formats." +msgstr "%1$s matches more than one of the expected formats." + +#. translators: 1: Parameter, 2: Multiplier. +#: wp-includes/rest-api.php:2175 +msgid "%1$s must be a multiple of %2$s." +msgstr "%1$s must be a multiple of %2$s." + +#. translators: 1: Parameter, 2: Number. +#: wp-includes/rest-api.php:2115 +msgid "%1$s must contain at least %2$s property." +msgid_plural "%1$s must contain at least %2$s properties." +msgstr[0] "%1$s must contain at least %2$s property." +msgstr[1] "%1$s must contain at least %2$s properties." + +#. translators: 1: Parameter, 2: Number. +#: wp-includes/rest-api.php:2131 +msgid "%1$s must contain at most %2$s property." +msgid_plural "%1$s must contain at most %2$s properties." +msgstr[0] "%1$s must contain at most %2$s property." +msgstr[1] "%1$s must contain at most %2$s properties." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:630 +msgid "The name of the application password." +msgstr "The name of the application password." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:636 +msgid "The generated password. Only available after adding an application." +msgstr "The generated password. Only available after adding an application." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:642 +msgid "The GMT date the application password was created." +msgstr "The GMT date the application password was created." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:649 +msgid "The GMT date the application password was last used." +msgstr "The GMT date the application password was last used." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:656 +msgid "The IP address the application password was last used by." +msgstr "The IP address the application password was last used by." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:624 +msgid "A uuid provided by the application to uniquely identify it. It is recommended to use an UUID v5 with the URL or DNS namespace." +msgstr "A UUID provided by the application to uniquely identify it. It is recommended to use an UUID v5 with the URL or DNS namespace." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:259 +msgid "Directory sizes could not be returned." +msgstr "Directory sizes could not be returned." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:300 +msgid "The name of the test being run." +msgstr "The name of the test being run." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:305 +msgid "A label describing the test." +msgstr "A label describing the test." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:310 +msgid "The status of the test." +msgstr "The status of the test." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:316 +msgid "The category this test is grouped in." +msgstr "The category this test is grouped in." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:332 +msgid "A more descriptive explanation of what the test looks for, and why it is important for the user." +msgstr "A more descriptive explanation of what the test looks for, and why it is important for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-site-health-controller.php:337 +msgid "HTML containing an action to direct the user to where they can resolve the issue." +msgstr "HTML containing an action to direct the user to where they can resolve the issue." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:394 +msgid "Sorry, you are not allowed to manage application passwords for this user." +msgstr "Sorry, you are not allowed to manage application passwords for this user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:578 +msgid "Application password not found." +msgstr "Application password not found." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:617 +msgid "The unique identifier for the application password." +msgstr "The unique identifier for the application password." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:506 +#: wp-includes/user.php:360 wp-admin/authorize-application.php:107 +msgid "Application passwords are not available." +msgstr "Application passwords are not available." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:550 +#: wp-includes/user.php:365 wp-admin/authorize-application.php:105 +msgid "Application passwords are not available for your account. Please contact the site administrator for assistance." +msgstr "Application passwords are not available for your account. Please contact the site administrator for assistance." + +#: wp-includes/rest-api/class-wp-rest-server.php:1462 +msgid "Could not parse the path." +msgstr "Could not parse the path." + +#: wp-includes/rest-api/class-wp-rest-server.php:1512 +msgid "The requested route does not support batch requests." +msgstr "The requested route does not support batch requests." + +#. translators: %s: IP address of password reset requester. +#: wp-login.php:443 +msgid "This password reset request originated from the IP address %s." +msgstr "This password reset request originated from the IP address %s." + +#: wp-includes/theme.php:2528 +msgid "You need to pass an array of post formats." +msgstr "You need to pass an array of post formats." + +#: wp-includes/rest-api/class-wp-rest-server.php:990 +msgid "The handler for the route is invalid." +msgstr "The handler for the route is invalid." + +#: wp-includes/rest-api/class-wp-rest-request.php:937 +msgid "Invalid parameters." +msgstr "Invalid parameters." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:370 +msgid "Version of block API." +msgstr "Version of block API." + +#: wp-includes/class-wp-xmlrpc-server.php:3884 +#: wp-includes/class-wp-xmlrpc-server.php:3891 +msgid "Sorry, you are not allowed to comment on this post." +msgstr "Sorry, you are not allowed to comment on this post." + +#. translators: %s: WP_ENVIRONMENT_TYPES +#: wp-includes/load.php:209 +msgid "The %s constant is no longer supported." +msgstr "The %s constant is no longer supported." + +#: wp-includes/block-patterns/large-header-button.php:10 +msgid "Read now" +msgstr "Read now" + +#: wp-includes/block-patterns/text-three-columns-buttons.php:11 +msgid "Chapter One" +msgstr "Chapter One" + +#: wp-includes/block-patterns/text-three-columns-buttons.php:11 +msgid "Chapter Two" +msgstr "Chapter Two" + +#: wp-includes/block-patterns/text-three-columns-buttons.php:11 +msgid "Chapter Three" +msgstr "Chapter Three" + +#: wp-includes/block-patterns/quote.php:10 +msgid "Pencil drawing of Don Quixote" +msgstr "Pencil drawing of Don Quixote" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:116 +#: wp-admin/includes/theme.php:848 wp-admin/includes/update.php:717 +#: wp-admin/themes.php:406 wp-admin/themes.php:745 wp-admin/themes.php:1008 +msgid "There is a new version of %s available, but it doesn’t work with your versions of WordPress and PHP." +msgstr "There is a new version of %s available, but it doesn’t work with your versions of WordPress and PHP." + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:146 +#: wp-admin/includes/theme.php:878 wp-admin/includes/update.php:745 +#: wp-admin/themes.php:434 wp-admin/themes.php:775 wp-admin/themes.php:1038 +msgid "There is a new version of %s available, but it doesn’t work with your version of WordPress." +msgstr "There is a new version of %s available, but it doesn’t work with your version of WordPress." + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:161 +#: wp-admin/includes/theme.php:893 wp-admin/includes/update.php:758 +#: wp-admin/themes.php:447 wp-admin/themes.php:790 wp-admin/themes.php:1053 +msgid "There is a new version of %s available, but it doesn’t work with your version of PHP." +msgstr "There is a new version of %s available, but it doesn’t work with your version of PHP." + +#: wp-includes/block-patterns/quote.php:10 +msgid "\"Do you see over yonder, friend Sancho, thirty or forty hulking giants? I intend to do battle with them and slay them.\"" +msgstr "\"Do you see over yonder, friend Sancho, thirty or forty hulking giants? I intend to do battle with them and slay them.\"" + +#: wp-includes/block-patterns/quote.php:13 +msgctxt "Block pattern description" +msgid "A quote and citation with an image above, and a separator at the bottom." +msgstr "A quote and citation with an image above, and a separator at the bottom." + +#: wp-includes/block-patterns/text-three-columns-buttons.php:11 +msgid "Which treats of the character and pursuits of the famous Don Quixote of La Mancha." +msgstr "Which treats of the character and pursuits of the famous Don Quixote of La Mancha." + +#: wp-includes/block-patterns/text-three-columns-buttons.php:11 +msgid "Which treats of the first sally the ingenious Don Quixote made from home." +msgstr "Which treats of the first sally the ingenious Don Quixote made from home." + +#: wp-includes/block-patterns/text-three-columns-buttons.php:11 +msgid "Wherein is related the droll way in which Don Quixote had himself dubbed a knight." +msgstr "Wherein is related the droll way in which Don Quixote had himself dubbed a knight." + +#: wp-includes/block-patterns/text-three-columns-buttons.php:13 +msgctxt "Block pattern description" +msgid "Three small columns of text, each with an outlined button with rounded corners at the bottom." +msgstr "Three small columns of text, each with an outlined button with rounded corners at the bottom." + +#: wp-includes/block-patterns/heading-paragraph.php:10 +msgid "These preliminaries settled, he did not care to put off any longer the execution of his design, urged on to it by the thought of all the world was losing by his delay, seeing what wrongs he intended to right, grievances to redress, injustices to repair, abuses to remove, and duties to discharge." +msgstr "These preliminaries settled, he did not care to put off any longer the execution of his design, urged on to it by the thought of all the world was losing by his delay, seeing what wrongs he intended to right, grievances to redress, injustices to repair, abuses to remove, and duties to discharge." + +#: wp-includes/block-patterns/heading-paragraph.php:13 +msgctxt "Block pattern description" +msgid "A heading preceded by a chapter number, and followed by a paragraph." +msgstr "A heading preceded by a chapter number, and followed by a paragraph." + +#: wp-includes/block-patterns/three-buttons.php:10 +msgid "Books" +msgstr "Books" + +#: wp-includes/block-patterns/three-buttons.php:13 +msgctxt "Block pattern description" +msgid "Three filled buttons with rounded corners, side by side." +msgstr "Three filled buttons with rounded corners, side by side." + +#: wp-includes/block-patterns/heading-paragraph.php:10 +msgid "Which treats of the first sally the ingenious Don Quixote made from home" +msgstr "Which treats of the first sally the ingenious Don Quixote made from home" + +#: wp-includes/block-patterns/text-two-columns-with-images.php:11 +msgid "But of all there were none he liked so well as those of the famous Feliciano de Silva's composition, for their lucidity of style and complicated conceits were as pearls in his sight, particularly when in his reading he came upon courtships and cartels, where he often found passages like \"the reason of the unreason with which my reason is afflicted so weakens my reason that with reason I murmur at your beauty;\" or again, \"the high heavens render you deserving of the desert your greatness deserves.\"" +msgstr "But of all there were none he liked so well as those of the famous Feliciano de Silva's composition, for their lucidity of style and complicated conceits were as pearls in his sight, particularly when in his reading he came upon courtships and cartels, where he often found passages like \"the reason of the unreason with which my reason is afflicted so weakens my reason that with reason I murmur at your beauty;\" or again, \"the high heavens render you deserving of the desert your greatness deserves.\"" + +#: wp-includes/block-patterns/text-two-columns-with-images.php:12 +msgctxt "Block pattern description" +msgid "Two columns of text, each with an image on top." +msgstr "Two columns of text, each with an image on top." + +#: wp-includes/block-patterns/heading-paragraph.php:9 +msgid "Heading and paragraph" +msgstr "Heading and paragraph" + +#: wp-includes/block-patterns/text-two-columns-with-images.php:11 +msgid "They must know, then, that the above-named gentleman whenever he was at leisure (which was mostly all the year round) gave himself up to reading books of chivalry with such ardour and avidity that he almost entirely neglected the pursuit of his field-sports, and even the management of his property; and to such a pitch did his eagerness and infatuation go that he sold many an acre of tillageland to buy books of chivalry to read, and brought home as many of them as he could get." +msgstr "They must know, then, that the above-named gentleman, whenever he was at leisure, (which was mostly all the year round), gave himself up to reading books of chivalry with such ardour and avidity that he almost entirely neglected the pursuit of his field sports, and even the management of his property; and to such a pitch did his eagerness and infatuation go, that he sold many an acre of tillage land to buy books of chivalry to read, and brought home as many of them as he could get." + +#: wp-includes/block-patterns/text-two-columns.php:12 +msgctxt "Block pattern description" +msgid "Two columns of text preceded by a long heading." +msgstr "Two columns of text preceded by a long heading." + +#: wp-includes/block-patterns/text-two-columns.php:11 +msgid "The rest of it went in a doublet of fine cloth and velvet breeches and shoes to match for holidays, while on week-days he made a brave figure in his best homespun. He had in his house a housekeeper past forty, a niece under twenty, and a lad for the field and market-place, who used to saddle the hack as well as handle the bill-hook. The age of this gentleman of ours was bordering on fifty; he was of a hardy habit, spare, gaunt-featured, a very early riser and a great sportsman." +msgstr "The rest of it went in a doublet of fine cloth and velvet breeches and shoes to match for holidays, while on week-days he made a brave figure in his best homespun. He had in his house a housekeeper past forty, a niece under twenty, and a lad for the field and market-place, who used to saddle the hack as well as handle the bill-hook. The age of this gentleman of ours was bordering on fifty; he was of a hardy habit, spare, gaunt-featured, a very early riser and a great sportsman." + +#: wp-includes/block-patterns/text-two-columns.php:11 +msgid "In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing. An olla of rather more beef than mutton, a salad on most nights, scraps on Saturdays, lentils on Fridays, and a pigeon or so extra on Sundays, made away with three-quarters of his income." +msgstr "In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing. An olla of rather more beef than mutton, a salad on most nights, scraps on Saturdays, lentils on Fridays, and a pigeon or so extra on Sundays, made away with three-quarters of his income." + +#: wp-includes/block-patterns/large-header-button.php:9 +msgid "Large header with a heading and a button " +msgstr "Large header with a heading and a button " + +#: wp-includes/block-patterns/large-header-button.php:13 +msgctxt "Block pattern description" +msgid "A large hero section with a bright gradient background, a big heading and a filled button." +msgstr "A large hero section with a bright gradient background, a big heading, and a filled button." + +#: wp-includes/block-patterns/two-images.php:11 +msgctxt "Block pattern description" +msgid "An image gallery with two example images." +msgstr "An image gallery with two example images." + +#: wp-includes/block-patterns/two-images.php:12 +msgid "An old pencil drawing of Don Quixote and Sancho Panza sitting on their horses, by Wilhelm Marstrand." +msgstr "An old pencil drawing of Don Quixote and Sancho Panza sitting on their horses, by Wilhelm Marstrand." + +#: wp-includes/block-patterns/two-buttons.php:10 +msgid "Download now" +msgstr "Download now" + +#: wp-includes/block-patterns/two-buttons.php:10 +#: wp-includes/block-patterns/three-buttons.php:10 +msgid "About Cervantes" +msgstr "About Cervantes" + +#: wp-includes/block-patterns/two-buttons.php:13 +msgctxt "Block pattern description" +msgid "Two buttons, one filled and one outlined, side by side." +msgstr "Two buttons, one filled and one outlined, side by side." + +#: wp-includes/block-patterns/large-header.php:9 +msgid "Large header with a heading" +msgstr "Large header with a heading" + +#: wp-includes/block-patterns/large-header.php:10 +msgid "Don Quixote" +msgstr "Don Quixote" + +#: wp-includes/block-patterns/large-header.php:13 +msgctxt "Block pattern description" +msgid "A large hero section with an example background image and a heading in the center." +msgstr "A large hero section with an example background image and a heading in the centre." + +#: wp-includes/block-patterns/text-two-columns.php:11 +msgid "Which treats of the character and pursuits of the famous gentleman Don Quixote of La Mancha" +msgstr "Which treats of the character and pursuits of the famous gentleman Don Quixote of La Mancha" + +#: wp-includes/customize/class-wp-customize-theme-control.php:183 +#: wp-admin/includes/theme.php:927 wp-admin/themes.php:468 +#: wp-admin/themes.php:811 wp-admin/themes.php:943 +#: wp-admin/theme-install.php:283 wp-admin/theme-install.php:469 +msgid "This theme doesn’t work with your versions of WordPress and PHP." +msgstr "This theme doesn’t work with your versions of WordPress and PHP." + +#. translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. +#: wp-includes/customize/class-wp-customize-theme-control.php:122 +#: wp-includes/customize/class-wp-customize-theme-control.php:187 +#: wp-admin/includes/theme.php:854 wp-admin/includes/theme.php:931 +#: wp-admin/includes/update.php:723 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:658 +#: wp-admin/update-core.php:641 wp-admin/themes.php:412 wp-admin/themes.php:472 +#: wp-admin/themes.php:751 wp-admin/themes.php:815 wp-admin/themes.php:947 +#: wp-admin/themes.php:1014 wp-admin/theme-install.php:287 +#: wp-admin/theme-install.php:473 +msgid "
Please update WordPress, and then learn more about updating PHP." +msgstr "Please update WordPress, and then learn more about updating PHP." + +#. translators: %s: URL to WordPress Updates screen. +#: wp-includes/customize/class-wp-customize-theme-control.php:130 +#: wp-includes/customize/class-wp-customize-theme-control.php:152 +#: wp-includes/customize/class-wp-customize-theme-control.php:195 +#: wp-includes/customize/class-wp-customize-theme-control.php:213 +#: wp-admin/includes/theme.php:862 wp-admin/includes/theme.php:884 +#: wp-admin/includes/theme.php:939 wp-admin/includes/theme.php:957 +#: wp-admin/includes/update.php:731 wp-admin/includes/update.php:751 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:666 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:682 +#: wp-admin/update-core.php:654 wp-admin/update-core.php:675 +#: wp-admin/themes.php:420 wp-admin/themes.php:440 wp-admin/themes.php:480 +#: wp-admin/themes.php:496 wp-admin/themes.php:759 wp-admin/themes.php:781 +#: wp-admin/themes.php:823 wp-admin/themes.php:841 wp-admin/themes.php:955 +#: wp-admin/themes.php:973 wp-admin/themes.php:1022 wp-admin/themes.php:1044 +#: wp-admin/theme-install.php:295 wp-admin/theme-install.php:313 +#: wp-admin/theme-install.php:481 wp-admin/theme-install.php:499 +msgid "Please update WordPress." +msgstr "Please update WordPress." + +#: wp-includes/customize/class-wp-customize-theme-control.php:209 +#: wp-admin/includes/theme.php:953 wp-admin/themes.php:492 +#: wp-admin/themes.php:837 wp-admin/themes.php:969 +#: wp-admin/theme-install.php:309 wp-admin/theme-install.php:495 +msgid "This theme doesn’t work with your version of WordPress." +msgstr "This theme doesn’t work with your version of WordPress." + +#: wp-includes/customize/class-wp-customize-theme-control.php:220 +#: wp-admin/includes/theme.php:964 wp-admin/themes.php:501 +#: wp-admin/themes.php:848 wp-admin/themes.php:980 +#: wp-admin/theme-install.php:320 wp-admin/theme-install.php:506 +msgid "This theme doesn’t work with your version of PHP." +msgstr "This theme doesn’t work with your version of PHP." + +#. translators: %s: URL to Update PHP page. +#: wp-includes/customize/class-wp-customize-theme-control.php:136 +#: wp-includes/customize/class-wp-customize-theme-control.php:167 +#: wp-includes/customize/class-wp-customize-theme-control.php:201 +#: wp-includes/customize/class-wp-customize-theme-control.php:224 +#: wp-admin/includes/theme.php:868 wp-admin/includes/theme.php:899 +#: wp-admin/includes/theme.php:945 wp-admin/includes/theme.php:968 +#: wp-admin/includes/update.php:737 wp-admin/includes/update.php:764 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:672 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:691 +#: wp-admin/includes/update-core.php:972 wp-admin/includes/plugin.php:1157 +#: wp-admin/install.php:244 wp-admin/update-core.php:88 +#: wp-admin/update-core.php:504 wp-admin/update-core.php:660 +#: wp-admin/update-core.php:684 wp-admin/themes.php:426 wp-admin/themes.php:453 +#: wp-admin/themes.php:486 wp-admin/themes.php:505 wp-admin/themes.php:765 +#: wp-admin/themes.php:796 wp-admin/themes.php:829 wp-admin/themes.php:852 +#: wp-admin/themes.php:961 wp-admin/themes.php:984 wp-admin/themes.php:1028 +#: wp-admin/themes.php:1059 wp-admin/upgrade.php:86 +#: wp-admin/theme-install.php:301 wp-admin/theme-install.php:324 +#: wp-admin/theme-install.php:487 wp-admin/theme-install.php:510 +msgid "Learn more about updating PHP." +msgstr "Learn more about updating PHP." + +#. translators: %s: prepare_callback +#: wp-includes/theme.php:3141 +msgid "The \"%s\" must be a callable function." +msgstr "The \"%s\" must be a callable function." + +#. translators: %s: register_rest_field +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2474 +msgid "Please use %s to add new schema properties." +msgstr "Please use %s to add new schema properties." + +#. translators: %s: customize_messenger_channel +#: wp-includes/class-wp-customize-manager.php:1916 +msgid "Unauthorized. You may remove the %s param to preview as frontend." +msgstr "Unauthorised. You may remove the %s param to preview as front end." + +#. translators: 1: Deprecated option key, 2: New option key. +#: wp-includes/option.php:54 wp-includes/option.php:355 +#: wp-includes/option.php:542 +msgid "The \"%1$s\" option key has been renamed to \"%2$s\"." +msgstr "The \"%1$s\" option key has been renamed to \"%2$s\"." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:672 +msgid "Sorry, you are not allowed to manage network plugins." +msgstr "Sorry, you are not allowed to manage network plugins." + +#. translators: 1: The REST API route being registered, 2: The argument name, +#. 3: The suggested function name. +#: wp-includes/rest-api.php:98 +msgid "The REST API route definition for %1$s is missing the required %2$s argument. For REST API routes that are intended to be public, use %3$s as the permission callback." +msgstr "The REST API route definition for %1$s is missing the required %2$s argument. For REST API routes that are intended to be public, use %3$s as the permission callback." + +#. translators: %s: the author. +#. translators: byline. %s: current author. +#: wp-includes/blocks/rss.php:60 wp-includes/blocks/latest-posts.php:114 +#: wp-includes/js/dist/block-library.js:18422 +msgid "by %s" +msgstr "by %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:680 +#: wp-admin/plugins.php:48 wp-admin/plugins.php:175 +msgid "Sorry, you are not allowed to activate this plugin." +msgstr "Sorry, you are not allowed to activate this plugin." + +#: wp-includes/post.php:4040 +msgid "Could not update attachment in the database." +msgstr "Could not update attachment in the database." + +#: wp-includes/js/dist/core-data.js:2149 wp-admin/includes/template.php:459 +#: wp-admin/edit-form-comment.php:72 +msgid "Comment" +msgstr "Comment" + +#: wp-includes/js/dist/core-data.js:2161 +#: wp-admin/includes/ajax-actions.php:1507 +msgid "Menu Item" +msgstr "Menu Item" + +#: wp-includes/js/dist/block-library.js:5522 +#: wp-admin/includes/image-edit.php:54 +msgid "Crop" +msgstr "Crop" + +#: wp-includes/class-wp-oembed-controller.php:213 +msgid "Embed Handler" +msgstr "Embed Handler" + +#. translators: %s: Documentation URL. +#: wp-includes/ms-load.php:495 +msgid "Read the Debugging a WordPress Network article. Some of the suggestions there may help you figure out what went wrong." +msgstr "Read the Debugging a WordPress Network article. Some of the suggestions there may help you figure out what went wrong." + +#: wp-includes/block-patterns.php:46 +msgctxt "Block pattern category" +msgid "Text" +msgstr "Text" + +#: wp-includes/block-patterns.php:43 +msgctxt "Block pattern category" +msgid "Columns" +msgstr "Columns" + +#: wp-includes/block-patterns.php:42 +msgctxt "Block pattern category" +msgid "Buttons" +msgstr "Buttons" + +#: wp-includes/block-patterns.php:44 +msgctxt "Block pattern category" +msgid "Gallery" +msgstr "Gallery" + +#: wp-includes/block-patterns.php:45 +msgctxt "Block pattern category" +msgid "Headers" +msgstr "Headers" + +#: wp-includes/class-wp-block-pattern-categories-registry.php:41 +msgid "Block pattern category name must be a string." +msgstr "Block pattern category name must be a string." + +#. translators: 1: Block pattern name. +#: wp-includes/class-wp-block-pattern-categories-registry.php:64 +msgid "Block pattern category \"%1$s\" not found." +msgstr "Block pattern category \"%1$s\" not found." + +#. translators: Unit symbol for terabyte. +#: wp-includes/functions.php:453 +msgctxt "unit symbol" +msgid "TB" +msgstr "TB" + +#. translators: Unit symbol for gigabyte. +#: wp-includes/functions.php:455 +msgctxt "unit symbol" +msgid "GB" +msgstr "GB" + +#. translators: Unit symbol for megabyte. +#: wp-includes/functions.php:457 +msgctxt "unit symbol" +msgid "MB" +msgstr "MB" + +#. translators: Unit symbol for kilobyte. +#: wp-includes/functions.php:459 +msgctxt "unit symbol" +msgid "KB" +msgstr "KB" + +#. translators: Unit symbol for byte. +#: wp-includes/functions.php:461 wp-includes/functions.php:466 +msgctxt "unit symbol" +msgid "B" +msgstr "B" + +#. translators: 1: WP_REST_Response, 2: WP_Error +#: wp-includes/functions.php:4101 +msgid "Return a %1$s or %2$s object from your callback when using the REST API." +msgstr "Return a %1$s or %2$s object from your callback when using the REST API." + +#: wp-includes/class-wp-block-patterns-registry.php:44 +msgid "Pattern name must be a string." +msgstr "Pattern name must be a string." + +#. translators: 1: Pattern name. +#: wp-includes/class-wp-block-patterns-registry.php:77 +msgid "Pattern \"%1$s\" not found." +msgstr "Pattern \"%1$s\" not found." + +#. translators: %1: field name. %2: block name +#: wp-includes/blocks.php:115 +msgid "The asset file for the \"%1$s\" defined in \"%2$s\" block definition is missing." +msgstr "The asset file for the \"%1$s\" defined in the \"%2$s\" block definition is missing." + +#: wp-includes/class-wp-block-patterns-registry.php:49 +msgid "Pattern title must be a string." +msgstr "Pattern title must be a string." + +#: wp-includes/class-wp-block-patterns-registry.php:54 +msgid "Pattern content must be a string." +msgstr "Pattern content must be a string." + +#: wp-includes/ms-deprecated.php:413 +msgid "Error: There was a problem creating site entry." +msgstr "Error: there was a problem creating site entry." + +#: wp-includes/general-template.php:1663 +msgctxt "category archive title prefix" +msgid "Category:" +msgstr "Category:" + +#: wp-includes/general-template.php:1666 +msgctxt "tag archive title prefix" +msgid "Tag:" +msgstr "Tag:" + +#: wp-includes/general-template.php:1669 +msgctxt "author archive title prefix" +msgid "Author:" +msgstr "Author:" + +#: wp-includes/general-template.php:1672 +msgctxt "date archive title prefix" +msgid "Year:" +msgstr "Year:" + +#: wp-includes/general-template.php:1675 +msgctxt "date archive title prefix" +msgid "Month:" +msgstr "Month:" + +#: wp-includes/general-template.php:1678 +msgctxt "date archive title prefix" +msgid "Day:" +msgstr "Day:" + +#: wp-includes/general-template.php:1701 +msgctxt "post type archive title prefix" +msgid "Archives:" +msgstr "Archives:" + +#. translators: %s: Taxonomy singular name. +#: wp-includes/general-template.php:1709 +msgctxt "taxonomy term archive title prefix" +msgid "%s:" +msgstr "%s:" + +#. translators: 1: Title prefix. 2: Title. +#: wp-includes/general-template.php:1728 +msgctxt "archive title" +msgid "%1$s %2$s" +msgstr "%1$s %2$s" + +#: wp-includes/ms-deprecated.php:404 +msgid "Error: Site URL you’ve entered is already taken." +msgstr "Error: site URL you’ve entered is already taken." + +#: wp-includes/general-template.php:4444 +msgctxt "admin color scheme" +msgid "Modern" +msgstr "Modern" + +#: wp-includes/media.php:4324 +msgid "Attachment details" +msgstr "Attachment details" + +#: wp-includes/media.php:4270 wp-includes/media.php:4292 +msgid "Add media" +msgstr "Add media" + +#: wp-includes/comment.php:2528 +msgid "Could not update comment in the database." +msgstr "Could not update comment in the database." + +#: wp-includes/post.php:4063 +msgid "Could not insert attachment into the database." +msgstr "Could not insert attachment into the database." + +#. translators: %s: Name of the script or stylesheet. +#: wp-includes/functions.wp-scripts.php:59 +msgid "This notice was triggered by the %s handle." +msgstr "This notice was triggered by the %s handle." + +#. translators: Developer debugging message. 1: PHP function name, 2: +#. Explanatory message. +#. translators: 1: Theme name. 2: Theme slug. +#: wp-includes/rest-api.php:652 wp-admin/includes/class-wp-debug-data.php:1053 +#: wp-admin/includes/class-wp-debug-data.php:1072 +#: wp-admin/includes/class-wp-debug-data.php:1167 +#: wp-admin/includes/class-wp-debug-data.php:1328 +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#. translators: 1: Parameter, 2: List of allowed types. +#: wp-includes/rest-api.php:1555 +msgid "The \"type\" schema keyword for %1$s can only contain the built-in types: %2$l." +msgstr "The \"type\" schema keyword for %1$s can only contain the built-in types: %2$l." + +#: wp-includes/rest-api.php:1617 +msgid "Cannot stabilize objects. Convert the object to an array first." +msgstr "Cannot stabilise objects. Convert the object to an array first." + +#. translators: %s: Parameter. +#: wp-includes/rest-api.php:1963 wp-includes/rest-api.php:2363 +msgid "The \"type\" schema keyword for %s is required." +msgstr "The \"type\" schema keyword for %s is required." + +#. translators: 1: Parameter, 2: The list of allowed types. +#: wp-includes/rest-api.php:1985 wp-includes/rest-api.php:2380 +msgid "The \"type\" schema keyword for %1$s can only be one of the built-in types: %2$l." +msgstr "The \"type\" schema keyword for %1$s can only be one of the built-in types: %2$l." + +#. translators: 1: Parameter. +#: wp-includes/rest-api.php:2045 wp-includes/rest-api.php:2396 +msgid "%1$s has duplicate items." +msgstr "%1$s has duplicate items." + +#. translators: 1: Property of an object, 2: Parameter. +#: wp-includes/rest-api.php:2065 wp-includes/rest-api.php:2072 +msgid "%1$s is a required property of %2$s." +msgstr "%1$s is a required property of %2$s." + +#. translators: 1: Parameter, 2: Number of characters. +#: wp-includes/rest-api.php:2212 +msgid "%1$s must be at least %2$s character long." +msgid_plural "%1$s must be at least %2$s characters long." +msgstr[0] "%1$s must be at least %2$s character long." +msgstr[1] "%1$s must be at least %2$s characters long." + +#. translators: 1: Parameter, 2: Number of characters. +#: wp-includes/rest-api.php:2224 +msgid "%1$s must be at most %2$s character long." +msgid_plural "%1$s must be at most %2$s characters long." +msgstr[0] "%1$s must be at most %2$s character long." +msgstr[1] "%1$s must be at most %2$s characters long." + +#. translators: 1: Parameter, 2: Pattern. +#: wp-includes/rest-api.php:2233 +msgid "%1$s does not match pattern %2$s." +msgstr "%1$s does not match pattern %2$s." + +#: wp-includes/rest-api.php:2245 +msgid "Invalid hex color." +msgstr "Invalid hex colour." + +#. translators: %s: The name of a JSON field expecting a valid UUID. +#: wp-includes/rest-api.php:2269 +msgid "%s is not a valid UUID." +msgstr "%s is not a valid UUID." + +#: wp-includes/media-template.php:510 wp-includes/media-template.php:739 +#: wp-admin/includes/media.php:3329 +msgid "File URL:" +msgstr "File URL:" + +#. translators: 1: Parameter, 2: Number. +#: wp-includes/rest-api.php:2016 +msgid "%1$s must contain at least %2$s item." +msgid_plural "%1$s must contain at least %2$s items." +msgstr[0] "%1$s must contain at least %2$s item." +msgstr[1] "%1$s must contain at least %2$s items." + +#. translators: 1: Parameter, 2: Number. +#: wp-includes/rest-api.php:2032 +msgid "%1$s must contain at most %2$s item." +msgid_plural "%1$s must contain at most %2$s items." +msgstr[0] "%1$s must contain at most %2$s item." +msgstr[1] "%1$s must contain at most %2$s items." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:272 +msgid "The block icon." +msgstr "The block icon." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:278 +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:284 +msgid "The date when the block was last updated, in fuzzy human readable format." +msgstr "The date when the block was last updated, in fuzzy human readable format." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:307 +msgid "Limit result set to blocks matching the search term." +msgstr "Limit result set to blocks matching the search term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:436 +msgid "Unable to get meta information for file." +msgstr "Unable to get meta information for file." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:446 +msgid "This type of file cannot be edited." +msgstr "This type of file cannot be edited." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:467 +msgid "The image was not edited. Edit the image before applying the changes." +msgstr "The image was not edited. Edit the image before applying the changes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:487 +msgid "Unable to edit this image." +msgstr "Unable to edit this image." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:498 +msgid "Unable to rotate this image." +msgstr "Unable to rotate this image." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:517 +msgid "Unable to crop this image." +msgstr "Unable to crop this image." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1316 +msgid "As a percentage of the image, the height to crop the image to." +msgstr "As a percentage of the image, the height to crop the image to." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1322 +msgid "URL to the edited image file." +msgstr "URL to the edited image file." + +#: wp-includes/comment.php:1344 wp-admin/options.php:215 +msgid "Please consider writing more inclusive code." +msgstr "Please consider writing more inclusive code." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1290 +msgid "The amount to rotate the image clockwise in degrees." +msgstr "The amount to rotate the image clockwise in degrees." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1298 +msgid "As a percentage of the image, the x position to start the crop from." +msgstr "As a percentage of the image, the x position to start the crop from." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1304 +msgid "As a percentage of the image, the y position to start the crop from." +msgstr "As a percentage of the image, the y position to start the crop from." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1310 +msgid "As a percentage of the image, the width to crop the image to." +msgstr "As a percentage of the image, the width to crop the image to." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:59 +msgid "Sorry, you are not allowed to browse the block directory." +msgstr "Sorry, you are not allowed to browse the block directory." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:222 +msgid "The block name, in namespace/block-name format." +msgstr "The block name, in namespace/block-name format." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:227 +msgid "The block title, in human readable format." +msgstr "The block title, in human readable format." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:232 +msgid "A short description of the block, in human readable format." +msgstr "A short description of the block, in human readable format." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:237 +msgid "The block slug." +msgstr "The block slug." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:242 +msgid "The star rating of the block." +msgstr "The star rating of the block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:247 +msgid "The number of ratings." +msgstr "The number of ratings." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:252 +msgid "The number sites that have activated this block." +msgstr "The number of sites that have activated this block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:257 +msgid "The average rating of blocks published by the same author." +msgstr "The average rating of blocks published by the same author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:262 +msgid "The number of blocks published by the same author." +msgstr "The number of blocks published by the same author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php:267 +msgid "The WordPress.org username of the block author." +msgstr "The WordPress.org username of the block author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:941 +msgid "The plugin's text domain." +msgstr "The plugin's text domain." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:965 +msgid "Limits results to plugins with the given status." +msgstr "Limits results to plugins with the given status." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1249 +msgid "This username is invalid because it uses illegal characters. Please enter a valid username." +msgstr "This username is invalid because it uses illegal characters. Please enter a valid username." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:338 +#: wp-admin/includes/ajax-actions.php:4073 +#: wp-admin/includes/ajax-actions.php:4203 +#: wp-admin/includes/ajax-actions.php:4267 +#: wp-admin/includes/ajax-actions.php:4367 +#: wp-admin/includes/ajax-actions.php:4494 +#: wp-admin/includes/ajax-actions.php:4563 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Unable to connect to the file system. Please confirm your credentials." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:55 +msgid "WordPress.org plugin directory slug." +msgstr "WordPress.org plugin directory slug." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:59 +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:869 +msgid "The plugin activation status." +msgstr "The plugin activation status." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:116 +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:166 +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:412 +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:482 +#: wp-admin/includes/ajax-actions.php:4615 +#: wp-admin/includes/ajax-actions.php:4667 wp-admin/plugins.php:13 +msgid "Sorry, you are not allowed to manage plugins for this site." +msgstr "Sorry, you are not allowed to manage plugins for this site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:215 +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:628 +msgid "Plugin not found." +msgstr "Plugin not found." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:245 +#: wp-admin/includes/ajax-actions.php:4320 wp-admin/update.php:106 +#: wp-admin/update.php:149 wp-admin/update.php:181 +#: wp-admin/plugin-install.php:19 +msgid "Sorry, you are not allowed to install plugins on this site." +msgstr "Sorry, you are not allowed to install plugins on this site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:253 +msgid "Sorry, you are not allowed to activate plugins." +msgstr "Sorry, you are not allowed to activate plugins." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:344 +msgid "Unable to determine what plugin was installed." +msgstr "Unable to determine what plugin was installed." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:490 +#: wp-admin/includes/ajax-actions.php:4539 wp-admin/plugins.php:268 +msgid "Sorry, you are not allowed to delete plugins for this site." +msgstr "Sorry, you are not allowed to delete plugins for this site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:525 +msgid "Cannot delete an active plugin. Please deactivate it first." +msgstr "Cannot delete an active plugin. Please deactivate it first." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:688 +#: wp-admin/plugins.php:198 +msgid "Sorry, you are not allowed to deactivate this plugin." +msgstr "Sorry, you are not allowed to deactivate this plugin." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:722 +msgid "Network only plugin must be network activated." +msgstr "A network only plugin must be network activated." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:841 +msgid "The filesystem is currently unavailable for managing plugins." +msgstr "The filesystem is currently unavailable for managing plugins." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:862 +msgid "The plugin file." +msgstr "The plugin file." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:875 +msgid "The plugin name." +msgstr "The plugin name." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:881 +msgid "The plugin's website address." +msgstr "The plugin's website address." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:888 +msgid "The plugin author." +msgstr "The plugin author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:894 +msgid "Plugin author's website address." +msgstr "The plugin author's website address." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:901 +msgid "The plugin description." +msgstr "The plugin description." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:907 +msgid "The raw plugin description." +msgstr "The raw plugin description." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:911 +msgid "The plugin description formatted for display." +msgstr "The plugin description formatted for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:917 +msgid "The plugin version number." +msgstr "The plugin version number." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:923 +msgid "Whether the plugin can only be activated network-wide." +msgstr "Whether the plugin can only be activated network wide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:929 +msgid "Minimum required version of WordPress." +msgstr "Minimum required version of WordPress." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:935 +msgid "Minimum required version of PHP." +msgstr "Minimum required version of PHP." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:315 +msgid "The theme description, transformed for display." +msgstr "The theme description, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:321 +msgid "The name of the theme." +msgstr "The name of the theme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:326 +msgid "The theme name, as found in the theme header." +msgstr "The theme name, as found in the theme header." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:330 +msgid "The theme name, transformed for display." +msgstr "The theme name, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:336 +msgid "The minimum PHP version required for the theme to work." +msgstr "The minimum PHP version required for the theme to work." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:341 +msgid "The minimum WordPress version required for the theme to work." +msgstr "The minimum WordPress version required for the theme to work." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:346 +msgid "The theme's screenshot URL." +msgstr "The theme's screenshot URL." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:352 +msgid "Tags indicating styles and features of the theme." +msgstr "Tags indicating styles and features of the theme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:357 +msgid "The theme tags, as found in the theme header." +msgstr "The theme tags, as found in the theme header." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:364 +msgid "The theme tags, transformed for display." +msgstr "The theme tags, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:269 +msgid "The theme's template. If this is a child theme, this refers to the parent theme, otherwise this is the same as the theme's stylesheet." +msgstr "The theme's template. If this is a child theme, this refers to the parent theme, otherwise this is the same as the theme's style sheet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:274 +msgid "The theme author." +msgstr "The theme author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:279 +msgid "The theme author's name, as found in the theme header." +msgstr "The theme author's name, as found in the theme header." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:283 +msgid "HTML for the theme author, transformed for display." +msgstr "HTML for the theme author, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:289 +msgid "The website of the theme author." +msgstr "The website of the theme author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:294 +msgid "The website of the theme author, as found in the theme header." +msgstr "The website of the theme author, as found in the theme header." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:299 +msgid "The website of the theme author, transformed for display." +msgstr "The website of the theme author, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:306 +msgid "A description of the theme." +msgstr "A description of the theme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:311 +msgid "The theme description, as found in the theme header." +msgstr "The theme description, as found in the theme header." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:381 +msgid "The URI of the theme's webpage." +msgstr "The URI of the theme's webpage." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:386 +msgid "The URI of the theme's webpage, as found in the theme header." +msgstr "The URI of the theme's webpage, as found in the theme header." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:391 +msgid "The URI of the theme's webpage, transformed for display." +msgstr "The URI of the theme's webpage, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:398 +msgid "The theme's current version." +msgstr "The theme's current version." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:370 +msgid "The theme's text domain." +msgstr "The theme's text domain." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:94 +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:595 +msgid "Block namespace." +msgstr "Block namespace." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:516 +msgid "Public text domain." +msgstr "Public text domain." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:523 +msgid "Parent blocks." +msgstr "Parent blocks." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:533 +msgid "Block keywords." +msgstr "Block keywords." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:543 +msgid "Block example." +msgstr "Block example." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:493 +msgid "Unique name identifying the style." +msgstr "Unique name identifying the style." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:498 +msgid "The human-readable label for the style." +msgstr "The human-readable label for the style." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:502 +msgid "Inline CSS code that registers the CSS class required for the style." +msgstr "Inline CSS code that registers the CSS class required for the style." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:506 +msgid "Contains the handle that defines the block style." +msgstr "Contains the handle that defines the block style." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:548 +msgid "The attributes used in the example." +msgstr "The attributes used in the example." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:552 +msgid "The list of inner blocks used in the example." +msgstr "The list of inner blocks used in the example." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:558 +msgid "The name of the inner block." +msgstr "The name of the inner block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:562 +msgid "The attributes of the inner block." +msgstr "The attributes of the inner block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:566 +msgid "A list of the inner block's own inner blocks. This is a recursive definition following the parent innerBlocks schema." +msgstr "A list of the inner block's own inner blocks. This is a recursive definition following the parent innerBlocks schema." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:264 +msgid "The theme's stylesheet. This uniquely identifies the theme." +msgstr "The theme's style sheet. This uniquely identifies the theme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:196 +msgid "Sorry, you are not allowed to manage block types." +msgstr "Sorry, you are not allowed to manage block types." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:210 +msgid "Invalid block type." +msgstr "Invalid block type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:377 +msgid "Title of block type." +msgstr "Title of block type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:384 +msgid "Unique name identifying the block type." +msgstr "Unique name identifying the block type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:391 +msgid "Description of block type." +msgstr "Description of block type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:398 +msgid "Icon of block type." +msgstr "Icon of block type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:405 +msgid "Block attributes." +msgstr "Block attributes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:416 +msgid "Context provided by blocks of this type." +msgstr "Context provided by blocks of this type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:427 +msgid "Context values inherited by blocks of this type." +msgstr "Context values inherited by blocks of this type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:437 +msgid "Block supports." +msgstr "Block supports." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:445 +msgid "Block category." +msgstr "Block category." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:452 +msgid "Is the block dynamically rendered." +msgstr "Is the block dynamically rendered." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:459 +msgid "Editor script handle." +msgstr "Editor script handle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:466 +msgid "Public facing script handle." +msgstr "Public facing script handle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:473 +msgid "Editor style handle." +msgstr "Editor style handle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:480 +msgid "Public facing style handle." +msgstr "Public facing style handle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:487 +msgid "Block style variations." +msgstr "Block style variations." + +#: wp-includes/meta.php:1374 +msgid "When registering a default meta value the data must match the type provided." +msgstr "When registering a default meta value, the data must match the type provided." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php:90 +msgid "Block name." +msgstr "Block name." + +#: wp-includes/widgets/class-wp-widget-rss.php:106 +msgid "RSS Feed" +msgstr "RSS Feed" + +#: wp-includes/block-patterns/text-three-columns-buttons.php:9 +msgid "Three columns of text with buttons" +msgstr "Three columns of text with buttons" + +#: wp-includes/block-patterns/quote.php:10 +msgid "— Don Quixote" +msgstr "– Don Quixote" + +#: wp-includes/block-patterns/three-buttons.php:9 +msgid "Three buttons" +msgstr "Three buttons" + +#: wp-includes/block-patterns/text-two-columns-with-images.php:9 +msgid "Two columns of text with images" +msgstr "Two columns of text with images" + +#: wp-includes/block-patterns/two-buttons.php:9 +msgid "Two buttons" +msgstr "Two buttons" + +#: wp-includes/block-patterns/text-two-columns.php:9 +msgid "Two columns of text" +msgstr "Two columns of text" + +#: wp-includes/block-patterns/two-images.php:9 +msgid "Two images side by side" +msgstr "Two images side by side" + +#: wp-includes/theme.php:4019 +msgid "The post types that support thumbnails or true if all post types are supported." +msgstr "The post types that support thumbnails or true, if all post types are supported." + +#: wp-includes/theme.php:3123 +msgid "When registering an \"array\" feature, the feature's schema must include the \"items\" keyword." +msgstr "When registering an \"array\" feature, the feature's schema must include the \"items\" keyword." + +#: wp-includes/theme.php:3130 +msgid "When registering an \"object\" feature, the feature's schema must include the \"properties\" keyword." +msgstr "When registering an \"object\" feature, the feature's schema must include the \"properties\" keyword." + +#. translators: %s: Theme name. +#: wp-includes/theme.php:959 +msgctxt "theme" +msgid "Error: Current WordPress version does not meet minimum requirements for %s." +msgstr "Error: current WordPress version does not meet minimum requirements for %s." + +#: wp-includes/theme.php:3101 +msgid "The feature \"type\" is not valid JSON Schema type." +msgstr "The feature \"type\" is not a valid JSON Schema type." + +#: wp-includes/theme.php:3108 +msgid "When registering a \"variadic\" theme feature, the \"type\" must be an \"array\"." +msgstr "When registering a \"variadic\" theme feature, the \"type\" must be an \"array\"." + +#: wp-includes/theme.php:3116 +msgid "When registering an \"array\" or \"object\" feature to show in the REST API, the feature's schema must also be defined." +msgstr "When registering an \"array\" or \"object\" feature to show in the REST API, the feature's schema must also be defined." + +#: wp-includes/script-loader.php:875 +msgid "This image cannot be displayed in a web browser. For best results convert it to JPEG before uploading." +msgstr "This image cannot be displayed in a web browser. For best results, convert it to JPEG before uploading." + +#. translators: %s: Theme name. +#: wp-includes/theme.php:941 +msgctxt "theme" +msgid "Error: Current WordPress and PHP versions do not meet minimum requirements for %s." +msgstr "Error: current WordPress and PHP versions do not meet minimum requirements for %s." + +#. translators: %s: Theme name. +#: wp-includes/theme.php:950 +msgctxt "theme" +msgid "Error: Current PHP version does not meet minimum requirements for %s." +msgstr "Error: current PHP version does not meet minimum requirements for %s." + +#. translators: %s: Link to the login page. +#: wp-login.php:1157 +msgid "Check your email for the confirmation link, then visit the login page." +msgstr "Check your email for the confirmation link, then visit the login page." + +#. translators: %s: Link to the login page. +#: wp-login.php:1167 +msgid "Registration complete. Please check your email, then visit the login page." +msgstr "Registration complete. Please check your email, then visit the login page." + +#: wp-login.php:1177 +msgid "Check your email" +msgstr "Check your email" + +#. translators: %s: List of element names. +#: wp-includes/sitemaps/class-wp-sitemaps-renderer.php:170 +msgid "Fields other than %s are not currently supported for the sitemap index." +msgstr "Fields other than %s are not currently supported for the sitemap index." + +#. translators: %s: List of element names. +#: wp-includes/sitemaps/class-wp-sitemaps-renderer.php:235 +msgid "Fields other than %s are not currently supported for sitemaps." +msgstr "Fields other than %s are not currently supported for sitemaps." + +#. translators: %s: SimpleXML +#: wp-includes/sitemaps/class-wp-sitemaps-renderer.php:264 +msgid "Could not generate XML sitemap due to missing %s extension" +msgstr "Could not generate XML sitemap due to missing %s extension" + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:46 +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:160 +msgid "XML Sitemap" +msgstr "XML Sitemap" + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:47 +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:161 +msgid "This XML Sitemap is generated by WordPress to make your content more visible for search engines." +msgstr "This XML Sitemap is generated by WordPress to make your content more visible for search engines." + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:50 +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:164 +msgid "https://www.sitemaps.org/" +msgstr "https://www.sitemaps.org/" + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:51 +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:165 +msgid "Learn more about XML sitemaps." +msgstr "Learn more about XML sitemaps." + +#. translators: %s: Number of URLs. +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:56 +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:170 +msgid "Number of URLs in this XML Sitemap: %s." +msgstr "Number of URLs in this XML Sitemap: %s." + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:62 +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:176 +#: wp-admin/includes/class-wp-posts-list-table.php:1101 +msgid "Last Modified" +msgstr "Last Modified" + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:63 +msgid "Change Frequency" +msgstr "Change Frequency" + +#: wp-includes/sitemaps/class-wp-sitemaps-stylesheet.php:64 +msgid "Priority" +msgstr "Priority" + +#: wp-includes/admin-bar.php:314 +msgid "Edit Profile" +msgstr "Edit Profile" + +#: wp-includes/comment-template.php:603 wp-admin/includes/meta-boxes.php:172 +#: wp-admin/includes/meta-boxes.php:201 +msgid "Password protected" +msgstr "Password protected" + +#: wp-includes/rest-api.php:51 +msgid "Namespace must not start or end with a slash." +msgstr "Namespace must not start or end with a slash." + +#: wp-includes/class-wp-xmlrpc-server.php:3386 +#: wp-includes/class-wp-xmlrpc-server.php:3389 +msgid "Sorry, the category could not be created." +msgstr "Sorry, the category could not be created." + +#: wp-includes/class-wp-xmlrpc-server.php:1787 +#: wp-includes/class-wp-xmlrpc-server.php:5221 +msgid "Sorry, the post could not be deleted." +msgstr "Sorry, the post could not be deleted." + +#: wp-includes/class-wp-xmlrpc-server.php:1644 +#: wp-includes/class-wp-xmlrpc-server.php:5161 +#: wp-includes/class-wp-xmlrpc-server.php:5919 +msgid "Sorry, the post could not be updated." +msgstr "Sorry, the post could not be updated." + +#: wp-includes/media.php:4371 wp-includes/js/dist/block-library.js:24951 +msgid "Select poster image" +msgstr "Select poster image" + +#: wp-includes/js/dist/edit-post.js:7023 wp-admin/edit-form-advanced.php:145 +msgid "View post" +msgstr "View post" + +#: wp-includes/js/dist/components.js:29991 wp-includes/js/dist/editor.js:10735 +#: wp-admin/edit-tags.php:451 wp-admin/includes/meta-boxes.php:890 +#: wp-admin/includes/meta-boxes.php:1563 +#: wp-admin/includes/class-wp-terms-list-table.php:189 +#: wp-admin/includes/class-wp-terms-list-table.php:657 +#: wp-admin/includes/class-wp-posts-list-table.php:1553 +#: wp-admin/edit-tag-form.php:138 +msgid "Slug" +msgstr "Slug" + +#: wp-includes/js/dist/editor.js:7611 wp-admin/includes/meta-boxes.php:708 +msgid "https://wordpress.org/support/article/excerpt/" +msgstr "https://wordpress.org/support/article/excerpt/" + +#. translators: 1: Post status, 2: Capability name. +#: wp-includes/capabilities.php:246 +msgid "The post status %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post with that status." +msgstr "The post status %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post with that status." + +#. translators: %s: Comment link. +#: wp-includes/comment-template.php:981 +#: wp-admin/includes/class-wp-comments-list-table.php:879 +#: wp-admin/comment.php:204 +msgid "In reply to %s." +msgstr "In reply to %s." + +#: wp-includes/general-template.php:2370 +msgid "Previous and next months" +msgstr "Previous and next months" + +#: wp-includes/option.php:2259 +msgid "When registering an \"array\" setting to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"." +msgstr "When registering an \"array\" setting to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"." + +#: wp-includes/user.php:3340 +msgid "Session Tokens" +msgstr "Session Tokens" + +#: wp-includes/user.php:3319 +msgid "Last Login" +msgstr "Last Login" + +#: wp-includes/user.php:3318 +msgid "User Agent" +msgstr "User Agent" + +#: wp-includes/user.php:3316 +msgid "Expiration" +msgstr "Expiration" + +#: wp-includes/user.php:3306 +msgid "User’s location data used for the Community Events in the WordPress Events and News dashboard widget." +msgstr "User’s location data used for the Community Events in the WordPress Events and News dashboard widget." + +#: wp-includes/user.php:3341 +msgid "User’s Session Tokens data." +msgstr "User’s Session Tokens data." + +#: wp-includes/user.php:3305 +msgid "Community Events Location" +msgstr "Community Events Location" + +#: wp-includes/user.php:3289 wp-includes/user.php:3317 +msgid "IP" +msgstr "IP" + +#: wp-includes/user.php:3288 +msgid "Longitude" +msgstr "Longitude" + +#: wp-includes/user.php:3287 +msgid "Latitude" +msgstr "Latitude" + +#: wp-includes/user.php:3286 +msgid "Country" +msgstr "Country" + +#: wp-includes/user.php:3285 +msgid "City" +msgstr "City" + +#. translators: %s: wp_privacy_additional_user_profile_data +#: wp-includes/user.php:3261 +msgid "Filter %s returned items with reserved names." +msgstr "Filter %s returned items with reserved names." + +#: wp-includes/media-template.php:441 wp-includes/media-template.php:664 +#: wp-admin/includes/media.php:3470 +msgid "Original image:" +msgstr "Original image:" + +#: wp-includes/cron.php:844 +msgid "Once Weekly" +msgstr "Once Weekly" + +#. translators: Comment moderation. %s: Parent comment edit URL. +#. translators: %s: Comment link. +#: wp-includes/pluggable.php:1630 wp-includes/pluggable.php:1814 +#: wp-admin/edit-form-comment.php:177 +msgid "In reply to: %s" +msgstr "In reply to: %s" + +#: wp-includes/pluggable.php:1274 +msgid "HTTP redirect status code must be a redirection code, 3xx." +msgstr "HTTP redirect status code must be a redirection code, 3xx." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2759 +msgid "Limit result set based on relationship between multiple taxonomies." +msgstr "Limit result set based on relationship between multiple taxonomies." + +#. translators: 1: The taxonomy name, 2: The property name, either 'rest_base' +#. or 'name', 3: The conflicting value. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2426 +msgid "The \"%1$s\" taxonomy \"%2$s\" property (%3$s) conflicts with an existing property on the REST API Posts Controller. Specify a custom \"rest_base\" when registering the taxonomy to avoid this error." +msgstr "The \"%1$s\" taxonomy \"%2$s\" property (%3$s) conflicts with an existing property on the REST API Posts Controller. Specify a custom \"rest_base\" when registering the taxonomy to avoid this error." + +#: wp-includes/theme.php:4047 +msgid "Whether theme opts in to default WordPress block styles for viewing." +msgstr "Whether theme opts in to default WordPress block styles for viewing." + +#: wp-includes/theme.php:4040 +msgid "Whether the theme can manage the document title tag." +msgstr "Whether the theme can manage the document title tag." + +#: wp-includes/theme.php:3973 +msgid "Allows use of HTML5 markup for search forms, comment forms, comment lists, gallery, and caption." +msgstr "Allows use of HTML5 markup for search forms, comment forms, comment lists, gallery, and caption." + +#: wp-includes/theme.php:3855 +msgid "Whether the theme enables Selective Refresh for Widgets being managed with the Customizer." +msgstr "Whether the theme enables Selective Refresh for Widgets being managed with the Customiser." + +#: wp-includes/theme.php:3822 +msgid "Custom logo if defined by the theme." +msgstr "Custom logo, if defined by the theme." + +#: wp-includes/theme.php:3707 +msgid "Custom background if defined by the theme." +msgstr "Custom background, if defined by the theme." + +#: wp-includes/theme.php:3777 +msgid "Custom header if defined by the theme." +msgstr "Custom header, if defined by the theme." + +#: wp-includes/theme.php:3700 +msgid "Whether posts and comments RSS feed links are added to head." +msgstr "Whether posts and comments RSS Feed links are added to head." + +#: wp-includes/theme.php:3965 +msgid "Whether theme opts in to the editor styles CSS wrapper." +msgstr "Whether theme opts in to the editor styles CSS wrapper." + +#: wp-includes/theme.php:3941 +msgid "Custom gradient presets if defined by the theme." +msgstr "Custom gradient presets, if defined by the theme." + +#: wp-includes/theme.php:3916 +msgid "Custom font sizes if defined by the theme." +msgstr "Custom font sizes, if defined by the theme." + +#: wp-includes/theme.php:3891 +msgid "Custom color palette if defined by the theme." +msgstr "Custom colour palette, if defined by the theme." + +#: wp-includes/theme.php:3883 +msgid "Whether the theme disables custom gradients." +msgstr "Whether the theme disables custom gradients." + +#: wp-includes/theme.php:3876 +msgid "Whether the theme disables custom font sizes." +msgstr "Whether the theme disables custom font sizes." + +#: wp-includes/theme.php:3869 +msgid "Whether the theme disables custom colors." +msgstr "Whether the theme disables custom colours." + +#: wp-includes/theme.php:3862 +msgid "Whether theme opts in to the dark editor style UI." +msgstr "Whether theme opts in to the dark editor style UI." + +#: wp-includes/theme.php:3693 +msgid "Whether theme opts in to wide alignment CSS class." +msgstr "Whether theme opts in to wide alignment CSS class." + +#: wp-includes/class-wp-xmlrpc-server.php:1646 +#: wp-includes/class-wp-xmlrpc-server.php:5081 +#: wp-includes/class-wp-xmlrpc-server.php:5574 +msgid "Sorry, the post could not be created." +msgstr "Sorry, the post could not be created." + +#: wp-includes/class-wp-xmlrpc-server.php:5008 +#: wp-includes/class-wp-xmlrpc-server.php:5021 +msgid "Sorry, this method is not supported." +msgstr "Sorry, this method is not supported." + +#. translators: Minimum input length in characters to start searching posts in +#. the "Insert/edit link" modal. +#: wp-includes/script-loader.php:1098 +msgctxt "minimum input length for searching post links" +msgid "3" +msgstr "3" + +#: wp-includes/script-loader.php:860 +msgid "Post-processing of the image failed likely because the server is busy or does not have enough resources. Uploading a smaller image may help. Suggested maximum size is 2500 pixels." +msgstr "Post-processing of the image likely failed because the server is busy or does not have enough resources. Uploading a smaller image may help. Suggested maximum size is 2500 pixels." + +#: wp-login.php:870 +msgid "Please enter your username or email address. You will receive an email message with instructions on how to reset your password." +msgstr "Please enter your username or email address. You will receive an email message with instructions on how to reset your password." + +#. translators: Accessibility text. +#: wp-includes/media-template.php:188 +msgid "Selected media actions" +msgstr "Selected media actions" + +#: wp-includes/media-template.php:177 +msgctxt "media modal menu" +msgid "Menu" +msgstr "Menu" + +#: wp-includes/media-template.php:175 +msgctxt "media modal menu actions" +msgid "Actions" +msgstr "Actions" + +#: wp-includes/post.php:2810 +msgctxt "file type group" +msgid "Archives" +msgstr "Archives" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:911 +msgid "List of the missing image sizes of the attachment." +msgstr "List of the missing image sizes of the attachment." + +#: wp-includes/user.php:231 wp-includes/user.php:349 +msgid "Unknown email address. Check again or try your username." +msgstr "Unknown email address. Check again or try your username." + +#: wp-includes/user.php:152 wp-includes/user.php:354 +msgid "Unknown username. Check again or try your email address." +msgstr "Unknown username. Check again or try your email address." + +#: wp-includes/media.php:4396 +msgid "Media list" +msgstr "Media list" + +#: wp-includes/media.php:4395 +msgid "Filter media" +msgstr "Filter media" + +#: wp-includes/media-template.php:316 +#: wp-includes/js/dist/block-library.js:18362 +#: wp-includes/js/dist/block-library.js:20901 +#: wp-admin/includes/class-wp-media-list-table.php:45 +msgid "Grid view" +msgstr "Grid view" + +#: wp-includes/media-template.php:313 wp-includes/js/dist/block-editor.js:34205 +#: wp-includes/js/dist/block-library.js:18353 +#: wp-includes/js/dist/block-library.js:20892 +#: wp-admin/includes/class-wp-media-list-table.php:44 +msgid "List view" +msgstr "List view" + +#: wp-includes/js/dist/block-library.js:7125 wp-admin/credits.php:27 +#: wp-admin/privacy.php:24 wp-admin/freedoms.php:30 wp-admin/about.php:25 +msgid "Code is Poetry" +msgstr "Code is Poetry" + +#: wp-includes/js/dist/block-directory.js:1864 +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:63 +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:136 +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:142 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:68 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:142 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:149 +msgid "Retry" +msgstr "Retry" + +#: wp-includes/js/dist/editor.js:6865 wp-admin/includes/template.php:2585 +msgid "Restore the backup" +msgstr "Restore the backup" + +#: wp-includes/js/dist/editor.js:6862 wp-admin/includes/template.php:2584 +msgid "The backup of this post in your browser is different from the version below." +msgstr "The backup of this post in your browser is different from the version below." + +#: wp-includes/nav-menu.php:97 +msgid "Nav menu locations must be strings." +msgstr "Nav menu locations must be strings." + +#. translators: %s: The currently used PHP version. +#: wp-includes/class-wp-recovery-mode-email-service.php:358 +msgid "PHP version %s" +msgstr "PHP version %s" + +#. translators: 1: The failing plugins name. 2: The failing plugins version. +#: wp-includes/class-wp-recovery-mode-email-service.php:350 +msgid "Current plugin: %1$s (version %2$s)" +msgstr "Current plugin: %1$s (version %2$s)" + +#. translators: 1: Current active theme name. 2: Current active theme version. +#: wp-includes/class-wp-recovery-mode-email-service.php:341 +msgid "Current theme: %1$s (version %2$s)" +msgstr "Current theme: %1$s (version %2$s)" + +#. translators: %s: Your current version of WordPress. +#: wp-includes/class-wp-recovery-mode-email-service.php:336 +#: wp-admin/includes/class-wp-site-health.php:266 +msgid "WordPress version %s" +msgstr "WordPress version %s" + +#: wp-includes/ms-load.php:496 +msgid "https://wordpress.org/support/article/debugging-a-wordpress-network/" +msgstr "https://wordpress.org/support/article/debugging-a-wordpress-network/" + +#: wp-includes/formatting.php:4864 +msgid "https://wordpress.org/support/article/using-permalinks/#choosing-your-permalink-structure" +msgstr "https://wordpress.org/support/article/using-permalinks/#choosing-your-permalink-structure" + +#: wp-includes/class-wp-block-styles-registry.php:52 +msgid "Block style name must be a string." +msgstr "Block style name must be a string." + +#: wp-includes/link-template.php:2593 wp-includes/link-template.php:2675 +#: wp-includes/link-template.php:2743 +#: wp-admin/includes/class-wp-users-list-table.php:360 +msgid "Posts" +msgstr "Posts" + +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:54 +msgid "https://wordpress.org/support/article/wordpress-widgets/" +msgstr "https://wordpress.org/support/article/wordpress-widgets/" + +#. translators: 1: UTC abbreviation and offset, 2: UTC offset. +#: wp-includes/customize/class-wp-customize-date-time-control.php:252 +msgid "Your timezone is set to %1$s (Coordinated Universal Time %2$s)." +msgstr "Your timezone is set to %1$s (Coordinated Universal Time %2$s)." + +#. translators: 1: Timezone name, 2: Timezone abbreviation, 3: UTC abbreviation +#. and offset, 4: UTC offset. +#: wp-includes/customize/class-wp-customize-date-time-control.php:238 +msgid "Your timezone is set to %1$s (%2$s), currently %3$s (Coordinated Universal Time %4$s)." +msgstr "Your timezone is set to %1$s (%2$s), currently %3$s (Coordinated Universal Time %4$s)." + +#: wp-includes/class-wp-fatal-error-handler.php:196 +#: wp-admin/includes/class-wp-site-health.php:1441 +msgid "Learn more about debugging in WordPress." +msgstr "Learn more about debugging in WordPress." + +#. translators: Documentation explaining debugging in WordPress. +#: wp-includes/class-wp-fatal-error-handler.php:195 +#: wp-includes/functions.php:5300 +#: wp-admin/includes/class-wp-site-health.php:1440 +msgid "https://wordpress.org/support/article/debugging-in-wordpress/" +msgstr "https://wordpress.org/support/article/debugging-in-wordpress/" + +#. translators: 1: Block name, 2: Block style name. +#: wp-includes/class-wp-block-styles-registry.php:77 +msgid "Block \"%1$s\" does not contain a style named \"%2$s\"." +msgstr "Block \"%1$s\" does not contain a style named \"%2$s.\"." + +#: wp-includes/class-wp-block-styles-registry.php:46 +msgid "Block name must be a string." +msgstr "Block name must be a string." + +#: wp-includes/class-wp-fatal-error-handler.php:184 +msgid "There has been a critical error on this website, putting it in recovery mode. Please check the Themes and Plugins screens for more details. If you just installed or updated a theme or plugin, check the relevant page for that first." +msgstr "There has been a critical error on this website, putting it in recovery mode. Please check the Themes and Plugins screens for more details. If you just installed or updated a theme or plugin, check the relevant page for that first." + +#: wp-includes/class-wp-fatal-error-handler.php:186 +msgid "There has been a critical error on this website. Please check your site admin email inbox for instructions." +msgstr "There has been a critical error on this website. Please check your site admin email inbox for instructions." + +#: wp-includes/class-wp-fatal-error-handler.php:188 +msgid "There has been a critical error on this website." +msgstr "There has been a critical error on this website." + +#: wp-includes/class-wp-image-editor-imagick.php:643 +msgid "The image cannot be rotated because the embedded meta data cannot be updated." +msgstr "The image cannot be rotated because the embedded meta data cannot be updated." + +#: wp-includes/user.php:3276 +msgid "User’s profile data." +msgstr "User’s profile data." + +#: wp-includes/user.php:2013 +msgid "Not enough data to create this user." +msgstr "Not enough data to create this user." + +#: wp-includes/user.php:1884 +msgid "Sorry, marking a user as spam is only supported on Multisite." +msgstr "Sorry, marking a user as spam is only supported on Multisite." + +#: wp-includes/media.php:4834 +msgid "User’s media data." +msgstr "User’s media data." + +#: wp-includes/media.php:4321 +msgid "No media items found. Try a different search." +msgstr "No media items found. Try a different search." + +#: wp-includes/media.php:4319 +msgid "Number of media items displayed: %d. Scroll the page for more results." +msgstr "Number of media items displayed: %d. Scroll the page for more results." + +#: wp-includes/media.php:4318 +msgid "Number of media items found: %d" +msgstr "Number of media items found: %d" + +#. translators: %s: Number of archives. +#: wp-includes/post.php:2813 +msgid "Archive (%s)" +msgid_plural "Archives (%s)" +msgstr[0] "Archive (%s)" +msgstr[1] "Archives (%s)" + +#: wp-includes/post.php:2811 +msgid "Manage Archives" +msgstr "Manage Archives" + +#. translators: %s: Number of spreadsheets. +#: wp-includes/post.php:2804 +msgid "Spreadsheet (%s)" +msgid_plural "Spreadsheets (%s)" +msgstr[0] "Spreadsheet (%s)" +msgstr[1] "Spreadsheets (%s)" + +#: wp-includes/post.php:2802 +msgid "Manage Spreadsheets" +msgstr "Manage Spreadsheets" + +#: wp-includes/post.php:2801 +msgid "Spreadsheets" +msgstr "Spreadsheets" + +#: wp-includes/post.php:2793 +msgid "Manage Documents" +msgstr "Manage Documents" + +#: wp-includes/post.php:2792 +msgid "Documents" +msgstr "Documents" + +#: wp-includes/load.php:169 wp-admin/install.php:287 +msgid "Requirements Not Met" +msgstr "Requirements Not Met" + +#. translators: 1: "srclang" HTML attribute, 2: "label" HTML attribute, 3: +#. "kind" HTML attribute. +#: wp-includes/media-template.php:1430 +msgid "The %1$s, %2$s, and %3$s values can be edited to set the video track language and kind." +msgstr "The %1$s, %2$s, and %3$s values can be edited to set the video track language and kind." + +#: wp-includes/comment.php:3668 +msgid "User’s comment data." +msgstr "User’s comment data." + +#: wp-includes/class-wp-text-diff-renderer-table.php:137 +msgid "Unchanged:" +msgstr "Unchanged:" + +#: wp-includes/class-wp-text-diff-renderer-table.php:116 +msgid "Added:" +msgstr "Added:" + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:344 +msgid "Whether posts of this status may have floating published dates." +msgstr "Whether posts of this status may have floating published dates." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:413 +msgid "Sorry, you are not allowed to delete revisions of this post." +msgstr "Sorry, you are not allowed to delete revisions of this post." + +#. translators: %s: Custom field key. +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:318 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:332 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:382 +msgid "Could not update the meta value of %s in database." +msgstr "Could not update the meta value of %s in database." + +#: wp-includes/meta.php:1332 +msgid "When registering an \"array\" meta type to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"." +msgstr "When registering an \"array\" meta type to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"." + +#. translators: %s: taxonomy name +#: wp-includes/blocks/tag-cloud.php:28 +msgid "Your site doesn’t have any %s, so there’s nothing to display here at the moment." +msgstr "Your site doesn’t have any %s, so there’s nothing to display here at the moment." + +#: wp-includes/widgets/class-wp-widget-meta.php:74 +msgid "Comments feed" +msgstr "Comments feed" + +#: wp-includes/widgets/class-wp-widget-meta.php:73 +msgid "Entries feed" +msgstr "Entries feed" + +#: wp-includes/script-loader.php:859 +msgid "Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page." +msgstr "Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page." + +#: wp-load.php:83 wp-admin/setup-config.php:194 +msgid "https://wordpress.org/support/article/editing-wp-config-php/" +msgstr "https://wordpress.org/support/article/editing-wp-config-php/" + +#: wp-login.php:749 +msgid "Remind me later" +msgstr "Remind me later" + +#: wp-login.php:733 +msgid "The email is correct" +msgstr "The email is correct" + +#: wp-login.php:721 +msgid "This email may be different from your personal email address." +msgstr "This email may be different from your personal email address." + +#. translators: %s: Admin email address. +#: wp-login.php:714 +msgid "Current administration email: %s" +msgstr "Current administration email: %s" + +#: wp-login.php:703 +msgid "Why is this important?" +msgstr "Why is this important?" + +#. translators: URL to the WordPress help section about admin email. +#: wp-login.php:695 +msgid "https://wordpress.org/support/article/settings-general-screen/#email-address" +msgstr "https://wordpress.org/support/article/settings-general-screen/#email-address" + +#: wp-login.php:691 +msgid "Please verify that the administration email for this website is still correct." +msgstr "Please verify that the administration email for this website is still correct." + +#: wp-login.php:688 +msgid "Administration email verification" +msgstr "Administration email verification" + +#: wp-login.php:659 +msgid "Confirm your administration email" +msgstr "Confirm your administration email" + +#. translators: Maximum number of words used in a post excerpt. +#: wp-includes/formatting.php:3826 +msgctxt "excerpt_length" +msgid "55" +msgstr "55" + +#: wp-includes/class-wp-customize-manager.php:5531 +#: wp-admin/includes/class-custom-background.php:430 +msgctxt "Original Size" +msgid "Original" +msgstr "Original" + +#. translators: Maximum number of words used in a comment excerpt. +#: wp-includes/comment-template.php:607 +msgctxt "comment_excerpt_length" +msgid "20" +msgstr "20" + +#: wp-includes/class-wp-image-editor-imagick.php:475 +#: wp-includes/class-wp-image-editor-gd.php:267 +msgid "Cannot resize the image. Both width and height are not set." +msgstr "Cannot resize the image. Both width and height are not set." + +#: wp-includes/media-template.php:1158 +msgid "Image size in pixels" +msgstr "Image size in pixels" + +#: wp-includes/media-template.php:597 +msgid "Media title…" +msgstr "Media title…" + +#: wp-includes/media-template.php:596 +msgid "Media title" +msgstr "Media title" + +#: wp-includes/media-template.php:594 +msgid "Audio title…" +msgstr "Audio title…" + +#: wp-includes/media-template.php:593 +msgid "Audio title" +msgstr "Audio title" + +#: wp-includes/media-template.php:591 +msgid "Video title…" +msgstr "Video title…" + +#: wp-includes/media-template.php:590 +msgid "Video title" +msgstr "Video title" + +#: wp-includes/media-template.php:586 +msgid "Caption…" +msgstr "Caption…" + +#: wp-includes/media-template.php:407 wp-includes/js/dist/editor.js:12110 +#: wp-admin/includes/class-wp-themes-list-table.php:271 +#: wp-admin/includes/class-wp-theme-install-list-table.php:369 +#: wp-admin/import.php:205 +msgid "Details" +msgstr "Details" + +#: wp-includes/media-template.php:356 +msgid "Attachment Preview" +msgstr "Attachment Preview" + +#: wp-includes/media-template.php:232 +msgid "Your browser cannot upload files" +msgstr "Your browser cannot upload files" + +#: wp-includes/class-wp-xmlrpc-server.php:615 wp-includes/option.php:2186 +msgid "Allow people to submit comments on new posts." +msgstr "Allow people to submit comments on new posts." + +#: wp-login.php:484 +msgid "https://wordpress.org/support/article/resetting-your-password/" +msgstr "https://wordpress.org/support/article/resetting-your-password/" + +#. translators: %s: Documentation URL. +#: wp-login.php:483 +msgid "Error: The email could not be sent. Your site may not be correctly configured to send emails. Get support for resetting your password." +msgstr "Error: the email could not be sent. Your site may not be correctly configured to send emails. Get support for resetting your password." + +#: wp-includes/customize/class-wp-customize-theme-control.php:98 +#: wp-admin/themes.php:397 wp-admin/themes.php:736 +msgid "New version available." +msgstr "New version available." + +#: wp-includes/taxonomy.php:2386 +msgid "Could not insert term taxonomy into the database." +msgstr "Could not insert term taxonomy into the database." + +#. translators: 1: Link to tutorial, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-includes/media-template.php:161 wp-admin/includes/media.php:3217 +msgid "Describe the purpose of the image%3$s. Leave empty if the image is purely decorative." +msgstr "Describe the purpose of the image%3$s. Leave empty if the image is purely decorative." + +#. translators: %s: Theme name. +#: wp-includes/class-wp-recovery-mode-email-service.php:280 +msgid "In this case, WordPress caught an error with your theme, %s." +msgstr "In this case, WordPress caught an error with your theme, %s." + +#. translators: %s: Plugin name. +#: wp-includes/class-wp-recovery-mode-email-service.php:274 +msgid "In this case, WordPress caught an error with one of your plugins, %s." +msgstr "In this case, WordPress caught an error with one of your plugins, %s." + +#. translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, +#. PAGEURL, SUPPORT. DEBUG: those are placeholders. +#: wp-includes/class-wp-recovery-mode-email-service.php:152 +msgid "" +"Howdy!\n" +"\n" +"Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email.\n" +"###CAUSE###\n" +"First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues.\n" +"\n" +"###SUPPORT###\n" +"\n" +"If your site appears broken and you can't access your dashboard normally, WordPress now has a special \"recovery mode\". This lets you safely login to your dashboard and investigate further.\n" +"\n" +"###LINK###\n" +"\n" +"To keep your site safe, this link will expire in ###EXPIRES###. Don't worry about that, though: a new link will be emailed to you if the error occurs again after it expires.\n" +"\n" +"When seeking help with this issue, you may be asked for some of the following information:\n" +"###DEBUG###\n" +"\n" +"###DETAILS###" +msgstr "" +"Hi!\n" +"\n" +"Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email.\n" +"###CAUSE###\n" +"First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues.\n" +"\n" +"###SUPPORT###\n" +"\n" +"If your site appears broken and you can't access your dashboard normally, WordPress now has a special \"recovery mode\". This lets you safely login to your dashboard and investigate further.\n" +"\n" +"###LINK###\n" +"\n" +"To keep your site safe, this link will expire in ###EXPIRES###. Don't worry about that, though: a new link will be emailed to you if the error occurs again after it expires.\n" +"\n" +"When seeking help with this issue, you may be asked for some of the following information:\n" +"###DEBUG###\n" +"\n" +"###DETAILS###" + +#: wp-includes/class-wp-recovery-mode-email-service.php:140 +msgid "Please contact your host for assistance with investigating this issue further." +msgstr "Please contact your host for assistance with investigating this issue further." + +#: wp-includes/class-wp-recovery-mode.php:177 +msgid "Error occurred on a non-protected endpoint." +msgstr "Error occurred on a non-protected endpoint." + +#. translators: %s: Login screen title. +#. translators: %s: Admin screen title. +#: wp-login.php:75 wp-admin/admin-header.php:57 +msgid "Recovery Mode — %s" +msgstr "Recovery Mode — %s" + +#. translators: Login details notification email subject. %s: Site title. +#: wp-includes/pluggable.php:2059 +msgid "[%s] Login Details" +msgstr "[%s] Login Details" + +#: wp-includes/media-template.php:538 wp-includes/media-template.php:689 +#: wp-includes/media.php:4309 wp-admin/includes/meta-boxes.php:337 +#: wp-admin/includes/meta-boxes.php:441 wp-admin/includes/media.php:1734 +#: wp-admin/includes/class-wp-media-list-table.php:177 +#: wp-admin/includes/class-wp-comments-list-table.php:374 +#: wp-admin/includes/class-wp-posts-list-table.php:418 wp-admin/comment.php:136 +#: wp-admin/edit-form-comment.php:205 +msgid "Move to Trash" +msgstr "Move to Bin" + +#: wp-includes/media-template.php:536 wp-includes/media-template.php:687 +#: wp-includes/media.php:4310 +msgid "Restore from Trash" +msgstr "Restore from Bin" + +#: wp-includes/admin-bar.php:184 +msgid "Support" +msgstr "Support" + +#: wp-login.php:1267 wp-includes/wp-db.php:1122 wp-includes/wp-db.php:1719 +#: wp-includes/wp-db.php:1876 wp-includes/update.php:171 +#: wp-includes/update.php:406 wp-includes/update.php:610 +#: wp-includes/customize/class-wp-customize-themes-section.php:90 +#: wp-admin/includes/theme.php:544 wp-admin/includes/theme.php:558 +#: wp-admin/includes/theme.php:573 wp-admin/includes/translation-install.php:66 +#: wp-admin/includes/translation-install.php:80 +#: wp-admin/includes/translation-install.php:92 +#: wp-admin/includes/update.php:141 wp-admin/includes/plugin-install.php:181 +#: wp-admin/includes/plugin-install.php:196 +#: wp-admin/includes/plugin-install.php:211 +#: wp-admin/includes/class-wp-automatic-updater.php:803 +#: wp-admin/includes/class-wp-automatic-updater.php:1216 +#: wp-admin/theme-install.php:63 +msgid "https://wordpress.org/support/forums/" +msgstr "https://wordpress.org/support/forums/" + +#. translators: Network admin email change notification email subject. %s: +#. Network title. +#: wp-includes/ms-functions.php:2940 +msgid "[%s] Network Admin Email Changed" +msgstr "[%s] Network Admin Email Changed" + +#. translators: Email change notification email subject. %s: Network title. +#: wp-includes/ms-functions.php:2877 +msgid "[%s] Network Admin Email Change Request" +msgstr "[%s] Network Admin Email Change Request" + +#. translators: Site admin email change notification email subject. %s: Site +#. title. +#: wp-includes/functions.php:7150 +msgid "[%s] Admin Email Changed" +msgstr "[%s] Admin Email Changed" + +#. translators: New email address notification email subject. %s: Site title. +#: wp-includes/user.php:3097 +msgid "[%s] Email Change Request" +msgstr "[%s] Email Change Request" + +#. translators: Email change notification email subject. %s: Site title. +#: wp-includes/user.php:2295 +msgid "[%s] Email Changed" +msgstr "[%s] Email Changed" + +#: wp-includes/js/dist/block-library.js:11496 wp-admin/options-reading.php:152 +msgid "posts" +msgstr "posts" + +#: wp-includes/widgets/class-wp-widget-calendar.php:34 +#: wp-includes/js/dist/block-library.js:11494 +msgid "A calendar of your site’s posts." +msgstr "A calendar of your site’s posts." + +#: wp-includes/media.php:4335 +msgid "Edit gallery" +msgstr "Edit gallery" + +#: wp-includes/class-wp-recovery-mode.php:246 +msgid "Failed to exit recovery mode. Please try again later." +msgstr "Failed to exit recovery mode. Please try again later." + +#: wp-includes/class-wp-recovery-mode.php:242 +msgid "Exit recovery mode link expired." +msgstr "Exit recovery mode link expired." + +#: wp-includes/class-wp-recovery-mode.php:188 +msgid "Failed to store the error." +msgstr "Failed to store the error." + +#: wp-includes/class-wp-recovery-mode.php:172 +msgid "Error not caused by a plugin or theme." +msgstr "Error not caused by a plugin or theme." + +#. translators: %s: Site title. +#: wp-includes/class-wp-recovery-mode-email-service.php:199 +msgid "[%s] Your Site is Experiencing a Technical Issue" +msgstr "[%s] Your Site is Experiencing a Technical Issue" + +#: wp-includes/class-wp-recovery-mode-email-service.php:125 +msgid "Error Details" +msgstr "Error Details" + +#. translators: 1: Last sent as a human time diff, 2: Wait time as a human time +#. diff. +#: wp-includes/class-wp-recovery-mode-email-service.php:79 +msgid "A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email." +msgstr "A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email." + +#: wp-includes/class-wp-recovery-mode-email-service.php:58 +msgid "Could not update the email last sent time." +msgstr "Could not update the email last sent time." + +#: wp-includes/class-wp-recovery-mode-key-service.php:113 +msgid "Recovery key expired." +msgstr "Recovery key expired." + +#: wp-includes/class-wp-recovery-mode-key-service.php:109 +msgid "Invalid recovery key." +msgstr "Invalid recovery key." + +#: wp-includes/class-wp-recovery-mode-key-service.php:105 +msgid "Invalid recovery key format." +msgstr "Invalid recovery key format." + +#: wp-includes/class-wp-recovery-mode-key-service.php:97 +msgid "Recovery Mode not initialized." +msgstr "Recovery Mode not initialised." + +#. translators: User role for subscribers. +#: wp-includes/capabilities.php:1077 +msgctxt "User role" +msgid "Subscriber" +msgstr "Subscriber" + +#. translators: User role for contributors. +#: wp-includes/capabilities.php:1075 +msgctxt "User role" +msgid "Contributor" +msgstr "Contributor" + +#. translators: User role for authors. +#: wp-includes/capabilities.php:1073 +msgctxt "User role" +msgid "Author" +msgstr "Author" + +#. translators: User role for editors. +#: wp-includes/capabilities.php:1071 +msgctxt "User role" +msgid "Editor" +msgstr "Editor" + +#. translators: User role for administrators. +#: wp-includes/capabilities.php:1069 +msgctxt "User role" +msgid "Administrator" +msgstr "Administrator" + +#: wp-includes/customize/class-wp-customize-media-control.php:246 +msgid "Select site icon" +msgstr "Select site icon" + +#. translators: %s: mail() +#: wp-includes/class-wp-recovery-mode-email-service.php:71 +msgid "The email could not be sent. Possible reason: your host may have disabled the %s function." +msgstr "The email could not be sent. Possible reason: your host may have disabled the %s function." + +#: wp-includes/user.php:3807 +msgid "An incomplete user privacy request for this email address already exists." +msgstr "An incomplete user privacy request for this email address already exists." + +#: wp-includes/class-wp-customize-widgets.php:778 +msgid "Keep widget settings and move it to the inactive widgets" +msgstr "Keep widget settings and move it to the inactive widgets" + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:108 +msgid "Invalid cookie." +msgstr "Invalid cookie." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:101 +msgid "Cookie expired." +msgstr "Cookie expired." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:94 +#: wp-includes/class-wp-recovery-mode-cookie-service.php:157 +msgid "Invalid cookie format." +msgstr "Invalid cookie format." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:79 +#: wp-includes/class-wp-recovery-mode-cookie-service.php:128 +msgid "No cookie present." +msgstr "No cookie present." + +#. translators: 1: Error type, 2: Error line number, 3: Error file name, 4: +#. Error message. +#: wp-includes/error-protection.php:63 +msgid "An error of type %1$s was caused in line %2$s of the file %3$s. Error message: %4$s" +msgstr "An error of type %1$s was caused in line %2$s of the file %3$s. Error message: %4$s" + +#: wp-includes/class-wp-theme.php:321 +#: wp-admin/includes/class-wp-themes-list-table.php:286 +#: wp-admin/theme-editor.php:43 wp-admin/theme-editor.php:368 +#: wp-admin/update-core.php:604 +msgid "https://developer.wordpress.org/themes/advanced-topics/child-themes/" +msgstr "https://developer.wordpress.org/themes/advanced-topics/child-themes/" + +#. translators: %s: The amount of additional, not visible images in the gallery +#. widget preview. +#: wp-includes/widgets/class-wp-widget-media-gallery.php:218 +msgid "Additional images added to this gallery: %s" +msgstr "Additional images added to this gallery: %s" + +#. translators: %s: The image file name. +#. Translators: %s: The selected image filename. +#: wp-includes/widgets/class-wp-widget-media-image.php:364 +#: wp-includes/widgets/class-wp-widget-media-gallery.php:204 +#: wp-includes/js/dist/editor.js:7792 +msgid "The current image has no alternative text. The file name is: %s" +msgstr "The current image has no alternative text. The file name is: %s" + +#: wp-includes/admin-bar.php:1101 +msgid "Exit Recovery Mode" +msgstr "Exit Recovery Mode" + +#. translators: %s: Number of comments. +#: wp-includes/admin-bar.php:921 wp-admin/includes/ajax-actions.php:470 +#: wp-admin/includes/ajax-actions.php:541 +#: wp-admin/includes/ajax-actions.php:1377 wp-admin/includes/dashboard.php:321 +#: wp-admin/menu.php:94 +msgid "%s Comment in moderation" +msgid_plural "%s Comments in moderation" +msgstr[0] "%s Comment in moderation" +msgstr[1] "%s Comments in moderation" + +#: wp-content/plugins/hello.php:62 hello.php:62 +msgid "Quote from Hello Dolly song, by Jerry Herman:" +msgstr "Quote from Hello Dolly song, by Jerry Herman:" + +#: wp-login.php:1382 +msgid "Recovery Mode Initialized. Please log in to continue." +msgstr "Recovery Mode Initialised. Please log in to continue." + +#: wp-login.php:1277 +msgid "https://wordpress.org/support/article/cookies/#enable-cookies-in-your-browser" +msgstr "https://wordpress.org/support/article/cookies/#enable-cookies-in-your-browser" + +#: wp-login.php:1266 +msgid "https://wordpress.org/support/article/cookies/" +msgstr "https://wordpress.org/support/article/cookies/" + +#: wp-login.php:1187 +msgid "Missing confirm key." +msgstr "Missing confirm key." + +#: wp-login.php:1183 wp-admin/includes/ajax-actions.php:4730 +#: wp-admin/includes/ajax-actions.php:4920 +msgid "Missing request ID." +msgstr "Missing request ID." + +#: wp-login.php:148 +msgid "Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead." +msgstr "Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead." + +#: wp-includes/functions.php:7574 +msgid "Update PHP" +msgstr "Update PHP" + +#: wp-includes/ms-site.php:79 +msgid "Could not retrieve site data." +msgstr "Could not retrieve site data." + +#. translators: %s: rest_api_init +#: wp-includes/rest-api.php:59 +msgid "REST API routes must be registered on the %s action." +msgstr "REST API routes must be registered on the %s action." + +#. translators: Used to join last two items in a list with more than 2 times. +#: wp-includes/formatting.php:5130 +msgid "%1$s, and %2$s" +msgstr "%1$s and %2$s" + +#. translators: %s: Number of failed requests. +#: wp-includes/post.php:456 +msgid "Failed (%s)" +msgid_plural "Failed (%s)" +msgstr[0] "Failed (%s)" +msgstr[1] "Failed (%s)" + +#. translators: %s: Database table name. +#: wp-includes/ms-site.php:1334 +msgid "The %s table is not installed. Please run the network database upgrade." +msgstr "The %s table is not installed. Please run the network database upgrade." + +#: wp-includes/class-walker-comment.php:304 +#: wp-includes/class-walker-comment.php:408 +msgid "Your comment is awaiting moderation. This is a preview; your comment will be visible after it has been approved." +msgstr "Your comment is awaiting moderation. This is a preview; your comment will be visible after it has been approved." + +#. translators: %d: Site ID. +#: wp-includes/ms-site.php:699 +msgid "Site %d" +msgstr "Site %d" + +#: wp-includes/ms-site.php:682 wp-includes/ms-site.php:813 +msgid "Site with the ID does not exist." +msgstr "Site with the ID does not exist." + +#: wp-includes/ms-site.php:626 +msgid "Both registration and last updated dates must be valid dates." +msgstr "Both registration and last updated dates must be valid dates." + +#: wp-includes/ms-site.php:615 +msgid "Both registration and last updated dates must be provided." +msgstr "Both registration and last updated dates must be provided." + +#: wp-includes/ms-site.php:608 +msgid "Site network ID must be provided." +msgstr "Site network ID must be provided." + +#: wp-includes/ms-site.php:603 +msgid "Site path must not be empty." +msgstr "Site path must not be empty." + +#: wp-includes/ms-site.php:598 +msgid "Site domain must not be empty." +msgstr "Site domain must not be empty." + +#: wp-includes/ms-site.php:269 +msgid "Could not delete site from the database." +msgstr "Could not delete site from the database." + +#: wp-includes/ms-site.php:180 +msgid "Could not update site in the database." +msgstr "Could not update site in the database." + +#: wp-includes/ms-site.php:166 wp-includes/ms-site.php:219 +msgid "Site does not exist." +msgstr "Site does not exist." + +#: wp-includes/ms-site.php:161 wp-includes/ms-site.php:214 +#: wp-includes/ms-site.php:677 wp-includes/ms-site.php:808 +msgid "Site ID must not be empty." +msgstr "Site ID must not be empty." + +#: wp-includes/ms-site.php:69 +msgid "Could not insert site into the database." +msgstr "Could not insert site into the database." + +#: wp-includes/ms-functions.php:2213 +msgid "Unable to submit this form, please try again." +msgstr "Unable to submit this form, please try again." + +#: wp-includes/taxonomy.php:165 +msgctxt "post format" +msgid "Formats" +msgstr "Formats" + +#: wp-includes/ms-site.php:686 +msgid "The site appears to be already initialized." +msgstr "The site appears to be already initialised." + +#: wp-includes/ms-site.php:817 +msgid "The site appears to be already uninitialized." +msgstr "The site appears to be already uninitialised." + +#: wp-includes/class-wp-theme.php:424 +msgid "This theme failed to load properly and was paused within the admin backend." +msgstr "This theme failed to load properly and was paused within the admin back end." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:390 +msgid "Whether to make the taxonomy available for selection in navigation menus." +msgstr "Whether to make the taxonomy available for selection in navigation menus." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:386 +msgid "Whether to allow automatic creation of taxonomy columns on associated post-types table." +msgstr "Whether to allow automatic creation of taxonomy columns on associated post types table." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:382 +msgid "Whether to generate a default UI for managing this taxonomy." +msgstr "Whether to generate a default UI for managing this taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:378 +msgid "Whether the taxonomy is publicly queryable." +msgstr "Whether the taxonomy is publicly queryable." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:374 +msgid "Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users." +msgstr "Whether a taxonomy is intended for use publicly either via the admin interface or by front end users." + +#. translators: Used to join items in a list with more than 2 items. +#: wp-includes/formatting.php:5128 +msgid "%1$s, %2$s" +msgstr "%1$s, %2$s" + +#. translators: %s: Default Update PHP page URL. +#: wp-includes/functions.php:7517 +msgid "This resource is provided by your web host, and is specific to your site. For more information, see the official WordPress documentation." +msgstr "This resource is provided by your web host, and is specific to your site. For more information, see the official WordPress documentation." + +#. translators: %s: Time duration in second or seconds. +#. translators: Time difference between two dates, in seconds. %s: Number of +#. seconds. +#: wp-includes/functions.php:542 wp-includes/formatting.php:3738 +msgid "%s second" +msgid_plural "%s seconds" +msgstr[0] "%s second" +msgstr[1] "%s seconds" + +#. translators: %s: Time duration in minute or minutes. +#: wp-includes/functions.php:536 +msgid "%s minute" +msgid_plural "%s minutes" +msgstr[0] "%s minute" +msgstr[1] "%s minutes" + +#. translators: 1: A number of pixels wide, 2: A number of pixels tall. +#: wp-includes/media-template.php:435 wp-includes/media-template.php:658 +msgid "%1$s by %2$s pixels" +msgstr "%1$s by %2$s pixels" + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:394 +msgid "Whether to show the taxonomy in the quick/bulk edit panel." +msgstr "Whether to show the taxonomy in the Quick/Bulk edit panel." + +#: wp-includes/functions.php:7474 +msgctxt "localized PHP upgrade information page" +msgid "https://wordpress.org/support/update-php/" +msgstr "https://wordpress.org/support/update-php/" + +#: wp-login.php:365 wp-login.php:407 wp-includes/user.php:2485 +msgid "Error: There is no account with that username or email address." +msgstr "Error: there is no account with that username or email address." + +#: wp-includes/class-wp.php:300 wp-includes/ms-deprecated.php:275 +#: wp-includes/ms-deprecated.php:294 +msgid "A variable mismatch has been detected." +msgstr "A variable mismatch has been detected." + +#: wp-activate.php:30 +msgid "A key value mismatch has been detected. Please follow the link provided in your activation email." +msgstr "A key value mismatch has been detected. Please follow the link provided in your activation email." + +#: wp-includes/class-wp-editor.php:1394 +msgid "Classic Block Keyboard Shortcuts" +msgstr "Classic Block Keyboard Shortcuts" + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:166 +msgid "Sorry, you are not allowed to view autosaves of this post." +msgstr "Sorry, you are not allowed to view autosaves of this post." + +#: wp-includes/js/dist/block-editor.js:26060 +#: wp-includes/js/dist/block-library.js:3057 wp-admin/edit-form-blocks.php:294 +msgid "Start writing or type / to choose a block" +msgstr "Start writing or type / to choose a block" + +#: wp-includes/media.php:4347 wp-includes/js/dist/block-library.js:5987 +#: wp-includes/js/dist/block-library.js:5988 +msgid "Edit image" +msgstr "Edit image" + +#: wp-includes/block-patterns/large-header-button.php:10 +#: wp-includes/block-patterns/large-header.php:10 +#: wp-includes/js/dist/block-library.js:13415 +#: wp-includes/js/dist/block-library.js:13471 +#: wp-includes/js/dist/block-library.js:13517 +#: wp-includes/js/dist/block-library.js:13573 +msgid "Write title…" +msgstr "Write title…" + +#: wp-includes/js/dist/edit-post.js:5434 wp-includes/js/dist/edit-post.js:7123 +#: wp-admin/includes/meta-boxes.php:1545 wp-admin/menu.php:296 +msgid "Discussion" +msgstr "Discussion" + +#: wp-includes/js/dist/blocks.js:6010 wp-admin/options-media.php:100 +msgid "Embeds" +msgstr "Embeds" + +#: wp-includes/js/dist/editor.js:11734 wp-includes/js/dist/editor.js:11739 +#: wp-admin/edit-form-advanced.php:519 wp-admin/edit-form-blocks.php:305 +msgid "Add title" +msgstr "Add title" + +#: wp-includes/js/dist/editor.js:9968 wp-admin/includes/meta-boxes.php:163 +msgid "Visibility:" +msgstr "Visibility:" + +#: wp-includes/media-template.php:514 wp-includes/media-template.php:743 +#: wp-includes/js/dist/editor.js:10136 wp-includes/js/dist/edit-post.js:1838 +#: wp-includes/js/dist/block-library.js:16062 +#: wp-admin/includes/class-wp-privacy-policy-content.php:423 +#: wp-admin/includes/media.php:3333 wp-admin/site-health-info.php:102 +msgid "Copied!" +msgstr "Copied!" + +#: wp-includes/js/dist/editor.js:8788 wp-admin/includes/meta-boxes.php:364 +#: wp-admin/includes/meta-boxes.php:365 +msgid "Submit for Review" +msgstr "Submit for Review" + +#: wp-includes/js/dist/editor.js:7082 wp-admin/includes/meta-boxes.php:1008 +#: wp-admin/includes/media.php:1409 wp-admin/includes/media.php:2568 +#: wp-admin/includes/class-wp-posts-list-table.php:1715 +msgid "Order" +msgstr "Order" + +#: wp-includes/media.php:4345 wp-includes/js/dist/block-library.js:8676 +msgid "Replace image" +msgstr "Replace image" + +#: wp-includes/js/dist/editor.js:7571 wp-admin/includes/meta-boxes.php:801 +msgid "Allow comments" +msgstr "Allow comments" + +#: wp-includes/js/dist/components.js:40107 +#: wp-admin/includes/edit-tag-messages.php:14 +msgid "Item added." +msgstr "Item added." + +#: wp-includes/js/dist/block-editor.js:19629 +#: wp-admin/includes/class-theme-installer-skin.php:248 +#: wp-admin/includes/class-plugin-installer-skin.php:224 +msgid "Current" +msgstr "Current" + +#. translators: Accessibility text. +#. translators: accessibility text +#: wp-login.php:698 wp-includes/widgets/class-wp-widget-custom-html.php:317 +#: wp-includes/media-template.php:167 +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:59 +#: wp-includes/functions.php:7576 +#: wp-includes/class-wp-customize-manager.php:4342 +#: wp-includes/class-wp-customize-manager.php:5664 +#: wp-includes/class-wp-customize-manager.php:5685 +#: wp-includes/js/dist/components.js:37183 wp-includes/js/dist/editor.js:8321 +#: wp-includes/js/dist/edit-post.js:2008 wp-admin/includes/theme.php:827 +#: wp-admin/includes/class-wp-privacy-policy-content.php:360 +#: wp-admin/includes/meta-boxes.php:80 wp-admin/includes/media.php:3223 +#: wp-admin/includes/class-wp-site-health.php:738 +#: wp-admin/includes/class-wp-site-health.php:850 +#: wp-admin/includes/class-wp-site-health.php:1168 +#: wp-admin/includes/class-wp-site-health.php:1405 +#: wp-admin/includes/class-wp-site-health.php:1443 +#: wp-admin/includes/class-wp-site-health.php:1517 +#: wp-admin/includes/class-wp-site-health.php:2131 +#: wp-admin/includes/dashboard.php:1243 wp-admin/includes/dashboard.php:1255 +#: wp-admin/includes/dashboard.php:1268 wp-admin/includes/dashboard.php:1783 +msgid "(opens in a new tab)" +msgstr "(opens in a new tab)" + +#. translators: Abbreviated date/time format, see +#. https://www.php.net/manual/datetime.format.php +#: wp-includes/script-loader.php:363 +msgid "M j, Y g:i a" +msgstr "j M Y g:i a" + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:91 +msgid "ID of the post context." +msgstr "ID of the post context." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:167 +msgid "Invalid block." +msgstr "Invalid block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:210 +msgid "The rendered block." +msgstr "The rendered block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:43 +msgid "Unique registered name for the block." +msgstr "Unique registered name for the block." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:130 +msgid "Sorry, you are not allowed to read blocks as this user." +msgstr "Sorry, you are not allowed to read blocks as this user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:120 +msgid "Sorry, you are not allowed to read blocks of this post." +msgstr "Sorry, you are not allowed to read blocks of this post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:54 +msgid "Attributes for the block." +msgstr "Attributes for the block." + +#: wp-includes/theme.php:4033 +msgid "Whether the theme supports responsive embedded content." +msgstr "Whether the theme supports responsive embedded content." + +#. translators: %s: Duration. +#: wp-includes/script-loader.php:350 +msgid "%s from now" +msgstr "%s from now" + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:431 +msgid "Limit result set to themes assigned one or more statuses." +msgstr "Limit result set to themes assigned one or more statuses." + +#: wp-includes/theme.php:3996 +msgid "Post formats supported." +msgstr "Post formats supported." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:375 +msgid "Features supported by this theme." +msgstr "Features supported by this theme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:368 +msgid "The visibility settings for the taxonomy." +msgstr "The visibility settings for the taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:377 +msgid "Invalid type parameter." +msgstr "Invalid type parameter." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:320 +msgid "Limit results to items of one or more object subtypes." +msgstr "Limit results to items of one or more object subtypes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:313 +msgid "Limit results to items of an object type." +msgstr "Limit results to items of an object type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:274 +msgid "Object subtype." +msgstr "Object subtype." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:267 +msgid "Object type." +msgstr "Object type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:138 +msgid "Internal search handler error." +msgstr "Internal search handler error." + +#. translators: %s: PHP class name. +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:74 +msgid "REST search handlers must extend the %s class." +msgstr "REST search handlers must extend the %s class." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2518 +msgid "The current user can post unfiltered HTML markup and JavaScript." +msgstr "The current user can post unfiltered HTML markup and JavaScript." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2294 +msgid "Version of the content block format used by the object." +msgstr "Version of the content block format used by the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2179 +msgid "Slug automatically generated from the object title." +msgstr "Slug automatically generated from the object title." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:379 +msgid "There is nothing to save. The autosave and the post content are the same." +msgstr "There is nothing to save. The autosave and the post content are the same." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:324 +msgid "Preview link for the post." +msgstr "Preview link for the post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:269 +msgid "There is no autosave revision for this post." +msgstr "There is no autosave revision for this post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2172 +msgid "Permalink template for the object." +msgstr "Permalink template for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:119 +msgid "The ID for the object." +msgstr "The ID for the object." + +#: wp-includes/post.php:1737 wp-admin/edit-form-advanced.php:197 +#: wp-admin/edit-form-advanced.php:200 +msgid "Page updated." +msgstr "Page updated." + +#: wp-includes/post.php:1737 wp-admin/edit-form-advanced.php:182 +#: wp-admin/edit-form-advanced.php:185 +msgid "Post updated." +msgstr "Post updated." + +#: wp-includes/post.php:1736 +msgid "Page scheduled." +msgstr "Page scheduled." + +#: wp-includes/post.php:1736 +msgid "Post scheduled." +msgstr "Post scheduled." + +#: wp-includes/post.php:1735 +msgid "Page reverted to draft." +msgstr "Page reverted to draft." + +#: wp-includes/post.php:1735 +msgid "Post reverted to draft." +msgstr "Post reverted to draft." + +#: wp-includes/post.php:1734 +msgid "Page published privately." +msgstr "Page published privately." + +#: wp-includes/post.php:1734 +msgid "Post published privately." +msgstr "Post published privately." + +#: wp-includes/post.php:1733 wp-admin/edit-form-advanced.php:203 +msgid "Page published." +msgstr "Page published." + +#: wp-includes/post.php:1733 wp-admin/edit-form-advanced.php:188 +msgid "Post published." +msgstr "Post published." + +#. translators: %s: Block name. +#: wp-includes/class-wp-block-type-registry.php:108 +msgid "Block type \"%s\" is not registered." +msgstr "Block type \"%s\" is not registered." + +#. translators: %s: Block name. +#: wp-includes/class-wp-block-type-registry.php:78 +msgid "Block type \"%s\" is already registered." +msgstr "Block type \"%s\" is already registered." + +#: wp-includes/class-wp-block-type-registry.php:71 +msgid "Block type names must contain a namespace prefix. Example: my-plugin/my-custom-block-type" +msgstr "Block type names must contain a namespace prefix. Example: my-plugin/my-custom-block-type" + +#: wp-includes/class-wp-block-type-registry.php:64 +msgid "Block type names must not contain uppercase characters." +msgstr "Block type names must not contain uppercase characters." + +#: wp-includes/class-wp-block-type-registry.php:58 +msgid "Block type names must be strings." +msgstr "Block type names must be strings." + +#: wp-includes/blocks/latest-comments.php:141 +msgid "No comments to show." +msgstr "No comments to show." + +#. translators: 1: author name (inside or tag, based on if they have +#. a URL), 2: post title related to this comment +#: wp-includes/blocks/latest-comments.php:99 +msgid "%1$s on %2$s" +msgstr "%1$s on %2$s" + +#: wp-includes/blocks/archives.php:97 +msgid "No archives to show." +msgstr "No archives to show." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:306 +msgid "The offset number requested is larger than or equal to the number of available revisions." +msgstr "The offset number requested is larger than or equal to the number of available revisions." + +#: wp-includes/user.php:4008 +msgid "Unable to send personal data export confirmation email." +msgstr "Unable to send personal data export confirmation email." + +#. translators: %s: Required disk space in kilobytes. +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1252 +#: wp-admin/includes/ms.php:36 +msgid "Not enough space to upload. %s KB needed." +msgstr "Not enough space to upload. %s KB needed." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2570 +msgid "The current user can assign terms in the %s taxonomy." +msgstr "The current user can assign terms in the %s taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2551 +msgid "The current user can change the author on this post." +msgstr "The current user can change the author on this post." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2572 +msgid "The current user can create terms in the %s taxonomy." +msgstr "The current user can create terms in the %s taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2502 +msgid "The current user can publish this post." +msgstr "The current user can publish this post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2535 +msgid "The current user can sticky this post." +msgstr "The current user can sticky this post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1272 +#: wp-admin/includes/ms.php:45 +msgid "You have used your space quota. Please delete files before uploading." +msgstr "You have used your space quota. Please delete files before uploading." + +#. translators: Privacy data request confirmed notification email subject. 1: +#. Site title, 2: Name of the confirmed action. +#: wp-includes/user.php:3493 +msgid "[%1$s] Action Confirmed: %2$s" +msgstr "[%1$s] Action Confirmed: %2$s" + +#: wp-includes/user.php:3746 +msgid "Thanks for confirming your erasure request." +msgstr "Thanks for confirming your erasure request." + +#: wp-includes/user.php:3743 +msgid "Thanks for confirming your export request." +msgstr "Thanks for confirming your export request." + +#. translators: Do not translate SITENAME, SITEURL, PRIVACY_POLICY_URL; those +#. are placeholders. +#: wp-includes/user.php:3642 +msgid "" +"Howdy,\n" +"\n" +"Your request to erase your personal data on ###SITENAME### has been completed.\n" +"\n" +"If you have any follow-up questions or concerns, please contact the site administrator.\n" +"\n" +"For more information, you can also read our privacy policy: ###PRIVACY_POLICY_URL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"Your request to erase your personal data on ###SITENAME### has been completed.\n" +"\n" +"If you have any follow-up questions or concerns, please contact the site administrator.\n" +"\n" +"For more information, you can also read our Privacy Policy: ###PRIVACY_POLICY_URL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/user.php:3744 +msgid "The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request." +msgstr "The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request." + +#: wp-includes/user.php:3747 +msgid "The site administrator has been notified. You will receive an email confirmation when they erase your data." +msgstr "The site administrator has been notified. You will receive an email confirmation when they erase your data." + +#. translators: Do not translate SITENAME, SITEURL; those are placeholders. +#: wp-includes/user.php:3629 +msgid "" +"Howdy,\n" +"\n" +"Your request to erase your personal data on ###SITENAME### has been completed.\n" +"\n" +"If you have any follow-up questions or concerns, please contact the site administrator.\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"Your request to erase your personal data on ###SITENAME### has been completed.\n" +"\n" +"If you have any follow-up questions or concerns, please contact the site administrator.\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#. translators: Erasure request fulfilled notification email subject. %s: Site +#. title. +#: wp-includes/user.php:3602 +msgid "[%s] Erasure Request Fulfilled" +msgstr "[%s] Erasure Request Fulfilled" + +#. translators: Do not translate SITENAME, USER_EMAIL, DESCRIPTION, MANAGE_URL, +#. SITEURL; those are placeholders. +#: wp-includes/user.php:3439 +msgid "" +"Howdy,\n" +"\n" +"A user data privacy request has been confirmed on ###SITENAME###:\n" +"\n" +"User: ###USER_EMAIL###\n" +"Request: ###DESCRIPTION###\n" +"\n" +"You can view and manage these data privacy requests here:\n" +"\n" +"###MANAGE_URL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"A user data privacy request has been confirmed on ###SITENAME###:\n" +"\n" +"User: ###USER_EMAIL###\n" +"Request: ###DESCRIPTION###\n" +"\n" +"You can view and manage these data privacy requests here:\n" +"\n" +"###MANAGE_URL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#. translators: Confirm privacy data request notification email subject. 1: +#. Site title, 2: Name of the action. +#: wp-includes/user.php:3955 +msgid "[%1$s] Confirm Action: %2$s" +msgstr "[%1$s] Confirm Action: %2$s" + +#: wp-includes/user.php:3841 wp-admin/erase-personal-data.php:54 +#: wp-admin/menu.php:284 +msgid "Erase Personal Data" +msgstr "Erase Personal Data" + +#: wp-includes/comment-template.php:2404 +msgid "Save my name, email, and website in this browser for the next time I comment." +msgstr "Save my name, email, and website in this browser for the next time I comment." + +#: wp-includes/user.php:3193 +msgid "User Description" +msgstr "User Description" + +#: wp-includes/user.php:3189 +msgid "User Display Name" +msgstr "User Display Name" + +#: wp-includes/user.php:3191 +msgid "User First Name" +msgstr "User First Name" + +#: wp-includes/user.php:3183 +msgid "User ID" +msgstr "User ID" + +#: wp-includes/user.php:3192 +msgid "User Last Name" +msgstr "User Last Name" + +#: wp-includes/user.php:3184 +msgid "User Login Name" +msgstr "User Login Name" + +#: wp-includes/user.php:3185 +msgid "User Nice Name" +msgstr "User Nice Name" + +#: wp-includes/user.php:3190 +msgid "User Nickname" +msgstr "User Nickname" + +#: wp-includes/user.php:3188 +msgid "User Registration Date" +msgstr "User Registration Date" + +#: wp-includes/user.php:3187 +msgid "User URL" +msgstr "User URL" + +#: wp-includes/user.php:3149 +msgid "WordPress User" +msgstr "WordPress User" + +#: wp-includes/user.php:3186 +msgid "User Email" +msgstr "User Email" + +#: wp-includes/media.php:4777 +msgid "WordPress Media" +msgstr "WordPress Media" + +#. translators: %d: Comment ID. +#: wp-includes/comment.php:3769 +msgid "Comment %d contains personal data but could not be anonymized." +msgstr "Comment %d contains personal data but could not be anonymised." + +#. translators: %s: Action name. +#: wp-includes/user.php:3845 +msgid "Confirm the \"%s\" action" +msgstr "Confirm the \"%s\" action" + +#: wp-includes/user.php:3838 wp-admin/export-personal-data.php:54 +#: wp-admin/menu.php:283 +msgid "Export Personal Data" +msgstr "Export Personal Data" + +#: wp-includes/user.php:3739 +msgid "The site administrator has been notified and will fulfill your request as soon as possible." +msgstr "The site administrator has been notified and will fulfil your request as soon as possible." + +#. translators: Deleted long text. +#: wp-includes/functions.php:7297 +msgid "This content was deleted by the author." +msgstr "This content was deleted by the author." + +#: wp-login.php:1215 +msgid "User action confirmed." +msgstr "User action confirmed." + +#: wp-includes/post.php:245 +msgid "User Request" +msgstr "User Request" + +#: wp-includes/post.php:244 +msgid "User Requests" +msgstr "User Requests" + +#. translators: Deleted text. +#: wp-includes/functions.php:7293 +msgid "[deleted]" +msgstr "[deleted]" + +#: wp-includes/user.php:3786 +msgid "Invalid action name." +msgstr "Invalid action name." + +#: wp-includes/user.php:3738 +msgid "Action has been confirmed." +msgstr "Action has been confirmed." + +#. translators: Do not translate DESCRIPTION, CONFIRM_URL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-includes/user.php:3904 +msgid "" +"Howdy,\n" +"\n" +"A request has been made to perform the following action on your account:\n" +"\n" +" ###DESCRIPTION###\n" +"\n" +"To confirm this, please click on the following link:\n" +"###CONFIRM_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"A request has been made to perform the following action on your account:\n" +"\n" +" ###DESCRIPTION###\n" +"\n" +"To confirm this, please click on the following link:\n" +"###CONFIRM_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/comment.php:3617 wp-admin/edit-form-comment.php:45 +msgid "Comment Author" +msgstr "Comment Author" + +#: wp-includes/comment.php:3620 +msgid "Comment Author IP" +msgstr "Comment Author IP" + +#: wp-includes/comment.php:3619 +msgid "Comment Author URL" +msgstr "Comment Author URL" + +#: wp-includes/comment.php:3621 +msgid "Comment Author User Agent" +msgstr "Comment Author User Agent" + +#: wp-includes/comment.php:3623 +msgid "Comment Content" +msgstr "Comment Content" + +#: wp-includes/comment.php:3622 +msgid "Comment Date" +msgstr "Comment Date" + +#: wp-includes/comment.php:3624 +msgid "Comment URL" +msgstr "Comment URL" + +#: wp-includes/post.php:467 wp-includes/post.php:990 +msgctxt "request status" +msgid "Completed" +msgstr "Completed" + +#: wp-includes/post.php:437 wp-includes/post.php:988 +msgctxt "request status" +msgid "Confirmed" +msgstr "Confirmed" + +#: wp-includes/post.php:452 wp-includes/post.php:989 +msgctxt "request status" +msgid "Failed" +msgstr "Failed" + +#: wp-includes/post.php:422 wp-includes/post.php:987 +msgctxt "request status" +msgid "Pending" +msgstr "Pending" + +#: wp-includes/comment.php:3582 wp-includes/comment.php:3692 +msgid "WordPress Comments" +msgstr "WordPress Comments" + +#: wp-includes/comment.php:3618 +msgid "Comment Author Email" +msgstr "Comment Author Email" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1554 +msgid "Limit result set to users who are considered authors." +msgstr "Limit result set to users who are considered authors." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:229 +msgid "Sorry, you are not allowed to query users by this parameter." +msgstr "Sorry, you are not allowed to query users by this parameter." + +#: wp-includes/media.php:4302 +#: wp-admin/includes/class-wp-media-list-table.php:153 +msgctxt "media items" +msgid "Mine" +msgstr "Mine" + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:293 +msgid "Whether or not the post type can be viewed." +msgstr "Whether or not the post type can be viewed." + +#: wp-includes/functions.php:3288 +msgid "The link you followed has expired." +msgstr "The link you followed has expired." + +#: wp-includes/script-loader.php:677 wp-includes/script-loader.php:1141 +#: wp-includes/class-wp-xmlrpc-server.php:3953 wp-includes/functions.php:3299 +#: wp-includes/class-wp-customize-manager.php:449 +#: wp-admin/includes/class-custom-image-header.php:775 +#: wp-admin/includes/class-custom-image-header.php:939 +#: wp-admin/includes/class-custom-image-header.php:947 +#: wp-admin/includes/file.php:618 wp-admin/customize.php:79 +#: wp-admin/themes.php:27 wp-admin/themes.php:70 wp-admin/users.php:145 +#: wp-admin/media-upload.php:38 wp-admin/js/tags.js:62 +#: wp-admin/js/updates.js:1901 wp-admin/network/site-users.php:163 +msgid "Something went wrong." +msgstr "Something went wrong." + +#: wp-includes/script-loader.php:1142 +#: wp-includes/class-wp-customize-manager.php:514 wp-admin/edit-tags.php:28 +#: wp-admin/edit-tags.php:85 wp-admin/edit-tags.php:116 +#: wp-admin/edit-tags.php:136 wp-admin/edit-tags.php:172 +#: wp-admin/includes/bookmark.php:31 wp-admin/press-this.php:21 +#: wp-admin/nav-menus.php:25 wp-admin/customize.php:17 +#: wp-admin/customize.php:34 wp-admin/user-new.php:15 wp-admin/user-new.php:22 +#: wp-admin/user-new.php:55 wp-admin/user-new.php:182 wp-admin/themes.php:14 +#: wp-admin/themes.php:42 wp-admin/themes.php:62 wp-admin/edit-comments.php:13 +#: wp-admin/term.php:42 wp-admin/options.php:49 wp-admin/options.php:77 +#: wp-admin/widgets.php:17 wp-admin/users.php:15 wp-admin/post-new.php:60 +#: wp-admin/edit.php:41 wp-admin/media-upload.php:46 +msgid "You need a higher level of permission." +msgstr "You need a higher level of permission." + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4109 +msgid "%s is already customizing this changeset. Do you want to take over?" +msgstr "%s is already customising this changeset. Do you want to take over?" + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4107 +msgid "%s is already customizing this changeset. Please wait until they are done to try customizing. Your latest changes have been autosaved." +msgstr "%s is already customising this changeset. Please wait until they are done to try customising. Your latest changes have been auto-saved." + +#: wp-includes/class-wp-customize-manager.php:4315 +#: wp-admin/includes/file.php:335 +msgid "Update anyway, even though it might break your site?" +msgstr "Update anyway, even though it might break your site?" + +#: wp-includes/wp-db.php:1380 +msgid "The query only expected one placeholder, but an array of multiple placeholders was sent." +msgstr "The query only expected one placeholder, but an array of multiple placeholders was sent." + +#: wp-includes/script-loader.php:1131 +msgctxt "customizer changeset status" +msgid "Scheduled" +msgstr "Scheduled" + +#: wp-includes/customize/class-wp-customize-theme-control.php:243 +#: wp-includes/customize/class-wp-customize-theme-control.php:255 +#: wp-admin/includes/class-wp-theme-install-list-table.php:317 +#: wp-admin/includes/class-wp-theme-install-list-table.php:475 +#: wp-admin/theme-install.php:276 +msgctxt "theme" +msgid "Installed" +msgstr "Installed" + +#. translators: %s: Property of an object. +#: wp-includes/rest-api.php:2098 +msgid "%1$s is not a valid property of Object." +msgstr "%1$s is not a valid property of Object." + +#. translators: %s: URL to Add Themes admin screen. +#: wp-includes/script-loader.php:1180 +msgid "You won’t be able to install new themes from here yet since your install requires SFTP credentials. For now, please add themes in the admin." +msgstr "You won’t be able to install new themes from here yet since your install requires SFTP credentials. For now, please add themes in the admin." + +#. translators: Tab heading when selecting from the most used terms. +#: wp-includes/taxonomy.php:606 +msgctxt "tags" +msgid "Most Used" +msgstr "Most Used" + +#. translators: Tab heading when selecting from the most used terms. +#: wp-includes/taxonomy.php:606 wp-admin/includes/meta-boxes.php:1119 +msgctxt "categories" +msgid "Most Used" +msgstr "Most Used" + +#: wp-includes/class-wp-customize-nav-menus.php:1109 +msgid "Click “Next” to start adding links to your new menu." +msgstr "Click “Next” to start adding links to your new menu." + +#. translators: %s: A list of valid video file extensions. +#: wp-includes/widgets/class-wp-widget-media-video.php:51 +msgid "Sorry, we can’t load the video at the supplied URL. Please check that the URL is for a supported video file (%s) or stream (e.g. YouTube and Vimeo)." +msgstr "Sorry, we can’t load the video at the supplied URL. Please check that the URL is for a supported video file (%s) or stream (e.g. YouTube and Vimeo)." + +#: wp-includes/script-loader.php:1130 +#: wp-includes/class-wp-customize-manager.php:4826 +msgctxt "customizer changeset action/button label" +msgid "Schedule" +msgstr "Schedule" + +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:85 +msgid "+ Create New Menu" +msgstr "+ Create New Menu" + +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:85 +msgid "Create a menu for this location" +msgstr "Create a menu for this location" + +#. translators: 1: fopen(), 2: File name. +#: wp-includes/class-wp-http-streams.php:257 +#: wp-includes/class-wp-http-curl.php:193 +msgid "Could not open handle for %1$s to %2$s." +msgstr "Could not open handle for %1$s to %2$s." + +#: wp-includes/widgets/class-wp-nav-menu-widget.php:26 +msgid "Add a navigation menu to your sidebar." +msgstr "Add a navigation menu to your sidebar." + +#. translators: %s: Display name of the user who has taken over the changeset +#. in customizer. +#: wp-includes/script-loader.php:1155 +msgid "%s has taken over and is currently customizing." +msgstr "%s has taken over and is currently customising." + +#: wp-includes/class-wp-customize-manager.php:4301 +#: wp-admin/includes/post.php:1773 +msgid "Take over" +msgstr "Take over" + +#: wp-includes/class-wp-customize-manager.php:4297 +#: wp-admin/includes/post.php:1690 wp-admin/comment.php:78 +#: wp-admin/comment.php:276 wp-admin/theme-editor.php:376 +#: wp-admin/plugin-editor.php:330 +msgid "Go back" +msgstr "Go back" + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4114 +msgid "%s is already customizing this site. Please wait until they are done to try customizing. Your latest changes have been autosaved." +msgstr "%s is already customising this site. Please wait until they are done to try customising. Your latest changes have been autosaved." + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4116 +msgid "%s is already customizing this site. Do you want to take over?" +msgstr "%s is already customising this site. Do you want to take over?" + +#: wp-includes/class-wp-customize-manager.php:3382 +msgid "No changeset found to take over" +msgstr "No changeset found to take over" + +#: wp-includes/class-wp-customize-manager.php:3371 +msgid "Security check failed." +msgstr "Security check failed." + +#: wp-includes/class-wp-customize-manager.php:2533 +#: wp-includes/class-wp-customize-manager.php:3169 +msgid "Changeset is being edited by other user." +msgstr "Changeset is being edited by other user." + +#: wp-includes/class-wp-customize-manager.php:3391 +msgid "Sorry, you are not allowed to take over." +msgstr "Sorry, you are not allowed to take over." + +#: wp-includes/script-loader.php:1149 +msgid "Looks like something’s gone wrong. Wait a couple seconds, and then try again." +msgstr "Looks like something’s gone wrong. Wait a couple of seconds, and then try again." + +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:66 +msgctxt "menu locations" +msgid "Here’s where this menu appears. If you’d like to change that, pick another location." +msgstr "Here’s where this menu appears. If you’d like to change that, pick another location." + +#. translators: 1: Documentation URL, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:53 +msgctxt "menu locations" +msgid "(If you plan to use a menu widget%3$s, skip this step.)" +msgstr "(If you plan to use a menu widget%3$s, skip this step.)" + +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:48 +msgctxt "menu locations" +msgid "Where do you want this menu to appear?" +msgstr "Where do you want this menu to appear?" + +#: wp-includes/class-wp-customize-nav-menus.php:1123 +msgid "You’ll create a menu, assign it a location, and add menu items like links to pages and categories. If your theme has multiple menu areas, you might need to create more than one." +msgstr "You’ll create a menu, assign it a location, and add menu items like links to pages and categories. If your theme has multiple menu areas, you might need to create more than one." + +#: wp-includes/class-wp-customize-nav-menus.php:1120 +msgid "It doesn’t look like your site has any menus yet. Want to build one? Click the button to start." +msgstr "It doesn’t look like your site has any menus yet. Want to build one? Click the button to start." + +#: wp-includes/class-wp-customize-nav-menus.php:697 +msgctxt "menu locations" +msgid "View All Locations" +msgstr "View All Locations" + +#: wp-includes/class-wp-customize-manager.php:5031 +msgid "While previewing a new theme, you can continue to tailor things like widgets and menus, and explore theme-specific options." +msgstr "While previewing a new theme, you can continue to tailor things like widgets and menus, and explore theme-specific options." + +#: wp-includes/class-wp-customize-manager.php:5030 +msgid "Looking for a theme? You can search or browse the WordPress.org theme directory, install and preview themes, then activate them right here." +msgstr "Looking for a theme? You can search or browse the WordPress.org theme directory, install and preview themes, then activate them right here." + +#: wp-includes/class-wp-customize-nav-menus.php:697 +msgctxt "menu locations" +msgid "View Location" +msgstr "View Location" + +#: wp-includes/customize/class-wp-customize-themes-section.php:97 +#: wp-admin/themes.php:235 wp-admin/themes.php:565 +#: wp-admin/theme-install.php:68 wp-admin/theme-install.php:245 +msgid "No themes found. Try a different search." +msgstr "No themes found. Try a different search." + +#: wp-includes/class-wp-customize-nav-menus.php:683 +msgid "Your theme can display menus in one location. Select which menu you would like to use." +msgstr "Your theme can display menus in one location. Select which menu you would like to use." + +#. translators: %s: Site name. +#: wp-login.php:432 +msgid "Site Name: %s" +msgstr "Site Name: %s" + +#. translators: Login screen title. 1: Login screen name, 2: Network or site +#. name. +#. translators: Admin screen title. 1: Admin screen name, 2: Network or site +#. name. +#: wp-login.php:71 wp-admin/admin-header.php:52 +msgid "%1$s ‹ %2$s — WordPress" +msgstr "%1$s ‹ %2$s — WordPress" + +#. translators: %s: Value type. +#: wp-includes/wp-db.php:1335 +msgid "Unsupported value type (%s)." +msgstr "Unsupported value type (%s)." + +#. translators: %s: register_widget() +#: wp-includes/widgets.php:1169 +msgid "Widgets need to be registered using %s, before they can be displayed." +msgstr "Widgets need to be registered using %s, before they can be displayed." + +#. translators: 1: Number of placeholders, 2: Number of arguments passed. +#: wp-includes/wp-db.php:1395 +msgid "The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d)." +msgstr "The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d)." + +#: wp-includes/widgets/class-wp-widget-media-image.php:342 +msgid "Link to:" +msgstr "Link to:" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:38 +msgid "No images selected" +msgstr "No images selected" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:30 +msgid "Displays an image gallery." +msgstr "Displays an image gallery." + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:28 +#: wp-includes/js/dist/editor.js:7954 wp-includes/js/dist/block-library.js:9158 +#: wp-includes/js/dist/block-library.js:9579 wp-admin/includes/media.php:20 +msgid "Gallery" +msgstr "Gallery" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:333 +msgid "Custom HTML Widget" +msgstr "Custom HTML Widget" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:304 +msgid "Use the Custom HTML widget to add arbitrary HTML code to your widget areas." +msgstr "Use the Custom HTML widget to add arbitrary HTML code to your widget areas." + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-includes/user.php:3049 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the email address on your account changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi ###USERNAME###,\n" +"\n" +"You recently requested to have the email address on your account changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#. translators: %s: New email address. +#: wp-includes/user.php:3119 +msgid "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email." +msgstr "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email." + +#: wp-includes/user.php:3029 +msgid "Error: The email address is already used." +msgstr "Error: the email address is already used." + +#: wp-includes/taxonomy.php:607 +msgid "← Go to Categories" +msgstr "← Go to Categories" + +#: wp-includes/taxonomy.php:142 +msgid "← Go to Link Categories" +msgstr "← Go to Link Categories" + +#: wp-includes/script-loader.php:1177 +msgid "Sorry, you can’t preview new themes when you have changes scheduled or saved as a draft. Please publish your changes, or wait until they publish to preview new themes." +msgstr "Sorry, you can’t preview new themes when you have changes scheduled or saved as a draft. Please publish your changes, or wait until they publish to preview new themes." + +#: wp-includes/script-loader.php:1176 +msgid "Schedule your customization changes to publish (\"go live\") at a future date." +msgstr "Schedule your customisation changes to publish (\"go live\") at a future date." + +#: wp-includes/script-loader.php:1168 +msgid "Homepage and posts page must be different." +msgstr "Homepage and posts page must be different." + +#. translators: %d: Error count. +#: wp-includes/script-loader.php:1163 wp-includes/script-loader.php:1165 +#: wp-includes/widgets/class-wp-widget-custom-html.php:228 +#: wp-includes/widgets/class-wp-widget-custom-html.php:230 +msgid "There is %d error which must be fixed before you can save." +msgid_plural "There are %d errors which must be fixed before you can save." +msgstr[0] "There is %d error which must be fixed before you can save." +msgstr[1] "There are %d errors which must be fixed before you can save." + +#. translators: %s: URL to the Customizer to load the autosaved version. +#: wp-includes/script-loader.php:1157 +msgid "There is a more recent autosave of your changes than the one you are previewing. Restore the autosave" +msgstr "There is a more recent autosave of your changes than the one you are previewing. Restore the autosave" + +#: wp-includes/script-loader.php:1152 +msgid "Reverting unpublished changes…" +msgstr "Reverting unpublished changes…" + +#: wp-includes/script-loader.php:1151 +msgid "Setting up your live preview. This may take a bit." +msgstr "Setting up your live preview. This may take a bit." + +#: wp-includes/script-loader.php:1150 +msgid "Downloading your new theme…" +msgstr "Downloading your new theme…" + +#: wp-includes/script-loader.php:1140 +msgid "Discard changes" +msgstr "Discard changes" + +#: wp-includes/script-loader.php:1133 +msgid "Please save your changes in order to share the preview." +msgstr "Please save your changes in order to share the preview." + +#: wp-includes/script-loader.php:1129 +msgid "Updating" +msgstr "Updating" + +#: wp-includes/script-loader.php:1128 +msgid "Draft Saved" +msgstr "Draft Saved" + +#: wp-includes/script-loader.php:1123 wp-admin/customize.php:189 +msgid "Activate & Publish" +msgstr "Activate & Publish" + +#: wp-includes/script-loader.php:1005 +msgid "Yiddish" +msgstr "Yiddish" + +#: wp-includes/script-loader.php:1004 +msgid "Welsh" +msgstr "Welsh" + +#: wp-includes/script-loader.php:1003 +msgid "Vietnamese" +msgstr "Vietnamese" + +#: wp-includes/script-loader.php:1002 +msgid "Ukrainian" +msgstr "Ukrainian" + +#: wp-includes/script-loader.php:1001 +msgid "Turkish" +msgstr "Turkish" + +#: wp-includes/script-loader.php:1000 +msgid "Thai" +msgstr "Thai" + +#: wp-includes/script-loader.php:999 +msgid "Tagalog" +msgstr "Tagalog" + +#: wp-includes/script-loader.php:998 +msgid "Swedish" +msgstr "Swedish" + +#: wp-includes/script-loader.php:997 +msgid "Swahili" +msgstr "Swahili" + +#: wp-includes/script-loader.php:996 +msgid "Spanish" +msgstr "Spanish" + +#: wp-includes/script-loader.php:995 +msgid "Slovenian" +msgstr "Slovenian" + +#: wp-includes/script-loader.php:994 +msgid "Slovak" +msgstr "Slovak" + +#: wp-includes/script-loader.php:993 +msgid "Serbian" +msgstr "Serbian" + +#: wp-includes/script-loader.php:992 +msgid "Russian" +msgstr "Russian" + +#: wp-includes/script-loader.php:991 +msgid "Romanian" +msgstr "Romanian" + +#: wp-includes/script-loader.php:990 +msgid "Portuguese" +msgstr "Portuguese" + +#: wp-includes/script-loader.php:989 +msgid "Polish" +msgstr "Polish" + +#: wp-includes/script-loader.php:988 +msgid "Persian" +msgstr "Persian" + +#: wp-includes/script-loader.php:987 +msgid "Norwegian" +msgstr "Norwegian" + +#: wp-includes/script-loader.php:986 +msgid "Maltese" +msgstr "Maltese" + +#: wp-includes/script-loader.php:985 +msgid "Malay" +msgstr "Malay" + +#: wp-includes/script-loader.php:984 +msgid "Macedonian" +msgstr "Macedonian" + +#: wp-includes/script-loader.php:983 +msgid "Lithuanian" +msgstr "Lithuanian" + +#: wp-includes/script-loader.php:982 +msgid "Latvian" +msgstr "Latvian" + +#: wp-includes/script-loader.php:981 +msgid "Korean" +msgstr "Korean" + +#: wp-includes/script-loader.php:980 +msgid "Japanese" +msgstr "Japanese" + +#: wp-includes/script-loader.php:979 +msgid "Italian" +msgstr "Italian" + +#: wp-includes/script-loader.php:978 +msgid "Irish" +msgstr "Irish" + +#: wp-includes/script-loader.php:1153 +msgid "Are you sure you want to discard your unpublished changes?" +msgstr "Are you sure you want to discard your unpublished changes?" + +#: wp-includes/script-loader.php:977 +msgid "Indonesian" +msgstr "Indonesian" + +#: wp-includes/script-loader.php:976 +msgid "Icelandic" +msgstr "Icelandic" + +#: wp-includes/script-loader.php:975 +msgid "Hungarian" +msgstr "Hungarian" + +#: wp-includes/script-loader.php:974 +msgid "Hindi" +msgstr "Hindi" + +#: wp-includes/script-loader.php:973 +msgid "Hebrew" +msgstr "Hebrew" + +#: wp-includes/script-loader.php:972 +msgid "Haitian Creole" +msgstr "Haitian Creole" + +#: wp-includes/script-loader.php:971 +msgid "Greek" +msgstr "Greek" + +#: wp-includes/script-loader.php:970 +msgid "German" +msgstr "German" + +#: wp-includes/script-loader.php:969 +msgid "Galician" +msgstr "Galician" + +#: wp-includes/script-loader.php:968 +msgid "French" +msgstr "French" + +#: wp-includes/script-loader.php:966 +msgid "Filipino" +msgstr "Filipino" + +#: wp-includes/script-loader.php:965 +msgid "Estonian" +msgstr "Estonian" + +#: wp-includes/script-loader.php:964 wp-includes/js/dist/block-library.js:24614 +#: wp-admin/includes/ms.php:664 +msgid "English" +msgstr "English" + +#: wp-includes/script-loader.php:963 +msgid "Dutch" +msgstr "Dutch" + +#: wp-includes/script-loader.php:962 +msgid "Danish" +msgstr "Danish" + +#: wp-includes/script-loader.php:961 +msgid "Czech" +msgstr "Czech" + +#: wp-includes/script-loader.php:960 +msgid "Croatian" +msgstr "Croatian" + +#: wp-includes/script-loader.php:959 +msgid "Chinese (Traditional)" +msgstr "Chinese (Traditional)" + +#: wp-includes/script-loader.php:958 +msgid "Chinese (Simplified)" +msgstr "Chinese (Simplified)" + +#: wp-includes/script-loader.php:957 +msgid "Chinese" +msgstr "Chinese" + +#: wp-includes/script-loader.php:956 +msgid "Catalan" +msgstr "Catalan" + +#: wp-includes/script-loader.php:955 +msgid "Bulgarian" +msgstr "Bulgarian" + +#: wp-includes/script-loader.php:954 +msgid "Belarusian" +msgstr "Belarusian" + +#: wp-includes/script-loader.php:953 +msgid "Arabic" +msgstr "Arabic" + +#: wp-includes/script-loader.php:952 +msgid "Albanian" +msgstr "Albanian" + +#: wp-includes/script-loader.php:951 +msgid "Afrikaans" +msgstr "Afrikaans" + +#: wp-includes/script-loader.php:941 +msgid "Live Broadcast" +msgstr "Live Broadcast" + +#: wp-includes/script-loader.php:949 wp-includes/js/dist/block-library.js:24485 +msgid "Chapters" +msgstr "Chapters" + +#: wp-includes/script-loader.php:935 +msgid "You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/" +msgstr "You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/" + +#. translators: %s: register_routes() +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:52 +msgid "Method '%s' must be overridden." +msgstr "Method '%s' must be overridden." + +#: wp-includes/post.php:227 +msgid "oEmbed Response" +msgstr "oEmbed Response" + +#: wp-includes/post.php:226 +msgid "oEmbed Responses" +msgstr "oEmbed Responses" + +#. translators: %s: Post custom field name. +#: wp-includes/post-template.php:1107 +msgctxt "Post custom field name" +msgid "%s:" +msgstr "%s:" + +#. translators: 1: Comment author's name, 2: Comment author's IP address, 3: +#. Comment author's hostname. +#: wp-includes/pluggable.php:1622 wp-includes/pluggable.php:1806 +msgid "Author: %1$s (IP address: %2$s, %3$s)" +msgstr "Author: %1$s (IP address: %2$s, %3$s)" + +#. translators: 1: Trackback/pingback website name, 2: Website IP address, 3: +#. Website hostname. +#: wp-includes/pluggable.php:1594 wp-includes/pluggable.php:1608 +#: wp-includes/pluggable.php:1784 wp-includes/pluggable.php:1795 +msgid "Website: %1$s (IP address: %2$s, %3$s)" +msgstr "Website: %1$s (IP address: %2$s, %3$s)" + +#. translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those +#. are placeholders. +#: wp-includes/ms-functions.php:2923 +msgid "" +"Hi,\n" +"\n" +"This notice confirms that the network admin email address was changed on ###SITENAME###.\n" +"\n" +"The new network admin email address is ###NEW_EMAIL###.\n" +"\n" +"This email has been sent to ###OLD_EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"This notice confirms that the network admin email address was changed on ###SITENAME###.\n" +"\n" +"The new network admin email address is ###NEW_EMAIL###.\n" +"\n" +"This email has been sent to ###OLD_EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-includes/ms-functions.php:2825 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the network admin email address on\n" +"your network changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi ###USERNAME###,\n" +"\n" +"You recently requested to have the network admin email address on\n" +"your network changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/ms-functions.php:197 +msgid "User cannot be added to this site." +msgstr "User cannot be added to this site." + +#: wp-includes/load.php:1557 +msgid "Scrape nonce check failed. Please try again." +msgstr "Scrape nonce check failed. Please try again." + +#. translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those +#. are placeholders. +#: wp-includes/functions.php:7133 +msgid "" +"Hi,\n" +"\n" +"This notice confirms that the admin email address was changed on ###SITENAME###.\n" +"\n" +"The new admin email address is ###NEW_EMAIL###.\n" +"\n" +"This email has been sent to ###OLD_EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Hi,\n" +"\n" +"This notice confirms that the admin email address was changed on ###SITENAME###.\n" +"\n" +"The new admin email address is ###NEW_EMAIL###.\n" +"\n" +"This email has been sent to ###OLD_EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/functions.php:7052 +msgid "Only UUID V4 is supported at this time." +msgstr "Only UUID V4 is supported at this time." + +#: wp-includes/deprecated.php:3960 wp-includes/deprecated.php:3977 +#: wp-admin/press-this.php:74 +msgid "The Press This plugin is required." +msgstr "The Press This plugin is required." + +#. translators: %s: Number of themes displayed. +#: wp-includes/customize/class-wp-customize-themes-section.php:152 +msgid "%s themes" +msgstr "%s themes" + +#. translators: %s: Number of filters selected. +#: wp-includes/customize/class-wp-customize-themes-section.php:136 +msgid "Filter themes (%s)" +msgstr "Filter themes (%s)" + +#: wp-includes/customize/class-wp-customize-themes-section.php:103 +msgid "Search WordPress.org themes" +msgstr "Search WordPress.org themes" + +#: wp-includes/customize/class-wp-customize-theme-control.php:261 +#: wp-includes/customize/class-wp-customize-theme-control.php:263 +#: wp-admin/includes/theme.php:1004 wp-admin/includes/theme.php:1007 +msgid "Install & Preview" +msgstr "Install & Preview" + +#: wp-includes/customize/class-wp-customize-themes-section.php:124 +msgid "Go to theme sources" +msgstr "Go to theme sources" + +#: wp-includes/customize/class-wp-customize-nav-menu-item-setting.php:727 +msgid "Invalid URL." +msgstr "Invalid URL." + +#. translators: %s: "Add Items" button text. +#: wp-includes/customize/class-wp-customize-nav-menu-control.php:46 +msgid "Time to add some links! Click “%s” to start putting pages, categories, and custom links in your menu. Add as many things as you’d like." +msgstr "Time to add some links! Click “%s” to start putting pages, categories, and custom links in your menu. Add as many things as you’d like." + +#: wp-includes/media.php:4350 +#: wp-includes/customize/class-wp-customize-media-control.php:252 +msgid "Choose image" +msgstr "Choose image" + +#: wp-includes/customize/class-wp-customize-media-control.php:241 +msgid "Choose audio" +msgstr "Choose audio" + +#: wp-includes/customize/class-wp-customize-media-control.php:236 +msgid "Change audio" +msgstr "Change audio" + +#: wp-includes/customize/class-wp-customize-media-control.php:235 +#: wp-includes/customize/class-wp-customize-media-control.php:240 +msgid "Select audio" +msgstr "Select audio" + +#. translators: %s: Header height in pixels. +#: wp-includes/customize/class-wp-customize-header-image-control.php:219 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." + +#. translators: %s: Header width in pixels. +#: wp-includes/customize/class-wp-customize-header-image-control.php:213 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." + +#. translators: %s: Header size in pixels. +#: wp-includes/customize/class-wp-customize-header-image-control.php:207 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header size of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header size of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." + +#: wp-includes/customize/class-wp-customize-header-image-control.php:203 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image that matches the size of your video — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Click “Add new image” to upload an image file from your computer. Your theme works best with an image that matches the size of your video — you’ll be able to crop your image once you upload it for a perfect fit." + +#. translators: 1: Month number (01, 02, etc.), 2: Month abbreviation. +#: wp-includes/customize/class-wp-customize-date-time-control.php:204 +#: wp-admin/includes/template.php:822 +msgid "%1$s-%2$s" +msgstr "%1$s-%2$s" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:170 +msgid "Meridian" +msgstr "Meridian" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:167 +#: wp-admin/includes/template.php:829 +msgid "Minute" +msgstr "Minute" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:162 +#: wp-admin/includes/template.php:828 +msgid "Hour" +msgstr "Hour" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:160 +#: wp-includes/js/dist/components.js:35446 +msgid "Time" +msgstr "Time" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:146 +#: wp-includes/js/dist/components.js:35377 wp-admin/includes/template.php:826 +msgid "Day" +msgstr "Day" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:130 +#: wp-includes/js/dist/components.js:35392 wp-admin/includes/template.php:816 +msgid "Month" +msgstr "Month" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:127 +#: wp-includes/js/dist/components.js:35430 +#: wp-admin/includes/ajax-actions.php:2183 +#: wp-admin/includes/class-wp-posts-list-table.php:659 +#: wp-admin/includes/class-wp-posts-list-table.php:1565 +msgid "Date" +msgstr "Date" + +#: wp-includes/class-wp-user.php:748 +msgid "Usage of user levels is deprecated. Use capabilities instead." +msgstr "Usage of user levels is deprecated. Use capabilities instead." + +#. translators: %s: Template. +#: wp-includes/class-wp-theme.php:293 +msgid "The theme defines itself as its parent theme. Please check the %s header." +msgstr "The theme defines itself as its parent theme. Please check the %s header." + +#: wp-includes/class-wp-editor.php:190 wp-includes/class-wp-editor.php:1388 +msgctxt "Name for the Visual editor tab" +msgid "Visual" +msgstr "Visual" + +#: wp-includes/class-wp-customize-nav-menus.php:1127 +msgid "Create New Menu" +msgstr "Create New Menu" + +#: wp-includes/class-wp-customize-nav-menus.php:843 +msgid "New Menu" +msgstr "New Menu" + +#. translators: URL to the Widgets panel of the Customizer. +#: wp-includes/class-wp-customize-nav-menus.php:691 +msgid "If your theme has widget areas, you can also add menus there. Visit the Widgets panel and add a “Navigation Menu widget” to display a menu in a sidebar or footer." +msgstr "If your theme has widget areas, you can also add menus there. Visit the Widgets panel and add a “Navigation Menu widget” to display a menu in a sidebar or footer." + +#: wp-includes/class-wp-customize-nav-menus.php:512 +msgid "If your theme has multiple menus, giving them clear names will help you manage them." +msgstr "If your theme has multiple menus, giving them clear names will help you manage them." + +#. translators: %s: Number of menu locations. +#: wp-includes/class-wp-customize-nav-menus.php:495 +msgid "Your theme can display menus in %s location." +msgid_plural "Your theme can display menus in %s locations." +msgstr[0] "Your theme can display menus in %s location." +msgstr[1] "Your theme can display menus in %s locations." + +#: wp-includes/class-wp-customize-nav-menus.php:492 +msgid "Your theme can display menus in one location." +msgstr "Your theme can display menus in one location." + +#: wp-includes/class-wp-customize-manager.php:5720 +msgid "CSS code" +msgstr "CSS code" + +#. translators: 1: Link to user profile, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-includes/widgets/class-wp-widget-custom-html.php:311 +#: wp-includes/class-wp-customize-manager.php:5679 +msgid "The edit field automatically highlights code syntax. You can disable this in your user profile%3$s to work in plain text mode." +msgstr "The edit field automatically highlights code syntax. You can disable this in your user profile%3$s to work in plain text mode." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:326 +#: wp-includes/class-wp-customize-manager.php:5672 wp-admin/theme-editor.php:36 +#: wp-admin/plugin-editor.php:133 +msgid "Screen reader users: when in forms mode, you may need to press the Esc key twice." +msgstr "Screen reader users: when in forms mode, you may need to press the Esc key twice." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:325 +#: wp-includes/class-wp-customize-manager.php:5671 wp-admin/theme-editor.php:35 +#: wp-admin/plugin-editor.php:132 +msgid "To move away from this area, press the Esc key followed by the Tab key." +msgstr "To move away from this area, press the Esc key followed by the Tab key." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:324 +#: wp-includes/class-wp-customize-manager.php:5670 wp-admin/theme-editor.php:34 +#: wp-admin/plugin-editor.php:131 +msgid "In the editing area, the Tab key enters a tab character." +msgstr "In the editing area, the Tab key enters a tab character." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:322 +#: wp-includes/class-wp-customize-manager.php:5668 wp-admin/theme-editor.php:32 +#: wp-admin/plugin-editor.php:129 +msgid "When using a keyboard to navigate:" +msgstr "When using a keyboard to navigate:" + +#: wp-includes/class-wp-customize-manager.php:5658 +msgid "Add your own CSS code here to customize the appearance and layout of your site." +msgstr "Add your own CSS code here to customise the appearance and layout of your site." + +#: wp-includes/class-wp-customize-manager.php:5610 +#: wp-admin/options-reading.php:86 wp-admin/options-reading.php:87 +msgid "Your homepage displays" +msgstr "Your homepage displays" + +#: wp-includes/class-wp-customize-manager.php:5593 +msgid "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." +msgstr "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." + +#: wp-includes/class-wp-customize-manager.php:5591 +msgid "Homepage Settings" +msgstr "Homepage Settings" + +#. translators: %s: Site icon size in pixels. +#: wp-includes/class-wp-customize-manager.php:5165 +msgid "Site Icons should be square and at least %s pixels." +msgstr "Site Icons should be square and at least %s pixels." + +#: wp-includes/class-wp-customize-manager.php:5163 +msgid "Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. Upload one here!" +msgstr "Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. Upload one here!" + +#: wp-includes/class-wp-customize-manager.php:5059 +msgid "WordPress.org themes" +msgstr "WordPress.org themes" + +#: wp-includes/class-wp-customize-manager.php:5044 +msgid "Installed themes" +msgstr "Installed themes" + +#: wp-includes/script-loader.php:1183 wp-admin/customize.php:192 +#: wp-admin/customize.php:197 wp-admin/edit-form-advanced.php:396 +msgid "Publish Settings" +msgstr "Publish Settings" + +#: wp-includes/class-wp-customize-manager.php:4345 +msgid "Copied" +msgstr "Copied" + +#: wp-includes/class-wp-customize-manager.php:4339 +msgid "Preview Link" +msgstr "Preview Link" + +#: wp-includes/class-wp-customize-manager.php:4336 +msgid "See how changes would look live on your website, and share the preview with people who can't access the Customizer." +msgstr "See how changes would look live on your website, and share the preview with people who can't access the Customiser." + +#: wp-includes/class-wp-customize-manager.php:4334 +msgid "Share Preview Link" +msgstr "Share Preview Link" + +#: wp-includes/class-wp-customize-manager.php:3198 +msgid "Changes trashed successfully." +msgstr "Changes binned successfully." + +#: wp-includes/class-wp-customize-manager.php:3179 +msgid "Changes have already been trashed." +msgstr "Changes have already been binned." + +#: wp-includes/class-wp-customize-manager.php:3158 +#: wp-includes/class-wp-customize-manager.php:3191 +msgid "Unable to trash changes." +msgstr "Unable to bin changes." + +#: wp-includes/class-wp-customize-manager.php:3146 +msgid "No changes saved yet, so there is nothing to trash." +msgstr "No changes saved yet, so there is nothing to bin." + +#: wp-includes/class-wp-customize-manager.php:3136 +msgid "There was an authentication problem. Please reload and try again." +msgstr "There was an authentication problem. Please reload and try again." + +#. translators: %s: Number of invalid settings. +#: wp-includes/script-loader.php:1171 wp-includes/script-loader.php:1173 +#: wp-includes/class-wp-customize-manager.php:2789 +msgid "Unable to save due to %s invalid setting." +msgid_plural "Unable to save due to %s invalid settings." +msgstr[0] "Unable to save due to %s invalid setting." +msgstr[1] "Unable to save due to %s invalid settings." + +#: wp-includes/script-loader.php:1134 +#: wp-includes/class-wp-customize-manager.php:2670 +#: wp-includes/class-wp-customize-manager.php:2685 +msgid "You must supply a future date to schedule." +msgstr "You must supply a future date to schedule." + +#: wp-includes/admin-bar.php:820 +msgid "Edit User" +msgstr "Edit User" + +#: wp-includes/admin-bar.php:774 +msgid "View User" +msgstr "View User" + +#: wp-includes/class-wp-customize-manager.php:2647 +msgid "The previous set of changes has already been published. Please try saving your current set of changes again." +msgstr "The previous set of changes has already been published. Please try saving your current set of changes again." + +#: wp-includes/widgets/class-wp-widget-text.php:498 +msgid "This widget may have contained code that may work better in the “Custom HTML” widget. If you haven’t yet, how about trying that widget instead?" +msgstr "This widget may have contained code that may work better in the “Custom HTML” widget. If you haven’t yet, how about trying that widget instead?" + +#: wp-includes/widgets/class-wp-widget-text.php:551 +msgid "Hey there, looks like you just pasted HTML into the “Visual” tab of the Text widget. You may want to paste your code into the “Text” tab instead. Alternately, try out the new “Custom HTML” widget!" +msgstr "Hey there, looks like you just pasted HTML into the “Visual” tab of the Text widget. You may want to paste your code into the “Text” tab instead. Alternately, try out the new “Custom HTML” widget!" + +#: wp-includes/widgets/class-wp-widget-text.php:550 +msgid "Did you just paste HTML?" +msgstr "Did you just paste HTML?" + +#: wp-includes/widgets/class-wp-widget-text.php:535 +msgid "Did you know there is a “Custom HTML” widget now? You can find it by scanning the list of available widgets on this screen. Check it out to add some custom code to your site!" +msgstr "Did you know there is a “Custom HTML” widget now? You can find it by scanning the list of available widgets on this screen. Check it out to add some custom code to your site!" + +#: wp-includes/widgets/class-wp-widget-text.php:533 +msgid "Did you know there is a “Custom HTML” widget now? You can find it by pressing the “Add a Widget” button and searching for “HTML”. Check it out to add some custom code to your site!" +msgstr "Did you know there is a “Custom HTML” widget now? You can find it by pressing the “Add a Widget” button and searching for “HTML”. Check it out to add some custom code to your site!" + +#: wp-includes/widgets/class-wp-widget-text.php:531 +msgid "New Custom HTML Widget" +msgstr "New Custom HTML Widget" + +#: wp-includes/widgets/class-wp-widget-text.php:35 +msgid "Arbitrary text." +msgstr "Arbitrary text." + +#: wp-includes/widgets/class-wp-widget-text.php:496 +msgid "This widget may contain code that may work better in the “Custom HTML” widget. How about trying that widget instead?" +msgstr "This widget may contain code that may work better in the “Custom HTML” widget. How about trying that widget instead?" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:283 +msgid "Some HTML tags are not permitted, including:" +msgstr "Some HTML tags are not permitted, including:" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:53 +#: wp-includes/js/dist/block-library.js:16457 +msgid "Custom HTML" +msgstr "Custom HTML" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:46 +msgid "Arbitrary HTML code." +msgstr "Arbitrary HTML code." + +#: wp-includes/widgets/class-wp-widget-tag-cloud.php:196 +msgid "Show tag counts" +msgstr "Show tag counts" + +#. translators: %s: Number of items (tags). +#. translators: %s: Number of items. +#. translators: Number of items. +#. translators: %s: Number of comments. +#: wp-includes/category-template.php:862 wp-includes/category-template.php:873 +#: wp-admin/includes/class-wp-list-table.php:876 +#: wp-admin/includes/class-wp-list-table.php:1483 +#: wp-admin/includes/ajax-actions.php:533 +msgid "%s item" +msgid_plural "%s items" +msgstr[0] "%s item" +msgstr[1] "%s items" + +#: wp-includes/widgets/class-wp-widget-media.php:70 +msgctxt "label for button in the media widget" +msgid "Add Media" +msgstr "Add Media" + +#: wp-includes/widgets/class-wp-widget-media-video.php:39 +msgctxt "label for button in the video widget" +msgid "Add Video" +msgstr "Add Video" + +#: wp-includes/widgets/class-wp-widget-media-image.php:39 +msgctxt "label for button in the image widget" +msgid "Add Image" +msgstr "Add Image" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:39 +msgctxt "label for button in the audio widget" +msgid "Add Audio" +msgstr "Add Audio" + +#: wp-includes/media.php:3870 wp-admin/includes/media.php:3293 +msgid "(no author)" +msgstr "(no author)" + +#. translators: %s: URL to Network Settings screen. +#: wp-signup.php:926 +msgid "To change or disable registration go to your Options page." +msgstr "To change or disable registration go to your Options page." + +#: wp-signup.php:919 +msgid "The network currently allows both site and user registrations." +msgstr "The network currently allows both site and user registrations." + +#: wp-signup.php:916 +msgid "The network currently allows user registrations." +msgstr "The network currently allows user registrations." + +#: wp-signup.php:913 +msgid "The network currently allows site registrations." +msgstr "The network currently allows site registrations." + +#: wp-signup.php:910 +msgid "The network currently disallows registrations." +msgstr "The network currently disallows registrations." + +#: wp-signup.php:905 +msgid "Greetings Network Administrator!" +msgstr "Greetings Network Administrator!" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:63 +#: wp-includes/widgets/class-wp-widget-media.php:154 +msgid "Title for the widget" +msgstr "Title for the widget" + +#: wp-includes/widgets/class-wp-widget-media.php:148 +msgid "URL to the media file" +msgstr "URL to the media file" + +#: wp-includes/widgets/class-wp-widget-media.php:141 +msgid "Attachment post ID" +msgstr "Attachment post ID" + +#: wp-includes/widgets/class-wp-widget-media.php:82 +msgid "Looks like this isn’t the correct kind of file. Please link to an appropriate file instead." +msgstr "Looks like this isn’t the correct kind of file. Please link to an appropriate file instead." + +#: wp-includes/widgets/class-wp-widget-media.php:81 +msgid "Media Widget" +msgstr "Media Widget" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media.php:76 +msgid "We can’t find that file. Check your media library and make sure it wasn’t deleted." +msgstr "We can’t find that file. Check your media library and make sure it wasn’t deleted." + +#: wp-includes/widgets/class-wp-widget-media.php:73 +msgid "Add to Widget" +msgstr "Add to Widget" + +#: wp-includes/widgets/class-wp-widget-media.php:69 +msgid "No media selected" +msgstr "No media selected" + +#: wp-includes/widgets/class-wp-widget-media.php:60 +msgid "A media item." +msgstr "A media item." + +#. translators: %s: Video extension. +#: wp-includes/widgets/class-wp-widget-media-video.php:98 +msgid "URL to the %s video source file" +msgstr "URL to the %s video source file" + +#: wp-includes/widgets/class-wp-widget-media-video.php:49 +msgid "Video Widget" +msgstr "Video Widget" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media-video.php:44 +msgid "We can’t find that video. Check your media library and make sure it wasn’t deleted." +msgstr "We can’t find that video. Check your media library and make sure it wasn’t deleted." + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media.php:80 +msgid "Media Widget (%d)" +msgid_plural "Media Widget (%d)" +msgstr[0] "Media Widget (%d)" +msgstr[1] "Media Widget (%d)" + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media-video.php:48 +msgid "Video Widget (%d)" +msgid_plural "Video Widget (%d)" +msgstr[0] "Video Widget (%d)" +msgstr[1] "Video Widget (%d)" + +#: wp-includes/widgets/class-wp-widget-media.php:72 +msgctxt "label for button in the media widget; should preferably not be longer than ~13 characters long" +msgid "Edit Media" +msgstr "Edit Media" + +#: wp-includes/widgets/class-wp-widget-media.php:71 +msgctxt "label for button in the media widget; should preferably not be longer than ~13 characters long" +msgid "Replace Media" +msgstr "Replace Media" + +#: wp-includes/widgets/class-wp-widget-media-video.php:30 +msgid "Displays a video from the media library or from YouTube, Vimeo, or another provider." +msgstr "Displays a video from the media library or from YouTube, Vimeo, or another provider." + +#: wp-includes/widgets/class-wp-widget-media-image.php:49 +msgid "Image Widget" +msgstr "Image Widget" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media-image.php:44 +msgid "We can’t find that image. Check your media library and make sure it wasn’t deleted." +msgstr "We can’t find that image. Check your media library and make sure it wasn’t deleted." + +#: wp-includes/widgets/class-wp-widget-media-image.php:30 +msgid "Displays an image." +msgstr "Displays an image." + +#: wp-includes/widgets/class-wp-widget-media-image.php:354 +#: wp-includes/widgets/class-wp-widget-media-audio.php:197 +#: wp-includes/widgets/class-wp-widget-media-video.php:240 +msgid "Unable to preview media due to an unknown error." +msgstr "Unable to preview media due to an unknown error." + +#. translators: %s: Audio extension. +#: wp-includes/widgets/class-wp-widget-media-audio.php:87 +msgid "URL to the %s audio source file" +msgstr "URL to the %s audio source file" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:50 +msgid "Looks like this isn’t the correct kind of file. Please link to an audio file instead." +msgstr "Looks like this isn’t the correct kind of file. Please link to an audio file instead." + +#: wp-includes/widgets/class-wp-widget-media-audio.php:49 +msgid "Audio Widget" +msgstr "Audio Widget" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media-audio.php:44 +msgid "We can’t find that audio file. Check your media library and make sure it wasn’t deleted." +msgstr "We can’t find that audio file. Check your media library and make sure it wasn’t deleted." + +#: wp-includes/widgets/class-wp-widget-media-audio.php:38 +#: wp-includes/customize/class-wp-customize-media-control.php:239 +msgid "No audio selected" +msgstr "No audio selected" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:30 +msgid "Displays an audio player." +msgstr "Displays an audio player." + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media-image.php:48 +msgid "Image Widget (%d)" +msgid_plural "Image Widget (%d)" +msgstr[0] "Image Widget (%d)" +msgstr[1] "Image Widget (%d)" + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media-audio.php:48 +msgid "Audio Widget (%d)" +msgid_plural "Audio Widget (%d)" +msgstr[0] "Audio Widget (%d)" +msgstr[1] "Audio Widget (%d)" + +#: wp-includes/widgets/class-wp-widget-media-video.php:41 +msgctxt "label for button in the video widget; should preferably not be longer than ~13 characters long" +msgid "Edit Video" +msgstr "Edit Video" + +#: wp-includes/widgets/class-wp-widget-media-video.php:40 +msgctxt "label for button in the video widget; should preferably not be longer than ~13 characters long" +msgid "Replace Video" +msgstr "Replace Video" + +#: wp-includes/widgets/class-wp-widget-media-image.php:41 +msgctxt "label for button in the image widget; should preferably not be longer than ~13 characters long" +msgid "Edit Image" +msgstr "Edit Image" + +#: wp-includes/widgets/class-wp-widget-media-image.php:40 +msgctxt "label for button in the image widget; should preferably not be longer than ~13 characters long" +msgid "Replace Image" +msgstr "Replace Image" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:41 +msgctxt "label for button in the audio widget; should preferably not be longer than ~13 characters long" +msgid "Edit Audio" +msgstr "Edit Audio" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:40 +msgctxt "label for button in the audio widget; should preferably not be longer than ~13 characters long" +msgid "Replace Audio" +msgstr "Replace Audio" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:39 +msgctxt "label for button in the gallery widget; should not be longer than ~13 characters long" +msgid "Add Images" +msgstr "Add Images" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:41 +msgctxt "label for button in the gallery widget; should not be longer than ~13 characters long" +msgid "Edit Gallery" +msgstr "Edit Gallery" + +#. translators: 1: Parameter, 2: Maximum number. +#: wp-includes/rest-api.php:2290 +msgid "%1$s must be less than or equal to %2$d" +msgstr "%1$s must be less than or equal to %2$d" + +#. translators: 1: Parameter, 2: Maximum number. +#: wp-includes/rest-api.php:2287 +msgid "%1$s must be less than %2$d" +msgstr "%1$s must be less than %2$d" + +#. translators: 1: Parameter, 2: Minimum number. +#: wp-includes/rest-api.php:2282 +msgid "%1$s must be greater than or equal to %2$d" +msgstr "%1$s must be greater than or equal to %2$d" + +#. translators: 1: Parameter, 2: Minimum number. +#: wp-includes/rest-api.php:2279 +msgid "%1$s must be greater than %2$d" +msgstr "%1$s must be greater than %2$d" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1538 +msgid "Limit result set to users with one or more specific slugs." +msgstr "Limit result set to users with one or more specific slugs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1076 +msgid "Limit result set to terms with one or more specific slugs." +msgstr "Limit result set to terms with one or more specific slugs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:312 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:354 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:160 +msgid "The page number requested is larger than the number of pages available." +msgstr "The page number requested is larger than the number of pages available." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:237 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:174 +msgid "You need to define an include parameter to order by include." +msgstr "You need to define an include parameter to order by include." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:317 +msgid "All features, supported by the post type." +msgstr "All features, supported by the post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:85 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:107 +msgid "The password for the parent post of the comment (if the post is password protected)." +msgstr "The password for the parent post of the comment (if the post is password protected)." + +#: wp-includes/post.php:1729 +msgctxt "page" +msgid "Use as featured image" +msgstr "Use as featured image" + +#: wp-includes/post.php:1729 +msgctxt "post" +msgid "Use as featured image" +msgstr "Use as featured image" + +#: wp-includes/post.php:1728 +msgctxt "page" +msgid "Remove featured image" +msgstr "Remove featured image" + +#: wp-includes/post.php:1728 +msgctxt "post" +msgid "Remove featured image" +msgstr "Remove featured image" + +#: wp-includes/post.php:1727 +msgctxt "page" +msgid "Set featured image" +msgstr "Set featured image" + +#: wp-includes/post.php:1727 +msgctxt "post" +msgid "Set featured image" +msgstr "Set featured image" + +#. translators: 1: $sanitize_callback, 2: register_setting() +#: wp-includes/option.php:2377 +msgid "%1$s is deprecated. The callback from %2$s is used instead." +msgstr "%1$s is deprecated. The callback from %2$s is used instead." + +#: wp-includes/post.php:1726 +msgctxt "page" +msgid "Featured image" +msgstr "Featured image" + +#: wp-includes/post.php:1726 +msgctxt "post" +msgid "Featured image" +msgstr "Featured image" + +#: wp-includes/media.php:4306 +msgid "" +"You are about to permanently delete these items from your site.\n" +"This action cannot be undone.\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"You are about to permanently delete these items from your site.\n" +"This action cannot be undone.\n" +" 'Cancel' to stop, 'OK' to delete." + +#: wp-includes/media.php:4305 +msgid "" +"You are about to permanently delete this item from your site.\n" +"This action cannot be undone.\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"You are about to permanently delete this item from your site.\n" +"This action cannot be undone.\n" +" 'Cancel' to stop, 'OK' to delete." + +#. translators: 1: Suggested width number, 2: Suggested height number. +#: wp-includes/media-template.php:296 wp-includes/media.php:4357 +msgid "Suggested image dimensions: %1$s by %2$s pixels." +msgstr "Suggested image dimensions: %1$s by %2$s pixels." + +#: wp-includes/script-loader.php:852 wp-includes/functions.php:2678 +#: wp-includes/js/dist/media-utils.js:1146 wp-admin/includes/file.php:857 +msgid "Sorry, this file type is not permitted for security reasons." +msgstr "Sorry, this file type is not permitted for security reasons." + +#: wp-includes/comment.php:3465 +msgid "Sorry, comments are not allowed for this item." +msgstr "Sorry, comments are not allowed for this item." + +#: wp-includes/class-wp-oembed-controller.php:149 +msgid "Sorry, you are not allowed to make proxied oEmbed requests." +msgstr "Sorry, you are not allowed to make proxied oEmbed requests." + +#: wp-includes/class-wp-oembed-controller.php:98 +msgid "Whether to perform an oEmbed discovery request for unsanctioned providers." +msgstr "Whether to perform an oEmbed discovery request for unsanctioned providers." + +#: wp-includes/class-wp-oembed-controller.php:93 +msgid "The maximum height of the embed frame in pixels." +msgstr "The maximum height of the embed frame in pixels." + +#: wp-includes/class-wp-oembed-controller.php:87 +msgid "The maximum width of the embed frame in pixels." +msgstr "The maximum width of the embed frame in pixels." + +#: wp-includes/class-wp-oembed-controller.php:78 +msgid "The oEmbed format to use." +msgstr "The oEmbed format to use." + +#: wp-includes/class-wp-oembed-controller.php:44 +#: wp-includes/class-wp-oembed-controller.php:72 +msgid "The URL of the resource for which to fetch oEmbed data." +msgstr "The URL of the resource for which to fetch oEmbed data." + +#: wp-includes/class-wp-editor.php:1273 +msgctxt "Short for blue in RGB" +msgid "B" +msgstr "B" + +#: wp-includes/class-wp-editor.php:1272 +msgctxt "Short for green in RGB" +msgid "G" +msgstr "G" + +#: wp-includes/class-wp-editor.php:1271 +msgctxt "Short for red in RGB" +msgid "R" +msgstr "R" + +#: wp-includes/class-wp-editor.php:1230 +msgid "Insert/edit media" +msgstr "Insert/edit media" + +#: wp-includes/class-wp-editor.php:1227 +msgid "Insert/edit code sample" +msgstr "Insert/edit code sample" + +#: wp-includes/class-wp-editor.php:1226 wp-admin/includes/privacy-tools.php:438 +#: wp-admin/includes/class-wp-privacy-policy-content.php:435 +msgid "Table of Contents" +msgstr "Table of Contents" + +#: wp-includes/class-wp-editor.php:1224 +msgid "Date/time" +msgstr "Date/time" + +#: wp-includes/class-wp-editor.php:1200 +msgctxt "Id for link anchor (TinyMCE)" +msgid "Id" +msgstr "ID" + +#: wp-includes/class-wp-editor.php:1199 +msgid "Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores." +msgstr "ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores." + +#: wp-includes/class-wp-customize-widgets.php:782 +msgid "You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages." +msgstr "You can navigate to other pages on your site while using the Customiser to view and edit the widgets displayed on those pages." + +#. translators: %s: The total number of widget areas registered. +#: wp-includes/class-wp-customize-widgets.php:758 +msgid "Your theme has %s widget area, but this particular page doesn’t display it." +msgid_plural "Your theme has %s widget areas, but this particular page doesn’t display them." +msgstr[0] "Your theme has %s widget area, but this particular page doesn’t display it." +msgstr[1] "Your theme has %s widget areas, but this particular page doesn’t display them." + +#: wp-includes/class-wp-customize-widgets.php:749 +msgid "Your theme has 1 widget area, but this particular page doesn’t display it." +msgstr "Your theme has 1 widget area, but this particular page doesn’t display it." + +#. translators: %s: The number of other widget areas registered but not +#. rendered. +#: wp-includes/class-wp-customize-widgets.php:734 +msgid "Your theme has %s other widget area, but this particular page doesn’t display it." +msgid_plural "Your theme has %s other widget areas, but this particular page doesn’t display them." +msgstr[0] "Your theme has %s other widget area, but this particular page doesn’t display it." +msgstr[1] "Your theme has %s other widget areas, but this particular page doesn’t display them." + +#: wp-includes/class-wp-customize-widgets.php:725 +msgid "Your theme has 1 other widget area, but this particular page doesn’t display it." +msgstr "Your theme has 1 other widget area, but this particular page doesn’t display it." + +#: wp-includes/option.php:2060 +msgid "This address is used for admin purposes, like new user notification." +msgstr "This address is used for admin purposes, like new user notification." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:102 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:925 +msgid "Unique identifier for the term." +msgstr "Unique identifier for the term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:128 +msgid "Required to be true, as terms do not support trashing." +msgstr "Required to be true, as terms do not support binning." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:58 +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:341 +msgid "An alphanumeric identifier for the taxonomy." +msgstr "An alphanumeric identifier for the taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:122 +msgid "Required to be true, as revisions do not support trashing." +msgstr "Required to be true, as revisions do not support binning." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:332 +msgid "REST base route for the post type." +msgstr "REST base route for the post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:58 +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:311 +msgid "An alphanumeric identifier for the post type." +msgstr "An alphanumeric identifier for the post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:299 +msgid "Human-readable labels for the post type for various contexts." +msgstr "Human-readable labels for the post type for various contexts." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:287 +msgid "Whether or not the post type should have children." +msgstr "Whether or not the post type should have children." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:281 +msgid "A human-readable description of the post type." +msgstr "A human-readable description of the post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:275 +msgid "All capabilities used by the post type." +msgstr "All capabilities used by the post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:58 +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:338 +msgid "An alphanumeric identifier for the status." +msgstr "An alphanumeric identifier for the status." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1575 +msgid "Limit response to comments published before a given ISO8601 compliant date." +msgstr "Limit response to comments published before a given ISO8601 compliant date." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1546 +msgid "Limit response to comments published after a given ISO8601 compliant date." +msgstr "Limit response to comments published after a given ISO8601 compliant date." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1464 +msgid "Avatar URLs for the user." +msgstr "Avatar URLs for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1417 +msgid "Roles assigned to the user." +msgstr "Roles assigned to the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1394 +msgid "The nickname for the user." +msgstr "The nickname for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1388 +msgid "Locale for the user." +msgstr "Locale for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1381 +msgid "Author URL of the user." +msgstr "Author URL of the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1376 +msgid "Description of the user." +msgstr "Description of the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1370 +msgid "URL of the user." +msgstr "URL of the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1355 +msgid "Last name for the user." +msgstr "Last name for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1347 +msgid "First name for the user." +msgstr "First name for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1339 +msgid "Display name for the user." +msgstr "Display name for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1330 +msgid "Login name for the user." +msgstr "Login name for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:860 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:907 +msgid "The user cannot be deleted." +msgstr "The user cannot be deleted." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:567 +msgid "Error creating new user." +msgstr "Error creating new user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:979 +msgid "The parent term ID." +msgstr "The parent term ID." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:949 +msgid "HTML title for the term." +msgstr "HTML title for the term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:942 +msgid "URL of the term." +msgstr "URL of the term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:687 +msgid "The term cannot be deleted." +msgstr "The term cannot be deleted." + +#: wp-includes/class-wp-xmlrpc-server.php:2175 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:432 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:569 +msgid "Cannot set parent term, taxonomy is not hierarchical." +msgstr "Cannot set parent term, taxonomy is not hierarchical." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:73 +msgid "Sorry, you are not allowed to view themes." +msgstr "Sorry, you are not allowed to view themes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:324 +msgid "Term does not exist." +msgstr "Term does not exist." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:335 +msgid "The title for the taxonomy." +msgstr "The title for the taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:353 +msgid "Types associated with the taxonomy." +msgstr "Types associated with the taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:305 +msgid "The title for the post type." +msgstr "The title for the post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:149 +msgid "Cannot view post type." +msgstr "Cannot view post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:302 +msgid "The title for the status." +msgstr "The title for the status." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:154 +msgid "Cannot view status." +msgstr "Cannot view status." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:144 +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:202 +msgid "Invalid status." +msgstr "Invalid status." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:903 +msgid "URL to the original attachment file." +msgstr "URL to the original attachment file." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:883 +msgid "The attachment MIME type." +msgstr "The attachment MIME type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:875 +msgid "Attachment type." +msgstr "Attachment type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:852 +msgid "The attachment description." +msgstr "The attachment description." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:829 +msgid "The attachment caption." +msgstr "The attachment caption." + +#: wp-includes/option.php:2137 +msgid "Default post category." +msgstr "Default post category." + +#: wp-includes/option.php:2027 +msgid "Site tagline." +msgstr "Site tagline." + +#. translators: Theme author name. +#: wp-includes/customize/class-wp-customize-theme-control.php:88 +msgctxt "theme author" +msgid "By %s" +msgstr "By %s" + +#. translators: New user notification email subject. 1: Network title, 2: New +#. user login. +#: wp-includes/ms-functions.php:1128 +msgctxt "New user notification email subject" +msgid "[%1$s] Activate %2$s" +msgstr "[%1$s] Activate %2$s" + +#. translators: New site notification email subject. 1: Network title, 2: New +#. site URL. +#: wp-includes/ms-functions.php:1016 +msgctxt "New site notification email subject" +msgid "[%1$s] Activate %2$s" +msgstr "[%1$s] Activate %2$s" + +#: wp-includes/blocks/rss.php:19 wp-includes/widgets.php:1525 +#: wp-includes/widgets.php:1648 +msgid "RSS Error:" +msgstr "RSS Error:" + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:578 +msgid "Cannot create a comment with that type." +msgstr "Cannot create a comment with that type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:733 +msgid "Invalid slug." +msgstr "Invalid slug." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:597 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:853 +msgid "Invalid comment content." +msgstr "Invalid comment content." + +#: wp-includes/rest-api/class-wp-rest-server.php:405 +msgid "Invalid JSONP callback function." +msgstr "Invalid JSONP callback function." + +#: wp-includes/post.php:4199 +msgid "Invalid page template." +msgstr "Invalid page template." + +#: wp-includes/script-loader.php:1184 wp-includes/rest-api.php:2251 +#: wp-includes/post.php:3842 wp-admin/includes/post.php:188 +msgid "Invalid date." +msgstr "Invalid date." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:717 +#: wp-includes/rest-api.php:2257 wp-includes/user.php:3782 +#: wp-admin/network/site-new.php:96 +msgid "Invalid email address." +msgstr "Invalid email address." + +#: wp-includes/theme.php:1593 +msgid "Video is playing." +msgstr "Video is playing." + +#: wp-includes/theme.php:1592 +msgid "Video is paused." +msgstr "Video is paused." + +#: wp-includes/theme.php:2183 +msgctxt "Theme starter content" +msgid "Archives" +msgstr "Archives" + +#: wp-includes/theme.php:2335 +msgctxt "Theme starter content" +msgid "This is an example of a homepage section. Homepage sections can be any page other than the homepage itself, including the page that shows your latest blog posts." +msgstr "This is an example of a homepage section. Homepage sections can be any page other than the homepage itself, including the page that shows your latest blog posts." + +#: wp-includes/theme.php:2327 +msgctxt "Theme starter content" +msgid "News" +msgstr "News" + +#: wp-includes/theme.php:2318 +msgctxt "Theme starter content" +msgid "This is a page with some basic contact information, such as an address and phone number. You might also try a plugin to add a contact form." +msgstr "This is a page with some basic contact information, such as an address and phone number. You might also try a plugin to add a contact form." + +#: wp-includes/theme.php:2310 +msgctxt "Theme starter content" +msgid "You might be an artist who would like to introduce yourself and your work here or maybe you’re a business with a mission to describe." +msgstr "You might be an artist who would like to introduce yourself and your work here or maybe you’re a business with a mission to describe." + +#: wp-includes/theme.php:2302 +msgctxt "Theme starter content" +msgid "Welcome to your site! This is your homepage, which is what most visitors will see when they come to your site for the first time." +msgstr "Welcome to your site! This is your homepage, which is what most visitors will see when they come to your site for the first time." + +#: wp-includes/theme.php:2213 +msgctxt "Theme starter content" +msgid "Recent Posts" +msgstr "Recent Posts" + +#: wp-includes/theme.php:2207 +msgctxt "Theme starter content" +msgid "Recent Comments" +msgstr "Recent Comments" + +#: wp-includes/theme.php:2201 +msgctxt "Theme starter content" +msgid "Meta" +msgstr "Meta" + +#: wp-includes/theme.php:2189 +msgctxt "Theme starter content" +msgid "Calendar" +msgstr "Calendar" + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:811 +msgid "Sorry, you are not allowed to change the comment type." +msgstr "Sorry, you are not allowed to change the comment type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1208 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1222 +#: wp-admin/includes/user.php:62 wp-admin/users.php:123 +#: wp-admin/network/site-users.php:151 +msgid "Sorry, you are not allowed to give users that role." +msgstr "Sorry, you are not allowed to give users that role." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:212 +msgid "Sorry, you are not allowed to order users by this parameter." +msgstr "Sorry, you are not allowed to order users by this parameter." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:196 +msgid "Sorry, you are not allowed to filter users by role." +msgstr "Sorry, you are not allowed to filter users by role." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:175 +msgid "Sorry, you are not allowed to view revisions of this post." +msgstr "Sorry, you are not allowed to view revisions of this post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:525 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:533 +msgid "Sorry, you are not allowed to create a comment on this post." +msgstr "Sorry, you are not allowed to create a comment on this post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:507 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:517 +msgid "Sorry, you are not allowed to create this comment without a post." +msgstr "Sorry, you are not allowed to create this comment without a post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:134 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:405 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:541 +msgid "Sorry, you are not allowed to read the post for this comment." +msgstr "Sorry, you are not allowed to read the post for this comment." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:397 +msgid "Sorry, you are not allowed to read this comment." +msgstr "Sorry, you are not allowed to read this comment." + +#. translators: %s: Request parameter. +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:479 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:489 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:499 +msgid "Sorry, you are not allowed to edit '%s' for comments." +msgstr "Sorry, you are not allowed to edit '%s' for comments." + +#: wp-includes/class-wp-xmlrpc-server.php:3680 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:934 +msgid "Sorry, you are not allowed to delete this comment." +msgstr "Sorry, you are not allowed to delete this comment." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:140 +msgid "Sorry, you are not allowed to read comments without a post." +msgstr "Sorry, you are not allowed to read comments without a post." + +#: wp-includes/theme.php:2292 +msgctxt "Theme starter content" +msgid "YouTube" +msgstr "YouTube" + +#: wp-includes/theme.php:2280 +msgctxt "Theme starter content" +msgid "Pinterest" +msgstr "Pinterest" + +#: wp-includes/theme.php:2276 +msgctxt "Theme starter content" +msgid "LinkedIn" +msgstr "LinkedIn" + +#: wp-includes/theme.php:2268 +msgctxt "Theme starter content" +msgid "GitHub" +msgstr "GitHub" + +#: wp-includes/theme.php:2264 +msgctxt "Theme starter content" +msgid "Foursquare" +msgstr "Foursquare" + +#: wp-includes/theme.php:2175 +msgctxt "Theme starter content" +msgid "This may be a good place to introduce yourself and your site or include some credits." +msgstr "This may be a good place to introduce yourself and your site or include some credits." + +#: wp-includes/theme.php:2174 +msgctxt "Theme starter content" +msgid "About This Site" +msgstr "About This Site" + +#. translators: %s: Custom field key. +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:225 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:267 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:362 +msgid "Sorry, you are not allowed to edit the %s custom field." +msgstr "Sorry, you are not allowed to edit the %s custom field." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:561 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:734 +msgid "Sorry, you are not allowed to assign the provided terms." +msgstr "Sorry, you are not allowed to assign the provided terms." + +#: wp-includes/class-wp-xmlrpc-server.php:1341 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:545 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:726 +msgid "Sorry, you are not allowed to make posts sticky." +msgstr "Sorry, you are not allowed to make posts sticky." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:104 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:144 +msgid "Reassign the deleted user's posts and links to this user ID." +msgstr "Reassign the deleted user's posts and links to this user ID." + +#: wp-includes/script-loader.php:1158 +msgid "This theme doesn’t support video headers on this page. Navigate to the front page or another page that supports video headers." +msgstr "This theme doesn’t support video headers on this page. Navigate to the front page or another page that supports video headers." + +#: wp-includes/widgets/class-wp-widget-media-video.php:38 +#: wp-includes/customize/class-wp-customize-media-control.php:229 +msgid "No video selected" +msgstr "No video selected" + +#: wp-includes/customize/class-wp-customize-media-control.php:225 +#: wp-includes/customize/class-wp-customize-media-control.php:230 +msgid "Select video" +msgstr "Select video" + +#: wp-includes/customize/class-wp-customize-media-control.php:226 +msgid "Change video" +msgstr "Change video" + +#: wp-includes/customize/class-wp-customize-media-control.php:231 +msgid "Choose video" +msgstr "Choose video" + +#: wp-includes/theme.php:2332 +msgctxt "Theme starter content" +msgid "A homepage section" +msgstr "A homepage section" + +#: wp-includes/theme.php:2323 +msgctxt "Theme starter content" +msgid "Blog" +msgstr "Blog" + +#: wp-includes/theme.php:2272 +msgctxt "Theme starter content" +msgid "Instagram" +msgstr "Instagram" + +#: wp-includes/theme.php:2315 +msgctxt "Theme starter content" +msgid "Contact" +msgstr "Contact" + +#: wp-includes/theme.php:2307 +msgctxt "Theme starter content" +msgid "About" +msgstr "About" + +#: wp-includes/theme.php:2226 wp-includes/theme.php:2299 +msgctxt "Theme starter content" +msgid "Home" +msgstr "Home" + +#: wp-includes/theme.php:2256 +msgctxt "Theme starter content" +msgid "Email" +msgstr "Email" + +#: wp-includes/theme.php:2284 +msgctxt "Theme starter content" +msgid "Twitter" +msgstr "Twitter" + +#: wp-includes/theme.php:2260 +msgctxt "Theme starter content" +msgid "Facebook" +msgstr "Facebook" + +#: wp-includes/theme.php:2288 +msgctxt "Theme starter content" +msgid "Yelp" +msgstr "Yelp" + +#: wp-includes/theme.php:2163 +msgctxt "Theme starter content" +msgid "Hours" +msgstr "Hours" + +#: wp-includes/theme.php:2162 +msgctxt "Theme starter content" +msgid "123 Main Street" +msgstr "123 Main Street" + +#: wp-includes/theme.php:2195 +msgctxt "Theme starter content" +msgid "Categories" +msgstr "Categories" + +#: wp-includes/theme.php:2219 +msgctxt "Theme starter content" +msgid "Search" +msgstr "Search" + +#: wp-includes/theme.php:2162 +msgctxt "Theme starter content" +msgid "New York, NY 10001" +msgstr "London EC1 4UK" + +#: wp-includes/theme.php:2164 +msgctxt "Theme starter content" +msgid "Saturday & Sunday: 11:00AM–3:00PM" +msgstr "Saturday & Sunday: 11:00–15:00" + +#: wp-includes/theme.php:2164 +msgctxt "Theme starter content" +msgid "Monday–Friday: 9:00AM–5:00PM" +msgstr "Monday–Friday: 09:00–17:00" + +#: wp-includes/theme.php:2161 +msgctxt "Theme starter content" +msgid "Address" +msgstr "Address" + +#: wp-includes/theme.php:2157 +msgctxt "Theme starter content" +msgid "Find Us" +msgstr "Find US" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1286 +msgid "Passwords cannot be empty." +msgstr "Passwords cannot be empty." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:178 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:542 +msgid "Invalid user parameter(s)." +msgstr "Invalid user parameter(s)." + +#. translators: %s: The '\' character. +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1296 +msgid "Passwords cannot contain the \"%s\" character." +msgstr "Passwords cannot contain the \"%s\" character." + +#: wp-includes/script-loader.php:1147 +msgctxt "label for hide controls button without length constraints" +msgid "Show Controls" +msgstr "Show Controls" + +#: wp-includes/script-loader.php:1146 wp-admin/customize.php:245 +msgctxt "label for hide controls button without length constraints" +msgid "Hide Controls" +msgstr "Hide Controls" + +#: wp-includes/media-template.php:396 +msgid "Document Preview" +msgstr "Document Preview" + +#: wp-includes/class-wp-customize-manager.php:5292 +msgid "Header Media" +msgstr "Header Media" + +#. translators: %s: Add New Page label. +#. translators: %s: Add New taxonomy label. +#: wp-includes/class-wp-customize-control.php:631 +#: wp-admin/includes/meta-boxes.php:636 +msgid "+ %s" +msgstr "+ %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:362 +msgid "REST base route for the taxonomy." +msgstr "REST base route for the taxonomy." + +#: wp-includes/l10n.php:1578 +msgctxt "default site language" +msgid "Site Default" +msgstr "Site Default" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:866 +msgid "HTML description for the object, transformed for display." +msgstr "HTML description for the object, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:861 +msgid "Description for the object, as it exists in the database." +msgstr "Description for the object, as it exists in the database." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:843 +msgid "HTML caption for the attachment, transformed for display." +msgstr "HTML caption for the attachment, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:838 +msgid "Caption for the attachment, as it exists in the database." +msgstr "Caption for the attachment, as it exists in the database." + +#: wp-includes/class-wp-customize-manager.php:6069 +msgid "Please enter a valid YouTube URL." +msgstr "Please enter a valid YouTube URL." + +#: wp-includes/class-wp-customize-manager.php:5406 +msgid "Or, enter a YouTube URL:" +msgstr "Or, enter a YouTube URL:" + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:880 +msgid "Users do not support trashing. Set '%s' to delete." +msgstr "Users do not support binning. Set '%s' to delete." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:673 +msgid "Terms do not support trashing. Set '%s' to delete." +msgstr "Terms do not support binning. Set '%s' to delete." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:460 +msgid "Revisions do not support trashing. Set '%s' to delete." +msgstr "Revisions do not support binning. Set '%s' to delete." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:930 +msgid "The post does not support trashing. Set '%s' to delete." +msgstr "The post does not support binning. Set '%s' to delete." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:987 +msgid "The comment does not support trashing. Set '%s' to delete." +msgstr "The comment does not support binning. Set '%s' to delete." + +#: wp-includes/rest-api/class-wp-rest-request.php:697 +msgid "Invalid JSON body passed." +msgstr "Invalid JSON body passed." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2780 +msgid "Limit result set to all items except those that have the specified term assigned in the %s taxonomy." +msgstr "Limit result set to all items except those that have the specified term assigned in the %s taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2746 +msgid "Limit result set to posts assigned one or more statuses." +msgstr "Limit result set to posts assigned one or more statuses." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:651 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:866 +msgid "Comment field exceeds maximum length allowed." +msgstr "Comment field exceeds maximum length allowed." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:323 +msgid "Taxonomies associated with post type." +msgstr "Taxonomies associated with post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2736 +msgid "Limit result set to posts with one or more specific slugs." +msgstr "Limit result set to posts with one or more specific slugs." + +#: wp-includes/class-wp-xmlrpc-server.php:3941 +msgid "Comment is required." +msgstr "Comment is required." + +#: wp-includes/class-wp-customize-nav-menus.php:949 +msgid "Empty title." +msgstr "Empty title." + +#: wp-trackback.php:130 +msgid "We already have a ping from that URL for this post." +msgstr "We already have a ping from that URL for this post." + +#: wp-trackback.php:115 +msgid "Sorry, trackbacks are closed for this item." +msgstr "Sorry, trackbacks are closed for this item." + +#: wp-trackback.php:88 +msgid "I really need an ID for this to work." +msgstr "I really need an ID for this to work." + +#: wp-includes/class-wp-customize-manager.php:5631 +#: wp-admin/includes/file.php:38 +msgid "Homepage" +msgstr "Homepage" + +#: wp-includes/block-patterns/three-buttons.php:10 +#: wp-includes/js/dist/block-library.js:11385 +msgid "Contact us" +msgstr "Contact us" + +#: wp-includes/script-loader.php:802 wp-includes/js/dist/components.js:30537 +msgid "Item selected." +msgstr "Item selected." + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:2311 +msgid "%1$s must be between %2$d (inclusive) and %3$d (inclusive)" +msgstr "%1$s must be between %2$d (inclusive) and %3$d (inclusive)" + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:2306 +msgid "%1$s must be between %2$d (exclusive) and %3$d (inclusive)" +msgstr "%1$s must be between %2$d (exclusive) and %3$d (inclusive)" + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:2301 +msgid "%1$s must be between %2$d (inclusive) and %3$d (exclusive)" +msgstr "%1$s must be between %2$d (inclusive) and %3$d (exclusive)" + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:2296 +msgid "%1$s must be between %2$d (exclusive) and %3$d (exclusive)" +msgstr "%1$s must be between %2$d (exclusive) and %3$d (exclusive)" + +#. translators: %s: IP address. +#: wp-includes/rest-api.php:2263 +msgid "%s is not a valid IP address." +msgstr "%s is not a valid IP address." + +#. translators: 1: Parameter, 2: List of types. +#. translators: 1: Parameter, 2: Type name. +#: wp-includes/rest-api.php:1973 wp-includes/rest-api.php:1995 +#: wp-includes/rest-api.php:2054 wp-includes/rest-api.php:2148 +#: wp-includes/rest-api.php:2168 wp-includes/rest-api.php:2183 +#: wp-includes/rest-api.php:2192 wp-includes/rest-api.php:2202 +msgid "%1$s is not of type %2$s." +msgstr "%1$s is not of type %2$s." + +#. translators: 1: Parameter, 2: List of valid values. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1402 +#: wp-includes/rest-api.php:2159 +msgid "%1$s is not one of %2$s." +msgstr "%1$s is not one of %2$s." + +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:499 +msgid "Meta fields." +msgstr "Meta fields." + +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:236 +msgid "Could not delete meta value from database." +msgstr "Could not delete meta value from database." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1546 +msgid "Limit result set to users matching at least one specific role provided. Accepts csv list or single role." +msgstr "Limit result set to users matching at least one specific role provided. Accepts csv list or single role." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1440 +msgid "Any extra capabilities assigned to the user." +msgstr "Any extra capabilities assigned to the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1434 +msgid "All capabilities assigned to the user." +msgstr "All capabilities assigned to the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1425 +msgid "Password for the user (never included)." +msgstr "Password for the user (never included)." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1410 +msgid "Registration date for the user." +msgstr "Registration date for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1363 +msgid "The email address for the user." +msgstr "The email address for the user." + +#. translators: %s: Role key. +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1190 +msgid "The role %s does not exist." +msgstr "The role %s does not exist." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:725 +msgid "Username isn't editable." +msgstr "Username isn't editable." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:839 +msgid "Sorry, you are not allowed to delete this user." +msgstr "Sorry, you are not allowed to delete this user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:889 +msgid "Invalid user ID for reassignment." +msgstr "Invalid user ID for reassignment." + +#: wp-includes/rest-api/endpoints/class-wp-rest-application-passwords-controller.php:523 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:474 +msgid "You are not currently logged in." +msgstr "You are not currently logged in." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:663 +msgid "Sorry, you are not allowed to edit roles of this user." +msgstr "Sorry, you are not allowed to edit roles of this user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:519 +msgid "Cannot create existing user." +msgstr "Cannot create existing user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:431 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Sorry, you are not allowed to delete this revision." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1070 +msgid "Limit result set to terms assigned to a specific post." +msgstr "Limit result set to terms assigned to a specific post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1064 +msgid "Limit result set to terms assigned to a specific parent." +msgstr "Limit result set to terms assigned to a specific parent." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1057 +msgid "Whether to hide terms not assigned to any posts." +msgstr "Whether to hide terms not assigned to any posts." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1041 +msgid "Sort collection by term attribute." +msgstr "Sort collection by term attribute." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:966 +msgid "Type attribution for the term." +msgstr "Type attribution for the term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:958 +msgid "An alphanumeric identifier for the term unique to its type." +msgstr "An alphanumeric identifier for the term unique to its type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:937 +msgid "HTML description of the term." +msgstr "HTML description of the term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:931 +msgid "Number of published posts for the term." +msgstr "Number of published posts for the term." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:74 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1324 +msgid "Unique identifier for the user." +msgstr "Unique identifier for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:347 +msgid "Whether or not the term cloud should be displayed." +msgstr "Whether or not the term cloud should be displayed." + +#. translators: %s: Custom field key. +#. translators: %s: Property name. +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:162 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:181 +#: wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php:197 +msgid "The %s property has an invalid stored value, and cannot be updated to null." +msgstr "The %s property has an invalid stored value, and cannot be updated to null." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2847 +#: wp-includes/class-wp-customize-nav-menus.php:952 +msgid "Status is forbidden." +msgstr "Status is forbidden." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2791 +msgid "Limit result set to items that are sticky." +msgstr "Limit result set to items that are sticky." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:194 +msgid "Invalid revision ID." +msgstr "Invalid revision ID." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:100 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:140 +msgid "Required to be true, as users do not support trashing." +msgstr "Required to be true, as users do not support binning." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:419 +msgid "Limit results to taxonomies associated with a specific post type." +msgstr "Limit results to taxonomies associated with a specific post type." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2770 +msgid "Limit result set to all items that have the specified term assigned in the %s taxonomy." +msgstr "Limit result set to all items that have the specified term assigned in the %s taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1599 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:785 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2681 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1510 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1025 +msgid "Offset the result set by a specific number of items." +msgstr "Offset the result set by a specific number of items." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2640 +msgid "Ensure result set excludes posts assigned to specific authors." +msgstr "Ensure result set excludes posts assigned to specific authors." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2632 +msgid "Limit result set to posts assigned to specific authors." +msgstr "Limit result set to posts assigned to specific authors." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2437 +msgid "The terms assigned to the object in the %s taxonomy." +msgstr "The terms assigned to the object in the %s taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2726 +msgid "Limit result set to all items except those of a particular parent ID." +msgstr "Limit result set to all items except those of a particular parent ID." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2675 +msgid "Limit result set to posts with a specific menu_order value." +msgstr "Limit result set to posts with a specific menu_order value." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2718 +msgid "Limit result set to items with particular parent IDs." +msgstr "Limit result set to items with particular parent IDs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2407 +msgid "The theme file to use to display the object." +msgstr "The theme file to use to display the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2162 +msgid "A password to protect access to the content and excerpt." +msgstr "A password to protect access to the content and excerpt." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2400 +msgid "Whether or not the object should be treated as sticky." +msgstr "Whether or not the object should be treated as sticky." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2384 +msgid "The format for the object." +msgstr "The format for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2373 +msgid "The order of the object in relation to other object of its type." +msgstr "The order of the object in relation to other objects of its type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2364 +msgid "Whether or not the object can be pinged." +msgstr "Whether or not the object can be pinged." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2358 +msgid "Whether or not comments are open on the object." +msgstr "Whether or not comments are open on the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2339 +msgid "Whether the excerpt is protected with a password." +msgstr "Whether the excerpt is protected with a password." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2333 +msgid "HTML excerpt for the object, transformed for display." +msgstr "HTML excerpt for the object, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2350 +msgid "The ID of the featured media for the object." +msgstr "The ID of the featured media for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2328 +msgid "Excerpt for the object, as it exists in the database." +msgstr "Excerpt for the object, as it exists in the database." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2319 +msgid "The excerpt for the object." +msgstr "The excerpt for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2300 +msgid "Whether the content is protected with a password." +msgstr "Whether the content is protected with a password." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2263 +msgid "HTML title for the object, transformed for display." +msgstr "HTML title for the object, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2258 +msgid "Title for the object, as it exists in the database." +msgstr "Title for the object, as it exists in the database." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2249 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:254 +msgid "The title for the object." +msgstr "The title for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2156 +msgid "Type of Post for the object." +msgstr "Type of Post for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2147 +msgid "A named status for the object." +msgstr "A named status for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:722 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2139 +msgid "An alphanumeric identifier for the object unique to its type." +msgstr "An alphanumeric identifier for the object unique to its type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:678 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2311 +msgid "The ID for the author of the object." +msgstr "The ID for the author of the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:711 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2132 +msgid "The date the object was last modified, as GMT." +msgstr "The date the object was last modified, as GMT." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:705 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2125 +msgid "The date the object was last modified, in the site's timezone." +msgstr "The date the object was last modified, in the site's timezone." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2104 +msgid "GUID for the object, transformed for display." +msgstr "GUID for the object, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:695 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2098 +msgid "GUID for the object, as it exists in the database." +msgstr "GUID for the object, as it exists in the database." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2092 +msgid "The globally unique identifier for the object." +msgstr "The globally unique identifier for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1461 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:689 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2086 +msgid "The date the object was published, as GMT." +msgstr "The date the object was published, as GMT." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1455 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:683 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2080 +msgid "The date the object was published, in the site's timezone." +msgstr "The date the object was published, in the site's timezone." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1205 +msgid "A password protected post can not be set to sticky." +msgstr "A password protected post cannot be set to sticky." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1194 +msgid "A sticky post can not be password protected." +msgstr "A sticky post cannot be password protected." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1354 +msgid "Invalid featured media ID." +msgstr "Invalid featured media ID." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:143 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1221 +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:259 +msgid "Invalid post parent ID." +msgstr "Invalid post parent ID." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1186 +msgid "A post can not be sticky and have a password." +msgstr "A post cannot be sticky and have a password." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:939 +msgid "The post has already been deleted." +msgstr "The post has already been deleted." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:527 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:581 +msgid "Cannot create existing post." +msgstr "Cannot create existing post." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:150 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:387 +#: wp-admin/edit-comments.php:14 +msgid "Sorry, you are not allowed to edit comments." +msgstr "Sorry, you are not allowed to edit comments." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:499 +msgid "Sorry, you are not allowed to create new users." +msgstr "Sorry, you are not allowed to create new users." + +#: wp-includes/rest-api/endpoints/class-wp-rest-plugins-controller.php:228 +msgid "Sorry, you are not allowed to manage this plugin." +msgstr "Sorry, you are not allowed to manage this plugin." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:441 +msgid "Incorrect post password." +msgstr "Incorrect post password." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:228 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:165 +msgid "You need to define a search term to order by relevance." +msgstr "You need to define a search term to order by relevance." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1672 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:85 +msgid "The password for the post if it is password protected." +msgstr "The password for the post if it is password protected." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:332 +msgid "Whether to include posts in the edit listing for their post type." +msgstr "Whether to include posts in the edit listing for their post type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:329 +msgid "Human-readable labels for the taxonomy for various contexts." +msgstr "Human-readable labels for the taxonomy for various contexts." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:323 +msgid "Whether or not the taxonomy should have children." +msgstr "Whether or not the taxonomy should have children." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:317 +msgid "A human-readable description of the taxonomy." +msgstr "A human-readable description of the taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:311 +msgid "All capabilities used by the taxonomy." +msgstr "All capabilities used by the taxonomy." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1402 +msgid "An alphanumeric identifier for the user." +msgstr "An alphanumeric identifier for the user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:326 +msgid "Whether posts with this status should be publicly-queryable." +msgstr "Whether posts with this status should be publicly-queryable." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:320 +msgid "Whether posts of this status should be shown in the front end of the site." +msgstr "Whether posts of this status should be shown in the front end of the site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:314 +msgid "Whether posts with this status should be protected." +msgstr "Whether posts with this status should be protected." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:95 +msgid "Sorry, you are not allowed to manage post statuses." +msgstr "Sorry, you are not allowed to manage post statuses." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:381 +msgid "Scope under which the request is made; determines fields present in response." +msgstr "Scope under which the request is made; determines fields present in response." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:361 +msgid "Limit results to those matching a string." +msgstr "Limit results to those matching a string." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:352 +msgid "Maximum number of items to be returned in result set." +msgstr "Maximum number of items to be returned in result set." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:344 +msgid "Current page of the collection." +msgstr "Current page of the collection." + +#. translators: %s: Method name. +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:69 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:86 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:103 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:120 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:137 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:154 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:171 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:188 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:205 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:222 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:239 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:257 +msgid "Method '%s' not implemented. Must be overridden in subclass." +msgstr "Method '%s' not implemented. Must be overridden in subclass." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:308 +msgid "Whether posts with this status should be private." +msgstr "Whether posts with this status should be private." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1665 +msgid "Limit result set to comments assigned a specific type. Requires authorization." +msgstr "Limit result set to comments assigned a specific type. Requires authorisation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1657 +msgid "Limit result set to comments assigned a specific status. Requires authorization." +msgstr "Limit result set to comments assigned a specific status. Requires authorisation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1614 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:797 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2693 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1523 +msgid "Sort collection by object attribute." +msgstr "Sort collection by object attribute." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1604 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:790 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2686 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1516 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1031 +msgid "Order sort attribute ascending or descending." +msgstr "Order sort attribute ascending or descending." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1639 +msgid "Ensure result set excludes specific parent IDs." +msgstr "Ensure result set excludes specific parent IDs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1648 +msgid "Limit result set to comments assigned to specific post IDs." +msgstr "Limit result set to comments assigned to specific post IDs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1630 +msgid "Limit result set to comments of specific parent IDs." +msgstr "Limit result set to comments of specific parent IDs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1518 +msgid "Avatar URLs for the object author." +msgstr "Avatar URLs for the object author." + +#. translators: %d: Avatar image size in pixels. +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1510 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1456 +msgid "Avatar URL with image size of %d pixels." +msgstr "Avatar URL with image size of %d pixels." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1494 +msgid "Type of Comment for the object." +msgstr "Type of Comment for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1590 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:776 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2665 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1501 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1015 +msgid "Limit result set to specific IDs." +msgstr "Limit result set to specific IDs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1581 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:767 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2656 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1492 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1006 +msgid "Ensure result set excludes specific IDs." +msgstr "Ensure result set excludes specific IDs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1552 +msgid "Limit result set to comments assigned to specific user IDs. Requires authorization." +msgstr "Limit result set to comments assigned to specific user IDs. Requires authorisation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1560 +msgid "Ensure result set excludes comments assigned to specific user IDs. Requires authorization." +msgstr "Ensure result set excludes comments assigned to specific user IDs. Requires authorisation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2650 +msgid "Limit response to posts published before a given ISO8601 compliant date." +msgstr "Limit response to posts published before a given ISO8601 compliant date." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2625 +msgid "Limit response to posts published after a given ISO8601 compliant date." +msgstr "Limit response to posts published after a given ISO8601 compliant date." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1569 +msgid "Limit result set to that from a specific author email. Requires authorization." +msgstr "Limit result set to that from a specific author email. Requires authorisation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1486 +msgid "State of the object." +msgstr "State of the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1467 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2118 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:260 +msgid "URL to the object." +msgstr "URL to the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1447 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2288 +msgid "HTML content for the object, transformed for display." +msgstr "HTML content for the object, transformed for display." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1442 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2283 +msgid "Content for the object, as it exists in the database." +msgstr "Content for the object, as it exists in the database." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1433 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2274 +msgid "The content for the object." +msgstr "The content for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1474 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:78 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:98 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:717 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2188 +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:89 +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:115 +msgid "The ID for the parent of the object." +msgstr "The ID for the parent of the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1480 +msgid "The ID of the associated post object." +msgstr "The ID of the associated post object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1425 +msgid "User agent for the object author." +msgstr "User agent for the object author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1419 +msgid "URL for the object author." +msgstr "URL for the object author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1411 +msgid "Display name for the object author." +msgstr "Display name for the object author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1405 +msgid "IP address for the object author." +msgstr "IP address for the object author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:74 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1384 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:102 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:700 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:95 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2112 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:248 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:37 +msgid "Unique identifier for the object." +msgstr "Unique identifier for the object." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1008 +msgid "The comment cannot be deleted." +msgstr "The comment cannot be deleted." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:995 +msgid "The comment has already been trashed." +msgstr "The comment has already been binned." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1307 +msgid "Invalid comment author ID." +msgstr "Invalid comment author ID." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1390 +msgid "The ID of the user object, if author was a user." +msgstr "The ID of the user object, if author was a user." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1395 +msgid "Email address for the object author." +msgstr "Email address for the object author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:876 +msgid "Updating comment failed." +msgstr "Updating comment failed." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:841 +msgid "Updating comment status failed." +msgstr "Updating comment status failed." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:704 +msgid "Creating comment failed." +msgstr "Creating comment failed." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:569 +msgid "Cannot create existing comment." +msgstr "Cannot create existing comment." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:627 +msgid "Creating a comment requires valid author name and email values." +msgstr "Creating a comment requires valid author name and email values." + +#: wp-includes/class-wp-xmlrpc-server.php:3853 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:446 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:468 +#: wp-includes/comment.php:3517 +msgid "Sorry, you must be logged in to comment." +msgstr "Sorry, you must be logged in to comment." + +#. translators: %s: List of forbidden parameters. +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:177 +msgid "Query parameter not permitted: %s" +msgstr "Query parameter not permitted: %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1129 +msgid "Limit result set to attachments of a particular MIME type." +msgstr "Limit result set to attachments of a particular MIME type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1122 +msgid "Limit result set to attachments of a particular media type." +msgstr "Limit result set to attachments of a particular media type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:997 +msgid "Could not open file handle." +msgstr "Could not open file handle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:977 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1163 +msgid "Content hash did not match expected." +msgstr "Content hash did not match expected." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:964 +msgid "Invalid Content-Disposition supplied. Content-Disposition needs to be formatted as `attachment; filename=\"image.png\"` or similar." +msgstr "Invalid Content-Disposition supplied. Content-Disposition needs to be formatted as `attachment; filename=\"image.png\"` or similar." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:954 +msgid "No Content-Disposition supplied." +msgstr "No Content-Disposition supplied." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:946 +msgid "No Content-Type supplied." +msgstr "No Content-Type supplied." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:938 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1149 +msgid "No data supplied." +msgstr "No data supplied." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:897 +msgid "The ID for the associated post of the attachment." +msgstr "The ID for the associated post of the attachment." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:104 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:119 +msgid "Whether to bypass Trash and force deletion." +msgstr "Whether to bypass Bin and force deletion." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:145 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:319 +msgid "Invalid parent type." +msgstr "Invalid parent type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:116 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:404 +msgid "Sorry, you are not allowed to upload media on this site." +msgstr "Sorry, you are not allowed to upload media on this site." + +#: wp-includes/post.php:1723 wp-admin/edit-form-advanced.php:419 +msgid "Page Attributes" +msgstr "Page Attributes" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:890 +msgid "Details about the media file, specific to its type." +msgstr "Details about the media file, specific to its type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:820 +msgid "Alternative text to display when attachment is not displayed." +msgstr "Alternative text to display when attachment is not displayed." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:125 +msgid "Sorry, you are not allowed to upload media to this post." +msgstr "Sorry, you are not allowed to upload media to this post." + +#. translators: %s: rest_authentication_errors +#: wp-includes/rest-api/class-wp-rest-server.php:381 +msgid "The REST API can no longer be completely disabled, the %s filter can be used to restrict access to the API, instead." +msgstr "The REST API can no longer be completely disabled, the %s filter can be used to restrict access to the API, instead." + +#: wp-includes/post.php:1723 +msgid "Post Attributes" +msgstr "Post Attributes" + +#: wp-includes/post.php:1716 +msgid "View Pages" +msgstr "View Pages" + +#: wp-includes/post.php:1716 +msgid "View Posts" +msgstr "View Posts" + +#: wp-includes/post.php:190 +msgid "No changesets found in Trash." +msgstr "No changesets found in Bin." + +#: wp-includes/post.php:189 +msgid "No changesets found." +msgstr "No changesets found." + +#: wp-includes/post.php:188 +msgid "Search Changesets" +msgstr "Search Changesets" + +#: wp-includes/post.php:187 +msgid "All Changesets" +msgstr "All Changesets" + +#: wp-includes/post.php:186 +msgid "View Changeset" +msgstr "View Changeset" + +#: wp-includes/post.php:185 +msgid "Edit Changeset" +msgstr "Edit Changeset" + +#: wp-includes/post.php:184 +msgid "New Changeset" +msgstr "New Changeset" + +#: wp-includes/post.php:183 +msgid "Add New Changeset" +msgstr "Add New Changeset" + +#: wp-includes/post.php:182 +msgctxt "Customize Changeset" +msgid "Add New" +msgstr "Add New" + +#: wp-includes/post.php:181 +msgctxt "add new on admin bar" +msgid "Changeset" +msgstr "Changeset" + +#: wp-includes/post.php:180 +msgctxt "admin menu" +msgid "Changesets" +msgstr "Changesets" + +#: wp-includes/post.php:179 +msgctxt "post type singular name" +msgid "Changeset" +msgstr "Changeset" + +#: wp-includes/post.php:178 +msgctxt "post type general name" +msgid "Changesets" +msgstr "Changesets" + +#: wp-includes/post.php:146 wp-includes/post.php:147 +msgid "Custom CSS" +msgstr "Custom CSS" + +#: wp-includes/post.php:79 +msgid "Attachment Attributes" +msgstr "Attachment Attributes" + +#. translators: Post revision title. 1: Author avatar, 2: Author name, 3: Time +#. ago, 4: Date. +#: wp-includes/post-template.php:1881 +msgid "%1$s %2$s, %3$s ago (%4$s)" +msgstr "%1$s %2$s, %3$s ago (%4$s)" + +#. translators: %s: misc +#. translators: %s: privacy +#: wp-includes/option.php:2272 wp-includes/option.php:2285 +#: wp-includes/option.php:2345 wp-includes/option.php:2358 +#: wp-admin/includes/template.php:1563 wp-admin/includes/template.php:1576 +#: wp-admin/includes/template.php:1634 wp-admin/includes/template.php:1647 +msgid "The \"%s\" options group has been removed. Use another settings group." +msgstr "The \"%s\" options group has been removed. Use another settings group." + +#: wp-includes/option.php:2172 +msgid "Allow link notifications from other blogs (pingbacks and trackbacks) on new articles." +msgstr "Allow link notifications from other blogs (pingbacks and trackbacks) on new articles." + +#: wp-includes/option.php:2157 +msgid "Blog pages show at most." +msgstr "Blog pages show at most." + +#: wp-includes/option.php:2147 +msgid "Default post format." +msgstr "Default post format." + +#: wp-includes/option.php:2126 +msgid "Convert emoticons like :-) and :-P to graphics on display." +msgstr "Convert emoticons like :-) and :-P to graphics on display." + +#: wp-includes/option.php:2115 +msgid "WordPress locale code." +msgstr "WordPress locale code." + +#: wp-includes/option.php:2103 +msgid "A day number of the week that the week should start on." +msgstr "A day number of the week that the week should start on." + +#: wp-includes/option.php:2093 +msgid "A time format for all time strings." +msgstr "A time format for all time strings." + +#: wp-includes/option.php:2083 +msgid "A date format for all date strings." +msgstr "A date format for all date strings." + +#: wp-includes/option.php:2073 +msgid "A city in the same timezone as you." +msgstr "A city in the same timezone as you." + +#: wp-includes/option.php:2015 +msgid "Site title." +msgstr "Site title." + +#: wp-includes/media.php:4317 +msgid "Search media items..." +msgstr "Search media items..." + +#: wp-includes/link-template.php:2741 +msgctxt "next set of posts" +msgid "Next" +msgstr "Next" + +#: wp-includes/link-template.php:2740 +msgctxt "previous set of posts" +msgid "Previous" +msgstr "Previous" + +#: wp-login.php:882 wp-login.php:1433 wp-includes/general-template.php:513 +msgid "Username or Email Address" +msgstr "Username or Email Address" + +#. translators: %s: "Search WordPress.org themes" button text. +#: wp-includes/customize/class-wp-customize-themes-section.php:102 +msgid "No themes found. Try a different search, or %s." +msgstr "No themes found. Try a different search, or %s." + +#. translators: %s: Themes panel title in the Customizer. +#: wp-includes/customize/class-wp-customize-themes-panel.php:76 +msgid "You are browsing %s" +msgstr "You are browsing %s" + +#: wp-includes/customize/class-wp-customize-themes-section.php:133 +msgid "Filter themes" +msgstr "Filter themes" + +#: wp-includes/customize/class-wp-customize-themes-panel.php:49 +msgid "Change theme" +msgstr "Change theme" + +#: wp-includes/customize/class-wp-customize-theme-control.php:103 +msgid "Update now" +msgstr "Update now" + +#. translators: %s: "Update now" button. +#: wp-includes/customize/class-wp-customize-theme-control.php:102 +msgid "New version available. %s" +msgstr "New version available. %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:67 +msgid "Install and preview theme: %s" +msgstr "Install and preview theme: %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:65 +msgid "Live preview theme: %s" +msgstr "Live preview theme: %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:63 +msgid "Customize theme: %s" +msgstr "Customise theme: %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:61 +msgid "Details for theme: %s" +msgstr "Details for theme: %s" + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:180 +msgid "Click to edit this element." +msgstr "Click to edit this element." + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:179 +msgid "Click to edit the site title." +msgstr "Click to edit the site title." + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:178 +msgid "Click to edit this widget." +msgstr "Click to edit this widget." + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:177 +msgid "Click to edit this menu." +msgstr "Click to edit this menu." + +#: wp-includes/customize/class-wp-customize-custom-css-setting.php:163 +msgid "Markup is not allowed in CSS." +msgstr "Markup is not allowed in CSS." + +#: wp-includes/class-wp-xmlrpc-server.php:2732 +msgid "Invalid role." +msgstr "Invalid role." + +#: wp-includes/class-wp-xmlrpc-server.php:2352 +msgid "Sorry, you are not allowed to assign this term." +msgstr "Sorry, you are not allowed to assign this term." + +#: wp-includes/class-wp-xmlrpc-server.php:2272 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:644 +msgid "Sorry, you are not allowed to delete this term." +msgstr "Sorry, you are not allowed to delete this term." + +#: wp-includes/class-wp-xmlrpc-server.php:2162 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:362 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:543 +msgid "Sorry, you are not allowed to edit this term." +msgstr "Sorry, you are not allowed to edit this term." + +#: wp-includes/class-wp-xmlrpc-server.php:3798 +msgid "Sorry, the comment could not be updated." +msgstr "Sorry, the comment could not be updated." + +#: wp-includes/class-wp-xmlrpc-server.php:2089 +msgid "Sorry, the term could not be created." +msgstr "Sorry, the term could not be created." + +#: wp-includes/class-wp-customize-widgets.php:790 +#: wp-includes/class-wp-customize-widgets.php:846 +msgid "No widgets found." +msgstr "No widgets found." + +#. translators: %d: The number of widgets found. +#: wp-includes/class-wp-customize-widgets.php:789 +msgid "Number of widgets found: %d" +msgstr "Number of widgets found: %d" + +#. translators: 1: Post type name, 2: Error message. +#: wp-includes/class-wp-customize-nav-menus.php:1043 +msgid "%1$s could not be created: %2$s" +msgstr "%1$s could not be created: %2$s" + +#: wp-includes/class-wp-customize-nav-menus.php:1038 +msgid "Post" +msgstr "Post" + +#. translators: 1: .mp4, 2: .mov +#: wp-includes/class-wp-customize-manager.php:6044 +msgid "Only %1$s or %2$s files may be used for header video. Please convert your video file and try again, or, upload your video to YouTube and link it with the option below." +msgstr "Only %1$s or %2$s files may be used for header video. Please convert your video file and try again, or, upload your video to YouTube and link it with the option below." + +#: wp-includes/class-wp-customize-manager.php:6036 +msgid "This video file is too large to use as a header video. Try a shorter video or optimize the compression settings and re-upload a file that is less than 8MB. Or, upload your video to YouTube and link it with the option below." +msgstr "This video file is too large to use as a header video. Try a shorter video or optimise the compression settings and re-upload a file that is less than 8MB. Or, upload your video to YouTube and link it with the option below." + +#: wp-includes/class-wp-customize-manager.php:5995 +msgid "Unrecognized background setting." +msgstr "Unrecognised background setting." + +#: wp-includes/class-wp-customize-manager.php:5986 +#: wp-includes/class-wp-customize-manager.php:5990 +msgid "Invalid value for background size." +msgstr "Invalid value for background size." + +#: wp-includes/class-wp-customize-manager.php:5982 +msgid "Invalid value for background position Y." +msgstr "Invalid value for background position Y." + +#: wp-includes/class-wp-customize-manager.php:5978 +msgid "Invalid value for background position X." +msgstr "Invalid value for background position X." + +#: wp-includes/class-wp-customize-manager.php:5974 +msgid "Invalid value for background attachment." +msgstr "Invalid value for background attachment." + +#: wp-includes/class-wp-customize-manager.php:5970 +msgid "Invalid value for background repeat." +msgstr "Invalid value for background repeat." + +#: wp-includes/class-wp-customize-manager.php:5662 +msgid "Learn more about CSS" +msgstr "Learn more about CSS" + +#: wp-includes/class-wp-customize-manager.php:5698 +msgid "Additional CSS" +msgstr "Additional CSS" + +#: wp-includes/class-wp-customize-manager.php:5568 +#: wp-admin/includes/class-custom-background.php:449 +msgid "Scroll with Page" +msgstr "Scroll with Page" + +#: wp-includes/class-wp-customize-manager.php:5550 +#: wp-admin/includes/class-custom-background.php:441 +msgid "Repeat Background Image" +msgstr "Repeat Background Image" + +#: wp-includes/class-wp-customize-manager.php:5527 +#: wp-admin/includes/class-custom-background.php:427 +#: wp-admin/includes/class-custom-background.php:428 +msgid "Image Size" +msgstr "Image Size" + +#: wp-includes/customize/class-wp-customize-background-position-control.php:93 +#: wp-includes/class-wp-customize-manager.php:5505 +#: wp-admin/includes/class-custom-background.php:408 +#: wp-admin/includes/class-custom-background.php:409 +msgid "Image Position" +msgstr "Image Position" + +#: wp-includes/class-wp-customize-manager.php:5477 +msgctxt "Custom Preset" +msgid "Custom" +msgstr "Custom" + +#: wp-includes/class-wp-customize-manager.php:5476 +msgctxt "Repeat Image" +msgid "Repeat" +msgstr "Repeat" + +#: wp-includes/class-wp-customize-manager.php:5475 +#: wp-includes/class-wp-customize-manager.php:5532 +#: wp-admin/includes/class-custom-background.php:431 +msgid "Fit to Screen" +msgstr "Fit to Screen" + +#: wp-includes/class-wp-customize-manager.php:5473 +msgctxt "Default Preset" +msgid "Default" +msgstr "Default" + +#: wp-includes/class-wp-customize-manager.php:5469 +msgctxt "Background Preset" +msgid "Preset" +msgstr "Preset" + +#: wp-includes/class-wp-customize-manager.php:5392 +msgid "Header Video" +msgstr "Header Video" + +#. translators: 1: .mp4, 2: Header height in pixels. +#: wp-includes/class-wp-customize-manager.php:5314 +msgid "Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a height of %2$s pixels." +msgstr "Upload your video in %1$s format and minimise its file size for best results. Your theme recommends a height of %2$s pixels." + +#. translators: 1: .mp4, 2: Header width in pixels. +#: wp-includes/class-wp-customize-manager.php:5307 +msgid "Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a width of %2$s pixels." +msgstr "Upload your video in %1$s format and minimise its file size for best results. Your theme recommends a width of %2$s pixels." + +#: wp-includes/class-wp-customize-manager.php:5293 +msgid "If you add a video, the image will be used as a fallback while the video loads." +msgstr "If you add a video, the image will be used as a fallback while the video loads." + +#: wp-includes/customize/class-wp-customize-themes-section.php:127 +#: wp-includes/customize/class-wp-customize-themes-section.php:128 +#: wp-includes/customize/class-wp-customize-themes-section.php:142 +#: wp-includes/customize/class-wp-customize-themes-section.php:143 +msgid "Search themes…" +msgstr "Search themes…" + +#. translators: 1: .mp4, 2: Header size in pixels. +#: wp-includes/class-wp-customize-manager.php:5300 +msgid "Upload your video in %1$s format and minimize its file size for best results. Your theme recommends dimensions of %2$s pixels." +msgstr "Upload your video in %1$s format and minimise its file size for best results. Your theme recommends dimensions of %2$s pixels." + +#. translators: %s: Theme name. +#: wp-includes/class-wp-customize-manager.php:4909 +msgid "Showing details for theme: %s" +msgstr "Showing details for theme: %s" + +#. translators: %d: Number of themes being displayed, which cannot currently +#. consider singular vs. plural forms. +#: wp-includes/class-wp-customize-manager.php:4907 +msgid "Displaying %d themes" +msgstr "Displaying %d themes" + +#. translators: %d: Number of theme search results, which cannot currently +#. consider singular vs. plural forms. +#: wp-includes/class-wp-customize-manager.php:4905 +msgid "%d themes found" +msgstr "%d themes found" + +#: wp-includes/class-wp-customize-manager.php:4903 +#: wp-admin/network/themes.php:157 +msgid "Are you sure you want to delete this theme?" +msgstr "Are you sure you want to delete this theme?" + +#: wp-includes/class-wp-customize-manager.php:2352 +msgid "Unauthorized to modify setting due to capability." +msgstr "Unauthorised to modify setting due to capability." + +#: wp-includes/class-wp-customize-manager.php:2347 +msgid "Setting does not exist or is unrecognized." +msgstr "Setting does not exist or is unrecognised." + +#: wp-includes/class-wp-customize-manager.php:2137 +msgid "This form is not live-previewable." +msgstr "This form is not live-previewable." + +#: wp-includes/class-wp-customize-manager.php:2136 +msgid "This link is not live-previewable." +msgstr "This link is not live-previewable." + +#: wp-includes/class-wp-customize-manager.php:551 +msgid "Non-existent changeset UUID." +msgstr "Non-existent changeset UUID." + +#: wp-includes/class-wp-customize-manager.php:524 +msgid "Invalid changeset UUID" +msgstr "Invalid changeset UUID" + +#: wp-includes/class-wp-customize-control.php:636 +msgid "New page title…" +msgstr "New page title…" + +#: wp-includes/class-wp-customize-control.php:635 +msgid "New page title" +msgstr "New page title" + +#: wp-includes/feed.php:588 wp-admin/link-parse-opml.php:77 +#: wp-admin/link-parse-opml.php:78 +msgid "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." +msgstr "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." + +#. translators: %s: Current user's display name. +#: wp-includes/admin-bar.php:244 +msgid "Howdy, %s" +msgstr "Hi, %s" + +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:86 +#: wp-admin/nav-menus.php:780 +msgid "Edit selected menu" +msgstr "Edit selected menu" + +#: wp-includes/class-wp-editor.php:1408 +#: wp-includes/js/dist/format-library.js:1403 +msgid "Warning: the link has been inserted but may have errors. Please test it." +msgstr "Warning: the link has been inserted but may have errors. Please test it." + +#: wp-includes/js/dist/block-editor.js:27724 +#: wp-includes/js/dist/block-editor.js:27885 +#: wp-includes/js/dist/block-editor.js:27890 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:102 +#: wp-admin/includes/class-wp-theme-install-list-table.php:61 +#: wp-admin/includes/file.php:32 wp-admin/js/updates.js:2535 +msgid "Search Results" +msgstr "Search Results" + +#: wp-includes/class-wp-editor.php:1361 +msgid "Rich Text Area. Press Control-Option-H for help." +msgstr "Rich Text Area. Press Control-Option-H for help." + +#: wp-includes/script-loader.php:940 +msgid "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds." +msgstr "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds." + +#: wp-includes/script-loader.php:937 wp-includes/theme.php:1591 +msgid "Play" +msgstr "Play" + +#: wp-includes/script-loader.php:938 wp-includes/theme.php:1590 +msgid "Pause" +msgstr "Pause" + +#: wp-includes/script-loader.php:939 +msgid "Time Slider" +msgstr "Time Slider" + +#: wp-includes/script-loader.php:946 +msgid "Video Player" +msgstr "Video Player" + +#: wp-includes/script-loader.php:947 +msgid "Audio Player" +msgstr "Audio Player" + +#: wp-includes/script-loader.php:945 +msgid "Volume Slider" +msgstr "Volume Slider" + +#: wp-includes/script-loader.php:942 +msgid "Use Up/Down Arrow keys to increase or decrease volume." +msgstr "Use Up/Down Arrow keys to increase or decrease volume." + +#: wp-includes/class-wp-tax-query.php:645 +msgid "Inexistent terms." +msgstr "Inexistent terms." + +#: wp-includes/taxonomy.php:2225 wp-includes/taxonomy.php:3001 +msgid "A name is required for this term." +msgstr "A name is required for this term." + +#: wp-includes/class-wp-xmlrpc-server.php:4854 +msgid "Sorry, you are not allowed to access user data on this site." +msgstr "Sorry, you are not allowed to access user data on this site." + +#: wp-includes/class-wp-xmlrpc-server.php:2651 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:680 +#: wp-admin/user-edit.php:97 wp-admin/user-edit.php:129 +#: wp-admin/user-edit.php:185 wp-admin/users.php:106 wp-admin/users.php:132 +msgid "Sorry, you are not allowed to edit this user." +msgstr "Sorry, you are not allowed to edit this user." + +#: wp-includes/class-wp-xmlrpc-server.php:2794 +#: wp-includes/class-wp-xmlrpc-server.php:2844 +msgid "Sorry, you are not allowed to edit your profile." +msgstr "Sorry, you are not allowed to edit your profile." + +#: wp-includes/class-wp-xmlrpc-server.php:2969 +#: wp-includes/class-wp-xmlrpc-server.php:3191 wp-admin/includes/post.php:478 +msgid "Sorry, you are not allowed to edit pages." +msgstr "Sorry, you are not allowed to edit pages." + +#: wp-includes/class-wp-theme.php:955 +msgid "Dark" +msgstr "Dark" + +#: wp-includes/class-wp-theme.php:957 +msgid "Fixed Layout" +msgstr "Fixed Layout" + +#: wp-includes/class-wp-theme.php:958 +msgid "Fluid Layout" +msgstr "Fluid Layout" + +#: wp-includes/class-wp-theme.php:961 +msgid "Photoblogging" +msgstr "Photoblogging" + +#: wp-includes/class-wp-theme.php:959 +msgid "Responsive Layout" +msgstr "Responsive Layout" + +#: wp-includes/class-wp-theme.php:962 +msgid "Seasonal" +msgstr "Seasonal" + +#: wp-includes/class-wp-theme.php:952 +msgid "Tan" +msgstr "Tan" + +#: wp-includes/class-wp-xmlrpc-server.php:1781 +#: wp-includes/class-wp-xmlrpc-server.php:5215 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:858 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:906 +msgid "Sorry, you are not allowed to delete this post." +msgstr "Sorry, you are not allowed to delete this post." + +#: wp-includes/class-wp-xmlrpc-server.php:3076 +msgid "Sorry, you are not allowed to delete this page." +msgstr "Sorry, you are not allowed to delete this page." + +#: wp-includes/class-wp-xmlrpc-server.php:2926 +#: wp-includes/class-wp-xmlrpc-server.php:3142 wp-admin/includes/post.php:265 +#: wp-admin/includes/ajax-actions.php:1994 +msgid "Sorry, you are not allowed to edit this page." +msgstr "Sorry, you are not allowed to edit this page." + +#: wp-includes/script-loader.php:1705 wp-admin/includes/dashboard.php:974 +msgid "Today" +msgstr "Today" + +#: wp-includes/widgets/class-wp-nav-menu-widget.php:195 +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:86 +msgid "Edit Menu" +msgstr "Edit Menu" + +#: wp-includes/wp-db.php:1981 wp-includes/wp-db.php:1987 +msgid "Unable to retrieve the error message from MySQL" +msgstr "Unable to retrieve the error message from MySQL" + +#: wp-includes/class-wp-text-diff-renderer-table.php:127 +msgid "Deleted:" +msgstr "Deleted:" + +#. translators: %s: Site title. +#: wp-login.php:288 +msgctxt "site" +msgid "← Go to %s" +msgstr "← Go to %s" + +#. translators: %s: User name. +#: wp-includes/pluggable.php:1916 +msgid "Password changed for user: %s" +msgstr "Password changed for user: %s" + +#. translators: Password change notification email subject. %s: Site title. +#: wp-includes/pluggable.php:1924 wp-includes/user.php:2237 +msgid "[%s] Password Changed" +msgstr "[%s] Password Changed" + +#: wp-includes/revision.php:612 +msgid "Sorry, you are not allowed to preview drafts." +msgstr "Sorry, you are not allowed to preview drafts." + +#: wp-includes/script-loader.php:676 +#: wp-includes/rest-api/class-wp-rest-server.php:1134 wp-admin/js/tags.js:58 +msgid "Sorry, you are not allowed to do that." +msgstr "Sorry, you are not allowed to do that." + +#: wp-includes/script-loader.php:1060 +msgctxt "password strength" +msgid "Password strength unknown" +msgstr "Password strength unknown" + +#: wp-login.php:1006 wp-admin/install.php:171 wp-admin/user-new.php:589 +#: wp-admin/user-edit.php:668 wp-admin/js/user-profile.js:45 +msgid "Confirm use of weak password" +msgstr "Confirm use of weak password" + +#. translators: %s: Documentation URL. +#: wp-includes/formatting.php:4863 +msgid "A structure tag is required when using custom permalinks. Learn more" +msgstr "A structure tag is required when using custom permalinks. Learn more" + +#: wp-includes/media-template.php:1482 +msgid "Image crop area preview. Requires mouse interaction." +msgstr "Image crop area preview. Requires mouse interaction." + +#: wp-includes/class-wp-xmlrpc-server.php:4307 +#: wp-includes/class-wp-xmlrpc-server.php:4360 +#: wp-includes/class-wp-xmlrpc-server.php:6337 +#: wp-admin/includes/ajax-actions.php:2430 +#: wp-admin/includes/ajax-actions.php:2496 wp-admin/async-upload.php:38 +#: wp-admin/upload.php:13 wp-admin/media-new.php:16 +#: wp-admin/media-upload.php:20 +msgid "Sorry, you are not allowed to upload files." +msgstr "Sorry, you are not allowed to upload files." + +#: wp-includes/class-wp-xmlrpc-server.php:3354 +msgid "Sorry, you are not allowed to add a category." +msgstr "Sorry, you are not allowed to add a category." + +#: wp-includes/class-wp-xmlrpc-server.php:2714 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:204 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:426 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:432 +#: wp-admin/users.php:16 +msgid "Sorry, you are not allowed to list users." +msgstr "Sorry, you are not allowed to list users." + +#: wp-includes/script-loader.php:1185 +#: wp-includes/class-wp-customize-setting.php:592 +#: wp-includes/class-wp-customize-manager.php:2375 +msgid "Invalid value." +msgstr "Invalid value." + +#: wp-includes/script-loader.php:1143 +#: wp-includes/class-wp-customize-manager.php:515 wp-admin/customize.php:18 +msgid "Sorry, you are not allowed to customize this site." +msgstr "Sorry, you are not allowed to customise this site." + +#. translators: 1: + curlang = $this->filter_lang; + + // Edit Post + if ( isset( $_REQUEST['pll_post_id'] ) && $lang = $this->model->post->get_language( (int) $_REQUEST['pll_post_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = $lang; + } elseif ( 'post.php' === $GLOBALS['pagenow'] && isset( $_GET['post'] ) && $this->model->is_translated_post_type( get_post_type( (int) $_GET['post'] ) ) && $lang = $this->model->post->get_language( (int) $_GET['post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = $lang; + } elseif ( 'post-new.php' === $GLOBALS['pagenow'] && ( empty( $_GET['post_type'] ) || $this->model->is_translated_post_type( sanitize_key( $_GET['post_type'] ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = empty( $_GET['new_lang'] ) ? $this->pref_lang : $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + // Edit Term + elseif ( isset( $_REQUEST['pll_term_id'] ) && $lang = $this->model->term->get_language( (int) $_REQUEST['pll_term_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = $lang; + } elseif ( in_array( $GLOBALS['pagenow'], array( 'edit-tags.php', 'term.php' ) ) && isset( $_GET['taxonomy'] ) && $this->model->is_translated_taxonomy( sanitize_key( $_GET['taxonomy'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + if ( isset( $_GET['tag_ID'] ) && $lang = $this->model->term->get_language( (int) $_GET['tag_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = $lang; + } elseif ( ! empty( $_GET['new_lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } elseif ( empty( $this->curlang ) ) { + $this->curlang = $this->pref_lang; + } + } + + // Ajax + if ( wp_doing_ajax() && ! empty( $_REQUEST['lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->curlang = $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + // Inform that the admin language has been set. + if ( $this->curlang ) { + /** This action is documented in frontend/choose-lang.php */ + do_action( 'pll_language_defined', $this->curlang->slug, $this->curlang ); + } else { + /** This action is documented in include/class-polylang.php */ + do_action( 'pll_no_language_defined' ); // To load overridden textdomains. + } + } + + /** + * Defines the backend language and the admin language filter based on user preferences + * + * @since 1.2.3 + */ + public function init_user() { + // Language for admin language filter: may be empty + // $_GET['lang'] is numeric when editing a language, not when selecting a new language in the filter + // We intentionally don't use a nonce to update the language filter + if ( ! wp_doing_ajax() && ! empty( $_GET['lang'] ) && ! is_numeric( sanitize_key( $_GET['lang'] ) ) && current_user_can( 'edit_user', $user_id = get_current_user_id() ) ) { // phpcs:ignore WordPress.Security.NonceVerification + update_user_meta( $user_id, 'pll_filter_content', ( $lang = $this->model->get_language( sanitize_key( $_GET['lang'] ) ) ) ? $lang->slug : '' ); // phpcs:ignore WordPress.Security.NonceVerification + } + + $this->filter_lang = $this->model->get_language( get_user_meta( get_current_user_id(), 'pll_filter_content', true ) ); + + // Set preferred language for use when saving posts and terms: must not be empty + $this->pref_lang = empty( $this->filter_lang ) ? $this->model->get_language( $this->options['default_lang'] ) : $this->filter_lang; + + /** + * Filter the preferred language on admin side + * The preferred language is used for example to determine the language of a new post + * + * @since 1.2.3 + * + * @param object $pref_lang preferred language + */ + $this->pref_lang = apply_filters( 'pll_admin_preferred_language', $this->pref_lang ); + + $this->set_current_language(); + + // Plugin i18n, only needed for backend. + load_plugin_textdomain( 'polylang' ); + } + + /** + * Avoids parsing a tax query when all languages are requested + * Fixes https://wordpress.org/support/topic/notice-undefined-offset-0-in-wp-includesqueryphp-on-line-3877 introduced in WP 4.1 + * + * @see https://core.trac.wordpress.org/ticket/31246 the suggestion of @boonebgorges. + * + * @since 1.6.5 + * + * @param array $qvars + * @return array + */ + public function request( $qvars ) { + if ( isset( $qvars['lang'] ) && 'all' === $qvars['lang'] ) { + unset( $qvars['lang'] ); + } + + return $qvars; + } + + /** + * Adds the languages list in admin bar for the admin languages filter + * + * @since 0.9 + * + * @param object $wp_admin_bar + */ + public function admin_bar_menu( $wp_admin_bar ) { + $all_item = (object) array( + 'slug' => 'all', + 'name' => __( 'Show all languages', 'polylang' ), + 'flag' => '', + ); + + $selected = empty( $this->filter_lang ) ? $all_item : $this->filter_lang; + + $title = sprintf( + '%2$s%3$s', + 'all' === $selected->slug ? '' : sprintf( ' lang="%s"', esc_attr( $selected->get_locale( 'display' ) ) ), + __( 'Filters content by language', 'polylang' ), + esc_html( $selected->name ) + ); + + /** + * Filters the admin languages filter submenu items + * + * @since 2.6 + * + * @param array $items The admin languages filter submenu items. + */ + $items = apply_filters( 'pll_admin_languages_filter', array_merge( array( $all_item ), $this->model->get_languages_list() ) ); + + if ( ! empty( $items ) ) { + $wp_admin_bar->add_menu( + array( + 'id' => 'languages', + 'title' => $selected->flag . $title, + 'href' => esc_url( add_query_arg( 'lang', $selected->slug, remove_query_arg( 'paged' ) ) ), + 'meta' => array( 'title' => __( 'Filters content by language', 'polylang' ) ), + ) + ); + } + + foreach ( $items as $lang ) { + if ( $selected->slug === $lang->slug ) { + continue; + } + + $wp_admin_bar->add_menu( + array( + 'parent' => 'languages', + 'id' => $lang->slug, + 'title' => $lang->flag . esc_html( $lang->name ), + 'href' => esc_url( add_query_arg( 'lang', $lang->slug, remove_query_arg( 'paged' ) ) ), + 'meta' => 'all' === $lang->slug ? array() : array( 'lang' => esc_attr( $lang->get_locale( 'display' ) ) ), + ) + ); + } + } +} diff --git a/wp-content/plugins/polylang/admin/admin-block-editor.php b/wp-content/plugins/polylang/admin/admin-block-editor.php new file mode 100644 index 00000000..b683b587 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-block-editor.php @@ -0,0 +1,56 @@ +model = &$polylang->model; + $this->pref_lang = &$polylang->pref_lang; + + add_filter( 'block_editor_preload_paths', array( $this, 'preload_paths' ), 10, 2 ); + } + + /** + * Filter the preload REST requests by the current language of the post + * Necessary otherwise subsequent REST requests all filtered by the language + * would not hit the preloaded requests + * + * @since 2.5 + * + * @param array $preload_paths Array of paths to preload. + * @param object $post The post resource data. + * @return array + */ + public function preload_paths( $preload_paths, $post ) { + if ( $this->model->is_translated_post_type( $post->post_type ) ) { + $lang = $this->model->post->get_language( $post->ID ); + + if ( ! $lang ) { + $lang = $this->pref_lang; + } + + foreach ( $preload_paths as $k => $path ) { + if ( is_string( $path ) && '/' !== $path ) { + $preload_paths[ $k ] = $path . "&lang={$lang->slug}"; + } + } + } + + return $preload_paths; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-classic-editor.php b/wp-content/plugins/polylang/admin/admin-classic-editor.php new file mode 100644 index 00000000..ff8bc69d --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-classic-editor.php @@ -0,0 +1,326 @@ +model = &$polylang->model; + $this->links = &$polylang->links; + $this->curlang = &$polylang->curlang; + $this->pref_lang = &$polylang->pref_lang; + + // Adds the Languages box in the 'Edit Post' and 'Edit Page' panels + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) ); + + // Ajax response for changing the language in the post metabox + add_action( 'wp_ajax_post_lang_choice', array( $this, 'post_lang_choice' ) ); + add_action( 'wp_ajax_pll_posts_not_translated', array( $this, 'ajax_posts_not_translated' ) ); + + // Filters the pages by language in the parent dropdown list in the page attributes metabox + add_filter( 'page_attributes_dropdown_pages_args', array( $this, 'page_attributes_dropdown_pages_args' ), 10, 2 ); + + // Notice + add_action( 'edit_form_top', array( $this, 'edit_form_top' ) ); + } + + /** + * Adds the Language box in the 'Edit Post' and 'Edit Page' panels ( as well as in custom post types panels ) + * + * @since 0.1 + * + * @param string $post_type Current post type + */ + public function add_meta_boxes( $post_type ) { + if ( $this->model->is_translated_post_type( $post_type ) ) { + add_meta_box( + 'ml_box', + __( 'Languages', 'polylang' ), + array( $this, 'post_language' ), + $post_type, + 'side', + 'high', + array( + '__back_compat_meta_box' => pll_use_block_editor_plugin(), + ) + ); + } + } + + /** + * Displays the Languages metabox in the 'Edit Post' and 'Edit Page' panels + * + * @since 0.1 + */ + public function post_language() { + global $post_ID; + $post_type = get_post_type( $post_ID ); + + // phpcs:ignore WordPress.Security.NonceVerification, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + $from_post_id = isset( $_GET['from_post'] ) ? (int) $_GET['from_post'] : 0; + + $lang = ( $lg = $this->model->post->get_language( $post_ID ) ) ? $lg : + ( isset( $_GET['new_lang'] ) ? $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification + $this->pref_lang ); + + $dropdown = new PLL_Walker_Dropdown(); + + $id = ( 'attachment' === $post_type ) ? sprintf( 'attachments[%d][language]', (int) $post_ID ) : 'post_lang_choice'; + + $dropdown_html = $dropdown->walk( + $this->model->get_languages_list(), + -1, + array( + 'name' => $id, + 'class' => 'post_lang_choice tags-input', + 'selected' => $lang ? $lang->slug : '', + 'flag' => true, + ) + ); + + wp_nonce_field( 'pll_language', '_pll_nonce' ); + + // NOTE: the class "tags-input" allows to include the field in the autosave $_POST ( see autosave.js ) + printf( + '

%1$s

+ +
%4$s
', + esc_html__( 'Language', 'polylang' ), + esc_attr( $id ), + ( 'attachment' === $post_type ? 'media' : 'post' ), + $dropdown_html // phpcs:ignore WordPress.Security.EscapeOutput + ); + + /** + * Fires before displaying the list of translations in the Languages metabox for posts + * + * @since 1.8 + */ + do_action( 'pll_before_post_translations', $post_type ); + + echo '
'; + if ( $lang ) { + if ( 'attachment' === $post_type ) { + include __DIR__ . '/view-translations-media.php'; + } else { + include __DIR__ . '/view-translations-post.php'; + } + } + echo '
' . "\n"; + } + + /** + * Ajax response for changing the language in the post metabox + * + * @since 0.2 + */ + public function post_lang_choice() { + check_ajax_referer( 'pll_language', '_pll_nonce' ); + + if ( ! isset( $_POST['post_id'], $_POST['lang'], $_POST['post_type'] ) ) { + wp_die( 0 ); + } + + global $post_ID; // Obliged to use the global variable for wp_popular_terms_checklist + $post_ID = (int) $_POST['post_id']; + $lang = $this->model->get_language( sanitize_key( $_POST['lang'] ) ); + $post_type = sanitize_key( $_POST['post_type'] ); + + if ( ! post_type_exists( $post_type ) ) { + wp_die( 0 ); + } + + $post_type_object = get_post_type_object( $post_type ); + if ( ! current_user_can( $post_type_object->cap->edit_post, $post_ID ) ) { + wp_die( -1 ); + } + + $this->model->post->set_language( $post_ID, $lang ); // Save language, useful to set the language when uploading media from post + + // We also need to save the translations to match the language change + $translations = $this->model->post->get_translations( $post_ID ); + $translations = array_diff( $translations, array( $post_ID ) ); + $this->model->post->save_translations( $post_ID, $translations ); + + ob_start(); + if ( $lang ) { + if ( 'attachment' === $post_type ) { + include __DIR__ . '/view-translations-media.php'; + } else { + include __DIR__ . '/view-translations-post.php'; + } + } + $x = new WP_Ajax_Response( array( 'what' => 'translations', 'data' => ob_get_contents() ) ); + ob_end_clean(); + + // Categories + if ( isset( $_POST['taxonomies'] ) ) { // Not set for pages + $supplemental = array(); + + foreach ( array_map( 'sanitize_key', $_POST['taxonomies'] ) as $taxname ) { + $taxonomy = get_taxonomy( $taxname ); + + ob_start(); + $popular_ids = wp_popular_terms_checklist( $taxonomy->name ); + $supplemental['populars'] = ob_get_contents(); + ob_end_clean(); + + ob_start(); + // Use $post_ID to remember checked terms in case we come back to the original language + wp_terms_checklist( $post_ID, array( 'taxonomy' => $taxonomy->name, 'popular_cats' => $popular_ids ) ); + $supplemental['all'] = ob_get_contents(); + ob_end_clean(); + + $supplemental['dropdown'] = wp_dropdown_categories( + array( + 'taxonomy' => $taxonomy->name, + 'hide_empty' => 0, + 'name' => 'new' . $taxonomy->name . '_parent', + 'orderby' => 'name', + 'hierarchical' => 1, + 'show_option_none' => '— ' . $taxonomy->labels->parent_item . ' —', + 'echo' => 0, + ) + ); + + $x->Add( array( 'what' => 'taxonomy', 'data' => $taxonomy->name, 'supplemental' => $supplemental ) ); + } + } + + // Parent dropdown list ( only for hierarchical post types ) + if ( in_array( $post_type, get_post_types( array( 'hierarchical' => true ) ) ) ) { + $post = get_post( $post_ID ); + + // Args and filter from 'page_attributes_meta_box' in wp-admin/includes/meta-boxes.php of WP 4.2.1 + $dropdown_args = array( + 'post_type' => $post->post_type, + 'exclude_tree' => $post->ID, + 'selected' => $post->post_parent, + 'name' => 'parent_id', + 'show_option_none' => __( '(no parent)', 'polylang' ), + 'sort_column' => 'menu_order, post_title', + 'echo' => 0, + ); + + /** This filter is documented in wp-admin/includes/meta-boxes.php */ + $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post ); // Since WP 3.3 + + $x->Add( array( 'what' => 'pages', 'data' => wp_dropdown_pages( $dropdown_args ) ) ); // phpcs:ignore WordPress.Security.EscapeOutput + } + + // Flag + $x->Add( array( 'what' => 'flag', 'data' => empty( $lang->flag ) ? esc_html( $lang->slug ) : $lang->flag ) ); + + // Sample permalink + $x->Add( array( 'what' => 'permalink', 'data' => get_sample_permalink_html( $post_ID ) ) ); + + $x->send(); + } + + /** + * Ajax response for input in translation autocomplete input box + * + * @since 1.5 + */ + public function ajax_posts_not_translated() { + check_ajax_referer( 'pll_language', '_pll_nonce' ); + + if ( ! isset( $_GET['post_type'], $_GET['post_language'], $_GET['translation_language'], $_GET['term'], $_GET['pll_post_id'] ) ) { + wp_die( 0 ); + } + + $post_type = sanitize_key( $_GET['post_type'] ); + + if ( ! post_type_exists( $post_type ) ) { + wp_die( 0 ); + } + + $term = wp_unslash( $_GET['term'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + + $post_language = $this->model->get_language( sanitize_key( $_GET['post_language'] ) ); + $translation_language = $this->model->get_language( sanitize_key( $_GET['translation_language'] ) ); + + $return = array(); + + $untranslated_posts = $this->model->post->get_untranslated( $post_type, $post_language, $translation_language, $term ); + + // format output + foreach ( $untranslated_posts as $post ) { + $return[] = array( + 'id' => $post->ID, + 'value' => $post->post_title, + 'link' => $this->links->edit_post_translation_link( $post->ID ), + ); + } + + // Add current translation in list + if ( $post_id = $this->model->post->get_translation( (int) $_GET['pll_post_id'], $translation_language ) ) { + $post = get_post( $post_id ); + array_unshift( + $return, + array( + 'id' => $post_id, + 'value' => $post->post_title, + 'link' => $this->links->edit_post_translation_link( $post_id ), + ) + ); + } + + wp_die( wp_json_encode( $return ) ); + } + + /** + * Filters the pages by language in the parent dropdown list in the page attributes metabox + * + * @since 0.6 + * + * @param array $dropdown_args Arguments passed to wp_dropdown_pages + * @param object $post + * @return array Modified arguments + */ + public function page_attributes_dropdown_pages_args( $dropdown_args, $post ) { + $dropdown_args['lang'] = isset( $_POST['lang'] ) ? $this->model->get_language( sanitize_key( $_POST['lang'] ) ) : $this->model->post->get_language( $post->ID ); // phpcs:ignore WordPress.Security.NonceVerification + if ( ! $dropdown_args['lang'] ) { + $dropdown_args['lang'] = $this->pref_lang; + } + + return $dropdown_args; + } + + /** + * Displays a notice if the user has not sufficient rights to overwrite synchronized taxonomies and metas + * + * @since 2.6 + * + * @param object $post Post currently being edited + */ + public function edit_form_top( $post ) { + if ( ! $this->model->post->current_user_can_synchronize( $post->ID ) ) { + ?> +
+

+ +

+
+ links = &$polylang->links; + $this->model = &$polylang->model; + $this->filter_lang = &$polylang->filter_lang; + + // Hide the column of the filtered language. + add_filter( 'hidden_columns', array( $this, 'hidden_columns' ) ); // Since WP 4.4. + + // Add the language and translations columns in 'All Posts', 'All Pages' and 'Media library' panels. + foreach ( $this->model->get_translated_post_types() as $type ) { + // Use the latest filter late as some plugins purely overwrite what's done by others :( + // Specific case for media. + add_filter( 'manage_' . ( 'attachment' == $type ? 'upload' : 'edit-' . $type ) . '_columns', array( $this, 'add_post_column' ), 100 ); + add_action( 'manage_' . ( 'attachment' == $type ? 'media' : $type . '_posts' ) . '_custom_column', array( $this, 'post_column' ), 10, 2 ); + } + + // Quick edit and bulk edit. + add_filter( 'quick_edit_custom_box', array( $this, 'quick_edit_custom_box' ) ); + add_filter( 'bulk_edit_custom_box', array( $this, 'quick_edit_custom_box' ) ); + + // Adds the language column in the 'Categories' and 'Post Tags' tables. + foreach ( $this->model->get_translated_taxonomies() as $tax ) { + add_filter( 'manage_edit-' . $tax . '_columns', array( $this, 'add_term_column' ) ); + add_filter( 'manage_' . $tax . '_custom_column', array( $this, 'term_column' ), 10, 3 ); + } + + // Ajax responses to update list table rows. + add_action( 'wp_ajax_pll_update_post_rows', array( $this, 'ajax_update_post_rows' ) ); + add_action( 'wp_ajax_pll_update_term_rows', array( $this, 'ajax_update_term_rows' ) ); + } + + /** + * Adds languages and translations columns in posts, pages, media, categories and tags tables + * + * @since 0.8.2 + * + * @param array $columns List of table columns + * @param string $before The column before which we want to add our languages + * @return array modified list of columns + */ + protected function add_column( $columns, $before ) { + if ( $n = array_search( $before, array_keys( $columns ) ) ) { + $end = array_slice( $columns, $n ); + $columns = array_slice( $columns, 0, $n ); + } + + foreach ( $this->model->get_languages_list() as $language ) { + $columns[ 'language_' . $language->slug ] = $this->get_flag_html( $language ) . '' . esc_html( $language->name ) . ''; + } + + return isset( $end ) ? array_merge( $columns, $end ) : $columns; + } + + /** + * Returns the first language column in the posts, pages and media library tables + * + * @since 0.9 + * + * @return string first language column name + */ + protected function get_first_language_column() { + $columns = array(); + + foreach ( $this->model->get_languages_list() as $language ) { + $columns[] = 'language_' . $language->slug; + } + + return empty( $columns ) ? '' : reset( $columns ); + } + + /** + * Hide the column for the filtered language + * + * @since 2.7 + * + * @param array $hidden Array of hidden columns + * @return array + */ + public function hidden_columns( $hidden ) { + if ( ! empty( $this->filter_lang ) ) { + $hidden[] = 'language_' . $this->filter_lang->slug; + } + return $hidden; + } + + /** + * Adds the language and translations columns ( before the comments column ) in the posts, pages and media library tables + * + * @since 0.1 + * + * @param array $columns list of posts table columns + * @return array modified list of columns + */ + public function add_post_column( $columns ) { + return $this->add_column( $columns, 'comments' ); + } + + /** + * Fills the language and translations columns in the posts, pages and media library tables + * take care that when doing ajax inline edit, the post may not be updated in database yet + * + * @since 0.1 + * + * @param string $column Column name + * @param int $post_id + */ + public function post_column( $column, $post_id ) { + $inline = wp_doing_ajax() && isset( $_REQUEST['action'], $_POST['inline_lang_choice'] ) && 'inline-save' === $_REQUEST['action']; // phpcs:ignore WordPress.Security.NonceVerification + $lang = $inline ? $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ) : $this->model->post->get_language( $post_id ); // phpcs:ignore WordPress.Security.NonceVerification + + if ( false === strpos( $column, 'language_' ) || ! $lang ) { + return; + } + + $language = $this->model->get_language( substr( $column, 9 ) ); + + // Hidden field containing the post language for quick edit + if ( $column == $this->get_first_language_column() ) { + printf( '', intval( $post_id ), esc_html( $lang->slug ) ); + } + + // Link to edit post ( or a translation ) + if ( $id = $this->model->post->get( $post_id, $language ) ) { + // get_edit_post_link returns nothing if the user cannot edit the post + // Thanks to Solinx. See http://wordpress.org/support/topic/feature-request-incl-code-check-for-capabilities-in-admin-screens + if ( $link = get_edit_post_link( $id ) ) { + $flag = ''; + if ( $id === $post_id ) { + $flag = $this->get_flag_html( $language ); + $class = 'pll_column_flag'; + /* translators: accessibility text, %s is a native language name */ + $s = sprintf( __( 'Edit this item in %s', 'polylang' ), $language->name ); + } else { + $class = esc_attr( 'pll_icon_edit translation_' . $id ); + /* translators: accessibility text, %s is a native language name */ + $s = sprintf( __( 'Edit the translation in %s', 'polylang' ), $language->name ); + } + printf( + '%4$s%5$s', + esc_attr( $class ), + esc_attr( get_post( $id )->post_title ), + esc_url( $link ), + esc_html( $s ), + $flag // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } elseif ( $id === $post_id ) { + printf( + '%1$s%2$s', + /* translators: accessibility text, %s is a native language name */ + esc_html( sprintf( __( 'This item is in %s', 'polylang' ), $language->name ) ), + $this->get_flag_html( $language ) // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + } + // Link to add a new translation + else { + echo $this->links->new_post_translation_link( $post_id, $language ); // phpcs:ignore WordPress.Security.EscapeOutput + } + } + + /** + * Quick edit & bulk edit + * + * @since 0.9 + * + * @param string $column column name + * @return string unmodified $column + */ + public function quick_edit_custom_box( $column ) { + if ( $column == $this->get_first_language_column() ) { + + $elements = $this->model->get_languages_list(); + if ( current_filter() == 'bulk_edit_custom_box' ) { + array_unshift( $elements, (object) array( 'slug' => -1, 'name' => __( '— No Change —', 'polylang' ) ) ); + } + + $dropdown = new PLL_Walker_Dropdown(); + // The hidden field 'old_lang' allows to pass the old language to ajax request + printf( + '
+
+ +
+
', + esc_html__( 'Language', 'polylang' ), + $dropdown->walk( $elements, -1, array( 'name' => 'inline_lang_choice', 'id' => '' ) ) // phpcs:ignore WordPress.Security.EscapeOutput + ); + } + return $column; + } + + /** + * Adds the language column ( before the posts column ) in the 'Categories' or 'Post Tags' table + * + * @since 0.1 + * + * @param array $columns list of terms table columns + * @return array modified list of columns + */ + public function add_term_column( $columns ) { + return $this->add_column( $columns, 'posts' ); + } + + /** + * Fills the language column in the 'Categories' or 'Post Tags' table + * + * @since 0.1 + * + * @param string $out + * @param string $column Column name + * @param int $term_id + */ + public function term_column( $out, $column, $term_id ) { + $inline = wp_doing_ajax() && isset( $_REQUEST['action'], $_POST['inline_lang_choice'] ) && 'inline-save-tax' === $_REQUEST['action']; // phpcs:ignore WordPress.Security.NonceVerification + if ( false === strpos( $column, 'language_' ) || ! ( $lang = $inline ? $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ) : $this->model->term->get_language( $term_id ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + return $out; + } + + if ( isset( $_REQUEST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $post_type = sanitize_key( $_REQUEST['post_type'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + if ( isset( $GLOBALS['post_type'] ) ) { + $post_type = $GLOBALS['post_type']; + } + + if ( isset( $_REQUEST['taxonomy'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $taxonomy = sanitize_key( $_REQUEST['taxonomy'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + if ( isset( $GLOBALS['taxonomy'] ) ) { + $taxonomy = $GLOBALS['taxonomy']; + } + + if ( ! post_type_exists( $post_type ) || ! taxonomy_exists( $taxonomy ) ) { + return $out; + } + + $term_id = (int) $term_id; + $language = $this->model->get_language( substr( $column, 9 ) ); + + if ( $column == $this->get_first_language_column() ) { + $out = sprintf( '', intval( $term_id ), esc_html( $lang->slug ) ); + + // Identify the default categories to disable the language dropdown in js + if ( in_array( get_option( 'default_category' ), $this->model->term->get_translations( $term_id ) ) ) { + $out .= sprintf( '', intval( $term_id ) ); + } + } + + // Link to edit term ( or a translation ) + if ( ( $id = $this->model->term->get( $term_id, $language ) ) && $term = get_term( $id, $taxonomy ) ) { + if ( $link = get_edit_term_link( $id, $taxonomy, $post_type ) ) { + $flag = ''; + if ( $id === $term_id ) { + $flag = $this->get_flag_html( $language ); + $class = 'pll_column_flag'; + /* translators: accessibility text, %s is a native language name */ + $s = sprintf( __( 'Edit this item in %s', 'polylang' ), $language->name ); + } else { + $class = esc_attr( 'pll_icon_edit translation_' . $id ); + /* translators: accessibility text, %s is a native language name */ + $s = sprintf( __( 'Edit the translation in %s', 'polylang' ), $language->name ); + } + $out .= sprintf( + '%4$s%5$s', + $class, + esc_attr( $term->name ), + esc_url( $link ), + esc_html( $s ), + $flag // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } elseif ( $id === $term_id ) { + $out .= sprintf( + '%1$s%2$s', + /* translators: accessibility text, %s is a native language name */ + esc_html( sprintf( __( 'This item is in %s', 'polylang' ), $language->name ) ), + $this->get_flag_html( $language ) // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + } + + // Link to add a new translation + else { + $out .= $this->links->new_term_translation_link( $term_id, $taxonomy, $post_type, $language ); + } + + return $out; + } + + /** + * Update rows of translated posts when the language is modified in quick edit + * + * @since 1.7 + */ + public function ajax_update_post_rows() { + check_ajax_referer( 'inlineeditnonce', '_pll_nonce' ); + + if ( ! isset( $_POST['post_type'], $_POST['post_id'], $_POST['screen'] ) ) { + wp_die( 0 ); + } + + $post_type = sanitize_key( $_POST['post_type'] ); + + if ( ! post_type_exists( $post_type ) || ! $this->model->is_translated_post_type( $post_type ) ) { + wp_die( 0 ); + } + + global $wp_list_table; + $wp_list_table = _get_list_table( 'WP_Posts_List_Table', array( 'screen' => sanitize_key( $_POST['screen'] ) ) ); + + $x = new WP_Ajax_Response(); + + // Collect old translations + $translations = empty( $_POST['translations'] ) ? array() : explode( ',', $_POST['translations'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + $translations = array_map( 'intval', $translations ); + + $translations = array_merge( $translations, array( (int) $_POST['post_id'] ) ); // Add current post + + foreach ( $translations as $post_id ) { + $level = is_post_type_hierarchical( $post_type ) ? count( get_ancestors( $post_id, $post_type ) ) : 0; + if ( $post = get_post( $post_id ) ) { + ob_start(); + $wp_list_table->single_row( $post, $level ); + $data = ob_get_clean(); + $x->add( array( 'what' => 'row', 'data' => $data, 'supplemental' => array( 'post_id' => $post_id ) ) ); + } + } + + $x->send(); + } + + /** + * Update rows of translated terms when adding / deleting a translation or when the language is modified in quick edit + * + * @since 1.7 + */ + public function ajax_update_term_rows() { + check_ajax_referer( 'pll_language', '_pll_nonce' ); + + if ( ! isset( $_POST['taxonomy'], $_POST['term_id'], $_POST['screen'] ) ) { + wp_die( 0 ); + } + + $taxonomy = sanitize_key( $_POST['taxonomy'] ); + + if ( ! taxonomy_exists( $taxonomy ) || ! $this->model->is_translated_taxonomy( $taxonomy ) ) { + wp_die( 0 ); + } + + global $wp_list_table; + $wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => sanitize_key( $_POST['screen'] ) ) ); + + $x = new WP_Ajax_Response(); + + // Collect old translations + $translations = empty( $_POST['translations'] ) ? array() : explode( ',', $_POST['translations'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + $translations = array_map( 'intval', $translations ); + + $translations = array_merge( $translations, $this->model->term->get_translations( (int) $_POST['term_id'] ) ); // Add current translations + $translations = array_unique( $translations ); // Remove duplicates + + foreach ( $translations as $term_id ) { + $level = is_taxonomy_hierarchical( $taxonomy ) ? count( get_ancestors( $term_id, $taxonomy ) ) : 0; + if ( $tag = get_term( $term_id, $taxonomy ) ) { + ob_start(); + $wp_list_table->single_row( $tag, $level ); + $data = ob_get_clean(); + $x->add( array( 'what' => 'row', 'data' => $data, 'supplemental' => array( 'term_id' => $term_id ) ) ); + } + } + + $x->send(); + } + + /** + * Returns the language flag or teh language slug if there is no flag. + * + * @since 2.8 + * + * @param object $language PLL_Language object. + * @return string + */ + protected function get_flag_html( $language ) { + return $language->flag ? $language->flag : sprintf( '%s', esc_html( $language->slug ) ); + } +} diff --git a/wp-content/plugins/polylang/admin/admin-filters-media.php b/wp-content/plugins/polylang/admin/admin-filters-media.php new file mode 100644 index 00000000..c530bdfd --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-filters-media.php @@ -0,0 +1,123 @@ +posts = &$polylang->posts; + + // Adds the language field and translations tables in the 'Edit Media' panel + add_filter( 'attachment_fields_to_edit', array( $this, 'attachment_fields_to_edit' ), 10, 2 ); + + // Adds actions related to languages when creating, saving or deleting media + add_filter( 'attachment_fields_to_save', array( $this, 'save_media' ), 10, 2 ); + + // Creates a media translation + if ( isset( $_GET['action'], $_GET['new_lang'], $_GET['from_media'] ) && 'translate_media' === $_GET['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification + add_action( 'admin_init', array( $this, 'translate_media' ) ); + } + } + + /** + * Adds the language field and translations tables in the 'Edit Media' panel + * Needs WP 3.5+ + * + * @since 0.9 + * + * @param array $fields list of form fields + * @param object $post + * @return array modified list of form fields + */ + public function attachment_fields_to_edit( $fields, $post ) { + if ( 'post.php' == $GLOBALS['pagenow'] ) { + return $fields; // Don't add anything on edit media panel for WP 3.5+ since we have the metabox + } + + $post_id = $post->ID; + $lang = $this->model->post->get_language( $post_id ); + + $dropdown = new PLL_Walker_Dropdown(); + $fields['language'] = array( + 'label' => __( 'Language', 'polylang' ), + 'input' => 'html', + 'html' => $dropdown->walk( + $this->model->get_languages_list(), + -1, + array( + 'name' => sprintf( 'attachments[%d][language]', $post_id ), + 'class' => 'media_lang_choice', + 'selected' => $lang ? $lang->slug : '', + ) + ), + ); + + return $fields; + } + + /** + * Creates a media translation + * + * @since 0.9 + */ + public function translate_media() { + if ( isset( $_GET['from_media'], $_GET['new_lang'] ) ) { + // Security check + check_admin_referer( 'translate_media' ); + $post_id = (int) $_GET['from_media']; + + // Bails if the translations already exists + // See https://wordpress.org/support/topic/edit-translation-in-media-attachments?#post-7322303 + // Or if the source media does not exist + if ( $this->model->post->get_translation( $post_id, sanitize_key( $_GET['new_lang'] ) ) || ! get_post( $post_id ) ) { + wp_safe_redirect( wp_get_referer() ); + exit; + } + + $tr_id = $this->posts->create_media_translation( $post_id, sanitize_key( $_GET['new_lang'] ) ); + wp_safe_redirect( admin_url( sprintf( 'post.php?post=%d&action=edit', $tr_id ) ) ); // WP 3.5+ + exit; + } + } + + /** + * Called when a media is saved + * Saves language and translations + * + * @since 0.9 + * + * @param array $post + * @param array $attachment + * @return array unmodified $post + */ + public function save_media( $post, $attachment ) { + // Language is filled in attachment by the function applying the filter 'attachment_fields_to_save' + // All security checks have been done by functions applying this filter + if ( ! empty( $attachment['language'] ) ) { + $this->model->post->set_language( $post['ID'], $attachment['language'] ); + } + + if ( isset( $_POST['media_tr_lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->save_translations( $post['ID'], array_map( 'absint', $_POST['media_tr_lang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + return $post; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-filters-post-base.php b/wp-content/plugins/polylang/admin/admin-filters-post-base.php new file mode 100644 index 00000000..6f3e3b31 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-filters-post-base.php @@ -0,0 +1,50 @@ +links = &$polylang->links; + $this->model = &$polylang->model; + $this->pref_lang = &$polylang->pref_lang; + } + + /** + * Save translations from language metabox + * + * @since 1.5 + * + * @param int $post_id + * @param array $arr + * @return array + */ + protected function save_translations( $post_id, $arr ) { + // Security check as 'wp_insert_post' can be called from outside WP admin + check_admin_referer( 'pll_language', '_pll_nonce' ); + + $translations = array(); + + // Save translations after checking the translated post is in the right language + foreach ( $arr as $lang => $tr_id ) { + $translations[ $lang ] = ( $tr_id && $this->model->post->get_language( (int) $tr_id )->slug == $lang ) ? (int) $tr_id : 0; + } + + $this->model->post->save_translations( $post_id, $translations ); + return $translations; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-filters-post.php b/wp-content/plugins/polylang/admin/admin-filters-post.php new file mode 100644 index 00000000..1460383e --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-filters-post.php @@ -0,0 +1,215 @@ +curlang = &$polylang->curlang; + + add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); + + // Filters posts, pages and media by language + add_action( 'parse_query', array( $this, 'parse_query' ) ); + + // Adds actions and filters related to languages when creating, saving or deleting posts and pages + add_action( 'load-post.php', array( $this, 'edit_post' ) ); + add_action( 'load-edit.php', array( $this, 'bulk_edit_posts' ) ); + add_action( 'wp_ajax_inline-save', array( $this, 'inline_edit_post' ), 0 ); // Before WordPress + + // Sets the language in Tiny MCE + add_filter( 'tiny_mce_before_init', array( $this, 'tiny_mce_before_init' ) ); + } + + /** + * Outputs a javascript list of terms ordered by language and hierarchical taxonomies + * to filter the category checklist per post language in quick edit + * Outputs a javascript list of pages ordered by language + * to filter the parent dropdown per post language in quick edit + * + * @since 1.7 + */ + public function admin_enqueue_scripts() { + $screen = get_current_screen(); + + // Hierarchical taxonomies + if ( 'edit' == $screen->base && $taxonomies = get_object_taxonomies( $screen->post_type, 'object' ) ) { + // Get translated hierarchical taxonomies + $hierarchical_taxonomies = array(); + foreach ( $taxonomies as $taxonomy ) { + if ( $taxonomy->hierarchical && $taxonomy->show_in_quick_edit && $this->model->is_translated_taxonomy( $taxonomy->name ) ) { + $hierarchical_taxonomies[] = $taxonomy->name; + } + } + + if ( ! empty( $hierarchical_taxonomies ) ) { + $terms = get_terms( $hierarchical_taxonomies, array( 'get' => 'all' ) ); + $term_languages = array(); + + foreach ( $terms as $term ) { + if ( $lang = $this->model->term->get_language( $term->term_id ) ) { + $term_languages[ $lang->slug ][ $term->taxonomy ][] = $term->term_id; + } + } + + // Send all these data to javascript + if ( ! empty( $term_languages ) ) { + wp_localize_script( 'pll_post', 'pll_term_languages', $term_languages ); + } + } + } + + // Hierarchical post types + if ( 'edit' == $screen->base && is_post_type_hierarchical( $screen->post_type ) ) { + $pages = get_pages( array( 'sort_column' => 'menu_order, post_title' ) ); // Same arguments as the parent pages dropdown to avoid an extra query. + update_post_caches( $pages, $screen->post_type ); + + $page_languages = array(); + + foreach ( $pages as $page ) { + if ( $lang = $this->model->post->get_language( $page->ID ) ) { + $page_languages[ $lang->slug ][] = $page->ID; + } + } + + // Send all these data to javascript + if ( ! empty( $page_languages ) ) { + wp_localize_script( 'pll_post', 'pll_page_languages', $page_languages ); + } + } + } + + /** + * Filters posts, pages and media by language + * + * @since 0.1 + * + * @param object $query a WP_Query object + */ + public function parse_query( $query ) { + $pll_query = new PLL_Query( $query, $this->model ); + $pll_query->filter_query( $this->curlang ); + } + + /** + * Save language and translation when editing a post (post.php) + * + * @since 2.3 + */ + public function edit_post() { + if ( isset( $_POST['post_lang_choice'], $_POST['post_ID'] ) && $post_id = (int) $_POST['post_ID'] ) { // phpcs:ignore WordPress.Security.NonceVerification + check_admin_referer( 'pll_language', '_pll_nonce' ); + + $post = get_post( $post_id ); + $post_type_object = get_post_type_object( $post->post_type ); + + if ( current_user_can( $post_type_object->cap->edit_post, $post_id ) ) { + $this->model->post->set_language( $post_id, $this->model->get_language( sanitize_key( $_POST['post_lang_choice'] ) ) ); + + if ( isset( $_POST['post_tr_lang'] ) ) { + $this->save_translations( $post_id, array_map( 'absint', $_POST['post_tr_lang'] ) ); + } + } + } + } + + /** + * Save language when inline editing or bulk editing a post + * Fix translations if necessary + * + * @since 2.3 + * + * @param int $post_id Post ID + * @param object $lang Language + */ + protected function inline_save_language( $post_id, $lang ) { + $post = get_post( $post_id ); + $post_type_object = get_post_type_object( $post->post_type ); + + if ( current_user_can( $post_type_object->cap->edit_post, $post_id ) ) { + $old_lang = $this->model->post->get_language( $post_id ); // Stores the old language + $this->model->post->set_language( $post_id, $lang ); // set new language + + // Checks if the new language already exists in the translation group + if ( $old_lang && $old_lang->slug != $lang->slug ) { + $translations = $this->model->post->get_translations( $post_id ); + + // If yes, separate this post from the translation group + if ( array_key_exists( $lang->slug, $translations ) ) { + $this->model->post->delete_translation( $post_id ); + } + + elseif ( array_key_exists( $old_lang->slug, $translations ) ) { + unset( $translations[ $old_lang->slug ] ); + $this->model->post->save_translations( $post_id, $translations ); + } + } + } + } + + /** + * Save language when bulk editing a post + * + * @since 2.3 + */ + public function bulk_edit_posts() { + if ( isset( $_GET['bulk_edit'], $_GET['inline_lang_choice'], $_REQUEST['post'] ) && -1 !== $_GET['inline_lang_choice'] ) { // phpcs:ignore WordPress.Security.NonceVerification + check_admin_referer( 'bulk-posts' ); + + if ( $lang = $this->model->get_language( sanitize_key( $_GET['inline_lang_choice'] ) ) ) { + $post_ids = array_map( 'intval', (array) $_REQUEST['post'] ); + foreach ( $post_ids as $post_id ) { + $this->inline_save_language( $post_id, $lang ); + } + } + } + } + + /** + * Save language when inline editing a post + * + * @since 2.3 + */ + public function inline_edit_post() { + check_admin_referer( 'inlineeditnonce', '_inline_edit' ); + + if ( isset( $_POST['post_ID'], $_POST['inline_lang_choice'] ) ) { + $post_id = (int) $_POST['post_ID']; + $lang = $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ); + if ( $post_id && $lang ) { + $this->inline_save_language( $post_id, $lang ); + } + } + } + + /** + * Sets the language attribute and text direction for Tiny MCE + * + * @since 2.2 + * + * @param array $mce_init TinyMCE config + * @return array + */ + public function tiny_mce_before_init( $mce_init ) { + if ( ! empty( $this->curlang ) ) { + $mce_init['wp_lang_attr'] = $this->curlang->get_locale( 'display' ); + $mce_init['directionality'] = $this->curlang->is_rtl ? 'rtl' : 'ltr'; + } + return $mce_init; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-filters-term.php b/wp-content/plugins/polylang/admin/admin-filters-term.php new file mode 100644 index 00000000..c5e6af7a --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-filters-term.php @@ -0,0 +1,648 @@ +links = &$polylang->links; + $this->model = &$polylang->model; + $this->options = &$polylang->options; + $this->pref_lang = &$polylang->pref_lang; + + foreach ( $this->model->get_translated_taxonomies() as $tax ) { + // Adds the language field in the 'Categories' and 'Post Tags' panels + add_action( $tax . '_add_form_fields', array( $this, 'add_term_form' ) ); + + // Adds the language field and translations tables in the 'Edit Category' and 'Edit Tag' panels + add_action( $tax . '_edit_form_fields', array( $this, 'edit_term_form' ) ); + } + + // Adds actions related to languages when creating or saving categories and post tags + add_filter( 'wp_dropdown_cats', array( $this, 'wp_dropdown_cats' ) ); + add_action( 'create_term', array( $this, 'save_term' ), 900, 3 ); + add_action( 'edit_term', array( $this, 'save_term' ), 900, 3 ); // Late as it may conflict with other plugins, see http://wordpress.org/support/topic/polylang-and-wordpress-seo-by-yoast + add_action( 'pre_post_update', array( $this, 'pre_post_update' ) ); + add_filter( 'pre_term_name', array( $this, 'pre_term_name' ) ); + add_filter( 'pre_term_slug', array( $this, 'pre_term_slug' ), 10, 2 ); + + // Ajax response for edit term form + add_action( 'wp_ajax_term_lang_choice', array( $this, 'term_lang_choice' ) ); + add_action( 'wp_ajax_pll_terms_not_translated', array( $this, 'ajax_terms_not_translated' ) ); + + // Allows to get the default categories in all languages + add_filter( 'option_default_category', array( $this, 'option_default_category' ) ); + add_action( 'update_option_default_category', array( $this, 'update_option_default_category' ), 10, 2 ); + + // Updates the translations term ids when splitting a shared term + add_action( 'split_shared_term', array( $this, 'split_shared_term' ), 10, 4 ); // WP 4.2 + } + + /** + * Adds the language field in the 'Categories' and 'Post Tags' panels + * + * @since 0.1 + */ + public function add_term_form() { + if ( isset( $_GET['taxonomy'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $taxonomy = sanitize_key( $_GET['taxonomy'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + if ( isset( $_REQUEST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $post_type = sanitize_key( $_REQUEST['post_type'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + if ( isset( $GLOBALS['post_type'] ) ) { + $post_type = $GLOBALS['post_type']; + } + + if ( empty( $taxonomy ) || ! taxonomy_exists( $taxonomy ) || ! post_type_exists( $post_type ) ) { + return; + } + + $from_term_id = isset( $_GET['from_tag'] ) ? (int) $_GET['from_tag'] : 0; // phpcs:ignore WordPress.Security.NonceVerification + + $lang = isset( $_GET['new_lang'] ) ? $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ) : $this->pref_lang; // phpcs:ignore WordPress.Security.NonceVerification + + $dropdown = new PLL_Walker_Dropdown(); + + $dropdown_html = $dropdown->walk( + $this->model->get_languages_list(), + -1, + array( + 'name' => 'term_lang_choice', + 'value' => 'term_id', + 'selected' => $lang ? $lang->term_id : '', + 'flag' => true, + ) + ); + + wp_nonce_field( 'pll_language', '_pll_nonce' ); + + printf( + '
+ +
%s
+

%s

+
', + esc_html__( 'Language', 'polylang' ), + $dropdown_html, // phpcs:ignore + esc_html__( 'Sets the language', 'polylang' ) + ); + + if ( ! empty( $from_term_id ) ) { + printf( '', (int) $from_term_id ); + } + + // Adds translation fields + echo '
'; + if ( $lang ) { + include __DIR__ . '/view-translations-term.php'; + } + echo '
' . "\n"; + } + + /** + * Adds the language field and translations tables in the 'Edit Category' and 'Edit Tag' panels + * + * @since 0.1 + * + * @param object $tag + */ + public function edit_term_form( $tag ) { + if ( isset( $_REQUEST['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $post_type = sanitize_key( $_REQUEST['post_type'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + if ( isset( $GLOBALS['post_type'] ) ) { + $post_type = $GLOBALS['post_type']; + } + + if ( ! post_type_exists( $post_type ) ) { + return; + } + + $term_id = $tag->term_id; + $taxonomy = $tag->taxonomy; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + + $lang = $this->model->term->get_language( $term_id ); + $lang = empty( $lang ) ? $this->pref_lang : $lang; + + // Disable the language dropdown and the translations input fields for default categories to prevent removal + $disabled = in_array( get_option( 'default_category' ), $this->model->term->get_translations( $term_id ) ); + + $dropdown = new PLL_Walker_Dropdown(); + + $dropdown_html = $dropdown->walk( + $this->model->get_languages_list(), + -1, + array( + 'name' => 'term_lang_choice', + 'value' => 'term_id', + 'selected' => $lang ? $lang->term_id : '', + 'disabled' => $disabled, + 'flag' => true, + ) + ); + + wp_nonce_field( 'pll_language', '_pll_nonce' ); + + printf( + ' + + + + + %s
+

%s

+ + ', + esc_html__( 'Language', 'polylang' ), + $dropdown_html, // phpcs:ignore + esc_html__( 'Sets the language', 'polylang' ) + ); + + echo ''; + if ( $lang ) { + include __DIR__ . '/view-translations-term.php'; + } + echo '' . "\n"; + } + + /** + * Translates term parent if exists when using "Add new" ( translation ) + * + * @since 0.7 + * + * @param string $output html markup for dropdown list of categories + * @return string modified html + */ + public function wp_dropdown_cats( $output ) { + if ( isset( $_GET['taxonomy'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $taxonomy = sanitize_key( $_GET['taxonomy'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + if ( isset( $taxonomy, $_GET['from_tag'], $_GET['new_lang'] ) && taxonomy_exists( $taxonomy ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $term = get_term( (int) $_GET['from_tag'], $taxonomy ); // phpcs:ignore WordPress.Security.NonceVerification + + if ( $term && $id = $term->parent ) { + $lang = $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + if ( $parent = $this->model->term->get_translation( $id, $lang ) ) { + return str_replace( '"' . $parent . '"', '"' . $parent . '" selected="selected"', $output ); + } + } + } + return $output; + } + + /** + * Stores the current post_id when bulk editing posts for use in save_language and pre_term_slug + * + * @since 1.7 + * + * @param int $post_id + */ + public function pre_post_update( $post_id ) { + if ( isset( $_GET['bulk_edit'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->post_id = $post_id; + } + } + + /** + * Saves language + * + * @since 1.5 + * + * @param int $term_id + * @param string $taxonomy + */ + protected function save_language( $term_id, $taxonomy ) { + global $wpdb; + // Security checks are necessary to accept language modifications + // as 'wp_update_term' can be called from outside WP admin + + // Edit tags + if ( isset( $_POST['term_lang_choice'] ) ) { + if ( isset( $_POST['action'] ) && sanitize_key( $_POST['action'] ) === 'add-' . $taxonomy ) { // phpcs:ignore WordPress.Security.NonceVerification + check_ajax_referer( 'add-' . $taxonomy, '_ajax_nonce-add-' . $taxonomy ); // Category metabox + } else { + check_admin_referer( 'pll_language', '_pll_nonce' ); // Edit tags or tags metabox + } + + $this->model->term->set_language( $term_id, $this->model->get_language( sanitize_key( $_POST['term_lang_choice'] ) ) ); + } + + // *Post* bulk edit, in case a new term is created + elseif ( isset( $_GET['bulk_edit'], $_GET['inline_lang_choice'] ) ) { + check_admin_referer( 'bulk-posts' ); + + // Bulk edit does not modify the language + // So we possibly create a tag in several languages + if ( -1 == $_GET['inline_lang_choice'] ) { + // The language of the current term is set a according to the language of the current post + $this->model->term->set_language( $term_id, $this->model->post->get_language( $this->post_id ) ); + $term = get_term( $term_id, $taxonomy ); + + // Get all terms with the same name + // FIXME backward compatibility WP < 4.2 + // No WP function to get all terms with the exact same name so let's use a custom query + // $terms = get_terms( $taxonomy, array( 'name' => $term->name, 'hide_empty' => false, 'fields' => 'ids' ) ); should be OK in 4.2 + // I may need to rework the loop below + $terms = $wpdb->get_results( + $wpdb->prepare( + "SELECT t.term_id FROM $wpdb->terms AS t + INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id + WHERE tt.taxonomy = %s AND t.name = %s", + $taxonomy, + $term->name + ) + ); + + // If we have several terms with the same name, they are translations of each other + if ( count( $terms ) > 1 ) { + $translations = array(); + + foreach ( $terms as $term ) { + $translations[ $this->model->term->get_language( $term->term_id )->slug ] = $term->term_id; + } + + $this->model->term->save_translations( $term_id, $translations ); + } + } + + else { + $this->model->term->set_language( $term_id, $this->model->get_language( sanitize_key( $_GET['inline_lang_choice'] ) ) ); + } + } + + // Quick edit + elseif ( isset( $_POST['inline_lang_choice'] ) ) { + check_ajax_referer( + isset( $_POST['action'] ) && 'inline-save' == $_POST['action'] ? 'inlineeditnonce' : 'taxinlineeditnonce', // Post quick edit or tag quick edit ? + '_inline_edit' + ); + + $old_lang = $this->model->term->get_language( $term_id ); // Stores the old language + $lang = $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ); // New language + $translations = $this->model->term->get_translations( $term_id ); + + // Checks if the new language already exists in the translation group + if ( $old_lang && $old_lang->slug != $lang->slug ) { + if ( array_key_exists( $lang->slug, $translations ) ) { + $this->model->term->delete_translation( $term_id ); + } + + elseif ( array_key_exists( $old_lang->slug, $translations ) ) { + unset( $translations[ $old_lang->slug ] ); + $this->model->term->save_translations( $term_id, $translations ); + } + } + + $this->model->term->set_language( $term_id, $lang ); // Set new language + } + + // Edit post + elseif ( isset( $_POST['post_lang_choice'] ) ) { // FIXME should be useless now + check_admin_referer( 'pll_language', '_pll_nonce' ); + $this->model->term->set_language( $term_id, $this->model->get_language( sanitize_key( $_POST['post_lang_choice'] ) ) ); + } + } + + /** + * Save translations from our form + * + * @since 1.5 + * + * @param int $term_id + * @return array + */ + protected function save_translations( $term_id ) { + // Security check as 'wp_update_term' can be called from outside WP admin + check_admin_referer( 'pll_language', '_pll_nonce' ); + + $translations = array(); + + // Save translations after checking the translated term is in the right language ( as well as cast id to int ) + if ( isset( $_POST['term_tr_lang'] ) ) { + foreach ( array_map( 'absint', $_POST['term_tr_lang'] ) as $lang => $tr_id ) { + $tr_lang = $this->model->term->get_language( $tr_id ); + $translations[ $lang ] = $tr_lang && $tr_lang->slug == $lang ? $tr_id : 0; + } + } + + $this->model->term->save_translations( $term_id, $translations ); + + return $translations; + } + + /** + * Called when a category or post tag is created or edited + * Saves language and translations + * + * @since 0.1 + * + * @param int $term_id + * @param int $tt_id term taxonomy id + * @param string $taxonomy + */ + public function save_term( $term_id, $tt_id, $taxonomy ) { + // Does nothing except on taxonomies which are filterable + if ( ! $this->model->is_translated_taxonomy( $taxonomy ) ) { + return; + } + + // Capability check + // As 'wp_update_term' can be called from outside WP admin + // 2nd test for creating tags when creating / editing a post + $tax = get_taxonomy( $taxonomy ); + if ( current_user_can( $tax->cap->edit_terms ) || ( isset( $_POST['tax_input'][ $taxonomy ] ) && current_user_can( $tax->cap->assign_terms ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->save_language( $term_id, $taxonomy ); + + if ( isset( $_POST['term_tr_lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->save_translations( $term_id ); + } + } + } + + /** + * Stores the term name for use in pre_term_slug + * + * @since 0.9.5 + * + * @param string $name term name + * @return string unmodified term name + */ + public function pre_term_name( $name ) { + return $this->pre_term_name = $name; + } + + /** + * Creates the term slug in case the term already exists in another language + * + * @since 0.9.5 + * + * @param string $slug + * @param string $taxonomy + * @return string + */ + public function pre_term_slug( $slug, $taxonomy ) { + $name = sanitize_title( $this->pre_term_name ); + + // If the term already exists in another language + if ( ! $slug && $this->model->is_translated_taxonomy( $taxonomy ) && term_exists( $name, $taxonomy ) ) { + if ( isset( $_POST['term_lang_choice'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $lang = $this->model->get_language( sanitize_key( $_POST['term_lang_choice'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + elseif ( isset( $_POST['inline_lang_choice'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $lang = $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + // *Post* bulk edit, in case a new term is created + elseif ( isset( $_GET['bulk_edit'], $_GET['inline_lang_choice'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + // Bulk edit does not modify the language + if ( -1 == $_GET['inline_lang_choice'] ) { // phpcs:ignore WordPress.Security.NonceVerification + $lang = $this->model->post->get_language( $this->post_id ); + } else { + $lang = $this->model->get_language( sanitize_key( $_GET['inline_lang_choice'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + } + + if ( ! empty( $lang ) && ! $this->model->term_exists_by_slug( $name, $lang, $taxonomy ) ) { + $slug = $name . '-' . $lang->slug; + } + } + + return $slug; + } + + /** + * Ajax response for edit term form + * + * @since 0.2 + */ + public function term_lang_choice() { + check_ajax_referer( 'pll_language', '_pll_nonce' ); + + if ( ! isset( $_POST['taxonomy'], $_POST['post_type'], $_POST['lang'] ) ) { + wp_die( 0 ); + } + + $lang = $this->model->get_language( sanitize_key( $_POST['lang'] ) ); + $term_id = isset( $_POST['term_id'] ) ? (int) $_POST['term_id'] : null; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + $taxonomy = sanitize_key( $_POST['taxonomy'] ); + $post_type = sanitize_key( $_POST['post_type'] ); + + if ( ! post_type_exists( $post_type ) || ! taxonomy_exists( $taxonomy ) ) { + wp_die( 0 ); + } + + ob_start(); + if ( $lang ) { + include __DIR__ . '/view-translations-term.php'; + } + $x = new WP_Ajax_Response( array( 'what' => 'translations', 'data' => ob_get_contents() ) ); + ob_end_clean(); + + // Parent dropdown list ( only for hierarchical taxonomies ) + // $args copied from edit_tags.php except echo + if ( is_taxonomy_hierarchical( $taxonomy ) ) { + $args = array( + 'hide_empty' => 0, + 'hide_if_empty' => false, + 'taxonomy' => $taxonomy, + 'name' => 'parent', + 'orderby' => 'name', + 'hierarchical' => true, + 'show_option_none' => __( 'None', 'polylang' ), + 'echo' => 0, + ); + $x->Add( array( 'what' => 'parent', 'data' => wp_dropdown_categories( $args ) ) ); + } + + // Tag cloud + // Tests copied from edit_tags.php + else { + $tax = get_taxonomy( $taxonomy ); + if ( ! is_null( $tax->labels->popular_items ) ) { + $args = array( 'taxonomy' => $taxonomy, 'echo' => false ); + if ( current_user_can( $tax->cap->edit_terms ) ) { + $args = array_merge( $args, array( 'link' => 'edit' ) ); + } + + if ( $tag_cloud = wp_tag_cloud( $args ) ) { + $html = sprintf( '

%1$s

%2$s
', esc_html( $tax->labels->popular_items ), $tag_cloud ); + $x->Add( array( 'what' => 'tag_cloud', 'data' => $html ) ); + } + } + } + + // Flag + $x->Add( array( 'what' => 'flag', 'data' => empty( $lang->flag ) ? esc_html( $lang->slug ) : $lang->flag ) ); + + $x->send(); + } + + /** + * Ajax response for input in translation autocomplete input box + * + * @since 1.5 + */ + public function ajax_terms_not_translated() { + check_ajax_referer( 'pll_language', '_pll_nonce' ); + + if ( ! isset( $_GET['term'], $_GET['post_type'], $_GET['taxonomy'], $_GET['term_language'], $_GET['translation_language'] ) ) { + wp_die( 0 ); + } + + $s = wp_unslash( $_GET['term'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput + $post_type = sanitize_key( $_GET['post_type'] ); + $taxonomy = sanitize_key( $_GET['taxonomy'] ); + + if ( ! post_type_exists( $post_type ) || ! taxonomy_exists( $taxonomy ) ) { + wp_die( 0 ); + } + + $term_language = $this->model->get_language( sanitize_key( $_GET['term_language'] ) ); + $translation_language = $this->model->get_language( sanitize_key( $_GET['translation_language'] ) ); + + $terms = array(); + $return = array(); + + // Add current translation in list. + // Not in add term as term_id is not set. + if ( isset( $_GET['term_id'] ) && 'undefined' !== $_GET['term_id'] && $term_id = $this->model->term->get_translation( (int) $_GET['term_id'], $translation_language ) ) { + $terms = array( get_term( $term_id, $taxonomy ) ); + } + + // It is more efficient to use one common query for all languages as soon as there are more than 2. + foreach ( get_terms( $taxonomy, 'hide_empty=0&lang=0&name__like=' . $s ) as $term ) { + $lang = $this->model->term->get_language( $term->term_id ); + + if ( $lang && $lang->slug == $translation_language->slug && ! $this->model->term->get_translation( $term->term_id, $term_language ) ) { + $terms[] = $term; + } + } + + // Format the ajax response. + foreach ( $terms as $term ) { + $return[] = array( + 'id' => $term->term_id, + 'value' => rtrim( // Trim the seperator added at the end by WP. + get_term_parents_list( + $term->term_id, + $term->taxonomy, + array( + 'separator' => ' > ', + 'link' => false, + ) + ), + ' >' + ), + 'link' => $this->links->edit_term_translation_link( $term->term_id, $term->taxonomy, $post_type ), + ); + } + + wp_die( wp_json_encode( $return ) ); + } + + /** + * Filters the default category in note below the category list table and in settings->writing dropdown + * + * @since 1.2 + * + * @param int $value + * @return int + */ + public function option_default_category( $value ) { + if ( isset( $this->pref_lang ) && $tr = $this->model->term->get( $value, $this->pref_lang ) ) { + $value = $tr; + } + return $value; + } + + /** + * Checks if the new default category is translated in all languages + * If not, create the translations + * + * @since 1.7 + * + * @param int $old_value + * @param int $value + */ + public function update_option_default_category( $old_value, $value ) { + $default_cat_lang = $this->model->term->get_language( $value ); + + // Assign a default language to default category + if ( ! $default_cat_lang ) { + $default_cat_lang = $this->model->get_language( $this->options['default_lang'] ); + $this->model->term->set_language( (int) $value, $default_cat_lang ); + } + + foreach ( $this->model->get_languages_list() as $language ) { + if ( $language->slug != $default_cat_lang->slug && ! $this->model->term->get_translation( $value, $language ) ) { + $this->model->create_default_category( $language ); + } + } + } + + /** + * Updates the translations term ids when splitting a shared term + * Splits translations if these are shared terms too + * + * @since 1.7 + * + * @param int $term_id Shared term_id + * @param int $new_term_id + * @param int $term_taxonomy_id + * @param string $taxonomy + */ + public function split_shared_term( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { + if ( ! $this->model->is_translated_taxonomy( $taxonomy ) ) { + return; + } + + // Avoid recursion + static $avoid_recursion = false; + if ( $avoid_recursion ) { + return; + } + + $avoid_recursion = true; + $lang = $this->model->term->get_language( $term_id ); + $translations = array(); + + foreach ( $this->model->term->get_translations( $term_id ) as $key => $tr_id ) { + if ( $lang->slug == $key ) { + $translations[ $key ] = $new_term_id; + } + else { + $tr_term = get_term( $tr_id, $taxonomy ); + $translations[ $key ] = _split_shared_term( $tr_id, $tr_term->term_taxonomy_id ); + + // Hack translation ids sent by the form to avoid overwrite in PLL_Admin_Filters_Term::save_translations + if ( isset( $_POST['term_tr_lang'][ $key ] ) && $_POST['term_tr_lang'][ $key ] == $tr_id ) { // phpcs:ignore WordPress.Security.NonceVerification + $_POST['term_tr_lang'][ $key ] = $translations[ $key ]; + } + } + $this->model->term->set_language( $translations[ $key ], $key ); + } + + $this->model->term->save_translations( $new_term_id, $translations ); + $avoid_recursion = false; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-filters.php b/wp-content/plugins/polylang/admin/admin-filters.php new file mode 100644 index 00000000..e020a930 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-filters.php @@ -0,0 +1,214 @@ +base ) || ( isset( $_REQUEST['action'] ) && 'save-widget' === $_REQUEST['action'] ) || isset( $GLOBALS['wp_customize'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $dropdown = new PLL_Walker_Dropdown(); + + $dropdown_html = $dropdown->walk( + array_merge( + array( (object) array( 'slug' => 0, 'name' => __( 'All languages', 'polylang' ) ) ), + $this->model->get_languages_list() + ), + -1, + array( + 'name' => $widget->id . '_lang_choice', + 'class' => 'tags-input pll-lang-choice', + 'selected' => empty( $instance['pll_lang'] ) ? '' : $instance['pll_lang'], + ) + ); + + printf( + '

', + esc_attr( $widget->id . '_lang_choice' ), + esc_html__( 'The widget is displayed for:', 'polylang' ), + $dropdown_html // phpcs:ignore WordPress.Security.EscapeOutput + ); + } + } + + /** + * Called when widget options are saved + * saves the language associated to the widget + * + * @since 0.3 + * + * @param array $instance Widget options + * @param array $new_instance Not used + * @param array $old_instance Not used + * @param object $widget WP_Widget object + * @return array Widget options + */ + public function widget_update_callback( $instance, $new_instance, $old_instance, $widget ) { + $key = $widget->id . '_lang_choice'; + + if ( ! empty( $_POST[ $key ] ) && $lang = $this->model->get_language( sanitize_key( $_POST[ $key ] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $instance['pll_lang'] = $lang->slug; + } else { + unset( $instance['pll_lang'] ); + } + + return $instance; + } + + /** + * Updates language user preference set in user profile + * + * @since 0.4 + * + * @param int $user_id + */ + public function personal_options_update( $user_id ) { + // Biography translations + foreach ( $this->model->get_languages_list() as $lang ) { + $meta = $lang->slug == $this->options['default_lang'] ? 'description' : 'description_' . $lang->slug; + $description = empty( $_POST[ 'description_' . $lang->slug ] ) ? '' : trim( $_POST[ 'description_' . $lang->slug ] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput + + /** This filter is documented in wp-includes/user.php */ + $description = apply_filters( 'pre_user_description', $description ); // Applies WP default filter wp_filter_kses + update_user_meta( $user_id, $meta, $description ); + } + } + + /** + * Outputs hidden information to modify the biography form with js + * + * @since 0.4 + * + * @param object $profileuser + */ + public function personal_options( $profileuser ) { + foreach ( $this->model->get_languages_list() as $lang ) { + $meta = $lang->slug == $this->options['default_lang'] ? 'description' : 'description_' . $lang->slug; + + /** This filter is documented in wp-includes/user.php */ + $description = apply_filters( 'user_description', get_user_meta( $profileuser->ID, $meta, true ) ); // Applies WP default filter wp_kses_data + + printf( + '', + esc_attr( $lang->slug ), + esc_attr( $lang->name ), + esc_attr( $description ) + ); + } + } + + /** + * Upgrades languages files after a core upgrade + * only for backward compatibility WP < 4.0 *AND* Polylang < 1.6 + * + * @since 0.6 + * + * @param string $version new WP version + */ + public function upgrade_languages( $version ) { + // $GLOBALS['wp_version'] is the old WP version + if ( version_compare( $version, '4.0', '>=' ) && version_compare( $GLOBALS['wp_version'], '4.0', '<' ) ) { + + /** This filter is documented in wp-admin/includes/update-core.php */ + apply_filters( 'update_feedback', __( 'Upgrading language files…', 'polylang' ) ); + PLL_Upgrade::download_language_packs(); + } + } + + /** + * Allows to update translations files for plugins and themes. + * + * @since 1.6 + * + * @param array $locales List of locales to update for plugins and themes. + * @return array + */ + public function update_check_locales( $locales ) { + return array_merge( $locales, $this->model->get_languages_list( array( 'fields' => 'locale' ) ) ); + } + + /** + * Adds a text direction dependent class to the body + * + * @since 2.2 + * + * @param string $classes Space-separated list of CSS classes. + * @return string + */ + public function admin_body_class( $classes ) { + if ( ! empty( $this->curlang ) ) { + $classes .= ' pll-dir-' . ( $this->curlang->is_rtl ? 'rtl' : 'ltr' ); + } + return $classes; + } + + /** + * Add post state for translations of the privacy policy page + * + * @since 2.7 + * + * @param array $post_states An array of post display states. + * @param object $post The current post object. + * @return array + */ + public function display_post_states( $post_states, $post ) { + $page_for_privacy_policy = get_option( 'wp_page_for_privacy_policy' ); + + if ( $page_for_privacy_policy && in_array( $post->ID, $this->model->post->get_translations( $page_for_privacy_policy ) ) ) { + $post_states['page_for_privacy_policy'] = __( 'Privacy Policy Page', 'polylang' ); + } + + return $post_states; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-links.php b/wp-content/plugins/polylang/admin/admin-links.php new file mode 100644 index 00000000..878a406c --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-links.php @@ -0,0 +1,226 @@ +name ); + + $str = sprintf( + '%3$s', + esc_url( $link ), + esc_attr( $hint ), + esc_html( $hint ) + ); + } + + return $str; + } + + /** + * Returns html markup for a translation link + * + * @since 2.6 + * + * @param string $link The translation link. + * @param object $language The language of the translation. + * @return string + */ + public function edit_translation_link( $link, $language ) { + return $link ? sprintf( + '%2$s', + esc_url( $link ), + /* translators: accessibility text, %s is a native language name */ + esc_html( sprintf( __( 'Edit the translation in %s', 'polylang' ), $language->name ) ) + ) : ''; + } + + /** + * Get the link to create a new post translation + * + * @since 1.5 + * + * @param int $post_id The source post id. + * @param object $language The language of the new translation. + * @param string $context Optional. Defaults to 'display' which encodes '&' to '&'. + * Otherwise, preserves '&'. + * @return string + */ + public function get_new_post_translation_link( $post_id, $language, $context = 'display' ) { + $post_type = get_post_type( $post_id ); + $post_type_object = get_post_type_object( get_post_type( $post_id ) ); + if ( ! current_user_can( $post_type_object->cap->create_posts ) ) { + return ''; + } + + // Special case for the privacy policy page which is associated to a specific capability + if ( 'page' === $post_type_object->name && ! current_user_can( 'manage_privacy_options' ) ) { + $privacy_page = get_option( 'wp_page_for_privacy_policy' ); + if ( $privacy_page && in_array( $post_id, $this->model->post->get_translations( $privacy_page ) ) ) { + return ''; + } + } + + if ( 'attachment' === $post_type ) { + $args = array( + 'action' => 'translate_media', + 'from_media' => $post_id, + 'new_lang' => $language->slug, + ); + + $link = add_query_arg( $args, admin_url( 'admin.php' ) ); + + // Add nonce for media as we will directly publish a new attachment from a click on this link + if ( 'display' === $context ) { + $link = wp_nonce_url( $link, 'translate_media' ); + } else { + $link = add_query_arg( '_wpnonce', wp_create_nonce( 'translate_media' ), $link ); + } + } else { + $args = array( + 'post_type' => $post_type, + 'from_post' => $post_id, + 'new_lang' => $language->slug, + ); + + $link = add_query_arg( $args, admin_url( 'post-new.php' ) ); + + if ( 'display' === $context ) { + $link = wp_nonce_url( $link, 'new-post-translation' ); + } else { + $link = add_query_arg( '_wpnonce', wp_create_nonce( 'new-post-translation' ), $link ); + } + } + + /** + * Filter the new post translation link + * + * @since 1.8 + * + * @param string $link the new post translation link + * @param object $language the language of the new translation + * @param int $post_id the source post id + */ + return apply_filters( 'pll_get_new_post_translation_link', $link, $language, $post_id ); + } + + /** + * Returns html markup for a new post translation link + * + * @since 1.8 + * + * @param int $post_id + * @param object $language + * @return string + */ + public function new_post_translation_link( $post_id, $language ) { + $link = $this->get_new_post_translation_link( $post_id, $language ); + return $this->new_translation_link( $link, $language ); + } + + /** + * Returns html markup for a translation link + * + * @since 1.4 + * + * @param int $post_id translation post id + * @return string + */ + public function edit_post_translation_link( $post_id ) { + $link = get_edit_post_link( $post_id ); + $language = $this->model->post->get_language( $post_id ); + return $this->edit_translation_link( $link, $language ); + } + + /** + * Get the link to create a new term translation + * + * @since 1.5 + * + * @param int $term_id + * @param string $taxonomy + * @param string $post_type + * @param object $language + * @return string + */ + public function get_new_term_translation_link( $term_id, $taxonomy, $post_type, $language ) { + $tax = get_taxonomy( $taxonomy ); + if ( ! $tax || ! current_user_can( $tax->cap->edit_terms ) ) { + return ''; + } + + $args = array( + 'taxonomy' => $taxonomy, + 'post_type' => $post_type, + 'from_tag' => $term_id, + 'new_lang' => $language->slug, + ); + + $link = add_query_arg( $args, admin_url( 'edit-tags.php' ) ); + + /** + * Filter the new term translation link + * + * @since 1.8 + * + * @param string $link the new term translation link + * @param object $language the language of the new translation + * @param int $term_id the source term id + * @param string $taxonomy + * @param string $post_type + */ + return apply_filters( 'pll_get_new_term_translation_link', $link, $language, $term_id, $taxonomy, $post_type ); + } + + /** + * Returns html markup for a new term translation + * + * @since 1.8 + * + * @param int $term_id + * @param string $taxonomy + * @param string $post_type + * @param object $language + * @return string + */ + public function new_term_translation_link( $term_id, $taxonomy, $post_type, $language ) { + $link = $this->get_new_term_translation_link( $term_id, $taxonomy, $post_type, $language ); + return $this->new_translation_link( $link, $language ); + } + + /** + * Returns html markup for a term translation link + * + * @since 1.4 + * + * @param object $term_id translation term id + * @param string $taxonomy + * @param string $post_type + * @return string + */ + public function edit_term_translation_link( $term_id, $taxonomy, $post_type ) { + $link = get_edit_term_link( $term_id, $taxonomy, $post_type ); + $language = $this->model->term->get_language( $term_id ); + return $this->edit_translation_link( $link, $language ); + } +} diff --git a/wp-content/plugins/polylang/admin/admin-model.php b/wp-content/plugins/polylang/admin/admin-model.php new file mode 100644 index 00000000..b4e96816 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-model.php @@ -0,0 +1,603 @@ + language name ( used only for display ) + * slug -> language code ( ideally 2-letters ISO 639-1 language code ) + * locale -> WordPress locale. If something wrong is used for the locale, the .mo files will not be loaded... + * rtl -> 1 if rtl language, 0 otherwise + * term_group -> language order when displayed + * + * Optional arguments that $args can contain: + * no_default_cat -> if set, no default category will be created for this language + * flag -> country code, see flags.php + * + * @since 1.2 + * + * @param array $args + * @return bool true if success / false if failed + */ + public function add_language( $args ) { + $errors = $this->validate_lang( $args ); + if ( $errors->get_error_code() ) { // Using has_errors() would be more meaningful but is available only since WP 5.0 + return $errors; + } + + // First the language taxonomy + $description = maybe_serialize( array( 'locale' => $args['locale'], 'rtl' => (int) $args['rtl'], 'flag_code' => empty( $args['flag'] ) ? '' : $args['flag'] ) ); + $r = wp_insert_term( $args['name'], 'language', array( 'slug' => $args['slug'], 'description' => $description ) ); + if ( is_wp_error( $r ) ) { + // Avoid an ugly fatal error if something went wrong ( reported once in the forum ) + return new WP_Error( 'pll_add_language', __( 'Impossible to add the language.', 'polylang' ) ); + } + wp_update_term( (int) $r['term_id'], 'language', array( 'term_group' => (int) $args['term_group'] ) ); // can't set the term group directly in wp_insert_term + + // The term_language taxonomy + // Don't want shared terms so use a different slug + wp_insert_term( $args['name'], 'term_language', array( 'slug' => 'pll_' . $args['slug'] ) ); + + $this->clean_languages_cache(); // Update the languages list now ! + + if ( ! isset( $this->options['default_lang'] ) ) { + // If this is the first language created, set it as default language + $this->options['default_lang'] = $args['slug']; + update_option( 'polylang', $this->options ); + + // And assign default language to default category + $this->term->set_language( (int) get_option( 'default_category' ), (int) $r['term_id'] ); + } elseif ( empty( $args['no_default_cat'] ) ) { + $this->create_default_category( $args['slug'] ); + } + + // Init a mo_id for this language + $mo = new PLL_MO(); + $mo->export_to_db( $this->get_language( $args['slug'] ) ); + + /** + * Fires when a language is added + * + * @since 1.9 + * + * @param array $args arguments used to create the language + */ + do_action( 'pll_add_language', $args ); + + $this->clean_languages_cache(); // Again to set add mo_id in the cached languages list + flush_rewrite_rules(); // Refresh rewrite rules + return true; + } + + /** + * Delete a language + * + * @since 1.2 + * + * @param int $lang_id language term_id + */ + public function delete_language( $lang_id ) { + $lang = $this->get_language( (int) $lang_id ); + + if ( empty( $lang ) ) { + return false; + } + + // Oops ! we are deleting the default language... + // Need to do this before loosing the information for default category translations + if ( $this->options['default_lang'] == $lang->slug ) { + $slugs = $this->get_languages_list( array( 'fields' => 'slug' ) ); + $slugs = array_diff( $slugs, array( $lang->slug ) ); + + if ( ! empty( $slugs ) ) { + $this->update_default_lang( reset( $slugs ) ); // Arbitrary choice... + } else { + unset( $this->options['default_lang'] ); + } + } + + // Delete the translations + $this->update_translations( $lang->slug ); + + // Delete language option in widgets + foreach ( $GLOBALS['wp_registered_widgets'] as $widget ) { + if ( ! empty( $widget['callback'][0] ) && ! empty( $widget['params'][0]['number'] ) ) { + $obj = $widget['callback'][0]; + $number = $widget['params'][0]['number']; + if ( is_object( $obj ) && method_exists( $obj, 'get_settings' ) && method_exists( $obj, 'save_settings' ) ) { + $settings = $obj->get_settings(); + if ( isset( $settings[ $number ]['pll_lang'] ) && $settings[ $number ]['pll_lang'] == $lang->slug ) { + unset( $settings[ $number ]['pll_lang'] ); + $obj->save_settings( $settings ); + } + } + } + } + + // Delete menus locations + if ( ! empty( $this->options['nav_menus'] ) ) { + foreach ( $this->options['nav_menus'] as $theme => $locations ) { + foreach ( array_keys( $locations ) as $location ) { + unset( $this->options['nav_menus'][ $theme ][ $location ][ $lang->slug ] ); + } + } + } + + // Delete users options + foreach ( get_users( array( 'fields' => 'ID' ) ) as $user_id ) { + delete_user_meta( $user_id, 'pll_filter_content', $lang->slug ); + delete_user_meta( $user_id, 'description_' . $lang->slug ); + } + + // Delete the string translations + $post = wpcom_vip_get_page_by_title( 'polylang_mo_' . $lang->term_id, OBJECT, 'polylang_mo' ); + if ( ! empty( $post ) ) { + wp_delete_post( $post->ID ); + } + + // Delete domain + unset( $this->options['domains'][ $lang->slug ] ); + + // Delete the language itself + wp_delete_term( $lang->term_id, 'language' ); + wp_delete_term( $lang->tl_term_id, 'term_language' ); + + // Update languages list + $this->clean_languages_cache(); + + update_option( 'polylang', $this->options ); + flush_rewrite_rules(); // refresh rewrite rules + return true; + } + + /** + * Update language properties + * + * List of arguments that $args must contain: + * lang_id -> term_id of the language to modify + * name -> language name ( used only for display ) + * slug -> language code ( ideally 2-letters ISO 639-1 language code + * locale -> WordPress locale. If something wrong is used for the locale, the .mo files will not be loaded... + * rtl -> 1 if rtl language, 0 otherwise + * term_group -> language order when displayed + * + * Optional arguments that $args can contain: + * flag -> country code, see flags.php + * + * @since 1.2 + * + * @param array $args + * @return bool true if success / false if failed + */ + public function update_language( $args ) { + $lang = $this->get_language( (int) $args['lang_id'] ); + + $errors = $this->validate_lang( $args, $lang ); + if ( $errors->get_error_code() ) { // Using has_errors() would be more meaningful but is available only since WP 5.0 + return $errors; + } + + // Update links to this language in posts and terms in case the slug has been modified + $slug = $args['slug']; + $old_slug = $lang->slug; + + if ( $old_slug != $slug ) { + // Update the language slug in translations + $this->update_translations( $old_slug, $slug ); + + // Update language option in widgets + foreach ( $GLOBALS['wp_registered_widgets'] as $widget ) { + if ( ! empty( $widget['callback'][0] ) && ! empty( $widget['params'][0]['number'] ) ) { + $obj = $widget['callback'][0]; + $number = $widget['params'][0]['number']; + if ( is_object( $obj ) && method_exists( $obj, 'get_settings' ) && method_exists( $obj, 'save_settings' ) ) { + $settings = $obj->get_settings(); + if ( isset( $settings[ $number ]['pll_lang'] ) && $settings[ $number ]['pll_lang'] == $old_slug ) { + $settings[ $number ]['pll_lang'] = $slug; + $obj->save_settings( $settings ); + } + } + } + } + + // Update menus locations + if ( ! empty( $this->options['nav_menus'] ) ) { + foreach ( $this->options['nav_menus'] as $theme => $locations ) { + foreach ( array_keys( $locations ) as $location ) { + if ( ! empty( $this->options['nav_menus'][ $theme ][ $location ][ $old_slug ] ) ) { + $this->options['nav_menus'][ $theme ][ $location ][ $slug ] = $this->options['nav_menus'][ $theme ][ $location ][ $old_slug ]; + unset( $this->options['nav_menus'][ $theme ][ $location ][ $old_slug ] ); + } + } + } + } + + // Update domains + if ( ! empty( $this->options['domains'][ $old_slug ] ) ) { + $this->options['domains'][ $slug ] = $this->options['domains'][ $old_slug ]; + unset( $this->options['domains'][ $old_slug ] ); + } + + // Update the default language option if necessary + if ( $this->options['default_lang'] == $old_slug ) { + $this->options['default_lang'] = $slug; + } + } + + update_option( 'polylang', $this->options ); + + // And finally update the language itself + $description = maybe_serialize( array( 'locale' => $args['locale'], 'rtl' => (int) $args['rtl'], 'flag_code' => empty( $args['flag'] ) ? '' : $args['flag'] ) ); + wp_update_term( (int) $lang->term_id, 'language', array( 'slug' => $slug, 'name' => $args['name'], 'description' => $description, 'term_group' => (int) $args['term_group'] ) ); + wp_update_term( (int) $lang->tl_term_id, 'term_language', array( 'slug' => 'pll_' . $slug, 'name' => $args['name'] ) ); + + /** + * Fires when a language is added + * + * @since 1.9 + * + * @param array $args arguments used to modify the language + */ + do_action( 'pll_update_language', $args ); + + $this->clean_languages_cache(); + flush_rewrite_rules(); // Refresh rewrite rules + return true; + } + + /** + * Validates data entered when creating or updating a language + * + * @see PLL_Admin_Model::add_language() + * + * @since 0.4 + * + * @param array $args + * @param object $lang optional the language currently updated, the language is created if not set + * @return bool true if success / false if failed + */ + protected function validate_lang( $args, $lang = null ) { + $errors = new WP_Error(); + + // Validate locale with the same pattern as WP 4.3. See #28303 + if ( ! preg_match( '#^[a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?$#', $args['locale'], $matches ) ) { + $errors->add( 'pll_invalid_locale', __( 'Enter a valid WordPress locale', 'polylang' ) ); + } + + // Validate slug characters + if ( ! preg_match( '#^[a-z_-]+$#', $args['slug'] ) ) { + $errors->add( 'pll_invalid_slug', __( 'The language code contains invalid characters', 'polylang' ) ); + } + + // Validate slug is unique + foreach ( $this->get_languages_list() as $language ) { + if ( $language->slug === $args['slug'] && ( null === $lang || ( isset( $lang ) && $lang->term_id != $language->term_id ) ) ) { + $errors->add( 'pll_non_unique_slug', __( 'The language code must be unique', 'polylang' ) ); + } + } + + // Validate name + // No need to sanitize it as wp_insert_term will do it for us + if ( empty( $args['name'] ) ) { + $errors->add( 'pll_invalid_name', __( 'The language must have a name', 'polylang' ) ); + } + + // Validate flag + if ( ! empty( $args['flag'] ) && ! file_exists( POLYLANG_DIR . '/flags/' . $args['flag'] . '.png' ) ) { + $flag = PLL_Language::get_flag_informations( $args['flag'] ); + + if ( ! empty( $flag['url'] ) ) { + $response = function_exists( 'vip_safe_wp_remote_get' ) ? vip_safe_wp_remote_get( esc_url_raw( $flag['url'] ) ) : wp_remote_get( esc_url_raw( $flag['url'] ) ); + } + + if ( empty( $response ) || is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { + $errors->add( 'pll_invalid_flag', __( 'The flag does not exist', 'polylang' ) ); + } + } + + return $errors; + } + + /** + * Used to set the language of posts or terms in mass + * + * @since 1.2 + * + * @param string $type either 'post' or 'term' + * @param array $ids array of post ids or term ids + * @param object|string $lang object or slug + */ + public function set_language_in_mass( $type, $ids, $lang ) { + global $wpdb; + + $ids = array_map( 'intval', $ids ); + $lang = $this->get_language( $lang ); + $tt_id = 'term' === $type ? $lang->tl_term_taxonomy_id : $lang->term_taxonomy_id; + $values = array(); + + foreach ( $ids as $id ) { + $values[] = $wpdb->prepare( '( %d, %d )', $id, $tt_id ); + } + + if ( ! empty( $values ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_relationships} ( object_id, term_taxonomy_id ) VALUES " . implode( ',', array_unique( $values ) ) ); + $lang->update_count(); // Updating term count is mandatory ( thanks to AndyDeGroo ) + } + + if ( 'term' === $type ) { + clean_term_cache( $ids, 'term_language' ); + $translations = array(); + + foreach ( $ids as $id ) { + $translations[] = array( $lang->slug => $id ); + } + + if ( ! empty( $translations ) ) { + $this->set_translation_in_mass( 'term', $translations ); + } + } else { + clean_term_cache( $ids, 'language' ); + } + } + + /** + * Used to create a translations groups in mass + * + * @since 1.6.3 + * + * @param string $type either 'post' or 'term' + * @param array $translations array of translations arrays + */ + public function set_translation_in_mass( $type, $translations ) { + global $wpdb; + + $taxonomy = $type . '_translations'; + $terms = array(); + $slugs = array(); + $description = array(); + $count = array(); + + foreach ( $translations as $t ) { + $term = uniqid( 'pll_' ); // the term name + $terms[] = $wpdb->prepare( '( %s, %s )', $term, $term ); + $slugs[] = $wpdb->prepare( '%s', $term ); + $description[ $term ] = maybe_serialize( $t ); + $count[ $term ] = count( $t ); + } + + // Insert terms + if ( ! empty( $terms ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->terms} ( slug, name ) VALUES " . implode( ',', array_unique( $terms ) ) ); + } + + // Get all terms with their term_id + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $terms = $wpdb->get_results( "SELECT term_id, slug FROM {$wpdb->terms} WHERE slug IN ( " . implode( ',', $slugs ) . ' )' ); + $term_ids = array(); + $tts = array(); + + // Prepare terms taxonomy relationship + foreach ( $terms as $term ) { + $term_ids[] = $term->term_id; + $tts[] = $wpdb->prepare( '( %d, %s, %s, %d )', $term->term_id, $taxonomy, $description[ $term->slug ], $count[ $term->slug ] ); + } + + // Insert term_taxonomy + if ( ! empty( $tts ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_taxonomy} ( term_id, taxonomy, description, count ) VALUES " . implode( ',', array_unique( $tts ) ) ); + } + + // Get all terms with term_taxonomy_id + $terms = get_terms( $taxonomy, array( 'hide_empty' => false ) ); + $trs = array(); + + // Prepare objects relationships + foreach ( $terms as $term ) { + $t = maybe_unserialize( $term->description ); + if ( in_array( $t, $translations ) ) { + foreach ( $t as $object_id ) { + if ( ! empty( $object_id ) ) { + $trs[] = $wpdb->prepare( '( %d, %d )', $object_id, $term->term_taxonomy_id ); + } + } + } + } + + // Insert term_relationships + if ( ! empty( $trs ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_relationships} ( object_id, term_taxonomy_id ) VALUES " . implode( ',', $trs ) ); + $trs = array_unique( $trs ); + } + + clean_term_cache( $term_ids, $taxonomy ); + } + + /** + * Returns untranslated posts and terms ids ( used in settings ) + * + * @since 0.9 + * @since 2.2.6 Add the $limit argument + * + * @param in $limit Max number of posts or terms to return. Defaults to -1 (no limit). + * @return array Array made of an array of post ids and an array of term ids + */ + public function get_objects_with_no_lang( $limit = -1 ) { + global $wpdb; + + /** + * Filters the max number of posts or terms to return when searching objects with no language + * This filter can be used to decrease the memory usage in case the number of objects + * without language is too big. Using a negative value is equivalent to have no limit. + * + * @since 2.2.6 + * + * @param int $limit Max number of posts or terms to retrieve from the database + */ + $limit = (int) apply_filters( 'get_objects_with_no_lang_limit', $limit ); + + $posts = get_posts( + array( + 'numberposts' => $limit, + 'nopaging' => $limit <= 0, + 'post_type' => $this->get_translated_post_types(), + 'post_status' => 'any', + 'fields' => 'ids', + 'tax_query' => array( + array( + 'taxonomy' => 'language', + 'terms' => $this->get_languages_list( array( 'fields' => 'term_id' ) ), + 'operator' => 'NOT IN', + ), + ), + ) + ); + + // PHPCS:disable WordPress.DB.PreparedSQL + $terms = $wpdb->get_col( + sprintf( + "SELECT {$wpdb->term_taxonomy}.term_id FROM {$wpdb->term_taxonomy} + WHERE taxonomy IN ('%s') + AND {$wpdb->term_taxonomy}.term_id NOT IN ( + SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN (%s) + ) + %s", + implode( "','", array_map( 'esc_sql', $this->get_translated_taxonomies() ) ), + implode( ',', array_map( 'intval', $this->get_languages_list( array( 'fields' => 'tl_term_taxonomy_id' ) ) ) ), + $limit > 0 ? "LIMIT {$limit}" : '' + ) + ); + // PHPCS:enable + + /** + * Filter the list of untranslated posts ids and terms ids + * + * @since 0.9 + * + * @param bool|array $objects false if no ids found, list of post and/or term ids otherwise + */ + return apply_filters( 'pll_get_objects_with_no_lang', empty( $posts ) && empty( $terms ) ? false : array( 'posts' => $posts, 'terms' => $terms ) ); + } + + /** + * Used to delete translations or update the translations when a language slug has been modified in settings + * + * @since 0.5 + * + * @param string $old_slug the old language slug + * @param string $new_slug optional, the new language slug, if not set it means the correspondent has been deleted + */ + public function update_translations( $old_slug, $new_slug = '' ) { + global $wpdb; + + $terms = get_terms( array( 'post_translations', 'term_translations' ) ); + $term_ids = array(); + $dr = array(); + $dt = array(); + $ut = array(); + + foreach ( $terms as $term ) { + $term_ids[ $term->taxonomy ][] = $term->term_id; + $tr = maybe_unserialize( $term->description ); + if ( ! empty( $tr[ $old_slug ] ) ) { + if ( $new_slug ) { + $tr[ $new_slug ] = $tr[ $old_slug ]; // Suppress this for delete + } else { + $dr['id'][] = (int) $tr[ $old_slug ]; + $dr['tt'][] = (int) $term->term_taxonomy_id; + } + unset( $tr[ $old_slug ] ); + + if ( empty( $tr ) || 1 == count( $tr ) ) { + $dt['t'][] = (int) $term->term_id; + $dt['tt'][] = (int) $term->term_taxonomy_id; + } else { + $ut['case'][] = $wpdb->prepare( 'WHEN %d THEN %s', $term->term_id, maybe_serialize( $tr ) ); + $ut['in'][] = (int) $term->term_id; + } + } + } + + // Delete relationships + if ( ! empty( $dr ) ) { + // PHPCS:disable WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( + "DELETE FROM $wpdb->term_relationships + WHERE object_id IN ( " . implode( ',', $dr['id'] ) . ' ) + AND term_taxonomy_id IN ( ' . implode( ',', $dr['tt'] ) . ' )' + ); + // PHPCS:enable + } + + // Delete terms + if ( ! empty( $dt ) ) { + $wpdb->query( "DELETE FROM $wpdb->terms WHERE term_id IN ( " . implode( ',', $dt['t'] ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "DELETE FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ( " . implode( ',', $dt['tt'] ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + } + + // Update terms + if ( ! empty( $ut ) ) { + // PHPCS:disable WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( + "UPDATE $wpdb->term_taxonomy + SET description = ( CASE term_id " . implode( ' ', $ut['case'] ) . ' END ) + WHERE term_id IN ( ' . implode( ',', $ut['in'] ) . ' )' + ); + // PHPCS:enable + } + + if ( ! empty( $term_ids ) ) { + foreach ( $term_ids as $taxonomy => $ids ) { + clean_term_cache( $ids, $taxonomy ); + } + } + } + + /** + * Updates the default language + * taking care to update the default category & the nav menu locations + * + * @since 1.8 + * + * @param string $slug new language slug + */ + public function update_default_lang( $slug ) { + // The nav menus stored in theme locations should be in the default language + $theme = get_stylesheet(); + if ( ! empty( $this->options['nav_menus'][ $theme ] ) ) { + $menus = array(); + + foreach ( $this->options['nav_menus'][ $theme ] as $key => $loc ) { + $menus[ $key ] = empty( $loc[ $slug ] ) ? 0 : $loc[ $slug ]; + } + set_theme_mod( 'nav_menu_locations', $menus ); + } + + // The default category should be in the default language + $default_cats = $this->term->get_translations( get_option( 'default_category' ) ); + if ( isset( $default_cats[ $slug ] ) ) { + update_option( 'default_category', $default_cats[ $slug ] ); + } + + // Update options + $this->options['default_lang'] = $slug; + update_option( 'polylang', $this->options ); + + $this->clean_languages_cache(); + flush_rewrite_rules(); + } +} diff --git a/wp-content/plugins/polylang/admin/admin-nav-menu.php b/wp-content/plugins/polylang/admin/admin-nav-menu.php new file mode 100644 index 00000000..3ba3d156 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-nav-menu.php @@ -0,0 +1,272 @@ +theme, array( $this, 'pre_update_option_theme_mods' ) ); + add_action( 'delete_nav_menu', array( $this, 'delete_nav_menu' ) ); + + // FIXME is it possible to choose the order ( after theme locations in WP3.5 and older ) ? + // FIXME not displayed if Polylang is activated before the first time the user goes to nav menus http://core.trac.wordpress.org/ticket/16828 + add_meta_box( 'pll_lang_switch_box', __( 'Language switcher', 'polylang' ), array( $this, 'lang_switch' ), 'nav-menus', 'side', 'high' ); + + $this->create_nav_menu_locations(); + } + + /** + * Language switcher metabox + * The checkbox and all hidden fields are important + * Thanks to John Morris for his very interesting post http://www.johnmorrisonline.com/how-to-add-a-fully-functional-custom-meta-box-to-wordpress-navigation-menus/ + * + * @since 1.1 + */ + public function lang_switch() { + global $_nav_menu_placeholder, $nav_menu_selected_id; + $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; + ?> +
+
+
    +
  • + + + + +
  • +
+
+

+ + class="button-secondary submit-add-to-menu right" value="" name="add-post-type-menu-item" id="submit-posttype-lang-switch"> + + +

+
+ base ) { + return; + } + + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + wp_enqueue_script( 'pll_nav_menu', plugins_url( '/js/nav-menu' . $suffix . '.js', POLYLANG_FILE ), array( 'jquery' ), POLYLANG_VERSION ); + + $data = array( + 'strings' => PLL_Switcher::get_switcher_options( 'menu', 'string' ), // The strings for the options + 'title' => __( 'Languages', 'polylang' ), // The title + 'val' => array(), + ); + + // Get all language switcher menu items + $items = get_posts( + array( + 'numberposts' => -1, + 'nopaging' => true, + 'post_type' => 'nav_menu_item', + 'fields' => 'ids', + 'meta_key' => '_pll_menu_item', + ) + ); + + // The options values for the language switcher + foreach ( $items as $item ) { + $data['val'][ $item ] = get_post_meta( $item, '_pll_menu_item', true ); + } + + // Send all these data to javascript + wp_localize_script( 'pll_nav_menu', 'pll_data', $data ); + } + + /** + * Save our menu item options + * + * @since 1.1 + * + * @param int $menu_id not used + * @param int $menu_item_db_id + */ + public function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0 ) { + if ( empty( $_POST['menu-item-url'][ $menu_item_db_id ] ) || '#pll_switcher' !== $_POST['menu-item-url'][ $menu_item_db_id ] ) { // phpcs:ignore WordPress.Security.NonceVerification + return; + } + + // Security check as 'wp_update_nav_menu_item' can be called from outside WP admin + if ( current_user_can( 'edit_theme_options' ) ) { + check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); + + $options = array( 'hide_if_no_translation' => 0, 'hide_current' => 0, 'force_home' => 0, 'show_flags' => 0, 'show_names' => 1, 'dropdown' => 0 ); // Default values + // Our jQuery form has not been displayed + if ( empty( $_POST['menu-item-pll-detect'][ $menu_item_db_id ] ) ) { + if ( ! get_post_meta( $menu_item_db_id, '_pll_menu_item', true ) ) { // Our options were never saved + update_post_meta( $menu_item_db_id, '_pll_menu_item', $options ); + } + } + else { + foreach ( array_keys( $options ) as $opt ) { + $options[ $opt ] = empty( $_POST[ 'menu-item-' . $opt ][ $menu_item_db_id ] ) ? 0 : 1; + } + update_post_meta( $menu_item_db_id, '_pll_menu_item', $options ); // Allow us to easily identify our nav menu item + } + } + } + + /** + * Assign menu languages and translations based on ( temporary ) locations + * + * @since 1.8 + * + * @param array $locations nav menu locations + * @return array + */ + public function update_nav_menu_locations( $locations ) { + // Extract language and menu from locations + foreach ( $locations as $loc => $menu ) { + $infos = $this->explode_location( $loc ); + $this->options['nav_menus'][ $this->theme ][ $infos['location'] ][ $infos['lang'] ] = $menu; + if ( $this->options['default_lang'] != $infos['lang'] ) { + unset( $locations[ $loc ] ); // Remove temporary locations before database update + } + } + + update_option( 'polylang', $this->options ); + return $locations; + } + + /** + * Assign menu languages and translations based on ( temporary ) locations + * + * @since 1.1 + * + * @param array $mods theme mods + * @return unmodified $mods + */ + public function pre_update_option_theme_mods( $mods ) { + if ( current_user_can( 'edit_theme_options' ) && isset( $mods['nav_menu_locations'] ) ) { + + // Manage Locations tab in Appearance -> Menus + if ( isset( $_GET['action'] ) && 'locations' === $_GET['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification + check_admin_referer( 'save-menu-locations' ); + $this->options['nav_menus'][ $this->theme ] = array(); + } + + // Edit Menus tab in Appearance -> Menus + // Add the test of $_POST['update-nav-menu-nonce'] to avoid conflict with Vantage theme + elseif ( isset( $_POST['action'], $_POST['update-nav-menu-nonce'] ) && 'update' === $_POST['action'] ) { + check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); + $this->options['nav_menus'][ $this->theme ] = array(); + } + + // Customizer + // Don't reset locations in this case. + // see http://wordpress.org/support/topic/menus-doesnt-show-and-not-saved-in-theme-settings-multilingual-site + elseif ( isset( $_POST['action'] ) && 'customize_save' == $_POST['action'] ) { + check_ajax_referer( 'save-customize_' . $GLOBALS['wp_customize']->get_stylesheet(), 'nonce' ); + } + + else { + return $mods; // No modification for nav menu locations + } + + $mods['nav_menu_locations'] = $this->update_nav_menu_locations( $mods['nav_menu_locations'] ); + } + return $mods; + } + + /** + * Fills temporary menu locations based on menus translations + * + * @since 1.2 + * + * @param bool|array $menus + * @return bool|array modified list of menu locations + */ + public function theme_mod_nav_menu_locations( $menus ) { + // Prefill locations with 0 value in case a location does not exist in $menus + $locations = get_registered_nav_menus(); + if ( is_array( $locations ) ) { + $locations = array_fill_keys( array_keys( $locations ), 0 ); + $menus = is_array( $menus ) ? array_merge( $locations, $menus ) : $locations; + } + + if ( is_array( $menus ) ) { + foreach ( array_keys( $menus ) as $loc ) { + foreach ( $this->model->get_languages_list() as $lang ) { + if ( ! empty( $this->options['nav_menus'][ $this->theme ][ $loc ][ $lang->slug ] ) && term_exists( $this->options['nav_menus'][ $this->theme ][ $loc ][ $lang->slug ], 'nav_menu' ) ) { + $menus[ $this->combine_location( $loc, $lang ) ] = $this->options['nav_menus'][ $this->theme ][ $loc ][ $lang->slug ]; + } + } + } + } + + return $menus; + } + + /** + * Removes the nav menu term_id from the locations stored in Polylang options when a nav menu is deleted + * + * @since 1.7.3 + * + * @param int $term_id nav menu id + */ + public function delete_nav_menu( $term_id ) { + if ( isset( $this->options['nav_menus'] ) ) { + foreach ( $this->options['nav_menus'] as $theme => $locations ) { + foreach ( $locations as $loc => $languages ) { + foreach ( $languages as $lang => $menu_id ) { + if ( $menu_id === $term_id ) { + unset( $this->options['nav_menus'][ $theme ][ $loc ][ $lang ] ); + } + } + } + } + + update_option( 'polylang', $this->options ); + } + } +} diff --git a/wp-content/plugins/polylang/admin/admin-notices.php b/wp-content/plugins/polylang/admin/admin-notices.php new file mode 100644 index 00000000..2875663e --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-notices.php @@ -0,0 +1,242 @@ +options = &$polylang->options; + + add_action( 'admin_init', array( $this, 'hide_notice' ) ); + add_action( 'admin_notices', array( $this, 'display_notices' ) ); + } + + /** + * Add a custom notice + * + * @since 2.3.9 + * + * @param string $name Notice name + * @param string $html Content of the notice + */ + public static function add_notice( $name, $html ) { + self::$notices[ $name ] = $html; + } + + /** + * Get custom notices + * + * @since 2.3.9 + * + * @return array + */ + public static function get_notices() { + return self::$notices; + } + + /** + * Has a notice been dismissed? + * + * @since 2.3.9 + * + * @param string $notice Notice name + * @return bool + */ + public static function is_dismissed( $notice ) { + $dismissed = get_option( 'pll_dismissed_notices', array() ); + + // Handle legacy user meta + $dismissed_meta = get_user_meta( get_current_user_id(), 'pll_dismissed_notices', true ); + if ( is_array( $dismissed_meta ) ) { + if ( array_diff( $dismissed_meta, $dismissed ) ) { + $dismissed = array_merge( $dismissed, $dismissed_meta ); + update_option( 'pll_dismissed_notices', $dismissed ); + } + if ( ! is_multisite() ) { + // Don't delete on multisite to avoid the notices to appear in other sites. + delete_user_meta( get_current_user_id(), 'pll_dismissed_notices' ); + } + } + + return in_array( $notice, $dismissed ); + } + + /** + * Should we display notices on this screen? + * + * @since 2.3.9 + * + * @param string $notice The notice name. + * @return bool + */ + protected function can_display_notice( $notice ) { + $screen = get_current_screen(); + $screen_id = sanitize_title( __( 'Languages', 'polylang' ) ); + + /** + * Filter admin notices which can be displayed + * + * @since 2.7.0 + * + * @param bool $display Whether the notice should be displayed or not. + * @param string $notice The notice name. + */ + return apply_filters( + 'pll_can_display_notice', + in_array( + $screen->id, + array( + 'dashboard', + 'plugins', + 'toplevel_page_mlang', + $screen_id . '_page_mlang_strings', + $screen_id . '_page_mlang_settings', + ) + ), + $notice + ); + } + + /** + * Stores a dismissed notice in database + * + * @since 2.3.9 + * + * @param string $notice + */ + public static function dismiss( $notice ) { + $dismissed = get_option( 'pll_dismissed_notices', array() ); + + if ( ! in_array( $notice, $dismissed ) ) { + $dismissed[] = $notice; + update_option( 'pll_dismissed_notices', array_unique( $dismissed ) ); + } + } + + /** + * Handle a click on the dismiss button + * + * @since 2.3.9 + */ + public function hide_notice() { + if ( isset( $_GET['pll-hide-notice'], $_GET['_pll_notice_nonce'] ) ) { + $notice = sanitize_key( $_GET['pll-hide-notice'] ); + check_admin_referer( $notice, '_pll_notice_nonce' ); + self::dismiss( $notice ); + wp_safe_redirect( remove_query_arg( array( 'pll-hide-notice', '_pll_notice_nonce' ), wp_get_referer() ) ); + exit; + } + } + + /** + * Displays notices + * + * @since 2.3.9 + */ + public function display_notices() { + if ( current_user_can( 'manage_options' ) ) { + // Core notices + if ( defined( 'WOOCOMMERCE_VERSION' ) && ! defined( 'PLLWC_VERSION' ) && $this->can_display_notice( 'pllwc' ) && ! $this->is_dismissed( 'pllwc' ) ) { + $this->pllwc_notice(); + } + + if ( ! defined( 'POLYLANG_PRO' ) && $this->can_display_notice( 'review' ) && ! $this->is_dismissed( 'review' ) && ! empty( $this->options['first_activation'] ) && time() > $this->options['first_activation'] + 15 * DAY_IN_SECONDS ) { + $this->review_notice(); + } + + // Custom notices + foreach ( $this->get_notices() as $notice => $html ) { + if ( $this->can_display_notice( $notice ) && ! $this->is_dismissed( $notice ) ) { + ?> +
+ dismiss_button( $notice ); + echo wp_kses_post( $html ); + ?> +
+ %s', + esc_url( wp_nonce_url( add_query_arg( 'pll-hide-notice', $name ), $name, '_pll_notice_nonce' ) ), + /* translators: accessibility text */ + esc_html__( 'Dismiss this notice.', 'polylang' ) + ); + } + + /** + * Displays a notice if WooCommerce is activated without Polylang for WooCommerce + * + * @since 2.3.9 + */ + private function pllwc_notice() { + ?> +
+ dismiss_button( 'pllwc' ); ?> +

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

+
+ +
+ dismiss_button( 'review' ); ?> +

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

+
+ links = &$polylang->links; + + // Removes the editor and the template select dropdown for pages for posts + add_filter( 'use_block_editor_for_post', array( $this, 'use_block_editor_for_post' ), 10, 2 ); // Since WP 5.0 + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 10, 2 ); + + // Add post state for translations of the front page and posts page + add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 ); + + // Refresh language cache when a static front page has been translated + add_action( 'pll_save_post', array( $this, 'pll_save_post' ), 10, 3 ); + + // Checks if chosen page on front is translated + add_filter( 'pre_update_option_page_on_front', array( $this, 'update_page_on_front' ), 10, 2 ); + add_filter( 'customize_validate_page_on_front', array( $this, 'customize_validate_page_on_front' ), 10, 2 ); + + // Prevents WP resetting the option + add_filter( 'pre_update_option_show_on_front', array( $this, 'update_show_on_front' ), 10, 2 ); + + add_action( 'admin_notices', array( $this, 'notice_must_translate' ) ); + } + + /** + * Don't use the block editor for the translations of the pages for posts + * + * @since 2.5 + * + * @param bool $use_block_editor Whether the post can be edited or not. + * @param WP_Post $post The post being checked. + * @return bool + */ + public function use_block_editor_for_post( $use_block_editor, $post ) { + if ( 'page' === $post->post_type ) { + add_filter( 'option_page_for_posts', array( $this, 'translate_page_for_posts' ) ); + + if ( ( get_option( 'page_for_posts' ) == $post->ID ) && empty( $post->post_content ) ) { + return false; + } + } + + return $use_block_editor; + } + + /** + * Removes the editor for translations of the pages for posts + * Removes the page template select dropdown in page attributes metabox too + * + * @since 2.2.2 + * + * @param string $post_type Current post type + * @param object $post Current post + */ + public function add_meta_boxes( $post_type, $post ) { + if ( 'page' === $post_type ) { + add_filter( 'option_page_for_posts', array( $this, 'translate_page_for_posts' ) ); + + if ( ( get_option( 'page_for_posts' ) == $post->ID ) && empty( $post->post_content ) ) { + add_action( 'edit_form_after_title', '_wp_posts_page_notice' ); + remove_post_type_support( $post_type, 'editor' ); + } + } + } + + /** + * Add post state for translations of the front page and posts page + * + * @since 1.8 + * + * @param array $post_states An array of post display states. + * @param object $post The current post object. + * @return array + */ + public function display_post_states( $post_states, $post ) { + if ( in_array( $post->ID, $this->model->get_languages_list( array( 'fields' => 'page_on_front' ) ) ) ) { + $post_states['page_on_front'] = __( 'Front Page', 'polylang' ); + } + + if ( in_array( $post->ID, $this->model->get_languages_list( array( 'fields' => 'page_for_posts' ) ) ) ) { + $post_states['page_for_posts'] = __( 'Posts Page', 'polylang' ); + } + + return $post_states; + } + + /** + * Refresh language cache when a static front page has been translated + * + * @since 1.8 + * + * @param int $post_id Not used + * @param object $post Not used + * @param array $translations + */ + public function pll_save_post( $post_id, $post, $translations ) { + if ( in_array( $this->page_on_front, $translations ) ) { + $this->model->clean_languages_cache(); + } + } + + /** + * Checks if a page is translated in all languages + * + * @since 2.2 + * + * @param int $page_id + * @return bool + */ + protected function is_page_translated( $page_id ) { + if ( $page_id ) { + $translations = count( $this->model->post->get_translations( $page_id ) ); + $languages = count( $this->model->get_languages_list() ); + + if ( $languages > 1 && $translations != $languages ) { + return false; + } + } + + return true; + } + + /** + * Prevents choosing an untranslated static front page + * Displays an error message + * + * @since 1.6 + * + * @param int $page_id New page on front page id + * @param int $old_id Old page on front page_id + * @return int + */ + public function update_page_on_front( $page_id, $old_id ) { + if ( ! $this->is_page_translated( $page_id ) ) { + $page_id = $old_id; + add_settings_error( 'reading', 'pll_page_on_front_error', __( 'The chosen static front page must be translated in all languages.', 'polylang' ) ); + } + + return $page_id; + } + + /** + * Displays an error message in the customizer when choosing an untranslated static front page + * + * @since 2.2 + * + * @param object $validity WP_Error object + * @param int $page_id New page on front page id + * @return object + */ + public function customize_validate_page_on_front( $validity, $page_id ) { + if ( ! $this->is_page_translated( $page_id ) ) { + return new WP_Error( 'pll_page_on_front_error', __( 'The chosen static front page must be translated in all languages.', 'polylang' ) ); + } + + return $validity; + } + + /** + * Prevents WP resetting the option if the admin language filter is active for a language with no pages + * + * @since 1.9.3 + * + * @param string $value + * @param string $old_value + * @return string + */ + public function update_show_on_front( $value, $old_value ) { + if ( ! empty( $GLOBALS['pagenow'] ) && 'options-reading.php' === $GLOBALS['pagenow'] && 'posts' === $value && ! get_pages() && get_pages( array( 'lang' => '' ) ) ) { + $value = $old_value; + } + return $value; + } + + /** + * Add a notice to translate the static front page if it is not translated in all languages + * This is especially useful after a new language is created. + * The notice is not dismissible and displayed on the Languages pages and the list of pages. + * + * @since 2.6 + */ + public function notice_must_translate() { + $screen = get_current_screen(); + + if ( 'toplevel_page_mlang' === $screen->id || 'edit-page' === $screen->id ) { + $message = $this->get_must_translate_message(); + + if ( ! empty( $message ) ) { + printf( + '

%s

', + $message // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + } + } + + /** + * Returns the message asking to translate the static front page in all languages. + * + * @since 2.8 + * + * @return string + */ + public function get_must_translate_message() { + $message = ''; + + if ( $this->page_on_front ) { + $untranslated = array(); + + foreach ( $this->model->get_languages_list() as $language ) { + if ( ! $this->model->post->get( $this->page_on_front, $language ) ) { + $untranslated[] = sprintf( + '%s', + esc_url( $this->links->get_new_post_translation_link( $this->page_on_front, $language ) ), + esc_html( $language->name ) + ); + } + } + + if ( ! empty( $untranslated ) ) { + $message = sprintf( + /* translators: %s is a comma separated list of native language names */ + esc_html__( 'You must translate your static front page in %s.', 'polylang' ), + implode( ', ', $untranslated ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ); + } + } + + return $message; + } +} diff --git a/wp-content/plugins/polylang/admin/admin-strings.php b/wp-content/plugins/polylang/admin/admin-strings.php new file mode 100644 index 00000000..3ece96a8 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin-strings.php @@ -0,0 +1,123 @@ + __( 'Widget title', 'polylang' ), + 'widget_text' => __( 'Widget text', 'polylang' ), + ); + + // Widgets titles + global $wp_registered_widgets; + $sidebars = wp_get_sidebars_widgets(); + foreach ( $sidebars as $sidebar => $widgets ) { + if ( 'wp_inactive_widgets' == $sidebar || empty( $widgets ) ) { + continue; + } + + foreach ( $widgets as $widget ) { + // Nothing can be done if the widget is created using pre WP2.8 API :( + // There is no object, so we can't access it to get the widget options + if ( ! isset( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! is_object( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! method_exists( $wp_registered_widgets[ $widget ]['callback'][0], 'get_settings' ) ) { + continue; + } + + $widget_settings = $wp_registered_widgets[ $widget ]['callback'][0]->get_settings(); + $number = $wp_registered_widgets[ $widget ]['params'][0]['number']; + + // Don't enable widget translation if the widget is visible in only one language or if there is no title + if ( empty( $widget_settings[ $number ]['pll_lang'] ) ) { + if ( isset( $widget_settings[ $number ]['title'] ) && $title = $widget_settings[ $number ]['title'] ) { + self::register_string( self::$default_strings['widget_title'], $title, 'Widget' ); + } + + if ( isset( $widget_settings[ $number ]['text'] ) && $text = $widget_settings[ $number ]['text'] ) { + self::register_string( self::$default_strings['widget_text'], $text, 'Widget', true ); + } + } + } + } + + /** + * Filter the list of strings registered for translation + * Mainly for use by our PLL_WPML_Compat class + * + * @since 1.0.2 + * + * @param array $strings list of strings + */ + self::$strings = apply_filters( 'pll_get_strings', self::$strings ); + return self::$strings; + } + + /** + * Performs the sanitization ( before saving in DB ) of default strings translations + * + * @since 1.6 + * + * @param string $translation translation to sanitize + * @param string $name unique name for the string + * @return string + */ + public static function sanitize_string_translation( $translation, $name ) { + if ( $name == self::$default_strings['widget_title'] ) { + $translation = sanitize_text_field( $translation ); + } + + if ( $name == self::$default_strings['widget_text'] && ! current_user_can( 'unfiltered_html' ) ) { + $translation = wp_kses_post( $translation ); + } + + return $translation; + } +} diff --git a/wp-content/plugins/polylang/admin/admin.php b/wp-content/plugins/polylang/admin/admin.php new file mode 100644 index 00000000..28f798e9 --- /dev/null +++ b/wp-content/plugins/polylang/admin/admin.php @@ -0,0 +1,198 @@ + inherited, reference to Polylang options array + * model => inherited, reference to PLL_Model object + * links_model => inherited, reference to PLL_Links_Model object + * links => inherited, reference to PLL_Admin_Links object + * static_pages => inherited, reference to PLL_Admin_Static_Pages object + * filters_links => inherited, reference to PLL_Filters_Links object + * curlang => inherited, optional, current language used to filter the content (language of the post or term being edited, equal to filter_lang otherwise) + * filter_lang => inherited, optional, current status of the admin languages filter (in the admin bar) + * pref_lang => inherited, preferred language used as default when saving posts or terms + * posts => reference to PLL_CRUD_Posts object + * terms => reference to PLL_CRUD_Terms object + * filters => reference to PLL_Admin_Filters object + * filters_sanitization => reference to PLL_Filters_Sanitization object + * filters_columns => reference to PLL_Admin_Filters_Columns object + * filters_post => reference to PLL_Admin_Filters_Post object + * filters_term => reference to PLL_Admin_filters_Term object + * nav_menu => reference to PLL_Admin_Nav_Menu object + * block_editor => reference to PLL_Admin_Block_Editor object + * classic_editor => reference to PLL_Admin_Classic_Editor object + * filters_media => optional, reference to PLL_Admin_Filters_Media object + * + * @since 1.2 + */ +class PLL_Admin extends PLL_Admin_Base { + /** + * Instance of PLL_Admin_Filters + * + * @var PLL_Admin_Filters + */ + public $filters; + + /** + * Instance of PLL_Admin_Filters_Columns + * + * @var PLL_Admin_Filters_Columns + */ + public $filters_columns; + + /** + * Instance of PLL_Admin_Filters_Post + * + * @var PLL_Admin_Filters_Post + */ + public $filters_post; + + /** + * Instance of PLL_Admin_filters_Term + * + * @var PLL_Admin_filters_Term + */ + public $filters_term; + + /** + * Instance of PLL_Admin_Nav_Menu + * + * @var PLL_Admin_Nav_Menu + */ + public $nav_menu; + + /** + * Instance of PLL_Admin_Filters_Media + * + * @var PLL_Admin_Filters_Media + */ + public $filters_media; + + /** + * Instance of PLL_Filters_Sanitization + * + * @since 2.9 + * + * @var PLL_Filters_Sanitization + */ + public $filters_sanitization; + + /** + * Loads the polylang text domain + * Setups filters and action needed on all admin pages and on plugins page + * + * @since 1.2 + * + * @param object $links_model + */ + public function __construct( &$links_model ) { + parent::__construct( $links_model ); + + // Adds a 'settings' link in the plugins table + add_filter( 'plugin_action_links_' . POLYLANG_BASENAME, array( $this, 'plugin_action_links' ) ); + add_action( 'in_plugin_update_message-' . POLYLANG_BASENAME, array( $this, 'plugin_update_message' ), 10, 2 ); + } + + /** + * Setups filters and action needed on all admin pages and on plugins page + * Loads the settings pages or the filters base on the request + * + * @since 1.2 + */ + public function init() { + parent::init(); + + // Setup filters for admin pages + // Priority 5 to make sure filters are there before customize_register is fired + if ( $this->model->get_languages_list() ) { + add_action( 'wp_loaded', array( $this, 'add_filters' ), 5 ); + } + } + + /** + * Adds a 'settings' link in the plugins table + * + * @since 0.1 + * + * @param array $links list of links associated to the plugin + * @return array modified list of links + */ + public function plugin_action_links( $links ) { + array_unshift( $links, '' . __( 'Settings', 'polylang' ) . '' ); + return $links; + } + + /** + * Adds the upgrade notice in plugins table + * + * @since 1.1.6 + * + * @param array $plugin_data Not used + * @param object $r Plugin update data + */ + public function plugin_update_message( $plugin_data, $r ) { + if ( isset( $r->upgrade_notice ) ) { + printf( '

%s

', esc_html( $r->upgrade_notice ) ); + } + } + + /** + * Setup filters for admin pages + * + * @since 1.2 + * @since 2.7 instantiate a PLL_Bulk_Translate instance. + */ + public function add_filters() { + $this->filters_sanitization = new PLL_Filters_Sanitization( $this->get_locale_for_sanitization() ); + // All these are separated just for convenience and maintainability + $classes = array( 'Filters', 'Filters_Columns', 'Filters_Post', 'Filters_Term', 'Nav_Menu', 'Classic_Editor', 'Block_Editor' ); + + // Don't load media filters if option is disabled or if user has no right + if ( $this->options['media_support'] && ( $obj = get_post_type_object( 'attachment' ) ) && ( current_user_can( $obj->cap->edit_posts ) || current_user_can( $obj->cap->create_posts ) ) ) { + $classes[] = 'Filters_Media'; + } + + foreach ( $classes as $class ) { + $obj = strtolower( $class ); + + /** + * Filter the class to instantiate when loading admin filters + * + * @since 1.5 + * + * @param string $class class name + */ + $class = apply_filters( 'pll_' . $obj, 'PLL_Admin_' . $class ); + $this->$obj = new $class( $this ); + } + } + /** + * Retrieve the locale according to the current language instead of the language + * of the admin interface. + * + * @since 2.0 + * + * @return string + */ + public function get_locale_for_sanitization() { + $locale = get_locale(); + + if ( isset( $_POST['post_lang_choice'] ) && $lang = $this->model->get_language( sanitize_key( $_POST['post_lang_choice'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $locale = $lang->locale; + } elseif ( isset( $_POST['term_lang_choice'] ) && $lang = $this->model->get_language( sanitize_key( $_POST['term_lang_choice'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $locale = $lang->locale; + } elseif ( isset( $_POST['inline_lang_choice'] ) && $lang = $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $locale = $lang->locale; + } elseif ( ! empty( $this->curlang ) ) { + $locale = $this->curlang->locale; + } + + return $locale; + } +} diff --git a/wp-content/plugins/polylang/admin/view-translations-media.php b/wp-content/plugins/polylang/admin/view-translations-media.php new file mode 100644 index 00000000..4a44d961 --- /dev/null +++ b/wp-content/plugins/polylang/admin/view-translations-media.php @@ -0,0 +1,43 @@ + +

+ + model->get_languages_list() as $language ) { + if ( $language->term_id == $lang->term_id ) { + continue; + } + ?> + + + + + +
flag; // phpcs:ignore WordPress.Security.EscapeOutput ?>name ); ?> + model->post->get_translation( $post_ID, $language ) ) && $translation_id !== $post_ID ) { + // The translation exists + printf( + '', + esc_attr( $language->slug ), + esc_attr( $translation_id ) + ); + echo $this->links->edit_post_translation_link( $translation_id ); // phpcs:ignore WordPress.Security.EscapeOutput + } else { + // No translation + echo $this->links->new_post_translation_link( $post_ID, $language ); // phpcs:ignore WordPress.Security.EscapeOutput + } + ?> +
diff --git a/wp-content/plugins/polylang/admin/view-translations-post.php b/wp-content/plugins/polylang/admin/view-translations-post.php new file mode 100644 index 00000000..d0d9c79c --- /dev/null +++ b/wp-content/plugins/polylang/admin/view-translations-post.php @@ -0,0 +1,71 @@ + +

+ + model->get_languages_list() as $language ) { + if ( $language->term_id == $lang->term_id ) { + continue; + } + + $value = $this->model->post->get_translation( $post_ID, $language ); + if ( ! $value || $value == $post_ID ) { // $value == $post_ID happens if the post has been (auto)saved before changing the language + $value = ''; + } + + if ( ! empty( $from_post_id ) ) { + $value = $this->model->post->get( $from_post_id, $language ); + } + + $link = $add_link = $this->links->new_post_translation_link( $post_ID, $language ); + + if ( $value ) { + $selected = get_post( $value ); + $link = $this->links->edit_post_translation_link( $value ); + } + ?> + + + + + slug ); + ?> + + + +
flag ? $language->flag : esc_html( $language->slug ); // phpcs:ignore WordPress.Security.EscapeOutput ?> + %2$s + + ', + esc_attr( $language->slug ), + /* translators: accessibility text */ + esc_html__( 'Translation', 'polylang' ), + ( empty( $value ) ? 0 : esc_attr( $selected->ID ) ), + ( empty( $value ) ? '' : esc_attr( $selected->post_title ) ), + disabled( empty( $link ), true, false ), + esc_attr( $language->get_locale( 'display' ) ), + ( $language->is_rtl ? 'rtl' : 'ltr' ) + ); + ?> +
diff --git a/wp-content/plugins/polylang/admin/view-translations-term.php b/wp-content/plugins/polylang/admin/view-translations-term.php new file mode 100644 index 00000000..b13dd34a --- /dev/null +++ b/wp-content/plugins/polylang/admin/view-translations-term.php @@ -0,0 +1,98 @@ + + + + +

+ + + model->get_languages_list() as $language ) { + if ( $language->term_id == $lang->term_id ) { + continue; + } + + // Look for any existing translation in this language + // Take care not to propose a self link + $translation = 0; + if ( isset( $term_id ) && ( $translation_id = $this->model->term->get_translation( $term_id, $language ) ) && $translation_id != $term_id ) { + $translation = get_term( $translation_id, $taxonomy ); + } + if ( ! empty( $from_term_id ) && ( $translation_id = $this->model->term->get( $from_term_id, $language ) ) && ! $this->model->term->get_translation( $translation_id, $lang ) ) { + $translation = get_term( $translation_id, $taxonomy ); + } + + if ( isset( $term_id ) ) { // Do not display the add new link in add term form ( $term_id not set !!! ) + $link = $add_link = $this->links->new_term_translation_link( $term_id, $taxonomy, $post_type, $language ); + } + + if ( $translation ) { + $link = $this->links->edit_term_translation_link( $translation->term_id, $taxonomy, $post_type ); + } + ?> + + + + + + + + + +
+ flag ? $language->flag : esc_html( $language->slug ); // phpcs:ignore WordPress.Security.EscapeOutput ?> + %2$s', + isset( $term_id ) ? '' : ' screen-reader-text', + esc_html( $language->name ) + ); + ?> + + %2$s + + ', + esc_attr( $language->slug ), + /* translators: accessibility text */ + esc_html__( 'Translation', 'polylang' ), + ( empty( $translation ) ? 0 : esc_attr( $translation->term_id ) ), + ( empty( $translation ) ? '' : esc_attr( $translation->name ) ), + disabled( empty( $disabled ), false, false ), + esc_attr( $language->get_locale( 'display' ) ), + ( $language->is_rtl ? 'rtl' : 'ltr' ) + ); + ?> +
+ + + curlang ) is now equal to the language of current post or term being edited (#19) +* The sample permalink is now updated when changing the language in the Languages metabox +* Revamp the wpml-config.xml reader to use simplexml instead of our custom xml parser +* Improve support for the WPML API (including Hook API introduced in WPML 3.2) +* Add support for translation of meta titles and descriptions of custom post types and custom taxonomies in Yoast SEO +* Replace uncached functions by WPCOM VIP functions when available +* Improve compatibility with WP 4.6 +* Fix parent category wrongly assigned to post when synchronizing children categories (#21) +* Fix custom fonts not loaded when using multiple domains or subdomains +* Fix remove_accents() not working for German and Danish (#24) +* Fix incorrect static front pages urls on backend +* Fix impossible to directly enter the page number in strings translation table (introduced in 1.9.3) +* Fix conflict with WP Sweep (needs WP Sweep 1.0.8+) +* Fix potential performance issue by querying only taxonomies to show in quick edit to filter the category checklist +* Fix conflict (database error) with ReOrder-posts-within-categories plugin +* Fix languages per page option not saved + += 1.9.3 (2016-06-28) = + +* Pro: Allow to add slashes in url slugs translations +* Pro: Fix archive links not using translated slugs +* Pro: Fix visitor being redirected to 404 if his browser preference is set to an inactive language +* Fix strings translations table always back to page 1 when submitting the form (#14) +* Fix get_pages( array( 'lang' => '' ) ) not querying all the languages +* Fix switching the admin language filter can override the static front page settings (#16) + += 1.9.2 (2016-06-06) = + +* Pro: fix unreachable hierarchical custom post type posts when they are sharing slugs across languages +* Fix missing argument 3 in icl_t +* Fix conflict with WooCommerce product variations + += 1.9.1 (2016-05-23) = + +* Pro: add compatibility with Beaver Builder +* Pro: fix media wrongly created when adding a new media translation +* Add azb, ceb, de_CH_informal, es_GT, mr, nl_NL_formal to the predefined list of languages +* Fix the language switcher not linking to media translations for anonymous visitors + += 1.9 (2016-04-27) = + +* Pro: add the possibility to translate custom post types slugs, taxonomies slugs and more +* Pro: add the possibility to share the same post or term slug across languages +* Pro: add the possibility to duplicate the content when creating a new translation +* Pro: add the possibility to create all translations at once when uploading a media +* Pro: add the possibility to disable a language +* Add license and update management +* Add inline docs for all filters and actions +* When possible, the rel alternate hreflang now display only the language code (without the country code) +* When combined with flags in the language switcher, wrap the language name inside tags +* Add customizer selective refresh support for the language switcher widget ( needs WP 4.5+ ) +* Fix dynamic options of the language switcher widget not working in the customizer +* Fix possible error 404 on page shortlink when using subdomains or multiple domains +* Fix get_adjacent_post() and wp_get_archives() for untranslated post types ( needs WP 4.4+ ) +* Fix language homepage urls not present in Yoast SEO sitemap (when the homepages display posts) + += 1.8.5 (2016-04-03) = + +* Revert from $_SERVER['PHP_SELF'] to $_SERVER['SCRIPT_FILENAME'] to detect if the user is on login/register/signup page +* Fix incompatibility introduced by WP 4.5 in Edit single taxonomy term screen +* Fix existing post overridden when creating a language and a conflicting plugin sets the global $post on languages pages + += 1.8.4 (2016-03-06) = + +* Revert canonical redirection of static front page when combining plain permalinks + default language hidden in url (introduced in 1.8.2) + += 1.8.3 (2016-03-04) = + +* fix: All pages are redirected to the home page on some installations (introduced in 1.8.2) + += 1.8.2 (2016-03-02) = + +* Add support for the 'wpml_get_default_language()' function from the WPML API +* Stop blocking saving settings when errors are detected (invalid domains) +* Use publicly_queryable => true instead of public => true for the language taxonomy (WP 4.5+) +* fix: PHP notice when pll_default_language() is called before a language is created +* fix: PHP notice undefined property PLL_Language::$page_on_front +* fix: canonical redirection of static front page when combining plain permalinks + default language hidden in url +* fix: YARPP compatibility broken in v1.8 +* fix: Remove the delete link for translations of the default category (introduced back by WP 4.3) +* fix: settings not displayed with WP 4.1 or older + += 1.8.1 (2016-01-31) = + +* Update the list of Facebook locales used for Opengraph support with Yoast SEO and Jetpack +* fix: secondary query with translated post type and untranslated taxonomy mixes languages (introduced in 1.8) +* fix: issue with paged static front page when hiding the default language in url +* fix: potential issue with cache after synchronizations +* fix: trailing slash added to canonical home url outputted by Yoast SEO when using default permalinks + += 1.8 (2016-01-19) = + +* Minimum WordPress version is now 4.0 +* Add ary, bn_BD, en_ZA, es_AR, fr_CA and fr_BE to the predefined languages list +* Adopt WordPress coding standards +* New structure for translated posts and terms (=> several methods of PLL_Model are deprecated). +* Revamp the management of the static front page and page for posts +* Improve performance for navigation menus with a lot of pages +* The Polylang and WPML API are now loaded when 'plugins_loaded' is fired (on frontend only if at least one language has been defined) +* Add 'pll_get_post_translations()' and 'pll_get_term_translations()' to the API +* Add filter 'pll_cookie_expiration' to change the cookie expiration time +* Add support for 'wpml_get_language_information()' function from the WPML API +* The default language is now managed directly from the languages list table +* Various accessibility improvements +* It is now possible to choose the languages flags from the available list (custom flags on frontend still work as previously) +* Revamp the settings page (now a list table with inline configuration) +* Add an option to remove all data when uninstalling the plugin +* Add test of subdomains and domains accessibility +* Add post state for translations of the front page and posts page +* Add better support of the customizer menus introduced in WP 4.3 +* Media taxonomies (created by 3rd party plugins) are now filtered by language when editing a media +* Synchronization of taxonomies (created by 3rd party plugins) and meta are now enabled for media +* The 'hreflang' tag now refers to the locale instead of the 2-letters language code +* Workaround for WordPress locales not being W3C valid (see #33511) +* Workaround a bug in Nextgen Gallery causing redirect on album +* Add compatibility with Duplicate Post plugin to avoid duplicated post keeping the link to translations +* Add compatibility with Jetpack Related Posts +* fix: incorrect rewrite rules after changing how the language is set (need to flush rewrite rules after this) +* fix: password protected pages don't work on multiple domains +* fix: ensure that the page parent is in the correct language when using bulk edit +* fix: is_tax set on category and post tags archives when it should not +* fix: automatically added new top-level pages to menus are not filtered by language +* fix: nav menus locations are messed when changing the default language +* fix: error 404 for untranslated taxonomies pages +* fix: single posts and pages links do not include the language code when using the default permalinks and forcing the language code in url +* fix: missing trailing slash on home url when using default permalinks or a static front page +* fix: sticky visibility is copied to new translation only if the synchronization is activated +* fix: remove "» Languages » [language name]" from the feed title +* fix: spaces are not honored when searching strings translations +* fix: default language not set and terms translations not correctly imported when using WordPress Importer +* fix: the browser language detection does not differentiate 'en_US' and 'en_GB' +* fix: non alphanumeric characters query vars values lead to an infinite redirection loop on static front pages +* fix: user profile not saved for a language when the language code contains a "-" +* fix: non translated posts page always link to the static front page even when they should not +* fix: remove hreflang="x-default" when using one domain per language +* fix: deprecated function notice in WP 4.5 alpha +* fix: wrong url for attachments when media are translated and using subdomains +* fix: wrong url for unattached attachments when using subdirectories (since WP 4.4) +* fix: wrong url scheme for custom flags + += 1.7.12 (2015-11-13) = + +* The language taxonomy is now public for compatibility with WP 4.4 +* fix: nav menus locations are not correctly populated in customizer in WP 4.4 +* fix: the termmeta table was still deleted at upgrade +* fix: fatal error when using the argument 'post_id' in 'pll_the_languages()' (introduced in 1.7.11) [props EKesty](https://wordpress.org/support/topic/bug-on) +* fix: potential notice in 'pll_the_languages()' [props mattkeys](https://wordpress.org/support/topic/bug-on) + += 1.7.11 (2015-10-15) = + +* fix: conflict with GET ajax requests sent by the jquery method load +* fix: notice in frontend-nav-menu.php at line 211 (introduced in 1.7.10) [props Jesse Graupmann](https://wordpress.org/support/topic/warning-and-notice-on-upgrade) +* fix: the parent list in page attributes metabox is not in the correct language (introduced in 1.7.10) +* fix: error 404 for attachments +* fix: the language switcher is not displayed when combining "Forces link to front page" and "Hides languages with no translation" + += 1.7.10 (2015-09-28) = + +* Add Occitan translation contributed by [Cédric Valmary](http://www.totenoc.eu/) +* Add de_DE_formal, en_NZ, es_CO, hy, oci, ps and tl to the predefined languages list +* Add the filter 'pll_predefined_languages' and the actions 'pll_language_edit_form_fields' and 'pll_language_add_form_fields' +* the termmeta table (used in Polylang < 1.2) is no more deleted when uninstalling the plugin (as it will soon be included in WP) +* fix: prevent creating a media translation if one already exists +* fix: Attempt to translate the nav menus for themes registering a theme location but not using it in wp_nav_menu() +* fix: Jetpack infinite scroll +* fix: issue with terms languages when two languages have the same name +* fix: notices when deleting a tag and Lingotek is active +* fix: the languages cache is not cleaned when updating the site home url +* fix: conflict with the theme Ambition +* fix: front page canonical url displayed by Yoast SEO +* fix: typo in options definition at install [props null.bit](https://wordpress.org/support/topic/suggestions-for-two-new-filters?replies=5#post-7466159) +* fix: error when adding a term in a non-translated taxonomy + += 1.7.9 (2015-08-17) = + +* Minimum WordPress version is now v3.9 +* Add: hreflang="x-default" on front page when the default language code is not hidden in urls +* fix: remove hreflang links in html head section of paged archives to please Google +* fix: conflict with WPSEO sitemap caching when using multiple domains. [props Junaid Bhura](https://wordpress.org/support/topic/wp-seo-sitemap-and-translation-subdomain-issue?replies=8#post-7113817) +* fix: change the order of strings translations columns for better display on mobile devices in WP 4.3 +* fix: various issues with nav menus and customizer in WP 4.3 +* fix: correctly disallow unchecking both show names and show flags in the language switcher form + += 1.7.8 (2015-07-21) = + +* fix: conflict with PHP < 5.4 introduced in 1.7.7 + += 1.7.7 (2015-07-20) = + +* Add Romanian translation contributed by uskro +* Add Japanese translation contributed by [Eiko Toda](http://www.eikotoda.com) +* Update French translation contributed by [fxbenard](http://fxbenard.com/) +* The language locale is now validated with the same pattern as in WP 4.3. See #28303 +* fix: make sure that the language switcher never finds translations for untranslated post types (could occur when the post type was previously translated) +* fix: display the default category according to the admin language filter in settings->writing +* fix: flushing rewrite rules at network activation and de-activation is back. [props RavanH](https://polylang.wordpress.com/2015/06/10/polylang-1-7-6-and-multisite/comment-page-1/#comment-1138) +* fix: avoid a conflict with WP Super Cache preloading (loading 'polylang_mo' posts which are 404). [props ecdltf](https://wordpress.org/support/topic/polylang_mo-and-404s-take-2) +* fix: customizer menus issues introduced by changes in WP 4.1 +* fix: strings translations are not saved when pressing enter +* fix: it is not possible to de-activate the translation for custom post types and taxonomies from wpml-config.xml +* fix: conflict with plugins using stringified json in ajax requests + += 1.7.6 (2015-06-10) = + +* Add Galician translation contributed by [Toño Calo](http://fedellar.wordpress.com/) +* fix: incorrect post type archive link for untranslated post types +* fix: notices in wp-import.php +* fix: avoid flushing rewrite rules at network activation and de-activation +* fix: the note below the category list table displays the default category according to the admin language filter +* fix: wrong future posts permalinks +* fix: deleting a media translation deletes the file too +* fix: when using persistent object cache, get_terms is not always filtered by the correct language on admin side +* fix: it is possible to create two categories having the same translation +* fix: fatal error when using the dropdown language switcher in WP < 4.1 + += 1.7.5 (2015-05-11) = + +* Add 'pll_languages_list' filter +* fix: warning when a plugin calls 'icl_object_id' with an untranslated post type (seen in ACF 4.4.1) +* fix: the language is not correctly set from the url when using PATHINFO permalinks (introduced in 1.6!) +* fix: notice when a search is filtered by a taxonomy term in a different language + += 1.7.4 (2015-05-03) = + +* fix: translated taxonomies and post types from wpml-config.xml are not filtered on frontend (introduced in 1.7.2) +* fix: WPML strings translations not always loaded (introduced in 1.7) +* fix: $.ajaxPrefilter() may not work as expected [props ScreenfeedFr](https://wordpress.org/support/topic/ajaxprefilter-may-not-work-as-expected) +* fix: can't hide the language code for the default language when using subdomains +* fix: incorrect static front page url when hiding the default language information +* fix: an untranslated posts page may display posts in all languages +* fix: javascript error when changing the language of a hierarchical post type from the languages metabox in WP 4.2 +* fix: subdomains urls are malformed when the main site uses www. +* fix: suggest tags are not filtered in quick edit +* fix: parent page dropdown list not filtered in quick edit + += 1.7.3 (2015-04-11) = + +* the transient 'pll_languages_list' now stores an array of arrays instead of an array of PLL_Language objects +* fix: fatal error for users hosted at GoDaddy (due to PLL_Language objects stored in a transient) +* fix: additional query vars are removed from home page +* fix: categories are not filtered by the admin language switcher in posts list table (introduced in 1.7) +* fix: when using multiple domains, the domain url is lost when modifying the language slug +* fix: the queried object is incorrectly set for author archives (introduced in 1.6.5) +* fix: notice when a nav menu assigned to a translated nav menu location has been deleted +* fix: no canonical redirection when using pretty permalinks and querying default permalinks + += 1.7.2 (2015-03-23) = + +* fix: comments are filtered for posts in a post type not managed by Polylang +* fix: translated static front page don't work when setting PLL_CACHE_HOME_URL to false (introduced in 1.7) +* fix: the query for taxonomies on custom post types is broken (when adding the language code to the url) + += 1.7.1 (2015-03-20) = + +* fix: wrong redirection when using a static front page and replacing the page name by the language code (introduced in 1.7) + += 1.7 (2015-03-19) = + +* Minimum WordPress version is now v3.8 +* Add new languages to the predefined languages list: Swiss German, Hazaragi +* Add compatibility with nested tax queries introduced in WP 4.1 +* Add compatibility with splitting shared terms to be introduced in WP 4.2 +* Add the possibility to change the domain in the default language when using multiple domains (avoids a conflict with the domain mapping plugin) +* Add the possibility to set the language from the code in url when using default permalinks +* Adding the language code in url is now default at first activation (should improve the out of the box compatibility with other plugins and themes) +* Add new language switcher option to hide a language with no translation +* pll_the_languages() now outputs the js code to handle language change in dropdown list (as done by the widget) +* Improve performance by using base64 encoded flags + various slight optimizations +* Improve protection against chained redirects +* The find posts list is now filtered per media language when clicking on attach link in Media library +* Copy alternative text when creating a media translation +* The category checklist in quick edit is now filtered per post language instead of admin language filter +* Quick and bulk language edit don't break translations anymore if the new language is free +* Make it impossible to change the language of the default categories +* Make sure that a default category defined in settings->writing is translated in all languages +* Tweak css for mobiles in add and edit term form +* Tweak the query getting the list of available posts in the autocomplete input field in the post languages metabox +* fix: after adding a term translation, need to refresh the page before adding a new term +* fix: term translations rows are not modified in list table when a term is added / deleted or inline edited +* fix: post translations rows are not modified in list table when a post is inline edited +* fix: using brackets in language name breaks strings translations +* fix: quick edit may conflict with other plugins +* fix: impossible to use several dropdown languages widgets +* fix: pll_the_languages() may display a dropdown with empty options +* fix: the categories widget does not work correctly with dropdown +* fix: autosave post always created after manual save +* fix: tax query not filtered by language when using 'NOT IN' operator on a translated taxonomy +* fix: incorrect translation url for searches filtered by taxonomy +* fix: backward incompatibility for edited_term_taxonomy action introduced in WP 4.2 +* fix: the home link may be incorrect on MS Windows +* fix: tags in wrong language may be assigned when bulk editing posts in several languages +* fix: tags created when bulk editing posts are not assigned any language +* fix: Illegal string offset 'taxonomy' introduced in v1.6.5 +* fix: Undefined property: WP_Query::$queried_object_id when calling pll_the_languages(array('raw' => 1)) in a function hooked to 'wp'. props [KLicheR](https://wordpress.org/support/profile/klicher) +* fix: Notice in admin.php when used with MailPoet plugin + += 1.6.5 (2015-02-18) = + +* Add new correspondences between WordPress locales and Facebook locales (for WPSEO and Jetpack users) +* fix: quick draft posts are always assigned the default category in the default language +* fix: Notice: Undefined offset: 0 in wp-includes/query.php introduced in WP 4.1 +* fix: is_tax and is_archive are not correctly set when a custom taxonomy term is queried +* fix: conflict introduced by WPSEO 1.7.2+ + += 1.6.4 (2015-02-01) = + +* Add es_MX to predefined languages list +* Add compatibility with WordPress SEO sitemaps for multiple domains and subdomains +* fix: a new post is assigned the wrong (untranslated) default category if no category is assigned by the user +* fix: the home links now have the right scheme even if PLL_CACHE_HOME_URL is not set to false +* fix: fatal error when using old versions of WPSEO (I should do what I tell other to do!) +* fix: strings translations are not switched when using switch_to_blog + += 1.6.3 (2015-01-09) = + +* Add Georgian translation contributed by [Tours in Georgia](http://www.georgia-tours.eu/) +* fix: WXR export does not include the language of untranslated terms (will now work only for newly saved terms) +* fix: better cleaning of DB when translated objects are deleted +* fix: incorrect (ajax) translations links when modifying a term language +* fix: warning: Illegal string offset 'taxonomy' introduced by the combination of WP 4.1 and some plugins. + += 1.6.2 (2014-12-14) = + +* fix: bugs and inconsistencies compared to WPML in 'icl_get_languages' (should fix a conflict with Avada) +* fix: https issue +* fix: stop displaying an error when adding en_US as new language (translation not downloaded) +* fix: infinite redirect loop on (unattached) attachment links +* fix: impossible to add tags in post quick edit (introduced in 1.5) +* fix: the customizer does not land to the right page when cumulating: static front page + page name in url + default language code not hidden +* fix: read parent theme wpml-config.xml before child theme +* fix: add protection to avoid empty language +* fix: page preview link again + += 1.6.1 (2014-11-19) = + +* Add Brazilian Portuguese translation contributed by [Henrique Vianna](http://henriquevianna.com/) +* Improve compatibility with Types: allow custom fields to be populated when creating a new translation +* Make it impossible to remove the translations of the default category +* Fix: possibility to add a path when using multiple domains (same path for all languages) broken since v1.5.6 +* Fix: preview link for non default language when using multiple domains +* Fix: error displayed when setting the static front page and only one language has been defined +* Fix: revert changes on rewrite rules with front introduced in 1.6 +* Fix: conflict with WordPress SEO when no language has been created + += 1.6 (2014-10-27) = + +* Add Croatian translation contributed by Bajro +* Add new languages to predefined languages list: Azerbaijani, English (Australia), English (UK), Basque +* Add flag in front of the language select dropdown for posts and terms +* Add widget text translation +* Add opengraph support for locale and translations when WordPress SEO or Jetpack are activated +* Add error message if attempting to assign an untranslated page as static front page +* Add 'pll_sanitize_string_translation' filter to sanitize registered strings translations when saved +* Fix: change the en_US flag to US flag. The UK flag is now associated to en_GB +* Fix: change Belarusian locale from be_BY to bel to in agreement with translate.wordpress.org +* Fix home pages duplicate urls when using domains or subdomains +* Fix rewrite rules with front +* Fix: terms are always in default language when created from post bulk edit + += 1.5.6 (2014-10-11) = + +* Fix: the admin language filter is not active for paginated taxonomy in nav menu admin panel +* Fix: wrong redirection if a domain is a substring of another domain (ex: mysite.com and mysite.co) +* Fix: impossible to translate numeric values in options defined in wpml-config.xml +* Fix: call to undefined method PLL_Links::get_translation_url() with Avada theme +* Fix: manage_{$this->screen->taxonomy}_custom_icolumn is a filter and not an action + += 1.5.5 (2014-09-10) = + +* Fix: missing argument 4 in icl_translate +* Fix: conflict with Vantage theme +* Fix: possible issue with cookie domain on 'localhost' +* Fix: filtering string translations does not work when the group name contains a space +* Fix: Possible 404 error for attachments +* Fix: PHP notice when a shared term is not translated in all taxonomies + += 1.5.4 (2014-08-13) = + +* Add new API functions: pll_get_post_language, pll_get_term_language, pll_translate_string +* Add better compatibility with Jetpack 3 +* Fix: attachments don't get any language when uploaded from frontend +* Fix: authors cannot create tags +* Fix: too restrictive capability checks for some edge cases +* Fix: conflict with WPSEO: taxonomy metas cannot be saved + += 1.5.3 (2014-07-12) = + +* Add: Capability check before creating links in post list table +* Add: Possibility not to cache languages objects with option PLL_CACHE_LANGUAGES (for GoDaddy users) +* Fix: Saving a header or a background in menu Appearance resets nav menus locations (introduced in 1.5) +* Fix: sub-sub-options and deeper levels defined in wpml-config.xml are not translated +* Fix: Fatal error when creating a new site when Polylang is network activated (introduced in v1.5.1) +* Fix: Admin language forced to English when activating Polylang (before creating any new language) +* Fix: 'pll_count_posts' second parameter not taken into account +* Fix: 'edit-post' and 'create-posts' capabilities are not differentiated when saving a post + += 1.5.2 (2014-06-24) = + +* Fix: Revert post translations terms cleaning introduced in 1.5 as it seems to cause problems +* Fix: Impossible to delete a biographical info (introduced in 1.5) +* Fix: Security issue reported by [Gregory Viguier](http://www.screenfeed.fr/) + += 1.5.1 (2014-06-19) = + +* Add: filter 'pll_settings_tabs' and action 'pll_settings_active_tab_{$tab}' +* Add: possibility to add a path when using multiple domains (same path for all languages) +* Fix: Bad redirection if /language/ is added to urls (introduced in 1.5) +* Fix: Nav menu locations are not saved in customizer (introduced in 1.4) +* Fix: Unable to unset nav menu locations +* Fix: Incorrect link for date archives in language switcher (introduced in 1.5) +* Fix: Fatal error when using featured content in Twenty Fourteen +* Fix: Posts bulk edit broken (introduced in 1.5) +* Fix: Polylang does not play nice with switch_to_blog +* Fix: Warning: reset() expects parameter 1 to be array, null given in admin-filters-columns.php on line 81 + += 1.5 (2014-05-29) = + +* Add Ukrainian translation contributed by [http://getvoip.com/](http://getvoip.com/) +* Refresh translation metaboxes (again): now translated posts are chosen from an autocomplete input field +* Categories and post tags translations are also chosen in an autocomplete input field +* Better error management on languages pages +* Use Dashicons instead of Icomoon icons for WP 3.8+ +* Check if translated post is readable by the current user before displaying the language switcher +* Minimum Twenty Fourteen version is now 1.1 +* Code cleaning +* Add support for Quick draft introduced in WP 3.8 +* Add support for object cache plugins for recent posts and recent comments widgets +* Add support for pages with modified query in the language switcher (ex: when multiple post types queried on the same page) +* Add new API functions: pll_languages_list, pll_set_post_language, pll_set_term_language, pll_save_post_translations, pll_save_term_translations, pll_count_posts +* Add new filter pll_the_languages_args +* Add support for ICL_LANGUAGE_CODE == 'all' on admin side +* Fix: Galician flag +* Fix: static page on front pagination is broken +* Fix: search url may be broken +* Fix: PHP notice in icl_get_languages +* Fix: more robust way of detecting language in url when using directory +* Fix: delete translations terms orphans in database +* Fix: inconsistent behavior when setting page on front from customizer +* Fix: deleting a category assigns posts to wrong default category +* Fix: quick edit breaks synchronization +* Fix: some security issues + += 1.4.5 (2014-04-19) = + +* Fix: Notice when combined with WPSEO 1.5+ +* Fix: Impossible to disable a widget language filter once set (introduced in 1.4.4) +* Fix: Unexpected redirection of the homepage with language code when permalink structure has no trailing slash (introduced in 1.4.4) +* Fix: Some installs lead to wrong redirection when using domains (introduced in 1.4.4) +* Fix: Possible infinite redirection while previewing posts (introduced in 1.4.4) +* Fix: Uploaded medias don't get a language since WP 3.9 +* Fix: Compatibility with Twenty Fourteen Ephemera widget in the version shipped with WP 3.9 + += 1.4.4 (2014-04-09) = + +* Add: Compatibility with widgets customizer introduced in WP 3.9 +* Fix: No post in translation dropdown after switching the language in edit post (introduced in 1.4.3) +* Fix: No canonical redirection when there is no language code in url and the language code is not hidden for the default language +* Fix: Suppress language cookie when using multiple domains + += 1.4.3 (2014-03-22) = + +* Add: Serbian translation contributed by Sinisa +* Add: Myanmar translation contributed by Sithu Thwin +* Fix: comment form redirects to wp-admin when using multiple domains or subdomains. +* Fix: fatal error with old versions of PHP (tested on PHP 5.2.4) +* Fix: Bad gateway experienced by users hosted by wpengine.com +* Fix: links got from tiny MCE link button are filtered with admin language filter instead of current post language +* Fix: possibly wrong redirection in check_language_code_in_url when using multiple domains or subdomains + += 1.4.2 (2014-02-24) = + +* Add: check multiple post types in PLL_Model::count_posts +* Fix: error 404 on category links when setting the language by content (introduced in 1.4.1) +* Fix: PHP notices in frontend-nav-menu.php with Artisteer themes +* Fix: decrease the memory usage of untranslated posts list +* Fix: home page not correctly redirected to canonical when using page on front and page name is kept in url + += 1.4.1 (2014-02-16) = + +* Add: Czech translation contributed by [Přemysl Karbula](http://www.premyslkarbula.cz) +* Fix: the displayed language is not correct in quick edit for categories and post tags +* Fix: the language switcher does not display the correct link for translated parent categories if only children have posts +* Fix: 3rd parameter of icl_object_id is not optional +* Fix: issue when combining multiple domains and browser detection -> the combination is now forbidden +* Fix: conflict Shiba Media Library: link between media translations is lost when using media quick edit +* Fix: notice when using taxonomies in wpml-config.xml +* Fix: incorrect post format link +* Fix: Twenty Fourteen Ephemera widget strings are not translated + += 1.4 (2014-01-22) = + +* Add Traditional Chinese translation contributed by [香腸](http://sofree.cc/) +* Minimum WordPress version is now v3.5 +* Refresh translations metaboxes: now translated posts are chosen in a dropdown list +* Check if translated archives for category, tag and post format are empty before displaying the language switcher +* Add specific management of translated featured tag in Twenty Fourteen +* Add the possibility not to cache homepage urls with option PLL_CACHE_HOME_URL (for users having several domains). +* The function get_pages is now filtered by language +* Ajax requests on frontend are now automatically detected. It is no more necessary to set 'pll_load_front' :) +* Various performance improvements +* 'pll_get_post_types' and 'pll_get_taxonomies' filters must be added *before* 'after_setup_theme' is fired +* Pre 1.2 data will be removed from DB at first upgrade at least 60 days after upgrade to 1.4 +* Removed some duplicate code between admin and frontend +* Bug correction: incorrect pagination when using domains or subdomains +* Bug correction: post format link not translated +* Bug correction: impossible to use child terms with same name in hierarchical taxonomies +* Bug correction: the terms list table is filtered according to new translation language instead of admin language filter + += 1.3.1 (2013-12-13) = + +* Bug correction: fatal error on settings page if a static front page without language is set +* Bug correction: wrong home url when using different domains per language + += 1.3 (2013-12-11) = + +* Refresh admin UI for better look in WP 3.8 and more dynamic comportment +* The "Detect browser language" option does now also controls returning visits (based on cookie). +* Improved performance by optimizing some queries for WP 3.5+ +* The user biography in default language is now stored in default WordPress usermeta +* Add language parameter in API function pll_home_url and allow to call it on admin side +* Calling 'get_terms' with the 'lang' parameter now uses a cache object per language +* Bug correction: conflict with unstranslated taxonomies +* Bug correction: possible malformed translation archive url in language switcher +* Bug correction: a wrong language may be displayed in quick edit dropdown +* Bug correction: it is possible to add multiple translations (in the same language) for a single taxonomy term +* Bug correction: non public post types and taxonomies are visible in Polylang settings +* Bug correction: the language is always chosen from cookie (or browser preferences) in some installations +* Bug correction: Firefox language preference is not recognized when comparison is made on locale (instead of ISO 639-1 language code) +* Bug correction: incorrect tax_query in PLL_Auto_Translate + += 1.2.4 (2013-11-28) = + +* Better support for theme customizer +* Bug correction: admin bar search does not filter by language +* Bug correction: possible conflict on secondary query when querying taxonomies or single page +* Bug correction: post type is not included in url when editing or adding a term translation +* Bug correction: various warnings and PHP notices + += 1.2.3 (2013-11-17) = + +* Avoid fatal error when upgrading with Nextgen Gallery active +* Bug correction: menus locations of non default language are lost at theme deactivation +* Bug correction: impossible to set menus locations of non default language in some specific cases +* Bug correction: bbpress admin is broken + += 1.2.2 (2013-11-14) = + +* Updated Polish translation thanks to [Bartosz](http://www.dfactory.eu/) +* Delay strings translations upgrade from 'wp_loaded' to 'admin_init' to avoid fatal error when wp-ecommerce is active +* Remove Jetpack infinite scroll compatibility code as it seems useless with new Polylang 1.2 code structure +* Bug correction: fatal error when doing ajax on frontend +* Bug correction: ICL_LANGUAGE_CODE incorrectly defined when doing ajax on frontend +* Bug correction: ['current_lang'] and ['no-translation'] indexes disappeared from pll_the_languages raw output +* Bug correction: invalid argument supplied for foreach() in /polylang/include/mo.php on line 57 +* Bug correction: cookie may not be correctly set +* Bug correction: languages columns may not be displayed in custom post types and custom taxonomies tables + += 1.2.1 (2013-11-11) = + +* Update badly encoded Latvian translation +* Suppress one query in PLL_WPML_Config when not in multisite +* Bug correction: strings translations are not correctly upgraded +* Bug correction: nav menus locations are not correctly upgraded for non default language + += 1.2 (2013-11-10) = + +This version does include important changes in database. More than ever, make a database backup before upgrading + +* Add Arabic translation contributed by [Anas Sulaiman](http://ahs.pw/) +* Major rewrite with new structure +* Change the language and translations model from meta to taxonomy (no extra termmeta table created anymore) +* Move the strings translations from option to a custom post type +* Add support for language code in subdomain and for one different domain per language (experimental) +* Add support of WordPress Importer plugin. Export must have been done with Polylang 1.2+ (experimental) +* Add support for theme navigation customizer (was de-activated by Polylang since WP 3.4) +* Request confirmation for deleting a language +* Better management of default category for each language +* Now check if date and post type archives are translated before displaying the language switcher +* Update management of the 'copy' action of the custom fields section in wpml-config.xml +* Add support for ICL_LANGUAGE_CODE and ICL_LANGUAGE_NAME of the WPML API on admin side +* Add support of WPSEO custom strings translations when the language is set from content +* Modify admin language filter for valid html and better visibility +* Synchronization is now disabled by default (due to too much conflicts / questions on the forum) +* Include rel="alternate" hreflang="x" selflink per google recommendation +* Improve inline documentation +* Bug correction: wrong datatype for second argument in polylang/include/auto-translate.php (introduced in 1.1.6) +* Bug correction: same id is used for all language items in menu +* Bug correction: wpml-config.xml file not loaded for sitewide active plugins on network installations +* Bug correction: page parent dropdown list (in page attributes metabox) not correctly displayed when switching from a language with empty list + += 1.1.6 (2013-10-13) = + +* Add the possibility to display the upgrade notice on plugins page +* Bug correction: Illegal string offset 'taxonomy' in polylang/include/auto-translate.php +* Bug correction: user defined strings translations are not loaded on admin side +* Bug correction: untranslated post types are auto translated +* Bug correction: tags are not added to post when the name exists in several languages and they are not translations of each other + += 1.1.5 (2013-09-15) = + +* Add compatibility with Aqua Resizer (often used in porfolio themes) +* Add support of 'icl_get_default_language' function from the WPML API +* Remove the 3 characters limitation for the language code +* Change default names for zh_CN, zh_HK, zh_TW +* Bug correction: urls are modified in search forms + += 1.1.4 (2013-08-16) = + +* Add simplified Chinese language contributed by [Changmeng Hu](http://www.wpdaxue.com) +* Add Indonesian language contributed by [ajoull](http://www.ajoull.com/) +* Bug correction: nav menu locations are lost when using the admin language filter +* Bug correction: the cookie is not set when adding the language code to all urls (introduced in 1.1.3) + += 1.1.3 (2013-07-21) = + +* Add Venetian language contributed by Michele Brunelli +* Bug correction: wrong rewrite rules for non translated custom post type archives +* Bug correction: 'post_id' parameter of pll_the_languages does not work +* Bug correction: warning in wp_nav_menu_objects with Artisteer generated themes +* Bug correction: warning when used together with theme my login plugin +* Bug correction: language slug is modified and translations are lost when creating a nav menu with the same name as a language + += 1.1.2 (2013-06-18) = + +* Posts and terms now inherit parent's language if created outside the standard WordPress ui +* Improve the compatibility with the plugins Types and The Events Calendar, and again with WordPress SEO +* Improve performance +* Improve html validation +* Add 'raw' argument to 'pll_the_languages' +* Add the filter 'pll_translation_url' +* Bug correction: no language is set for a (translated custom taxonomy) term when added from a (non translated) custom post type edit page +* Bug correction: warning if 'get_terms' is called with a non-array 'include' argument (introduced in 1.1.1) +* Bug correction: warning if the menu language switcher has nothing to display + += 1.1.1 (2013-05-20) = + +* Move nav menu language switcher split from 'wp_nav_menu_objects' to 'wp_get_nav_menu_items' filter +* Add the filter 'pll_redirect_home' +* Automatically translate ids in 'include' argument of 'get_terms' (useful for the menus in the Suffusion theme) +* Add compatibility with Jetpack infinite scroll +* Bug correction: rtl text direction not set when adding the language code to all urls (introduced in 1.1) +* Bug correction: hide again navigation panel in theme customizer as it still doesn't work +* Bug correction: is_home not set on translated page when searching an empty string +* Bug correction: fatal error when creating a post or term from frontend (introduced in 1.1) +* Bug correction: attachments may load a wrong language when media translation was enabled then disabled +* Bug correction: warning when querying posts before the action 'wp_loaded' has been fired (in auto-translate.php) +* Bug correction: potential issue if other plugins use the filter 'get_nav_menu' +* Bug correction: interference between language inline edit and search in admin list tables +* Bug correction: auto-translate breaks queries tax_query when the 'field' is set to 'id' +* Bug correction: search is not filtered by language for default permalinks (introduced in 1.1) +* Tests done with WP 3.6 beta 3 and Twenty thirteen + += 1.1 (2013-05-10) = + +* When adding the language to all urls, the language is now defined in (plugins_loaded, 1) for better compatibility with some plugins (WordPress SEO) +* When querying posts and terms, ids are now automatically translated +* Add the possibility to group string translations +* Add the possibility to delete strings registered with 'icl_register_string' +* Move the option 'polylang_widgets' in general polylang options +* Better integration of the multilingual nav menus (everything is now integrated in the menus page of WordPress +* The language switcher is now a menu item which can be placed everywhere in a nav menu +* Posts or terms created from frontend are now assigned the current language (or another one if specified in the variable 'lang') +* Bug correction: continents-cities-xx_XX.mo not downloaded +* Bug correction: a gzipped 404 page is downloaded when a mo file does not exist on WordPress languages files repository +* Bug correction: post_date_gmt not synchronized together with post_date +* Tests done with WP 3.6 beta 2 and Twenty thirteen + += 1.0.4 (2013-04-08) = + +* Add Estonian translation contributed by [Ahto Naris](http://profiles.wordpress.org/ahtonaris/) +* Now compatible with languages files stored in wp-content/languages/themes +* Bug correction: page preview does not work when adding the language code to all urls +* Bug correction: error when a post type or taxonomy label is not a string +* Bug correction: admin text section of wpml-config.xml (introduced in 1.0.3) +* Bug correction: infinite redirect loop when querying an unattached media and the language code is added to all urls +* Bug correction: the text direction is not set from Polylang options when the language code is added to all urls +* Bug correction: get_adjacent_post is filtered by language even for post types without language +* Bug correction: the home url is not not in the correct language in wp-login.php +* Bug correction: the language is not correctly set when using date and name permalinks (introduced in 1.0.3) + += 1.0.3 (2013-03-17) = + +* Add Catalan translation contributed by [Núria Martínez Berenguer](http://nuriamb.capa.webfactional.com) +* Add Ukrainian translation contributed by [cmd soft](http://www.cmd-soft.com/) +* Improve compatibility with WordPress SEO (sitemap for categories and tags) +* A query is no more filtered by language when setting the parameter 'lang' to an empty value +* Add the possibility to create a custom wpml-config.xml file in wp-content/polylang/ +* Bug correction: custom menus are not displayed on search page (introduced in 1.0.2) +* Bug correction: sql error when filtering terms by language (introduced in 1.0.2) +* Bug correction: SSL doesn't work properly +* Bug correction: php notice on IIS servers +* Bug correction: clicking on the radio buttons in the admin language switcher does not work in Chrome +* Bug correction: on multisite, the signup page is redirected to the home page +* Bug correction: date archives are not correctly filtered for the default language when hiding the language code and using date and name permalinks +* Bug correction: only one wpml-config.xml file is parsed + += 1.0.2 (2013-02-26) = + +* Add the possibility to query comments by language +* Add the possibility not to set a cookie by defining PLL_COOKIE to false (Polylang may not work as expected on some pages) +* Now a returning visitor is redirected to its preferred language when visiting the front page in the default language +* Add compatibility with the plugin Custom field template (copy and synchronize custom fields) +* Improve compatibility with plugins or themes which overwrite columns in posts list table +* Add the filter 'pll_get_flag' +* Add support of 'icl_unregister_string' function from the WPML API +* Bug correction: synchronizing custom fields breaks the plugin Advanced Custom Fields +* Bug correction: 'pll_default_language' broken +* Bug correction: rewrite rules are not flushed when re-activating the plugin +* Bug correction: feed urls are not correctly escaped when using default permalinks +* Bug correction: notice Undefined index: media_support +* Bug correction: custom post types and taxonomies set in wpml-config.xml are not hidden +* Bug correction: get_terms cannot query multiple languages +* Bug correction: 'icl_register_string' is now persistent as in WPML (fixes Nextgen gallery translations which were not working) + += 1.0.1 (2013-01-28) = + +* Add Swedish translation contributed by [matsii](http://wordpress.org/support/profile/matsii) +* Add 2 new API functions : 'pll_is_translated_post_type' and 'pll_is_translated_taxonomy' +* Bug correction: when using a static front page, the posts page is not filtered by language (introduced in 1.0) +* Bug correction: disable translation for hard coded menu as it creates more problems than it solves (introduced in 1.0) + += 1.0 (2013-01-24) = + +* Add Hungarian translation contributed by Csaba Erdei +* Add Norwegian translation contributed by [Tom Boersma](http://www.oransje.com/) +* Add Slovak translation contributed by [Branco (WebHostingGeeks.com)](http://webhostinggeeks.com/user-reviews/) +* Code cleaning -> remove compatibility with versions older than 0.8 +* Add search in the string translations list table +* Add options to better control the synchronization of various metas for posts +* It is now possible to synchronize sticky posts and publication dates +* Add option to disable the multilingual support of media +* Add options to better control the multilingual capability of custom post types and taxonomies +* Better integration with new media management in WP 3.5 +* Improve menu translation for themes which register a theme location but don't use it in wp_nav_menu (hard coded menu) +* Add the pll_preferred_language filter allowing plugins to modify the language set by browser preferences detection +* Add support of the WPML config file +* Add support of 'icl_get_languages' and 'icl_link_to_element' functions from the WPML API +* Add compatibility with YARPP and improve compatibility with WordPress SEO +* Change cookie name which conflicts with Quick cache and allow users to overwrite it by defining the constant PLL_COOKIE +* Bug correction: again the canonical redirection +* Bug correction: the languages are not correctly displayed after they have been modified using quick edit +* Bug correction: undefined index notice when saving strings translation when the admin language filter is active +* Bug correction: rewrite rules are not correctly flushed when adding / deleting a language (introduced in 0.9.2) +* Bug correction: the list of pages is displayed when a static font page translation is not translated (now replaced by the list of posts) +* Bug correction: permalinks are not modified when doing cron and the language code is added to all urls +* Bug correction: creating a new term with the same name as a language may modify the language code (slug) + += 0.9.8 (2012-12-05) = + +* Bug correction: ajax on frontend does not work when adding the language code to all urls +* Bug correction: search forms using the get_search_form filter do not work + += 0.9.7 (2012-12-04) = + +* Bug correction: the admin language filter does filter non translatable post types +* Bug correction: again the canonical redirection +* Bug correction: fatal error when Polylang is used together with 'Author Avatars List' +* Bug correction: widget titles uselessly appear in the strings translations table when the widget is set for only one language +* Tests done with WordPress 3.5 RC3 and Twenty Twelve + += 0.9.6 (2012-11-26) = + +* It is now possible to query the terms by language using the WordPress function 'get_terms' +* Bug correction: search for empty string in default language displays posts in all languages when hiding the URL language information for default language +* Bug correction: completely reworked the canonical redirection introduced in 0.9.5 which created more problems than it solved +* Bug correction: ajax for media translations does not work +* Started tests with WordPress 3.5 RC1 and Twenty Twelve + += 0.9.5 (2012-11-13) = + +* The user can now choose the number of languages and strings translations to display +* Add compatibility with the 'icl_object_id' function and ICL_LANGUAGE_CODE and ICL_LANGUAGE_NAME constants from the WPML API +* Add 17 languages to the predefined list (automatic download and update of language files won't work) +* Bug correction: post preview does not work when adding the language code to all urls +* Bug correction: redirect to front page in default language when posting a comment on static front page +* Bug correction: impossible to create terms with the same name in different languages +* Bug correction: query string added by other plugins is erased when adding the language code to all urls +* Bug correction: redirect erase 'POST' variables on homepage when adding the language code to all urls +* Bug correction: English (en_US) loads rtl style when using a localized WordPress package with an rtl language +* Bug correction: on some installation strings translations do not work with some special characters +* Bug correction: incoming links are not redirected to canonical url when adding the language code to all urls and hiding the code for the default language +* Bug correction: search form does not work in non default language when using permalinks without trailing slash + += 0.9.4 (2012-10-23) = + +* Add Afrikaans translation contributed by [Kobus Joubert](http://translate3d.com/) +* Add Belarusian translation contributed by [Alexander Markevitch](http://fourfeathers.by/) +* Add Afrikaans (af) and Belarusian (be_BY) to predefined languages list (automatic download and update of language files won't work) +* Add the possibility to translate the date format and time format +* Add compatibility with the 'icl_get_home_url' function from the WPML API +* Bug correction: still some issues with string translations +* Bug correction: search is not filtered by the (default) language when the language is set by content and the language code is hidden for the default language +* Bug correction: posts & pages preview urls are broken when adding the language code to all urls +* Bug correction: automatically added new top-level pages to menus are not filtered by language +* Bug correction: the admin language filter messes the categories languages when editing a post and the parent dropdown list when editing a category +* Bug correction: search form does not work when using a static front page (introduced in 0.9.2) +* Bug correction: can't set languages for categories and post tags on blogs created after polylang has been activated at network level +* Bug correction: menus don't work with catch box theme ('has_nav_menu' not correctly filtered) + += 0.9.3 (2012-10-08) = + +* Add Bulgarian translation contributed by [pavelsof](http://wordpress.org/support/profile/pavelsof) +* Add compatibility with WPML API for strings translations +* Bug correction: dates are not translated (introduced in 0.9.2) +* Bug correction: the language is lost when keeping - No change - for language in bulk edit +* Bug correction: categories and tags are duplicate (when default language is set automatically to existing content and categories and tags share the same name) + += 0.9.2 (2012-09-30) = + +* Support new WordPress (WP 3.5+) convention for js and css files naming +* Improve performance, mainly on frontend +* Bug correction: the category language is not set when creating it in the post editor (introduced in 0.9) +* Bug correction: unable to add a query string when using a static front page +* Bug correction: ajax tag suggestion in "edit post" conflicts with the admin content language filter +* Bug correction: ugly notices when trying to access a static front page which has not been translated +* Bug correction: the language code is added to custom post types and taxonomies permalinks even if they are not translatable +* Bug correction: some arrays in wp_locale mix English and other language +* Bug correction: the media language is not correctly set when uploading from post if the post has not been saved after choosing the language + += 0.9.1 (2012-09-20) = + +* Add Finnish translation contributed by [Jani Alha](http://www.wysiwyg.fi) +* Bug correction: improve the robustness of the admin content language filter +* Bug correction: the language switcher displays languages which have no posts or pages (introduced in 0.9) +* Bug correction: wrong default language when adding a new media +* Bug correction: the dropdown language switcher does not switch language when there is no post translation +* Bug correction: issue with translations when using category quick edit +* Bug correction: home redirects to 404 when combining static front page + force_lang = 1 + hide_default = 0 + += 0.9 (2012-09-12) = + +* Add Turkish translation contributed by [darchws](http://darch.ws/) +* Add media translation support +* Add a persistent content language filter on admin side (WP 3.2+ required) +* Add biographical info translation +* Add multiline support for string translations +* Add the possibility to clean the strings translation database +* Add quick edit and bulk edit support for posts and pages +* Add quick edit support for categories and tags +* The language is now loaded with 'setup_theme' action instead of 'wp' action when always adding language information url +* Search form now does use javascript only for searchform.php when pretty permalinks are not used +* Add the option PLL_SEARCH_FORM_JS to disable the js code used to modify the search form +* Suppress the option PLL_SYNC, replaced by an option in the language settings ui +* Suppress the PLL_DISPLAY_ALL option +* Suppress the template tag 'the_languages' (replaced by 'pll_the_languages' since v0.5) +* Suppress the function 'pll_is_front_page' (useless since 0.8.2) +* Bug correction: the browser language is sometimes not correctly detected by Android +* Bug correction: the rtl text direction is not correct when editing an existing language +* Bug correction: rss feed does not work if translated site title or tagline contains special characters +* Bug correction: post types and taxonomies labels are not translated on frontend +* Bug correction: the filter 'pll_copy_post_metas' does not work for metas with multiple values +* Bug correction: translations table for post and terms are uselessly serialized two times +* Bug correction: attempt to suppress conflict with themes which hardcode the name of nav menus (but do define a theme location) +* Bug correction: homepage displays all posts when the front page displays a static page and no page is selected for front page (but one is selected for posts page) +* Bug correction: widgets disappear when Polylang is enabled + += 0.8.10 (2012-08-06) = + +* Add Lithuanian (lt_LT) to predefined languages list (automatic download and update of language files won't work) +* Add Lithuanian translation contributed by [Naglis Jonaitis](http://najo.lt/) +* Bug correction: empty string translation issue +* Bug correction: 'wp_list_pages' does not filter custom post types +* Bug correction: warning if posts are queried before the action 'wp_loaded' has been fired +* Bug correction: notice in twentyten when requesting a date archive with no posts + += 0.8.9 (2012-07-20) = + +* Add Portuguese translation contributed by [Vitor Carvalho](http://vcarvalho.com/) + += 0.8.8 (2012-07-18) = + +* Validation improvement thanks to kg69design +* Bug correction: custom post types rewrite rules are broken when registered with query_var=>false +* Bug correction: user admin language not deleted when uninstalling the plugin +* Bug correction: pll_current_language('name') returns locale instead of language name +* Bug correction: ajax on frontend does not work +* Bug correction: homepage pagination broken when redirecting the language page to a static front page +* Bug correction: taxonomies conflicts on custom post types +* Bug correction: the admin language is not updated when edited by other users + += 0.8.7 (2012-06-10) = + +* Add the possibility to load Polylang API for ajax requests on frontend +* Bug correction: search form is broken when using a static front page +* Bug correction: admin bar search does not work +* Tests done with WordPress 3.4 RC2 + += 0.8.6 (2012-05-23) = + +* Add the possibility to use a local config file to set options +* Improve robustness (less PHP notices) +* Bug correction: Menus not showing in preview mode +* Bug correction: fatal error when customizing a theme in WP 3.4 beta 4 +* Bug correction: second page of search results returns 404 when using pretty permalinks + += 0.8.5 (2012-05-14) = + +* Bug correction : sites using static front page are messed in v0.8.4 + += 0.8.4 (2012-05-13) = + +* Add a new argument 'post_id' to the function pll_the_languages to display posts translations within the loop +* Bug correction: every posts in every languages are shown on the homepage when requesting the wrong one with or without 'www.' +* Bug correction: every posts in every languages are shown when requesting /?p=string +* Bug correction: the language is not correctly set for wp-signup.php and wp-activate.php +* Bug correction: wrong home links when using permalinks with front with WP 3.3 and older +* Bug correction: wrong redirection after posting a comment when adding the language information to all urls +* Bug correction: term language may be lost in some situations +* Bug correction: post language is set to default if updated outside the edit post page +* Bug correction: javascript error in WP 3.1 +* Bug correction: can't toggle visibility of tags metabox in edit post panel +* Tests done with WordPress 3.4 beta 4 + += 0.8.3 (2012-04-10) = + +* Add Danish translation contributed by [Compute](http://wordpress.org/support/profile/compute) +* Add Spanish translation contributed by Curro +* Add the possibility to add a content in a different language than the current one by setting explicitly the lang parameter in the secondary query +* Add support of PATHINFO permalinks +* Bug correction: secondary queries not correctly filtered by language +* Bug correction: wrong archives links when using permalinks with front +* Bug correction: wrong homepage link when keeping 'language' in permalinks with front +* Bug correction: flush_rewrite_rules notice when setting up a static front page (introduced in 0.8.2) +* Bug correction: every posts in every languages are shown when hitting the homepage with a query string unknown to WP (thanks to Gonçalo Peres) +* Bug correction: every posts in every languages are shown on the homepage when PHP adds index.php to the url +* Tests done with WordPress 3.4 beta 1 + + += 0.8.2 (2012-03-20) = + +* Add Italian translation contributed by [Luca Barbetti](http://wordpress.org/support/profile/lucabarbetti) +* Improve performance on admin side +* Comment status and ping status are now copied when adding a new translation +* Deprecated API function 'pll_is_front_page' as it is now useless +* Bug correction: Wrong translation url for taxonomies when adding the language information to all urls +* Bug correction: "translation" of search page does not work if the site is only made of pages +* Bug correction: wrong language permalink structure introduced in 0.8.1 +* Bug correction: wrong language set when clicking on "add new" translation in edit category and edit tags panels +* Bug correction: site does not display if no languages are set +* Bug correction: get_author_posts_url is 404 +* Bug correction: homepage is 404 when using a static front page and adding the language information to all urls + += 0.8.1 (2012-03-11) = + +* Add Latvian translation contributed by [@AndyDeGroo](http://twitter.com/AndyDeGroo) +* It is now possible to synchronize multiple values for custom fields +* Add new API function pll_current_language +* Add the pll_rewrite_rules filter allowing plugins to filter rewrite rules by language +* WP 3.4 preparation: disable the menu section in the customize theme admin panel (unusable with Polylang) +* Bug correction: removing 'language' in permalinks does not work in WP 3.4 alpha +* Bug correction: problems with custom post type archives when 'has_archive' is set (thanks to AndyDeGroo) +* Bug correction: 404 error when combining %postname% permastructure with "Add language information to all URL" option +* Bug correction: translated custom strings are duplicated if registered several times +* Bug correction: queries with an array of post types are not correctly filtered +* Bug correction: wp-login.php always in English + += 0.8 (2012-02-29) = + +* Sticky posts are now filtered by language +* It is now possible to use the language page as home page +* Add an "About Polylang" metabox on the languages admin page +* Add the pll_the_languages filter allowing to filter the whole output of the language switcher +* Add a new argument 'display_names_as' to the function pll_the_languages +* Add pll_get_post_types & pll_get_taxonomies filters allowing to enable / disable the language filter for post types & taxonomies +* Add ckb to predefined languages list +* Completely reworked the string translation storage in the database +* Some performance improvements on admin side +* Improve compatibility with other plugins broken by the home url filter +* Add an option to disable the home url filter +* Add an option to disable synchronization of metas between translations +* Bug correction: body class 'home' is not set on translated homepage +* Bug correction: robots.txt is broken when adding the language code to all urls (including default language) +* Bug correction: bad name for the Czech flag +* Bug correction: bad language information in rss feed for WP < 3.4 +* Bug correction: signup broken on multisite +* Bug correction: the translation url is set to self when using a static front page and no page for posts and there is no translation +* Bug correction: problems with custom post type archive titles +* Bug correction: problems with custom post type if rewrite slug is different from post_type (thanks to AndyDeGroo) +* Bug correction: quick edit still breaks translation linking of pages (thanks to AndyDeGroo) +* Bug correction: bad rewrite rules for feeds (introduced in 0.7.2) +* Bug correction: the order is not saved when creating a language +* Bug correction: the categories list is not updated when adding a new category (ajax broken) + += 0.7.2 (2012-02-15) = + +* Add Polish translation contributed by [Peter Paciorkiewicz](http://www.paciorkiewicz.pl) +* Add 5 new languages to predefined list +* completely reworked rewrite rules +* WP 3.4 preparation: add new WordPress languages files to download when creating a new language +* Bug correction: custom nav menus do not work in Artisteer generated themes +* Bug correction: having a single language causes multiple warnings while saving post/page. +* Bug correction: custom nav menu broken on archives pages +* Bug correction: the language switcher does not link to translated post type archive when using pretty permalinks +* Bug correction: the tags are not saved in the right language when translated tags have the same name +* Bug correction: bad link in post preview when adding language code to all urls +* Bug correction: feed not filtered by language when adding language code to all urls +* Bug correction: duplicate canonical link when used together with WordPress SEO by Yoast +* Bug correction: the all posts admin page is messed if another plugin adds a column +* Bug correction: 404 error on static front page when adding language code to all urls (including default language) + += 0.7.1 (2012-02-06) = + +* Allow using 3 characters languages codes (ISO 639-2 or 639-3) +* The predefined languages dropdown list now displays the locale to help differentiate some languages +* Add 5 new languages to predefined list +* Bug correction: the filter 'pll_copy_post_metas' does not work +* Bug correction: impossible to add a tag in the edit post panel +* Bug correction: rewrite rules not correct +* Bug correction: cache issue with css and js files + += 0.7 (2012-01-30) = + +* Add Hebrew translation contributed by [ArielK](http://www.arielk.net) +* Add support for RTL languages for both frontend and admin +* Twenty Ten and Twenty Eleven languages files are now automatically downloaded when creating a new language +* Improve filtering tags by language in the edit post panel +* Category parent dropdown list is now filtered by language +* Category parents are now synchronized between translations +* Add the possibility to have the language information in all URL +* Add support for post formats +* Add option allowing not to show the current language in the language switcher (for both menu and widget) +* Add a title attribute (and the possibility to personalize it with a filter) to flags +* pll_get_post and pll_get_term second parameter is now optional and defaults to current language +* Add pll_the_language_link filter allowing to filter translation links outputted by the language switcher +* The option PLL_DISPLAY_ALL is no longer supported +* Bug correction: Autosave reset to default language +* Bug correction: blog info not translated in feeds +* Bug correction: post comments feed always in default language +* Bug correction: undefined index notice when setting up a custom menu widget +* Bug correction: rewrite rules are not correctly reset when deactivating the plugin +* Bug correction: is_home not correctly set on pages 2, 3... +* Bug correction: avoid naming conflicts (in sql queries) with other themes / plugins +* Bug correction: bad language detection and url rewriting of custom post types archives + += 0.6.1 (2012-01-12) = + +* Add Dutch translation contributed by [AlbertGn](http://wordpress.org/support/profile/albertgn) +* Disable everything except the languages management panel while no language has been created +* Bug correction: can't have the same featured image in translated posts +* Bug correction: parent page dropdown does appear only after the page has been saved +* Bug correction: archives widget not working anymore +* Bug correction: string translations does not work for WP < 3.3 +* Bug correction: fix fatal error in string translations caused by widgets using the old API +* Bug correction: the strings translation panel is unable to translate strings with special characters +* Bug correction: Polylang "is_front_page" returns true on archives pages + += 0.6 (2012-01-07) = + +* Add Greek translation contributed by [theodotos](http://www.ubuntucy.org) +* WordPress languages files are now automatically downloaded when creating a new language (and updated when updating WordPress) +* Add the possibility to change the order of the languages in the language switcher +* Add the possibility to translate the site title, tagline and widgets titles +* Categories, post tags, featured image, page parent, page template and menu order are now copied when adding a new translation +* Translations are now accessibles in the "Posts", "Pages", "Categories" and "Post tags" admin panels +* Improve the dropdown language switcher widget (sends now to translated page or home page based on options) +* Move custom flags from polylang/local_flags to wp_content/polylang +* Add two options to "pll_the_languages" ('hide_if_no_translation' and 'hide_current'). *The function does not output ul tag anymore* +* Improve API +* Bug correction: Twenty eleven custom Header problem with v0.5.1 +* Bug correction: front-page.php not loaded for translated front page + += 0.5.1 (2011-12-18) = + +* Improved German translation contributed by [Christian Ries](http://www.singbyfoot.lu) +* Bug correction: translated homepage not recognized as home page when it displays posts +* Bug correction: predefined language list does not work on IE8 +* Bug correction: on some installations, "Add New" post doesn't keep intended language +* Bug correction: fatal error when Polylang is used together with the plugin Tabbed Widgets +* Bug correction: language Switcher points sometimes to wrong places + += 0.5 (2011-12-07) = + +* Add multisite support +* Rework the Polylang admin panel. There is now a set of predefined languages +* Improve categories and tags language filter in the edit post panel +* Categories and tags created in the edit post panel are now created with the same language as the post +* The language switcher can now force the link to the front page instead of the translated page +* The nav menus can now display a language switcher +* Improved performance +* Optimized the calendar widget (less code and sql queries executed) +* Added the possibility to display posts and terms with no language set (see the documentation to know how to enable this functionality) +* Started the creation of a small API for theme and plugin programmers +* Bug correction: when using a static front page, the page for posts does not work when using the default permalink settings +* Bug correction: the search form does not work if a static front page is used +* Bug correction: quick edit breaks translations +* Bug correction: categories and post tags translations don't work for more than 2 languages +* Bug correction: the output of wp_page_menu is not correct for non default languages + += 0.4.4 (2011-11-28) = + +* Bug correction: When using a static front page, the translated home page displays posts instead of the translated page +* Bug correction: Automatic language setting of existing categories and post tags does not work correctly + += 0.4.3 (2011-11-19) = + +* Add Russian translation contributed by [yoyurec](http://yoyurec.in.ua) +* Bug correction: impossible to suppress the language name in the language switcher widget settings +* Bug correction: post's page does not work when using a static front page +* Bug correction: flags in local_flags directory are removed after an automatic upgrade (now works for an upgrade from 0.4.3+ to a higher version) +* Bug correction: switching to default language displays a 404 Error when hiding the default language in url and displaying the language switcher as dropdown +* Other minor bug corrections +* Tests done with WordPress 3.3 beta 3 + += 0.4.2 (2011-11-16) = + +* Bug correction: language settings page is broken in v0.4.1 + += 0.4.1 (2011-11-16) = + +* Bug correction: flags shows even when you set doesn't to show +* Bug correction: custom taxonomies do not work +* Bug correction: some users get the fatal error: call to undefined function wp_get_current_user() in /wp-includes/user.php on line 227 + += 0.4 (2011-11-10) = + +* Add a documentation (in English only) +* Add the possibility to hide the url language information for the default language +* Add the possibility to set the admin language in the user profile +* Add the possibility to fill existing posts, pages, categories & tags with the default language +* Add support for custom post types and custom taxonomies +* Add the possibility to display flags in the language switcher +* Add CSS classes to customize rendering of the language switcher +* Add the possibility to display the language switcher as a dropdown list +* Add support for calendar widget +* Improve performance: less sql queries +* Improve data validation when creating or updating languages +* Bug correction: 'wp_list_pages' page order is ignored when the plugin is enabled +* Bug correction: when using 'edit' or 'add new' (translation) for posts, the categories appear in the wrong language +* Bug correction: pages are not included in language post count +* Bug correction: the language switcher does not display languages if there are only pages +* Bug correction: the widget filter does not allow to come back to 'all languages' once a language has been set +* Other minor bug corrections + += 0.3.2 (2011-10-20) = + +* Bug correction: authors pages are not filtered by language +* Bug correction: language pages use the archive template +* Bug correction: database error for comments on posts and pages +* Bug correction: "Add new" translation for pages creates a post instead of a page +* Bug correction: the search query does not look into pages + += 0.3.1 (2011-10-16) = + +* Bug correction: the widget settings cannot be saved when activating Polylang +* Bug correction: the archives widget does not display any links +* Bug correction: ajax form for translations not working in the 'Categories' and 'Post tags' admin panels + += 0.3 (2011-10-07) = + +* Add language filter for widgets +* Improved performance for filtering pages by language +* Improved security +* Minor bug correction with versions management + += 0.2 (2011-10-05) = + +* Add language filter for nav menus +* Add German translation +* Add language filter for recent comments +* Add ajax to term edit form +* Add ajax to post metabox +* Improved performance for filtering terms by language +* Bugs correction + += 0.1 (2011-09-22) = +* Initial release diff --git a/wp-content/plugins/polylang/css/admin.css b/wp-content/plugins/polylang/css/admin.css new file mode 100644 index 00000000..3ef699d2 --- /dev/null +++ b/wp-content/plugins/polylang/css/admin.css @@ -0,0 +1,462 @@ +/* languages admin panel */ +#add-lang select { + width: 95%; +} + +.column-locale, +.languages .column-slug { + width : 15% +} + +.column-default_lang { + width : 5%; +} + +.column-term_group, +.column-flag, .column-count { + width : 10%; +} + +.icon-default-lang:before { + font-family: 'dashicons'; + content: "\f155"; +} +.pll-icon:before{ + display: inline-block; + text-align: left; + width: 15px; +} +.pll-circle:before{ + content: "\25cf"; +} + +.form-field input[type="radio"] { + width: auto; + margin-right: 2px; +} + +/* about Polylang metabox */ +#pll-about-box p, +#pll-recommended p { + text-align: justify; +} + +#pll-about-box input { + margin: 0; + padding: 0; + float: right; +} + +/* strings translation table */ +.stringstranslations .column-name, +.stringstranslations .column-context { + width: 10%; +} + +.stringstranslations .column-string { + width: 33%; +} + +.translation label { + display: inline-block; + width: 23%; + vertical-align: top; +} + +.translation { + display: flex; /* fix #691 to remove default margin bottom */ +} +@media screen and (max-width: 782px) { /* reset default display property for small device */ + .translation{ + display: block; + } +} +.translation textarea{ + display: block; /* fix #691 to remove default margin bottom */ +} +.translation input, +.translation textarea { + width: 72%; + box-sizing: border-box; /* to be sure field don't overrun outside their wrapper */ + margin-bottom: 4px; /* fix #691 set the same margin bottom for both textarea and input tags */ +} + +/* settings */ +.pll-settings { + margin-top: 20px; +} + +.pll-settings .plugin-title { + width: 25%; +} + +#wpbody-content .pll-settings .pll-configure tr { + display: table-row; +} + +#wpbody-content .pll-settings .pll-configure td { + display: table-cell; +} + +#wpbody-content .pll-settings .pll-configure > td { + padding: 20px 20px 20px 40px; +} + +.pll-configure legend { + font-size: 14px; + font-weight: 600; + margin-bottom: 0.5em; +} + +.pll-configure td .description { + margin-top: 2px; + margin-bottom: 0.5em; +} + +.pll-configure p.submit { + margin-top: 20px; +} + +.pll-configure .button { + margin-right: 20px; +} + +.pll-configure fieldset { + margin-bottom: 1.5em; +} + +.pll-inline-block-list { + margin: 0; +} + +.pll-inline-block-list li { + display: inline-block; + margin: 0; + width: 250px; +} + +/* settings URL modifications */ +#pll-domains-table td { + padding: 2px 2px 2px 1.5em; + -webkit-box-shadow: none; + box-shadow: none; + border: none; +} + +.pll-settings-url-col { + display: inline-block; + width: 49%; + vertical-align: top; +} + +/* settings Activation keys */ +#pll-licenses-table td { + vertical-align: top; +} + +#pll-licenses-table label { + font-size: 1em; + font-weight: 600; +} + +.pll-configure .pll-deactivate-license { + margin: 0 0 0 20px; +} + +/* language columns in edit.php and edit-tags.php */ +.wp-list-table th[class*='column-language_'], +.wp-list-table td[class*='column-language_'] { + width: 1.5em; + box-sizing: content-box; /* Override ACF 5.9.0 styles */ +} + +/* Text direction in post.php and edit-tags.php */ +.pll-dir-rtl textarea, +.pll-dir-rtl input[type="text"] { + direction: rtl; +} + +.pll-dir-ltr textarea, +.pll-dir-ltr input[type="text"] { + direction: ltr; +} + +.pll-dir-ltr .tr_lang, +.pll-dir-rtl .tr_lang { + direction: inherit; +} + +/* languages metabox in post.php */ +#post-translations p { + float: left; +} + +#post-translations table { + table-layout: fixed; + width: 100%; + clear: both; +} + +#post-translations a { + text-decoration: none; +} + +#post-translations .pll-language-column, +#post-translations .pll-column-icon { + width: 20px; +} + +#post-translations .tr_lang { + width: 100%; +} + +#post-translations td { + padding: 2px; +} + +#post-translations .spinner, +#term-translations .spinner { + float: none; + margin: 0; + background-position: center; + width: auto; +} + +.pll-column-icon { + text-align: center; +} + +#select-post-language .pll-select-flag { + padding: 4px; + margin-right: 32px; +} + +/* specific cases for media */ +#select-media-language .pll-select-flag { + padding: 4px; + margin-right: 10px; +} + +.pll-media-edit-column { + float: right; +} + +/* language and translations in edit-tags.php */ +.pll-translation-flag { /* also for media */ + margin-right: 14px; +} + +#select-add-term-language .pll-select-flag { + padding: 11px; + margin-right: 13px; +} + +#select-edit-term-language .pll-select-flag { + padding: 11px; + margin-right: 4px; +} + +#term-translations p { + /* same style as label */ + font-weight: 400; + font-style: normal; + padding: 2px; + color: #23282d; +} + +#add-term-translations, +#edit-term-translations { + width: 95%; +} + +#term-translations .pll-language-column { + line-height: 28px; + width: 20%; +} + +#term-translations .pll-edit-column, +#add-term-translations .pll-language-column { + width: 20px; +} + +#edit-term-translations .pll-language-column { + padding: 15px 10px; + font-weight: normal; +} + +/* icon fonts */ +.pll_icon_add:before { + content: "\f132"; +} + +.pll_icon_edit:before { + content: "\f464"; +} + +[class^="pll_icon_"] { + font: 20px/1 'dashicons'; + vertical-align: middle; +} + +/* admin bar */ +#wpadminbar #wp-admin-bar-languages .ab-item img { + margin: 0 8px 0 2px; +} + +#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon { + float: none; + top: 4px; +} + +#wpadminbar #wp-admin-bar-languages .ab-icon:before { + content: "\f326"; + top: 1px; +} + +/* Notices */ +.pll-notice.notice { + padding-right: 38px; + position: relative; +} + +.pll-notice a.notice-dismiss { + text-decoration: none; +} + +.pll-notice .button { + margin-right: 10px; +} + +/* Metaboxes holder in Strings translations screen */ +.languages_page_mlang_strings .metabox-holder > div { + display: flex; +} +.languages_page_mlang_strings .metabox-holder > div > div { + flex-grow: 1; +} +.languages_page_mlang_strings .metabox-holder > div > div:nth-child(2n) { + margin-left: 1rem; +} +.languages_page_mlang_strings .metabox-holder > div > div.closed { + border:0; + background: none; +} +.languages_page_mlang_strings .metabox-holder > div > div.closed .postbox-header{ + border: 1px solid #ccd0d4; + background: #fff; +} + +@media screen and ( max-width: 782px ) { + /* settings */ + #wpbody-content .pll-settings .pll-configure > td { + padding: 20px; + } + + #wpbody-content .pll-settings #cb { + padding: 20px 9px; + } + + /* settings URL modifications */ + .pll-inline-block { + width: auto; + } + + .pll-settings-url-col { + display: block; + width: 100%; + } + + /* settings licenses */ + #wpbody-content .pll-settings #pll-licenses-table td { + display: block; + } + + .pll-configure .pll-deactivate-license { + margin: 10px 0 5px; + } + + /* strings translations table */ + .stringstranslations .column-context, + .stringstranslations .column-name { + display: none; /* backward compatibility WP < 4.3 */ + } + + .translation label { + display: block; + width: 95%; + padding-left: 0; + } + + .translation input, + .translation textarea { + width: 95%; + } + + /* Metaboxes holder in Strings translations screen */ + .languages_page_mlang_strings .metabox-holder > div { + flex-direction: column; + } + .languages_page_mlang_strings .metabox-holder > div > div:nth-child(2n) { + margin-left: 0; + } + + /* hide selected language flag and translations language name */ + #select-add-term-language .pll-select-flag, + #select-edit-term-language .pll-select-flag, + #edit-term-translations .pll-language-name { + display: none; + } + + #edit-term-translations { + width: 100%; + } + + #add-term-translations .pll-language-column { + line-height: 38px; + } + + #edit-term-translations td { + padding: 8px 10px; + } + + #edit-term-translations .pll-language-column, + #edit-term-translations .pll-edit-column { + width: 20px; + } + + /* translations tables should be kept as table */ + .term-translations .pll-language-column, + .term-translations .pll-edit-column, + .term-translations .pll-translation-column { + display: table-cell; + } + + .term-translations .hidden { + display: none; + } + + /* admin bar */ + #wpadminbar #wp-admin-bar-languages { + display: block; /*shows our menu on mobile devices */ + } + + #wpadminbar #wp-admin-bar-languages > .ab-item { + width: 50px; + text-align: center; + } + + #wpadminbar #wp-admin-bar-languages > .ab-item .ab-icon:before { + font: 32px/1 'dashicons'; + top: -1px; + } + + #wpadminbar #wp-admin-bar-languages > .ab-item img { + margin: 19px 0; + } + + #wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon { + margin-right: 6px; + font-size: 20px !important; + line-height: 20px !important; + } +} diff --git a/wp-content/plugins/polylang/css/admin.min.css b/wp-content/plugins/polylang/css/admin.min.css new file mode 100644 index 00000000..9966bdc0 --- /dev/null +++ b/wp-content/plugins/polylang/css/admin.min.css @@ -0,0 +1 @@ +#add-lang select{width:95%}.column-locale,.languages .column-slug{width:15%}.column-default_lang{width:5%}.column-count,.column-flag,.column-term_group{width:10%}.icon-default-lang:before{font-family:dashicons;content:"\f155"}.pll-icon:before{display:inline-block;text-align:left;width:15px}.pll-circle:before{content:"\25cf"}.form-field input[type=radio]{width:auto;margin-right:2px}#pll-about-box p,#pll-recommended p{text-align:justify}#pll-about-box input{margin:0;padding:0;float:right}.stringstranslations .column-context,.stringstranslations .column-name{width:10%}.stringstranslations .column-string{width:33%}.translation label{display:inline-block;width:23%;vertical-align:top}.translation{display:flex}@media screen and (max-width:782px){.translation{display:block}}.translation textarea{display:block}.translation input,.translation textarea{width:72%;box-sizing:border-box;margin-bottom:4px}.pll-settings{margin-top:20px}.pll-settings .plugin-title{width:25%}#wpbody-content .pll-settings .pll-configure tr{display:table-row}#wpbody-content .pll-settings .pll-configure td{display:table-cell}#wpbody-content .pll-settings .pll-configure>td{padding:20px 20px 20px 40px}.pll-configure legend{font-size:14px;font-weight:600;margin-bottom:.5em}.pll-configure td .description{margin-top:2px;margin-bottom:.5em}.pll-configure p.submit{margin-top:20px}.pll-configure .button{margin-right:20px}.pll-configure fieldset{margin-bottom:1.5em}.pll-inline-block-list{margin:0}.pll-inline-block-list li{display:inline-block;margin:0;width:250px}#pll-domains-table td{padding:2px 2px 2px 1.5em;-webkit-box-shadow:none;box-shadow:none;border:none}.pll-settings-url-col{display:inline-block;width:49%;vertical-align:top}#pll-licenses-table td{vertical-align:top}#pll-licenses-table label{font-size:1em;font-weight:600}.pll-configure .pll-deactivate-license{margin:0 0 0 20px}.wp-list-table td[class*=column-language_],.wp-list-table th[class*=column-language_]{width:1.5em;box-sizing:content-box}.pll-dir-rtl input[type=text],.pll-dir-rtl textarea{direction:rtl}.pll-dir-ltr input[type=text],.pll-dir-ltr textarea{direction:ltr}.pll-dir-ltr .tr_lang,.pll-dir-rtl .tr_lang{direction:inherit}#post-translations p{float:left}#post-translations table{table-layout:fixed;width:100%;clear:both}#post-translations a{text-decoration:none}#post-translations .pll-column-icon,#post-translations .pll-language-column{width:20px}#post-translations .tr_lang{width:100%}#post-translations td{padding:2px}#post-translations .spinner,#term-translations .spinner{float:none;margin:0;background-position:center;width:auto}.pll-column-icon{text-align:center}#select-post-language .pll-select-flag{padding:4px;margin-right:32px}#select-media-language .pll-select-flag{padding:4px;margin-right:10px}.pll-media-edit-column{float:right}.pll-translation-flag{margin-right:14px}#select-add-term-language .pll-select-flag{padding:11px;margin-right:13px}#select-edit-term-language .pll-select-flag{padding:11px;margin-right:4px}#term-translations p{font-weight:400;font-style:normal;padding:2px;color:#23282d}#add-term-translations,#edit-term-translations{width:95%}#term-translations .pll-language-column{line-height:28px;width:20%}#add-term-translations .pll-language-column,#term-translations .pll-edit-column{width:20px}#edit-term-translations .pll-language-column{padding:15px 10px;font-weight:400}.pll_icon_add:before{content:"\f132"}.pll_icon_edit:before{content:"\f464"}[class^=pll_icon_]{font:20px/1 dashicons;vertical-align:middle}#wpadminbar #wp-admin-bar-languages .ab-item img{margin:0 8px 0 2px}#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon{float:none;top:4px}#wpadminbar #wp-admin-bar-languages .ab-icon:before{content:"\f326";top:1px}.pll-notice.notice{padding-right:38px;position:relative}.pll-notice a.notice-dismiss{text-decoration:none}.pll-notice .button{margin-right:10px}.languages_page_mlang_strings .metabox-holder>div{display:flex}.languages_page_mlang_strings .metabox-holder>div>div{flex-grow:1}.languages_page_mlang_strings .metabox-holder>div>div:nth-child(2n){margin-left:1rem}.languages_page_mlang_strings .metabox-holder>div>div.closed{border:0;background:0 0}.languages_page_mlang_strings .metabox-holder>div>div.closed .postbox-header{border:1px solid #ccd0d4;background:#fff}@media screen and (max-width:782px){#wpbody-content .pll-settings .pll-configure>td{padding:20px}#wpbody-content .pll-settings #cb{padding:20px 9px}.pll-inline-block{width:auto}.pll-settings-url-col{display:block;width:100%}#wpbody-content .pll-settings #pll-licenses-table td{display:block}.pll-configure .pll-deactivate-license{margin:10px 0 5px}.stringstranslations .column-context,.stringstranslations .column-name{display:none}.translation label{display:block;width:95%;padding-left:0}.translation input,.translation textarea{width:95%}.languages_page_mlang_strings .metabox-holder>div{flex-direction:column}.languages_page_mlang_strings .metabox-holder>div>div:nth-child(2n){margin-left:0}#edit-term-translations .pll-language-name,#select-add-term-language .pll-select-flag,#select-edit-term-language .pll-select-flag{display:none}#edit-term-translations{width:100%}#add-term-translations .pll-language-column{line-height:38px}#edit-term-translations td{padding:8px 10px}#edit-term-translations .pll-edit-column,#edit-term-translations .pll-language-column{width:20px}.term-translations .pll-edit-column,.term-translations .pll-language-column,.term-translations .pll-translation-column{display:table-cell}.term-translations .hidden{display:none}#wpadminbar #wp-admin-bar-languages{display:block}#wpadminbar #wp-admin-bar-languages>.ab-item{width:50px;text-align:center}#wpadminbar #wp-admin-bar-languages>.ab-item .ab-icon:before{font:32px/1 dashicons;top:-1px}#wpadminbar #wp-admin-bar-languages>.ab-item img{margin:19px 0}#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon{margin-right:6px;font-size:20px!important;line-height:20px!important}} diff --git a/wp-content/plugins/polylang/css/selectmenu.css b/wp-content/plugins/polylang/css/selectmenu.css new file mode 100644 index 00000000..06962503 --- /dev/null +++ b/wp-content/plugins/polylang/css/selectmenu.css @@ -0,0 +1,211 @@ +/* Greatly modified version of the jquery-ui.css */ + +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: none; +} + +.ui-menu .ui-menu { + position: absolute; +} + +.ui-menu .ui-menu-item { + position: relative; + margin: 0; + padding: 3px 1em 3px .4em; + cursor: pointer; + min-height: 0; /* support: IE7 */ + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} + +/* for jQuery UI 1.12 which introduces a wrapper */ +.ui-menu .ui-menu-item:not([role]) { + padding: 0; +} + +.ui-menu-item-wrapper { + padding: 3px 1em 3px 2em; +} +.rtl .ui-menu .ui-menu-item { + text-align: right; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} + +.ui-menu-icons .ui-menu-item[role] { + padding-left: 2em; +} + +.rtl .ui-menu-item-wrapper, /* for jQuery UI 1.12 which introduces a wrapper */ +.rtl .ui-menu-icons .ui-menu-item[role] { + padding-left: 1em; + padding-right: 2em; +} + +/* left-aligned */ +.ui-selectmenu-text .ui-icon, +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .3em; + margin: auto 0; +} + +.rtl .ui-selectmenu-text .ui-icon, +.rtl .ui-menu .ui-icon { + right: .3em; + left: auto; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} + +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} + +.ui-selectmenu-menu .ui-menu { + overflow: auto; + /* Support: IE7 */ + overflow-x: hidden; + padding-bottom: 1px; +} + +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 23px; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} + +.ui-selectmenu-open { + display: block; +} + +.ui-selectmenu-button { + display: inline-block; + overflow: hidden; + position: relative; + text-decoration: none; + box-sizing: border-box; /* To keep width calculation in percent since WP 5.6 */ +} + +.ui-selectmenu-button span.ui-icon { + right: 0.5em; + left: auto; + position: absolute; + top: 26%; + width: 16px; + height: 16px; + text-indent: 0; /* due to text-indent for jquery ui-dialog in wizard */ +} + +.rtl .ui-selectmenu-button span.ui-icon { + left: 0.5em; + right: auto; +} + + +.ui-selectmenu-button span.ui-selectmenu-text { + text-align: left; + padding: 0.2em 2.1em 0.2em 2em; + display: block; + line-height: 23px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rtl .ui-selectmenu-button span.ui-selectmenu-text { + text-align: right; + padding: 0.2em 2em 0.2em 2.1em; +} + +.ui-widget-content, +.ui-state-default, +.ui-selectmenu-button-closed, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */ +.ui-selectmenu-button-open, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */ +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + background: #fff; + border: 1px solid #ddd; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07) inset; + color: #32373c; +} +/* Override to have same styles as WP form styles since WordPress 5.4 */ +.toplevel_page_mlang .ui-selectmenu-button.ui-state-default, +.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-closed, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */ +.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-open{ /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */ + box-shadow: 0 0 0 transparent; + border-radius: 4px; + border: 1px solid #7e8993; +} + +.toplevel_page_mlang .ui-selectmenu-button:focus{ + color: #016087; /* Same color as WordPress focused select HTML tag */ + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.toplevel_page_mlang .ui-menu-item { + color: #016087; /* Same color as option in a WordPress focused select HTML tag */ +} + +.ui-widget-content .ui-state-hover, +.ui-widget-content .ui-state-focus, +.ui-widget-content .ui-state-active { /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */ + background: #d5d5d5; +} + +.ui-selectmenu-button.ui-state-focus { + border: 1px solid #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); +} + +.ui-icon-triangle-1-s:before { + content: ""; + background: #fff url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E) no-repeat right 0px top 55%; + background-size: 16px 16px; + box-sizing: border-box; + position: absolute; + width: 16px; + height: 16px; +} + +.pll-wizard .ui-button:hover, +.pll-wizard .ui-button:focus { + background: #fff; /* To override jQuery ui-dialog styles provided by WordPress */ +} + +.ui-widget-content { + max-height: 231px; + box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); +} diff --git a/wp-content/plugins/polylang/css/selectmenu.min.css b/wp-content/plugins/polylang/css/selectmenu.min.css new file mode 100644 index 00000000..d28c400b --- /dev/null +++ b/wp-content/plugins/polylang/css/selectmenu.min.css @@ -0,0 +1 @@ +.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-item:not([role]){padding:0}.ui-menu-item-wrapper{padding:3px 1em 3px 2em}.rtl .ui-menu .ui-menu-item{text-align:right}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item[role]{padding-left:2em}.rtl .ui-menu-icons .ui-menu-item[role],.rtl .ui-menu-item-wrapper{padding-left:1em;padding-right:2em}.ui-menu .ui-icon,.ui-selectmenu-text .ui-icon{position:absolute;top:0;bottom:0;left:.3em;margin:auto 0}.rtl .ui-menu .ui-icon,.rtl .ui-selectmenu-text .ui-icon{right:.3em;left:auto}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:23px;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;box-sizing:border-box}.ui-selectmenu-button span.ui-icon{right:.5em;left:auto;position:absolute;top:26%;width:16px;height:16px;text-indent:0}.rtl .ui-selectmenu-button span.ui-icon{left:.5em;right:auto}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:.2em 2.1em .2em 2em;display:block;line-height:23px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rtl .ui-selectmenu-button span.ui-selectmenu-text{text-align:right;padding:.2em 2em .2em 2.1em}.ui-selectmenu-button-closed,.ui-selectmenu-button-open,.ui-state-default,.ui-widget-content,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#fff;border:1px solid #ddd;box-shadow:0 1px 2px rgba(0,0,0,.07) inset;color:#32373c}.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-closed,.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-open,.toplevel_page_mlang .ui-selectmenu-button.ui-state-default{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #7e8993}.toplevel_page_mlang .ui-selectmenu-button:focus{color:#016087;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.toplevel_page_mlang .ui-menu-item{color:#016087}.ui-widget-content .ui-state-active,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover{background:#d5d5d5}.ui-selectmenu-button.ui-state-focus{border:1px solid #5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.ui-icon-triangle-1-s:before{content:"";background:#fff url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E) no-repeat right 0 top 55%;background-size:16px 16px;box-sizing:border-box;position:absolute;width:16px;height:16px}.pll-wizard .ui-button:focus,.pll-wizard .ui-button:hover{background:#fff}.ui-widget-content{max-height:231px;box-shadow:0 2px 6px rgba(100,100,100,.3)} \ No newline at end of file diff --git a/wp-content/plugins/polylang/flags/ad.png b/wp-content/plugins/polylang/flags/ad.png new file mode 100644 index 00000000..625ca84f Binary files /dev/null and b/wp-content/plugins/polylang/flags/ad.png differ diff --git a/wp-content/plugins/polylang/flags/ae.png b/wp-content/plugins/polylang/flags/ae.png new file mode 100644 index 00000000..ef3a1ecf Binary files /dev/null and b/wp-content/plugins/polylang/flags/ae.png differ diff --git a/wp-content/plugins/polylang/flags/af.png b/wp-content/plugins/polylang/flags/af.png new file mode 100644 index 00000000..a4742e29 Binary files /dev/null and b/wp-content/plugins/polylang/flags/af.png differ diff --git a/wp-content/plugins/polylang/flags/ag.png b/wp-content/plugins/polylang/flags/ag.png new file mode 100644 index 00000000..556d5504 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ag.png differ diff --git a/wp-content/plugins/polylang/flags/ai.png b/wp-content/plugins/polylang/flags/ai.png new file mode 100644 index 00000000..74ed29d9 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ai.png differ diff --git a/wp-content/plugins/polylang/flags/al.png b/wp-content/plugins/polylang/flags/al.png new file mode 100644 index 00000000..92354cb6 Binary files /dev/null and b/wp-content/plugins/polylang/flags/al.png differ diff --git a/wp-content/plugins/polylang/flags/am.png b/wp-content/plugins/polylang/flags/am.png new file mode 100644 index 00000000..344a2a86 Binary files /dev/null and b/wp-content/plugins/polylang/flags/am.png differ diff --git a/wp-content/plugins/polylang/flags/an.png b/wp-content/plugins/polylang/flags/an.png new file mode 100644 index 00000000..633e4b89 Binary files /dev/null and b/wp-content/plugins/polylang/flags/an.png differ diff --git a/wp-content/plugins/polylang/flags/ao.png b/wp-content/plugins/polylang/flags/ao.png new file mode 100644 index 00000000..bcbd1d6d Binary files /dev/null and b/wp-content/plugins/polylang/flags/ao.png differ diff --git a/wp-content/plugins/polylang/flags/ar.png b/wp-content/plugins/polylang/flags/ar.png new file mode 100644 index 00000000..e5ef8f1f Binary files /dev/null and b/wp-content/plugins/polylang/flags/ar.png differ diff --git a/wp-content/plugins/polylang/flags/arab.png b/wp-content/plugins/polylang/flags/arab.png new file mode 100644 index 00000000..365172ac Binary files /dev/null and b/wp-content/plugins/polylang/flags/arab.png differ diff --git a/wp-content/plugins/polylang/flags/as.png b/wp-content/plugins/polylang/flags/as.png new file mode 100644 index 00000000..32f30e4c Binary files /dev/null and b/wp-content/plugins/polylang/flags/as.png differ diff --git a/wp-content/plugins/polylang/flags/at.png b/wp-content/plugins/polylang/flags/at.png new file mode 100644 index 00000000..0f15f34f Binary files /dev/null and b/wp-content/plugins/polylang/flags/at.png differ diff --git a/wp-content/plugins/polylang/flags/au.png b/wp-content/plugins/polylang/flags/au.png new file mode 100644 index 00000000..a01389a7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/au.png differ diff --git a/wp-content/plugins/polylang/flags/aw.png b/wp-content/plugins/polylang/flags/aw.png new file mode 100644 index 00000000..a3579c2d Binary files /dev/null and b/wp-content/plugins/polylang/flags/aw.png differ diff --git a/wp-content/plugins/polylang/flags/ax.png b/wp-content/plugins/polylang/flags/ax.png new file mode 100644 index 00000000..1eea80a7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ax.png differ diff --git a/wp-content/plugins/polylang/flags/az.png b/wp-content/plugins/polylang/flags/az.png new file mode 100644 index 00000000..4ee9fe5c Binary files /dev/null and b/wp-content/plugins/polylang/flags/az.png differ diff --git a/wp-content/plugins/polylang/flags/ba.png b/wp-content/plugins/polylang/flags/ba.png new file mode 100644 index 00000000..c7749924 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ba.png differ diff --git a/wp-content/plugins/polylang/flags/basque.png b/wp-content/plugins/polylang/flags/basque.png new file mode 100644 index 00000000..cb2f25e1 Binary files /dev/null and b/wp-content/plugins/polylang/flags/basque.png differ diff --git a/wp-content/plugins/polylang/flags/bb.png b/wp-content/plugins/polylang/flags/bb.png new file mode 100644 index 00000000..0df19c71 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bb.png differ diff --git a/wp-content/plugins/polylang/flags/bd.png b/wp-content/plugins/polylang/flags/bd.png new file mode 100644 index 00000000..076a8bf8 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bd.png differ diff --git a/wp-content/plugins/polylang/flags/be.png b/wp-content/plugins/polylang/flags/be.png new file mode 100644 index 00000000..d86ebc80 Binary files /dev/null and b/wp-content/plugins/polylang/flags/be.png differ diff --git a/wp-content/plugins/polylang/flags/bf.png b/wp-content/plugins/polylang/flags/bf.png new file mode 100644 index 00000000..ab5ce8fe Binary files /dev/null and b/wp-content/plugins/polylang/flags/bf.png differ diff --git a/wp-content/plugins/polylang/flags/bg.png b/wp-content/plugins/polylang/flags/bg.png new file mode 100644 index 00000000..0469f060 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bg.png differ diff --git a/wp-content/plugins/polylang/flags/bh.png b/wp-content/plugins/polylang/flags/bh.png new file mode 100644 index 00000000..ea8ce687 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bh.png differ diff --git a/wp-content/plugins/polylang/flags/bi.png b/wp-content/plugins/polylang/flags/bi.png new file mode 100644 index 00000000..5cc2e30c Binary files /dev/null and b/wp-content/plugins/polylang/flags/bi.png differ diff --git a/wp-content/plugins/polylang/flags/bj.png b/wp-content/plugins/polylang/flags/bj.png new file mode 100644 index 00000000..1cc8b458 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bj.png differ diff --git a/wp-content/plugins/polylang/flags/bm.png b/wp-content/plugins/polylang/flags/bm.png new file mode 100644 index 00000000..c0c7aead Binary files /dev/null and b/wp-content/plugins/polylang/flags/bm.png differ diff --git a/wp-content/plugins/polylang/flags/bn.png b/wp-content/plugins/polylang/flags/bn.png new file mode 100644 index 00000000..8fb09849 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bn.png differ diff --git a/wp-content/plugins/polylang/flags/bo.png b/wp-content/plugins/polylang/flags/bo.png new file mode 100644 index 00000000..ce7ba522 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bo.png differ diff --git a/wp-content/plugins/polylang/flags/br.png b/wp-content/plugins/polylang/flags/br.png new file mode 100644 index 00000000..9b1a5538 Binary files /dev/null and b/wp-content/plugins/polylang/flags/br.png differ diff --git a/wp-content/plugins/polylang/flags/bs.png b/wp-content/plugins/polylang/flags/bs.png new file mode 100644 index 00000000..639fa6cf Binary files /dev/null and b/wp-content/plugins/polylang/flags/bs.png differ diff --git a/wp-content/plugins/polylang/flags/bt.png b/wp-content/plugins/polylang/flags/bt.png new file mode 100644 index 00000000..1d512dff Binary files /dev/null and b/wp-content/plugins/polylang/flags/bt.png differ diff --git a/wp-content/plugins/polylang/flags/bw.png b/wp-content/plugins/polylang/flags/bw.png new file mode 100644 index 00000000..fcb10394 Binary files /dev/null and b/wp-content/plugins/polylang/flags/bw.png differ diff --git a/wp-content/plugins/polylang/flags/by.png b/wp-content/plugins/polylang/flags/by.png new file mode 100644 index 00000000..504774ec Binary files /dev/null and b/wp-content/plugins/polylang/flags/by.png differ diff --git a/wp-content/plugins/polylang/flags/bz.png b/wp-content/plugins/polylang/flags/bz.png new file mode 100644 index 00000000..be63ee1c Binary files /dev/null and b/wp-content/plugins/polylang/flags/bz.png differ diff --git a/wp-content/plugins/polylang/flags/ca.png b/wp-content/plugins/polylang/flags/ca.png new file mode 100644 index 00000000..1f204193 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ca.png differ diff --git a/wp-content/plugins/polylang/flags/catalonia.png b/wp-content/plugins/polylang/flags/catalonia.png new file mode 100644 index 00000000..5041e308 Binary files /dev/null and b/wp-content/plugins/polylang/flags/catalonia.png differ diff --git a/wp-content/plugins/polylang/flags/cc.png b/wp-content/plugins/polylang/flags/cc.png new file mode 100644 index 00000000..aed3d3b4 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cc.png differ diff --git a/wp-content/plugins/polylang/flags/cd.png b/wp-content/plugins/polylang/flags/cd.png new file mode 100644 index 00000000..5e489424 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cd.png differ diff --git a/wp-content/plugins/polylang/flags/cf.png b/wp-content/plugins/polylang/flags/cf.png new file mode 100644 index 00000000..da687bdc Binary files /dev/null and b/wp-content/plugins/polylang/flags/cf.png differ diff --git a/wp-content/plugins/polylang/flags/cg.png b/wp-content/plugins/polylang/flags/cg.png new file mode 100644 index 00000000..a859792e Binary files /dev/null and b/wp-content/plugins/polylang/flags/cg.png differ diff --git a/wp-content/plugins/polylang/flags/ch.png b/wp-content/plugins/polylang/flags/ch.png new file mode 100644 index 00000000..242ec01a Binary files /dev/null and b/wp-content/plugins/polylang/flags/ch.png differ diff --git a/wp-content/plugins/polylang/flags/ci.png b/wp-content/plugins/polylang/flags/ci.png new file mode 100644 index 00000000..3f2c62eb Binary files /dev/null and b/wp-content/plugins/polylang/flags/ci.png differ diff --git a/wp-content/plugins/polylang/flags/ck.png b/wp-content/plugins/polylang/flags/ck.png new file mode 100644 index 00000000..746d3d6f Binary files /dev/null and b/wp-content/plugins/polylang/flags/ck.png differ diff --git a/wp-content/plugins/polylang/flags/cl.png b/wp-content/plugins/polylang/flags/cl.png new file mode 100644 index 00000000..29c6d61b Binary files /dev/null and b/wp-content/plugins/polylang/flags/cl.png differ diff --git a/wp-content/plugins/polylang/flags/cm.png b/wp-content/plugins/polylang/flags/cm.png new file mode 100644 index 00000000..f65c5bd5 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cm.png differ diff --git a/wp-content/plugins/polylang/flags/cn.png b/wp-content/plugins/polylang/flags/cn.png new file mode 100644 index 00000000..89144146 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cn.png differ diff --git a/wp-content/plugins/polylang/flags/co.png b/wp-content/plugins/polylang/flags/co.png new file mode 100644 index 00000000..a118ff4a Binary files /dev/null and b/wp-content/plugins/polylang/flags/co.png differ diff --git a/wp-content/plugins/polylang/flags/cr.png b/wp-content/plugins/polylang/flags/cr.png new file mode 100644 index 00000000..c7a37317 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cr.png differ diff --git a/wp-content/plugins/polylang/flags/cu.png b/wp-content/plugins/polylang/flags/cu.png new file mode 100644 index 00000000..083f1d61 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cu.png differ diff --git a/wp-content/plugins/polylang/flags/cv.png b/wp-content/plugins/polylang/flags/cv.png new file mode 100644 index 00000000..a63f7eaf Binary files /dev/null and b/wp-content/plugins/polylang/flags/cv.png differ diff --git a/wp-content/plugins/polylang/flags/cx.png b/wp-content/plugins/polylang/flags/cx.png new file mode 100644 index 00000000..48e31adb Binary files /dev/null and b/wp-content/plugins/polylang/flags/cx.png differ diff --git a/wp-content/plugins/polylang/flags/cy.png b/wp-content/plugins/polylang/flags/cy.png new file mode 100644 index 00000000..5b1ad6c0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cy.png differ diff --git a/wp-content/plugins/polylang/flags/cz.png b/wp-content/plugins/polylang/flags/cz.png new file mode 100644 index 00000000..c8403dd2 Binary files /dev/null and b/wp-content/plugins/polylang/flags/cz.png differ diff --git a/wp-content/plugins/polylang/flags/de.png b/wp-content/plugins/polylang/flags/de.png new file mode 100644 index 00000000..ac4a9773 Binary files /dev/null and b/wp-content/plugins/polylang/flags/de.png differ diff --git a/wp-content/plugins/polylang/flags/dj.png b/wp-content/plugins/polylang/flags/dj.png new file mode 100644 index 00000000..582af364 Binary files /dev/null and b/wp-content/plugins/polylang/flags/dj.png differ diff --git a/wp-content/plugins/polylang/flags/dk.png b/wp-content/plugins/polylang/flags/dk.png new file mode 100644 index 00000000..e2993d3c Binary files /dev/null and b/wp-content/plugins/polylang/flags/dk.png differ diff --git a/wp-content/plugins/polylang/flags/dm.png b/wp-content/plugins/polylang/flags/dm.png new file mode 100644 index 00000000..5fbffcba Binary files /dev/null and b/wp-content/plugins/polylang/flags/dm.png differ diff --git a/wp-content/plugins/polylang/flags/do.png b/wp-content/plugins/polylang/flags/do.png new file mode 100644 index 00000000..5a04932d Binary files /dev/null and b/wp-content/plugins/polylang/flags/do.png differ diff --git a/wp-content/plugins/polylang/flags/dz.png b/wp-content/plugins/polylang/flags/dz.png new file mode 100644 index 00000000..335c2391 Binary files /dev/null and b/wp-content/plugins/polylang/flags/dz.png differ diff --git a/wp-content/plugins/polylang/flags/ec.png b/wp-content/plugins/polylang/flags/ec.png new file mode 100644 index 00000000..0caa0b1e Binary files /dev/null and b/wp-content/plugins/polylang/flags/ec.png differ diff --git a/wp-content/plugins/polylang/flags/ee.png b/wp-content/plugins/polylang/flags/ee.png new file mode 100644 index 00000000..0c82efb7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ee.png differ diff --git a/wp-content/plugins/polylang/flags/eg.png b/wp-content/plugins/polylang/flags/eg.png new file mode 100644 index 00000000..8a3f7a10 Binary files /dev/null and b/wp-content/plugins/polylang/flags/eg.png differ diff --git a/wp-content/plugins/polylang/flags/eh.png b/wp-content/plugins/polylang/flags/eh.png new file mode 100644 index 00000000..90a1195b Binary files /dev/null and b/wp-content/plugins/polylang/flags/eh.png differ diff --git a/wp-content/plugins/polylang/flags/england.png b/wp-content/plugins/polylang/flags/england.png new file mode 100644 index 00000000..3a7311d5 Binary files /dev/null and b/wp-content/plugins/polylang/flags/england.png differ diff --git a/wp-content/plugins/polylang/flags/er.png b/wp-content/plugins/polylang/flags/er.png new file mode 100644 index 00000000..13065ae9 Binary files /dev/null and b/wp-content/plugins/polylang/flags/er.png differ diff --git a/wp-content/plugins/polylang/flags/es.png b/wp-content/plugins/polylang/flags/es.png new file mode 100644 index 00000000..c2de2d71 Binary files /dev/null and b/wp-content/plugins/polylang/flags/es.png differ diff --git a/wp-content/plugins/polylang/flags/esperanto.png b/wp-content/plugins/polylang/flags/esperanto.png new file mode 100644 index 00000000..03a333e2 Binary files /dev/null and b/wp-content/plugins/polylang/flags/esperanto.png differ diff --git a/wp-content/plugins/polylang/flags/et.png b/wp-content/plugins/polylang/flags/et.png new file mode 100644 index 00000000..2e893fa0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/et.png differ diff --git a/wp-content/plugins/polylang/flags/fi.png b/wp-content/plugins/polylang/flags/fi.png new file mode 100644 index 00000000..14ec091b Binary files /dev/null and b/wp-content/plugins/polylang/flags/fi.png differ diff --git a/wp-content/plugins/polylang/flags/fj.png b/wp-content/plugins/polylang/flags/fj.png new file mode 100644 index 00000000..cee99889 Binary files /dev/null and b/wp-content/plugins/polylang/flags/fj.png differ diff --git a/wp-content/plugins/polylang/flags/fk.png b/wp-content/plugins/polylang/flags/fk.png new file mode 100644 index 00000000..ceaeb27d Binary files /dev/null and b/wp-content/plugins/polylang/flags/fk.png differ diff --git a/wp-content/plugins/polylang/flags/fm.png b/wp-content/plugins/polylang/flags/fm.png new file mode 100644 index 00000000..066bb247 Binary files /dev/null and b/wp-content/plugins/polylang/flags/fm.png differ diff --git a/wp-content/plugins/polylang/flags/fo.png b/wp-content/plugins/polylang/flags/fo.png new file mode 100644 index 00000000..cbceb809 Binary files /dev/null and b/wp-content/plugins/polylang/flags/fo.png differ diff --git a/wp-content/plugins/polylang/flags/fr.png b/wp-content/plugins/polylang/flags/fr.png new file mode 100644 index 00000000..8332c4ec Binary files /dev/null and b/wp-content/plugins/polylang/flags/fr.png differ diff --git a/wp-content/plugins/polylang/flags/ga.png b/wp-content/plugins/polylang/flags/ga.png new file mode 100644 index 00000000..0e0d4343 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ga.png differ diff --git a/wp-content/plugins/polylang/flags/galicia.png b/wp-content/plugins/polylang/flags/galicia.png new file mode 100644 index 00000000..64b0cbb4 Binary files /dev/null and b/wp-content/plugins/polylang/flags/galicia.png differ diff --git a/wp-content/plugins/polylang/flags/gb.png b/wp-content/plugins/polylang/flags/gb.png new file mode 100644 index 00000000..ff701e19 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gb.png differ diff --git a/wp-content/plugins/polylang/flags/gd.png b/wp-content/plugins/polylang/flags/gd.png new file mode 100644 index 00000000..9ab57f54 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gd.png differ diff --git a/wp-content/plugins/polylang/flags/ge.png b/wp-content/plugins/polylang/flags/ge.png new file mode 100644 index 00000000..728d9707 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ge.png differ diff --git a/wp-content/plugins/polylang/flags/gh.png b/wp-content/plugins/polylang/flags/gh.png new file mode 100644 index 00000000..4e2f8965 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gh.png differ diff --git a/wp-content/plugins/polylang/flags/gi.png b/wp-content/plugins/polylang/flags/gi.png new file mode 100644 index 00000000..e76797f6 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gi.png differ diff --git a/wp-content/plugins/polylang/flags/gl.png b/wp-content/plugins/polylang/flags/gl.png new file mode 100644 index 00000000..ef12a73b Binary files /dev/null and b/wp-content/plugins/polylang/flags/gl.png differ diff --git a/wp-content/plugins/polylang/flags/gm.png b/wp-content/plugins/polylang/flags/gm.png new file mode 100644 index 00000000..0720b667 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gm.png differ diff --git a/wp-content/plugins/polylang/flags/gn.png b/wp-content/plugins/polylang/flags/gn.png new file mode 100644 index 00000000..ea660b01 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gn.png differ diff --git a/wp-content/plugins/polylang/flags/gp.png b/wp-content/plugins/polylang/flags/gp.png new file mode 100644 index 00000000..dbb086d0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gp.png differ diff --git a/wp-content/plugins/polylang/flags/gq.png b/wp-content/plugins/polylang/flags/gq.png new file mode 100644 index 00000000..ebe20a28 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gq.png differ diff --git a/wp-content/plugins/polylang/flags/gr.png b/wp-content/plugins/polylang/flags/gr.png new file mode 100644 index 00000000..8651ade7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gr.png differ diff --git a/wp-content/plugins/polylang/flags/gs.png b/wp-content/plugins/polylang/flags/gs.png new file mode 100644 index 00000000..7ef0bf59 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gs.png differ diff --git a/wp-content/plugins/polylang/flags/gt.png b/wp-content/plugins/polylang/flags/gt.png new file mode 100644 index 00000000..c43a70d3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gt.png differ diff --git a/wp-content/plugins/polylang/flags/gu.png b/wp-content/plugins/polylang/flags/gu.png new file mode 100644 index 00000000..92f37c05 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gu.png differ diff --git a/wp-content/plugins/polylang/flags/gw.png b/wp-content/plugins/polylang/flags/gw.png new file mode 100644 index 00000000..b37bcf06 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gw.png differ diff --git a/wp-content/plugins/polylang/flags/gy.png b/wp-content/plugins/polylang/flags/gy.png new file mode 100644 index 00000000..22cbe2f5 Binary files /dev/null and b/wp-content/plugins/polylang/flags/gy.png differ diff --git a/wp-content/plugins/polylang/flags/hk.png b/wp-content/plugins/polylang/flags/hk.png new file mode 100644 index 00000000..d5c380ca Binary files /dev/null and b/wp-content/plugins/polylang/flags/hk.png differ diff --git a/wp-content/plugins/polylang/flags/hm.png b/wp-content/plugins/polylang/flags/hm.png new file mode 100644 index 00000000..a01389a7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/hm.png differ diff --git a/wp-content/plugins/polylang/flags/hn.png b/wp-content/plugins/polylang/flags/hn.png new file mode 100644 index 00000000..96f83885 Binary files /dev/null and b/wp-content/plugins/polylang/flags/hn.png differ diff --git a/wp-content/plugins/polylang/flags/hr.png b/wp-content/plugins/polylang/flags/hr.png new file mode 100644 index 00000000..696b5154 Binary files /dev/null and b/wp-content/plugins/polylang/flags/hr.png differ diff --git a/wp-content/plugins/polylang/flags/ht.png b/wp-content/plugins/polylang/flags/ht.png new file mode 100644 index 00000000..416052af Binary files /dev/null and b/wp-content/plugins/polylang/flags/ht.png differ diff --git a/wp-content/plugins/polylang/flags/hu.png b/wp-content/plugins/polylang/flags/hu.png new file mode 100644 index 00000000..7baafe44 Binary files /dev/null and b/wp-content/plugins/polylang/flags/hu.png differ diff --git a/wp-content/plugins/polylang/flags/id.png b/wp-content/plugins/polylang/flags/id.png new file mode 100644 index 00000000..c6bc0faf Binary files /dev/null and b/wp-content/plugins/polylang/flags/id.png differ diff --git a/wp-content/plugins/polylang/flags/ie.png b/wp-content/plugins/polylang/flags/ie.png new file mode 100644 index 00000000..26baa31e Binary files /dev/null and b/wp-content/plugins/polylang/flags/ie.png differ diff --git a/wp-content/plugins/polylang/flags/il.png b/wp-content/plugins/polylang/flags/il.png new file mode 100644 index 00000000..2ca772d0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/il.png differ diff --git a/wp-content/plugins/polylang/flags/in.png b/wp-content/plugins/polylang/flags/in.png new file mode 100644 index 00000000..e4d7e81a Binary files /dev/null and b/wp-content/plugins/polylang/flags/in.png differ diff --git a/wp-content/plugins/polylang/flags/io.png b/wp-content/plugins/polylang/flags/io.png new file mode 100644 index 00000000..3e74b6a3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/io.png differ diff --git a/wp-content/plugins/polylang/flags/iq.png b/wp-content/plugins/polylang/flags/iq.png new file mode 100644 index 00000000..878a3514 Binary files /dev/null and b/wp-content/plugins/polylang/flags/iq.png differ diff --git a/wp-content/plugins/polylang/flags/ir.png b/wp-content/plugins/polylang/flags/ir.png new file mode 100644 index 00000000..c5fd136a Binary files /dev/null and b/wp-content/plugins/polylang/flags/ir.png differ diff --git a/wp-content/plugins/polylang/flags/is.png b/wp-content/plugins/polylang/flags/is.png new file mode 100644 index 00000000..b8f6d0f0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/is.png differ diff --git a/wp-content/plugins/polylang/flags/it.png b/wp-content/plugins/polylang/flags/it.png new file mode 100644 index 00000000..89692f74 Binary files /dev/null and b/wp-content/plugins/polylang/flags/it.png differ diff --git a/wp-content/plugins/polylang/flags/jm.png b/wp-content/plugins/polylang/flags/jm.png new file mode 100644 index 00000000..7be119e0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/jm.png differ diff --git a/wp-content/plugins/polylang/flags/jo.png b/wp-content/plugins/polylang/flags/jo.png new file mode 100644 index 00000000..11bd4972 Binary files /dev/null and b/wp-content/plugins/polylang/flags/jo.png differ diff --git a/wp-content/plugins/polylang/flags/jp.png b/wp-content/plugins/polylang/flags/jp.png new file mode 100644 index 00000000..325fbad3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/jp.png differ diff --git a/wp-content/plugins/polylang/flags/ke.png b/wp-content/plugins/polylang/flags/ke.png new file mode 100644 index 00000000..51879adf Binary files /dev/null and b/wp-content/plugins/polylang/flags/ke.png differ diff --git a/wp-content/plugins/polylang/flags/kg.png b/wp-content/plugins/polylang/flags/kg.png new file mode 100644 index 00000000..0a818f67 Binary files /dev/null and b/wp-content/plugins/polylang/flags/kg.png differ diff --git a/wp-content/plugins/polylang/flags/kh.png b/wp-content/plugins/polylang/flags/kh.png new file mode 100644 index 00000000..30f6bb1b Binary files /dev/null and b/wp-content/plugins/polylang/flags/kh.png differ diff --git a/wp-content/plugins/polylang/flags/ki.png b/wp-content/plugins/polylang/flags/ki.png new file mode 100644 index 00000000..2dcce4b3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ki.png differ diff --git a/wp-content/plugins/polylang/flags/km.png b/wp-content/plugins/polylang/flags/km.png new file mode 100644 index 00000000..812b2f56 Binary files /dev/null and b/wp-content/plugins/polylang/flags/km.png differ diff --git a/wp-content/plugins/polylang/flags/kn.png b/wp-content/plugins/polylang/flags/kn.png new file mode 100644 index 00000000..febd5b48 Binary files /dev/null and b/wp-content/plugins/polylang/flags/kn.png differ diff --git a/wp-content/plugins/polylang/flags/kp.png b/wp-content/plugins/polylang/flags/kp.png new file mode 100644 index 00000000..d3d509aa Binary files /dev/null and b/wp-content/plugins/polylang/flags/kp.png differ diff --git a/wp-content/plugins/polylang/flags/kr.png b/wp-content/plugins/polylang/flags/kr.png new file mode 100644 index 00000000..9c0a78eb Binary files /dev/null and b/wp-content/plugins/polylang/flags/kr.png differ diff --git a/wp-content/plugins/polylang/flags/kurdistan.png b/wp-content/plugins/polylang/flags/kurdistan.png new file mode 100644 index 00000000..02517b46 Binary files /dev/null and b/wp-content/plugins/polylang/flags/kurdistan.png differ diff --git a/wp-content/plugins/polylang/flags/kw.png b/wp-content/plugins/polylang/flags/kw.png new file mode 100644 index 00000000..96546da3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/kw.png differ diff --git a/wp-content/plugins/polylang/flags/ky.png b/wp-content/plugins/polylang/flags/ky.png new file mode 100644 index 00000000..15c5f8e4 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ky.png differ diff --git a/wp-content/plugins/polylang/flags/kz.png b/wp-content/plugins/polylang/flags/kz.png new file mode 100644 index 00000000..45a8c887 Binary files /dev/null and b/wp-content/plugins/polylang/flags/kz.png differ diff --git a/wp-content/plugins/polylang/flags/la.png b/wp-content/plugins/polylang/flags/la.png new file mode 100644 index 00000000..e28acd01 Binary files /dev/null and b/wp-content/plugins/polylang/flags/la.png differ diff --git a/wp-content/plugins/polylang/flags/lb.png b/wp-content/plugins/polylang/flags/lb.png new file mode 100644 index 00000000..d0d452bf Binary files /dev/null and b/wp-content/plugins/polylang/flags/lb.png differ diff --git a/wp-content/plugins/polylang/flags/lc.png b/wp-content/plugins/polylang/flags/lc.png new file mode 100644 index 00000000..a47d0655 Binary files /dev/null and b/wp-content/plugins/polylang/flags/lc.png differ diff --git a/wp-content/plugins/polylang/flags/li.png b/wp-content/plugins/polylang/flags/li.png new file mode 100644 index 00000000..6469909c Binary files /dev/null and b/wp-content/plugins/polylang/flags/li.png differ diff --git a/wp-content/plugins/polylang/flags/lk.png b/wp-content/plugins/polylang/flags/lk.png new file mode 100644 index 00000000..088aad6d Binary files /dev/null and b/wp-content/plugins/polylang/flags/lk.png differ diff --git a/wp-content/plugins/polylang/flags/lr.png b/wp-content/plugins/polylang/flags/lr.png new file mode 100644 index 00000000..89a5bc7e Binary files /dev/null and b/wp-content/plugins/polylang/flags/lr.png differ diff --git a/wp-content/plugins/polylang/flags/ls.png b/wp-content/plugins/polylang/flags/ls.png new file mode 100644 index 00000000..33fdef10 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ls.png differ diff --git a/wp-content/plugins/polylang/flags/lt.png b/wp-content/plugins/polylang/flags/lt.png new file mode 100644 index 00000000..c8ef0da0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/lt.png differ diff --git a/wp-content/plugins/polylang/flags/lu.png b/wp-content/plugins/polylang/flags/lu.png new file mode 100644 index 00000000..4cabba98 Binary files /dev/null and b/wp-content/plugins/polylang/flags/lu.png differ diff --git a/wp-content/plugins/polylang/flags/lv.png b/wp-content/plugins/polylang/flags/lv.png new file mode 100644 index 00000000..49b69981 Binary files /dev/null and b/wp-content/plugins/polylang/flags/lv.png differ diff --git a/wp-content/plugins/polylang/flags/ly.png b/wp-content/plugins/polylang/flags/ly.png new file mode 100644 index 00000000..b163a9f8 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ly.png differ diff --git a/wp-content/plugins/polylang/flags/ma.png b/wp-content/plugins/polylang/flags/ma.png new file mode 100644 index 00000000..f3867702 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ma.png differ diff --git a/wp-content/plugins/polylang/flags/mc.png b/wp-content/plugins/polylang/flags/mc.png new file mode 100644 index 00000000..1aa830f1 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mc.png differ diff --git a/wp-content/plugins/polylang/flags/md.png b/wp-content/plugins/polylang/flags/md.png new file mode 100644 index 00000000..4e92c189 Binary files /dev/null and b/wp-content/plugins/polylang/flags/md.png differ diff --git a/wp-content/plugins/polylang/flags/me.png b/wp-content/plugins/polylang/flags/me.png new file mode 100644 index 00000000..ac725355 Binary files /dev/null and b/wp-content/plugins/polylang/flags/me.png differ diff --git a/wp-content/plugins/polylang/flags/mg.png b/wp-content/plugins/polylang/flags/mg.png new file mode 100644 index 00000000..d2715b3d Binary files /dev/null and b/wp-content/plugins/polylang/flags/mg.png differ diff --git a/wp-content/plugins/polylang/flags/mh.png b/wp-content/plugins/polylang/flags/mh.png new file mode 100644 index 00000000..fb523a8c Binary files /dev/null and b/wp-content/plugins/polylang/flags/mh.png differ diff --git a/wp-content/plugins/polylang/flags/mk.png b/wp-content/plugins/polylang/flags/mk.png new file mode 100644 index 00000000..db173aaf Binary files /dev/null and b/wp-content/plugins/polylang/flags/mk.png differ diff --git a/wp-content/plugins/polylang/flags/ml.png b/wp-content/plugins/polylang/flags/ml.png new file mode 100644 index 00000000..2cec8ba4 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ml.png differ diff --git a/wp-content/plugins/polylang/flags/mm.png b/wp-content/plugins/polylang/flags/mm.png new file mode 100644 index 00000000..10340d26 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mm.png differ diff --git a/wp-content/plugins/polylang/flags/mn.png b/wp-content/plugins/polylang/flags/mn.png new file mode 100644 index 00000000..9396355d Binary files /dev/null and b/wp-content/plugins/polylang/flags/mn.png differ diff --git a/wp-content/plugins/polylang/flags/mo.png b/wp-content/plugins/polylang/flags/mo.png new file mode 100644 index 00000000..deb801dd Binary files /dev/null and b/wp-content/plugins/polylang/flags/mo.png differ diff --git a/wp-content/plugins/polylang/flags/mp.png b/wp-content/plugins/polylang/flags/mp.png new file mode 100644 index 00000000..298d588b Binary files /dev/null and b/wp-content/plugins/polylang/flags/mp.png differ diff --git a/wp-content/plugins/polylang/flags/mq.png b/wp-content/plugins/polylang/flags/mq.png new file mode 100644 index 00000000..010143b3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mq.png differ diff --git a/wp-content/plugins/polylang/flags/mr.png b/wp-content/plugins/polylang/flags/mr.png new file mode 100644 index 00000000..319546b1 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mr.png differ diff --git a/wp-content/plugins/polylang/flags/ms.png b/wp-content/plugins/polylang/flags/ms.png new file mode 100644 index 00000000..d4cbb433 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ms.png differ diff --git a/wp-content/plugins/polylang/flags/mt.png b/wp-content/plugins/polylang/flags/mt.png new file mode 100644 index 00000000..00af9487 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mt.png differ diff --git a/wp-content/plugins/polylang/flags/mu.png b/wp-content/plugins/polylang/flags/mu.png new file mode 100644 index 00000000..b7fdce1b Binary files /dev/null and b/wp-content/plugins/polylang/flags/mu.png differ diff --git a/wp-content/plugins/polylang/flags/mv.png b/wp-content/plugins/polylang/flags/mv.png new file mode 100644 index 00000000..5073d9ec Binary files /dev/null and b/wp-content/plugins/polylang/flags/mv.png differ diff --git a/wp-content/plugins/polylang/flags/mw.png b/wp-content/plugins/polylang/flags/mw.png new file mode 100644 index 00000000..13886e9f Binary files /dev/null and b/wp-content/plugins/polylang/flags/mw.png differ diff --git a/wp-content/plugins/polylang/flags/mx.png b/wp-content/plugins/polylang/flags/mx.png new file mode 100644 index 00000000..5bc58ab3 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mx.png differ diff --git a/wp-content/plugins/polylang/flags/my.png b/wp-content/plugins/polylang/flags/my.png new file mode 100644 index 00000000..9034cbab Binary files /dev/null and b/wp-content/plugins/polylang/flags/my.png differ diff --git a/wp-content/plugins/polylang/flags/mz.png b/wp-content/plugins/polylang/flags/mz.png new file mode 100644 index 00000000..76405e06 Binary files /dev/null and b/wp-content/plugins/polylang/flags/mz.png differ diff --git a/wp-content/plugins/polylang/flags/na.png b/wp-content/plugins/polylang/flags/na.png new file mode 100644 index 00000000..63358c67 Binary files /dev/null and b/wp-content/plugins/polylang/flags/na.png differ diff --git a/wp-content/plugins/polylang/flags/nc.png b/wp-content/plugins/polylang/flags/nc.png new file mode 100644 index 00000000..2cad2837 Binary files /dev/null and b/wp-content/plugins/polylang/flags/nc.png differ diff --git a/wp-content/plugins/polylang/flags/ne.png b/wp-content/plugins/polylang/flags/ne.png new file mode 100644 index 00000000..d85f424f Binary files /dev/null and b/wp-content/plugins/polylang/flags/ne.png differ diff --git a/wp-content/plugins/polylang/flags/nf.png b/wp-content/plugins/polylang/flags/nf.png new file mode 100644 index 00000000..f9bcdda1 Binary files /dev/null and b/wp-content/plugins/polylang/flags/nf.png differ diff --git a/wp-content/plugins/polylang/flags/ng.png b/wp-content/plugins/polylang/flags/ng.png new file mode 100644 index 00000000..3eea2e02 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ng.png differ diff --git a/wp-content/plugins/polylang/flags/ni.png b/wp-content/plugins/polylang/flags/ni.png new file mode 100644 index 00000000..3969aaaa Binary files /dev/null and b/wp-content/plugins/polylang/flags/ni.png differ diff --git a/wp-content/plugins/polylang/flags/nl.png b/wp-content/plugins/polylang/flags/nl.png new file mode 100644 index 00000000..fe44791e Binary files /dev/null and b/wp-content/plugins/polylang/flags/nl.png differ diff --git a/wp-content/plugins/polylang/flags/no.png b/wp-content/plugins/polylang/flags/no.png new file mode 100644 index 00000000..160b6b5b Binary files /dev/null and b/wp-content/plugins/polylang/flags/no.png differ diff --git a/wp-content/plugins/polylang/flags/np.png b/wp-content/plugins/polylang/flags/np.png new file mode 100644 index 00000000..aeb058b7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/np.png differ diff --git a/wp-content/plugins/polylang/flags/nr.png b/wp-content/plugins/polylang/flags/nr.png new file mode 100644 index 00000000..705fc337 Binary files /dev/null and b/wp-content/plugins/polylang/flags/nr.png differ diff --git a/wp-content/plugins/polylang/flags/nu.png b/wp-content/plugins/polylang/flags/nu.png new file mode 100644 index 00000000..c3ce4aed Binary files /dev/null and b/wp-content/plugins/polylang/flags/nu.png differ diff --git a/wp-content/plugins/polylang/flags/nz.png b/wp-content/plugins/polylang/flags/nz.png new file mode 100644 index 00000000..10d6306d Binary files /dev/null and b/wp-content/plugins/polylang/flags/nz.png differ diff --git a/wp-content/plugins/polylang/flags/occitania.png b/wp-content/plugins/polylang/flags/occitania.png new file mode 100644 index 00000000..e500b351 Binary files /dev/null and b/wp-content/plugins/polylang/flags/occitania.png differ diff --git a/wp-content/plugins/polylang/flags/om.png b/wp-content/plugins/polylang/flags/om.png new file mode 100644 index 00000000..2ffba7e8 Binary files /dev/null and b/wp-content/plugins/polylang/flags/om.png differ diff --git a/wp-content/plugins/polylang/flags/pa.png b/wp-content/plugins/polylang/flags/pa.png new file mode 100644 index 00000000..9b2ee9a7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pa.png differ diff --git a/wp-content/plugins/polylang/flags/pe.png b/wp-content/plugins/polylang/flags/pe.png new file mode 100644 index 00000000..62a04977 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pe.png differ diff --git a/wp-content/plugins/polylang/flags/pf.png b/wp-content/plugins/polylang/flags/pf.png new file mode 100644 index 00000000..771a0f65 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pf.png differ diff --git a/wp-content/plugins/polylang/flags/pg.png b/wp-content/plugins/polylang/flags/pg.png new file mode 100644 index 00000000..10d62334 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pg.png differ diff --git a/wp-content/plugins/polylang/flags/ph.png b/wp-content/plugins/polylang/flags/ph.png new file mode 100644 index 00000000..b89e1593 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ph.png differ diff --git a/wp-content/plugins/polylang/flags/pk.png b/wp-content/plugins/polylang/flags/pk.png new file mode 100644 index 00000000..e9df70ca Binary files /dev/null and b/wp-content/plugins/polylang/flags/pk.png differ diff --git a/wp-content/plugins/polylang/flags/pl.png b/wp-content/plugins/polylang/flags/pl.png new file mode 100644 index 00000000..d413d010 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pl.png differ diff --git a/wp-content/plugins/polylang/flags/pm.png b/wp-content/plugins/polylang/flags/pm.png new file mode 100644 index 00000000..ba91d2c7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pm.png differ diff --git a/wp-content/plugins/polylang/flags/pn.png b/wp-content/plugins/polylang/flags/pn.png new file mode 100644 index 00000000..aa9344f5 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pn.png differ diff --git a/wp-content/plugins/polylang/flags/pr.png b/wp-content/plugins/polylang/flags/pr.png new file mode 100644 index 00000000..82d9130d Binary files /dev/null and b/wp-content/plugins/polylang/flags/pr.png differ diff --git a/wp-content/plugins/polylang/flags/ps.png b/wp-content/plugins/polylang/flags/ps.png new file mode 100644 index 00000000..f5f54776 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ps.png differ diff --git a/wp-content/plugins/polylang/flags/pt.png b/wp-content/plugins/polylang/flags/pt.png new file mode 100644 index 00000000..ece79801 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pt.png differ diff --git a/wp-content/plugins/polylang/flags/pw.png b/wp-content/plugins/polylang/flags/pw.png new file mode 100644 index 00000000..6178b254 Binary files /dev/null and b/wp-content/plugins/polylang/flags/pw.png differ diff --git a/wp-content/plugins/polylang/flags/py.png b/wp-content/plugins/polylang/flags/py.png new file mode 100644 index 00000000..cb8723c0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/py.png differ diff --git a/wp-content/plugins/polylang/flags/qa.png b/wp-content/plugins/polylang/flags/qa.png new file mode 100644 index 00000000..ed4c621f Binary files /dev/null and b/wp-content/plugins/polylang/flags/qa.png differ diff --git a/wp-content/plugins/polylang/flags/quebec.png b/wp-content/plugins/polylang/flags/quebec.png new file mode 100644 index 00000000..a90cf0bb Binary files /dev/null and b/wp-content/plugins/polylang/flags/quebec.png differ diff --git a/wp-content/plugins/polylang/flags/ro.png b/wp-content/plugins/polylang/flags/ro.png new file mode 100644 index 00000000..57e74a65 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ro.png differ diff --git a/wp-content/plugins/polylang/flags/rs.png b/wp-content/plugins/polylang/flags/rs.png new file mode 100644 index 00000000..9439a5b6 Binary files /dev/null and b/wp-content/plugins/polylang/flags/rs.png differ diff --git a/wp-content/plugins/polylang/flags/ru.png b/wp-content/plugins/polylang/flags/ru.png new file mode 100644 index 00000000..47da4214 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ru.png differ diff --git a/wp-content/plugins/polylang/flags/rw.png b/wp-content/plugins/polylang/flags/rw.png new file mode 100644 index 00000000..53564917 Binary files /dev/null and b/wp-content/plugins/polylang/flags/rw.png differ diff --git a/wp-content/plugins/polylang/flags/sa.png b/wp-content/plugins/polylang/flags/sa.png new file mode 100644 index 00000000..b4641c7e Binary files /dev/null and b/wp-content/plugins/polylang/flags/sa.png differ diff --git a/wp-content/plugins/polylang/flags/sb.png b/wp-content/plugins/polylang/flags/sb.png new file mode 100644 index 00000000..a9937ccf Binary files /dev/null and b/wp-content/plugins/polylang/flags/sb.png differ diff --git a/wp-content/plugins/polylang/flags/sc.png b/wp-content/plugins/polylang/flags/sc.png new file mode 100644 index 00000000..39ee3718 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sc.png differ diff --git a/wp-content/plugins/polylang/flags/scotland.png b/wp-content/plugins/polylang/flags/scotland.png new file mode 100644 index 00000000..a0e57b41 Binary files /dev/null and b/wp-content/plugins/polylang/flags/scotland.png differ diff --git a/wp-content/plugins/polylang/flags/sd.png b/wp-content/plugins/polylang/flags/sd.png new file mode 100644 index 00000000..eaab69eb Binary files /dev/null and b/wp-content/plugins/polylang/flags/sd.png differ diff --git a/wp-content/plugins/polylang/flags/se.png b/wp-content/plugins/polylang/flags/se.png new file mode 100644 index 00000000..1994653d Binary files /dev/null and b/wp-content/plugins/polylang/flags/se.png differ diff --git a/wp-content/plugins/polylang/flags/sg.png b/wp-content/plugins/polylang/flags/sg.png new file mode 100644 index 00000000..dd34d612 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sg.png differ diff --git a/wp-content/plugins/polylang/flags/sh.png b/wp-content/plugins/polylang/flags/sh.png new file mode 100644 index 00000000..4b1d2a29 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sh.png differ diff --git a/wp-content/plugins/polylang/flags/si.png b/wp-content/plugins/polylang/flags/si.png new file mode 100644 index 00000000..bb1476ff Binary files /dev/null and b/wp-content/plugins/polylang/flags/si.png differ diff --git a/wp-content/plugins/polylang/flags/sk.png b/wp-content/plugins/polylang/flags/sk.png new file mode 100644 index 00000000..7ccbc827 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sk.png differ diff --git a/wp-content/plugins/polylang/flags/sl.png b/wp-content/plugins/polylang/flags/sl.png new file mode 100644 index 00000000..12d812d2 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sl.png differ diff --git a/wp-content/plugins/polylang/flags/sm.png b/wp-content/plugins/polylang/flags/sm.png new file mode 100644 index 00000000..3df2fdcf Binary files /dev/null and b/wp-content/plugins/polylang/flags/sm.png differ diff --git a/wp-content/plugins/polylang/flags/sn.png b/wp-content/plugins/polylang/flags/sn.png new file mode 100644 index 00000000..eabb71db Binary files /dev/null and b/wp-content/plugins/polylang/flags/sn.png differ diff --git a/wp-content/plugins/polylang/flags/so.png b/wp-content/plugins/polylang/flags/so.png new file mode 100644 index 00000000..4a1ea4b2 Binary files /dev/null and b/wp-content/plugins/polylang/flags/so.png differ diff --git a/wp-content/plugins/polylang/flags/sr.png b/wp-content/plugins/polylang/flags/sr.png new file mode 100644 index 00000000..5eff9271 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sr.png differ diff --git a/wp-content/plugins/polylang/flags/ss.png b/wp-content/plugins/polylang/flags/ss.png new file mode 100644 index 00000000..6b5018a2 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ss.png differ diff --git a/wp-content/plugins/polylang/flags/st.png b/wp-content/plugins/polylang/flags/st.png new file mode 100644 index 00000000..2978557b Binary files /dev/null and b/wp-content/plugins/polylang/flags/st.png differ diff --git a/wp-content/plugins/polylang/flags/sv.png b/wp-content/plugins/polylang/flags/sv.png new file mode 100644 index 00000000..24987990 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sv.png differ diff --git a/wp-content/plugins/polylang/flags/sy.png b/wp-content/plugins/polylang/flags/sy.png new file mode 100644 index 00000000..f5ce30dc Binary files /dev/null and b/wp-content/plugins/polylang/flags/sy.png differ diff --git a/wp-content/plugins/polylang/flags/sz.png b/wp-content/plugins/polylang/flags/sz.png new file mode 100644 index 00000000..914ee861 Binary files /dev/null and b/wp-content/plugins/polylang/flags/sz.png differ diff --git a/wp-content/plugins/polylang/flags/tc.png b/wp-content/plugins/polylang/flags/tc.png new file mode 100644 index 00000000..8fc1156b Binary files /dev/null and b/wp-content/plugins/polylang/flags/tc.png differ diff --git a/wp-content/plugins/polylang/flags/td.png b/wp-content/plugins/polylang/flags/td.png new file mode 100644 index 00000000..667f21fd Binary files /dev/null and b/wp-content/plugins/polylang/flags/td.png differ diff --git a/wp-content/plugins/polylang/flags/tf.png b/wp-content/plugins/polylang/flags/tf.png new file mode 100644 index 00000000..80529a43 Binary files /dev/null and b/wp-content/plugins/polylang/flags/tf.png differ diff --git a/wp-content/plugins/polylang/flags/tg.png b/wp-content/plugins/polylang/flags/tg.png new file mode 100644 index 00000000..3aa00ad4 Binary files /dev/null and b/wp-content/plugins/polylang/flags/tg.png differ diff --git a/wp-content/plugins/polylang/flags/th.png b/wp-content/plugins/polylang/flags/th.png new file mode 100644 index 00000000..dd8ba917 Binary files /dev/null and b/wp-content/plugins/polylang/flags/th.png differ diff --git a/wp-content/plugins/polylang/flags/tibet.png b/wp-content/plugins/polylang/flags/tibet.png new file mode 100644 index 00000000..6ecc135e Binary files /dev/null and b/wp-content/plugins/polylang/flags/tibet.png differ diff --git a/wp-content/plugins/polylang/flags/tj.png b/wp-content/plugins/polylang/flags/tj.png new file mode 100644 index 00000000..617bf645 Binary files /dev/null and b/wp-content/plugins/polylang/flags/tj.png differ diff --git a/wp-content/plugins/polylang/flags/tk.png b/wp-content/plugins/polylang/flags/tk.png new file mode 100644 index 00000000..67b8c8cb Binary files /dev/null and b/wp-content/plugins/polylang/flags/tk.png differ diff --git a/wp-content/plugins/polylang/flags/tl.png b/wp-content/plugins/polylang/flags/tl.png new file mode 100644 index 00000000..77da181e Binary files /dev/null and b/wp-content/plugins/polylang/flags/tl.png differ diff --git a/wp-content/plugins/polylang/flags/tm.png b/wp-content/plugins/polylang/flags/tm.png new file mode 100644 index 00000000..828020ec Binary files /dev/null and b/wp-content/plugins/polylang/flags/tm.png differ diff --git a/wp-content/plugins/polylang/flags/tn.png b/wp-content/plugins/polylang/flags/tn.png new file mode 100644 index 00000000..183cdd3d Binary files /dev/null and b/wp-content/plugins/polylang/flags/tn.png differ diff --git a/wp-content/plugins/polylang/flags/to.png b/wp-content/plugins/polylang/flags/to.png new file mode 100644 index 00000000..f89b8ba7 Binary files /dev/null and b/wp-content/plugins/polylang/flags/to.png differ diff --git a/wp-content/plugins/polylang/flags/tr.png b/wp-content/plugins/polylang/flags/tr.png new file mode 100644 index 00000000..be32f77e Binary files /dev/null and b/wp-content/plugins/polylang/flags/tr.png differ diff --git a/wp-content/plugins/polylang/flags/tt.png b/wp-content/plugins/polylang/flags/tt.png new file mode 100644 index 00000000..2a11c1e2 Binary files /dev/null and b/wp-content/plugins/polylang/flags/tt.png differ diff --git a/wp-content/plugins/polylang/flags/tv.png b/wp-content/plugins/polylang/flags/tv.png new file mode 100644 index 00000000..28274c5f Binary files /dev/null and b/wp-content/plugins/polylang/flags/tv.png differ diff --git a/wp-content/plugins/polylang/flags/tw.png b/wp-content/plugins/polylang/flags/tw.png new file mode 100644 index 00000000..f31c654c Binary files /dev/null and b/wp-content/plugins/polylang/flags/tw.png differ diff --git a/wp-content/plugins/polylang/flags/tz.png b/wp-content/plugins/polylang/flags/tz.png new file mode 100644 index 00000000..c00ff796 Binary files /dev/null and b/wp-content/plugins/polylang/flags/tz.png differ diff --git a/wp-content/plugins/polylang/flags/ua.png b/wp-content/plugins/polylang/flags/ua.png new file mode 100644 index 00000000..09563a21 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ua.png differ diff --git a/wp-content/plugins/polylang/flags/ug.png b/wp-content/plugins/polylang/flags/ug.png new file mode 100644 index 00000000..33f4affa Binary files /dev/null and b/wp-content/plugins/polylang/flags/ug.png differ diff --git a/wp-content/plugins/polylang/flags/us.png b/wp-content/plugins/polylang/flags/us.png new file mode 100644 index 00000000..10f451fe Binary files /dev/null and b/wp-content/plugins/polylang/flags/us.png differ diff --git a/wp-content/plugins/polylang/flags/uy.png b/wp-content/plugins/polylang/flags/uy.png new file mode 100644 index 00000000..31d948a0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/uy.png differ diff --git a/wp-content/plugins/polylang/flags/uz.png b/wp-content/plugins/polylang/flags/uz.png new file mode 100644 index 00000000..fef5dc17 Binary files /dev/null and b/wp-content/plugins/polylang/flags/uz.png differ diff --git a/wp-content/plugins/polylang/flags/va.png b/wp-content/plugins/polylang/flags/va.png new file mode 100644 index 00000000..b31eaf22 Binary files /dev/null and b/wp-content/plugins/polylang/flags/va.png differ diff --git a/wp-content/plugins/polylang/flags/vc.png b/wp-content/plugins/polylang/flags/vc.png new file mode 100644 index 00000000..8fa17b06 Binary files /dev/null and b/wp-content/plugins/polylang/flags/vc.png differ diff --git a/wp-content/plugins/polylang/flags/ve.png b/wp-content/plugins/polylang/flags/ve.png new file mode 100644 index 00000000..00c90f9a Binary files /dev/null and b/wp-content/plugins/polylang/flags/ve.png differ diff --git a/wp-content/plugins/polylang/flags/veneto.png b/wp-content/plugins/polylang/flags/veneto.png new file mode 100644 index 00000000..8dcf6a7b Binary files /dev/null and b/wp-content/plugins/polylang/flags/veneto.png differ diff --git a/wp-content/plugins/polylang/flags/vg.png b/wp-content/plugins/polylang/flags/vg.png new file mode 100644 index 00000000..41569079 Binary files /dev/null and b/wp-content/plugins/polylang/flags/vg.png differ diff --git a/wp-content/plugins/polylang/flags/vi.png b/wp-content/plugins/polylang/flags/vi.png new file mode 100644 index 00000000..ed26915a Binary files /dev/null and b/wp-content/plugins/polylang/flags/vi.png differ diff --git a/wp-content/plugins/polylang/flags/vn.png b/wp-content/plugins/polylang/flags/vn.png new file mode 100644 index 00000000..ec7cd48a Binary files /dev/null and b/wp-content/plugins/polylang/flags/vn.png differ diff --git a/wp-content/plugins/polylang/flags/vu.png b/wp-content/plugins/polylang/flags/vu.png new file mode 100644 index 00000000..b3397bc6 Binary files /dev/null and b/wp-content/plugins/polylang/flags/vu.png differ diff --git a/wp-content/plugins/polylang/flags/wales.png b/wp-content/plugins/polylang/flags/wales.png new file mode 100644 index 00000000..e0d7cee1 Binary files /dev/null and b/wp-content/plugins/polylang/flags/wales.png differ diff --git a/wp-content/plugins/polylang/flags/wf.png b/wp-content/plugins/polylang/flags/wf.png new file mode 100644 index 00000000..9f955873 Binary files /dev/null and b/wp-content/plugins/polylang/flags/wf.png differ diff --git a/wp-content/plugins/polylang/flags/ws.png b/wp-content/plugins/polylang/flags/ws.png new file mode 100644 index 00000000..c1695080 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ws.png differ diff --git a/wp-content/plugins/polylang/flags/ye.png b/wp-content/plugins/polylang/flags/ye.png new file mode 100644 index 00000000..468dfad0 Binary files /dev/null and b/wp-content/plugins/polylang/flags/ye.png differ diff --git a/wp-content/plugins/polylang/flags/yt.png b/wp-content/plugins/polylang/flags/yt.png new file mode 100644 index 00000000..c298f378 Binary files /dev/null and b/wp-content/plugins/polylang/flags/yt.png differ diff --git a/wp-content/plugins/polylang/flags/za.png b/wp-content/plugins/polylang/flags/za.png new file mode 100644 index 00000000..57c58e21 Binary files /dev/null and b/wp-content/plugins/polylang/flags/za.png differ diff --git a/wp-content/plugins/polylang/flags/zm.png b/wp-content/plugins/polylang/flags/zm.png new file mode 100644 index 00000000..c25b07be Binary files /dev/null and b/wp-content/plugins/polylang/flags/zm.png differ diff --git a/wp-content/plugins/polylang/flags/zw.png b/wp-content/plugins/polylang/flags/zw.png new file mode 100644 index 00000000..53c97259 Binary files /dev/null and b/wp-content/plugins/polylang/flags/zw.png differ diff --git a/wp-content/plugins/polylang/frontend/choose-lang-content.php b/wp-content/plugins/polylang/frontend/choose-lang-content.php new file mode 100644 index 00000000..6e95b7bb --- /dev/null +++ b/wp-content/plugins/polylang/frontend/choose-lang-content.php @@ -0,0 +1,144 @@ +options['media_support'] ) ) { + return $this->get_preferred_language(); + } + + if ( $var = get_query_var( 'lang' ) ) { + $lang = explode( ',', $var ); + $lang = $this->model->get_language( reset( $lang ) ); // Choose the first queried language + } + + elseif ( ( is_single() || is_page() || ( is_attachment() && $this->options['media_support'] ) ) && ( ( $var = get_queried_object_id() ) || ( $var = get_query_var( 'p' ) ) || ( $var = get_query_var( 'page_id' ) ) || ( $var = get_query_var( 'attachment_id' ) ) ) ) { + $lang = $this->model->post->get_language( $var ); + } + + else { + foreach ( $this->model->get_translated_taxonomies() as $taxonomy ) { + if ( $var = get_query_var( get_taxonomy( $taxonomy )->query_var ) ) { + $lang = $this->model->term->get_language( $var, $taxonomy ); + } + } + } + + /** + * Filter the language before it is set from the content + * + * @since 0.9 + * + * @param bool|object $lang language object or false if none was found + */ + return apply_filters( 'pll_get_current_language', isset( $lang ) ? $lang : false ); + } + + /** + * Sets the language for home page + * Add the lang query var when querying archives with no language code + * + * @since 1.2 + * + * @param object $query instance of WP_Query + */ + public function parse_main_query( $query ) { + if ( empty( $GLOBALS['wp_the_query'] ) || $query !== $GLOBALS['wp_the_query'] ) { + return; + } + + $qv = $query->query_vars; + + // Homepage is requested, let's set the language + // Take care to avoid posts page for which is_home = 1 + if ( empty( $query->query ) && ( is_home() || is_page() ) ) { + $this->home_language(); + $this->home_requested(); + } + + parent::parse_main_query( $query ); + + $is_archive = ( count( $query->query ) == 1 && ! empty( $qv['paged'] ) ) || + $query->is_date || + $query->is_author || + ( ! empty( $qv['post_type'] ) && $query->is_post_type_archive && $this->model->is_translated_post_type( $qv['post_type'] ) ); + + // Sets the language in case we hide the default language + // Use $query->query['s'] as is_search is not set when search is empty + // http://wordpress.org/support/topic/search-for-empty-string-in-default-language + if ( $this->options['hide_default'] && ! isset( $qv['lang'] ) && ( $is_archive || isset( $query->query['s'] ) || ( count( $query->query ) == 1 && ! empty( $qv['feed'] ) ) ) ) { + $this->set_language( $this->model->get_language( $this->options['default_lang'] ) ); + $this->set_curlang_in_query( $query ); + } + } + + /** + * Sets the language from content + * + * @since 1.2 + */ + public function wp() { + // Nothing to do if the language has already been set ( although normally the filter has been removed ) + if ( ! $this->curlang && $curlang = $this->get_language_from_content() ) { + parent::set_language( $curlang ); + } + } + + /** + * If no language found by get_language_from_content, return the preferred one + * + * @since 0.9 + * + * @param object|bool $lang Language found in get_language_from_content + * @return object Language + */ + public function pll_get_current_language( $lang ) { + return ! $lang ? $this->get_preferred_language() : $lang; + } +} diff --git a/wp-content/plugins/polylang/frontend/choose-lang-domain.php b/wp-content/plugins/polylang/frontend/choose-lang-domain.php new file mode 100644 index 00000000..4128f9d2 --- /dev/null +++ b/wp-content/plugins/polylang/frontend/choose-lang-domain.php @@ -0,0 +1,39 @@ +model->get_language( $this->links_model->get_language_from_url() ); + } + + /** + * Adds query vars to query for home pages in all languages + * + * @since 1.5 + */ + public function home_requested() { + $this->set_curlang_in_query( $GLOBALS['wp_query'] ); + /** This action is documented in include/choose-lang.php */ + do_action( 'pll_home_requested' ); + } +} diff --git a/wp-content/plugins/polylang/frontend/choose-lang-url.php b/wp-content/plugins/polylang/frontend/choose-lang-url.php new file mode 100644 index 00000000..4ec2b4ff --- /dev/null +++ b/wp-content/plugins/polylang/frontend/choose-lang-url.php @@ -0,0 +1,107 @@ +set_language_from_url(); + } + + add_action( 'request', array( $this, 'request' ) ); + } + + /** + * Finds the language according to information found in the url + * + * @since 1.2 + */ + public function set_language_from_url() { + $host = str_replace( 'www.', '', wp_parse_url( $this->links_model->home, PHP_URL_HOST ) ); // Remove www. for the comparison + $home_path = (string) wp_parse_url( $this->links_model->home, PHP_URL_PATH ); + + $requested_url = pll_get_requested_url(); + $requested_host = str_replace( 'www.', '', wp_parse_url( $requested_url, PHP_URL_HOST ) ); // Remove www. for the comparison + $requested_path = rtrim( str_replace( $this->index, '', wp_parse_url( $requested_url, PHP_URL_PATH ) ), '/' ); // Some PHP setups turn requests for / into /index.php in REQUEST_URI + $requested_query = wp_parse_url( $requested_url, PHP_URL_QUERY ); + + // Home is requested + if ( $requested_host === $host && $requested_path === $home_path && empty( $requested_query ) ) { + $this->home_language(); + add_action( 'setup_theme', array( $this, 'home_requested' ) ); + } + + // Take care to post & page preview http://wordpress.org/support/topic/static-frontpage-url-parameter-url-language-information + elseif ( isset( $_GET['preview'] ) && ( ( isset( $_GET['p'] ) && $id = (int) $_GET['p'] ) || ( isset( $_GET['page_id'] ) && $id = (int) $_GET['page_id'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $curlang = ( $lg = $this->model->post->get_language( $id ) ) ? $lg : $this->model->get_language( $this->options['default_lang'] ); + } + + // Take care to ( unattached ) attachments + elseif ( isset( $_GET['attachment_id'] ) && $id = (int) $_GET['attachment_id'] ) { // phpcs:ignore WordPress.Security.NonceVerification + $curlang = ( $lg = $this->model->post->get_language( $id ) ) ? $lg : $this->get_preferred_language(); + } + + elseif ( $slug = $this->links_model->get_language_from_url() ) { + $curlang = $this->model->get_language( $slug ); + } + + elseif ( $this->options['hide_default'] ) { + $curlang = $this->model->get_language( $this->options['default_lang'] ); + } + + // If no language found, check_language_code_in_url() will attempt to find one and redirect to the correct url + // Otherwise a 404 will be fired in the preferred language + $this->set_language( empty( $curlang ) ? $this->get_preferred_language() : $curlang ); + } + + + /** + * Adds the current language in query vars + * useful for subdomains and multiple domains + * + * @since 1.8 + * + * @param array $qv main request query vars + * @return array modified query vars + */ + public function request( $qv ) { + // FIXME take care not to break untranslated content + // FIXME media ? + + // Untranslated post types + if ( isset( $qv['post_type'] ) && ! $this->model->is_translated_post_type( $qv['post_type'] ) ) { + return $qv; + } + + // Untranslated taxonomies + $tax_qv = array_filter( wp_list_pluck( get_taxonomies( array(), 'objects' ), 'query_var' ) ); // Get all taxonomies query vars + $tax_qv = array_intersect( $tax_qv, array_keys( $qv ) ); // Get all queried taxonomies query vars + + if ( ! $this->model->is_translated_taxonomy( array_keys( $tax_qv ) ) ) { + return $qv; + } + + if ( isset( $this->curlang ) && empty( $qv['lang'] ) ) { + $qv['lang'] = $this->curlang->slug; + } + + return $qv; + } +} diff --git a/wp-content/plugins/polylang/frontend/choose-lang.php b/wp-content/plugins/polylang/frontend/choose-lang.php new file mode 100644 index 00000000..e4f11b4b --- /dev/null +++ b/wp-content/plugins/polylang/frontend/choose-lang.php @@ -0,0 +1,341 @@ +links_model = &$polylang->links_model; + $this->model = &$polylang->model; + $this->options = &$polylang->options; + + $this->curlang = &$polylang->curlang; + } + + /** + * Sets the language for ajax requests + * and setup actions + * Any child class must call this method if it overrides it + * + * @since 1.8 + */ + public function init() { + if ( Polylang::is_ajax_on_front() || ! wp_using_themes() ) { + $this->set_language( empty( $_REQUEST['lang'] ) ? $this->get_preferred_language() : $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + + add_action( 'pre_comment_on_post', array( $this, 'pre_comment_on_post' ) ); // sets the language of comment + add_action( 'parse_query', array( $this, 'parse_main_query' ), 2 ); // sets the language in special cases + add_action( 'wp', array( $this, 'maybe_setcookie' ), 7 ); + } + + /** + * Writes language cookie + * Loads user defined translations + * Fires the action 'pll_language_defined' + * + * @since 1.2 + * + * @param object $curlang current language + */ + protected function set_language( $curlang ) { + // Don't set the language a second time + if ( isset( $this->curlang ) ) { + return; + } + + // Final check in case $curlang has an unexpected value + // See https://wordpress.org/support/topic/detect-browser-language-sometimes-setting-null-language + $this->curlang = ( $curlang instanceof PLL_Language ) ? $curlang : $this->model->get_language( $this->options['default_lang'] ); + + $GLOBALS['text_direction'] = $this->curlang->is_rtl ? 'rtl' : 'ltr'; + wp_styles()->text_direction = $GLOBALS['text_direction']; + + /** + * Fires when the current language is defined + * + * @since 0.9.5 + * + * @param string $slug current language code + * @param object $curlang current language object + */ + do_action( 'pll_language_defined', $this->curlang->slug, $this->curlang ); + } + + /** + * Set a cookie to remember the language. + * Setting PLL_COOKIE to false will disable cookie although it will break some functionalities + * + * @since 1.5 + */ + public function maybe_setcookie() { + // Don't set cookie in javascript when a cache plugin is active. + if ( ! pll_is_cache_active() && ! empty( $this->curlang ) && ! is_404() ) { + $args = array( + 'domain' => 2 === $this->options['force_lang'] ? wp_parse_url( $this->links_model->home, PHP_URL_HOST ) : COOKIE_DOMAIN, + 'samesite' => 3 === $this->options['force_lang'] ? 'None' : 'Lax', + ); + PLL_Cookie::set( $this->curlang->slug, $args ); + } + } + + /** + * Get the preferred language according to the browser preferences + * Code adapted from http://www.thefutureoftheweb.com/blog/use-accept-language-header + * + * @since 1.8 + * + * @return string|bool the preferred language slug or false + */ + public function get_preferred_browser_language() { + $accept_langs = array(); + + if ( isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) { + // Break up string into pieces ( languages and q factors ) + preg_match_all( + '/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*((?>1|0)(?>\.[0-9]+)?))?/i', + sanitize_text_field( wp_unslash( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ), + $lang_parse + ); + + $k = $lang_parse[1]; + $v = $lang_parse[4]; + + if ( $n = count( $k ) ) { + // Set default to 1 for any without q factor + foreach ( $v as $key => $val ) { + if ( '' === $val || (float) $val > 1 ) { + $v[ $key ] = 1; + } + } + + // Bubble sort ( need a stable sort for Android, so can't use a PHP sort function ) + if ( $n > 1 ) { + for ( $i = 2; $i <= $n; $i++ ) { + for ( $j = 0; $j <= $n - 2; $j++ ) { + if ( $v[ $j ] < $v[ $j + 1 ] ) { + // Swap values + $temp = $v[ $j ]; + $v[ $j ] = $v[ $j + 1 ]; + $v[ $j + 1 ] = $temp; + // Swap keys + $temp = $k[ $j ]; + $k[ $j ] = $k[ $j + 1 ]; + $k[ $j + 1 ] = $temp; + } + } + } + } + $accept_langs = array_combine( $k, $v ); + } + } + + $accept_langs = array_filter( $accept_langs ); // Remove languages marked as unacceptable (q=0). + + $languages = $this->model->get_languages_list( array( 'hide_empty' => true ) ); // Hides languages with no post + + /** + * Filter the list of languages to use to match the browser preferences + * + * @since 1.9.3 + * + * @param array $languages array of PLL_Language objects + */ + $languages = apply_filters( 'pll_languages_for_browser_preferences', $languages ); + + // Looks through sorted list and use first one that matches our language list + foreach ( array_keys( $accept_langs ) as $accept_lang ) { + // First loop to match the exact locale + foreach ( $languages as $language ) { + if ( 0 === strcasecmp( $accept_lang, $language->get_locale( 'display' ) ) ) { + return $language->slug; + } + } + + // Second loop to match the language set + foreach ( $languages as $language ) { + if ( 0 === stripos( $accept_lang, $language->slug ) || 0 === stripos( $language->get_locale( 'display' ), $accept_lang ) ) { + return $language->slug; + } + } + } + return false; + } + + /** + * Returns the preferred language + * either from the cookie if it's a returning visit + * or according to browser preference + * or the default language + * + * @since 0.1 + * + * @return object browser preferred language or default language + */ + public function get_preferred_language() { + $language = false; + $cookie = false; + + if ( isset( $_COOKIE[ PLL_COOKIE ] ) ) { + // Check first if the user was already browsing this site. + $language = sanitize_key( $_COOKIE[ PLL_COOKIE ] ); + $cookie = true; + } elseif ( $this->options['browser'] ) { + $language = $this->get_preferred_browser_language(); + } + + /** + * Filter the visitor's preferred language (normally set first by cookie + * if this is not the first visit, then by the browser preferences). + * If no preferred language has been found or set by this filter, + * Polylang fallbacks to the default language + * + * @since 1.0 + * @since 2.7 Added $cookie parameter. + * + * @param string|bool $language Preferred language code, false if none has been found. + * @param bool $cookie Whether the preferred language has been defined by the cookie. + */ + $slug = apply_filters( 'pll_preferred_language', $language, $cookie ); + + // Return default if there is no preferences in the browser or preferences does not match our languages or it is requested not to use the browser preference + return ( $lang = $this->model->get_language( $slug ) ) ? $lang : $this->model->get_language( $this->options['default_lang'] ); + } + + /** + * Sets the language when home page is requested + * + * @since 1.2 + */ + protected function home_language() { + // Test referer in case PLL_COOKIE is set to false. Since WP 3.6.1, wp_get_referer() validates the host which is exactly what we want + // Thanks to Ov3rfly http://wordpress.org/support/topic/enhance-feature-when-front-page-is-visited-set-language-according-to-browser + $language = $this->options['hide_default'] && ( wp_get_referer() || ! $this->options['browser'] ) ? + $this->model->get_language( $this->options['default_lang'] ) : + $this->get_preferred_language(); // Sets the language according to browser preference or default language + $this->set_language( $language ); + } + + /** + * To call when the home page has been requested + * Make sure to call this after 'setup_theme' has been fired as we need $wp_query + * Performs a redirection to the home page in the current language if needed + * + * @since 0.9 + */ + public function home_requested() { + // We are already on the right page + if ( $this->options['default_lang'] == $this->curlang->slug && $this->options['hide_default'] ) { + $this->set_curlang_in_query( $GLOBALS['wp_query'] ); + + /** + * Fires when the site root page is requested + * + * @since 1.8 + */ + do_action( 'pll_home_requested' ); + } + // Redirect to the home page in the right language + // Test to avoid crash if get_home_url returns something wrong + // FIXME why this happens? http://wordpress.org/support/topic/polylang-crashes-1 + // Don't redirect if $_POST is not empty as it could break other plugins + elseif ( is_string( $redirect = $this->curlang->home_url ) && empty( $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification + // Don't forget the query string which may be added by plugins + $query_string = wp_parse_url( pll_get_requested_url(), PHP_URL_QUERY ); + if ( ! empty( $query_string ) ) { + $redirect .= ( $this->links_model->using_permalinks ? '?' : '&' ) . $query_string; + } + + /** + * When a visitor reaches the site home, Polylang redirects to the home page in the correct language. + * This filter allows plugins to modify the redirected url or prevent this redirection + * /!\ this filter may be fired *before* the theme is loaded + * + * @since 1.1.1 + * + * @param string $redirect the url the visitor will be redirected to + */ + if ( $redirect = apply_filters( 'pll_redirect_home', $redirect ) ) { + $this->maybe_setcookie(); + header( 'Vary: Accept-Language' ); + wp_safe_redirect( $redirect, 302, POLYLANG ); + exit; + } + } + } + + /** + * Set the language when posting a comment + * + * @since 0.8.4 + * + * @param int $post_id the post being commented + */ + public function pre_comment_on_post( $post_id ) { + $this->set_language( $this->model->post->get_language( $post_id ) ); + } + + /** + * Modifies some main query vars for home page and page for posts + * to enable one home page ( and one page for posts ) per language + * + * @since 1.2 + * + * @param object $query instance of WP_Query + */ + public function parse_main_query( $query ) { + if ( ! $query->is_main_query() ) { + return; + } + + /** + * This filter allows to set the language based on information contained in the main query + * + * @since 1.8 + * + * @param bool|object $lang false or language object + * @param object $query WP_Query object + */ + if ( $lang = apply_filters( 'pll_set_language_from_query', false, $query ) ) { + $this->set_language( $lang ); + $this->set_curlang_in_query( $query ); + } + + // sets is_home on translated home page when it displays posts + // is_home must be true on page 2, 3... too + // as well as when searching an empty string: http://wordpress.org/support/topic/plugin-polylang-polylang-breaks-search-in-spun-theme + elseif ( ( count( $query->query ) == 1 || ( is_paged() && count( $query->query ) == 2 ) || ( isset( $query->query['s'] ) && ! $query->query['s'] ) ) && $lang = get_query_var( 'lang' ) ) { + $lang = $this->model->get_language( $lang ); + $this->set_language( $lang ); // sets the language now otherwise it will be too late to filter sticky posts ! + $query->is_home = true; + $query->is_archive = $query->is_tax = false; + } + } + + /** + * Sets the current language in the query + * + * @since 2.2 + * + * @param object $query + */ + protected function set_curlang_in_query( &$query ) { + $pll_query = new PLL_Query( $query, $this->model ); + $pll_query->set_language( $this->curlang ); + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-auto-translate.php b/wp-content/plugins/polylang/frontend/frontend-auto-translate.php new file mode 100644 index 00000000..c5747dcc --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-auto-translate.php @@ -0,0 +1,292 @@ +model = &$polylang->model; + $this->curlang = &$polylang->curlang; + + add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); // after main Polylang filter + add_filter( 'get_terms_args', array( $this, 'get_terms_args' ), 20, 2 ); + } + + /** + * Helper function to get the translated post in the current language + * + * @since 1.8 + * + * @param int $post_id + * @return int + */ + protected function get_post( $post_id ) { + return $this->model->post->get( $post_id, $this->curlang ); + } + + /** + * Helper function to get the translated term in the current language + * + * @since 1.8 + * + * @param int $term_id + * @return int + */ + protected function get_term( $term_id ) { + return $this->model->term->get( $term_id, $this->curlang ); + } + + /** + * Filters posts query to automatically translate included ids + * + * @since 1.1 + * + * @param object $query WP_Query object + */ + public function pre_get_posts( $query ) { + global $wpdb; + $qv = &$query->query_vars; + + if ( $query->is_main_query() || isset( $qv['lang'] ) || ( ! empty( $qv['post_type'] ) && ! $this->model->is_translated_post_type( $qv['post_type'] ) ) ) { + return; + } + + // /!\ always keep untranslated as is + + // Term ids separated by a comma + $arr = array(); + if ( ! empty( $qv['cat'] ) ) { + foreach ( explode( ',', $qv['cat'] ) as $cat ) { + $tr = $this->get_term( abs( $cat ) ); + $arr[] = $cat < 0 ? -$tr : $tr; + } + + $qv['cat'] = implode( ',', $arr ); + } + + // Category_name + $arr = array(); + if ( ! empty( $qv['category_name'] ) ) { + foreach ( explode( ',', $qv['category_name'] ) as $slug ) { + $arr[] = $this->get_translated_term_by( 'slug', $slug, 'category' ); + } + + $qv['category_name'] = implode( ',', $arr ); + } + + // Array of term ids + foreach ( array( 'category__and', 'category__in', 'category__not_in', 'tag__and', 'tag__in', 'tag__not_in' ) as $key ) { + $arr = array(); + if ( ! empty( $qv[ $key ] ) ) { + foreach ( $qv[ $key ] as $cat ) { + $arr[] = ( $tr = $this->get_term( $cat ) ) ? $tr : $cat; + } + $qv[ $key ] = $arr; + } + } + + // Tag + $arr = array(); + if ( ! empty( $qv['tag'] ) ) { + $sep = strpos( $qv['tag'], ',' ) !== false ? ',' : '+'; // Two possible separators for tag slugs + foreach ( explode( $sep, $qv['tag'] ) as $slug ) { + $arr[] = $this->get_translated_term_by( 'slug', $slug, 'post_tag' ); + } + + $qv['tag'] = implode( $sep, $arr ); + } + + // tag_id can only take one id + if ( ! empty( $qv['tag_id'] ) && $tr_id = $this->get_term( $qv['tag_id'] ) ) { + $qv['tag_id'] = $tr_id; + } + + // Array of tag slugs + foreach ( array( 'tag_slug__and', 'tag_slug__in' ) as $key ) { + $arr = array(); + if ( ! empty( $qv[ $key ] ) ) { + foreach ( $qv[ $key ] as $slug ) { + $arr[] = $this->get_translated_term_by( 'slug', $slug, 'post_tag' ); + } + + $qv[ $key ] = $arr; + } + } + + // Custom taxonomies + // According to the codex, this type of query is deprecated as of WP 3.1 but it does not appear in WP 3.5 source code + foreach ( array_intersect( $this->model->get_translated_taxonomies(), get_taxonomies( array( '_builtin' => false ) ) ) as $taxonomy ) { + $tax = get_taxonomy( $taxonomy ); + $arr = array(); + if ( ! empty( $qv[ $tax->query_var ] ) ) { + $sep = strpos( $qv[ $tax->query_var ], ',' ) !== false ? ',' : '+'; // Two possible separators + foreach ( explode( $sep, $qv[ $tax->query_var ] ) as $slug ) { + $arr[] = $this->get_translated_term_by( 'slug', $slug, $taxonomy ); + } + + $qv[ $tax->query_var ] = implode( $sep, $arr ); + } + } + + // Tax_query since WP 3.1 + if ( ! empty( $qv['tax_query'] ) && is_array( $qv['tax_query'] ) ) { + $qv['tax_query'] = $this->translate_tax_query_recursive( $qv['tax_query'] ); + } + + // p, page_id, post_parent can only take one id + foreach ( array( 'p', 'page_id', 'post_parent' ) as $key ) { + if ( ! empty( $qv[ $key ] ) && $tr_id = $this->get_post( $qv[ $key ] ) ) { + $qv[ $key ] = $tr_id; + } + } + + // name, can only take one slug + if ( ! empty( $qv['name'] ) ) { + if ( empty( $qv['post_type'] ) ) { + $post_types = array( 'post' ); + } elseif ( 'any' === $qv['post_type'] ) { + $post_types = get_post_types( array( 'exclude_from_search' => false ) ); // May return a empty array + } else { + $post_types = (array) $qv['post_type']; + } + + if ( ! empty( $post_types ) ) { + // No function to get post by name except get_posts itself + $id = $wpdb->get_var( + sprintf( + "SELECT ID from {$wpdb->posts} + WHERE {$wpdb->posts}.post_type IN ( '%s' ) + AND post_name='%s'", + implode( "', '", esc_sql( $post_types ) ), + esc_sql( $qv['name'] ) + ) + ); + $qv['name'] = ( $id && ( $tr_id = $this->get_post( $id ) ) && $tr = get_post( $tr_id ) ) ? $tr->post_name : $qv['name']; + } + } + + // pagename, the page id is already available in queried_object_id + if ( ! empty( $qv['pagename'] ) && ! empty( $query->queried_object_id ) && $tr_id = $this->get_post( $query->queried_object_id ) ) { + $query->queried_object_id = $tr_id; + $qv['pagename'] = get_page_uri( $tr_id ); + } + + // Array of post ids + // post_parent__in & post_parent__not_in since WP 3.6 + foreach ( array( 'post__in', 'post__not_in', 'post_parent__in', 'post_parent__not_in' ) as $key ) { // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn + $arr = array(); + if ( ! empty( $qv[ $key ] ) ) { + // post__in used by the 2 functions below + // Useless to filter them as output is already in the right language and would result in performance loss + foreach ( debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ) as $trace ) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions + if ( in_array( $trace['function'], array( 'wp_nav_menu', 'gallery_shortcode' ) ) ) { + return; + } + } + + foreach ( $qv[ $key ] as $p ) { + $arr[] = ( $tr = $this->get_post( $p ) ) ? $tr : $p; + } + + $qv[ $key ] = $arr; + } + } + } + + /** + * Filters terms query to automatically translate included ids + * + * @since 1.1.1 + * + * @param array $args + * @param array $taxonomies + * @return array modified $args + */ + public function get_terms_args( $args, $taxonomies ) { + if ( ! isset( $args['lang'] ) && ! empty( $args['include'] ) && ( empty( $taxonomies ) || $this->model->is_translated_taxonomy( $taxonomies ) ) ) { + $arr = array(); + + foreach ( wp_parse_id_list( $args['include'] ) as $id ) { + $arr[] = ( $tr = $this->get_term( $id ) ) ? $tr : $id; + } + + $args['include'] = $arr; + } + return $args; + } + + /** + * Translates tax queries + * Compatible with nested tax queries introduced in WP 4.1 + * + * @since 1.7 + * + * @param array $tax_queries + * @return array translated tax queries + */ + protected function translate_tax_query_recursive( $tax_queries ) { + foreach ( $tax_queries as $key => $q ) { + if ( isset( $q['taxonomy'], $q['terms'] ) && $this->model->is_translated_taxonomy( $q['taxonomy'] ) ) { + $arr = array(); + $field = isset( $q['field'] ) && in_array( $q['field'], array( 'slug', 'name' ) ) ? $q['field'] : 'term_id'; + foreach ( (array) $q['terms'] as $t ) { + $arr[] = $this->get_translated_term_by( $field, $t, $q['taxonomy'] ); + } + + $tax_queries[ $key ]['terms'] = $arr; + } + + // Nested queries + elseif ( is_array( $q ) ) { + $tax_queries[ $key ] = $this->translate_tax_query_recursive( $q ); + } + } + + return $tax_queries; + } + + /** + * Translates a term given one field. + * + * @since 2.3.3 + * + * @param string $field Either 'slug', 'name', 'term_id', or 'term_taxonomy_id' + * @param string|int $term Search for this term value + * @param string $taxonomy Taxonomy name. + * @return string|int Translated term slug, name, term_id or term_taxonomy_id + */ + protected function get_translated_term_by( $field, $term, $taxonomy ) { + if ( 'term_id' === $field ) { + if ( $tr_id = $this->get_term( $term ) ) { + return $tr_id; + } + } else { + $terms = get_terms( $taxonomy, array( $field => $term, 'lang' => '' ) ); + + if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { + $t = reset( $terms ); + $tr_id = $this->get_term( $t->term_id ); + + if ( ! is_wp_error( $tr = get_term( $tr_id, $taxonomy ) ) ) { + return $tr->$field; + } + } + } + return $term; + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-filters-links.php b/wp-content/plugins/polylang/frontend/frontend-filters-links.php new file mode 100644 index 00000000..ef917def --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-filters-links.php @@ -0,0 +1,529 @@ +curlang = &$polylang->curlang; + $this->cache = new PLL_Cache(); + + // Rewrites author and date links to filter them by language + foreach ( array( 'feed_link', 'author_link', 'search_link', 'year_link', 'month_link', 'day_link' ) as $filter ) { + add_filter( $filter, array( $this, 'archive_link' ), 20 ); + } + + // Meta in the html head section + add_action( 'wp_head', array( $this, 'wp_head' ) ); + + // Modifies the home url + if ( ! defined( 'PLL_FILTER_HOME_URL' ) || PLL_FILTER_HOME_URL ) { + add_filter( 'home_url', array( $this, 'home_url' ), 10, 2 ); + } + + if ( $this->options['force_lang'] > 1 ) { + // Rewrites next and previous post links when not automatically done by WordPress + add_filter( 'get_pagenum_link', array( $this, 'archive_link' ), 20 ); + + add_filter( 'get_shortlink', array( $this, 'shortlink' ), 20, 2 ); + + // Rewrites ajax url + add_filter( 'admin_url', array( $this, 'admin_url' ), 10, 2 ); + } + + // Redirects to canonical url before WordPress redirect_canonical + // but after Nextgen Gallery which hacks $_SERVER['REQUEST_URI'] !!! and restores it in 'template_redirect' with priority 1 + add_action( 'template_redirect', array( $this, 'check_canonical_url' ), 4 ); + } + + /** + * Modifies the author and date links to add the language parameter ( as well as feed link ) + * + * @since 0.4 + * + * @param string $link + * @return string modified link + */ + public function archive_link( $link ) { + return $this->links_model->switch_language_in_link( $link, $this->curlang ); + } + + /** + * Modifies page links + * and caches the result + * + * @since 1.7 + * + * @param string $link post link + * @param int $post_id post ID + * @return string modified post link + */ + public function _get_page_link( $link, $post_id ) { + $cache_key = "post:{$post_id}:{$link}"; + if ( false === $_link = $this->cache->get( $cache_key ) ) { + $_link = parent::_get_page_link( $link, $post_id ); + $this->cache->set( $cache_key, $_link ); + } + return $_link; + } + + /** + * Modifies attachment links + * and caches the result + * + * @since 1.6.2 + * + * @param string $link attachment link + * @param int $post_id attachment link + * @return string modified attachment link + */ + public function attachment_link( $link, $post_id ) { + $cache_key = "post:{$post_id}:{$link}"; + if ( false === $_link = $this->cache->get( $cache_key ) ) { + $_link = parent::attachment_link( $link, $post_id ); + $this->cache->set( $cache_key, $_link ); + } + return $_link; + } + + /** + * Modifies custom posts links + * and caches the result + * + * @since 1.6 + * + * @param string $link post link + * @param object $post post object + * @return string modified post link + */ + public function post_type_link( $link, $post ) { + $cache_key = "post:{$post->ID}:{$link}"; + if ( false === $_link = $this->cache->get( $cache_key ) ) { + $_link = parent::post_type_link( $link, $post ); + $this->cache->set( $cache_key, $_link ); + } + return $_link; + } + + /** + * Modifies filtered taxonomies ( post format like ) and translated taxonomies links + * and caches the result + * + * @since 0.7 + * + * @param string $link + * @param object $term term object + * @param string $tax taxonomy name + * @return string modified link + */ + public function term_link( $link, $term, $tax ) { + $cache_key = "term:{$term->term_id}:{$link}"; + if ( false === $_link = $this->cache->get( $cache_key ) ) { + if ( in_array( $tax, $this->model->get_filtered_taxonomies() ) ) { + $_link = $this->links_model->switch_language_in_link( $link, $this->curlang ); + + /** This filter is documented in include/filters-links.php */ + $_link = apply_filters( 'pll_term_link', $_link, $this->curlang, $term ); + } + + else { + $_link = parent::term_link( $link, $term, $tax ); + } + $this->cache->set( $cache_key, $_link ); + } + return $_link; + } + + /** + * Modifies the post short link when using one domain or subdomain per language. + * + * @since 2.6.9 + * + * @param string $link Post permalink. + * @param int $post_id Post id. + * @return Post permalink with the correct domain. + */ + public function shortlink( $link, $post_id ) { + $post_type = get_post_type( $post_id ); + return $this->model->is_translated_post_type( $post_type ) ? $this->links_model->switch_language_in_link( $link, $this->model->post->get_language( $post_id ) ) : $link; + } + + /** + * Outputs references to translated pages ( if exists ) in the html head section + * + * @since 0.1 + */ + public function wp_head() { + // Don't output anything on paged archives: see https://wordpress.org/support/topic/hreflang-on-page2 + // Don't output anything on paged pages and paged posts + if ( is_paged() || ( is_singular() && ( $page = get_query_var( 'page' ) ) && $page > 1 ) ) { + return; + } + + $urls = array(); + + // Google recommends to include self link https://support.google.com/webmasters/answer/189077?hl=en + foreach ( $this->model->get_languages_list() as $language ) { + if ( $url = $this->links->get_translation_url( $language ) ) { + $urls[ $language->get_locale( 'display' ) ] = $url; + } + } + + // Outputs the section only if there are translations ( $urls always contains self link ) + if ( ! empty( $urls ) && count( $urls ) > 1 ) { + $languages = array(); + $hreflangs = array(); + + // Prepare the list of languages to remove the country code + foreach ( array_keys( $urls ) as $locale ) { + $split = explode( '-', $locale ); + $languages[ $locale ] = reset( $split ); + } + + $count = array_count_values( $languages ); + + foreach ( $urls as $locale => $url ) { + $lang = $count[ $languages[ $locale ] ] > 1 ? $locale : $languages[ $locale ]; // Output the country code only when necessary + $hreflangs[ $lang ] = $url; + } + + // Adds the site root url when the default language code is not hidden + // See https://wordpress.org/support/topic/implementation-of-hreflangx-default + if ( is_front_page() && ! $this->options['hide_default'] && $this->options['force_lang'] < 3 ) { + $hreflangs['x-default'] = home_url( '/' ); + } + + /** + * Filters the list of rel hreflang attributes + * + * @since 2.1 + * + * @param array $hreflangs Array of urls with language codes as keys + */ + $hreflangs = apply_filters( 'pll_rel_hreflang_attributes', $hreflangs ); + + foreach ( $hreflangs as $lang => $url ) { + printf( '' . "\n", esc_url( $url ), esc_attr( $lang ) ); + } + } + } + + /** + * Filters the home url to get the right language + * + * @since 0.4 + * + * @param string $url + * @param string $path + * @return string + */ + public function home_url( $url, $path ) { + if ( ! ( did_action( 'template_redirect' ) || did_action( 'login_init' ) ) || rtrim( $url, '/' ) != $this->links_model->home ) { + return $url; + } + + // We *want* to filter the home url in these cases + if ( empty( $this->white_list ) ) { + // On Windows get_theme_root() mixes / and \ + // We want only \ for the comparison with debug_backtrace + $theme_root = get_theme_root(); + $theme_root = ( false === strpos( $theme_root, '\\' ) ) ? $theme_root : str_replace( '/', '\\', $theme_root ); + + /** + * Filter the white list of the Polylang 'home_url' filter + * The $args contains an array of arrays each of them having + * a 'file' key and/or a 'function' key to decide which functions in + * which files using home_url() calls must be filtered + * + * @since 1.1.2 + * + * @param array $args + */ + $this->white_list = apply_filters( + 'pll_home_url_white_list', + array( + array( 'file' => $theme_root ), + array( 'function' => 'wp_nav_menu' ), + array( 'function' => 'login_footer' ), + array( 'function' => 'get_custom_logo' ), + ) + ); + } + + // We don't want to filter the home url in these cases + if ( empty( $this->black_list ) ) { + + /** + * Filter the black list of the Polylang 'home_url' filter + * The $args contains an array of arrays each of them having + * a 'file' key and/or a 'function' key to decide which functions in + * which files using home_url() calls must be filtered + * + * @since 1.1.2 + * + * @param array $args + */ + $this->black_list = apply_filters( + 'pll_home_url_black_list', + array( + array( 'file' => 'searchform.php' ), // Since WP 3.6 searchform.php is passed through get_search_form + array( 'function' => 'get_search_form' ), + ) + ); + } + + $traces = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + unset( $traces[0], $traces[1] ); // We don't need the last 2 calls: this function + call_user_func_array (or apply_filters on PHP7+) + + foreach ( $traces as $trace ) { + // Black list first + foreach ( $this->black_list as $v ) { + if ( ( isset( $trace['file'], $v['file'] ) && false !== strpos( $trace['file'], $v['file'] ) ) || ( isset( $trace['function'], $v['function'] ) && $trace['function'] == $v['function'] ) ) { + return $url; + } + } + + foreach ( $this->white_list as $v ) { + if ( ( isset( $trace['function'], $v['function'] ) && $trace['function'] == $v['function'] ) || + ( isset( $trace['file'], $v['file'] ) && false !== strpos( $trace['file'], $v['file'] ) && in_array( $trace['function'], array( 'home_url', 'get_home_url', 'bloginfo', 'get_bloginfo' ) ) ) ) { + $ok = true; + } + } + } + + return empty( $ok ) ? $url : ( empty( $path ) ? rtrim( $this->links->get_home_url( $this->curlang ), '/' ) : $this->links->get_home_url( $this->curlang ) ); + } + + /** + * Rewrites ajax url when using domains or subdomains + * + * @since 1.5 + * + * @param string $url admin url with path evaluated by WordPress + * @param string $path admin path + * @return string + */ + public function admin_url( $url, $path ) { + return 'admin-ajax.php' === $path ? $this->links_model->switch_language_in_link( $url, $this->curlang ) : $url; + } + + /** + * If the language code is not in agreement with the language of the content + * redirects incoming links to the proper URL to avoid duplicate content + * + * @since 0.9.6 + * + * @param string $requested_url optional + * @param bool $do_redirect optional, whether to perform the redirection or not + * @return string if redirect is not performed + */ + public function check_canonical_url( $requested_url = '', $do_redirect = true ) { + global $wp_query, $post, $is_IIS; + + // Don't redirect in same cases as WP + if ( is_trackback() || is_search() || is_admin() || is_preview() || is_robots() || ( $is_IIS && ! iis7_supports_permalinks() ) ) { + return; + } + + // Don't redirect mysite.com/?attachment_id= to mysite.com/en/?attachment_id= + if ( 1 == $this->options['force_lang'] && is_attachment() && isset( $_GET['attachment_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + return; + } + + // If the default language code is not hidden and the static front page url contains the page name + // the customizer lands here and the code below would redirect to the list of posts + if ( is_customize_preview() ) { + return; + } + + if ( empty( $requested_url ) ) { + $requested_url = pll_get_requested_url(); + } + + if ( is_single() || is_page() ) { + if ( isset( $post->ID ) && $this->model->is_translated_post_type( $post->post_type ) ) { + $language = $this->model->post->get_language( (int) $post->ID ); + } + } + + elseif ( $this->links_model->using_permalinks && is_category() && ! empty( $wp_query->query['cat'] ) ) { + // When we receive a plain permaling with a cat query var, we need to redirect to the pretty permalink. + if ( $this->model->is_translated_taxonomy( $this->get_queried_taxonomy( $wp_query->tax_query ) ) ) { + $term_id = $this->get_queried_term_id( $wp_query->tax_query ); + $language = $this->model->term->get_language( $term_id ); + $redirect_url = $this->maybe_add_page_to_redirect_url( get_term_link( $term_id ) ); + } + } + + elseif ( is_category() || is_tag() || is_tax() ) { + // We need to switch the language when there is no language provided in a pretty permalink. + $obj = $wp_query->get_queried_object(); + if ( ! empty( $obj ) && $this->model->is_translated_taxonomy( $obj->taxonomy ) ) { + $language = $this->model->term->get_language( (int) $obj->term_id ); + } + } + + elseif ( is_404() && ! empty( $wp_query->tax_query ) ) { + // When a wrong language is passed through a pretty permalink, we just need to switch the language. + if ( $this->model->is_translated_taxonomy( $this->get_queried_taxonomy( $wp_query->tax_query ) ) ) { + $term_id = $this->get_queried_term_id( $wp_query->tax_query ); + $language = $this->model->term->get_language( $term_id ); + } + } + + elseif ( $this->links_model->using_permalinks && $wp_query->is_posts_page && ! empty( $wp_query->query['page_id'] ) && $id = get_query_var( 'page_id' ) ) { + $language = $this->model->post->get_language( (int) $id ); + $redirect_url = $this->maybe_add_page_to_redirect_url( get_permalink( $id ) ); + } + + elseif ( $wp_query->is_posts_page ) { + $obj = $wp_query->get_queried_object(); + $language = $this->model->post->get_language( (int) $obj->ID ); + } + + if ( 3 === $this->options['force_lang'] ) { + $requested_host = wp_parse_url( $requested_url, PHP_URL_HOST ); + foreach ( $this->options['domains'] as $lang => $domain ) { + $host = wp_parse_url( $domain, PHP_URL_HOST ); + if ( 'www.' . $requested_host === $host || 'www.' . $host === $requested_host ) { + $language = $this->model->get_language( $lang ); + $redirect_url = str_replace( '://' . $requested_host, '://' . $host, $requested_url ); + } + } + } + + if ( empty( $language ) ) { + $language = $this->curlang; + $redirect_url = $requested_url; + } elseif ( empty( $redirect_url ) ) { + // First get the canonical url evaluated by WP + // Workaround a WP bug which removes the port for some urls and get it back at second call to redirect_canonical + $_redirect_url = ( ! $_redirect_url = redirect_canonical( $requested_url, false ) ) ? $requested_url : $_redirect_url; + $redirect_url = ( ! $redirect_url = redirect_canonical( $_redirect_url, false ) ) ? $_redirect_url : $redirect_url; + + // Then get the right language code in url + $redirect_url = $this->options['force_lang'] ? + $this->links_model->switch_language_in_link( $redirect_url, $language ) : + $this->links_model->remove_language_from_link( $redirect_url ); // Works only for default permalinks + } + + /** + * Filters the canonical url detected by Polylang + * + * @since 1.6 + * + * @param bool|string $redirect_url false or the url to redirect to + * @param object $language the language detected + */ + $redirect_url = apply_filters( 'pll_check_canonical_url', $redirect_url, $language ); + + // The language is not correctly set so let's redirect to the correct url for this object + if ( $do_redirect && $redirect_url && $requested_url != $redirect_url ) { + wp_safe_redirect( $redirect_url, 301, POLYLANG ); + exit; + } + + return $redirect_url; + } + + /** + * Returns the link to the paged page if requested. + * + * @since 2.9 + * + * @param string $redirect_url The url to redirect to. + * @return string + */ + protected function maybe_add_page_to_redirect_url( $redirect_url ) { + global $wp_query; + + if ( ! empty( $wp_query->query['paged'] ) && $page = get_query_var( 'paged' ) ) { + $redirect_url = $this->links_model->add_paged_to_link( $redirect_url, $page ); + } + return $redirect_url; + } + + /** + * Returns the term_id of the requested term. + * + * @since 2.9 + * + * @param object $tax_query An instance of WP_Tax_Query. + * @return int + */ + protected function get_queried_term_id( $tax_query ) { + $queried_terms = $tax_query->queried_terms; + $taxonomy = $this->get_queried_taxonomy( $tax_query ); + + $field = $queried_terms[ $taxonomy ]['field']; + $term = reset( $queried_terms[ $taxonomy ]['terms'] ); + + // We can get a term_id when requesting a plain permalink, eg /?cat=1. + if ( 'term_id' === $field ) { + return $term; + } + + // We get a slug when requesting a pretty permalink with the wrong language. + $args = array( + 'lang' => '', + 'taxonomy' => $taxonomy, + $field => $term, + 'hide_empty' => false, + 'fields' => 'ids', + ); + $terms = get_terms( $args ); + return reset( $terms ); + } + + /** + * Find the taxonomy being queried. + * + * @since 2.9 + * + * @param object $tax_query An instance of WP_Tax_Query. + * @return string A taxonomy slug + */ + protected function get_queried_taxonomy( $tax_query ) { + $queried_terms = $tax_query->queried_terms; + unset( $queried_terms['language'] ); + + return key( $queried_terms ); + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-filters-search.php b/wp-content/plugins/polylang/frontend/frontend-filters-search.php new file mode 100644 index 00000000..d4ab31c1 --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-filters-search.php @@ -0,0 +1,137 @@ +links_model = &$polylang->links_model; + $this->curlang = &$polylang->curlang; + + // Adds the language information in the search form + // Low priority in case the search form is created using the same filter as described in http://codex.wordpress.org/Function_Reference/get_search_form + add_filter( 'get_search_form', array( $this, 'get_search_form' ), 99 ); + + // Adds the language information in admin bar search form + add_action( 'add_admin_bar_menus', array( $this, 'add_admin_bar_menus' ) ); + + // Adds javascript at the end of the document + // Was used for WP < 3.6. kept just in case + if ( defined( 'PLL_SEARCH_FORM_JS' ) && PLL_SEARCH_FORM_JS ) { + add_action( 'wp_footer', array( $this, 'wp_print_footer_scripts' ) ); + } + } + + /** + * Adds the language information in the search form + * Does not work if searchform.php ( prior to WP 3.6 ) is used or if the search form is hardcoded in another template file + * + * @since 0.1 + * + * @param string $form Search form + * @return string Modified search form + */ + public function get_search_form( $form ) { + if ( $form ) { + if ( $this->links_model->using_permalinks ) { + // Take care to modify only the url in the
tag. + preg_match( '##', $form, $matches ); + $old = reset( $matches ); + $new = preg_replace( '#' . esc_url( $this->links_model->home ) . '\/?#', esc_url( $this->curlang->search_url ), $old ); + $form = str_replace( $old, $new, $form ); + } + else { + $form = str_replace( '', '', $form ); + } + } + + return $form; + } + + /** + * Adds the language information in admin bar search form + * + * @since 1.2 + */ + public function add_admin_bar_menus() { + remove_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 ); + add_action( 'admin_bar_menu', array( $this, 'admin_bar_search_menu' ), 4 ); + } + + /** + * Rewrites the admin bar search form to pass our get_search_form filter. See #21342. + * Code last checked: WP 5.4.1. + * + * @since 0.9 + * + * @param WP_Admin_Bar $wp_admin_bar + */ + public function admin_bar_search_menu( $wp_admin_bar ) { + $form = '
'; + $form .= ''; + $form .= ''; + $form .= ''; + $form .= '
'; + + $wp_admin_bar->add_node( + array( + 'parent' => 'top-secondary', + 'id' => 'search', + 'title' => $this->get_search_form( $form ), // Pass the get_search_form filter. + 'meta' => array( + 'class' => 'admin-bar-search', + 'tabindex' => -1, + ), + ) + ); + } + + /** + * Allows modifying the search form if it does not pass get_search_form + * + * @since 0.1 + */ + public function wp_print_footer_scripts() { + // Don't use directly e[0] just in case there is somewhere else an element named 's' + // Check before if the hidden input has not already been introduced by get_search_form ( FIXME: is there a way to improve this ) ? + // Thanks to AndyDeGroo for improving the code for compatibility with old browsers + // http://wordpress.org/support/topic/development-of-polylang-version-08?replies=6#post-2645559 + $lang = esc_js( $this->curlang->slug ); + $js = "//"; + echo ''; // phpcs:ignore WordPress.Security.EscapeOutput + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-filters.php b/wp-content/plugins/polylang/frontend/frontend-filters.php new file mode 100644 index 00000000..22744372 --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-filters.php @@ -0,0 +1,254 @@ +cache = new PLL_Cache(); + + // Filters the WordPress locale + add_filter( 'locale', array( $this, 'get_locale' ) ); + + // Filter sticky posts by current language + add_filter( 'option_sticky_posts', array( $this, 'option_sticky_posts' ) ); + + // Rewrites archives links to filter them by language + add_filter( 'getarchives_join', array( $this, 'getarchives_join' ), 10, 2 ); + add_filter( 'getarchives_where', array( $this, 'getarchives_where' ), 10, 2 ); + + // Filters the widgets according to the current language + add_filter( 'widget_display_callback', array( $this, 'widget_display_callback' ) ); + add_filter( 'sidebars_widgets', array( $this, 'sidebars_widgets' ) ); + + if ( $this->options['media_support'] ) { + add_filter( 'widget_media_image_instance', array( $this, 'widget_media_instance' ), 1 ); // Since WP 4.8 + } + + // Strings translation ( must be applied before WordPress applies its default formatting filters ) + foreach ( array( 'widget_text', 'widget_title' ) as $filter ) { + add_filter( $filter, 'pll__', 1 ); + } + + // Translates biography + add_filter( 'get_user_metadata', array( $this, 'get_user_metadata' ), 10, 4 ); + + // FIXME test get_user_locale for backward compatibility with WP < 4.7 + if ( Polylang::is_ajax_on_front() && function_exists( 'get_user_locale' ) ) { + add_filter( 'load_textdomain_mofile', array( $this, 'load_textdomain_mofile' ) ); + } + } + + /** + * Returns the locale based on current language + * + * @since 0.1 + * + * @return string + */ + public function get_locale() { + return $this->curlang->locale; + } + + /** + * Filters sticky posts by current language + * + * @since 0.8 + * + * @param array $posts list of sticky posts ids + * @return array modified list of sticky posts ids + */ + public function option_sticky_posts( $posts ) { + global $wpdb; + + // Do not filter sticky posts on REST requests as $this->curlang is *not* the 'lang' parameter set in the request + if ( ! defined( 'REST_REQUEST' ) && $this->curlang && ! empty( $posts ) ) { + $_posts = wp_cache_get( 'sticky_posts', 'options' ); // This option is usually cached in 'all_options' by WP + + if ( empty( $_posts ) || ! is_array( $_posts[ $this->curlang->term_taxonomy_id ] ) ) { + $posts = array_map( 'intval', $posts ); + $posts = implode( ',', $posts ); + + $languages = $this->model->get_languages_list( array( 'fields' => 'term_taxonomy_id' ) ); + $_posts = array_fill_keys( $languages, array() ); // Init with empty arrays + $languages = implode( ',', $languages ); + + // PHPCS:ignore WordPress.DB.PreparedSQL + $relations = $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN ({$posts}) AND term_taxonomy_id IN ({$languages})" ); + + foreach ( $relations as $relation ) { + $_posts[ $relation->term_taxonomy_id ][] = (int) $relation->object_id; + } + wp_cache_add( 'sticky_posts', $_posts, 'options' ); + } + + $posts = $_posts[ $this->curlang->term_taxonomy_id ]; + } + + return $posts; + } + + /** + * Modifies the sql request for wp_get_archives to filter by the current language + * + * @since 1.9 + * + * @param string $sql JOIN clause + * @param array $r wp_get_archives arguments + * @return string modified JOIN clause + */ + public function getarchives_join( $sql, $r ) { + return ! empty( $r['post_type'] ) && $this->model->is_translated_post_type( $r['post_type'] ) ? $sql . $this->model->post->join_clause() : $sql; + } + + /** + * Modifies the sql request for wp_get_archives to filter by the current language + * + * @since 1.9 + * + * @param string $sql WHERE clause + * @param array $r wp_get_archives arguments + * @return string modified WHERE clause + */ + public function getarchives_where( $sql, $r ) { + return ! empty( $r['post_type'] ) && $this->model->is_translated_post_type( $r['post_type'] ) ? $sql . $this->model->post->where_clause( $this->curlang ) : $sql; + } + + /** + * Filters the widgets according to the current language + * Don't display if a language filter is set and this is not the current one + * + * @since 0.3 + * + * @param array $instance Widget settings + * @return bool|array false if we hide the widget, unmodified $instance otherwise + */ + public function widget_display_callback( $instance ) { + // FIXME it looks like this filter is useless, now the we use the filter sidebars_widgets + return ! empty( $instance['pll_lang'] ) && $instance['pll_lang'] != $this->curlang->slug ? false : $instance; + } + + /** + * Remove widgets from sidebars if they are not visible in the current language + * Needed to allow is_active_sidebar() to return false if all widgets are not for the current language. See #54 + * + * @since 2.1 + * @since 2.4 The result is cached as the function can be very expensive in case there are a lot of widgets + * + * @param array $sidebars_widgets An associative array of sidebars and their widgets + * @return array + */ + public function sidebars_widgets( $sidebars_widgets ) { + global $wp_registered_widgets; + + if ( empty( $wp_registered_widgets ) ) { + return $sidebars_widgets; + } + + $cache_key = md5( maybe_serialize( $sidebars_widgets ) ); + $_sidebars_widgets = $this->cache->get( "sidebars_widgets_{$cache_key}" ); + + if ( false !== $_sidebars_widgets ) { + return $_sidebars_widgets; + } + + foreach ( $sidebars_widgets as $sidebar => $widgets ) { + if ( 'wp_inactive_widgets' === $sidebar || empty( $widgets ) ) { + continue; + } + + foreach ( $widgets as $key => $widget ) { + // Nothing can be done if the widget is created using pre WP2.8 API :( + // There is no object, so we can't access it to get the widget options + if ( ! isset( $wp_registered_widgets[ $widget ]['callback'] ) || ! is_array( $wp_registered_widgets[ $widget ]['callback'] ) || ! isset( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! is_object( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! method_exists( $wp_registered_widgets[ $widget ]['callback'][0], 'get_settings' ) ) { + continue; + } + + $widget_settings = $wp_registered_widgets[ $widget ]['callback'][0]->get_settings(); + $number = $wp_registered_widgets[ $widget ]['params'][0]['number']; + + // Remove the widget if not visible in the current language + if ( ! empty( $widget_settings[ $number ]['pll_lang'] ) && $widget_settings[ $number ]['pll_lang'] !== $this->curlang->slug ) { + unset( $sidebars_widgets[ $sidebar ][ $key ] ); + } + } + } + + $this->cache->set( "sidebars_widgets_{$cache_key}", $sidebars_widgets ); + + return $sidebars_widgets; + } + + /** + * Translates media in media widgets + * + * @since 2.1.5 + * + * @param array $instance Widget instance data + * @return array + */ + public function widget_media_instance( $instance ) { + if ( empty( $instance['pll_lang'] ) && $instance['attachment_id'] && $tr_id = pll_get_post( $instance['attachment_id'] ) ) { + $instance['attachment_id'] = $tr_id; + $attachment = get_post( $tr_id ); + + if ( $instance['caption'] && ! empty( $attachment->post_excerpt ) ) { + $instance['caption'] = $attachment->post_excerpt; + } + + if ( $instance['alt'] && $alt_text = get_post_meta( $tr_id, '_wp_attachment_image_alt', true ) ) { + $instance['alt'] = $alt_text; + } + + if ( $instance['image_title'] && ! empty( $attachment->post_title ) ) { + $instance['image_title'] = $attachment->post_title; + } + } + return $instance; + } + + /** + * Translates biography + * + * @since 0.9 + * + * @param null $null + * @param int $id User id + * @param string $meta_key + * @param bool $single Whether to return only the first value of the specified $meta_key + * @return null|string + */ + public function get_user_metadata( $null, $id, $meta_key, $single ) { + return 'description' === $meta_key && $this->curlang->slug !== $this->options['default_lang'] ? get_user_meta( $id, 'description_' . $this->curlang->slug, $single ) : $null; + } + + /** + * Filters the translation files to load when doing ajax on front + * This is needed because WP the language files associated to the user locale when a user is logged in + * + * @since 2.2.6 + * + * @param string $mofile Translation file name + * @return string + */ + public function load_textdomain_mofile( $mofile ) { + $user_locale = get_user_locale(); + return str_replace( "{$user_locale}.mo", "{$this->curlang->locale}.mo", $mofile ); + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-links.php b/wp-content/plugins/polylang/frontend/frontend-links.php new file mode 100644 index 00000000..71f3b651 --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-links.php @@ -0,0 +1,216 @@ +curlang = &$polylang->curlang; + $this->cache = new PLL_Cache(); + + } + + /** + * Returns the url of the translation ( if exists ) of the current page + * + * @since 0.1 + * + * @param object $language + * @return string + */ + public function get_translation_url( $language ) { + global $wp_query; + + if ( false !== $translation_url = $this->cache->get( 'translation_url:' . $language->slug ) ) { + return $translation_url; + } + + // Make sure that we have the queried object + // See https://wordpress.org/support/topic/patch-for-fixing-a-notice + $queried_object_id = $wp_query->get_queried_object_id(); + + /** + * Filter the translation url before Polylang attempts to find one + * Internally used by Polylang for the static front page and posts page + * + * @since 1.8 + * + * @param string $url Empty or the url of the translation of teh current page + * @param object $language Language of the translation + * @param int $queried_object_id Queried object id + */ + if ( ! $url = apply_filters( 'pll_pre_translation_url', '', $language, $queried_object_id ) ) { + $qv = $wp_query->query_vars; + + // Post and attachment + if ( is_single() && ( $this->options['media_support'] || ! is_attachment() ) && ( $id = $this->model->post->get( $queried_object_id, $language ) ) && $this->model->post->current_user_can_read( $id ) ) { + $url = get_permalink( $id ); + } + + // Page + elseif ( is_page() && ( $id = $this->model->post->get( $queried_object_id, $language ) ) && $this->model->post->current_user_can_read( $id ) ) { + $url = get_page_link( $id ); + } + + elseif ( is_search() ) { + $url = $this->get_archive_url( $language ); + + // Special case for search filtered by translated taxonomies: taxonomy terms are translated in the translation url + if ( ! empty( $wp_query->tax_query->queries ) ) { + foreach ( $wp_query->tax_query->queries as $tax_query ) { + if ( ! empty( $tax_query['taxonomy'] ) && $this->model->is_translated_taxonomy( $tax_query['taxonomy'] ) ) { + + $tax = get_taxonomy( $tax_query['taxonomy'] ); + $terms = get_terms( $tax->name, array( 'fields' => 'id=>slug' ) ); // Filtered by current language + + foreach ( $tax_query['terms'] as $slug ) { + $term_id = array_search( $slug, $terms ); // What is the term_id corresponding to taxonomy term? + if ( $term_id && $term_id = $this->model->term->get_translation( $term_id, $language ) ) { // Get the translated term_id + $term = get_term( $term_id, $tax->name ); + $url = str_replace( $slug, $term->slug, $url ); + } + } + } + } + } + } + + // Translated taxonomy + // Take care that is_tax() is false for categories and tags + elseif ( ( is_category() || is_tag() || is_tax() ) && ( $term = get_queried_object() ) && $this->model->is_translated_taxonomy( $term->taxonomy ) ) { + $lang = $this->model->term->get_language( $term->term_id ); + + if ( ! $lang || $language->slug == $lang->slug ) { + $url = get_term_link( $term, $term->taxonomy ); // Self link + } + + elseif ( $tr_id = $this->model->term->get_translation( $term->term_id, $language ) ) { + if ( $tr_term = get_term( $tr_id, $term->taxonomy ) ) { + // Check if translated term ( or children ) have posts + $count = $tr_term->count || ( is_taxonomy_hierarchical( $term->taxonomy ) && array_sum( wp_list_pluck( get_terms( $term->taxonomy, array( 'child_of' => $tr_term->term_id, 'lang' => $language->slug ) ), 'count' ) ) ); + + /** + * Filter whether to hide an archive translation url + * + * @since 2.2.4 + * + * @param bool $hide True to hide the translation url. + * defaults to true when the translated archive is empty, false otherwise. + * @param string $lang The language code of the translation + * @param array $args Arguments used to evaluated the number of posts in the archive + */ + if ( ! apply_filters( 'pll_hide_archive_translation_url', ! $count, $language->slug, array( 'taxonomy' => $term->taxonomy ) ) ) { + $url = get_term_link( $tr_term, $term->taxonomy ); + } + } + } + } + + // Post type archive + elseif ( is_post_type_archive() ) { + if ( $this->model->is_translated_post_type( $qv['post_type'] ) ) { + $args = array( 'post_type' => $qv['post_type'] ); + $count = $this->model->count_posts( $language, $args ); + + /** This filter is documented in frontend/frontend-links.php */ + if ( ! apply_filters( 'pll_hide_archive_translation_url', ! $count, $language->slug, $args ) ) { + $url = $this->get_archive_url( $language ); + } + } + } + + // Other archives + elseif ( is_archive() ) { + $keys = array( 'post_type', 'm', 'year', 'monthnum', 'day', 'author', 'author_name' ); + $keys = array_merge( $keys, $this->model->get_filtered_taxonomies_query_vars() ); + $args = array_intersect_key( $qv, array_flip( $keys ) ); + $count = $this->model->count_posts( $language, $args ); + + /** This filter is documented in frontend/frontend-links.php */ + if ( ! apply_filters( 'pll_hide_archive_translation_url', ! $count, $language->slug, $args ) ) { + $url = $this->get_archive_url( $language ); + } + } + + // Front page when it is the list of posts + elseif ( is_front_page() ) { + $url = $this->get_home_url( $language ); + } + } + + /** + * Filter the translation url of the current page before Polylang caches it + * + * @since 1.1.2 + * + * @param null|string $url The translation url, null if none was found + * @param string $language The language code of the translation + */ + $translation_url = apply_filters( 'pll_translation_url', ( isset( $url ) && ! is_wp_error( $url ) ? $url : null ), $language->slug ); + + // Don't cache before template_redirect to avoid a conflict with Barrel + WP Bakery Page Builder + if ( did_action( 'template_redirect' ) ) { + $this->cache->set( 'translation_url:' . $language->slug, $translation_url ); + } + + return $translation_url; + } + + /** + * Get the translation of the current archive url + * used also for search + * + * @since 1.2 + * + * @param object $language + * @return string + */ + public function get_archive_url( $language ) { + $url = pll_get_requested_url(); + $url = $this->links_model->switch_language_in_link( $url, $language ); + $url = $this->links_model->remove_paged_from_link( $url ); + + /** + * Filter the archive url + * + * @since 1.6 + * + * @param string $url Url of the archive + * @param object $language Language of the archive + */ + return apply_filters( 'pll_get_archive_url', $url, $language ); + } + + /** + * Returns the home url in the right language + * + * @since 0.1 + * + * @param object $language Optional, defaults to current language + * @param bool $is_search Optional, whether we need the home url for a search form, defaults to false + */ + public function get_home_url( $language = '', $is_search = false ) { + if ( empty( $language ) ) { + $language = $this->curlang; + } + + return parent::get_home_url( $language, $is_search ); + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-nav-menu.php b/wp-content/plugins/polylang/frontend/frontend-nav-menu.php new file mode 100644 index 00000000..13294a58 --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-nav-menu.php @@ -0,0 +1,323 @@ +curlang = &$polylang->curlang; + + // Split the language switcher menu item in several language menu items + add_filter( 'wp_get_nav_menu_items', array( $this, 'wp_get_nav_menu_items' ), 20 ); // after the customizer menus + add_filter( 'wp_nav_menu_objects', array( $this, 'wp_nav_menu_objects' ) ); + add_filter( 'nav_menu_link_attributes', array( $this, 'nav_menu_link_attributes' ), 10, 2 ); + + // Filters menus by language + add_filter( 'theme_mod_nav_menu_locations', array( $this, 'nav_menu_locations' ), 20 ); + add_filter( 'wp_nav_menu_args', array( $this, 'wp_nav_menu_args' ) ); + + // The customizer + if ( isset( $_POST['wp_customize'], $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + add_filter( 'wp_nav_menu_args', array( $this, 'filter_args_before_customizer' ) ); + add_filter( 'wp_nav_menu_args', array( $this, 'filter_args_after_customizer' ), 2000 ); + } + } + + /** + * Sort menu items by menu order + * + * @since 1.7.9 + * + * @param object $a The first object to compare + * @param object $b The second object to compare + * @return int -1 or 1 if $a is considered to be respectively less than or greater than $b. + */ + protected function usort_menu_items( $a, $b ) { + return ( $a->menu_order < $b->menu_order ) ? -1 : 1; + } + + /** + * Format a language switcher menu item title based on options + * + * @since 2.2.6 + * + * @param string $flag Formatted flag + * @param string $name Language name + * @param array $options Language switcher options + * @return string Formatted menu item title + */ + protected function get_item_title( $flag, $name, $options ) { + if ( $options['show_flags'] ) { + if ( $options['show_names'] ) { + $title = sprintf( '%1$s%3$s', $flag, is_rtl() ? 'right' : 'left', esc_html( $name ) ); + } else { + $title = $flag; + } + } else { + $title = esc_html( $name ); + } + return $title; + } + + /** + * Splits the one item of backend in several items on frontend + * take care to menu_order as it is used later in wp_nav_menu + * + * @since 1.1.1 + * + * @param array $items menu items + * @return array modified items + */ + public function wp_get_nav_menu_items( $items ) { + if ( doing_action( 'customize_register' ) ) { // needed since WP 4.3, doing_action available since WP 3.9 + return $items; + } + + // The customizer menus does not sort the items and we need them to be sorted before splitting the language switcher + usort( $items, array( $this, 'usort_menu_items' ) ); + + $new_items = array(); + $offset = 0; + + foreach ( $items as $item ) { + if ( $options = get_post_meta( $item->ID, '_pll_menu_item', true ) ) { + $i = 0; + + /** This filter is documented in include/switcher.php */ + $options = apply_filters( 'pll_the_languages_args', $options ); // Honor the filter here for 'show_flags', 'show_names' and 'dropdown'. + + $switcher = new PLL_Switcher(); + $args = array_merge( array( 'raw' => 1 ), $options ); + $the_languages = $switcher->the_languages( PLL()->links, $args ); + + // parent item for dropdown + if ( ! empty( $options['dropdown'] ) ) { + $name = isset( $options['display_names_as'] ) && 'slug' === $options['display_names_as'] ? $this->curlang->slug : $this->curlang->name; + $item->title = $this->get_item_title( $this->curlang->get_display_flag(), $name, $options ); + $item->attr_title = ''; + $item->classes = array( 'pll-parent-menu-item' ); + $new_items[] = $item; + $offset++; + } + + foreach ( $the_languages as $lang ) { + $lang_item = clone $item; + $lang_item->ID = $lang_item->ID . '-' . $lang['slug']; // A unique ID + $lang_item->title = $this->get_item_title( $lang['flag'], $lang['name'], $options ); + $lang_item->attr_title = ''; + $lang_item->url = $lang['url']; + $lang_item->lang = $lang['locale']; // Save this for use in nav_menu_link_attributes + $lang_item->classes = $lang['classes']; + $lang_item->menu_order += $offset + $i++; + if ( ! empty( $options['dropdown'] ) ) { + $lang_item->menu_item_parent = $item->db_id; + $lang_item->db_id = 0; // to avoid recursion + } + $new_items[] = $lang_item; + } + $offset += $i - 1; + } else { + $item->menu_order += $offset; + $new_items[] = $item; + } + } + return $new_items; + } + + /** + * Returns the ancestors of a menu item + * + * @since 1.1.1 + * + * @param object $item + * @return array ancestors ids + */ + public function get_ancestors( $item ) { + $ids = array(); + $_anc_id = (int) $item->db_id; + while ( ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) && ! in_array( $_anc_id, $ids ) ) { + $ids[] = $_anc_id; + } + return $ids; + } + + /** + * Removes current-menu and current-menu-ancestor classes to lang switcher when not on the home page + * + * @since 1.1.1 + * + * @param array $items + * @return array modified menu items + */ + public function wp_nav_menu_objects( $items ) { + $r_ids = $k_ids = array(); + + foreach ( $items as $item ) { + if ( ! empty( $item->classes ) && is_array( $item->classes ) ) { + if ( in_array( 'current-lang', $item->classes ) ) { + $item->current = false; + $item->classes = array_diff( $item->classes, array( 'current-menu-item' ) ); + $r_ids = array_merge( $r_ids, $this->get_ancestors( $item ) ); // Remove the classes for these ancestors + } elseif ( in_array( 'current-menu-item', $item->classes ) ) { + $k_ids = array_merge( $k_ids, $this->get_ancestors( $item ) ); // Keep the classes for these ancestors + } + } + } + + $r_ids = array_diff( $r_ids, $k_ids ); + + foreach ( $items as $item ) { + if ( ! empty( $item->db_id ) && in_array( $item->db_id, $r_ids ) ) { + $item->classes = array_diff( $item->classes, array( 'current-menu-ancestor', 'current-menu-parent', 'current_page_parent', 'current_page_ancestor' ) ); + } + } + + return $items; + } + + /** + * Adds hreflang attribute for the language switcher menu items + * available since WP 3.6 + * + * @since 1.1 + * + * @param array $atts + * @param object $item + * @return array modified $atts + */ + public function nav_menu_link_attributes( $atts, $item ) { + if ( isset( $item->lang ) ) { + $atts['lang'] = $atts['hreflang'] = esc_attr( $item->lang ); + } + return $atts; + } + + /** + * Fills the theme nav menus locations with the right menu in the right language + * Needs to wait for the language to be defined + * + * @since 1.2 + * + * @param array|bool $menus list of nav menus locations, false if menu locations have not been filled yet + * @return array|bool modified list of nav menus locations + */ + public function nav_menu_locations( $menus ) { + if ( is_array( $menus ) && ! empty( $this->curlang ) ) { + // First get multilingual menu locations from DB + $theme = get_option( 'stylesheet' ); + + foreach ( array_keys( $menus ) as $loc ) { + $menus[ $loc ] = empty( $this->options['nav_menus'][ $theme ][ $loc ][ $this->curlang->slug ] ) ? 0 : $this->options['nav_menus'][ $theme ][ $loc ][ $this->curlang->slug ]; + } + + // Support for theme customizer + if ( is_customize_preview() ) { + global $wp_customize; + foreach ( $wp_customize->unsanitized_post_values() as $key => $value ) { + if ( false !== strpos( $key, 'nav_menu_locations[' ) ) { + $loc = substr( trim( $key, ']' ), 19 ); + $infos = $this->explode_location( $loc ); + if ( $infos['lang'] === $this->curlang->slug ) { + $menus[ $infos['location'] ] = (int) $value; + } elseif ( $this->curlang->slug === $this->options['default_lang'] ) { + $menus[ $loc ] = (int) $value; + } + } + } + } + } + return $menus; + } + + /** + * Attempt to translate the nav menu when it is hardcoded or when no location is defined in wp_nav_menu + * + * @since 1.7.10 + * + * @param array $args + * @return array modified $args + */ + public function wp_nav_menu_args( $args ) { + $theme = get_option( 'stylesheet' ); + + if ( empty( $this->curlang ) || empty( $this->options['nav_menus'][ $theme ] ) ) { + return $args; + } + + // Get the nav menu based on the requested menu + $menu = wp_get_nav_menu_object( $args['menu'] ); + + // Attempt to find a translation of this menu + // This obviously does not work if the nav menu has no associated theme location + if ( $menu ) { + foreach ( $this->options['nav_menus'][ $theme ] as $menus ) { + if ( in_array( $menu->term_id, $menus ) && ! empty( $menus[ $this->curlang->slug ] ) ) { + $args['menu'] = $menus[ $this->curlang->slug ]; + return $args; + } + } + } + + // Get the first menu that has items and and is in the current language if we still can't find a menu + if ( ! $menu && ! $args['theme_location'] ) { + $menus = wp_get_nav_menus(); + foreach ( $menus as $menu_maybe ) { + if ( wp_get_nav_menu_items( $menu_maybe->term_id, array( 'update_post_term_cache' => false ) ) ) { + foreach ( $this->options['nav_menus'][ $theme ] as $menus ) { + if ( in_array( $menu_maybe->term_id, $menus ) && ! empty( $menus[ $this->curlang->slug ] ) ) { + $args['menu'] = $menus[ $this->curlang->slug ]; + return $args; + } + } + } + } + } + + return $args; + } + + /** + * Filters the nav menu location before the customizer so that it matches the temporary location in the customizer + * + * @since 1.8 + * + * @param array $args wp_nav_menu $args + * @return array modified $args + */ + public function filter_args_before_customizer( $args ) { + if ( ! empty( $this->curlang ) ) { + $args['theme_location'] = $this->combine_location( $args['theme_location'], $this->curlang ); + } + return $args; + } + + /** + * Filters the nav menu location after the customizer to get back the true nav menu location for the theme + * + * @since 1.8 + * + * @param array $args wp_nav_menu $args + * @return array modified $args + */ + public function filter_args_after_customizer( $args ) { + $infos = $this->explode_location( $args['theme_location'] ); + $args['theme_location'] = $infos['location']; + return $args; + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend-static-pages.php b/wp-content/plugins/polylang/frontend/frontend-static-pages.php new file mode 100644 index 00000000..a909761e --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend-static-pages.php @@ -0,0 +1,269 @@ +links_model = &$polylang->links_model; + $this->links = &$polylang->links; + + add_action( 'pll_language_defined', array( $this, 'pll_language_defined' ) ); + add_action( 'pll_home_requested', array( $this, 'pll_home_requested' ) ); + + // Manages the redirection of the homepage + add_filter( 'redirect_canonical', array( $this, 'redirect_canonical' ) ); + + add_filter( 'pll_pre_translation_url', array( $this, 'pll_pre_translation_url' ), 10, 3 ); + add_filter( 'pll_check_canonical_url', array( $this, 'pll_check_canonical_url' ) ); + + add_filter( 'pll_set_language_from_query', array( $this, 'page_on_front_query' ), 10, 2 ); + add_filter( 'pll_set_language_from_query', array( $this, 'page_for_posts_query' ), 10, 2 ); + } + + /** + * Init the filters + * + * @since 1.8 + */ + public function pll_language_defined() { + // Translates our page on front and page for posts properties + $this->init(); + + // Translates page for posts and page on front + add_filter( 'option_page_on_front', array( $this, 'translate_page_on_front' ) ); + add_filter( 'option_page_for_posts', array( $this, 'translate_page_for_posts' ) ); + + // Support theme customizer + if ( isset( $_POST['wp_customize'], $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + add_filter( 'pre_option_page_on_front', 'pll_get_post', 20 ); + add_filter( 'pre_option_page_for_post', 'pll_get_post', 20 ); + } + } + + /** + * Translates the page_id query var when the site root page is requested + * + * @since 1.8 + */ + public function pll_home_requested() { + set_query_var( 'page_id', $this->curlang->page_on_front ); + } + + /** + * Translates page on front + * + * @since 1.8 + * + * @param int $v page on front page id + * @return int + */ + public function translate_page_on_front( $v ) { + // Don't attempt to translate in a 'switch_blog' action as there is a risk to call this function while initializing the languages cache + return isset( $this->curlang->page_on_front ) && ( $this->curlang->page_on_front ) && ! doing_action( 'switch_blog' ) ? $this->curlang->page_on_front : $v; + } + + /** + * Manages canonical redirection of the homepage when using page on front + * + * @since 0.1 + * + * @param string $redirect_url + * @return bool|string modified url, false if redirection is canceled + */ + public function redirect_canonical( $redirect_url ) { + global $wp_query; + if ( is_page() && ! is_feed() && isset( $wp_query->queried_object ) && $wp_query->queried_object->ID == $this->curlang->page_on_front ) { + $url = is_paged() ? $this->links_model->add_paged_to_link( $this->links->get_home_url(), $wp_query->query_vars['page'] ) : $this->links->get_home_url(); + + // Don't forget additional query vars + $query = wp_parse_url( $redirect_url, PHP_URL_QUERY ); + if ( ! empty( $query ) ) { + parse_str( $query, $query_vars ); + $query_vars = rawurlencode_deep( $query_vars ); // WP encodes query vars values + $url = add_query_arg( $query_vars, $url ); + } + + return $url; + } + + return $redirect_url; + } + + /** + * Translates the url of the page on front and page for posts + * + * @since 1.8 + * + * @param string $url not used + * @param object $language language in which we want the translation + * @param int $queried_object_id id of the queried object + * @return string + */ + public function pll_pre_translation_url( $url, $language, $queried_object_id ) { + if ( ! empty( $queried_object_id ) ) { + // Page for posts + if ( $GLOBALS['wp_query']->is_posts_page && ( $id = $this->model->post->get( $queried_object_id, $language ) ) ) { + $url = get_permalink( $id ); + } + + // Page on front + elseif ( is_front_page() && $language->page_on_front && ( $language->page_on_front == $this->model->post->get( $queried_object_id, $language ) ) ) { + $url = $language->home_url; + } + } + + return $url; + } + + /** + * Prevents canonical redirection if we are on a static front page + * + * @since 1.8 + * + * @param string $redirect_url + * @return bool|string + */ + public function pll_check_canonical_url( $redirect_url ) { + return $this->options['redirect_lang'] && ! $this->options['force_lang'] && ! empty( $this->curlang->page_on_front ) && is_page( $this->curlang->page_on_front ) ? false : $redirect_url; + } + + /** + * Is the query for a the static front page (redirected from the language page)? + * + * @since 2.3 + * + * @param object $query + * @return bool + */ + protected function is_front_page( $query ) { + $query = array_diff( array_keys( $query->query ), array( 'preview', 'page', 'paged', 'cpage', 'orderby' ) ); + return 1 === count( $query ) && in_array( 'lang', $query ); + } + + /** + * Setups query vars when requesting a static front page + * + * @since 1.8 + * + * @param bool|object $lang + * @param object $query + * @return bool|object + */ + public function page_on_front_query( $lang, $query ) { + if ( ! empty( $lang ) || ! $this->page_on_front ) { + return $lang; + } + + // The home page is requested + if ( did_action( 'home_requested' ) ) { + $query->set( 'page_id', $lang->page_on_front ); + } + + // Redirect the language page to the homepage when using a static front page + elseif ( ( $this->options['redirect_lang'] || $this->options['hide_default'] ) && $this->is_front_page( $query ) && $lang = $this->model->get_language( get_query_var( 'lang' ) ) ) { + $query->is_archive = $query->is_tax = false; + if ( ! empty( $lang->page_on_front ) ) { + $query->set( 'page_id', $lang->page_on_front ); + $query->is_singular = $query->is_page = true; + unset( $query->query_vars['lang'], $query->queried_object ); // Reset queried object + } else { + // Handle case where the static front page hasn't be translated to avoid a possible infinite redirect loop. + $query->is_home = true; + } + } + + // Fix paged static front page in plain permalinks when Settings > Reading doesn't match the default language + elseif ( ! $this->links_model->using_permalinks && count( $query->query ) === 1 && ! empty( $query->query['page'] ) ) { + $lang = $this->model->get_language( $this->options['default_lang'] ); + $query->set( 'page_id', $lang->page_on_front ); + $query->is_singular = $query->is_page = true; + $query->is_archive = $query->is_tax = false; + unset( $query->query_vars['lang'], $query->queried_object ); // Reset queried object + } + + // Set the language when requesting a static front page + else { + $page_id = $this->get_page_id( $query ); + $languages = $this->model->get_languages_list(); + $pages = wp_list_pluck( $languages, 'page_on_front' ); + + if ( ! empty( $page_id ) && false !== $n = array_search( $page_id, $pages ) ) { + $lang = $languages[ $n ]; + } + } + + // Fix for page_on_front + if ( ( $this->options['force_lang'] < 2 || ! $this->options['redirect_lang'] ) && $this->links_model->using_permalinks && ! empty( $lang ) && isset( $query->query['paged'] ) ) { + $query->set( 'page', $query->query['paged'] ); + unset( $query->query['paged'] ); + } elseif ( ! $this->links_model->using_permalinks && ! empty( $query->query['page'] ) ) { + $query->is_paged = true; + } + + return $lang; + } + + /** + * Setups query vars when requesting a posts page + * + * @since 1.8 + * + * @param bool|object $lang + * @param object $query + * @return bool|object + */ + public function page_for_posts_query( $lang, $query ) { + if ( empty( $lang ) && $this->page_for_posts ) { + $page_id = $this->get_page_id( $query ); + + if ( ! empty( $page_id ) && in_array( $page_id, $pages = $this->model->get_languages_list( array( 'fields' => 'page_for_posts' ) ) ) ) { + // Fill the cache with all pages for posts to avoid one query per page later + // The posts_per_page limit is a trick to avoid splitting the query + get_posts( array( 'posts_per_page' => 999, 'post_type' => 'page', 'post__in' => $pages, 'lang' => '' ) ); + + $lang = $this->model->post->get_language( $page_id ); + $query->is_singular = $query->is_page = false; + $query->is_home = $query->is_posts_page = true; + } + } + return $lang; + } + + /** + * Get queried page_id ( if exists ) + * If permalinks are used, WordPress does set and use $query->queried_object_id and sets $query->query_vars['page_id'] to 0 + * and does set and use $query->query_vars['page_id'] if permalinks are not used :( + * + * @since 1.5 + * + * @param object $query instance of WP_Query + * @return int page_id + */ + protected function get_page_id( $query ) { + if ( ! empty( $query->query_vars['pagename'] ) && isset( $query->queried_object_id ) ) { + return $query->queried_object_id; + } + + if ( isset( $query->query_vars['page_id'] ) ) { + return $query->query_vars['page_id']; + } + + return 0; // No page queried + } +} diff --git a/wp-content/plugins/polylang/frontend/frontend.php b/wp-content/plugins/polylang/frontend/frontend.php new file mode 100644 index 00000000..0c23bb1c --- /dev/null +++ b/wp-content/plugins/polylang/frontend/frontend.php @@ -0,0 +1,192 @@ + inherited, reference to Polylang options array + * model => inherited, reference to PLL_Model object + * links_model => inherited, reference to PLL_Links_Model object + * links => reference to PLL_Links object + * static_pages => reference to PLL_Frontend_Static_Pages object + * choose_lang => reference to PLL_Choose_Lang object + * curlang => current language + * filters => reference to PLL_Frontend_Filters object + * filters_links => reference to PLL_Frontend_Filters_Links object + * filters_search => reference to PLL_Frontend_Filters_Search object + * posts => reference to PLL_CRUD_Posts object + * terms => reference to PLL_CRUD_Terms object + * nav_menu => reference to PLL_Frontend_Nav_Menu object + * auto_translate => optional, reference to PLL_Auto_Translate object + * + * @since 1.2 + */ +class PLL_Frontend extends PLL_Base { + public $curlang; + public $links, $choose_lang, $filters, $filters_search, $nav_menu, $auto_translate; + + /** + * Constructor + * + * @since 1.2 + * + * @param object $links_model + */ + public function __construct( &$links_model ) { + parent::__construct( $links_model ); + + add_action( 'pll_language_defined', array( $this, 'pll_language_defined' ), 1 ); + + // Avoids the language being the queried object when querying multiple taxonomies + add_action( 'parse_tax_query', array( $this, 'parse_tax_query' ), 1 ); + + // Filters posts by language + add_action( 'parse_query', array( $this, 'parse_query' ), 6 ); + + // Not before 'check_canonical_url' + if ( ! defined( 'PLL_AUTO_TRANSLATE' ) || PLL_AUTO_TRANSLATE ) { + add_action( 'template_redirect', array( $this, 'auto_translate' ), 7 ); + } + } + + /** + * Setups the language chooser based on options + * + * @since 1.2 + */ + public function init() { + parent::init(); + + $this->links = new PLL_Frontend_Links( $this ); + + // Static front page and page for posts + if ( 'page' === get_option( 'show_on_front' ) ) { + $this->static_pages = new PLL_Frontend_Static_Pages( $this ); + } + + // Setup the language chooser + $c = array( 'Content', 'Url', 'Url', 'Domain' ); + $class = 'PLL_Choose_Lang_' . $c[ $this->options['force_lang'] ]; + $this->choose_lang = new $class( $this ); + $this->choose_lang->init(); + + // Need to load nav menu class early to correctly define the locations in the customizer when the language is set from the content + $this->nav_menu = new PLL_Frontend_Nav_Menu( $this ); + } + + /** + * Setups filters and nav menus once the language has been defined + * + * @since 1.2 + */ + public function pll_language_defined() { + // Filters + $this->filters_links = new PLL_Frontend_Filters_Links( $this ); + $this->filters = new PLL_Frontend_Filters( $this ); + $this->filters_search = new PLL_Frontend_Filters_Search( $this ); + + // Auto translate for Ajax + if ( ( ! defined( 'PLL_AUTO_TRANSLATE' ) || PLL_AUTO_TRANSLATE ) && wp_doing_ajax() ) { + $this->auto_translate(); + } + } + + /** + * When querying multiple taxonomies, makes sure that the language is not the queried object + * + * @since 1.8 + * + * @param object $query WP_Query object + */ + public function parse_tax_query( $query ) { + $pll_query = new PLL_Query( $query, $this->model ); + $queried_taxonomies = $pll_query->get_queried_taxonomies(); + + if ( ! empty( $queried_taxonomies ) && 'language' == reset( $queried_taxonomies ) ) { + $query->tax_query->queried_terms['language'] = array_shift( $query->tax_query->queried_terms ); + } + } + + /** + * Modifies some query vars to "hide" that the language is a taxonomy and avoid conflicts + * + * @since 1.2 + * + * @param object $query WP_Query object + */ + public function parse_query( $query ) { + $qv = $query->query_vars; + $pll_query = new PLL_Query( $query, $this->model ); + $taxonomies = $pll_query->get_queried_taxonomies(); + + // Allow filtering recent posts and secondary queries by the current language + if ( ! empty( $this->curlang ) ) { + $pll_query->filter_query( $this->curlang ); + } + + // Modifies query vars when the language is queried + if ( ! empty( $qv['lang'] ) || ( ! empty( $taxonomies ) && array( 'language' ) == array_values( $taxonomies ) ) ) { + // Do we query a custom taxonomy? + $taxonomies = array_diff( $taxonomies, array( 'language', 'category', 'post_tag' ) ); + + // Remove pages query when the language is set unless we do a search + // Take care not to break the single page, attachment and taxonomies queries! + if ( empty( $qv['post_type'] ) && ! $query->is_search && ! $query->is_singular && empty( $taxonomies ) && ! $query->is_category && ! $query->is_tag ) { + $query->set( 'post_type', 'post' ); + } + + // Unset the is_archive flag for language pages to prevent loading the archive template + // Keep archive flag for comment feed otherwise the language filter does not work + if ( empty( $taxonomies ) && ! $query->is_comment_feed && ! $query->is_post_type_archive && ! $query->is_date && ! $query->is_author && ! $query->is_category && ! $query->is_tag ) { + $query->is_archive = false; + } + + // Unset the is_tax flag except if another custom tax is queried + if ( empty( $taxonomies ) && ( $query->is_category || $query->is_tag || $query->is_author || $query->is_post_type_archive || $query->is_date || $query->is_search || $query->is_feed ) ) { + $query->is_tax = false; + unset( $query->queried_object ); // FIXME useless? + } + } + } + + /** + * Auto translate posts and terms ids + * + * @since 1.2 + */ + public function auto_translate() { + $this->auto_translate = new PLL_Frontend_Auto_Translate( $this ); + } + + /** + * Resets some variables when switching blog + * Overrides parent method + * + * @since 1.5.1 + * + * @param int $new_blog + * @param int $old_blog + */ + public function switch_blog( $new_blog, $old_blog ) { + // Need to check that some languages are defined when user is logged in, has several blogs, some without any languages + if ( parent::switch_blog( $new_blog, $old_blog ) && did_action( 'pll_language_defined' ) && $this->model->get_languages_list() ) { + static $restore_curlang; + if ( empty( $restore_curlang ) ) { + $restore_curlang = $this->curlang->slug; // To always remember the current language through blogs + } + + $lang = $this->model->get_language( $restore_curlang ); + $this->curlang = $lang ? $lang : $this->model->get_language( $this->options['default_lang'] ); + + if ( isset( $this->static_pages ) ) { + $this->static_pages->init(); + } + + $this->load_strings_translations(); + } + } +} diff --git a/wp-content/plugins/polylang/include/api.php b/wp-content/plugins/polylang/include/api.php new file mode 100644 index 00000000..e25f1304 --- /dev/null +++ b/wp-content/plugins/polylang/include/api.php @@ -0,0 +1,423 @@ + displays a dropdown if set to 1, defaults to 0 + * - echo => echoes the switcher if set to 1 ( default ) + * - hide_if_empty => hides languages with no posts ( or pages ) if set to 1 ( default ) + * - show_flags => shows flags if set to 1, defaults to 0 + * - show_names => shows languages names if set to 1 ( default ) + * - display_names_as => whether to display the language name or its slug, valid options are 'slug' and 'name', + * defaults to name + * - force_home => forces linking to the home page is set to 1, defaults to 0 + * - hide_if_no_translation => hides the link if there is no translation if set to 1, defaults to 0 + * - hide_current => hides the current language if set to 1, defaults to 0 + * - post_id => if not null, link to translations of post defined by post_id, defaults to null + * - raw => set this to true to build your own custom language switcher, defaults to 0 + * - item_spacing => whether to preserve or discard whitespace between list items, valid options are + * 'preserve' and 'discard', defaults to preserve + * + * @api + * @since 0.5 + * + * @param array $args optional + * @return null|string|array null if displaying, array if raw is requested, string otherwise + */ +function pll_the_languages( $args = '' ) { + if ( PLL() instanceof PLL_Frontend ) { + $switcher = new PLL_Switcher(); + return $switcher->the_languages( PLL()->links, $args ); + } + return ''; +} + +/** + * Returns the current language on frontend + * Returns the language set in admin language filter on backend ( false if set to all languages ) + * + * @api + * @since 0.8.1 + * + * @param string $field Optional, the language field to return ( see PLL_Language ), defaults to 'slug', pass OBJECT constant to get the language object. + * @return string|PLL_Language|bool The requested field for the current language + */ +function pll_current_language( $field = 'slug' ) { + if ( OBJECT === $field ) { + return PLL()->curlang; + } + return isset( PLL()->curlang->$field ) ? PLL()->curlang->$field : false; +} + +/** + * Returns the default language + * + * @api + * @since 1.0 + * + * @param string $field Optional, the language field to return ( see PLL_Language ), defaults to 'slug', pass OBJECT constant to get the language object. + * @return string|PLL_Language|bool The requested field for the default language + */ +function pll_default_language( $field = 'slug' ) { + if ( isset( PLL()->options['default_lang'] ) ) { + $lang = PLL()->model->get_language( PLL()->options['default_lang'] ); + if ( $lang ) { + if ( OBJECT === $field ) { + return $lang; + } + return isset( $lang->$field ) ? $lang->$field : false; + } + } + return false; +} + +/** + * Among the post and its translations, returns the id of the post which is in the language represented by $slug + * + * @api + * @since 0.5 + * + * @param int $post_id post id + * @param string $slug optional language code, defaults to current language + * @return int|false|null post id of the translation if exists, false otherwise, null if the current language is not defined yet + */ +function pll_get_post( $post_id, $slug = '' ) { + return ( $slug = $slug ? $slug : pll_current_language() ) ? PLL()->model->post->get( $post_id, $slug ) : null; +} + +/** + * Among the term and its translations, returns the id of the term which is in the language represented by $slug + * + * @api + * @since 0.5 + * + * @param int $term_id term id + * @param string $slug optional language code, defaults to current language + * @return int|false|null term id of the translation if exists, false otherwise, null if the current language is not defined yet + */ +function pll_get_term( $term_id, $slug = '' ) { + return ( $slug = $slug ? $slug : pll_current_language() ) ? PLL()->model->term->get( $term_id, $slug ) : null; +} + +/** + * Returns the home url in the current language + * + * @api + * @since 0.8 + * + * @param string $lang language code ( optional on frontend ) + * @return string + */ +function pll_home_url( $lang = '' ) { + if ( empty( $lang ) ) { + $lang = pll_current_language(); + } + + return empty( $lang ) ? home_url( '/' ) : PLL()->links->get_home_url( $lang ); +} + +/** + * Registers a string for translation in the "strings translation" panel + * + * @api + * @since 0.6 + * + * @param string $name a unique name for the string + * @param string $string the string to register + * @param string $context optional the group in which the string is registered, defaults to 'polylang' + * @param bool $multiline optional whether the string table should display a multiline textarea or a single line input, defaults to single line + */ +function pll_register_string( $name, $string, $context = 'Polylang', $multiline = false ) { + if ( PLL() instanceof PLL_Admin_Base ) { + PLL_Admin_Strings::register_string( $name, $string, $context, $multiline ); + } +} + +/** + * Translates a string ( previously registered with pll_register_string ) + * + * @api + * @since 0.6 + * + * @param string $string the string to translate + * @return string the string translation in the current language + */ +function pll__( $string ) { + return is_scalar( $string ) ? __( $string, 'pll_string' ) : $string; // PHPCS:ignore WordPress.WP.I18n +} + +/** + * Translates a string ( previously registered with pll_register_string ) and escapes it for safe use in HTML output. + * + * @api + * @since 2.1 + * + * @param string $string the string to translate + * @return string translation in the current language + */ +function pll_esc_html__( $string ) { + return esc_html( pll__( $string ) ); +} + +/** + * Translates a string ( previously registered with pll_register_string ) and escapes it for safe use in HTML attributes. + * + * @api + * @since 2.1 + * + * @param string $string The string to translate + * @return string + */ +function pll_esc_attr__( $string ) { + return esc_attr( pll__( $string ) ); +} + +/** + * Echoes a translated string ( previously registered with pll_register_string ) + * It is an equivalent of _e() and is not escaped. + * + * @api + * @since 0.6 + * + * @param string $string The string to translate + */ +function pll_e( $string ) { + echo pll__( $string ); // phpcs:ignore +} + +/** + * Echoes a translated string ( previously registered with pll_register_string ) and escapes it for safe use in HTML output. + * + * @api + * @since 2.1 + * + * @param string $string The string to translate + */ +function pll_esc_html_e( $string ) { + echo pll_esc_html__( $string ); // phpcs:ignore WordPress.Security.EscapeOutput +} + +/** + * Echoes a translated a string ( previously registered with pll_register_string ) and escapes it for safe use in HTML attributes. + * + * @api + * @since 2.1 + * + * @param string $string The string to translate + */ +function pll_esc_attr_e( $string ) { + echo pll_esc_attr__( $string ); // phpcs:ignore WordPress.Security.EscapeOutput +} + +/** + * Translates a string ( previously registered with pll_register_string ) + * + * @api + * @since 1.5.4 + * + * @param string $string the string to translate + * @param string $lang language code + * @return string the string translation in the requested language + */ +function pll_translate_string( $string, $lang ) { + if ( PLL() instanceof PLL_Frontend && pll_current_language() == $lang ) { + return pll__( $string ); + } + + if ( ! is_scalar( $string ) ) { + return $string; + } + + static $cache; // Cache object to avoid loading the same translations object several times + + if ( empty( $cache ) ) { + $cache = new PLL_Cache(); + } + + if ( false === $mo = $cache->get( $lang ) ) { + $mo = new PLL_MO(); + $mo->import_from_db( PLL()->model->get_language( $lang ) ); + $cache->set( $lang, $mo ); + } + + return $mo->translate( $string ); +} + +/** + * Returns true if Polylang manages languages and translations for this post type + * + * @api + * @since 1.0.1 + * + * @param string $post_type Post type name + * @return bool + */ +function pll_is_translated_post_type( $post_type ) { + return PLL()->model->is_translated_post_type( $post_type ); +} + +/** + * Returns true if Polylang manages languages and translations for this taxonomy + * + * @api + * @since 1.0.1 + * + * @param string $tax Taxonomy name + * @return bool + */ +function pll_is_translated_taxonomy( $tax ) { + return PLL()->model->is_translated_taxonomy( $tax ); +} + +/** + * Returns the list of available languages + * + * List of parameters accepted in $args: + * + * hide_empty => hides languages with no posts if set to true ( defaults to false ) + * fields => return only that field if set ( see PLL_Language for a list of fields ) + * + * @api + * @since 1.5 + * + * @param array $args list of parameters + * @return array + */ +function pll_languages_list( $args = array() ) { + $args = wp_parse_args( $args, array( 'fields' => 'slug' ) ); + return PLL()->model->get_languages_list( $args ); +} + +/** + * Set the post language + * + * @api + * @since 1.5 + * + * @param int $id post id + * @param string $lang language code + */ +function pll_set_post_language( $id, $lang ) { + PLL()->model->post->set_language( $id, $lang ); +} + +/** + * Set the term language + * + * @api + * @since 1.5 + * + * @param int $id term id + * @param string $lang language code + */ +function pll_set_term_language( $id, $lang ) { + PLL()->model->term->set_language( $id, $lang ); +} + +/** + * Save posts translations + * + * @api + * @since 1.5 + * + * @param array $arr an associative array of translations with language code as key and post id as value + */ +function pll_save_post_translations( $arr ) { + PLL()->model->post->save_translations( reset( $arr ), $arr ); +} + +/** + * Save terms translations + * + * @api + * @since 1.5 + * + * @param array $arr an associative array of translations with language code as key and term id as value + */ +function pll_save_term_translations( $arr ) { + PLL()->model->term->save_translations( reset( $arr ), $arr ); +} + +/** + * Returns the post language + * + * @api + * @since 1.5.4 + * + * @param int $post_id + * @param string $field Optional, the language field to return ( see PLL_Language ), defaults to 'slug' + * @return bool|string The requested field for the post language, false if no language is associated to that post + */ +function pll_get_post_language( $post_id, $field = 'slug' ) { + return ( $lang = PLL()->model->post->get_language( $post_id ) ) ? $lang->$field : false; +} + +/** + * Returns the term language + * + * @api + * @since 1.5.4 + * + * @param int $term_id + * @param string $field Optional, the language field to return ( see PLL_Language ), defaults to 'slug' + * @return bool|string The requested field for the term language, false if no language is associated to that term + */ +function pll_get_term_language( $term_id, $field = 'slug' ) { + return ( $lang = PLL()->model->term->get_language( $term_id ) ) ? $lang->$field : false; +} + +/** + * Returns an array of translations of a post + * + * @api + * @since 1.8 + * + * @param int $post_id + * @return array an associative array of translations with language code as key and translation post_id as value + */ +function pll_get_post_translations( $post_id ) { + return PLL()->model->post->get_translations( $post_id ); +} + +/** + * Returns an array of translations of a term + * + * @api + * @since 1.8 + * + * @param int $term_id + * @return array an associative array of translations with language code as key and translation term_id as value + */ +function pll_get_term_translations( $term_id ) { + return PLL()->model->term->get_translations( $term_id ); +} + +/** + * Count posts in a language + * + * @api + * @since 1.5 + * + * @param string $lang Language code. + * @param array $args WP_Query arguments ( accepted keys: post_type, m, year, monthnum, day, author, author_name, post_format, post_status ). + * @return int Posts count. + */ +function pll_count_posts( $lang, $args = array() ) { + return PLL()->model->count_posts( PLL()->model->get_language( $lang ), $args ); +} + +/** + * Allows to access the Polylang instance + * It is always preferable to use API functions + * Internal methods may be changed without prior notice + * + * @since 1.8 + */ +function PLL() { // PHPCS:ignore WordPress.NamingConventions.ValidFunctionName + return $GLOBALS['polylang']; +} diff --git a/wp-content/plugins/polylang/include/base.php b/wp-content/plugins/polylang/include/base.php new file mode 100644 index 00000000..71e9cc96 --- /dev/null +++ b/wp-content/plugins/polylang/include/base.php @@ -0,0 +1,195 @@ +links_model = &$links_model; + $this->model = &$links_model->model; + $this->options = &$this->model->options; + + $GLOBALS['l10n_unloaded']['pll_string'] = true; // Short-circuit _load_textdomain_just_in_time() for 'pll_string' domain in WP 4.6+ + + add_action( 'widgets_init', array( $this, 'widgets_init' ) ); + + // User defined strings translations + add_action( 'pll_language_defined', array( $this, 'load_strings_translations' ), 5 ); + add_action( 'change_locale', array( $this, 'load_strings_translations' ) ); // Since WP 4.7 + + // Switch_to_blog + add_action( 'switch_blog', array( $this, 'switch_blog' ), 10, 2 ); + } + + /** + * Instantiates classes reacting to CRUD operations on posts and terms, + * only when at least one language is defined. + * + * @since 2.6 + */ + public function init() { + if ( $this->model->get_languages_list() ) { + $this->posts = new PLL_CRUD_Posts( $this ); + $this->terms = new PLL_CRUD_Terms( $this ); + + // WordPress options. + new PLL_Translate_Option( 'blogname', array(), array( 'context' => 'WordPress' ) ); + new PLL_Translate_Option( 'blogdescription', array(), array( 'context' => 'WordPress' ) ); + new PLL_Translate_Option( 'date_format', array(), array( 'context' => 'WordPress' ) ); + new PLL_Translate_Option( 'time_format', array(), array( 'context' => 'WordPress' ) ); + } + } + + /** + * Registers our widgets + * + * @since 0.1 + */ + public function widgets_init() { + register_widget( 'PLL_Widget_Languages' ); + + // Overwrites the calendar widget to filter posts by language + if ( ! defined( 'PLL_WIDGET_CALENDAR' ) || PLL_WIDGET_CALENDAR ) { + unregister_widget( 'WP_Widget_Calendar' ); + register_widget( 'PLL_Widget_Calendar' ); + } + } + + /** + * Loads user defined strings translations + * + * @since 1.2 + * @since 2.1.3 $locale parameter added. + * + * @param string $locale Locale. Defaults to current locale. + */ + public function load_strings_translations( $locale = '' ) { + if ( empty( $locale ) ) { + $locale = get_locale(); + } + + $language = $this->model->get_language( $locale ); + + if ( ! empty( $language ) ) { + $mo = new PLL_MO(); + $mo->import_from_db( $language ); + $GLOBALS['l10n']['pll_string'] = &$mo; + } else { + unset( $GLOBALS['l10n']['pll_string'] ); + } + } + + /** + * Resets some variables when switching blog + * Applies only if Polylang is active on the new blog + * + * @since 1.5.1 + * + * @param int $new_blog + * @param int $old_blog + * @return bool not used by WP but by child class + */ + public function switch_blog( $new_blog, $old_blog ) { + $plugins = ( $sitewide_plugins = get_site_option( 'active_sitewide_plugins' ) ) && is_array( $sitewide_plugins ) ? array_keys( $sitewide_plugins ) : array(); + $plugins = array_merge( $plugins, get_option( 'active_plugins', array() ) ); + + // 2nd test needed when Polylang is not networked activated + // 3rd test needed when Polylang is networked activated and a new site is created + if ( $new_blog != $old_blog && in_array( POLYLANG_BASENAME, $plugins ) && get_option( 'polylang' ) ) { + $this->options = get_option( 'polylang' ); // Needed for menus + remove_action( 'pre_option_rewrite_rules', array( $this->links_model, 'prepare_rewrite_rules' ) ); + $this->links_model = $this->model->get_links_model(); + return true; + } + return false; + } + + /** + * Some backward compatibility with Polylang < 1.2 + * Allows for example to call $polylang->get_languages_list() instead of $polylang->model->get_languages_list() + * This works but should be slower than the direct call, thus an error is triggered in debug mode + * + * @since 1.2 + * + * @param string $func function name + * @param array $args function arguments + */ + public function __call( $func, $args ) { + foreach ( $this as $prop => &$obj ) { + if ( is_object( $obj ) && method_exists( $obj, $func ) ) { + if ( WP_DEBUG ) { + $debug = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + $i = 1 + empty( $debug[1]['line'] ); // The file and line are in $debug[2] if the function was called using call_user_func + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + '%1$s was called incorrectly in %3$s on line %4$s: the call to $polylang->%1$s() has been deprecated in Polylang 1.2, use PLL()->%2$s->%1$s() instead.' . "\nError handler", + esc_html( $func ), + esc_html( $prop ), + esc_html( $debug[ $i ]['file'] ), + absint( $debug[ $i ]['line'] ) + ) + ); + } + return call_user_func_array( array( $obj, $func ), $args ); + } + } + + $debug = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + 'Call to undefined function PLL()->%1$s() in %2$s on line %3$s' . "\nError handler", + esc_html( $func ), + esc_html( $debug[0]['file'] ), + absint( $debug[0]['line'] ) + ), + E_USER_ERROR + ); + } +} diff --git a/wp-content/plugins/polylang/include/cache.php b/wp-content/plugins/polylang/include/cache.php new file mode 100644 index 00000000..1648b9d4 --- /dev/null +++ b/wp-content/plugins/polylang/include/cache.php @@ -0,0 +1,75 @@ +blog_id = get_current_blog_id(); + add_action( 'switch_blog', array( $this, 'switch_blog' ) ); + } + + /** + * Called when switching blog + * + * @since 1.7 + * + * @param int $new_blog + */ + public function switch_blog( $new_blog ) { + $this->blog_id = $new_blog; + } + + /** + * Add a value in cache + * + * @since 1.7 + * + * @param string $key + * @param mixed $data + */ + public function set( $key, $data ) { + $this->cache[ $this->blog_id ][ $key ] = $data; + } + + /** + * Get value from cache + * + * @since 1.7 + * + * @param string $key + * @return mixed $data + */ + public function get( $key ) { + return isset( $this->cache[ $this->blog_id ][ $key ] ) ? $this->cache[ $this->blog_id ][ $key ] : false; + } + + /** + * Clean the cache (for this blog only) + * + * @since 1.7 + * + * @param string $key + */ + public function clean( $key = '' ) { + if ( empty( $key ) ) { + unset( $this->cache[ $this->blog_id ] ); + } + else { + unset( $this->cache[ $this->blog_id ][ $key ] ); + } + } +} diff --git a/wp-content/plugins/polylang/include/class-polylang.php b/wp-content/plugins/polylang/include/class-polylang.php new file mode 100644 index 00000000..fd9ab243 --- /dev/null +++ b/wp-content/plugins/polylang/include/class-polylang.php @@ -0,0 +1,256 @@ +is_deactivation() || ! $install->can_activate() ) { + return; + } + + // Plugin initialization + // Take no action before all plugins are loaded + add_action( 'plugins_loaded', array( $this, 'init' ), 1 ); + + // Override load text domain waiting for the language to be defined + // Here for plugins which load text domain as soon as loaded :( + if ( ! defined( 'PLL_OLT' ) || PLL_OLT ) { + PLL_OLT_Manager::instance(); + } + + /* + * Loads the compatibility with some plugins and themes. + * Loaded as soon as possible as we may need to act before other plugins are loaded. + */ + if ( ! defined( 'PLL_PLUGINS_COMPAT' ) || PLL_PLUGINS_COMPAT ) { + PLL_Integrations::instance(); + } + } + + /** + * Tells whether the current request is an ajax request on frontend or not + * + * @since 2.2 + * + * @return bool + */ + public static function is_ajax_on_front() { + // Special test for plupload which does not use jquery ajax and thus does not pass our ajax prefilter + // Special test for customize_save done in frontend but for which we want to load the admin + $in = isset( $_REQUEST['action'] ) && in_array( sanitize_key( $_REQUEST['action'] ), array( 'upload-attachment', 'customize_save' ) ); // phpcs:ignore WordPress.Security.NonceVerification + $is_ajax_on_front = wp_doing_ajax() && empty( $_REQUEST['pll_ajax_backend'] ) && ! $in; // phpcs:ignore WordPress.Security.NonceVerification + + /** + * Filters whether the current request is an ajax request on front. + * + * @since 2.3 + * + * @param bool $is_ajax_on_front Whether the current request is an ajax request on front. + */ + return apply_filters( 'pll_is_ajax_on_front', $is_ajax_on_front ); + } + + /** + * Is the current request a REST API request? + * Inspired by WP::parse_request() + * Needed because at this point, the constant REST_REQUEST is not defined yet + * + * @since 2.4.1 + * + * @return bool + */ + public static function is_rest_request() { + // Handle pretty permalinks. + $home_path = trim( wp_parse_url( home_url(), PHP_URL_PATH ), '/' ); + $home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) ); + + $req_uri = trim( wp_parse_url( pll_get_requested_url(), PHP_URL_PATH ), '/' ); + $req_uri = preg_replace( $home_path_regex, '', $req_uri ); + $req_uri = trim( $req_uri, '/' ); + $req_uri = str_replace( 'index.php', '', $req_uri ); + $req_uri = trim( $req_uri, '/' ); + + // And also test rest_route query string parameter is not empty for plain permalinks. + $query_string = array(); + wp_parse_str( wp_parse_url( pll_get_requested_url(), PHP_URL_QUERY ), $query_string ); + $rest_route = isset( $query_string['rest_route'] ) ? trim( $query_string['rest_route'], '/' ) : false; + + return 0 === strpos( $req_uri, rest_get_url_prefix() . '/' ) || ! empty( $rest_route ); + } + + /** + * Tells if we are in the wizard process. + * + * @since 2.7 + * + * @return bool + */ + public static function is_wizard() { + return isset( $_GET['page'] ) && ! empty( $_GET['page'] ) && 'mlang_wizard' === sanitize_key( $_GET['page'] ); // phpcs:ignore WordPress.Security.NonceVerification + } + + /** + * Defines constants + * May be overridden by a plugin if set before plugins_loaded, 1 + * + * @since 1.6 + */ + public static function define_constants() { + // Cookie name. no cookie will be used if set to false + if ( ! defined( 'PLL_COOKIE' ) ) { + define( 'PLL_COOKIE', 'pll_language' ); + } + + // Backward compatibility with Polylang < 2.3 + if ( ! defined( 'PLL_AJAX_ON_FRONT' ) ) { + define( 'PLL_AJAX_ON_FRONT', self::is_ajax_on_front() ); + } + + // Admin + if ( ! defined( 'PLL_ADMIN' ) ) { + define( 'PLL_ADMIN', wp_doing_cron() || ( defined( 'WP_CLI' ) && WP_CLI ) || ( is_admin() && ! PLL_AJAX_ON_FRONT ) ); + } + + // Settings page whatever the tab except for the wizard which needs to be an admin process. + if ( ! defined( 'PLL_SETTINGS' ) ) { + define( 'PLL_SETTINGS', is_admin() && ( ( isset( $_GET['page'] ) && 0 === strpos( sanitize_key( $_GET['page'] ), 'mlang' ) && ! self::is_wizard() ) || ! empty( $_REQUEST['pll_ajax_settings'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification + } + } + + /** + * Polylang initialization + * setups models and separate admin and frontend + * + * @since 1.2 + */ + public function init() { + global $polylang; + + self::define_constants(); + $options = get_option( 'polylang' ); + + // Plugin upgrade + if ( $options && version_compare( $options['version'], POLYLANG_VERSION, '<' ) ) { + $upgrade = new PLL_Upgrade( $options ); + if ( ! $upgrade->upgrade() ) { // If the version is too old + return; + } + } + + // In some edge cases, it's possible that no options were found in the database. Load default options as we need some. + if ( ! $options ) { + $options = PLL_Install::get_default_options(); + } + + // Make sure that this filter is *always* added before PLL_Model::get_languages_list() is called for the first time + add_filter( 'pll_languages_list', array( 'PLL_Static_Pages', 'pll_languages_list' ), 2, 2 ); // Before PLL_Links_Model + + /** + * Filter the model class to use + * /!\ this filter is fired *before* the $polylang object is available + * + * @since 1.5 + * + * @param string $class either PLL_Model or PLL_Admin_Model + */ + $class = apply_filters( 'pll_model', PLL_SETTINGS || self::is_wizard() ? 'PLL_Admin_Model' : 'PLL_Model' ); + $model = new $class( $options ); + $links_model = $model->get_links_model(); + + if ( ! $model->get_languages_list() ) { + /** + * Fires when no language has been defined yet + * Used to load overridden textdomains + * + * @since 1.2 + */ + do_action( 'pll_no_language_defined' ); + } + + $class = ''; + + if ( PLL_SETTINGS ) { + $class = 'PLL_Settings'; + } elseif ( PLL_ADMIN ) { + $class = 'PLL_Admin'; + } elseif ( self::is_rest_request() ) { + $class = 'PLL_REST_Request'; + } elseif ( $model->get_languages_list() ) { + $class = 'PLL_Frontend'; + } + + /** + * Filters the class to use to instantiate the $polylang object + * + * @since 2.6 + * + * @param string $class A class name. + */ + $class = apply_filters( 'pll_context', $class ); + + if ( ! empty( $class ) ) { + $polylang = new $class( $links_model ); + + /** + * Fires after the $polylang object is created and before the API is loaded + * + * @since 2.0 + * + * @param object $polylang + */ + do_action_ref_array( 'pll_pre_init', array( &$polylang ) ); + + require_once __DIR__ . '/api.php'; // Loads the API + + // Loads the modules. + foreach ( glob( POLYLANG_DIR . '/modules/*/load.php', GLOB_NOSORT ) as $load_script ) { + require_once $load_script; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable + } + + $polylang->init(); + + /** + * Fires after the $polylang object and the API is loaded + * + * @since 1.7 + * + * @param object $polylang + */ + do_action_ref_array( 'pll_init', array( &$polylang ) ); + } + } +} diff --git a/wp-content/plugins/polylang/include/cookie.php b/wp-content/plugins/polylang/include/cookie.php new file mode 100644 index 00000000..a0a87530 --- /dev/null +++ b/wp-content/plugins/polylang/include/cookie.php @@ -0,0 +1,82 @@ + time() + $expiration, + 'path' => COOKIEPATH, + 'domain' => COOKIE_DOMAIN, // Cookie domain must be set to false for localhost ( default value for COOKIE_DOMAIN ) thanks to Stephen Harris. + 'secure' => is_ssl(), + 'httponly' => false, + 'samesite' => 'Lax', + ); + + return wp_parse_args( $args, $defaults ); + } + + /** + * Sets the cookie. + * + * @since 2.9 + * + * @param string $lang Language cookie value. + * @param array $args { + * Optional. Array of arguments for setting the cookie. + * + * @type string $path Cookie path, defaults to COOKIEPATH. + * @type string $domain Cookie domain, defaults to COOKIE_DOMAIN + * @type bool $secure Should the cookie be sent only over https? + * @type bool $httponly Should the cookie accessed only over http protocol? Defaults to false. + * @type string $samesite Either 'Strict', 'Lax' or 'None', defaults to 'Lax'. + * } + */ + public static function set( $lang, $args = array() ) { + $args = self::parse_args( $args ); + + if ( ! headers_sent() && PLL_COOKIE !== false && self::get() !== $lang ) { + if ( version_compare( PHP_VERSION, '7.3', '<' ) ) { + $args['path'] .= '; SameSite=' . $args['samesite']; // Hack to set SameSite value in PHP < 7.3. Doesn't work with newer versions. + setcookie( PLL_COOKIE, $lang, $args['expires'], $args['path'], $args['domain'], $args['secure'], $args['httponly'] ); + } else { + setcookie( PLL_COOKIE, $lang, $args ); + } + } + } + + /** + * Returns the language cookie value. + * + * @since 2.9 + * + * @return string + */ + public static function get() { + return isset( $_COOKIE[ PLL_COOKIE ] ) ? sanitize_key( $_COOKIE[ PLL_COOKIE ] ) : ''; + } +} diff --git a/wp-content/plugins/polylang/include/crud-posts.php b/wp-content/plugins/polylang/include/crud-posts.php new file mode 100644 index 00000000..9e205083 --- /dev/null +++ b/wp-content/plugins/polylang/include/crud-posts.php @@ -0,0 +1,303 @@ +model = &$polylang->model; + $this->pref_lang = &$polylang->pref_lang; + $this->curlang = &$polylang->curlang; + + add_action( 'save_post', array( $this, 'save_post' ), 10, 2 ); + add_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 4 ); + add_filter( 'wp_insert_post_parent', array( $this, 'wp_insert_post_parent' ), 10, 4 ); + add_action( 'before_delete_post', array( $this, 'delete_post' ) ); + + // Specific for media + if ( $polylang->options['media_support'] ) { + add_action( 'add_attachment', array( $this, 'set_default_language' ) ); + add_action( 'delete_attachment', array( $this, 'delete_post' ) ); + add_filter( 'wp_delete_file', array( $this, 'wp_delete_file' ) ); + } + } + + /** + * Allows to set a language by default for posts if it has no language yet + * + * @since 1.5 + * + * @param int $post_id + */ + public function set_default_language( $post_id ) { + if ( ! $this->model->post->get_language( $post_id ) ) { + if ( ! empty( $_GET['new_lang'] ) && $lang = $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + // Defined only on admin. + $this->model->post->set_language( $post_id, $lang ); + } elseif ( ! isset( $this->pref_lang ) && ! empty( $_REQUEST['lang'] ) && $lang = $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + // Testing $this->pref_lang makes this test pass only on admin. + $this->model->post->set_language( $post_id, $lang ); + } elseif ( ( $parent_id = wp_get_post_parent_id( $post_id ) ) && $parent_lang = $this->model->post->get_language( $parent_id ) ) { + $this->model->post->set_language( $post_id, $parent_lang ); + } elseif ( isset( $this->pref_lang ) ) { + // Always defined on admin, never defined on frontend + $this->model->post->set_language( $post_id, $this->pref_lang ); + } else { + // Only on frontend due to the previous test always true on admin + $this->model->post->set_language( $post_id, $this->curlang ); + } + } + } + + /** + * Called when a post ( or page ) is saved, published or updated + * + * @since 0.1 + * @since 2.3 Does not save the language and translations anymore, unless the post has no language yet + * + * @param int $post_id + * @param object $post + */ + public function save_post( $post_id, $post ) { + // Does nothing except on post types which are filterable + if ( $this->model->is_translated_post_type( $post->post_type ) ) { + if ( $id = wp_is_post_revision( $post_id ) ) { + $post_id = $id; + } + + $lang = $this->model->post->get_language( $post_id ); + + if ( empty( $lang ) ) { + $this->set_default_language( $post_id ); + } + + /** + * Fires after the post language and translations are saved + * + * @since 1.2 + * + * @param int $post_id Post id + * @param object $post Post object + * @param array $translations The list of translations post ids + */ + do_action( 'pll_save_post', $post_id, $post, $this->model->post->get_translations( $post_id ) ); + } + } + + /** + * Make sure saved terms are in the right language (especially tags with same name in different languages) + * + * @since 2.3 + * + * @param int $object_id Object ID. + * @param array $terms An array of object terms. + * @param array $tt_ids An array of term taxonomy IDs. + * @param string $taxonomy Taxonomy slug. + */ + public function set_object_terms( $object_id, $terms, $tt_ids, $taxonomy ) { + static $avoid_recursion; + + if ( ! $avoid_recursion && $this->model->is_translated_taxonomy( $taxonomy ) && ! empty( $terms ) ) { + $lang = $this->model->post->get_language( $object_id ); + + if ( ! empty( $lang ) && is_array( $terms ) ) { + // Convert to term ids if we got tag names + $strings = array_filter( $terms, 'is_string' ); + if ( ! empty( $strings ) ) { + $_terms = get_terms( $taxonomy, array( 'name' => $strings, 'object_ids' => $object_id, 'fields' => 'ids' ) ); + $terms = array_merge( array_diff( $terms, $strings ), $_terms ); + } + + $term_ids = array_combine( $terms, $terms ); + $languages = array_map( array( $this->model->term, 'get_language' ), $term_ids ); + $languages = array_filter( $languages ); // Remove terms without language. + $languages = wp_list_pluck( $languages, 'slug' ); + $wrong_terms = array_diff( $languages, array( $lang->slug ) ); + + if ( ! empty( $wrong_terms ) ) { + // We got terms in a wrong language + $wrong_term_ids = array_keys( $wrong_terms ); + $terms = get_the_terms( $object_id, $taxonomy ); + wp_remove_object_terms( $object_id, $wrong_term_ids, $taxonomy ); + + if ( is_array( $terms ) ) { + $newterms = array(); + + foreach ( $terms as $term ) { + if ( in_array( $term->term_id, $wrong_term_ids ) ) { + // Check if the term is in the correct language or if a translation exist ( mainly for default category ) + if ( $newterm = $this->model->term->get( $term->term_id, $lang ) ) { + $newterms[] = (int) $newterm; + } + + // Or choose the correct language for tags ( initially defined by name ) + elseif ( $newterm = $this->model->term_exists( $term->name, $taxonomy, $term->parent, $lang ) ) { + $newterms[] = (int) $newterm; // Cast is important otherwise we get 'numeric' tags + } + + // Or create the term in the correct language + elseif ( ! is_wp_error( $term_info = wp_insert_term( $term->name, $taxonomy ) ) ) { + $newterms[] = (int) $term_info['term_id']; + } + } + } + + $avoid_recursion = true; + wp_set_object_terms( $object_id, array_unique( $newterms ), $taxonomy, true ); // Append + $avoid_recursion = false; + } + } + } + } + } + + /** + * Make sure that the post parent is in the correct language when using bulk edit + * + * @since 1.8 + * + * @param int $post_parent Post parent ID. + * @param int $post_id Post ID. + * @param array $new_postarr Array of parsed post data. + * @param array $postarr Array of sanitized, but otherwise unmodified post data. + * @return int + */ + public function wp_insert_post_parent( $post_parent, $post_id, $new_postarr, $postarr ) { + if ( isset( $postarr['bulk_edit'], $postarr['inline_lang_choice'] ) ) { + check_admin_referer( 'bulk-posts' ); + $lang = -1 == $postarr['inline_lang_choice'] ? + $this->model->post->get_language( $post_id ) : + $this->model->get_language( $postarr['inline_lang_choice'] ); + // Dont break the hierarchy in case the post has no language + if ( ! empty( $lang ) ) { + $post_parent = $this->model->post->get_translation( $post_parent, $lang ); + } + } + return $post_parent; + } + + /** + * Called when a post, page or media is deleted + * Don't delete translations if this is a post revision thanks to AndyDeGroo who catched this bug + * http://wordpress.org/support/topic/plugin-polylang-quick-edit-still-breaks-translation-linking-of-pages-in-072 + * + * @since 0.1 + * + * @param int $post_id + */ + public function delete_post( $post_id ) { + if ( ! wp_is_post_revision( $post_id ) ) { + $this->model->post->delete_translation( $post_id ); + } + } + + /** + * Prevents WP deleting files when there are still media using them + * Thanks to Bruno "Aesqe" Babic and its plugin file gallery in which I took all the ideas for this function + * + * @since 0.9 + * + * @param string $file Path to the file to delete. + * @return string Empty or unmodified path. + */ + public function wp_delete_file( $file ) { + global $wpdb; + + $uploadpath = wp_upload_dir(); + + $ids = $wpdb->get_col( + $wpdb->prepare( + "SELECT post_id FROM $wpdb->postmeta + WHERE meta_key = '_wp_attached_file' AND meta_value = %s", + substr_replace( $file, '', 0, strlen( trailingslashit( $uploadpath['basedir'] ) ) ) + ) + ); + + if ( ! empty( $ids ) ) { + // Regenerate intermediate sizes if it's an image ( since we could not prevent WP deleting them before ). + require_once ABSPATH . 'wp-admin/includes/image.php'; // In case the file is deleted outside admin. + wp_update_attachment_metadata( $ids[0], wp_slash( wp_generate_attachment_metadata( $ids[0], $file ) ) ); // Directly uses update_post_meta, so expects slashed. + return ''; // Prevent deleting the main file. + } + + return $file; + } + + /** + * Creates a media translation + * + * @since 1.8 + * + * @param int $post_id Original attachment id. + * @param string|object $lang New translation language. + * @return int Attachment id of the translated media. + */ + public function create_media_translation( $post_id, $lang ) { + if ( empty( $post_id ) ) { + return $post_id; + } + + $post = get_post( $post_id ); + + if ( empty( $post ) ) { + return $post; + } + + $lang = $this->model->get_language( $lang ); // Make sure we get a valid language slug. + + // Create a new attachment ( translate attachment parent if exists ). + add_filter( 'pll_enable_duplicate_media', '__return_false', 99 ); // Avoid a conflict with automatic duplicate at upload. + $post->ID = null; // Will force the creation + $post->post_parent = ( $post->post_parent && $tr_parent = $this->model->post->get_translation( $post->post_parent, $lang->slug ) ) ? $tr_parent : 0; + $post->tax_input = array( 'language' => array( $lang->slug ) ); // Assigns the language. + $tr_id = wp_insert_attachment( wp_slash( (array) $post ) ); + remove_filter( 'pll_enable_duplicate_media', '__return_false', 99 ); // Restore automatic duplicate at upload. + + // Copy metadata. + if ( $data = wp_get_attachment_metadata( $post_id, true ) ) { // Unfiltered. + wp_update_attachment_metadata( $tr_id, wp_slash( $data ) ); // Directly uses update_post_meta, so expects slashed. + } + + // Copy attached file. + if ( $file = get_attached_file( $post_id, true ) ) { // Unfiltered. + update_attached_file( $tr_id, wp_slash( $file ) ); // Directly uses update_post_meta, so expects slashed. + } + + // Copy alternative text. Direct use of the meta as there is no filtered wrapper to manipulate it. + if ( $text = get_post_meta( $post_id, '_wp_attachment_image_alt', true ) ) { + add_post_meta( $tr_id, '_wp_attachment_image_alt', wp_slash( $text ) ); + } + + $this->model->post->set_language( $tr_id, $lang ); + + $translations = $this->model->post->get_translations( $post_id ); + $translations[ $lang->slug ] = $tr_id; + $this->model->post->save_translations( $tr_id, $translations ); + + /** + * Fires after a media translation is created + * + * @since 1.6.4 + * + * @param int $post_id Post id of the source media. + * @param int $tr_id Post id of the new media translation. + * @param string $slug Language code of the new translation. + */ + do_action( 'pll_translate_media', $post_id, $tr_id, $lang->slug ); + return $tr_id; + } +} diff --git a/wp-content/plugins/polylang/include/crud-terms.php b/wp-content/plugins/polylang/include/crud-terms.php new file mode 100644 index 00000000..6f122a76 --- /dev/null +++ b/wp-content/plugins/polylang/include/crud-terms.php @@ -0,0 +1,209 @@ +model = &$polylang->model; + $this->curlang = &$polylang->curlang; + $this->filter_lang = &$polylang->filter_lang; + $this->pref_lang = &$polylang->pref_lang; + + // Saving terms + add_action( 'create_term', array( $this, 'save_term' ), 999, 3 ); + add_action( 'edit_term', array( $this, 'save_term' ), 999, 3 ); // After PLL_Admin_Filters_Term + + // Adds cache domain when querying terms + add_filter( 'get_terms_args', array( $this, 'get_terms_args' ), 10, 2 ); + + // Filters terms by language + add_filter( 'terms_clauses', array( $this, 'terms_clauses' ), 10, 3 ); + add_action( 'pre_get_posts', array( $this, 'set_tax_query_lang' ), 999 ); + add_action( 'posts_selection', array( $this, 'unset_tax_query_lang' ), 0 ); + + // Deleting terms + add_action( 'pre_delete_term', array( $this, 'delete_term' ) ); + } + + /** + * Allows to set a language by default for terms if it has no language yet + * + * @since 1.5.4 + * + * @param int $term_id + * @param string $taxonomy + */ + protected function set_default_language( $term_id, $taxonomy ) { + if ( ! $this->model->term->get_language( $term_id ) ) { + if ( ! isset( $this->pref_lang ) && ! empty( $_REQUEST['lang'] ) && $lang = $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification + // Testing $this->pref_lang makes this test pass only on frontend. + $this->model->term->set_language( $term_id, $lang ); + } elseif ( ( $term = get_term( $term_id, $taxonomy ) ) && ! empty( $term->parent ) && $parent_lang = $this->model->term->get_language( $term->parent ) ) { + // Sets language from term parent if exists thanks to Scott Kingsley Clark + $this->model->term->set_language( $term_id, $parent_lang ); + } elseif ( isset( $this->pref_lang ) ) { + // Always defined on admin, never defined on frontend + $this->model->term->set_language( $term_id, $this->pref_lang ); + } else { + // Only on frontend due to the previous test always true on admin + $this->model->term->set_language( $term_id, $this->curlang ); + } + } + } + + /** + * Called when a category or post tag is created or edited + * Does nothing except on taxonomies which are filterable + * + * @since 0.1 + * + * @param int $term_id + * @param int $tt_id Term taxonomy id + * @param string $taxonomy + */ + public function save_term( $term_id, $tt_id, $taxonomy ) { + if ( $this->model->is_translated_taxonomy( $taxonomy ) ) { + + $lang = $this->model->term->get_language( $term_id ); + + if ( empty( $lang ) ) { + $this->set_default_language( $term_id, $taxonomy ); + } + + /** + * Fires after the term language and translations are saved + * + * @since 1.2 + * + * @param int $term_id term id + * @param string $taxonomy taxonomy name + * @param array $translations the list of translations term ids + */ + do_action( 'pll_save_term', $term_id, $taxonomy, $this->model->term->get_translations( $term_id ) ); + } + } + + /** + * Get the language(s) to filter get_terms + * + * @since 1.7.6 + * + * @param array $taxonomies queried taxonomies + * @param array $args get_terms arguments + * @return object|string|bool the language(s) to use in the filter, false otherwise + */ + protected function get_queried_language( $taxonomies, $args ) { + // Does nothing except on taxonomies which are filterable + // Since WP 4.7, make sure not to filter wp_get_object_terms() + if ( ! $this->model->is_translated_taxonomy( $taxonomies ) || ! empty( $args['object_ids'] ) ) { + return false; + } + + // If get_terms is queried with a 'lang' parameter + if ( isset( $args['lang'] ) ) { + return $args['lang']; + } + + // On tags page, everything should be filtered according to the admin language filter except the parent dropdown + if ( 'edit-tags.php' === $GLOBALS['pagenow'] && empty( $args['class'] ) ) { + return $this->filter_lang; + } + + return $this->curlang; + } + + /** + * Adds language dependent cache domain when querying terms + * Useful as the 'lang' parameter is not included in cache key by WordPress + * + * @since 1.3 + * + * @param array $args + * @param array $taxonomies + * @return array modified arguments + */ + public function get_terms_args( $args, $taxonomies ) { + // Don't break _get_term_hierarchy() + if ( 'all' === $args['get'] && 'id' === $args['orderby'] && 'id=>parent' === $args['fields'] ) { + $args['lang'] = ''; + } + + if ( isset( $this->tax_query_lang ) ) { + $args['lang'] = empty( $this->tax_query_lang ) && ! empty( $this->curlang ) && ! empty( $args['slug'] ) ? $this->curlang->slug : $this->tax_query_lang; + } + + if ( $lang = $this->get_queried_language( $taxonomies, $args ) ) { + $lang = is_string( $lang ) && strpos( $lang, ',' ) ? explode( ',', $lang ) : $lang; + $key = '_' . ( is_array( $lang ) ? implode( ',', $lang ) : $this->model->get_language( $lang )->slug ); + $args['cache_domain'] = empty( $args['cache_domain'] ) ? 'pll' . $key : $args['cache_domain'] . $key; + } + return $args; + } + + /** + * Filters categories and post tags by language(s) when needed on admin side + * + * @since 0.2 + * + * @param array $clauses list of sql clauses + * @param array $taxonomies list of taxonomies + * @param array $args get_terms arguments + * @return array modified sql clauses + */ + public function terms_clauses( $clauses, $taxonomies, $args ) { + $lang = $this->get_queried_language( $taxonomies, $args ); + return $this->model->terms_clauses( $clauses, $lang ); + } + + /** + * Sets the WP_Term_Query language when doing a WP_Query + * Needed since WP 4.9 + * + * @since 2.3.2 + * + * @param object $query WP_Query object + */ + public function set_tax_query_lang( $query ) { + $this->tax_query_lang = isset( $query->query_vars['lang'] ) ? $query->query_vars['lang'] : ''; + } + + /** + * Removes the WP_Term_Query language filter for WP_Query + * Needed since WP 4.9 + * + * @since 2.3.2 + */ + public function unset_tax_query_lang() { + unset( $this->tax_query_lang ); + } + + /** + * Called when a category or post tag is deleted + * Deletes language and translations + * + * @since 0.1 + * + * @param int $term_id + */ + public function delete_term( $term_id ) { + $this->model->term->delete_translation( $term_id ); + $this->model->term->delete_language( $term_id ); + } +} diff --git a/wp-content/plugins/polylang/include/filters-links.php b/wp-content/plugins/polylang/include/filters-links.php new file mode 100644 index 00000000..68b0ff1b --- /dev/null +++ b/wp-content/plugins/polylang/include/filters-links.php @@ -0,0 +1,171 @@ +links = &$polylang->links; + $this->links_model = &$polylang->links_model; + $this->model = &$polylang->model; + $this->options = &$polylang->options; + $this->curlang = &$polylang->curlang; + + // Low priority on links filters to come after any other modifications. + if ( $this->options['force_lang'] ) { + add_filter( 'post_link', array( $this, 'post_type_link' ), 20, 2 ); + add_filter( '_get_page_link', array( $this, '_get_page_link' ), 20, 2 ); + } + + add_filter( 'post_type_link', array( $this, 'post_type_link' ), 20, 2 ); + add_filter( 'term_link', array( $this, 'term_link' ), 20, 3 ); + + if ( $this->options['force_lang'] > 0 ) { + add_filter( 'attachment_link', array( $this, 'attachment_link' ), 20, 2 ); + } + + // Keeps the preview post link on default domain when using multiple domains and SSO is not available. + if ( 3 === $this->options['force_lang'] && ! class_exists( 'PLL_Xdata_Domain' ) ) { + add_filter( 'preview_post_link', array( $this, 'preview_post_link' ), 20 ); + } + + // Rewrites post types archives links to filter them by language. + add_filter( 'post_type_archive_link', array( $this, 'post_type_archive_link' ), 20, 2 ); + } + + /** + * Modifies page links + * + * @since 1.7 + * + * @param string $link post link + * @param int $post_id post ID + * @return string modified post link + */ + public function _get_page_link( $link, $post_id ) { + // /!\ WP does not use pretty permalinks for preview + return false !== strpos( $link, 'preview=true' ) && false !== strpos( $link, 'page_id=' ) ? $link : $this->links_model->switch_language_in_link( $link, $this->model->post->get_language( $post_id ) ); + } + + /** + * Modifies attachment links + * + * @since 1.6.2 + * + * @param string $link attachment link + * @param int $post_id attachment link + * @return string modified attachment link + */ + public function attachment_link( $link, $post_id ) { + return wp_get_post_parent_id( $post_id ) ? $link : $this->links_model->switch_language_in_link( $link, $this->model->post->get_language( $post_id ) ); + } + + /** + * Modifies custom posts links + * + * @since 1.6 + * + * @param string $link post link + * @param object $post post object + * @return string modified post link + */ + public function post_type_link( $link, $post ) { + // /!\ WP does not use pretty permalinks for preview + if ( ( false === strpos( $link, 'preview=true' ) || false === strpos( $link, 'p=' ) ) && $this->model->is_translated_post_type( $post->post_type ) ) { + $lang = $this->model->post->get_language( $post->ID ); + $link = $this->options['force_lang'] ? $this->links_model->switch_language_in_link( $link, $lang ) : $link; + + /** + * Filter a post or custom post type link + * + * @since 1.6 + * + * @param string $link the post link + * @param object $lang the current language + * @param object $post the post object + */ + $link = apply_filters( 'pll_post_type_link', $link, $lang, $post ); + } + + return $link; + } + + /** + * Modifies term link + * + * @since 0.7 + * + * @param string $link term link + * @param object $term term object + * @param string $tax taxonomy name + * @return string modified term link + */ + public function term_link( $link, $term, $tax ) { + if ( $this->model->is_translated_taxonomy( $tax ) ) { + $lang = $this->model->term->get_language( $term->term_id ); + $link = $this->options['force_lang'] ? $this->links_model->switch_language_in_link( $link, $lang ) : $link; + + /** + * Filter a term link + * + * @since 1.6 + * + * @param string $link the term link + * @param object $lang the current language + * @param object $term the term object + */ + return apply_filters( 'pll_term_link', $link, $lang, $term ); + } + + // in case someone calls get_term_link for the 'language' taxonomy + if ( 'language' === $tax ) { + return $this->links_model->home_url( $term ); + } + + return $link; + } + + /** + * Keeps the preview post link on default domain when using multiple domains + * + * @since 1.6.1 + * + * @param string $url + * @return string modified url + */ + public function preview_post_link( $url ) { + return $this->links_model->remove_language_from_link( $url ); + } + + /** + * Modifies the post type archive links to add the language parameter + * only if the post type is translated + * + * The filter was originally only on frontend but is needed on admin too for + * compatibility with the archive link of the ACF link field since ACF 5.4.0 + * + * @since 1.7.6 + * + * @param string $link + * @param string $post_type + * @return string modified link + */ + public function post_type_archive_link( $link, $post_type ) { + return $this->model->is_translated_post_type( $post_type ) && 'post' !== $post_type ? $this->links_model->switch_language_in_link( $link, $this->curlang ) : $link; + } +} + diff --git a/wp-content/plugins/polylang/include/filters-sanitization.php b/wp-content/plugins/polylang/include/filters-sanitization.php new file mode 100644 index 00000000..1bdd2a12 --- /dev/null +++ b/wp-content/plugins/polylang/include/filters-sanitization.php @@ -0,0 +1,106 @@ +locale = $locale; + + // We need specific filters for some languages like German and Danish + $specific_locales = array( 'da_DK', 'de_DE', 'de_DE_formal', 'de_CH', 'de_CH_informal', 'ca', 'sr_RS', 'bs_BA' ); + if ( in_array( $locale, $specific_locales ) ) { + add_filter( 'sanitize_title', array( $this, 'sanitize_title' ), 10, 3 ); + add_filter( 'sanitize_user', array( $this, 'sanitize_user' ), 10, 3 ); + } + } + + /** + * Retrieve the locale code of the language. + * + * @since 2.0 + * + * @return string + */ + public function get_locale() { + return $this->locale; + } + + /** + * Maybe fix the result of sanitize_title() in case the languages include German or Danish + * Without this filter, if language of the title being sanitized is different from the language + * used for the admin interface and if one this language is German or Danish, some specific + * characters such as ä, ö, ü, ß are incorrectly sanitized. + * + * All the process is done by the remove_accents() WordPress function based on the locale value + * + * @link https://github.com/WordPress/WordPress/blob/5.5.1/wp-includes/formatting.php#L1920-L1944 + * + * @since 2.0 + * + * @param string $title Sanitized title. + * @param string $raw_title The title prior to sanitization. + * @param string $context The context for which the title is being sanitized. + * @return string + */ + public function sanitize_title( $title, $raw_title, $context ) { + static $once = false; + + if ( ! $once && 'save' == $context && ! empty( $title ) ) { + $once = true; + add_filter( 'locale', array( $this, 'get_locale' ), 20 ); // After the filter for the admin interface + $title = sanitize_title( $raw_title, '', $context ); + remove_filter( 'locale', array( $this, 'get_locale' ), 20 ); + $once = false; + } + return $title; + } + + /** + * Maybe fix the result of sanitize_user() in case the languages include German or Danish + * + * All the process is done by the remove_accents() WordPress function based on the locale value + * + * @link https://github.com/WordPress/WordPress/blob/5.5-branch/wp-includes/formatting.php#L1920-L1944 + * + * @since 2.0 + * + * @param string $username Sanitized username. + * @param string $raw_username The username prior to sanitization. + * @param bool $strict Whether to limit the sanitization to specific characters. Default false. + * @return string + */ + public function sanitize_user( $username, $raw_username, $strict ) { + static $once = false; + + if ( ! $once ) { + $once = true; + add_filter( 'locale', array( $this, 'get_locale' ), 20 ); // After the filter for the admin interface + $username = sanitize_user( $raw_username, $strict ); + remove_filter( 'locale', array( $this, 'get_locale' ), 20 ); + $once = false; + } + return $username; + } +} diff --git a/wp-content/plugins/polylang/include/filters.php b/wp-content/plugins/polylang/include/filters.php new file mode 100644 index 00000000..dc42cc1b --- /dev/null +++ b/wp-content/plugins/polylang/include/filters.php @@ -0,0 +1,385 @@ +links_model = &$polylang->links_model; + $this->model = &$polylang->model; + $this->options = &$polylang->options; + $this->curlang = &$polylang->curlang; + + // Deletes our cache for sticky posts when the list is updated. + add_action( 'update_option_sticky_posts', array( $this, 'delete_sticky_posts_cache' ) ); + add_action( 'add_option_sticky_posts', array( $this, 'delete_sticky_posts_cache' ) ); + add_action( 'delete_option_sticky_posts', array( $this, 'delete_sticky_posts_cache' ) ); + + // Filters the comments according to the current language + add_action( 'parse_comment_query', array( $this, 'parse_comment_query' ) ); + add_filter( 'comments_clauses', array( $this, 'comments_clauses' ), 10, 2 ); + + // Filters the get_pages function according to the current language + add_filter( 'get_pages', array( $this, 'get_pages' ), 10, 2 ); + + // Rewrites next and previous post links to filter them by language + add_filter( 'get_previous_post_join', array( $this, 'posts_join' ), 10, 5 ); + add_filter( 'get_next_post_join', array( $this, 'posts_join' ), 10, 5 ); + add_filter( 'get_previous_post_where', array( $this, 'posts_where' ), 10, 5 ); + add_filter( 'get_next_post_where', array( $this, 'posts_where' ), 10, 5 ); + + // Converts the locale to a valid W3C locale + add_filter( 'language_attributes', array( $this, 'language_attributes' ) ); + + // Prevents deleting all the translations of the default category + add_filter( 'map_meta_cap', array( $this, 'fix_delete_default_category' ), 10, 4 ); + + // Translate the site title in emails sent to users + add_filter( 'password_change_email', array( $this, 'translate_user_email' ) ); + add_filter( 'email_change_email', array( $this, 'translate_user_email' ) ); + + // Translates the privacy policy page + add_filter( 'option_wp_page_for_privacy_policy', array( $this, 'translate_page_for_privacy_policy' ), 20 ); // Since WP 4.9.6 + add_filter( 'map_meta_cap', array( $this, 'fix_privacy_policy_page_editing' ), 10, 4 ); + + // Personal data exporter + add_filter( 'wp_privacy_personal_data_exporters', array( $this, 'register_personal_data_exporter' ), 0 ); // Since WP 4.9.6 + } + + /** + * Deletes the cache for multilingual sticky posts. + * + * @since 2.8.4 + */ + public function delete_sticky_posts_cache() { + wp_cache_delete( 'sticky_posts', 'options' ); + } + + /** + * Get the language to filter a comments query + * + * @since 2.0 + * + * @param object $query + * @return object|bool the language(s) to use in the filter, false otherwise + */ + protected function get_comments_queried_language( $query ) { + // Don't filter comments if comment ids or post ids are specified + $plucked = wp_array_slice_assoc( $query->query_vars, array( 'comment__in', 'parent', 'post_id', 'post__in', 'post_parent' ) ); + $fields = array_filter( $plucked ); + if ( ! empty( $fields ) ) { + return false; + } + + // Don't filter comments if a non translated post type is specified + if ( ! empty( $query->query_vars['post_type'] ) && ! $this->model->is_translated_post_type( $query->query_vars['post_type'] ) ) { + return false; + } + + return empty( $query->query_vars['lang'] ) ? $this->curlang : $this->model->get_language( $query->query_vars['lang'] ); + } + + /** + * Adds language dependent cache domain when querying comments + * Useful as the 'lang' parameter is not included in cache key by WordPress + * Needed since WP 4.6 as comments have been added to persistent cache. See #36906, #37419 + * + * @since 2.0 + * + * @param object $query + */ + public function parse_comment_query( $query ) { + if ( $lang = $this->get_comments_queried_language( $query ) ) { + $key = '_' . ( is_array( $lang ) ? implode( ',', $lang ) : $this->model->get_language( $lang )->slug ); + $query->query_vars['cache_domain'] = empty( $query->query_vars['cache_domain'] ) ? 'pll' . $key : $query->query_vars['cache_domain'] . $key; + } + } + + /** + * Filters the comments according to the current language + * Used by the recent comments widget and admin language filter + * + * @since 0.2 + * + * @param array $clauses sql clauses + * @param object $query WP_Comment_Query object + * @return array modified $clauses + */ + public function comments_clauses( $clauses, $query ) { + global $wpdb; + + $lang = $this->get_comments_queried_language( $query ); + + if ( ! empty( $lang ) ) { + // If this clause is not already added by WP + if ( ! strpos( $clauses['join'], '.ID' ) ) { + $clauses['join'] .= " JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID"; + } + + $clauses['join'] .= $this->model->post->join_clause(); + $clauses['where'] .= $this->model->post->where_clause( $lang ); + } + return $clauses; + } + + /** + * Filters get_pages per language + * + * @since 1.4 + * + * @param array $pages an array of pages already queried + * @param array $args get_pages arguments + * @return array modified list of pages + */ + public function get_pages( $pages, $args ) { + if ( isset( $args['lang'] ) && empty( $args['lang'] ) ) { + return $pages; + } + + $language = empty( $args['lang'] ) ? $this->curlang : $this->model->get_language( $args['lang'] ); + + if ( empty( $language ) || empty( $pages ) || ! $this->model->is_translated_post_type( $args['post_type'] ) ) { + return $pages; + } + + static $once = false; + + // Obliged to redo the get_pages query if we want to get the right number + if ( ! empty( $args['number'] ) && ! $once ) { + $once = true; // avoid infinite loop + + $r = array( + 'lang' => 0, // So this query is not filtered + 'numberposts' => -1, + 'nopaging' => true, + 'post_type' => $args['post_type'], + 'fields' => 'ids', + 'tax_query' => array( + array( + 'taxonomy' => 'language', + 'field' => 'term_taxonomy_id', // Since WP 3.5 + 'terms' => $language->term_taxonomy_id, + 'operator' => 'NOT IN', + ), + ), + ); + + // Take care that 'exclude' argument accepts integer or strings too + $args['exclude'] = array_merge( wp_parse_id_list( $args['exclude'] ), get_posts( $r ) ); + $pages = get_pages( $args ); + } + + $ids = wp_list_pluck( $pages, 'ID' ); + + // Filters the queried list of pages by language + if ( ! $once ) { + $ids = array_intersect( $ids, $this->model->post->get_objects_in_language( $language ) ); + + foreach ( $pages as $key => $page ) { + if ( ! in_array( $page->ID, $ids ) ) { + unset( $pages[ $key ] ); + } + } + + $pages = array_values( $pages ); // In case 3rd parties suppose the existence of $pages[0] + } + + // Not done by WP but extremely useful for performance when manipulating taxonomies + update_object_term_cache( $ids, $args['post_type'] ); + + $once = false; // In case get_pages is called another time + return $pages; + } + + /** + * Modifies the sql request for get_adjacent_post to filter by the current language + * + * @since 0.1 + * + * @param string $sql The JOIN clause in the SQL. + * @param bool $in_same_term Whether post should be in a same taxonomy term. + * @param array $excluded_terms Array of excluded term IDs. + * @param string $taxonomy Taxonomy. Used to identify the term used when `$in_same_term` is true. + * @param WP_Post $post WP_Post object. + * @return string modified JOIN clause + */ + public function posts_join( $sql, $in_same_term, $excluded_terms, $taxonomy = '', $post = null ) { + return $this->model->is_translated_post_type( $post->post_type ) && ! empty( $this->curlang ) ? $sql . $this->model->post->join_clause( 'p' ) : $sql; + } + + /** + * Modifies the sql request for wp_get_archives and get_adjacent_post to filter by the current language + * + * @since 0.1 + * + * @param string $sql The WHERE clause in the SQL. + * @param bool $in_same_term Whether post should be in a same taxonomy term. + * @param array $excluded_terms Array of excluded term IDs. + * @param string $taxonomy Taxonomy. Used to identify the term used when `$in_same_term` is true. + * @param WP_Post $post WP_Post object. + * @return string modified WHERE clause + */ + public function posts_where( $sql, $in_same_term, $excluded_terms, $taxonomy = '', $post = null ) { + return $this->model->is_translated_post_type( $post->post_type ) && ! empty( $this->curlang ) ? $sql . $this->model->post->where_clause( $this->curlang ) : $sql; + } + + /** + * Converts WordPress locale to valid W3 locale in html language attributes + * + * @since 1.8 + * + * @param string $output language attributes + * @return string + */ + public function language_attributes( $output ) { + if ( $language = $this->model->get_language( is_admin() ? get_user_locale() : get_locale() ) ) { + $output = str_replace( '"' . get_bloginfo( 'language' ) . '"', '"' . $language->get_locale( 'display' ) . '"', $output ); + } + return $output; + } + + /** + * Prevents deleting all the translations of the default category + * + * @since 2.1 + * + * @param array $caps The user's actual capabilities. + * @param string $cap Capability name. + * @param int $user_id The user ID. + * @param array $args Adds the context to the cap. The category id. + * @return array + */ + public function fix_delete_default_category( $caps, $cap, $user_id, $args ) { + if ( 'delete_term' === $cap ) { + $term = get_term( reset( $args ) ); // Since WP 4.4, we can get the term to get the taxonomy + if ( $term instanceof WP_Term ) { + $default_cat = get_option( 'default_' . $term->taxonomy ); + if ( $default_cat && array_intersect( $args, $this->model->term->get_translations( $default_cat ) ) ) { + $caps[] = 'do_not_allow'; + } + } + } + + return $caps; + } + + /** + * Translates the site title in emails sent to the user (change email, reset password) + * It is necessary to filter the email because WP evaluates the site title before calling switch_to_locale() + * + * @since 2.1.3 + * + * @param array $email + * @return array + */ + public function translate_user_email( $email ) { + $blog_name = wp_specialchars_decode( pll__( get_option( 'blogname' ) ), ENT_QUOTES ); + $email['subject'] = sprintf( $email['subject'], $blog_name ); + $email['message'] = str_replace( '###SITENAME###', $blog_name, $email['message'] ); + return $email; + } + + /** + * Translates the privacy policy page, on both frontend and admin + * + * @since 2.3.6 + * + * @param int $id Privacy policy page id + * @return int + */ + public function translate_page_for_privacy_policy( $id ) { + return empty( $this->curlang ) ? $id : $this->model->post->get( $id, $this->curlang ); + } + + /** + * Prevents edit and delete links for the translations of the privacy policy page for non admin + * + * @since 2.3.7 + * + * @param array $caps The user's actual capabilities. + * @param string $cap Capability name. + * @param int $user_id The user ID. + * @param array $args Adds the context to the cap. The category id. + * @return array + */ + public function fix_privacy_policy_page_editing( $caps, $cap, $user_id, $args ) { + if ( in_array( $cap, array( 'edit_page', 'edit_post', 'delete_page', 'delete_post' ) ) ) { + $privacy_page = get_option( 'wp_page_for_privacy_policy' ); + if ( $privacy_page && array_intersect( $args, $this->model->post->get_translations( $privacy_page ) ) ) { + $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); + } + } + + return $caps; + } + + /** + * Register our personal data exporter + * + * @since 2.3.6 + * + * @param array $exporters Personal data exporters + * @retun array + */ + public function register_personal_data_exporter( $exporters ) { + $exporters[] = array( + 'exporter_friendly_name' => __( 'Translated user descriptions', 'polylang' ), + 'callback' => array( $this, 'user_data_exporter' ), + ); + return $exporters; + } + + /** + * Export translated user description as WP exports only the description in the default language + * + * @since 2.3.6 + * + * @param string $email_address User email address + * @return array Personal data + */ + public function user_data_exporter( $email_address ) { + $email_address = trim( $email_address ); + $data_to_export = array(); + $user_data_to_export = array(); + + if ( $user = get_user_by( 'email', $email_address ) ) { + foreach ( $this->model->get_languages_list() as $lang ) { + if ( $lang->slug !== $this->options['default_lang'] && $value = get_user_meta( $user->ID, 'description_' . $lang->slug, true ) ) { + $user_data_to_export[] = array( + /* translators: %s is a language native name */ + 'name' => sprintf( __( 'User description - %s', 'polylang' ), $lang->name ), + 'value' => $value, + ); + } + } + + if ( ! empty( $user_data_to_export ) ) { + $data_to_export[] = array( + 'group_id' => 'user', + 'group_label' => __( 'User', 'polylang' ), + 'item_id' => "user-{$user->ID}", + 'data' => $user_data_to_export, + ); + } + } + + return array( + 'data' => $data_to_export, + 'done' => true, + ); + } +} diff --git a/wp-content/plugins/polylang/include/functions.php b/wp-content/plugins/polylang/include/functions.php new file mode 100644 index 00000000..81b6e68f --- /dev/null +++ b/wp-content/plugins/polylang/include/functions.php @@ -0,0 +1,109 @@ + id of term in 'language' taxonomy + * name => language name. Ex: English + * slug => language code used in url. Ex: en + * term_group => order of the language when displayed in a list of languages + * term_taxonomy_id => term taxonomy id in 'language' taxonomy + * taxonomy => 'language' + * description => language locale for backward compatibility + * parent => 0 / not used + * count => number of posts and pages in that language + * tl_term_id => id of the term in 'term_language' taxonomy + * tl_term_taxonomy_id => term taxonomy id in 'term_language' taxonomy + * tl_count => number of terms in that language ( not used by Polylang ) + * locale => WordPress language locale. Ex: en_US + * is_rtl => 1 if the language is rtl + * w3c => W3C locale + * flag_code => code of the flag + * flag_url => url of the flag + * flag => html img of the flag + * custom_flag_url => url of the custom flag if exists, internal use only, moves to flag_url on frontend + * custom_flag => html img of the custom flag if exists, internal use only, moves to flag on frontend + * home_url => home url in this language + * search_url => home url to use in search forms + * host => host of this language + * mo_id => id of the post storing strings translations + * page_on_front => id of the page on front in this language ( set from pll_languages_list filter ) + * page_for_posts => id of the page for posts in this language ( set from pll_languages_list filter ) + * + * @since 1.2 + */ +class PLL_Language { + public $term_id, $name, $slug, $term_group, $term_taxonomy_id, $taxonomy, $description, $parent, $count; + public $tl_term_id, $tl_term_taxonomy_id, $tl_count; + public $locale, $is_rtl; + public $w3c, $facebook; + public $flag_url, $flag; + public $home_url, $search_url; + public $host, $mo_id; + public $page_on_front, $page_for_posts; + + /** + * Constructor: builds a language object given its two corresponding terms in language and term_language taxonomies + * + * @since 1.2 + * + * @param object|array $language 'language' term or language object properties stored as an array + * @param object $term_language Corresponding 'term_language' term + */ + public function __construct( $language, $term_language = null ) { + // Build the object from all properties stored as an array + if ( empty( $term_language ) ) { + foreach ( $language as $prop => $value ) { + $this->$prop = $value; + } + } + + // Build the object from taxonomies + else { + foreach ( $language as $prop => $value ) { + $this->$prop = in_array( $prop, array( 'term_id', 'term_taxonomy_id', 'count' ) ) ? (int) $language->$prop : $language->$prop; + } + + $this->tl_term_id = (int) $term_language->term_id; + $this->tl_term_taxonomy_id = (int) $term_language->term_taxonomy_id; + $this->tl_count = (int) $term_language->count; + + // The description field can contain any property + // Backward compatibility for is_rtl + $description = maybe_unserialize( $language->description ); + foreach ( $description as $prop => $value ) { + 'rtl' == $prop ? $this->is_rtl = $value : $this->$prop = $value; + } + + $this->description = &$this->locale; // Backward compatibility with Polylang < 1.2 + + $this->mo_id = PLL_MO::get_id( $this ); + + $languages = include POLYLANG_DIR . '/settings/languages.php'; + $this->w3c = isset( $languages[ $this->locale ]['w3c'] ) ? $languages[ $this->locale ]['w3c'] : str_replace( '_', '-', $this->locale ); + if ( isset( $languages[ $this->locale ]['facebook'] ) ) { + $this->facebook = $languages[ $this->locale ]['facebook']; + } + } + } + + /** + * Get the flag informations + * 'url' => Flag url + * 'src' => Optional, src attribute value if different of the url, for example if base64 encoded + * 'width' => Optional, flag width in pixels + * 'height' => Optional, flag height in pixels + * + * @since 2.6 + * + * @param string $code Flag code. + * @return array Flag informations. + */ + public static function get_flag_informations( $code ) { + $flag = array( 'url' => '' ); + + // Polylang builtin flags + if ( ! empty( $code ) && file_exists( POLYLANG_DIR . ( $file = '/flags/' . $code . '.png' ) ) ) { + $flag['url'] = $_url = plugins_url( $file, POLYLANG_FILE ); + } + + /** + * Filter flag informations + * 'url' => Flag url + * 'src' => Optional, src attribute value if different of the url, for example if base64 encoded + * 'width' => Optional, flag width in pixels + * 'height' => Optional, flag height in pixels + * + * @since 2.4 + * + * @param array $flag Information about the flag + * @param string $code Flag code + */ + $flag = apply_filters( 'pll_flag', $flag, $code ); + + if ( empty( $flag['src'] ) ) { + // If using predefined flags and base64 encoded flags are preferred + if ( isset( $_url ) && $flag['url'] === $_url && ( ! defined( 'PLL_ENCODED_FLAGS' ) || PLL_ENCODED_FLAGS ) ) { + list( $flag['width'], $flag['height'] ) = getimagesize( POLYLANG_DIR . $file ); + $file_contents = file_get_contents( POLYLANG_DIR . $file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + $flag['src'] = 'data:image/png;base64,' . base64_encode( $file_contents ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + } else { + $flag['src'] = esc_url( set_url_scheme( $flag['url'], 'relative' ) ); + } + } + + $flag['url'] = esc_url_raw( $flag['url'] ); + + return $flag; + } + + /** + * Sets flag_url and flag properties + * + * @since 1.2 + */ + public function set_flag() { + $flags = array( 'flag' => self::get_flag_informations( $this->flag_code ) ); + + // Custom flags ? + $directories = array( + PLL_LOCAL_DIR, + get_stylesheet_directory() . '/polylang', + get_template_directory() . '/polylang', + ); + + foreach ( $directories as $dir ) { + if ( file_exists( $file = "{$dir}/{$this->locale}.png" ) || file_exists( $file = "{$dir}/{$this->locale}.jpg" ) || file_exists( $file = "{$dir}/{$this->locale}.svg" ) ) { + $flags['custom_flag']['url'] = content_url( '/' . str_replace( WP_CONTENT_DIR, '', $file ) ); + break; + } + } + + /** + * Filter the custom flag informations + * 'url' => Flag url + * 'src' => Optional, src attribute value if different of the url, for example if base64 encoded + * 'width' => Optional, flag width in pixels + * 'height' => Optional, flag height in pixels + * + * @since 2.4 + * + * @param array $flag Information about the custom flag + * @param string $code Flag code + */ + $flags['custom_flag'] = apply_filters( 'pll_custom_flag', empty( $flags['custom_flag'] ) ? null : $flags['custom_flag'], $this->flag_code ); + + if ( ! empty( $flags['custom_flag']['url'] ) ) { + if ( empty( $flags['custom_flag']['src'] ) ) { + $flags['custom_flag']['src'] = esc_url( set_url_scheme( $flags['custom_flag']['url'], 'relative' ) ); + } + + $flags['custom_flag']['url'] = esc_url_raw( $flags['custom_flag']['url'] ); + } else { + unset( $flags['custom_flag'] ); + } + + /** + * Filter the flag title attribute + * Defaults to the language name + * + * @since 0.7 + * + * @param string $title the flag title attribute + * @param string $slug the language code + * @param string $locale the language locale + */ + $title = apply_filters( 'pll_flag_title', $this->name, $this->slug, $this->locale ); + + foreach ( $flags as $key => $flag ) { + $this->{$key . '_url'} = empty( $flag['url'] ) ? '' : $flag['url']; + + /** + * Filter the html markup of a flag + * + * @since 1.0.2 + * + * @param string $flag html markup of the flag or empty string + * @param string $slug language code + */ + $this->{$key} = apply_filters( + 'pll_get_flag', + self::get_flag_html( $flag, $title, $this->name ), + $this->slug + ); + } + } + + /** + * Get HTML code for flag + * + * @since 2.7 + * + * @param array $flag flag properties: src, width and height + * @param string $title optional title attribute + * @param string $alt optional alt attribute + */ + public static function get_flag_html( $flag, $title = '', $alt = '' ) { + if ( empty( $flag['src'] ) ) { + return ''; + } + + $title_attr = empty( $title ) ? '' : sprintf( ' title="%s"', esc_attr( $title ) ); + $alt_attr = empty( $alt ) ? '' : sprintf( ' alt="%s"', esc_attr( $alt ) ); + $width_attr = empty( $flag['width'] ) ? '' : sprintf( ' width="%s"', (int) $flag['width'] ); + $height_attr = empty( $flag['height'] ) ? '' : sprintf( ' height="%s"', (int) $flag['height'] ); + + $style = ''; + $sizes = array_intersect_key( $flag, array_flip( array( 'width', 'height' ) ) ); + + if ( ! empty( $sizes ) ) { + array_walk( + $sizes, + function ( &$value, $key ) { + $value = sprintf( '%s: %dpx;', esc_attr( $key ), (int) $value ); + } + ); + $style = sprintf( ' style="%s"', implode( ' ', $sizes ) ); + } + + return sprintf( + '', + $flag['src'], + $title_attr, + $alt_attr, + $width_attr, + $height_attr, + $style + ); + } + + /** + * Returns the html of the custom flag if any, or the default flag otherwise. + * + * @since 2.8 + */ + public function get_display_flag() { + return empty( $this->custom_flag ) ? $this->flag : $this->custom_flag; + } + + /** + * Returns the url of the custom flag if any, or the default flag otherwise. + * + * @since 2.8 + */ + public function get_display_flag_url() { + return empty( $this->custom_flag_url ) ? $this->flag_url : $this->custom_flag_url; + } + + /** + * Updates post and term count + * + * @since 1.2 + */ + public function update_count() { + wp_update_term_count( $this->term_taxonomy_id, 'language' ); // posts count + wp_update_term_count( $this->tl_term_taxonomy_id, 'term_language' ); // terms count + } + + /** + * Set home_url and search_url properties + * + * @since 1.3 + * + * @param string $search_url + * @param string $home_url + */ + public function set_home_url( $search_url, $home_url ) { + $this->search_url = $search_url; + $this->home_url = $home_url; + } + + /** + * Sets the scheme of the home url and the flag urls + * + * This can't be cached across pages. + * + * @since 2.8 + */ + public function set_url_scheme() { + $this->home_url = set_url_scheme( $this->home_url ); + $this->search_url = set_url_scheme( $this->search_url ); + + // Set url scheme, also for the flags. + $this->flag_url = set_url_scheme( $this->flag_url ); + if ( ! empty( $this->custom_flag_url ) ) { + $this->custom_flag_url = set_url_scheme( $this->custom_flag_url ); + } + } + + /** + * Returns the language locale + * Converts WP locales to W3C valid locales for display + * + * @since 1.8 + * + * @param string $filter either 'display' or 'raw', defaults to raw + * @return string + */ + public function get_locale( $filter = 'raw' ) { + return 'display' === $filter ? $this->w3c : $this->locale; + } +} diff --git a/wp-content/plugins/polylang/include/license.php b/wp-content/plugins/polylang/include/license.php new file mode 100644 index 00000000..1ea66d17 --- /dev/null +++ b/wp-content/plugins/polylang/include/license.php @@ -0,0 +1,299 @@ +id = sanitize_title( $item_name ); + $this->file = $file; + $this->name = $item_name; + $this->version = $version; + $this->author = $author; + $this->api_url = empty( $api_url ) ? $this->api_url : $api_url; + + $licenses = get_option( 'polylang_licenses' ); + $this->license_key = empty( $licenses[ $this->id ]['key'] ) ? '' : $licenses[ $this->id ]['key']; + if ( ! empty( $licenses[ $this->id ]['data'] ) ) { + $this->license_data = $licenses[ $this->id ]['data']; + } + + // Updater + add_action( 'admin_init', array( $this, 'auto_updater' ), 0 ); + add_action( 'cli_init', array( $this, 'auto_updater' ), 0 ); // For WP CLI. + + // Register settings + add_filter( 'pll_settings_licenses', array( $this, 'settings' ) ); + + // Weekly schedule + if ( ! wp_next_scheduled( 'polylang_check_licenses' ) ) { + wp_schedule_event( time(), 'weekly', 'polylang_check_licenses' ); + } + + add_action( 'polylang_check_licenses', array( $this, 'check_license' ) ); + } + + /** + * Auto updater + * + * @since 1.9 + */ + public function auto_updater() { + $args = array( + 'version' => $this->version, + 'license' => $this->license_key, + 'author' => $this->author, + 'item_name' => $this->name, + ); + + // Setup the updater + new PLL_Plugin_Updater( $this->api_url, $this->file, $args ); + } + + /** + * Registers the licence in the Settings + * + * @since 1.9 + * + * @param array $items + * @return array + */ + public function settings( $items ) { + $items[ $this->id ] = $this; + return $items; + } + + /** + * Activate the license key + * + * @since 1.9 + * + * @param string $license_key activation key + * @return object updated $this + */ + public function activate_license( $license_key ) { + $this->license_key = $license_key; + $this->api_request( 'activate_license' ); + + // Tell WordPress to look for updates + set_site_transient( 'update_plugins', null ); + return $this; + } + + + /** + * Deactivate the license key + * + * @since 1.9 + * + * @return object updated $this + */ + public function deactivate_license() { + $this->api_request( 'deactivate_license' ); + return $this; + } + + /** + * Check if license key is valid + * + * @since 1.9 + * + * @return object updated $this + */ + public function check_license() { + $this->api_request( 'check_license' ); + return $this; + } + + /** + * Sends an api request to check, activate or deactivate the license + * Updates the licenses option according to the status + * + * @since 1.9 + * + * @param string $request check_license | activate_license | deactivate_license + */ + private function api_request( $request ) { + $licenses = get_option( 'polylang_licenses' ); + + if ( is_array( $licenses ) ) { + unset( $licenses[ $this->id ] ); + } else { + $licenses = array(); + } + unset( $this->license_data ); + + if ( ! empty( $this->license_key ) ) { + // Data to send in our API request + $api_params = array( + 'edd_action' => $request, + 'license' => $this->license_key, + 'item_name' => urlencode( $this->name ), + 'url' => home_url(), + ); + + // Call the API + $response = wp_remote_post( + $this->api_url, + array( + 'timeout' => 3, + 'sslverify' => false, + 'body' => $api_params, + ) + ); + + // Update the option only if we got a response + if ( is_wp_error( $response ) ) { + return; + } + + // Save new license info + $licenses[ $this->id ] = array( 'key' => $this->license_key ); + $data = json_decode( wp_remote_retrieve_body( $response ) ); + + if ( 'deactivated' !== $data->license ) { + $licenses[ $this->id ]['data'] = $this->license_data = $data; + } + } + + update_option( 'polylang_licenses', $licenses ); // FIXME called multiple times when saving all licenses + } + + /** + * Get the html form field in a table row (one per license key) for display + * + * @since 2.7 + * + * @return string + */ + public function get_form_field() { + if ( ! empty( $this->license_data ) ) { + $license = $this->license_data; + } + + $class = 'license-null'; + + $out = sprintf( + '' . + '', + esc_attr( $this->id ), + esc_attr( $this->name ), + esc_html( $this->license_key ) + ); + + if ( ! empty( $license ) && is_object( $license ) ) { + $now = time(); + $expiration = isset( $license->expires ) ? strtotime( $license->expires ) : false; + + // Special case: the license expired after the last check + if ( $license->success && $expiration && $expiration < $now ) { + $license->success = false; + $license->error = 'expired'; + } + + if ( false === $license->success ) { + $class = 'notice-error notice-alt'; + + switch ( $license->error ) { + case 'expired': + $message = sprintf( + /* translators: %1$s is a date, %2$s is link start tag, %3$s is link end tag. */ + esc_html__( 'Your license key expired on %1$s. Please %2$srenew your license key%3$s.', 'polylang' ), + esc_html( date_i18n( get_option( 'date_format' ), $expiration ) ), + sprintf( '', esc_url( 'https://polylang.pro/checkout/?edd_license_key=' . $this->license_key ) ), + '' + ); + break; + + case 'disabled': + case 'revoked': + $message = esc_html__( 'Your license key has been disabled.', 'polylang' ); + break; + + case 'missing': + $message = sprintf( + /* translators: %1$s is link start tag, %2$s is link end tag. */ + esc_html__( 'Invalid license. Please %1$svisit your account page%2$s and verify it.', 'polylang' ), + sprintf( '', 'https://polylang.pro/account' ), + '' + ); + break; + + case 'invalid': + case 'site_inactive': + $message = sprintf( + /* translators: %1$s is a product name, %2$s is link start tag, %3$s is link end tag. */ + esc_html__( 'Your %1$s license key is not active for this URL. Please %2$svisit your account page%3$s to manage your license key URLs.', 'polylang' ), + esc_html( $this->name ), + sprintf( '', 'https://polylang.pro/account' ), + '' + ); + break; + + case 'item_name_mismatch': + /* translators: %s is a product name */ + $message = sprintf( esc_html__( 'This is not a %s license key.', 'polylang' ), esc_html( $this->name ) ); + break; + + case 'no_activations_left': + $message = sprintf( + /* translators: %1$s is link start tag, %2$s is link end tag */ + esc_html__( 'Your license key has reached its activation limit. %1$sView possible upgrades%2$s now.', 'polylang' ), + sprintf( '', 'https://polylang.pro/account' ), + '' + ); + break; + } + } else { + $class = 'license-valid'; + + $out .= sprintf( '', esc_attr( $this->id ), esc_html__( 'Deactivate', 'polylang' ) ); + + if ( 'lifetime' === $license->expires ) { + $message = esc_html__( 'The license key never expires.', 'polylang' ); + } elseif ( $expiration > $now && $expiration - $now < ( DAY_IN_SECONDS * 30 ) ) { + $class = 'notice-warning notice-alt'; + $message = sprintf( + /* translators: %1$s is a date, %2$s is link start tag, %3$s is link end tag. */ + esc_html__( 'Your license key will expire soon! Precisely, it will expire on %1$s. %2$sRenew your license key today!%3$s.', 'polylang' ), + esc_html( date_i18n( get_option( 'date_format' ), $expiration ) ), + sprintf( '', esc_url( 'https://polylang.pro/checkout/?edd_license_key=' . $this->license_key ) ), + '' + ); + } else { + $message = sprintf( + /* translators: %s is a date */ + esc_html__( 'Your license key expires on %s.', 'polylang' ), + esc_html( date_i18n( get_option( 'date_format' ), $expiration ) ) + ); + } + } + } + + if ( ! empty( $message ) ) { + $out .= '

' . $message . '

'; + } + + return sprintf( '%s', esc_attr( $this->id ), $class, $out ); + } +} diff --git a/wp-content/plugins/polylang/include/links-abstract-domain.php b/wp-content/plugins/polylang/include/links-abstract-domain.php new file mode 100644 index 00000000..bb55ab71 --- /dev/null +++ b/wp-content/plugins/polylang/include/links-abstract-domain.php @@ -0,0 +1,91 @@ +get_hosts() ) ) ? $lang : ''; + } + + /** + * Sets the home urls + * + * @since 2.2 + * + * @param object $language + */ + protected function set_home_url( $language ) { + $home_url = $this->home_url( $language ); + $language->set_home_url( $home_url, $home_url ); // Search url and home url are the same + } + + /** + * Returns the current site url + * + * @since 1.8 + * + * @param string $url + * @return string + */ + public function site_url( $url ) { + $lang = $this->get_language_from_url(); + $lang = $this->model->get_language( $lang ); + return $this->add_language_to_link( $url, $lang ); + } + + /** + * Fix the domain for upload directory + * + * @since 2.0.6 + * + * @param array $uploads + * @return array + */ + public function upload_dir( $uploads ) { + $lang = $this->get_language_from_url(); + $lang = $this->model->get_language( $lang ); + $uploads['url'] = $this->add_language_to_link( $uploads['url'], $lang ); + $uploads['baseurl'] = $this->add_language_to_link( $uploads['baseurl'], $lang ); + return $uploads; + } +} diff --git a/wp-content/plugins/polylang/include/links-default.php b/wp-content/plugins/polylang/include/links-default.php new file mode 100644 index 00000000..96fb267e --- /dev/null +++ b/wp-content/plugins/polylang/include/links-default.php @@ -0,0 +1,103 @@ +options['hide_default'] && $this->options['default_lang'] == $lang->slug ) ? $url : add_query_arg( 'lang', $lang->slug, $url ); + } + + /** + * Removes the language information from an url + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @return string modified url + */ + public function remove_language_from_link( $url ) { + return remove_query_arg( 'lang', $url ); + } + + /** + * Returns the link to the first page + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @return string modified url + */ + public function remove_paged_from_link( $url ) { + return remove_query_arg( 'paged', $url ); + } + + /** + * Returns the link to the paged page when using pretty permalinks + * + * @since 1.5 + * + * @param string $url url to modify + * @param int $page + * @return string modified url + */ + public function add_paged_to_link( $url, $page ) { + return add_query_arg( array( 'paged' => $page ), $url ); + } + + /** + * Gets the language slug from the url if present + * links_model interface + * + * @since 1.2 + * @since 2.0 add $url argument + * + * @param string $url optional, defaults to current url + * @return string language slug + */ + public function get_language_from_url( $url = '' ) { + if ( empty( $url ) ) { + $url = pll_get_requested_url(); + } + + $pattern = '#lang=(' . implode( '|', $this->model->get_languages_list( array( 'fields' => 'slug' ) ) ) . ')#'; + return preg_match( $pattern, trailingslashit( $url ), $matches ) ? $matches[1] : ''; // $matches[1] is the slug of the requested language + } + + /** + * Returns the static front page url + * + * @since 1.8 + * + * @param object $lang + * @return string + */ + public function front_page_url( $lang ) { + if ( $this->options['hide_default'] && $lang->slug == $this->options['default_lang'] ) { + return trailingslashit( $this->home ); + } + $url = home_url( '/?page_id=' . $lang->page_on_front ); + return $this->options['force_lang'] ? $this->add_language_to_link( $url, $lang ) : $url; + } +} diff --git a/wp-content/plugins/polylang/include/links-directory.php b/wp-content/plugins/polylang/include/links-directory.php new file mode 100644 index 00000000..df6933a2 --- /dev/null +++ b/wp-content/plugins/polylang/include/links-directory.php @@ -0,0 +1,269 @@ +home_relative = home_url( '/', 'relative' ); + + if ( did_action( 'pll_init' ) ) { + $this->init(); + } else { + add_action( 'pll_init', array( $this, 'init' ) ); + } + } + + /** + * Called only at first object creation to avoid duplicating filters when switching blog + * + * @since 1.6 + */ + public function init() { + if ( did_action( 'setup_theme' ) ) { + $this->add_permastruct(); + } else { + add_action( 'setup_theme', array( $this, 'add_permastruct' ), 2 ); + } + + // Make sure to prepare rewrite rules when flushing + add_action( 'pre_option_rewrite_rules', array( $this, 'prepare_rewrite_rules' ) ); + } + + /** + * Adds the language code in url + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @param object $lang language + * @return string modified url + */ + public function add_language_to_link( $url, $lang ) { + if ( ! empty( $lang ) ) { + $base = $this->options['rewrite'] ? '' : 'language/'; + $slug = $this->options['default_lang'] == $lang->slug && $this->options['hide_default'] ? '' : $base . $lang->slug . '/'; + $root = ( false === strpos( $url, '://' ) ) ? $this->home_relative . $this->root : preg_replace( '#^https?://#', '://', $this->home . '/' . $this->root ); + + if ( false === strpos( $url, $new = $root . $slug ) ) { + $pattern = preg_quote( $root, '#' ); + $pattern = '#' . $pattern . '#'; + return preg_replace( $pattern, $new, $url, 1 ); // Only once + } + } + return $url; + } + + /** + * Returns the url without language code + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @return string modified url + */ + public function remove_language_from_link( $url ) { + $languages = array(); + + foreach ( $this->model->get_languages_list() as $language ) { + if ( ! $this->options['hide_default'] || $this->options['default_lang'] != $language->slug ) { + $languages[] = $language->slug; + } + } + + if ( ! empty( $languages ) ) { + $root = ( false === strpos( $url, '://' ) ) ? $this->home_relative . $this->root : preg_replace( '#^https?://#', '://', $this->home . '/' . $this->root ); + + $pattern = preg_quote( $root, '#' ); + $pattern = '#' . $pattern . ( $this->options['rewrite'] ? '' : 'language/' ) . '(' . implode( '|', $languages ) . ')(/|$)#'; + $url = preg_replace( $pattern, $root, $url ); + } + return $url; + } + + /** + * Returns the language based on language code in url + * links_model interface + * + * @since 1.2 + * @since 2.0 add $url argument + * + * @param string $url optional, defaults to current url + * @return string language slug + */ + public function get_language_from_url( $url = '' ) { + if ( empty( $url ) ) { + $url = pll_get_requested_url(); + } + + $path = wp_parse_url( $url, PHP_URL_PATH ); + $root = ( false === strpos( $url, '://' ) ) ? $this->home_relative . $this->root : $this->home . '/' . $this->root; + + $pattern = wp_parse_url( $root . ( $this->options['rewrite'] ? '' : 'language/' ), PHP_URL_PATH ); + $pattern = preg_quote( $pattern, '#' ); + $pattern = '#^' . $pattern . '(' . implode( '|', $this->model->get_languages_list( array( 'fields' => 'slug' ) ) ) . ')(/|$)#'; + return preg_match( $pattern, trailingslashit( $path ), $matches ) ? $matches[1] : ''; // $matches[1] is the slug of the requested language + } + + /** + * Returns the home url + * links_model interface + * + * @since 1.3.1 + * + * @param object $lang PLL_Language object + * @return string + */ + public function home_url( $lang ) { + $base = $this->options['rewrite'] ? '' : 'language/'; + $slug = $this->options['default_lang'] == $lang->slug && $this->options['hide_default'] ? '' : '/' . $this->root . $base . $lang->slug; + return trailingslashit( $this->home . $slug ); + } + + /** + * Optionally removes 'language' in permalinks so that we get http://www.myblog/en/ instead of http://www.myblog/language/en/ + * + * @since 1.2 + */ + public function add_permastruct() { + // Language information always in front of the uri ( 'with_front' => false ) + // The 3rd parameter structure has been modified in WP 3.4 + // Leads to error 404 for pages when there is no language created yet + if ( $this->model->get_languages_list() ) { + add_permastruct( 'language', $this->options['rewrite'] ? '%language%' : 'language/%language%', array( 'with_front' => false ) ); + } + } + + /** + * Prepares rewrite rules filters + * + * @since 0.8.1 + * + * @param array $pre not used + * @return unmodified $pre + */ + public function prepare_rewrite_rules( $pre ) { + // Don't modify the rules if there is no languages created yet + // Make sure to add filter only once and if all custom post types and taxonomies have been registered + if ( $this->model->get_languages_list() && did_action( 'wp_loaded' ) && ! has_filter( 'language_rewrite_rules', '__return_empty_array' ) ) { + // Suppress the rules created by WordPress for our taxonomy + add_filter( 'language_rewrite_rules', '__return_empty_array' ); + + foreach ( $this->get_rewrite_rules_filters() as $type ) { + add_filter( $type . '_rewrite_rules', array( $this, 'rewrite_rules' ) ); + } + + add_filter( 'rewrite_rules_array', array( $this, 'rewrite_rules' ) ); // needed for post type archives + } + return $pre; + } + + /** + * The rewrite rules ! + * always make sure the default language is at the end in case the language information is hidden for default language + * thanks to brbrbr http://wordpress.org/support/topic/plugin-polylang-rewrite-rules-not-correct + * + * @since 0.8.1 + * + * @param array $rules rewrite rules + * @return array modified rewrite rules + */ + public function rewrite_rules( $rules ) { + $filter = str_replace( '_rewrite_rules', '', current_filter() ); + + global $wp_rewrite; + $newrules = array(); + + $languages = $this->model->get_languages_list( array( 'fields' => 'slug' ) ); + if ( $this->options['hide_default'] ) { + $languages = array_diff( $languages, array( $this->options['default_lang'] ) ); + } + + if ( ! empty( $languages ) ) { + $slug = $wp_rewrite->root . ( $this->options['rewrite'] ? '' : 'language/' ) . '(' . implode( '|', $languages ) . ')/'; + } + + // For custom post type archives + $cpts = array_intersect( $this->model->get_translated_post_types(), get_post_types( array( '_builtin' => false ) ) ); + $cpts = $cpts ? '#post_type=(' . implode( '|', $cpts ) . ')#' : ''; + + foreach ( $rules as $key => $rule ) { + // Special case for translated post types and taxonomies to allow canonical redirection + if ( $this->options['force_lang'] && in_array( $filter, array_merge( $this->model->get_translated_post_types(), $this->model->get_translated_taxonomies() ) ) ) { + + /** + * Filters the rewrite rules to modify + * + * @since 1.9.1 + * + * @param bool $modify whether to modify or not the rule, defaults to true + * @param array $rule original rewrite rule + * @param string $filter current set of rules being modified + * @param string|bool $archive custom post post type archive name or false if it is not a cpt archive + */ + if ( isset( $slug ) && apply_filters( 'pll_modify_rewrite_rule', true, array( $key => $rule ), $filter, false ) ) { + $newrules[ $slug . str_replace( $wp_rewrite->root, '', ltrim( $key, '^' ) ) ] = str_replace( + array( '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '[1]', '?' ), + array( '[9]', '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '?lang=$matches[1]&' ), + $rule + ); // Should be enough! + } + + $newrules[ $key ] = $rule; + } + + // Rewrite rules filtered by language + elseif ( in_array( $filter, $this->always_rewrite ) || in_array( $filter, $this->model->get_filtered_taxonomies() ) || ( $cpts && preg_match( $cpts, $rule, $matches ) && ! strpos( $rule, 'name=' ) ) || ( 'rewrite_rules_array' != $filter && $this->options['force_lang'] ) ) { + + /** This filter is documented in include/links-directory.php */ + if ( apply_filters( 'pll_modify_rewrite_rule', true, array( $key => $rule ), $filter, empty( $matches[1] ) ? false : $matches[1] ) ) { + if ( isset( $slug ) ) { + $newrules[ $slug . str_replace( $wp_rewrite->root, '', ltrim( $key, '^' ) ) ] = str_replace( + array( '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '[1]', '?' ), + array( '[9]', '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '?lang=$matches[1]&' ), + $rule + ); // Should be enough! + } + + if ( $this->options['hide_default'] ) { + $newrules[ $key ] = str_replace( '?', '?lang=' . $this->options['default_lang'] . '&', $rule ); + } + } else { + $newrules[ $key ] = $rule; + } + } + + // Unmodified rules + else { + $newrules[ $key ] = $rule; + } + } + + // The home rewrite rule + if ( 'root' == $filter && isset( $slug ) ) { + $newrules[ $slug . '?$' ] = $wp_rewrite->index . '?lang=$matches[1]'; + } + + return $newrules; + } +} diff --git a/wp-content/plugins/polylang/include/links-domain.php b/wp-content/plugins/polylang/include/links-domain.php new file mode 100644 index 00000000..13dff7fd --- /dev/null +++ b/wp-content/plugins/polylang/include/links-domain.php @@ -0,0 +1,100 @@ +hosts = $this->get_hosts(); + + // Filter the site url ( mainly to get the correct login form ) + add_filter( 'site_url', array( $this, 'site_url' ) ); + } + + + /** + * Adds the language code in url + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @param object $lang language + * @return string modified url + */ + public function add_language_to_link( $url, $lang ) { + if ( ! empty( $lang ) && ! empty( $this->hosts[ $lang->slug ] ) ) { + $url = preg_replace( '#://(' . wp_parse_url( $this->home, PHP_URL_HOST ) . ')($|/.*)#', '://' . $this->hosts[ $lang->slug ] . '$2', $url ); + } + return $url; + } + + /** + * Returns the url without language code + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @return string modified url + */ + public function remove_language_from_link( $url ) { + if ( ! empty( $this->hosts ) ) { + $url = preg_replace( '#://(' . implode( '|', $this->hosts ) . ')($|/.*)#', '://' . wp_parse_url( $this->home, PHP_URL_HOST ) . '$2', $url ); + } + return $url; + } + + /** + * Returns the home url + * links_model interface + * + * @since 1.3.1 + * + * @param object $lang PLL_Language object + * @return string + */ + public function home_url( $lang ) { + return trailingslashit( empty( $this->options['domains'][ $lang->slug ] ) ? $this->home : $this->options['domains'][ $lang->slug ] ); + } + + /** + * Get hosts managed on the website + * + * @since 1.5 + * + * @return array list of hosts + */ + public function get_hosts() { + $hosts = array(); + foreach ( $this->options['domains'] as $lang => $domain ) { + $host = wp_parse_url( $domain, PHP_URL_HOST ); + // idn_to_ascii is much faster than the WordPress method. + if ( function_exists( 'idn_to_ascii' ) ) { + // The use of the constant is mandatory in PHP 7.2 and PHP 7.3 to avoid a deprecated notice. + $hosts[ $lang ] = defined( 'INTL_IDNA_VARIANT_UTS46' ) ? idn_to_ascii( $host, 0, INTL_IDNA_VARIANT_UTS46 ) : idn_to_ascii( $host ); + } else { + $hosts[ $lang ] = Requests_IDNAEncoder::encode( $host ); + } + } + + return $hosts; + } +} diff --git a/wp-content/plugins/polylang/include/links-model.php b/wp-content/plugins/polylang/include/links-model.php new file mode 100644 index 00000000..eaf21028 --- /dev/null +++ b/wp-content/plugins/polylang/include/links-model.php @@ -0,0 +1,139 @@ +model = &$model; + $this->options = &$model->options; + + $this->home = home_url(); + + add_filter( 'pll_languages_list', array( $this, 'pll_languages_list' ), 4 ); // after PLL_Static_Pages + add_filter( 'pll_after_languages_cache', array( $this, 'pll_after_languages_cache' ) ); + + // adds our domains or subdomains to allowed hosts for safe redirection + add_filter( 'allowed_redirect_hosts', array( $this, 'allowed_redirect_hosts' ) ); + } + + /** + * Changes the language code in url + * + * @since 1.5 + * + * @param string $url url to modify + * @param object $lang language + * @return string modified url + */ + public function switch_language_in_link( $url, $lang ) { + $url = $this->remove_language_from_link( $url ); + return $this->add_language_to_link( $url, $lang ); + } + + /** + * Get hosts managed on the website + * + * @since 1.5 + * + * @return array list of hosts + */ + public function get_hosts() { + return array( wp_parse_url( $this->home, PHP_URL_HOST ) ); + } + + /** + * Returns the home url + * + * @since 1.3.1 + * + * @param object $lang PLL_Language object + * @return string + */ + public function home_url( $lang ) { + $url = trailingslashit( $this->home ); + return $this->options['hide_default'] && $lang->slug == $this->options['default_lang'] ? $url : $this->add_language_to_link( $url, $lang ); + } + + /** + * Sets the home urls + * + * @since 1.8 + * + * @param object $language + */ + protected function set_home_url( $language ) { + // We should always have a default language here, except, temporarily, in PHPUnit tests. The test here protects against PHP notices. + if ( isset( $this->options['default_lang'] ) ) { + $search_url = $this->home_url( $language ); + $home_url = empty( $language->page_on_front ) || $this->options['redirect_lang'] ? $search_url : $this->front_page_url( $language ); + $language->set_home_url( $search_url, $home_url ); + } + } + + /** + * Sets the home urls and flags before the languages are persistently cached + * + * @since 1.8 + * + * @param array $languages array of PLL_Language objects + * @return array + */ + public function pll_languages_list( $languages ) { + foreach ( $languages as $language ) { + $this->set_home_url( $language ); + $language->set_flag(); + } + return $languages; + } + + /** + * Sets the home urls when not cached + * Sets the home urls scheme + * + * @since 1.8 + * + * @param array $languages array of PLL_Language objects + * @return array + */ + public function pll_after_languages_cache( $languages ) { + foreach ( $languages as $language ) { + // Get the home urls when not cached + if ( ( defined( 'PLL_CACHE_LANGUAGES' ) && ! PLL_CACHE_LANGUAGES ) || ( defined( 'PLL_CACHE_HOME_URL' ) && ! PLL_CACHE_HOME_URL ) ) { + $this->set_home_url( $language ); + } + + // Ensures that the ( possibly cached ) home and flag urls use the right scheme http or https. + $language->set_url_scheme(); + } + return $languages; + } + + /** + * Adds our domains or subdomains to allowed hosts for safe redirection + * + * @since 1.4.3 + * + * @param array $hosts allowed hosts + * @return array + */ + public function allowed_redirect_hosts( $hosts ) { + return array_unique( array_merge( $hosts, array_values( $this->get_hosts() ) ) ); + } +} diff --git a/wp-content/plugins/polylang/include/links-permalinks.php b/wp-content/plugins/polylang/include/links-permalinks.php new file mode 100644 index 00000000..13267034 --- /dev/null +++ b/wp-content/plugins/polylang/include/links-permalinks.php @@ -0,0 +1,123 @@ +root = preg_match( '#^/*' . $this->index . '#', $permalink_structure ) ? $this->index . '/' : ''; + $this->use_trailing_slashes = ( '/' == substr( $permalink_structure, -1, 1 ) ); + } + + /** + * Returns the link to the first page when using pretty permalinks + * + * @since 1.2 + * + * @param string $url url to modify + * @return string modified url + */ + public function remove_paged_from_link( $url ) { + /** + * Filter an url after the paged part has been removed + * + * @since 2.0.6 + * + * @param string $modified_url The link to the first page + * @param string $original_url The link to the original paged page + */ + return apply_filters( 'pll_remove_paged_from_link', preg_replace( '#/page/[0-9]+/?#', $this->use_trailing_slashes ? '/' : '', $url ), $url ); + } + + /** + * Returns the link to the paged page when using pretty permalinks + * + * @since 1.5 + * + * @param string $url url to modify + * @param int $page + * @return string modified url + */ + public function add_paged_to_link( $url, $page ) { + /** + * Filter an url after the paged part has been added + * + * @since 2.0.6 + * + * @param string $modified_url The link to the paged page + * @param string $original_url The link to the original first page + * @param int $page The page number + */ + return apply_filters( 'pll_add_paged_to_link', user_trailingslashit( trailingslashit( $url ) . 'page/' . $page, 'paged' ), $url, $page ); + } + + /** + * Returns the home url + * + * @since 1.3.1 + * + * @param object $lang PLL_Language object + * @return string + */ + public function home_url( $lang ) { + return trailingslashit( parent::home_url( $lang ) ); + } + + /** + * Returns the static front page url + * + * @since 1.8 + * + * @param object $lang + * @return string + */ + public function front_page_url( $lang ) { + if ( $this->options['hide_default'] && $lang->slug == $this->options['default_lang'] ) { + return trailingslashit( $this->home ); + } + $url = home_url( $this->root . get_page_uri( $lang->page_on_front ) ); + $url = $this->use_trailing_slashes ? trailingslashit( $url ) : untrailingslashit( $url ); + return $this->options['force_lang'] ? $this->add_language_to_link( $url, $lang ) : $url; + } + + /** + * Prepares rewrite rules filters + * + * @since 1.6 + */ + public function get_rewrite_rules_filters() { + // Make sure we have the right post types and taxonomies + $types = array_values( array_merge( $this->model->get_translated_post_types(), $this->model->get_translated_taxonomies(), $this->model->get_filtered_taxonomies() ) ); + $types = array_merge( $this->always_rewrite, $types ); + + /** + * Filter the list of rewrite rules filters to be used by Polylang + * + * @since 0.8.1 + * + * @param array $types the list of filters (without '_rewrite_rules' at the end) + */ + return apply_filters( 'pll_rewrite_rules', $types ); + } +} diff --git a/wp-content/plugins/polylang/include/links-subdomain.php b/wp-content/plugins/polylang/include/links-subdomain.php new file mode 100644 index 00000000..fa39b349 --- /dev/null +++ b/wp-content/plugins/polylang/include/links-subdomain.php @@ -0,0 +1,84 @@ +www = ( false === strpos( $this->home, '://www.' ) ) ? '://' : '://www.'; + } + + /** + * Adds the language code in url + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @param object $lang language + * @return string modified url + */ + public function add_language_to_link( $url, $lang ) { + if ( ! empty( $lang ) && false === strpos( $url, '://' . $lang->slug . '.' ) ) { + $url = $this->options['default_lang'] == $lang->slug && $this->options['hide_default'] ? $url : str_replace( $this->www, '://' . $lang->slug . '.', $url ); + } + return $url; + } + + /** + * Returns the url without language code + * links_model interface + * + * @since 1.2 + * + * @param string $url url to modify + * @return string modified url + */ + public function remove_language_from_link( $url ) { + $languages = array(); + + foreach ( $this->model->get_languages_list() as $language ) { + if ( ! $this->options['hide_default'] || $this->options['default_lang'] != $language->slug ) { + $languages[] = $language->slug; + } + } + + if ( ! empty( $languages ) ) { + $url = preg_replace( '#://(' . implode( '|', $languages ) . ')\.#', $this->www, $url ); + } + + return $url; + } + + /** + * Get hosts managed on the website + * + * @since 1.5 + * + * @return array list of hosts + */ + public function get_hosts() { + $hosts = array(); + foreach ( $this->model->get_languages_list() as $lang ) { + $hosts[ $lang->slug ] = wp_parse_url( $this->home_url( $lang ), PHP_URL_HOST ); + } + return $hosts; + } +} diff --git a/wp-content/plugins/polylang/include/links.php b/wp-content/plugins/polylang/include/links.php new file mode 100644 index 00000000..bb047786 --- /dev/null +++ b/wp-content/plugins/polylang/include/links.php @@ -0,0 +1,39 @@ +links_model = &$polylang->links_model; + $this->model = &$polylang->model; + $this->options = &$polylang->options; + } + + /** + * Returns the home url in the requested language + * + * @since 1.3 + * + * @param object|string $language + * @param bool $is_search optional whether we need the home url for a search form, defaults to false + */ + public function get_home_url( $language, $is_search = false ) { + $language = is_object( $language ) ? $language : $this->model->get_language( $language ); + return $is_search ? $language->search_url : $language->home_url; + } +} diff --git a/wp-content/plugins/polylang/include/mo.php b/wp-content/plugins/polylang/include/mo.php new file mode 100644 index 00000000..38fe3d85 --- /dev/null +++ b/wp-content/plugins/polylang/include/mo.php @@ -0,0 +1,119 @@ + __( 'Strings translations', 'polylang' ) ); + register_post_type( 'polylang_mo', array( 'labels' => $labels, 'rewrite' => false, 'query_var' => false, '_pll' => true ) ); + + add_action( 'pll_add_language', array( $this, 'clean_cache' ) ); + } + } + + /** + * Writes a PLL_MO object into a custom post meta + * + * @since 1.2 + * + * @param object $lang The language in which we want to export strings + */ + public function export_to_db( $lang ) { + $this->add_entry( $this->make_entry( '', '' ) ); // Empty string translation, just in case + + // Would be convenient to store the whole object but it would take a huge space in DB + // So let's keep only the strings in an array + $strings = array(); + foreach ( $this->entries as $entry ) { + $strings[] = array( $entry->singular, $this->translate( $entry->singular ) ); + } + + $strings = wp_slash( $strings ); // Avoid breaking slashed strings in update_post_meta. See https://codex.wordpress.org/Function_Reference/update_post_meta#Character_Escaping + + if ( empty( $lang->mo_id ) ) { + $post = array( + 'post_title' => 'polylang_mo_' . $lang->term_id, + 'post_status' => 'private', // To avoid a conflict with WP Super Cache. See https://wordpress.org/support/topic/polylang_mo-and-404s-take-2 + 'post_type' => 'polylang_mo', + ); + $mo_id = wp_insert_post( $post ); + update_post_meta( $mo_id, '_pll_strings_translations', $strings ); + } else { + update_post_meta( $lang->mo_id, '_pll_strings_translations', $strings ); + } + } + + /** + * Reads a PLL_MO object from a custom post meta + * + * @since 1.2 + * + * @param object $lang The language in which we want to get strings + */ + public function import_from_db( $lang ) { + if ( ! empty( $lang->mo_id ) ) { + $strings = get_post_meta( $lang->mo_id, '_pll_strings_translations', true ); + if ( is_array( $strings ) ) { + foreach ( $strings as $msg ) { + $this->add_entry( $this->make_entry( $msg[0], $msg[1] ) ); + } + } + } + } + + /** + * Returns the post id of the post storing the strings translations + * + * @since 1.4 + * + * @param object $lang + * @return int + */ + public static function get_id( $lang ) { + global $wpdb; + + $ids = wp_cache_get( 'polylang_mo_ids' ); + + if ( empty( $ids ) ) { + $ids = $wpdb->get_results( "SELECT post_title, ID FROM $wpdb->posts WHERE post_type='polylang_mo'", OBJECT_K ); + wp_cache_add( 'polylang_mo_ids', $ids ); + } + + // The mo id for a language can be transiently empty + return isset( $ids[ 'polylang_mo_' . $lang->term_id ] ) ? $ids[ 'polylang_mo_' . $lang->term_id ]->ID : null; + } + + /** + * Invalidate the cache when adding a new language + * + * @since 2.0.5 + */ + public function clean_cache() { + wp_cache_delete( 'polylang_mo_ids' ); + } + + /** + * Deletes a string + * + * @since 2.9 + * + * @param string $string The source string to remove from the translations. + */ + public function delete_entry( $string ) { + unset( $this->entries[ $string ] ); + } +} diff --git a/wp-content/plugins/polylang/include/model.php b/wp-content/plugins/polylang/include/model.php new file mode 100644 index 00000000..2fed6dd2 --- /dev/null +++ b/wp-content/plugins/polylang/include/model.php @@ -0,0 +1,673 @@ +options = &$options; + + $this->cache = new PLL_Cache(); + $this->post = new PLL_Translated_Post( $this ); // translated post sub model + $this->term = new PLL_Translated_Term( $this ); // translated term sub model + + // We need to clean languages cache when editing a language and when modifying the permalink structure + add_action( 'edited_term_taxonomy', array( $this, 'clean_languages_cache' ), 10, 2 ); + add_action( 'update_option_permalink_structure', array( $this, 'clean_languages_cache' ) ); + add_action( 'update_option_siteurl', array( $this, 'clean_languages_cache' ) ); + add_action( 'update_option_home', array( $this, 'clean_languages_cache' ) ); + + add_filter( 'get_terms_args', array( $this, 'get_terms_args' ) ); + + // Just in case someone would like to display the language description ;- ) + add_filter( 'language_description', '__return_empty_string' ); + } + + /** + * Returns the list of available languages + * caches the list in a db transient ( except flags ), unless PLL_CACHE_LANGUAGES is set to false + * caches the list ( with flags ) in the private property $languages + * + * List of parameters accepted in $args: + * + * hide_empty => hides languages with no posts if set to true ( defaults to false ) + * fields => return only that field if set ( see PLL_Language for a list of fields ) + * + * @since 0.1 + * + * @param array $args + * @return array|string|int list of PLL_Language objects or PLL_Language object properties + */ + public function get_languages_list( $args = array() ) { + if ( false === $languages = $this->cache->get( 'languages' ) ) { + + // Create the languages from taxonomies + if ( ( defined( 'PLL_CACHE_LANGUAGES' ) && ! PLL_CACHE_LANGUAGES ) || false === ( $languages = get_transient( 'pll_languages_list' ) ) ) { + $languages = get_terms( 'language', array( 'hide_empty' => false, 'orderby' => 'term_group' ) ); + $languages = empty( $languages ) || is_wp_error( $languages ) ? array() : $languages; + + $term_languages = get_terms( 'term_language', array( 'hide_empty' => false ) ); + $term_languages = empty( $term_languages ) || is_wp_error( $term_languages ) ? + array() : array_combine( wp_list_pluck( $term_languages, 'slug' ), $term_languages ); + + if ( ! empty( $languages ) && ! empty( $term_languages ) ) { + // Don't use array_map + create_function to instantiate an autoloaded class as it breaks badly in old versions of PHP + foreach ( $languages as $k => $v ) { + $languages[ $k ] = new PLL_Language( $v, $term_languages[ 'pll_' . $v->slug ] ); + } + + // We will need the languages list to allow its access in the filter below + $this->cache->set( 'languages', $languages ); + + /** + * Filter the list of languages *before* it is stored in the persistent cache + * /!\ this filter is fired *before* the $polylang object is available + * + * @since 1.7.5 + * + * @param array $languages the list of language objects + * @param object $model PLL_Model object + */ + $languages = apply_filters( 'pll_languages_list', $languages, $this ); + + // Don't store directly objects as it badly break with some hosts ( GoDaddy ) due to race conditions when using object cache + // Thanks to captin411 for catching this! + // See https://wordpress.org/support/topic/fatal-error-pll_model_languages_list?replies=8#post-6782255; + set_transient( 'pll_languages_list', array_map( 'get_object_vars', $languages ) ); + } + else { + $languages = array(); // In case something went wrong + } + } + + // Create the languages directly from arrays stored in transients + else { + foreach ( $languages as $k => $v ) { + $languages[ $k ] = new PLL_Language( $v ); + } + } + + /** + * Filter the list of languages *after* it is stored in the persistent cache + * /!\ this filter is fired *before* the $polylang object is available + * + * @since 1.8 + * + * @param array $languages the list of language objects + */ + $languages = apply_filters( 'pll_after_languages_cache', $languages ); + $this->cache->set( 'languages', $languages ); + } + + $args = wp_parse_args( $args, array( 'hide_empty' => false ) ); + + // Remove empty languages if requested + if ( $args['hide_empty'] ) { + $languages = wp_list_filter( $languages, array( 'count' => 0 ), 'NOT' ); + } + + return empty( $args['fields'] ) ? $languages : wp_list_pluck( $languages, $args['fields'] ); + } + + /** + * Cleans language cache + * can be called directly with no parameter + * called by the 'edited_term_taxonomy' filter with 2 parameters when count needs to be updated + * + * @since 1.2 + * + * @param int $term not used + * @param string $taxonomy taxonomy name + */ + public function clean_languages_cache( $term = 0, $taxonomy = null ) { + if ( empty( $taxonomy ) || 'language' == $taxonomy ) { + delete_transient( 'pll_languages_list' ); + $this->cache->clean(); + } + } + + /** + * Don't query term metas when only our taxonomies are queried + * + * @since 2.3 + * + * @param array $args WP_Term_Query arguments + * @return array + */ + public function get_terms_args( $args ) { + if ( isset( $args['taxonomy'] ) && ! array_diff( (array) $args['taxonomy'], array( 'language', 'term_language', 'post_translations', 'term_translations' ) ) ) { + $args['update_term_meta_cache'] = false; + } + return $args; + } + + /** + * Returns the language by its term_id, tl_term_id, slug or locale + * + * @since 0.1 + * + * @param int|string $value term_id, tl_term_id, slug or locale of the queried language + * @return object|bool PLL_Language object, false if no language found + */ + public function get_language( $value ) { + if ( is_object( $value ) ) { + return $value instanceof PLL_Language ? $value : $this->get_language( $value->term_id ); // will force cast to PLL_Language + } + + if ( false === $return = $this->cache->get( 'language:' . $value ) ) { + foreach ( $this->get_languages_list() as $lang ) { + $this->cache->set( 'language:' . $lang->term_id, $lang ); + $this->cache->set( 'language:' . $lang->tl_term_id, $lang ); + $this->cache->set( 'language:' . $lang->slug, $lang ); + $this->cache->set( 'language:' . $lang->locale, $lang ); + $this->cache->set( 'language:' . $lang->w3c, $lang ); + } + $return = $this->cache->get( 'language:' . $value ); + } + + return $return; + } + + /** + * Adds terms clauses to get_terms to filter them by languages - used in both frontend and admin + * + * @since 1.2 + * + * @param array $clauses the list of sql clauses in terms query + * @param object $lang PLL_Language object + * @return array modified list of clauses + */ + public function terms_clauses( $clauses, $lang ) { + if ( ! empty( $lang ) && false === strpos( $clauses['join'], 'pll_tr' ) ) { + $clauses['join'] .= $this->term->join_clause(); + $clauses['where'] .= $this->term->where_clause( $lang ); + } + return $clauses; + } + + /** + * Returns post types that need to be translated + * the post types list is cached for better better performance + * wait for 'after_setup_theme' to apply the cache to allow themes adding the filter in functions.php + * + * @since 1.2 + * + * @param bool $filter true if we should return only valid registered post types + * @return array post type names for which Polylang manages languages and translations + */ + public function get_translated_post_types( $filter = true ) { + if ( false === $post_types = $this->cache->get( 'post_types' ) ) { + $post_types = array( 'post' => 'post', 'page' => 'page', 'wp_block' => 'wp_block' ); + + if ( ! empty( $this->options['media_support'] ) ) { + $post_types['attachment'] = 'attachment'; + } + + if ( ! empty( $this->options['post_types'] ) && is_array( $this->options['post_types'] ) ) { + $post_types = array_merge( $post_types, array_combine( $this->options['post_types'], $this->options['post_types'] ) ); + } + + /** + * Filter the list of post types available for translation. + * The default are post types which have the parameter ‘public’ set to true. + * The filter must be added soon in the WordPress loading process: + * in a function hooked to ‘plugins_loaded’ or directly in functions.php for themes. + * + * @since 0.8 + * + * @param array $post_types list of post type names + * @param bool $is_settings true when displaying the list of custom post types in Polylang settings + */ + $post_types = apply_filters( 'pll_get_post_types', $post_types, false ); + + if ( did_action( 'after_setup_theme' ) ) { + $this->cache->set( 'post_types', $post_types ); + } + } + + return $filter ? array_intersect( $post_types, get_post_types() ) : $post_types; + } + + /** + * Returns true if Polylang manages languages and translations for this post type + * + * @since 1.2 + * + * @param string|array $post_type post type name or array of post type names + * @return bool + */ + public function is_translated_post_type( $post_type ) { + $post_types = $this->get_translated_post_types( false ); + return ( is_array( $post_type ) && array_intersect( $post_type, $post_types ) || in_array( $post_type, $post_types ) || 'any' === $post_type && ! empty( $post_types ) ); + } + + /** + * Return taxonomies that need to be translated + * + * @since 1.2 + * + * @param bool $filter true if we should return only valid registered taxonomies + * @return array array of registered taxonomy names for which Polylang manages languages and translations + */ + public function get_translated_taxonomies( $filter = true ) { + if ( false === $taxonomies = $this->cache->get( 'taxonomies' ) ) { + $taxonomies = array( 'category' => 'category', 'post_tag' => 'post_tag' ); + + if ( ! empty( $this->options['taxonomies'] ) && is_array( $this->options['taxonomies'] ) ) { + $taxonomies = array_merge( $taxonomies, array_combine( $this->options['taxonomies'], $this->options['taxonomies'] ) ); + } + + /** + * Filter the list of taxonomies available for translation. + * The default are taxonomies which have the parameter ‘public’ set to true. + * The filter must be added soon in the WordPress loading process: + * in a function hooked to ‘plugins_loaded’ or directly in functions.php for themes. + * + * @since 0.8 + * + * @param array $taxonomies list of taxonomy names + * @param bool $is_settings true when displaying the list of custom taxonomies in Polylang settings + */ + $taxonomies = apply_filters( 'pll_get_taxonomies', $taxonomies, false ); + if ( did_action( 'after_setup_theme' ) ) { + $this->cache->set( 'taxonomies', $taxonomies ); + } + } + + return $filter ? array_intersect( $taxonomies, get_taxonomies() ) : $taxonomies; + } + + /** + * Returns true if Polylang manages languages and translations for this taxonomy + * + * @since 1.2 + * + * @param string|array $tax taxonomy name or array of taxonomy names + * @return bool + */ + public function is_translated_taxonomy( $tax ) { + $taxonomies = $this->get_translated_taxonomies( false ); + return ( is_array( $tax ) && array_intersect( $tax, $taxonomies ) || in_array( $tax, $taxonomies ) ); + } + + /** + * Return taxonomies that need to be filtered ( post_format like ) + * + * @since 1.7 + * + * @param bool $filter true if we should return only valid registered taxonomies + * @return array array of registered taxonomy names + */ + public function get_filtered_taxonomies( $filter = true ) { + if ( did_action( 'after_setup_theme' ) ) { + static $taxonomies = null; + } + + if ( empty( $taxonomies ) ) { + $taxonomies = array( 'post_format' => 'post_format' ); + + /** + * Filter the list of taxonomies not translatable but filtered by language. + * Includes only the post format by default + * The filter must be added soon in the WordPress loading process: + * in a function hooked to ‘plugins_loaded’ or directly in functions.php for themes. + * + * @since 1.7 + * + * @param array $taxonomies list of taxonomy names + * @param bool $is_settings true when displaying the list of custom taxonomies in Polylang settings + */ + $taxonomies = apply_filters( 'pll_filtered_taxonomies', $taxonomies, false ); + } + + return $filter ? array_intersect( $taxonomies, get_taxonomies() ) : $taxonomies; + } + + /** + * Returns true if Polylang filters this taxonomy per language + * + * @since 1.7 + * + * @param string|array $tax taxonomy name or array of taxonomy names + * @return bool + */ + public function is_filtered_taxonomy( $tax ) { + $taxonomies = $this->get_filtered_taxonomies( false ); + return ( is_array( $tax ) && array_intersect( $tax, $taxonomies ) || in_array( $tax, $taxonomies ) ); + } + + /** + * Returns the query vars of all filtered taxonomies + * + * @since 1.7 + * + * @return array + */ + public function get_filtered_taxonomies_query_vars() { + $query_vars = array(); + foreach ( $this->get_filtered_taxonomies() as $filtered_tax ) { + $tax = get_taxonomy( $filtered_tax ); + $query_vars[] = $tax->query_var; + } + return $query_vars; + } + + /** + * Create a default category for a language + * + * @since 1.2 + * + * @param object|string|int $lang language + */ + public function create_default_category( $lang ) { + $lang = $this->get_language( $lang ); + + // create a new category + // FIXME this is translated in admin language when we would like it in $lang + $cat_name = __( 'Uncategorized', 'polylang' ); + $cat_slug = sanitize_title( $cat_name . '-' . $lang->slug ); + $cat = wp_insert_term( $cat_name, 'category', array( 'slug' => $cat_slug ) ); + + // check that the category was not previously created ( in case the language was deleted and recreated ) + $cat = isset( $cat->error_data['term_exists'] ) ? $cat->error_data['term_exists'] : $cat['term_id']; + + // set language + $this->term->set_language( (int) $cat, $lang ); + + // this is a translation of the default category + $default = (int) get_option( 'default_category' ); + $translations = $this->term->get_translations( $default ); + if ( empty( $translations ) ) { + if ( $lg = $this->term->get_language( $default ) ) { + $translations[ $lg->slug ] = $default; + } + else { + $translations = array(); + } + } + + $this->term->save_translations( (int) $cat, $translations ); + } + + /** + * It is possible to have several terms with the same name in the same taxonomy ( one per language ) + * but the native term_exists will return true even if only one exists + * so here the function adds the language parameter + * + * @since 1.4 + * + * @param string $term_name the term name + * @param string $taxonomy taxonomy name + * @param int $parent parent term id + * @param string|object $language the language slug or object + * @return null|int the term_id of the found term + */ + public function term_exists( $term_name, $taxonomy, $parent, $language ) { + global $wpdb; + + $term_name = trim( wp_unslash( $term_name ) ); + $term_name = _wp_specialchars( $term_name ); + + $select = "SELECT t.term_id FROM $wpdb->terms AS t"; + $join = " INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"; + $join .= $this->term->join_clause(); + $where = $wpdb->prepare( ' WHERE tt.taxonomy = %s AND t.name = %s', $taxonomy, $term_name ); + $where .= $this->term->where_clause( $this->get_language( $language ) ); + + if ( $parent > 0 ) { + $where .= $wpdb->prepare( ' AND tt.parent = %d', $parent ); + } + + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->get_var( $select . $join . $where ); + } + + /** + * Checks if a term slug exists in a given language, taxonomy, hierarchy + * + * @since 1.9 + * @since 2.8 Moved from PLL_Share_Term_Slug::term_exists() to PLL_Model::term_exists_by_slug() + * + * @param string $slug The term slug to test. + * @param string|object $language The language slug or object. + * @param string $taxonomy Optional taxonomy name. + * @param int $parent Optional parent term id. + * @return null|int The term_id of the found term. + */ + public function term_exists_by_slug( $slug, $language, $taxonomy = '', $parent = 0 ) { + global $wpdb; + + $select = "SELECT t.term_id FROM {$wpdb->terms} AS t"; + $join = " INNER JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id"; + $join .= $this->term->join_clause(); + $where = $wpdb->prepare( ' WHERE t.slug = %s', $slug ); + $where .= $this->term->where_clause( $this->get_language( $language ) ); + + if ( ! empty( $taxonomy ) ) { + $where .= $wpdb->prepare( ' AND tt.taxonomy = %s', $taxonomy ); + } + + if ( $parent > 0 ) { + $where .= $wpdb->prepare( ' AND tt.parent = %d', $parent ); + } + + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + return $wpdb->get_var( $select . $join . $where ); + } + + + /** + * Gets the number of posts per language in a date, author or post type archive. + * + * @since 1.2 + * + * @param object $lang PLL_Language instance. + * @param array $q WP_Query arguments ( accepted: post_type, m, year, monthnum, day, author, author_name, post_format, post_status ). + * @return int + */ + public function count_posts( $lang, $q = array() ) { + global $wpdb; + + $q = wp_parse_args( $q, array( 'post_type' => 'post', 'post_status' => 'publish' ) ); + + if ( ! is_array( $q['post_type'] ) ) { + $q['post_type'] = array( $q['post_type'] ); + } + + foreach ( $q['post_type'] as $key => $type ) { + if ( ! post_type_exists( $type ) ) { + unset( $q['post_type'][ $key ] ); + } + } + + if ( empty( $q['post_type'] ) ) { + $q['post_type'] = array( 'post' ); // We *need* a post type. + } + + $cache_key = 'pll_count_posts_' . md5( maybe_serialize( $q ) ); + $counts = wp_cache_get( $cache_key, 'counts' ); + + if ( false === $counts ) { + $select = "SELECT pll_tr.term_taxonomy_id, COUNT( * ) AS num_posts FROM {$wpdb->posts}"; + $join = $this->post->join_clause(); + $where = sprintf( " WHERE post_status = '%s'", esc_sql( $q['post_status'] ) ); + $where .= sprintf( " AND {$wpdb->posts}.post_type IN ( '%s' )", join( "', '", esc_sql( $q['post_type'] ) ) ); + $where .= $this->post->where_clause( $this->get_languages_list() ); + $groupby = ' GROUP BY pll_tr.term_taxonomy_id'; + + if ( ! empty( $q['m'] ) ) { + $q['m'] = '' . preg_replace( '|[^0-9]|', '', $q['m'] ); + $where .= $wpdb->prepare( " AND YEAR( {$wpdb->posts}.post_date ) = %d", substr( $q['m'], 0, 4 ) ); + if ( strlen( $q['m'] ) > 5 ) { + $where .= $wpdb->prepare( " AND MONTH( {$wpdb->posts}.post_date ) = %d", substr( $q['m'], 4, 2 ) ); + } + if ( strlen( $q['m'] ) > 7 ) { + $where .= $wpdb->prepare( " AND DAYOFMONTH( {$wpdb->posts}.post_date ) = %d", substr( $q['m'], 6, 2 ) ); + } + } + + if ( ! empty( $q['year'] ) ) { + $where .= $wpdb->prepare( " AND YEAR( {$wpdb->posts}.post_date ) = %d", $q['year'] ); + } + + if ( ! empty( $q['monthnum'] ) ) { + $where .= $wpdb->prepare( " AND MONTH( {$wpdb->posts}.post_date ) = %d", $q['monthnum'] ); + } + + if ( ! empty( $q['day'] ) ) { + $where .= $wpdb->prepare( " AND DAYOFMONTH( {$wpdb->posts}.post_date ) = %d", $q['day'] ); + } + + if ( ! empty( $q['author_name'] ) ) { + $author = get_user_by( 'slug', sanitize_title_for_query( $q['author_name'] ) ); + if ( $author ) { + $q['author'] = $author->ID; + } + } + + if ( ! empty( $q['author'] ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $q['author'] ); + } + + // Filtered taxonomies ( post_format ). + foreach ( $this->get_filtered_taxonomies_query_vars() as $tax_qv ) { + + if ( ! empty( $q[ $tax_qv ] ) ) { + $join .= " INNER JOIN {$wpdb->term_relationships} AS tr ON tr.object_id = {$wpdb->posts}.ID"; + $join .= " INNER JOIN {$wpdb->term_taxonomy} AS tt ON tt.term_taxonomy_id = tr.term_taxonomy_id"; + $join .= " INNER JOIN {$wpdb->terms} AS t ON t.term_id = tt.term_id"; + $where .= $wpdb->prepare( ' AND t.slug = %s', $q[ $tax_qv ] ); + } + } + + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $res = $wpdb->get_results( $select . $join . $where . $groupby, ARRAY_A ); + foreach ( (array) $res as $row ) { + $counts[ $row['term_taxonomy_id'] ] = $row['num_posts']; + } + + wp_cache_set( $cache_key, $counts, 'counts' ); + } + + return empty( $counts[ $lang->term_taxonomy_id ] ) ? 0 : $counts[ $lang->term_taxonomy_id ]; + } + + /** + * Setup the links model based on options + * + * @since 1.2 + * + * @return object implementing "links_model interface" + */ + public function get_links_model() { + $c = array( 'Directory', 'Directory', 'Subdomain', 'Domain' ); + $class = get_option( 'permalink_structure' ) ? 'PLL_Links_' . $c[ $this->options['force_lang'] ] : 'PLL_Links_Default'; + + /** + * Filter the links model class to use + * /!\ this filter is fired *before* the $polylang object is available + * + * @since 2.1.1 + * + * @param string $class A class name: PLL_Links_Default, PLL_Links_Directory, PLL_Links_Subdomain, PLL_Links_Domain + */ + $class = apply_filters( 'pll_links_model', $class ); + + return new $class( $this ); + } + + /** + * Some backward compatibility with Polylang < 1.8 + * allows for example to call $polylang->model->get_post_languages( $post_id ) instead of $polylang->model->post->get_language( $post_id ) + * this works but should be slower than the direct call, thus an error is triggered in debug mode + * + * @since 1.8 + * + * @param string $func Function name + * @param array $args Function arguments + */ + public function __call( $func, $args ) { + $f = $func; + + switch ( $func ) { + case 'get_object_term': + $o = ( false === strpos( $args[1], 'term' ) ) ? 'post' : 'term'; + break; + + case 'save_translations': + case 'delete_translation': + case 'get_translations': + case 'get_translation': + case 'join_clause': + $o = ( 'post' == $args[0] || $this->is_translated_post_type( $args[0] ) ) ? 'post' : ( 'term' == $args[0] || $this->is_translated_taxonomy( $args[0] ) ? 'term' : false ); + unset( $args[0] ); + break; + + case 'set_post_language': + case 'get_post_language': + case 'set_term_language': + case 'get_term_language': + case 'delete_term_language': + case 'get_post': + case 'get_term': + $str = explode( '_', $func ); + $f = empty( $str[2] ) ? $str[0] : $str[0] . '_' . $str[2]; + $o = $str[1]; + break; + + case 'where_clause': + case 'get_objects_in_language': + $o = $args[1]; + unset( $args[1] ); + break; + } + + if ( ! empty( $o ) && is_object( $this->$o ) && method_exists( $this->$o, $f ) ) { + if ( WP_DEBUG ) { + $debug = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + $i = 1 + empty( $debug[1]['line'] ); // the file and line are in $debug[2] if the function was called using call_user_func + + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + '%1$s was called incorrectly in %4$s on line %5$s: the call to $polylang->model->%1$s() has been deprecated in Polylang 1.8, use PLL()->model->%2$s->%3$s() instead.' . "\nError handler", + esc_html( $func ), + esc_html( $o ), + esc_html( $f ), + esc_html( $debug[ $i ]['file'] ), + absint( $debug[ $i ]['line'] ) + ) + ); + } + return call_user_func_array( array( $this->$o, $f ), $args ); + } + + $debug = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + 'Call to undefined function PLL()->model->%1$s() in %2$s on line %3$s' . "\nError handler", + esc_html( $func ), + esc_html( $debug[0]['file'] ), + absint( $debug[0]['line'] ) + ), + E_USER_ERROR + ); + } +} diff --git a/wp-content/plugins/polylang/include/nav-menu.php b/wp-content/plugins/polylang/include/nav-menu.php new file mode 100644 index 00000000..d22a6986 --- /dev/null +++ b/wp-content/plugins/polylang/include/nav-menu.php @@ -0,0 +1,151 @@ +model = &$polylang->model; + $this->options = &$polylang->options; + + $this->theme = get_option( 'stylesheet' ); + + add_filter( 'wp_setup_nav_menu_item', array( $this, 'wp_setup_nav_menu_item' ) ); + + // Integration with WP customizer + add_action( 'customize_register', array( $this, 'create_nav_menu_locations' ), 5 ); + + // Filter _wp_auto_add_pages_to_menu by language + add_action( 'transition_post_status', array( $this, 'auto_add_pages_to_menu' ), 5, 3 ); // before _wp_auto_add_pages_to_menu + } + + /** + * Assigns the title and label to the language switcher menu items + * + * @since 2.6 + * + * @param object $item Menu item. + * @return object + */ + public function wp_setup_nav_menu_item( $item ) { + if ( '#pll_switcher' === $item->url ) { + $item->post_title = __( 'Languages', 'polylang' ); + $item->type_label = __( 'Language switcher', 'polylang' ); + } + return $item; + } + + /** + * Create temporary nav menu locations ( one per location and per language ) for all non-default language + * to do only one time + * + * @since 1.2 + */ + public function create_nav_menu_locations() { + static $once; + global $_wp_registered_nav_menus; + + $arr = array(); + + if ( isset( $_wp_registered_nav_menus ) && ! $once ) { + foreach ( $_wp_registered_nav_menus as $loc => $name ) { + foreach ( $this->model->get_languages_list() as $lang ) { + $arr[ $this->combine_location( $loc, $lang ) ] = $name . ' ' . $lang->name; + } + } + + $_wp_registered_nav_menus = $arr; + $once = true; + } + } + + /** + * Creates a temporary nav menu location from a location and a language + * + * @since 1.8 + * + * @param string $loc nav menu location + * @param object $lang + * @return string + */ + public function combine_location( $loc, $lang ) { + return $loc . ( strpos( $loc, '___' ) || $this->options['default_lang'] === $lang->slug ? '' : '___' . $lang->slug ); + } + + /** + * Get nav menu locations and language from a temporary location + * + * @since 1.8 + * + * @param string $loc temporary location + * @return array + * 'location' => nav menu location + * 'lang' => language slug + */ + public function explode_location( $loc ) { + $infos = explode( '___', $loc ); + if ( 1 == count( $infos ) ) { + $infos[] = $this->options['default_lang']; + } + return array_combine( array( 'location', 'lang' ), $infos ); + } + + /** + * Filters the option nav_menu_options for auto added pages to menu + * + * @since 0.9.4 + * + * @param array $options + * @return array Modified options + */ + public function nav_menu_options( $options ) { + $options['auto_add'] = array_intersect( $options['auto_add'], $this->auto_add_menus ); + return $options; + } + + /** + * Filters _wp_auto_add_pages_to_menu by language + * + * @since 0.9.4 + * + * @param string $new_status Transition to this post status. + * @param string $old_status Previous post status. + * @param object $post Post data. + */ + public function auto_add_pages_to_menu( $new_status, $old_status, $post ) { + if ( 'publish' != $new_status || 'publish' == $old_status || 'page' != $post->post_type || ! empty( $post->post_parent ) ) { + return; + } + + if ( ! empty( $this->options['nav_menus'][ $this->theme ] ) ) { + $this->auto_add_menus = array(); + + $lang = $this->model->post->get_language( $post->ID ); + $lang = empty( $lang ) ? $this->options['default_lang'] : $lang->slug; // If the page has no language yet, the default language will be assigned + + // Get all the menus in the page language + foreach ( $this->options['nav_menus'][ $this->theme ] as $loc ) { + if ( ! empty( $loc[ $lang ] ) ) { + $this->auto_add_menus[] = $loc[ $lang ]; + } + } + + add_filter( 'option_nav_menu_options', array( $this, 'nav_menu_options' ) ); + } + } +} diff --git a/wp-content/plugins/polylang/include/olt-manager.php b/wp-content/plugins/polylang/include/olt-manager.php new file mode 100644 index 00000000..23bb3310 --- /dev/null +++ b/wp-content/plugins/polylang/include/olt-manager.php @@ -0,0 +1,249 @@ +default_locale = get_locale(); + + // Filters for text domain management + add_filter( 'load_textdomain_mofile', array( $this, 'load_textdomain_mofile' ), 10, 2 ); + add_filter( 'gettext', array( $this, 'gettext' ), 10, 3 ); + add_filter( 'gettext_with_context', array( $this, 'gettext_with_context' ), 10, 4 ); + + // Loads text domains + add_action( 'pll_language_defined', array( $this, 'load_textdomains' ), 2 ); // After PLL_Frontend::pll_language_defined + add_action( 'pll_no_language_defined', array( $this, 'load_textdomains' ) ); + } + + /** + * Access to the single instance of the class + * + * @since 1.7 + * + * @return object + */ + public static function instance() { + if ( empty( self::$instance ) ) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Loads text domains + * + * @since 0.1 + */ + public function load_textdomains() { + // Our load_textdomain_mofile filter has done its job. let's remove it before calling load_textdomain + remove_filter( 'load_textdomain_mofile', array( $this, 'load_textdomain_mofile' ), 10, 2 ); + remove_filter( 'gettext', array( $this, 'gettext' ), 10, 3 ); + remove_filter( 'gettext_with_context', array( $this, 'gettext_with_context' ), 10, 4 ); + $new_locale = get_locale(); + + // Don't try to save time for en_US as some users have theme written in another language + // Now we can load all overridden text domains with the right language + if ( ! empty( $this->list_textdomains ) ) { + /* + * FIXME: Backward compatibility with WP < 5.6 + * From WP 4.7 to 5.5, we need to reset the internal cache of _get_path_to_translation when switching from any locale to en_US. + * See WP_Locale_Switcher::change_locale() + */ + if ( ! class_exists( 'WP_Textdomain_Registry' ) && function_exists( '_get_path_to_translation' ) ) { + _get_path_to_translation( null, true ); + } + + foreach ( $this->list_textdomains as $textdomain ) { + // Since WP 4.6, plugins translations are first loaded from wp-content/languages + if ( ! load_textdomain( $textdomain['domain'], str_replace( "{$this->default_locale}.mo", "$new_locale.mo", $textdomain['mo'] ) ) ) { + // Since WP 3.5 themes may store languages files in /wp-content/languages/themes + if ( ! load_textdomain( $textdomain['domain'], WP_LANG_DIR . "/themes/{$textdomain['domain']}-$new_locale.mo" ) ) { + // Since WP 3.7 plugins may store languages files in /wp-content/languages/plugins + load_textdomain( $textdomain['domain'], WP_LANG_DIR . "/plugins/{$textdomain['domain']}-$new_locale.mo" ); + } + } + } + } + + // First remove taxonomies and post_types labels that we don't need to translate + $taxonomies = get_taxonomies( array( '_pll' => true ) ); + $post_types = get_post_types( array( '_pll' => true ) ); + + // We don't need to translate core taxonomies and post types labels when setting the language from the url + // As they will be translated when registered the second time + if ( ! did_action( 'setup_theme' ) ) { + $taxonomies = array_merge( get_taxonomies( array( '_builtin' => true ) ), $taxonomies ); + $post_types = array_merge( get_post_types( array( '_builtin' => true ) ), $post_types ); + } + + // Translate labels of post types and taxonomies + foreach ( array_diff_key( $GLOBALS['wp_taxonomies'], array_flip( $taxonomies ) ) as $tax ) { + $this->translate_labels( $tax ); + } + foreach ( array_diff_key( $GLOBALS['wp_post_types'], array_flip( $post_types ) ) as $pt ) { + $this->translate_labels( $pt ); + } + + // Act only if the language has not been set early ( before default textdomain loading and $wp_locale creation ) + if ( did_action( 'after_setup_theme' ) ) { + // Reinitializes wp_locale for weekdays and months + unset( $GLOBALS['wp_locale'] ); + $GLOBALS['wp_locale'] = new WP_Locale(); + } + + /** + * Fires after the post types and taxonomies labels have been translated + * This allows plugins to translate text the same way we do for post types and taxonomies labels + * + * @since 1.2 + * + * @param array $labels list of strings to trnaslate + */ + do_action_ref_array( 'pll_translate_labels', array( &$this->labels ) ); + + // Free memory + unset( $this->default_locale, $this->list_textdomains, $this->labels ); + } + + /** + * FIXME: Backward compatibility with Polylang for WooCommerce < 0.3.4 + * Was formerly hooked to the filter 'override_load_textdomain' + * + * @since 0.1 + * + * @param bool $bool Whether to override the .mo file loading. + * @return bool + */ + public function mofile( $bool ) { + return $bool; + } + + /** + * Saves all text domains in a table for later usage + * It replaces the 'override_load_textdomain' filter used since 0.1 + * + * @since 2.0.4 + * + * @param string $mofile translation file name + * @param string $domain text domain name + * @return bool + */ + public function load_textdomain_mofile( $mofile, $domain ) { + // On multisite, 2 files are sharing the same domain so we need to distinguish them + if ( 'default' === $domain && false !== strpos( $mofile, '/ms-' ) ) { + $this->list_textdomains['ms-default'] = array( 'mo' => $mofile, 'domain' => $domain ); + } else { + $this->list_textdomains[ $domain ] = array( 'mo' => $mofile, 'domain' => $domain ); + } + return ''; // Hack to prevent WP loading text domains as we will load them all later + } + + /** + * Saves post types and taxonomies labels for a later usage + * + * @since 0.9 + * + * @param string $translation not used + * @param string $text string to translate + * @param string $domain text domain + * @return string unmodified $translation + */ + public function gettext( $translation, $text, $domain ) { + if ( is_string( $text ) ) { // Avoid a warning with some buggy plugins which pass an array + $this->labels[ $text ] = array( 'domain' => $domain ); + } + return $translation; + } + + /** + * Saves post types and taxonomies labels for a later usage + * + * @since 0.9 + * + * @param string $translation not used + * @param string $text string to translate + * @param string $context some comment to describe the context of string to translate + * @param string $domain text domain + * @return string unmodified $translation + */ + public function gettext_with_context( $translation, $text, $context, $domain ) { + $this->labels[ $text ] = array( 'domain' => $domain, 'context' => $context ); + return $translation; + } + + /** + * Translates post types and taxonomies labels once the language is known + * + * @since 0.9 + * + * @param object $type either a post type or a taxonomy + */ + public function translate_labels( $type ) { + // Use static array to avoid translating several times the same ( default ) labels + static $translated = array(); + + foreach ( $type->labels as $key => $label ) { + if ( is_string( $label ) && isset( $this->labels[ $label ] ) ) { + if ( empty( $translated[ $label ] ) ) { + // PHPCS:disable WordPress.WP.I18n + $type->labels->$key = $translated[ $label ] = isset( $this->labels[ $label ]['context'] ) ? + _x( $label, $this->labels[ $label ]['context'], $this->labels[ $label ]['domain'] ) : + __( $label, $this->labels[ $label ]['domain'] ); + // PHPCS:enable + } + else { + $type->labels->$key = $translated[ $label ]; + } + } + } + } + + /** + * Allows Polylang to be the first plugin loaded ;- ) + * + * @since 1.2 + * + * @param array $plugins list of active plugins + * @return array list of active plugins + */ + public function make_polylang_first( $plugins ) { + if ( $key = array_search( POLYLANG_BASENAME, $plugins ) ) { + unset( $plugins[ $key ] ); + array_unshift( $plugins, POLYLANG_BASENAME ); + } + return $plugins; + } +} diff --git a/wp-content/plugins/polylang/include/pointer.php b/wp-content/plugins/polylang/include/pointer.php new file mode 100644 index 00000000..250b5c51 --- /dev/null +++ b/wp-content/plugins/polylang/include/pointer.php @@ -0,0 +1,116 @@ + required, unique identifier of the pointer + * id => required, the pointer will be attached to this html id + * position => optional array, if used both sub parameters are required + * edge => 'top' or 'bottom' + * align => 'right' or 'left' + * width => optional, the width in px + * title => required, title + * content => required, content + * buttons => optional array of arrays, by default the pointer uses the standard dismiss button offered by WP + * label => the label of the button + * link => optional link for the button. By default, the button just dismisses the pointer + * + * @since 1.7.7 + * + * @param array $args + */ + public function __construct( $args ) { + trigger_error( 'The class PLL_Pointer has been deprecated since Polylang 2.3.9 and will be removed in a future version.', E_USER_ERROR ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + + $this->args = $args; + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + } + + /** + * Enqueue javascripts and styles if the pointer has not been dismissed + * + * @since 1.7.7 + */ + public function enqueue_scripts() { + $dismissed = explode( ',', get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ); + if ( in_array( $this->args['pointer'], $dismissed ) || ! current_user_can( 'manage_options' ) ) { + return; + } + + // Add pointer javascript + add_action( 'admin_print_footer_scripts', array( $this, 'print_js' ) ); + + wp_enqueue_style( 'wp-pointer' ); + wp_enqueue_script( 'wp-pointer' ); + } + + /** + * Adds the javascript of our pointer to the page + * + * @since 1.7.7 + */ + public function print_js() { + + // Add optional buttons + if ( ! empty( $this->args['buttons'] ) ) { + $b = " + var widget = pointer.pointer( 'widget' ); + var buttons = $( '.wp-pointer-buttons', widget ); + $( 'a.close', widget ).remove();"; // removes the WP button + + // All the buttons use the standard WP ajax action to remember the pointer has been dismissed + foreach ( $this->args['buttons'] as $button ) { + $b .= sprintf( + "$( '' ).addClass( '%s' ).html( '%s' ).css( 'margin-left', '10px' ).click( function() { + $.post( ajaxurl, { + pointer: '%s', + action: 'dismiss-wp-pointer' + }, function( response ) { + %s + } ); + } ).appendTo( buttons );", + empty( $button['link'] ) ? 'button' : 'button button-primary', + esc_html( $button['label'] ), + $this->args['pointer'], + empty( $button['link'] ) ? "pointer.pointer( 'close' )" : sprintf( "location.href = '%s'", $button['link'] ) + ); + } + } + + $js = sprintf( + "//", + $this->args['id'], + sprintf( '

%s

%s

', esc_html( $this->args['title'] ), esc_html( $this->args['content'] ) ), + empty( $this->args['position'] ) ? '' : sprintf( 'position: {edge: "%s", align: "%s",},', $this->args['position']['edge'], $this->args['position']['align'] ), + empty( $this->args['width'] ) ? '' : sprintf( 'pointerWidth: %d,', $this->args['width'] ), + empty( $b ) ? '' : $b + ); + echo ''; // phpcs:ignore WordPress.Security.EscapeOutput + } +} diff --git a/wp-content/plugins/polylang/include/query.php b/wp-content/plugins/polylang/include/query.php new file mode 100644 index 00000000..f4e6ec4e --- /dev/null +++ b/wp-content/plugins/polylang/include/query.php @@ -0,0 +1,152 @@ +query = &$query; + $this->model = &$model; + } + + /** + * Check if translated taxonomy is queried + * Compatible with nested queries introduced in WP 4.1 + * + * @see https://wordpress.org/support/topic/tax_query-bug + * + * @since 1.7 + * + * @param array $tax_queries + * @return bool + */ + protected function have_translated_taxonomy( $tax_queries ) { + if ( is_array( $tax_queries ) ) { + foreach ( $tax_queries as $tax_query ) { + if ( isset( $tax_query['taxonomy'] ) && $this->model->is_translated_taxonomy( $tax_query['taxonomy'] ) && ! ( isset( $tax_query['operator'] ) && 'NOT IN' === $tax_query['operator'] ) ) { + return true; + } + + // Nested queries + elseif ( is_array( $tax_query ) && $this->have_translated_taxonomy( $tax_query ) ) { + return true; + } + } + } + + return false; + } + + /** + * Get queried taxonomies + * + * @since 2.2 + * + * @return array queried taxonomies + */ + public function get_queried_taxonomies() { + return isset( $this->query->tax_query->queried_terms ) ? array_keys( wp_list_filter( $this->query->tax_query->queried_terms, array( 'operator' => 'NOT IN' ), 'NOT' ) ) : array(); + } + + /** + * Sets the language in query + * Optimized for ( needs ) WP 3.5+ + * + * @since 2.2 + * + * @param object $lang + */ + public function set_language( $lang ) { + // Defining directly the tax_query ( rather than setting 'lang' avoids transforming the query by WP ) + $lang_query = array( + 'taxonomy' => 'language', + 'field' => 'term_taxonomy_id', // Since WP 3.5 + 'terms' => $lang->term_taxonomy_id, + 'operator' => 'IN', + ); + + $tax_query = &$this->query->query_vars['tax_query']; + + if ( isset( $tax_query['relation'] ) && 'OR' === $tax_query['relation'] ) { + $tax_query = array( + $lang_query, + array( $tax_query ), + 'relation' => 'AND', + ); + } elseif ( is_array( $tax_query ) ) { + // The tax query is expected to be *always* an array, but it seems that 3rd parties fill it with a string + // Causing a fatal error if we don't check it. + // See https://wordpress.org/support/topic/fatal-error-2947/ + $tax_query[] = $lang_query; + } elseif ( empty( $tax_query ) ) { + // Supposing the tax query has been wrongly filled with an empty string + $tax_query = array( $lang_query ); + } + } + + /** + * Add the language in query after it has checked that it won't conflict with other query vars + * + * @since 2.2 + * + * @param object $lang Language + */ + public function filter_query( $lang ) { + $qvars = &$this->query->query_vars; + + if ( ! isset( $qvars['lang'] ) ) { + $taxonomies = array_intersect( $this->model->get_translated_taxonomies(), get_taxonomies( array( '_builtin' => false ) ) ); + + foreach ( $taxonomies as $tax ) { + $tax = get_taxonomy( $tax ); + if ( ! empty( $qvars[ $tax->query_var ] ) ) { + return; + } + } + + if ( ! empty( $qvars['tax_query'] ) && $this->have_translated_taxonomy( $qvars['tax_query'] ) ) { + return; + } + + // Filter queries according to the requested language + if ( ! empty( $lang ) ) { + $taxonomies = $this->get_queried_taxonomies(); + + if ( $taxonomies && ( empty( $qvars['post_type'] ) || 'any' === $qvars['post_type'] ) ) { + foreach ( $taxonomies as $taxonomy ) { + $tax_object = get_taxonomy( $taxonomy ); + if ( $this->model->is_translated_post_type( $tax_object->object_type ) ) { + $this->set_language( $lang ); + break; + } + } + } elseif ( empty( $qvars['post_type'] ) || $this->model->is_translated_post_type( $qvars['post_type'] ) ) { + $this->set_language( $lang ); + } + } + } else { + // Do not filter untranslatable post types such as nav_menu_item + if ( isset( $qvars['post_type'] ) && ! $this->model->is_translated_post_type( $qvars['post_type'] ) && ( empty( $qvars['tax_query'] ) || ! $this->have_translated_taxonomy( $qvars['tax_query'] ) ) ) { + unset( $qvars['lang'] ); + } + + // Unset 'all' query var (mainly for admin language filter). + if ( isset( $qvars['lang'] ) && 'all' === $qvars['lang'] ) { + unset( $qvars['lang'] ); + } + } + } +} diff --git a/wp-content/plugins/polylang/include/rest-request.php b/wp-content/plugins/polylang/include/rest-request.php new file mode 100644 index 00000000..13dd6593 --- /dev/null +++ b/wp-content/plugins/polylang/include/rest-request.php @@ -0,0 +1,52 @@ + inherited, reference to Polylang options array + * model => inherited, reference to PLL_Model object + * links_model => inherited, reference to PLL_Links_Model object + * links => reference to PLL_Admin_Links object + * static_pages => reference to PLL_Static_Pages object + * filters => reference to PLL_Frontend_Filters object + * filters_links => reference to PLL_Filters_Links object + * posts => reference to PLL_CRUD_Posts object + * terms => reference to PLL_CRUD_Terms object + * + * @since 2.6 + */ +class PLL_REST_Request extends PLL_Base { + public $links, $static_pages, $posts, $terms, $filters, $filters_links; + + /** + * Setup filters + * + * @since 2.6 + */ + public function init() { + parent::init(); + + if ( $this->model->get_languages_list() ) { + + /** This action is documented in include/class-polylang.php */ + do_action( 'pll_no_language_defined' ); // To load overridden textdomains. + + $this->filters_links = new PLL_Filters_Links( $this ); + $this->filters = new PLL_Filters( $this ); + + // Static front page and page for posts + if ( 'page' === get_option( 'show_on_front' ) ) { + $this->static_pages = new PLL_Static_Pages( $this ); + } + + $this->links = new PLL_Admin_Links( $this ); + + $this->nav_menu = new PLL_Nav_Menu( $this ); // For auto added pages to menu + } + } +} diff --git a/wp-content/plugins/polylang/include/static-pages.php b/wp-content/plugins/polylang/include/static-pages.php new file mode 100644 index 00000000..5ebdf609 --- /dev/null +++ b/wp-content/plugins/polylang/include/static-pages.php @@ -0,0 +1,126 @@ +model = &$polylang->model; + $this->options = &$polylang->options; + $this->curlang = &$polylang->curlang; + + $this->init(); + + // Modifies the page link in case the front page is not in the default language + add_filter( 'page_link', array( $this, 'page_link' ), 20, 2 ); + + // Clean the languages cache when editing page of front, page for posts + add_action( 'update_option_show_on_front', array( $this->model, 'clean_languages_cache' ) ); + add_action( 'update_option_page_on_front', array( $this->model, 'clean_languages_cache' ) ); + add_action( 'update_option_page_for_posts', array( $this->model, 'clean_languages_cache' ) ); + + // Refresh rewrite rules when the page on front is modified + add_action( 'update_option_page_on_front', 'flush_rewrite_rules' ); + + // OEmbed + add_filter( 'oembed_request_post_id', array( $this, 'oembed_request_post_id' ), 10, 2 ); + } + + /** + * Stores the page on front and page for posts ids + * + * @since 1.8 + */ + public function init() { + if ( 'page' == get_option( 'show_on_front' ) ) { + $this->page_on_front = get_option( 'page_on_front' ); + $this->page_for_posts = get_option( 'page_for_posts' ); + } else { + $this->page_on_front = 0; + $this->page_for_posts = 0; + } + } + + /** + * Modifies the page link in case the front page is not in the default language + * + * @since 0.7.2 + * + * @param string $link link to the page + * @param int $id post id of the page + * @return string modified link + */ + public function page_link( $link, $id ) { + $lang = $this->model->post->get_language( $id ); + + if ( $lang && $id == $lang->page_on_front ) { + return $lang->home_url; + } + return $link; + } + + /** + * Adds page_on_front and page_for_posts properties to the language objects + * + * @since 1.8 + * + * @param array $languages + * @param object $model + */ + public static function pll_languages_list( $languages, $model ) { + if ( 'page' === get_option( 'show_on_front' ) ) { + foreach ( $languages as $k => $language ) { + $languages[ $k ]->page_on_front = $model->post->get( get_option( 'page_on_front' ), $language ); + $languages[ $k ]->page_for_posts = $model->post->get( get_option( 'page_for_posts' ), $language ); + } + } + + return $languages; + } + + /** + * Translates page for posts + * + * @since 1.8 + * + * @param int $v page for posts page id + * @return int + */ + public function translate_page_for_posts( $v ) { + // Don't attempt to translate in a 'switch_blog' action as there is a risk to call this function while initializing the languages cache + return isset( $this->curlang->page_for_posts ) && ( $this->curlang->page_for_posts ) && ! doing_action( 'switch_blog' ) ? $this->curlang->page_for_posts : $v; + } + + /** + * Fixes the oembed for the translated static front page + * when the language page is redirected to the front page + * + * @since 2.6 + * + * @param int $post_id The post ID. + * @param string $url The requested URL. + */ + public function oembed_request_post_id( $post_id, $url ) { + foreach ( $this->model->get_languages_list() as $lang ) { + if ( trailingslashit( $url ) === trailingslashit( $lang->home_url ) ) { + $post_id = $lang->page_on_front; + } + } + return $post_id; + } +} diff --git a/wp-content/plugins/polylang/include/switcher.php b/wp-content/plugins/polylang/include/switcher.php new file mode 100644 index 00000000..2d60855c --- /dev/null +++ b/wp-content/plugins/polylang/include/switcher.php @@ -0,0 +1,219 @@ + array( 'string' => __( 'Displays as a dropdown', 'polylang' ), 'default' => 0 ), + 'show_names' => array( 'string' => __( 'Displays language names', 'polylang' ), 'default' => 1 ), + 'show_flags' => array( 'string' => __( 'Displays flags', 'polylang' ), 'default' => 0 ), + 'force_home' => array( 'string' => __( 'Forces link to front page', 'polylang' ), 'default' => 0 ), + 'hide_current' => array( 'string' => __( 'Hides the current language', 'polylang' ), 'default' => 0 ), + 'hide_if_no_translation' => array( 'string' => __( 'Hides languages with no translation', 'polylang' ), 'default' => 0 ), + ); + return wp_list_pluck( $options, $key ); + } + + /** + * Get the language elements for use in a walker + * + * @see PLL_Switcher::the_languages() for the list of parameters accepted in $args + * + * @since 1.2 + * + * @param object $links instance of PLL_Frontend_Links + * @param array $args + * @return array + */ + protected function get_elements( $links, $args ) { + $first = true; + $out = array(); + + foreach ( $links->model->get_languages_list( array( 'hide_empty' => $args['hide_if_empty'] ) ) as $language ) { + $id = (int) $language->term_id; + $order = (int) $language->term_group; + $slug = $language->slug; + $locale = $language->get_locale( 'display' ); + $classes = array( 'lang-item', 'lang-item-' . $id, 'lang-item-' . esc_attr( $slug ) ); + $url = null; // Avoids potential notice + $curlang = 0 === $args['admin_render'] ? $links->curlang->slug : $args['admin_current_lang']; + $current_lang = $curlang == $slug; + + if ( $current_lang ) { + if ( $args['hide_current'] && ! ( $args['dropdown'] && ! $args['raw'] ) ) { + continue; // Hide current language except for dropdown + } else { + $classes[] = 'current-lang'; + } + } + + if ( null !== $args['post_id'] && ( $tr_id = $links->model->post->get( $args['post_id'], $language ) ) && $links->model->post->current_user_can_read( $tr_id ) ) { + $url = get_permalink( $tr_id ); + } elseif ( null === $args['post_id'] && 0 === $args['admin_render'] ) { + $url = $links->get_translation_url( $language ); + } + + if ( $no_translation = empty( $url ) ) { + $classes[] = 'no-translation'; + } + + /** + * Filter the link in the language switcher + * + * @since 0.7 + * + * @param string $url the link + * @param string $slug language code + * @param string $locale language locale + */ + $url = apply_filters( 'pll_the_language_link', $url, $slug, $language->locale ); + + // Hide if no translation exists + if ( empty( $url ) && $args['hide_if_no_translation'] ) { + continue; + } + + $url = empty( $url ) || $args['force_home'] ? $links->get_home_url( $language ) : $url; // If the page is not translated, link to the home page + + $name = $args['show_names'] || ! $args['show_flags'] || $args['raw'] ? ( 'slug' == $args['display_names_as'] ? $slug : $language->name ) : ''; + $flag = $args['raw'] && ! $args['show_flags'] ? $language->get_display_flag_url() : ( $args['show_flags'] ? $language->get_display_flag() : '' ); + + if ( $first ) { + $classes[] = 'lang-item-first'; + $first = false; + } + + $out[ $slug ] = compact( 'id', 'order', 'slug', 'locale', 'name', 'url', 'flag', 'current_lang', 'no_translation', 'classes' ); + } + + return $out; + } + + /** + * Displays a language switcher + * or returns the raw elements to build a custom language switcher + * + * List of parameters accepted in $args: + * + * dropdown => the list is displayed as dropdown if set, defaults to 0 + * echo => echoes the list if set to 1, defaults to 1 + * hide_if_empty => hides languages with no posts ( or pages ) if set to 1, defaults to 1 + * show_flags => displays flags if set to 1, defaults to 0 + * show_names => show language names if set to 1, defaults to 1 + * display_names_as => whether to display the language name or its slug, valid options are 'slug' and 'name', defaults to name + * force_home => will always link to home in translated language if set to 1, defaults to 0 + * hide_if_no_translation => hide the link if there is no translation if set to 1, defaults to 0 + * hide_current => hide the current language if set to 1, defaults to 0 + * post_id => returns links to translations of post defined by post_id if set, defaults not set + * raw => return a raw array instead of html markup if set to 1, defaults to 0 + * item_spacing => whether to preserve or discard whitespace between list items, valid options are 'preserve' and 'discard', defaults to preserve + * admin_render => allows to force the current language code in an admin context if set, default to 0. Need to set the admin_current_lang argument below + * admin_current_lang => the current language code in an admin context. Need to set the admin_render to 1, defaults not set + * + * @since 0.1 + * + * @param object $links instance of PLL_Frontend_Links + * @param array $args + * @return string|array either the html markup of the switcher or the raw elements to build a custom language switcher + */ + public function the_languages( $links, $args = '' ) { + $defaults = array( + 'dropdown' => 0, // display as list and not as dropdown + 'echo' => 1, // echoes the list + 'hide_if_empty' => 1, // hides languages with no posts ( or pages ) + 'menu' => 0, // not for nav menu ( this argument is deprecated since v1.1.1 ) + 'show_flags' => 0, // don't show flags + 'show_names' => 1, // show language names + 'display_names_as' => 'name', // valid options are slug and name + 'force_home' => 0, // tries to find a translation + 'hide_if_no_translation' => 0, // don't hide the link if there is no translation + 'hide_current' => 0, // don't hide current language + 'post_id' => null, // if not null, link to translations of post defined by post_id + 'raw' => 0, // set this to true to build your own custom language switcher + 'item_spacing' => 'preserve', // 'preserve' or 'discard' whitespace between list items + 'admin_render' => 0, // make the switcher in an frontend context + 'admin_current_lang' => null, // use when admin_render is set to 1, if not null use it instead of the current language + ); + $args = wp_parse_args( $args, $defaults ); + + /** + * Filter the arguments of the 'pll_the_languages' template tag + * + * @since 1.5 + * + * @param array $args + */ + $args = apply_filters( 'pll_the_languages_args', $args ); + + // Prevents showing empty options in dropdown + if ( $args['dropdown'] ) { + $args['show_names'] = 1; + } + + $elements = $this->get_elements( $links, $args ); + + if ( $args['raw'] ) { + return $elements; + } + + if ( $args['dropdown'] ) { + $args['name'] = 'lang_choice_' . $args['dropdown']; + $walker = new PLL_Walker_Dropdown(); + $args['selected'] = 0 === $args['admin_render'] ? $links->curlang->slug : $args['admin_current_lang']; + } + else { + $walker = new PLL_Walker_List(); + } + + /** + * Filter the whole html markup returned by the 'pll_the_languages' template tag + * + * @since 0.8 + * + * @param string $html html returned/outputted by the template tag + * @param array $args arguments passed to the template tag + */ + $out = apply_filters( 'pll_the_languages', $walker->walk( $elements, -1, $args ), $args ); + + // Javascript to switch the language when using a dropdown list + if ( $args['dropdown'] && 0 === $args['admin_render'] ) { + // Accept only few valid characters for the urls_x variable name ( as the widget id includes '-' which is invalid ) + $out .= sprintf( + '', + 'urls_' . preg_replace( '#[^a-zA-Z0-9]#', '', $args['dropdown'] ), + wp_json_encode( wp_list_pluck( $elements, 'url' ) ), + esc_js( $args['name'] ) + ); + } + + if ( $args['echo'] ) { + echo $out; // phpcs:ignore WordPress.Security.EscapeOutput + } + return $out; + } +} diff --git a/wp-content/plugins/polylang/include/translate-option.php b/wp-content/plugins/polylang/include/translate-option.php new file mode 100644 index 00000000..8bbc4b3b --- /dev/null +++ b/wp-content/plugins/polylang/include/translate-option.php @@ -0,0 +1,326 @@ + 1, + * 'option_key_to_translate_2' => 1, + * 'my_group' => array( + * 'sub_key_to_translate_1' => 1, + * 'sub_key_to_translate_2' => 1, + * ), + * ) + * Note: only keys are interpreted. Any scalar can be used as values. + * @param string $args { + * Optional. Array of arguments for registering the option. + * + * @type string $context The group in which the strings will be registered. + * @type string $sanitize_callback A callback function that sanitizes the option's value. + * } + */ + public function __construct( $name, $keys = array(), $args = array() ) { + // Registers the strings. + $context = isset( $args['context'] ) ? $args['context'] : 'Polylang'; + $this->register_string_recursive( $context, $name, get_option( $name ), $keys ); + + // Translates the strings. + $this->keys = $keys; + add_filter( 'option_' . $name, array( $this, 'translate' ) ); // Make sure to add this filter after options are registered. + + // Filters updated values. + add_filter( 'pre_update_option_' . $name, array( $this, 'pre_update_option' ), 10, 3 ); + add_action( 'update_option_' . $name, array( $this, 'update_option' ) ); + + // Sanitizes translated strings. + if ( empty( $args['sanitize_callback'] ) ) { + add_filter( 'pll_sanitize_string_translation', array( $this, 'sanitize_option' ), 10, 2 ); + } else { + add_filter( 'pll_sanitize_string_translation', $args['sanitize_callback'], 10, 3 ); + } + } + + /** + * Translates the strings registered for an option. + * + * @since 1.0 + * + * @param mixed $value Either a string to translate or a list of strings to translate. + * @return mixed Translated string(s). + */ + public function translate( $value ) { + return $this->translate_string_recursive( $value, $this->keys ); + } + + /** + * Recursively translates the strings registered for an option. + * + * @since 1.0 + * + * @param array|string $values Either a string to translate or a list of strings to translate. + * @param array|bool $key Array of option keys to translate. + * @return array|string Translated string(s) + */ + protected function translate_string_recursive( $values, $key ) { + $children = is_array( $key ) ? $key : array(); + + if ( is_array( $values ) || is_object( $values ) ) { + if ( count( $children ) ) { + foreach ( $children as $name => $child ) { + if ( is_array( $values ) && isset( $values[ $name ] ) ) { + $values[ $name ] = $this->translate_string_recursive( $values[ $name ], $child ); + continue; + } + + if ( is_object( $values ) && isset( $values->$name ) ) { + $values->$name = $this->translate_string_recursive( $values->$name, $child ); + continue; + } + + $pattern = '#^' . str_replace( '*', '(?:.+)', $name ) . '$#'; + + foreach ( $values as $n => &$value ) { + // The first case could be handled by the next one, but we avoid calls to preg_match here. + if ( '*' === $name || ( false !== strpos( $name, '*' ) && preg_match( $pattern, $n ) ) ) { + $value = $this->translate_string_recursive( $value, $child ); + } + } + } + } else { + // Parent key is a wildcard and no sub-key has been whitelisted. + foreach ( $values as &$value ) { + $value = $this->translate_string_recursive( $value, $key ); + } + } + } else { + $values = pll__( $values ); + } + + return $values; + } + + /** + * Recursively registers strings for an option. + * + * @since 1.0 + * @since 2.7 Signature modified + * + * @param string $context The group in which the strings will be registered. + * @param string $option Option name. + * @param array $values Option value. + * @param array|bool $key Array of option keys to translate. + */ + protected function register_string_recursive( $context, $option, $values, $key ) { + if ( is_object( $values ) ) { + $values = (array) $values; + } + + if ( is_array( $values ) ) { + $children = is_array( $key ) ? $key : array(); + + if ( count( $children ) ) { + foreach ( $children as $name => $child ) { + if ( isset( $values[ $name ] ) ) { + $this->register_string_recursive( $context, $name, $values[ $name ], $child ); + continue; + } + + $pattern = '#^' . str_replace( '*', '(?:.+)', $name ) . '$#'; + + foreach ( $values as $n => $value ) { + // The first case could be handled by the next one, but we avoid calls to preg_match here. + if ( '*' === $name || ( false !== strpos( $name, '*' ) && preg_match( $pattern, $n ) ) ) { + $this->register_string_recursive( $context, $n, $value, $child ); + } + } + } + } else { + foreach ( $values as $n => $value ) { + // Parent key is a wildcard and no sub-key has been whitelisted. + $this->register_string_recursive( $context, $n, $value, $key ); + } + } + } else { + PLL_Admin_Strings::register_string( $option, $values, $context, true ); + } + } + + /** + * Filters an option before it is updated. + * + * This is the step 1 in the update process, in which we prevent the update of + * strings to their translations by filtering them out, and we store the updated strings + * for the next step. + * + * @since 2.9 + * + * @param mixed $value The new, unserialized option value. + * @param mixed $old_value The old (filtered) option value. + * @param string $name Option name. + */ + public function pre_update_option( $value, $old_value, $name ) { + // Stores the unfiltered old option value before it is updated in DB. + remove_filter( 'option_' . $name, array( $this, 'translate' ), 10, 2 ); + $this->old_value = get_option( $name ); + add_filter( 'option_' . $name, array( $this, 'translate' ), 20, 2 ); + + // Load strings translations according to the admin language filter + $locale = pll_current_language( 'locale' ); + if ( empty( $locale ) ) { + $locale = pll_default_language( 'locale' ); + } + PLL()->load_strings_translations( $locale ); + + // Filters out the strings which would be updated to their translations and stores the updated strings. + $value = $this->check_value_recursive( $this->old_value, $value, $this->keys ); + + return $value; + } + + /** + * Updates the string translations to keep the same translated value when updating the original option. + * + * This is the step 2 in the update process. Knowing all strings that have been updated, + * we remove the old strings from the strings translations and replace them by + * the new strings with the old translations. + * + * @since 2.9 + */ + public function update_option() { + $curlang = pll_current_language(); + + if ( ! empty( $this->updated_strings ) ) { + foreach ( pll_languages_list() as $lang ) { + + $language = PLL()->model->get_language( $lang ); + $mo = new PLL_MO(); + $mo->import_from_db( $language ); + + foreach ( $this->updated_strings as $old_string => $string ) { + $translation = $mo->translate( $old_string ); + if ( ( empty( $curlang ) && $translation === $old_string ) || $lang === $curlang ) { + $translation = $string; + } + + // Removes the old entry and replace it by the new one, with the same translation. + $mo->delete_entry( $old_string ); + $mo->add_entry( $mo->make_entry( $string, $translation ) ); + } + + $mo->export_to_db( $language ); + } + } + } + + /** + * Recursively compares the updated strings to the translation of the old string. + * + * This is the heart of the update process. If an updated string is found to be + * the same as the translation of the old string, we restore the old string to + * prevent the update in {@see PLL_Translate_Option::pre_update_option()}, otherwise + * the updated string is stored in {@see PLL_Translate_Option::updated_strings} to be able to + * later assign the translations to the new value in {@see PLL_Translate_Option::update_option()}. + * + * @since 2.9 + * + * @param mixed $old_values The old option value. + * @param mixed $values The new option value.. + * @param array|bool $key Array of option keys to translate. + * @return mixed + */ + protected function check_value_recursive( $old_values, $values, $key ) { + $children = is_array( $key ) ? $key : array(); + + if ( is_array( $values ) || is_object( $values ) ) { + if ( count( $children ) ) { + foreach ( $children as $name => $child ) { + if ( is_array( $values ) && is_array( $old_values ) && isset( $old_values[ $name ], $values[ $name ] ) ) { + $values[ $name ] = $this->check_value_recursive( $old_values[ $name ], $values[ $name ], $child ); + continue; + } + + if ( is_object( $values ) && is_object( $old_values ) && isset( $old_values->$name, $values->$name ) ) { + $values->$name = $this->check_value_recursive( $old_values->$name, $values->$name, $child ); + continue; + } + + $pattern = '#^' . str_replace( '*', '(?:.+)', $name ) . '$#'; + + foreach ( $values as $n => $value ) { + // The first case could be handled by the next one, but we avoid calls to preg_match here. + if ( '*' === $name || ( false !== strpos( $name, '*' ) && preg_match( $pattern, $n ) ) ) { + if ( is_array( $values ) && is_array( $old_values ) && isset( $old_values[ $n ] ) ) { + $values[ $n ] = $this->check_value_recursive( $old_values[ $n ], $value, $child ); + } + + if ( is_object( $values ) && is_object( $old_values ) && isset( $old_values->$n ) ) { + $values->$n = $this->check_value_recursive( $old_values->$n, $value, $child ); + } + } + } + } + } else { + // Parent key is a wildcard and no sub-key has been whitelisted. + foreach ( $values as $n => $value ) { + if ( is_array( $values ) && is_array( $old_values ) && isset( $old_values[ $n ] ) ) { + $values[ $n ] = $this->check_value_recursive( $old_values[ $n ], $value, $key ); + } + + if ( is_object( $values ) && is_object( $old_values ) && isset( $old_values->$n ) ) { + $values->$n = $this->check_value_recursive( $old_values->$n, $value, $key ); + } + } + } + } elseif ( $old_values !== $values ) { + if ( pll__( $old_values ) === $values ) { + $values = $old_values; // Prevents updating the value to its translation. + } else { + $this->updated_strings[ $old_values ] = $values; // Stores the updated strings. + } + } + + return $values; + } + + /** + * Sanitizes the option value. + * + * @since 2.9 + * + * @param string $value The unsanitised value. + * @param string $name The name of the option. + * @return string Sanitized value. + */ + public function sanitize_option( $value, $name ) { + return sanitize_option( $name, $value ); + } +} diff --git a/wp-content/plugins/polylang/include/translated-object.php b/wp-content/plugins/polylang/include/translated-object.php new file mode 100644 index 00000000..f198f7d2 --- /dev/null +++ b/wp-content/plugins/polylang/include/translated-object.php @@ -0,0 +1,339 @@ +model = &$model; + + // register our taxonomies as soon as possible + // this is early registration, not ready for rewrite rules as wp_rewrite will be setup later + $args = array( 'label' => false, 'public' => false, 'query_var' => false, 'rewrite' => false, '_pll' => true ); + register_taxonomy( $this->tax_language, $this->object_type, $args ); + $args['update_count_callback'] = '_update_generic_term_count'; // count *all* posts to avoid deleting in clean_translations_terms + register_taxonomy( $this->tax_translations, $this->object_type, $args ); + } + + /** + * Wrap wp_get_object_terms to cache it and return only one object + * inspired by the function get_the_terms + * + * @since 1.2 + * + * @param int $object_id post_id or term_id + * @param string $taxonomy Polylang taxonomy depending if we are looking for a post ( or term ) language ( or translation ) + * @return bool|object the term associated to the object in the requested taxonomy if exists, false otherwise + */ + public function get_object_term( $object_id, $taxonomy ) { + if ( empty( $object_id ) || is_wp_error( $object_id ) ) { + return false; + } + + $object_id = (int) $object_id; + + if ( $object_id < 0 ) { + return false; + } + + $term = get_object_term_cache( $object_id, $taxonomy ); + + if ( false === $term ) { + // query language and translations at the same time + $taxonomies = array( $this->tax_language, $this->tax_translations ); + + // query terms + $terms = array(); + foreach ( wp_get_object_terms( $object_id, $taxonomies, array( 'update_term_meta_cache' => false ) ) as $t ) { + $terms[ $t->taxonomy ] = $t; + if ( $t->taxonomy == $taxonomy ) { + $term = $t; + } + } + + // store it the way WP wants it + // set an empty cache if no term found in the taxonomy + foreach ( $taxonomies as $tax ) { + wp_cache_add( $object_id, empty( $terms[ $tax ] ) ? array() : array( $terms[ $tax ] ), $tax . '_relationships' ); + } + } + else { + $term = reset( $term ); + } + + return empty( $term ) ? false : $term; + } + + /** + * Tells whether a translation term must be updated + * + * @since 2.3 + * + * @param array $id Post id or term id + * @param array $translations An associative array of translations with language code as key and translation id as value + */ + protected function should_update_translation_group( $id, $translations ) { + // Don't do anything if no translations have been added to the group + $old_translations = $this->get_translations( $id ); // Includes at least $id itself + return count( array_diff_assoc( $translations, $old_translations ) ) > 0; + } + + /** + * Saves translations for posts or terms + * + * @since 0.5 + * + * @param int $id Post id or term id + * @param array $translations An associative array of translations with language code as key and translation id as value + */ + public function save_translations( $id, $translations ) { + $id = (int) $id; + + if ( ( $lang = $this->get_language( $id ) ) && isset( $translations ) && is_array( $translations ) ) { + // sanitize the translations array + $translations = array_map( 'intval', $translations ); + $translations = array_merge( array( $lang->slug => $id ), $translations ); // make sure this object is in translations + $translations = array_diff( $translations, array( 0 ) ); // don't keep non translated languages + $translations = array_intersect_key( $translations, array_flip( $this->model->get_languages_list( array( 'fields' => 'slug' ) ) ) ); // keep only valid languages slugs as keys + + // unlink removed translations + $old_translations = $this->get_translations( $id ); + foreach ( array_diff_assoc( $old_translations, $translations ) as $object_id ) { + $this->delete_translation( $object_id ); + } + + // Check id we need to create or update the translation group + if ( $this->should_update_translation_group( $id, $translations ) ) { + $terms = wp_get_object_terms( $translations, $this->tax_translations ); + $term = reset( $terms ); + + // create a new term if necessary + if ( empty( $term ) ) { + wp_insert_term( $group = uniqid( 'pll_' ), $this->tax_translations, array( 'description' => maybe_serialize( $translations ) ) ); + } + else { + // take care not to overwrite extra data stored in description field, if any + $d = maybe_unserialize( $term->description ); + $d = is_array( $d ) ? array_diff_key( $d, $old_translations ) : array(); // remove old translations + $d = array_merge( $d, $translations ); // add new one + wp_update_term( $group = (int) $term->term_id, $this->tax_translations, array( 'description' => maybe_serialize( $d ) ) ); + } + + // link all translations to the new term + foreach ( $translations as $p ) { + wp_set_object_terms( $p, $group, $this->tax_translations ); + } + + // clean now unused translation groups + foreach ( wp_list_pluck( $terms, 'term_id' ) as $term_id ) { + $term = get_term( $term_id, $this->tax_translations ); + if ( empty( $term->count ) ) { + wp_delete_term( $term_id, $this->tax_translations ); + } + } + } + } + } + + /** + * Deletes a translation of a post or term + * + * @since 0.5 + * + * @param int $id post id or term id + */ + public function delete_translation( $id ) { + $id = (int) $id; + $term = $this->get_object_term( $id, $this->tax_translations ); + + if ( ! empty( $term ) ) { + $d = maybe_unserialize( $term->description ); + if ( is_array( $d ) ) { + $slug = array_search( $id, $this->get_translations( $id ) ); // In case some plugin stores the same value with different key. + unset( $d[ $slug ] ); + } + + if ( empty( $d ) ) { + wp_delete_term( (int) $term->term_id, $this->tax_translations ); + } else { + wp_update_term( (int) $term->term_id, $this->tax_translations, array( 'description' => maybe_serialize( $d ) ) ); + } + } + } + + /** + * Returns an array of translations of a post or term + * + * @since 0.5 + * + * @param int $id post id or term id + * @return array an associative array of translations with language code as key and translation id as value + */ + public function get_translations( $id ) { + $term = $this->get_object_term( $id, $this->tax_translations ); + $translations = empty( $term ) ? array() : maybe_unserialize( $term->description ); + + // make sure we return only translations ( thus we allow plugins to store other information in the array ) + if ( is_array( $translations ) ) { + $translations = array_intersect_key( $translations, array_flip( $this->model->get_languages_list( array( 'fields' => 'slug' ) ) ) ); + } + + // make sure to return at least the passed post or term in its translation array + if ( empty( $translations ) && $lang = $this->get_language( $id ) ) { + $translations = array( $lang->slug => $id ); + } + + return $translations; + } + + /** + * Returns the id of the translation of a post or term + * + * @since 0.5 + * + * @param int $id post id or term id + * @param object|string $lang object or slug + * @return bool|int post id or term id of the translation, false if there is none + */ + public function get_translation( $id, $lang ) { + if ( ! $lang = $this->model->get_language( $lang ) ) { + return false; + } + + $translations = $this->get_translations( $id ); + + return isset( $translations[ $lang->slug ] ) ? $translations[ $lang->slug ] : false; + } + + /** + * Among the object and its translations, returns the id of the object which is in $lang + * + * @since 0.1 + * + * @param int $id post id or term id + * @param int|string|object $lang language ( term_id or slug or object ) + * @return bool|int the translation post id or term id if exists, otherwise the post id or term id, false if the post has no language + */ + public function get( $id, $lang ) { + $id = (int) $id; + $obj_lang = $this->get_language( $id ); // FIXME is this necessary? + if ( ! $lang || ! $obj_lang ) { + return false; + } + + $lang = $this->model->get_language( $lang ); + return $obj_lang->term_id == $lang->term_id ? $id : $this->get_translation( $id, $lang ); + } + + /** + * A where clause to add to sql queries when filtering by language is needed directly in query + * + * @since 1.2 + * + * @param object|array|string $lang a PLL_Language object or a comma separated list of language slug or an array of language slugs + * @return string where clause + */ + public function where_clause( $lang ) { + $tt_id = $this->tax_tt; + + // $lang is an object + // generally the case if the query is coming from Polylang + if ( is_object( $lang ) ) { + return ' AND pll_tr.term_taxonomy_id = ' . absint( $lang->$tt_id ); + } + + // $lang is a comma separated list of slugs ( or an array of slugs ) + // generally the case is the query is coming from outside with 'lang' parameter + $slugs = is_array( $lang ) ? $lang : explode( ',', $lang ); + $languages = array(); + foreach ( $slugs as $slug ) { + $languages[] = absint( $this->model->get_language( $slug )->$tt_id ); + } + + return ' AND pll_tr.term_taxonomy_id IN ( ' . implode( ',', $languages ) . ' )'; + } + + /** + * Returns ids of objects in a language similarly to get_objects_in_term for a taxonomy + * faster than get_objects_in_term as it avoids a JOIN + * + * @since 1.4 + * + * @param object $lang a PLL_Language object + * @return array + */ + public function get_objects_in_language( $lang ) { + global $wpdb; + $tt_id = $this->tax_tt; + + $last_changed = wp_cache_get_last_changed( 'terms' ); + $cache_key = "polylang:get_objects_in_language:{$lang->$tt_id}:{$last_changed}"; + $cache = wp_cache_get( $cache_key, 'terms' ); + + if ( false === $cache ) { + $object_ids = $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $lang->$tt_id ) ); + wp_cache_set( $cache_key, $object_ids, 'terms' ); + } else { + $object_ids = (array) $cache; + } + + if ( ! $object_ids ) { + return array(); + } + + return $object_ids; + } + + /** + * Check if a user can synchronize translations + * + * @since 2.6 + * + * @param int $id Object id + * @return bool + */ + public function current_user_can_synchronize( $id ) { + /** + * Filters whether a synchronization capability check should take place + * + * @since 2.6 + * + * @param $check null to enable the capability check, + * true to always allow the synchronization, + * false to always disallow the synchronization. + * Defaults to true. + * @param $id The synchronization source object id + */ + $check = apply_filters( "pll_pre_current_user_can_synchronize_{$this->type}", true, $id ); + if ( null !== $check ) { + return $check; + } + + if ( ! current_user_can( "edit_{$this->type}", $id ) ) { + return false; + } + + foreach ( $this->get_translations( $id ) as $tr_id ) { + if ( $tr_id !== $id && ! current_user_can( "edit_{$this->type}", $tr_id ) ) { + return false; + } + } + + return true; + } +} diff --git a/wp-content/plugins/polylang/include/translated-post.php b/wp-content/plugins/polylang/include/translated-post.php new file mode 100644 index 00000000..33151269 --- /dev/null +++ b/wp-content/plugins/polylang/include/translated-post.php @@ -0,0 +1,256 @@ +object_type = null; // For taxonomies + $this->type = 'post'; // For capabilities + $this->tax_language = 'language'; + $this->tax_translations = 'post_translations'; + $this->tax_tt = 'term_taxonomy_id'; + + parent::__construct( $model ); + + // registers completely the language taxonomy + add_action( 'setup_theme', array( $this, 'register_taxonomy' ), 1 ); + + // setups post types to translate + add_action( 'registered_post_type', array( $this, 'registered_post_type' ) ); + + // forces updating posts cache + add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); + } + + /** + * Store the post language in the database + * + * @since 0.6 + * + * @param int $post_id post id + * @param int|string|object $lang language ( term_id or slug or object ) + */ + public function set_language( $post_id, $lang ) { + $old_lang = $this->get_language( $post_id ); + $old_lang = $old_lang ? $old_lang->slug : ''; + $lang = $lang ? $this->model->get_language( $lang )->slug : ''; + + if ( $old_lang !== $lang ) { + wp_set_post_terms( (int) $post_id, $lang, 'language' ); + } + } + + /** + * Returns the language of a post + * + * @since 0.1 + * + * @param int $post_id post id + * @return bool|object PLL_Language object, false if no language is associated to that post + */ + public function get_language( $post_id ) { + $lang = $this->get_object_term( $post_id, 'language' ); + return ( $lang ) ? $this->model->get_language( $lang ) : false; + } + + /** + * Deletes a translation + * + * @since 0.5 + * + * @param int $id post id + */ + public function delete_translation( $id ) { + parent::delete_translation( $id ); + wp_set_object_terms( $id, null, $this->tax_translations ); + } + + /** + * A join clause to add to sql queries when filtering by language is needed directly in query + * + * @since 1.2 + * + * @param string $alias Alias for $wpdb->posts table + * @return string join clause + */ + public function join_clause( $alias = '' ) { + global $wpdb; + if ( empty( $alias ) ) { + $alias = $wpdb->posts; + } + return " INNER JOIN $wpdb->term_relationships AS pll_tr ON pll_tr.object_id = $alias.ID"; + } + + /** + * Register the language taxonomy + * + * @since 1.2 + */ + public function register_taxonomy() { + register_taxonomy( + 'language', + $this->model->get_translated_post_types(), + array( + 'labels' => array( + 'name' => __( 'Languages', 'polylang' ), + 'singular_name' => __( 'Language', 'polylang' ), + 'all_items' => __( 'All languages', 'polylang' ), + ), + 'public' => false, + 'show_ui' => false, // hide the taxonomy on admin side, needed for WP 4.4.x + 'show_in_nav_menus' => false, // no metabox for nav menus, needed for WP 4.4.x + 'publicly_queryable' => true, // since WP 4.5 + 'query_var' => 'lang', + 'rewrite' => $this->model->options['force_lang'] < 2, // no rewrite for domains and sub-domains + '_pll' => true, // polylang taxonomy + ) + ); + } + + /** + * Check if registered post type must be translated + * + * @since 1.2 + * + * @param string $post_type post type name + */ + public function registered_post_type( $post_type ) { + if ( $this->model->is_translated_post_type( $post_type ) ) { + register_taxonomy_for_object_type( 'language', $post_type ); + register_taxonomy_for_object_type( 'post_translations', $post_type ); + } + } + + /** + * Forces calling 'update_object_term_cache' when querying posts or pages + * this is especially useful for nav menus with a lot of pages + * without doing this, we would have one query per page in the menu to get the page language for the permalink + * + * @since 1.8 + * + * @param object $query reference to the query object + */ + public function pre_get_posts( $query ) { + if ( ! empty( $query->query['post_type'] ) && $this->model->is_translated_post_type( $query->query['post_type'] ) ) { + $query->query_vars['update_post_term_cache'] = true; + } + } + + /** + * Checks if the current user can read the post + * + * @since 1.5 + * + * @param int $post_id Post ID + * @param string $context Optional, 'edit' or 'view', defaults to 'view'. + * @return bool + */ + public function current_user_can_read( $post_id, $context = 'view' ) { + $post = get_post( $post_id ); + + if ( empty( $post ) ) { + return false; + } + + if ( 'inherit' === $post->post_status && $post->post_parent ) { + $post = get_post( $post->post_parent ); + } + + if ( 'inherit' === $post->post_status || in_array( $post->post_status, get_post_stati( array( 'public' => true ) ) ) ) { + return true; + } + + // Follow WP practices, which shows links to private posts ( when readable ), but not for draft posts ( ex: get_adjacent_post_link() ) + if ( in_array( $post->post_status, get_post_stati( array( 'private' => true ) ) ) ) { + $post_type_object = get_post_type_object( $post->post_type ); + $user = wp_get_current_user(); + return is_user_logged_in() && ( current_user_can( $post_type_object->cap->read_private_posts ) || $user->ID == $post->post_author ); // Comparison must not be strict! + } + + // In edit context, show draft and future posts. + if ( 'edit' === $context ) { + $states = get_post_stati( + array( + 'protected' => true, + 'show_in_admin_all_list' => true, + ) + ); + + if ( in_array( $post->post_status, $states ) ) { + $user = wp_get_current_user(); + return is_user_logged_in() && ( current_user_can( 'edit_posts' ) || $user->ID == $post->post_author ); // Comparison must not be strict! + } + } + + return false; + } + + /** + * Returns a list of posts in a language ( $lang ) + * not translated in another language ( $untranslated_in ) + * + * @since 2.6 + * + * @param string $type Post type + * @param string $untranslated_in The posts must not be translated in this language + * @param string $lang Language of the search posts + * @param string $search Limit results to posts matching this string + * @return array Array of posts + */ + public function get_untranslated( $type, $untranslated_in, $lang, $search = '' ) { + $return = array(); + + // Don't order by title: see https://wordpress.org/support/topic/find-translated-post-when-10-is-not-enough + $args = array( + 's' => $search, + 'suppress_filters' => 0, // To make the post_fields filter work + 'lang' => 0, // Avoid admin language filter + 'numberposts' => 20, // Limit to 20 posts + 'post_status' => 'any', + 'post_type' => $type, + 'tax_query' => array( + array( + 'taxonomy' => 'language', + 'field' => 'term_taxonomy_id', // WP 3.5+ + 'terms' => $lang->term_taxonomy_id, + ), + ), + ); + + /** + * Filter the query args when auto suggesting untranslated posts in the Languages metabox + * This should help plugins to fix some edge cases + * + * @see https://wordpress.org/support/topic/find-translated-post-when-10-is-not-enough + * + * @since 1.7 + * + * @param array $args WP_Query arguments + */ + $args = apply_filters( 'pll_ajax_posts_not_translated_args', $args ); + $posts = get_posts( $args ); + + foreach ( $posts as $post ) { + if ( ! $this->get_translation( $post->ID, $untranslated_in ) && $this->current_user_can_read( $post->ID, 'edit' ) ) { + $return[] = $post; + } + } + + return $return; + } +} diff --git a/wp-content/plugins/polylang/include/translated-term.php b/wp-content/plugins/polylang/include/translated-term.php new file mode 100644 index 00000000..06b6bb7c --- /dev/null +++ b/wp-content/plugins/polylang/include/translated-term.php @@ -0,0 +1,206 @@ +object_type = 'term'; // For taxonomies + $this->type = 'term'; // For capabilities + $this->tax_language = 'term_language'; + $this->tax_translations = 'term_translations'; + $this->tax_tt = 'tl_term_taxonomy_id'; + + parent::__construct( $model ); + + // Filters to prime terms cache + add_filter( 'get_terms', array( $this, '_prime_terms_cache' ), 10, 2 ); + add_filter( 'wp_get_object_terms', array( $this, 'wp_get_object_terms' ), 10, 3 ); + + add_action( 'clean_term_cache', array( $this, 'clean_term_cache' ) ); + } + + /** + * Stores the term language in the database + * + * @since 0.6 + * + * @param int $term_id term id + * @param int|string|object $lang language ( term_id or slug or object ) + */ + public function set_language( $term_id, $lang ) { + $term_id = (int) $term_id; + + $old_lang = $this->get_language( $term_id ); + $old_lang = $old_lang ? $old_lang->tl_term_id : ''; + $lang = $lang ? $this->model->get_language( $lang )->tl_term_id : ''; + + if ( $old_lang !== $lang ) { + wp_set_object_terms( $term_id, $lang, 'term_language' ); + + // Add translation group for correct WXR export + $translations = $this->get_translations( $term_id ); + if ( $slug = array_search( $term_id, $translations ) ) { + unset( $translations[ $slug ] ); + } + + $this->save_translations( $term_id, $translations ); + } + } + + /** + * Removes the term language in database + * + * @since 0.5 + * + * @param int $term_id term id + */ + public function delete_language( $term_id ) { + wp_delete_object_term_relationships( $term_id, 'term_language' ); + } + + /** + * Returns the language of a term + * + * @since 0.1 + * + * @param int|string $value term id or term slug + * @param string $taxonomy optional taxonomy needed when the term slug is passed as first parameter + * @return bool|object PLL_Language object, false if no language is associated to that term + */ + public function get_language( $value, $taxonomy = '' ) { + if ( is_numeric( $value ) ) { + $term_id = $value; + } + + // get_term_by still not cached in WP 3.5.1 but internally, the function is always called by term_id + elseif ( is_string( $value ) && $taxonomy ) { + $term_id = get_term_by( 'slug', $value, $taxonomy )->term_id; + } + + // Get the language and make sure it is a PLL_Language object + return isset( $term_id ) && ( $lang = $this->get_object_term( $term_id, 'term_language' ) ) ? $this->model->get_language( $lang->term_id ) : false; + } + + /** + * Tells whether a translation term must updated + * + * @since 2.3 + * + * @param array $id Post id or term id + * @param array $translations An associative array of translations with language code as key and translation id as value + */ + protected function should_update_translation_group( $id, $translations ) { + // Don't do anything if no translations have been added to the group + $old_translations = $this->get_translations( $id ); + if ( count( $translations ) > 1 && count( array_diff_assoc( $translations, $old_translations ) ) > 0 ) { + return true; + } + + // But we need a translation group for terms to allow relationships remap when importing from a WXR file + $term = $this->get_object_term( $id, $this->tax_translations ); + return empty( $term ) || count( array_diff_assoc( $translations, $old_translations ) ); + } + + /** + * Deletes a translation + * + * @since 0.5 + * + * @param int $id term id + */ + public function delete_translation( $id ) { + global $wpdb; + $slug = array_search( $id, $this->get_translations( $id ) ); // in case some plugin stores the same value with different key + + parent::delete_translation( $id ); + wp_delete_object_term_relationships( $id, 'term_translations' ); + + if ( ! doing_action( 'pre_delete_term' ) && $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( * ) FROM $wpdb->terms WHERE term_id = %d;", $id ) ) ) { + // Always keep a group for terms to allow relationships remap when importing from a WXR file + $translations = array( $slug => $id ); + wp_insert_term( $group = uniqid( 'pll_' ), 'term_translations', array( 'description' => maybe_serialize( $translations ) ) ); + wp_set_object_terms( $id, $group, 'term_translations' ); + } + } + + /** + * A join clause to add to sql queries when filtering by language is needed directly in query + * + * @since 1.2 + * @since 2.6 The `$alias` parameter was added. + * + * @param string $alias Alias for $wpdb->terms table + * @return string join clause + */ + public function join_clause( $alias = 't' ) { + global $wpdb; + return " INNER JOIN $wpdb->term_relationships AS pll_tr ON pll_tr.object_id = $alias.term_id"; + } + + /** + * Cache language and translations when terms are queried by get_terms + * + * @since 1.2 + * + * @param array $terms queried terms + * @param array $taxonomies queried taxonomies + * @return array unmodified $terms + */ + public function _prime_terms_cache( $terms, $taxonomies ) { + $term_ids = array(); + + if ( is_array( $terms ) && $this->model->is_translated_taxonomy( $taxonomies ) ) { + foreach ( $terms as $term ) { + $term_ids[] = is_object( $term ) ? $term->term_id : (int) $term; + } + } + + if ( ! empty( $term_ids ) ) { + update_object_term_cache( array_unique( $term_ids ), 'term' ); // Adds language and translation of terms to cache + } + return $terms; + } + + /** + * When terms are found for posts, add their language and translations to cache + * + * @since 1.2 + * + * @param array $terms terms found + * @param array $object_ids not used + * @param array $taxonomies terms taxonomies + * @return array unmodified $terms + */ + public function wp_get_object_terms( $terms, $object_ids, $taxonomies ) { + $taxonomies = explode( "', '", trim( $taxonomies, "'" ) ); + if ( ! in_array( 'term_translations', $taxonomies ) ) { + $this->_prime_terms_cache( $terms, $taxonomies ); + } + return $terms; + } + + /** + * When the term cache is cleaned, clean the object term cache too + * + * @since 2.0 + * + * @param array $ids An array of term IDs. + */ + public function clean_term_cache( $ids ) { + clean_object_term_cache( $ids, 'term' ); + } +} diff --git a/wp-content/plugins/polylang/include/walker-dropdown.php b/wp-content/plugins/polylang/include/walker-dropdown.php new file mode 100644 index 00000000..70ddfa1d --- /dev/null +++ b/wp-content/plugins/polylang/include/walker-dropdown.php @@ -0,0 +1,116 @@ + 'parent', 'id' => 'id' ); + + /** + * Outputs one element + * + * @since 1.2 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $element The data object. + * @param int $depth Depth of the item. + * @param array $args An array of additional arguments. + * @param int $current_object_id ID of the current item. + */ + public function start_el( &$output, $element, $depth = 0, $args = array(), $current_object_id = 0 ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + $value = $args['value']; + $output .= sprintf( + "\t" . '' . "\n", + esc_attr( $element->$value ), + method_exists( $element, 'get_locale' ) ? sprintf( ' lang="%s"', esc_attr( $element->get_locale( 'display' ) ) ) : '', + selected( isset( $args['selected'] ) && $args['selected'] === $element->$value, true, false ), + esc_html( $element->name ) + ); + } + + /** + * Overrides Walker::display_element as expects an object with a parent property + * + * @since 1.2 + * + * @param object $element Data object. + * @param array $children_elements List of elements to continue traversing. + * @param int $max_depth Max depth to traverse. + * @param int $depth Depth of current element. + * @param array $args An array of arguments. + * @param string $output Passed by reference. Used to append additional content. + */ + public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { + $element = (object) $element; // Make sure we have an object + $element->parent = $element->id = 0; // Don't care about this + parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); + } + + /** + * Starts the output of the dropdown list + * + * @since 1.2 + * @since 2.6.7 Use $max_depth and ...$args parameters to follow the move of WP 5.3 + * + * List of parameters accepted in $args: + * + * flag => display the selected language flag in front of the dropdown if set to 1, defaults to 0 + * value => the language field to use as value attribute, defaults to 'slug' + * selected => the selected value, mandatory + * name => the select name attribute, defaults to 'lang_choice' + * id => the select id attribute, defaults to $args['name'] + * class => the class attribute + * disabled => disables the dropdown if set to 1 + * + * @param array $elements An array of elements. + * @param int $max_depth The maximum hierarchical depth. + * @param mixed ...$args Additional arguments. + * @return string The hierarchical item output. + */ + public function walk( $elements, $max_depth, ...$args ) { // // phpcs:ignore WordPressVIPMinimum.Classes.DeclarationCompatibility.DeclarationCompatibility + $output = ''; + + if ( is_array( $max_depth ) ) { + // Backward compatibility with Polylang < 2.6.7 + if ( WP_DEBUG ) { + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + '%s was called incorrectly. The method expects an integer as second parameter since Polylang 2.6.7', + __METHOD__ + ) + ); + } + $args = $max_depth; + $max_depth = -1; + } else { + $args = isset( $args[0] ) ? $args[0] : array(); + } + + $args = wp_parse_args( $args, array( 'value' => 'slug', 'name' => 'lang_choice' ) ); + + if ( ! empty( $args['flag'] ) ) { + $current = wp_list_filter( $elements, array( $args['value'] => $args['selected'] ) ); + $lang = reset( $current ); + $output = sprintf( + '%s', + empty( $lang->flag ) ? esc_html( $lang->slug ) : $lang->flag + ); + } + + $output .= sprintf( + '' . "\n", + esc_attr( $args['name'] ), + isset( $args['id'] ) && ! $args['id'] ? '' : ' id="' . ( empty( $args['id'] ) ? esc_attr( $args['name'] ) : esc_attr( $args['id'] ) ) . '"', + empty( $args['class'] ) ? '' : ' class="' . esc_attr( $args['class'] ) . '"', + disabled( empty( $args['disabled'] ), false, false ), + parent::walk( $elements, $max_depth, $args ) + ); + + return $output; + } +} diff --git a/wp-content/plugins/polylang/include/walker-list.php b/wp-content/plugins/polylang/include/walker-list.php new file mode 100644 index 00000000..9fcbd108 --- /dev/null +++ b/wp-content/plugins/polylang/include/walker-list.php @@ -0,0 +1,86 @@ + 'parent', 'id' => 'id' ); + + /** + * Outputs one element + * + * @since 1.2 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $element The data object. + * @param int $depth Depth of the item. + * @param array $args An array of additional arguments. + * @param int $current_object_id ID of the current item. + */ + public function start_el( &$output, $element, $depth = 0, $args = array(), $current_object_id = 0 ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + $output .= sprintf( + '%6$s
  • %4$s%5$s
  • %7$s', + esc_attr( implode( ' ', $element->classes ) ), + esc_attr( $element->locale ), + esc_url( $element->url ), + $element->flag, + $args['show_flags'] && $args['show_names'] ? sprintf( '%2$s', is_rtl() ? 'right' : 'left', esc_html( $element->name ) ) : esc_html( $element->name ), + 'discard' === $args['item_spacing'] ? '' : "\t", + 'discard' === $args['item_spacing'] ? '' : "\n" + ); + } + + /** + * Overrides Walker::display_element as it expects an object with a parent property + * + * @since 1.2 + * + * @param object $element Data object. + * @param array $children_elements List of elements to continue traversing. + * @param int $max_depth Max depth to traverse. + * @param int $depth Depth of current element. + * @param array $args An array of arguments. + * @param string $output Passed by reference. Used to append additional content. + */ + public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { + $element = (object) $element; // Make sure we have an object + $element->parent = $element->id = 0; // Don't care about this + parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); + } + + /** + * Overrides Walker:walk to set depth argument + * + * @since 1.2 + * @since 2.6.7 Use $max_depth and ...$args parameters to follow the move of WP 5.3 + * + * @param array $elements An array of elements. + * @param int $max_depth The maximum hierarchical depth. + * @param mixed ...$args Additional arguments. + * @return string The hierarchical item output. + */ + public function walk( $elements, $max_depth, ...$args ) { // phpcs:ignore WordPressVIPMinimum.Classes.DeclarationCompatibility.DeclarationCompatibility + if ( is_array( $max_depth ) ) { + // Backward compatibility with Polylang < 2.6.7 + if ( WP_DEBUG ) { + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + '%s was called incorrectly. The method expects an integer as second parameter since Polylang 2.6.7', + __METHOD__ + ) + ); + } + $args = $max_depth; + $max_depth = -1; + } else { + $args = isset( $args[0] ) ? $args[0] : array(); + } + + return parent::walk( $elements, $max_depth, $args ); + } +} diff --git a/wp-content/plugins/polylang/include/widget-calendar.php b/wp-content/plugins/polylang/include/widget-calendar.php new file mode 100644 index 00000000..10eabe7e --- /dev/null +++ b/wp-content/plugins/polylang/include/widget-calendar.php @@ -0,0 +1,282 @@ + not very efficient (add 4 to 5 sql queries). + * Method used since 0.5: remove the WP widget and replace it by our own -> our language filter will not work if get_calendar is called directly by a theme. + * + * @since 0.5 + */ +class PLL_Widget_Calendar extends WP_Widget_Calendar { + protected static $pll_instance = 0; // Can't use $instance of WP_Widget_Calendar as it's private :/. + + /** + * Outputs the content for the current Calendar widget instance. + * Modified version of the parent function to call our own get_calendar() method. + * + * @since 0.5 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance The settings for the particular instance of the widget. + */ + public function widget( $args, $instance ) { + $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + if ( 0 === self::$pll_instance ) { #modified# + echo '
    '; + } else { + echo '
    '; + } + empty( PLL()->curlang ) ? get_calendar() : self::get_calendar(); #modified# + echo '
    '; + echo $args['after_widget']; + + self::$pll_instance++; #modified# + } + + /** + * Modified version of the WP get_calendar() function to filter the queries. + * + * @since 0.5 + * + * @param bool $initial Optional, default is true. Use initial calendar names. + * @param bool $echo Optional, default is true. Set to false for return. + * @return void|string Void if `$echo` argument is true, calendar HTML if `$echo` is false. + */ + static public function get_calendar( $initial = true, $echo = true ) { + global $wpdb, $m, $monthnum, $year, $wp_locale, $posts; + + $join_clause = PLL()->model->post->join_clause(); #added# + $where_clause = PLL()->model->post->where_clause( PLL()->curlang ); #added# + + $key = md5( PLL()->curlang->slug . $m . $monthnum . $year ); #modified# + $cache = wp_cache_get( 'get_calendar', 'calendar' ); + + if ( $cache && is_array( $cache ) && isset( $cache[ $key ] ) ) { + /** This filter is documented in wp-includes/general-template.php */ + $output = apply_filters( 'get_calendar', $cache[ $key ] ); + + if ( $echo ) { + echo $output; + return; + } + + return $output; + } + + if ( ! is_array( $cache ) ) { + $cache = array(); + } + + // Quick check. If we have no posts at all, abort! + if ( ! $posts ) { + $gotsome = $wpdb->get_var( "SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" ); + if ( ! $gotsome ) { + $cache[ $key ] = ''; + wp_cache_set( 'get_calendar', $cache, 'calendar' ); + return; + } + } + + if ( isset( $_GET['w'] ) ) { + $w = (int) $_GET['w']; + } + // week_begins = 0 stands for Sunday. + $week_begins = (int) get_option( 'start_of_week' ); + + // Let's figure out when we are. + if ( ! empty( $monthnum ) && ! empty( $year ) ) { + $thismonth = zeroise( (int) $monthnum, 2 ); + $thisyear = (int) $year; + } elseif ( ! empty( $w ) ) { + // We need to get the month from MySQL. + $thisyear = (int) substr( $m, 0, 4 ); + // It seems MySQL's weeks disagree with PHP's. + $d = ( ( $w - 1 ) * 7 ) + 6; + $thismonth = $wpdb->get_var( "SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')" ); + } elseif ( ! empty( $m ) ) { + $thisyear = (int) substr( $m, 0, 4 ); + if ( strlen( $m ) < 6 ) { + $thismonth = '01'; + } else { + $thismonth = zeroise( (int) substr( $m, 4, 2 ), 2 ); + } + } else { + $thisyear = current_time( 'Y' ); + $thismonth = current_time( 'm' ); + } + + $unixmonth = mktime( 0, 0, 0, $thismonth, 1, $thisyear ); + $last_day = gmdate( 't', $unixmonth ); + + // Get the next and previous month and year with at least one post. + $previous = $wpdb->get_row( + "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year + FROM $wpdb->posts $join_clause + WHERE post_date < '$thisyear-$thismonth-01' + AND post_type = 'post' AND post_status = 'publish' $where_clause + ORDER BY post_date DESC + LIMIT 1" + ); #modified# + $next = $wpdb->get_row( + "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year + FROM $wpdb->posts $join_clause + WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59' + AND post_type = 'post' AND post_status = 'publish' $where_clause + ORDER BY post_date ASC + LIMIT 1" + ); #modified# + + /* translators: Calendar caption: 1: Month name, 2: 4-digit year. */ + $calendar_caption = _x( '%1$s %2$s', 'calendar caption' ); + $calendar_output = ' + + + '; + + $myweek = array(); + + for ( $wdcount = 0; $wdcount <= 6; $wdcount++ ) { + $myweek[] = $wp_locale->get_weekday( ( $wdcount + $week_begins ) % 7 ); + } + + foreach ( $myweek as $wd ) { + $day_name = $initial ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd ); + $wd = esc_attr( $wd ); + $calendar_output .= "\n\t\t"; + } + + $calendar_output .= ' + + + + '; + + $daywithpost = array(); + + // Get days with posts. + $dayswithposts = $wpdb->get_results( + "SELECT DISTINCT DAYOFMONTH(post_date) + FROM $wpdb->posts $join_clause WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' + AND post_type = 'post' AND post_status = 'publish' + AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59' $where_clause", + ARRAY_N + ); #modified# + + if ( $dayswithposts ) { + foreach ( (array) $dayswithposts as $daywith ) { + $daywithpost[] = (int) $daywith[0]; + } + } + + // See how much we should pad in the beginning. + $pad = calendar_week_mod( gmdate( 'w', $unixmonth ) - $week_begins ); + if ( 0 != $pad ) { + $calendar_output .= "\n\t\t" . ''; + } + + $newrow = false; + $daysinmonth = (int) gmdate( 't', $unixmonth ); + + for ( $day = 1; $day <= $daysinmonth; ++$day ) { + if ( isset( $newrow ) && $newrow ) { + $calendar_output .= "\n\t\n\t\n\t\t"; + } + $newrow = false; + + if ( current_time( 'j' ) == $day && + current_time( 'm' ) == $thismonth && + current_time( 'Y' ) == $thisyear ) { + $calendar_output .= ''; + + if ( 6 == calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) { + $newrow = true; + } + } + + $pad = 7 - calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ); + if ( 0 != $pad && 7 != $pad ) { + $calendar_output .= "\n\t\t" . ''; + } + + $calendar_output .= "\n\t\n\t"; + + $calendar_output .= "\n\t
    ' . sprintf( + $calendar_caption, + $wp_locale->get_month( $thismonth ), + gmdate( 'Y', $unixmonth ) + ) . '
    $day_name
     
    '; + } else { + $calendar_output .= ''; + } + + if ( in_array( $day, $daywithpost, true ) ) { + // Any posts today? + $date_format = gmdate( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) ); + /* translators: Post calendar label. %s: Date. */ + $label = sprintf( __( 'Posts published on %s' ), $date_format ); + $calendar_output .= sprintf( + '%s', + get_day_link( $thisyear, $thismonth, $day ), + esc_attr( $label ), + $day + ); + } else { + $calendar_output .= $day; + } + + $calendar_output .= ' 
    "; + + $calendar_output .= ''; + + $cache[ $key ] = $calendar_output; + wp_cache_set( 'get_calendar', $cache, 'calendar' ); + + if ( $echo ) { + /** This filter is documented in wp-includes/general-template.php */ + echo apply_filters( 'get_calendar', $calendar_output ); + return; + } + /** This filter is documented in wp-includes/general-template.php */ + return apply_filters( 'get_calendar', $calendar_output ); + } +} diff --git a/wp-content/plugins/polylang/include/widget-languages.php b/wp-content/plugins/polylang/include/widget-languages.php new file mode 100644 index 00000000..f157c81e --- /dev/null +++ b/wp-content/plugins/polylang/include/widget-languages.php @@ -0,0 +1,134 @@ + __( 'Displays a language switcher', 'polylang' ), + 'customize_selective_refresh' => true, + ) + ); + } + + /** + * Displays the widget + * + * @since 0.1 + * + * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget. + * @param array $instance The settings for the particular instance of the widget + */ + public function widget( $args, $instance ) { + // Sets a unique id for dropdown. + $instance['dropdown'] = empty( $instance['dropdown'] ) ? 0 : $args['widget_id']; + + if ( $list = pll_the_languages( array_merge( $instance, array( 'echo' => 0 ) ) ) ) { + $title = empty( $instance['title'] ) ? '' : $instance['title']; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput + + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput + } + + // The title may be filtered: Strip out HTML and make sure the aria-label is never empty. + $aria_label = trim( wp_strip_all_tags( $title ) ); + if ( ! $aria_label ) { + $aria_label = __( 'Choose a language', 'polylang' ); + } + + if ( $instance['dropdown'] ) { + echo ''; + echo $list; // phpcs:ignore WordPress.Security.EscapeOutput + } else { + $format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml'; + + /** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */ + $format = apply_filters( 'navigation_widgets_format', $format ); + + if ( 'html5' === $format ) { + echo ''; + } + } + + echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput + } + } + + /** + * Updates the widget options + * + * @since 0.4 + * + * @param array $new_instance New settings for this instance as input by the user via form() + * @param array $old_instance Old settings for this instance + * @return array Settings to save or bool false to cancel saving + */ + public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + $instance = array( 'title' => sanitize_text_field( $new_instance['title'] ) ); + foreach ( array_keys( PLL_Switcher::get_switcher_options( 'widget' ) ) as $key ) { + $instance[ $key ] = ! empty( $new_instance[ $key ] ) ? 1 : 0; + } + + return $instance; + } + + /** + * Displays the widget form + * + * @since 0.4 + * + * @param array $instance Current settings + */ + public function form( $instance ) { + // Default values + $instance = wp_parse_args( (array) $instance, array_merge( array( 'title' => '' ), PLL_Switcher::get_switcher_options( 'widget', 'default' ) ) ); + + // Title + printf( + '

    ', + esc_attr( $this->get_field_id( 'title' ) ), + esc_html__( 'Title:', 'polylang' ), + esc_attr( $this->get_field_name( 'title' ) ), + esc_attr( $instance['title'] ) + ); + + foreach ( PLL_Switcher::get_switcher_options( 'widget' ) as $key => $str ) { + printf( + '
    ', + esc_attr( $this->get_field_id( $key ) ), + esc_attr( $this->get_field_name( $key ) ), + checked( $instance[ $key ], true, false ), + esc_html( $str ), + in_array( $key, array( 'show_names', 'show_flags', 'hide_current' ) ) ? sprintf( ' class="no-dropdown-%s"', esc_attr( $this->id ) ) : '', + ( ! empty( $instance['dropdown'] ) && in_array( $key, array( 'show_names', 'show_flags', 'hide_current' ) ) ? ' style="display:none;"' : '' ), + esc_attr( 'pll-' . $key ) + ); + } + } +} diff --git a/wp-content/plugins/polylang/install/install-base.php b/wp-content/plugins/polylang/install/install-base.php new file mode 100644 index 00000000..3f02f3d6 --- /dev/null +++ b/wp-content/plugins/polylang/install/install-base.php @@ -0,0 +1,121 @@ +plugin_basename = $plugin_basename; + + // Manages plugin activation and deactivation + register_activation_hook( $plugin_basename, array( $this, 'activate' ) ); + register_deactivation_hook( $plugin_basename, array( $this, 'deactivate' ) ); + + // Site creation on multisite. + add_action( 'wp_insert_site', array( $this, 'new_site' ) ); + } + + /** + * Allows to detect plugin deactivation + * + * @since 1.7 + * + * @return bool true if the plugin is currently beeing deactivated + */ + public function is_deactivation() { + return isset( $_GET['action'], $_GET['plugin'] ) && 'deactivate' === $_GET['action'] && $this->plugin_basename === $_GET['plugin']; // phpcs:ignore WordPress.Security.NonceVerification + } + + /** + * Activation or deactivation for all blogs + * + * @since 1.2 + * + * @param string $what Either 'activate' or 'deactivate' + * @param bool $networkwide + */ + protected function do_for_all_blogs( $what, $networkwide ) { + // Network + if ( is_multisite() && $networkwide ) { + global $wpdb; + + foreach ( $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) { + switch_to_blog( $blog_id ); + 'activate' == $what ? $this->_activate() : $this->_deactivate(); + } + restore_current_blog(); + } + + // Single blog + else { + 'activate' == $what ? $this->_activate() : $this->_deactivate(); + } + } + + /** + * Plugin activation for multisite + * + * @since 1.7 + * + * @param bool $networkwide + */ + public function activate( $networkwide ) { + $this->do_for_all_blogs( 'activate', $networkwide ); + } + + /** + * Plugin activation + * + * @since 0.5 + */ + protected function _activate() { + // Can be overriden in child class + } + + /** + * Plugin deactivation for multisite + * + * @since 0.1 + * + * @param bool $networkwide + */ + public function deactivate( $networkwide ) { + $this->do_for_all_blogs( 'deactivate', $networkwide ); + } + + /** + * Plugin deactivation + * + * @since 0.5 + */ + protected function _deactivate() { + // Can be overriden in child class + } + + /** + * Site creation on multisite ( to set default options ) + * + * @since 2.6.8 + * + * @param WP_Site $new_site New site object. + */ + public function new_site( $new_site ) { + switch_to_blog( $new_site->id ); + $this->_activate(); + restore_current_blog(); + } +} diff --git a/wp-content/plugins/polylang/install/install.php b/wp-content/plugins/polylang/install/install.php new file mode 100644 index 00000000..75555ebd --- /dev/null +++ b/wp-content/plugins/polylang/install/install.php @@ -0,0 +1,138 @@ +

    %s

    ', + sprintf( + /* translators: 1: Plugin name 2: Current PHP version 3: Required PHP version */ + esc_html__( '%1$s has deactivated itself because you are using an old version of PHP. You are using using PHP %2$s. %1$s requires PHP %3$s.', 'polylang' ), + esc_html( POLYLANG ), + PHP_VERSION, + esc_html( PLL_MIN_PHP_VERSION ) + ) + ); + } + + /** + * Displays a notice if WP min version is not met. + * + * @since 2.6.7 + */ + public function wp_version_notice() { + global $wp_version; + + load_plugin_textdomain( 'polylang' ); // Plugin i18n. + + printf( + '

    %s

    ', + sprintf( + /* translators: 1: Plugin name 2: Current WordPress version 3: Required WordPress version */ + esc_html__( '%1$s has deactivated itself because you are using an old version of WordPress. You are using using WordPress %2$s. %1$s requires at least WordPress %3$s.', 'polylang' ), + esc_html( POLYLANG ), + esc_html( $wp_version ), + esc_html( PLL_MIN_WP_VERSION ) + ) + ); + } + + /** + * Get default Polylang options + * + * @since 1.8 + * + * return array + */ + public static function get_default_options() { + return array( + 'browser' => 1, // Default language for the front page is set by browser preference + 'rewrite' => 1, // Remove /language/ in permalinks ( was the opposite before 0.7.2 ) + 'hide_default' => 1, // Remove URL language information for default language ( was the opposite before 2.1.5 ) + 'force_lang' => 1, // Add URL language information ( was 0 before 1.7 ) + 'redirect_lang' => 0, // Do not redirect the language page to the homepage + 'media_support' => 1, // Support languages and translation for media by default + 'uninstall' => 0, // Do not remove data when uninstalling Polylang + 'sync' => array(), // Synchronisation is disabled by default ( was the opposite before 1.2 ) + 'post_types' => array(), + 'taxonomies' => array(), + 'domains' => array(), + 'version' => POLYLANG_VERSION, + 'first_activation' => time(), + ); + } + + /** + * Plugin activation + * + * @since 0.5 + */ + protected function _activate() { + if ( $options = get_option( 'polylang' ) ) { + // Check if we will be able to upgrade + if ( version_compare( $options['version'], POLYLANG_VERSION, '<' ) ) { + $upgrade = new PLL_Upgrade( $options ); + $upgrade->can_activate(); + } + } + // Defines default values for options in case this is the first installation + else { + update_option( 'polylang', self::get_default_options() ); + } + + // Avoid 1 query on every pages if no wpml strings is registered + if ( ! get_option( 'polylang_wpml_strings' ) ) { + update_option( 'polylang_wpml_strings', array() ); + } + + // Don't use flush_rewrite_rules at network activation. See #32471 + // Thanks to RavanH for the trick. See https://polylang.wordpress.com/2015/06/10/polylang-1-7-6-and-multisite/ + // Rewrite rules are created at next page load :) + delete_option( 'rewrite_rules' ); + } + + /** + * Plugin deactivation + * + * @since 0.5 + */ + protected function _deactivate() { + delete_option( 'rewrite_rules' ); // Don't use flush_rewrite_rules at network activation. See #32471 + } +} diff --git a/wp-content/plugins/polylang/install/plugin-updater.php b/wp-content/plugins/polylang/install/plugin-updater.php new file mode 100644 index 00000000..0af4a52a --- /dev/null +++ b/wp-content/plugins/polylang/install/plugin-updater.php @@ -0,0 +1,624 @@ +api_url = trailingslashit( $_api_url ); + $this->api_data = $_api_data; + $this->name = plugin_basename( $_plugin_file ); + $this->slug = basename( $_plugin_file, '.php' ); + $this->version = $_api_data['version']; + $this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false; + $this->beta = ! empty( $this->api_data['beta'] ) ? true : false; + $this->cache_key = 'edd_sl_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) ); + + $edd_plugin_data[ $this->slug ] = $this->api_data; + + /** + * Fires after the $edd_plugin_data is setup. + * + * @since x.x.x + * + * @param array $edd_plugin_data Array of EDD SL plugin data. + */ + do_action( 'post_edd_sl_plugin_updater_setup', $edd_plugin_data ); + + // Set up hooks. + $this->init(); + + } + + /** + * Set up WordPress filters to hook into WP's update process. + * + * @uses add_filter() + * + * @return void + */ + public function init() { + + add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); + add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 ); + remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10 ); + add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 ); + add_action( 'admin_init', array( $this, 'show_changelog' ) ); + + } + + /** + * Check for Updates at the defined API endpoint and modify the update array. + * + * This function dives into the update API just when WordPress creates its update array, + * then adds a custom API call and injects the custom plugin data retrieved from the API. + * It is reassembled from parts of the native WordPress plugin update code. + * See wp-includes/update.php line 121 for the original wp_update_plugins() function. + * + * @uses api_request() + * + * @param array $_transient_data Update array build by WordPress. + * @return array Modified update array with custom plugin data. + */ + public function check_update( $_transient_data ) { + + global $pagenow; + + if ( ! is_object( $_transient_data ) ) { + $_transient_data = new stdClass; + } + + if ( 'plugins.php' == $pagenow && is_multisite() ) { + return $_transient_data; + } + + if ( ! empty( $_transient_data->response ) && ! empty( $_transient_data->response[ $this->name ] ) && false === $this->wp_override ) { + return $_transient_data; + } + + $current = $this->get_repo_api_data(); + if ( false !== $current && is_object( $current ) && isset( $current->new_version ) ) { + if ( version_compare( $this->version, $current->new_version, '<' ) ) { + $_transient_data->response[ $this->name ] = $current; + } else { + // Populating the no_update information is required to support auto-updates in WordPress 5.5. + $_transient_data->no_update[ $this->name ] = $current; + } + } + $_transient_data->last_checked = time(); + $_transient_data->checked[ $this->name ] = $this->version; + + return $_transient_data; + } + + /** + * Get repo API data from store. + * Save to cache. + * + * @return \stdClass + */ + public function get_repo_api_data() { + $version_info = $this->get_cached_version_info(); + + if ( false === $version_info ) { + $version_info = $this->api_request( + 'plugin_latest_version', + array( + 'slug' => $this->slug, + 'beta' => $this->beta, + ) + ); + if ( ! $version_info ) { + return false; + } + + // This is required for your plugin to support auto-updates in WordPress 5.5. + $version_info->plugin = $this->name; + $version_info->id = $this->name; + + $this->set_version_info_cache( $version_info ); + } + + return $version_info; + } + + /** + * show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise! + * + * @param string $file + * @param array $plugin + */ + public function show_update_notification( $file, $plugin ) { + + if ( is_network_admin() ) { + return; + } + + if( ! current_user_can( 'update_plugins' ) ) { + return; + } + + if( ! is_multisite() ) { + return; + } + + if ( $this->name != $file ) { + return; + } + + // Remove our filter on the site transient + remove_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ), 10 ); + + $update_cache = get_site_transient( 'update_plugins' ); + + $update_cache = is_object( $update_cache ) ? $update_cache : new stdClass(); + + if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) { + + $version_info = $this->get_repo_api_data(); + + if ( false === $version_info ) { + $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) ); + + // Since we disabled our filter for the transient, we aren't running our object conversion on banners, sections, or icons. Do this now: + if ( isset( $version_info->banners ) && ! is_array( $version_info->banners ) ) { + $version_info->banners = $this->convert_object_to_array( $version_info->banners ); + } + + if ( isset( $version_info->sections ) && ! is_array( $version_info->sections ) ) { + $version_info->sections = $this->convert_object_to_array( $version_info->sections ); + } + + if ( isset( $version_info->icons ) && ! is_array( $version_info->icons ) ) { + $version_info->icons = $this->convert_object_to_array( $version_info->icons ); + } + + if ( isset( $version_info->contributors ) && ! is_array( $version_info->contributors ) ) { + $version_info->contributors = $this->convert_object_to_array( $version_info->contributors ); + } + + $this->set_version_info_cache( $version_info ); + } + + if ( ! is_object( $version_info ) ) { + return; + } + + if ( version_compare( $this->version, $version_info->new_version, '<' ) ) { + $update_cache->response[ $this->name ] = $version_info; + } else { + $update_cache->no_update[ $this->name ] = $version_info; + } + + $update_cache->last_checked = time(); + $update_cache->checked[ $this->name ] = $this->version; + + set_site_transient( 'update_plugins', $update_cache ); + + } else { + + $version_info = $update_cache->response[ $this->name ]; + + } + + // Restore our filter + add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); + + if ( ! empty( $update_cache->response[ $this->name ] ) && version_compare( $this->version, $version_info->new_version, '<' ) ) { + + // build a plugin list row, with update notification + $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' ); + # + echo ''; + echo ''; + echo '
    '; + + $changelog_link = self_admin_url( 'index.php?edd_sl_action=view_plugin_changelog&plugin=' . $this->name . '&slug=' . $this->slug . '&TB_iframe=true&width=772&height=911' ); + + if ( empty( $version_info->download_link ) ) { + printf( + /* translators: %1$s plugin name, %3$s plugin version, %2$s is link start tag, %4$s is link end tag. */ + __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'polylang' ), + esc_html( $version_info->name ), + '', + esc_html( $version_info->new_version ), + '' + ); + } else { + printf( + /* translators: %1$s plugin name, %3$s plugin version, %2$s and %5$s are link start tags, %4$s and %6$s are link end tags. */ + __( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s or %5$supdate now%6$s.', 'polylang' ), + esc_html( $version_info->name ), + '', + esc_html( $version_info->new_version ), + '', + '', + '' + ); + } + + do_action( "in_plugin_update_message-{$file}", $plugin, $version_info ); + + echo '
    '; + } + } + + /** + * Updates information on the "View version x.x details" page with custom data. + * + * @uses api_request() + * + * @param mixed $_data + * @param string $_action + * @param object $_args + * @return object $_data + */ + public function plugins_api_filter( $_data, $_action = '', $_args = null ) { + + if ( $_action != 'plugin_information' ) { + + return $_data; + + } + + if ( ! isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) { + + return $_data; + + } + + $to_send = array( + 'slug' => $this->slug, + 'is_ssl' => is_ssl(), + 'fields' => array( + 'banners' => array(), + 'reviews' => false, + 'icons' => array(), + ) + ); + + // Get the transient where we store the api request for this plugin for 24 hours + $edd_api_request_transient = $this->get_cached_version_info(); + + //If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now. + if ( empty( $edd_api_request_transient ) ) { + + $api_response = $this->api_request( 'plugin_information', $to_send ); + + // Expires in 3 hours + $this->set_version_info_cache( $api_response ); + + if ( false !== $api_response ) { + $_data = $api_response; + } + + } else { + $_data = $edd_api_request_transient; + } + + // Convert sections into an associative array, since we're getting an object, but Core expects an array. + if ( isset( $_data->sections ) && ! is_array( $_data->sections ) ) { + $_data->sections = $this->convert_object_to_array( $_data->sections ); + } + + // Convert banners into an associative array, since we're getting an object, but Core expects an array. + if ( isset( $_data->banners ) && ! is_array( $_data->banners ) ) { + $_data->banners = $this->convert_object_to_array( $_data->banners ); + } + + // Convert icons into an associative array, since we're getting an object, but Core expects an array. + if ( isset( $_data->icons ) && ! is_array( $_data->icons ) ) { + $_data->icons = $this->convert_object_to_array( $_data->icons ); + } + + // Convert contributors into an associative array, since we're getting an object, but Core expects an array. + if ( isset( $_data->contributors ) && ! is_array( $_data->contributors ) ) { + $_data->contributors = $this->convert_object_to_array( $_data->contributors ); + } + + if( ! isset( $_data->plugin ) ) { + $_data->plugin = $this->name; + } + + return $_data; + } + + /** + * Convert some objects to arrays when injecting data into the update API + * + * Some data like sections, banners, and icons are expected to be an associative array, however due to the JSON + * decoding, they are objects. This method allows us to pass in the object and return an associative array. + * + * @since 3.6.5 + * + * @param stdClass $data + * + * @return array + */ + private function convert_object_to_array( $data ) { + $new_data = array(); + foreach ( $data as $key => $value ) { + $new_data[ $key ] = is_object( $value ) ? $this->convert_object_to_array( $value ) : $value; + } + + return $new_data; + } + + /** + * Disable SSL verification in order to prevent download update failures + * + * @param array $args + * @param string $url + * @return object $array + */ + public function http_request_args( $args, $url ) { + + $verify_ssl = $this->verify_ssl(); + if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) { + $args['sslverify'] = $verify_ssl; + } + return $args; + + } + + /** + * Calls the API and, if successfull, returns the object delivered by the API. + * + * @uses get_bloginfo() + * @uses wp_remote_post() + * @uses is_wp_error() + * + * @param string $_action The requested action. + * @param array $_data Parameters for the API action. + * @return false|object + */ + private function api_request( $_action, $_data ) { + + global $wp_version, $edd_plugin_url_available; + + $verify_ssl = $this->verify_ssl(); + + // Do a quick status check on this domain if we haven't already checked it. + $store_hash = md5( $this->api_url ); + if ( ! is_array( $edd_plugin_url_available ) || ! isset( $edd_plugin_url_available[ $store_hash ] ) ) { + $test_url_parts = parse_url( $this->api_url ); + + $scheme = ! empty( $test_url_parts['scheme'] ) ? $test_url_parts['scheme'] : 'http'; + $host = ! empty( $test_url_parts['host'] ) ? $test_url_parts['host'] : ''; + $port = ! empty( $test_url_parts['port'] ) ? ':' . $test_url_parts['port'] : ''; + + if ( empty( $host ) ) { + $edd_plugin_url_available[ $store_hash ] = false; + } else { + $test_url = $scheme . '://' . $host . $port; + $response = wp_remote_get( $test_url, array( 'timeout' => $this->health_check_timeout, 'sslverify' => $verify_ssl ) ); + $edd_plugin_url_available[ $store_hash ] = is_wp_error( $response ) ? false : true; + } + } + + if ( false === $edd_plugin_url_available[ $store_hash ] ) { + return false; + } + + $data = array_merge( $this->api_data, $_data ); + + if ( $data['slug'] != $this->slug ) { + return false; + } + + if ( $this->api_url == trailingslashit ( home_url() ) ) { + return false; // Don't allow a plugin to ping itself + } + + $api_params = array( + 'edd_action' => 'get_version', + 'license' => ! empty( $data['license'] ) ? $data['license'] : '', + 'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false, + 'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false, + 'version' => isset( $data['version'] ) ? $data['version'] : false, + 'slug' => $data['slug'], + 'author' => $data['author'], + 'url' => home_url(), + 'beta' => ! empty( $data['beta'] ), + ); + + $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $verify_ssl, 'body' => $api_params ) ); + + if ( ! is_wp_error( $request ) ) { + $request = json_decode( wp_remote_retrieve_body( $request ) ); + } + + if ( $request && isset( $request->sections ) ) { + $request->sections = maybe_unserialize( $request->sections ); + } else { + $request = false; + } + + if ( $request && isset( $request->banners ) ) { + $request->banners = maybe_unserialize( $request->banners ); + } + + if ( $request && isset( $request->icons ) ) { + $request->icons = maybe_unserialize( $request->icons ); + } + + if ( ! empty( $request->sections ) ) { + foreach( $request->sections as $key => $section ) { + $request->$key = (array) $section; + } + } + + return $request; + } + + /** + * If available, show the changelog for sites in a multisite install. + */ + public function show_changelog() { + + global $edd_plugin_data; + + if( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' != $_REQUEST['edd_sl_action'] ) { + return; + } + + if( empty( $_REQUEST['plugin'] ) ) { + return; + } + + if( empty( $_REQUEST['slug'] ) ) { + return; + } + + if( ! current_user_can( 'update_plugins' ) ) { + wp_die( __( 'You do not have permission to install plugin updates', 'polylang' ), __( 'Error', 'polylang' ), array( 'response' => 403 ) ); + } + + $data = $edd_plugin_data[ $_REQUEST['slug'] ]; + $version_info = $this->get_cached_version_info(); + + if( false === $version_info ) { + + $api_params = array( + 'edd_action' => 'get_version', + 'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false, + 'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false, + 'slug' => $_REQUEST['slug'], + 'author' => $data['author'], + 'url' => home_url(), + 'beta' => ! empty( $data['beta'] ) + ); + + $verify_ssl = $this->verify_ssl(); + $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $verify_ssl, 'body' => $api_params ) ); + + if ( ! is_wp_error( $request ) ) { + $version_info = json_decode( wp_remote_retrieve_body( $request ) ); + } + + if ( ! empty( $version_info ) && isset( $version_info->sections ) ) { + $version_info->sections = maybe_unserialize( $version_info->sections ); + } else { + $version_info = false; + } + + if( ! empty( $version_info ) ) { + foreach( $version_info->sections as $key => $section ) { + $version_info->$key = (array) $section; + } + } + + $this->set_version_info_cache( $version_info ); + + // Delete the unneeded option + delete_option( md5( 'edd_plugin_' . sanitize_key( $_REQUEST['plugin'] ) . '_' . $this->beta . '_version_info' ) ); + } + + if ( isset( $version_info->sections ) ) { + $sections = $this->convert_object_to_array( $version_info->sections ); + if ( ! empty( $sections['changelog'] ) ) { + echo '
    ' . wp_kses_post( $sections['changelog'] ) . '
    '; + } + } + + exit; + } + + /** + * Gets the plugin's cached version information from the database. + * + * @param string $cache_key + * @return boolean|string + */ + public function get_cached_version_info( $cache_key = '' ) { + + if( empty( $cache_key ) ) { + $cache_key = $this->cache_key; + } + + $cache = get_option( $cache_key ); + + if( empty( $cache['timeout'] ) || time() > $cache['timeout'] ) { + return false; // Cache is expired + } + + // We need to turn the icons into an array, thanks to WP Core forcing these into an object at some point. + $cache['value'] = json_decode( $cache['value'] ); + if ( ! empty( $cache['value']->icons ) ) { + $cache['value']->icons = (array) $cache['value']->icons; + } + + return $cache['value']; + + } + + /** + * Adds the plugin version information to the database. + * + * @param string $value + * @param string $cache_key + */ + public function set_version_info_cache( $value = '', $cache_key = '' ) { + + if( empty( $cache_key ) ) { + $cache_key = $this->cache_key; + } + + $data = array( + 'timeout' => strtotime( '+3 hours', time() ), + 'value' => json_encode( $value ) + ); + + update_option( $cache_key, $data, 'no' ); + + // Delete the duplicate option + delete_option( 'edd_api_request_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) ) ); + } + + /** + * Returns if the SSL of the store should be verified. + * + * @since 1.6.13 + * @return bool + */ + private function verify_ssl() { + return (bool) apply_filters( 'edd_sl_api_request_verify_ssl', true, $this ); + } + +} diff --git a/wp-content/plugins/polylang/install/t15s.php b/wp-content/plugins/polylang/install/t15s.php new file mode 100644 index 00000000..7f7bfbd6 --- /dev/null +++ b/wp-content/plugins/polylang/install/t15s.php @@ -0,0 +1,232 @@ +slug = $slug; + $this->api_url = $api_url; + + add_action( 'init', array( __CLASS__, 'register_clean_translations_cache' ), 9999 ); + add_filter( 'translations_api', array( $this, 'translations_api' ), 10, 3 ); + add_filter( 'site_transient_update_plugins', array( $this, 'site_transient_update_plugins' ) ); + } + + /** + * Short-circuits translations API requests for private projects. + * + * @since 2.6 + * + * @param bool|array $result The result object. Default false. + * @param string $requested_type The type of translations being requested. + * @param object $args Translation API arguments. + * @return bool|array + */ + public function translations_api( $result, $requested_type, $args ) { + if ( 'plugins' === $requested_type && $this->slug === $args['slug'] ) { + return self::get_translations( $args['slug'], $this->api_url ); + } + + return $result; + } + + /** + * Filters the translations transients to include the private plugin or theme. + * + * @see wp_get_translation_updates() + * + * @since 2.6 + * + * @param bool|array $value The transient value. + */ + public function site_transient_update_plugins( $value ) { + if ( ! $value ) { + $value = new stdClass(); + } + + if ( ! isset( $value->translations ) ) { + $value->translations = array(); + } + + $translations = self::get_translations( $this->slug, $this->api_url ); + + if ( ! isset( $translations['translations'] ) ) { + return $value; + } + + $installed_translations = self::get_installed_translations(); + + foreach ( (array) $translations['translations'] as $translation ) { + if ( in_array( $translation['language'], self::get_available_languages() ) ) { + if ( isset( $installed_translations[ $this->slug ][ $translation['language'] ] ) && $translation['updated'] ) { + $local = new DateTime( $installed_translations[ $this->slug ][ $translation['language'] ]['PO-Revision-Date'] ); + $remote = new DateTime( $translation['updated'] ); + + if ( $local >= $remote ) { + continue; + } + } + + $translation['type'] = 'plugin'; + $translation['slug'] = $this->slug; + + $value->translations[] = $translation; + } + } + + return $value; + } + + /** + * Registers actions for clearing translation caches. + * + * @since 2.6 + */ + public static function register_clean_translations_cache() { + add_action( 'set_site_transient_update_plugins', array( __CLASS__, 'clean_translations_cache' ) ); + add_action( 'delete_site_transient_update_plugins', array( __CLASS__, 'clean_translations_cache' ) ); + } + + /** + * Clears existing translation cache. + * + * @since 2.6 + */ + public static function clean_translations_cache() { + $translations = get_site_transient( self::TRANSIENT_KEY_PLUGIN ); + + if ( ! is_object( $translations ) ) { + return; + } + + /* + * Don't delete the cache if the transient gets changed multiple times + * during a single request. Set cache lifetime to maximum 15 seconds. + */ + $cache_lifespan = 15; + $time_not_changed = isset( $translations->_last_checked ) && ( time() - $translations->_last_checked ) > $cache_lifespan; + + if ( ! $time_not_changed ) { + return; + } + + delete_site_transient( self::TRANSIENT_KEY_PLUGIN ); + } + + /** + * Gets the translations for a given project. + * + * @since 2.6 + * + * @param string $slug Project directory slug. + * @param string $url Full GlotPress API URL for the project. + * @return array Translation data. + */ + private static function get_translations( $slug, $url ) { + $translations = get_site_transient( self::TRANSIENT_KEY_PLUGIN ); + + if ( ! is_object( $translations ) ) { + $translations = new stdClass(); + } + + if ( isset( $translations->{$slug} ) && is_array( $translations->{$slug} ) ) { + return $translations->{$slug}; + } + + $result = json_decode( wp_remote_retrieve_body( wp_remote_get( $url, array( 'timeout' => 3 ) ) ), true ); + + // Nothing found. + if ( ! is_array( $result ) ) { + $result = array(); + } + + $translations->{$slug} = $result; + $translations->_last_checked = time(); + + set_site_transient( self::TRANSIENT_KEY_PLUGIN, $translations ); + return $result; + } + + /** + * Returns installed translations. + * + * Used to cache the result of wp_get_installed_translations() as it is very expensive. + * + * @since 2.8 + * + * @return array + */ + private static function get_installed_translations() { + if ( null === self::$installed_translations ) { + self::$installed_translations = wp_get_installed_translations( 'plugins' ); + } + return self::$installed_translations; + } + + /** + * Returns available languages. + * + * Used to cache the result of get_available_languages() as it is very expensive. + * + * @since 2.8 + * + * @return array + */ + private static function get_available_languages() { + if ( null === self::$available_languages ) { + self::$available_languages = get_available_languages(); + } + return self::$available_languages; + } +} diff --git a/wp-content/plugins/polylang/install/upgrade.php b/wp-content/plugins/polylang/install/upgrade.php new file mode 100644 index 00000000..7a92f4cc --- /dev/null +++ b/wp-content/plugins/polylang/install/upgrade.php @@ -0,0 +1,651 @@ +options = &$options; + } + + /** + * Check if upgrade is possible otherwise die to avoid activation + * + * @since 1.2 + */ + public function can_activate() { + if ( ! $this->can_upgrade() ) { + ob_start(); + $this->admin_notices(); // FIXME the error message is displayed two times + die( ob_get_contents() ); // phpcs:ignore WordPress.Security.EscapeOutput + } + } + + /** + * Upgrades if possible otherwise returns false to stop Polylang loading + * + * @since 1.2 + * + * @return bool true if upgrade is possible, false otherwise + */ + public function upgrade() { + if ( ! $this->can_upgrade() ) { + add_action( 'all_admin_notices', array( $this, 'admin_notices' ) ); + return false; + } + + add_action( 'admin_init', array( $this, '_upgrade' ) ); + return true; + } + + + /** + * Check if we the previous version is not too old + * Upgrades if OK + * /!\ never start any upgrade before admin_init as it is likely to conflict with some other plugins + * + * @since 1.2 + * + * @return bool true if upgrade is possible, false otherwise + */ + public function can_upgrade() { + // Don't manage upgrade from version < 0.8 + return version_compare( $this->options['version'], '0.8', '>=' ); + } + + /** + * Displays a notice when ugrading from a too old version + * + * @since 1.0 + */ + public function admin_notices() { + load_plugin_textdomain( 'polylang' ); + printf( + '

    %s

    %s

    ', + esc_html__( 'Polylang has been deactivated because you upgraded from a too old version.', 'polylang' ), + sprintf( + /* translators: %1$s and %2$s are Polylang version numbers */ + esc_html__( 'Before upgrading to %2$s, please upgrade to %1$s.', 'polylang' ), + '0.9.8', + POLYLANG_VERSION // phpcs:ignore WordPress.Security.EscapeOutput + ) + ); + } + + /** + * Upgrades the plugin depending on the previous version + * + * @since 1.2 + */ + public function _upgrade() { + foreach ( array( '0.9', '1.0', '1.1', '1.2', '1.2.1', '1.2.3', '1.3', '1.4', '1.4.1', '1.4.4', '1.5', '1.6', '1.7.4', '1.8', '2.0.8', '2.1', '2.7', '2.8.1' ) as $version ) { + if ( version_compare( $this->options['version'], $version, '<' ) ) { + call_user_func( array( $this, 'upgrade_' . str_replace( '.', '_', $version ) ) ); + } + } + + $delete_pre_1_2_data = get_transient( 'pll_upgrade_1_4' ); + if ( false !== $delete_pre_1_2_data && absint( $delete_pre_1_2_data ) < time() ) { + $this->delete_pre_1_2_data(); + } + + $this->options['previous_version'] = $this->options['version']; // Remember the previous version of Polylang since v1.7.7 + $this->options['version'] = POLYLANG_VERSION; + update_option( 'polylang', $this->options ); + } + + /** + * Upgrades if the previous version is < 0.9 + * + * @since 1.2 + */ + protected function upgrade_0_9() { + $this->options['sync'] = defined( 'PLL_SYNC' ) && ! PLL_SYNC ? 0 : 1; // The option replaces PLL_SYNC in 0.9 + } + + /** + * Upgrades if the previous version is < 1.0 + * + * @since 1.2 + */ + protected function upgrade_1_0() { + // The option replaces PLL_MEDIA_SUPPORT in 1.0 + $this->options['media_support'] = defined( 'PLL_MEDIA_SUPPORT' ) && ! PLL_MEDIA_SUPPORT ? 0 : 1; + + // Split the synchronization options in 1.0 + $this->options['sync'] = empty( $this->options['sync'] ) ? array() : array_keys( PLL_Settings_Sync::list_metas_to_sync() ); + + // Set default values for post types and taxonomies to translate + $this->options['post_types'] = array_values( get_post_types( array( '_builtin' => false, 'show_ui' => true ) ) ); + $this->options['taxonomies'] = array_values( get_taxonomies( array( '_builtin' => false, 'show_ui' => true ) ) ); + update_option( 'polylang', $this->options ); + + flush_rewrite_rules(); // Rewrite rules have been modified in 1.0 + } + + /** + * Upgrades if the previous version is < 1.1 + * + * @since 1.2 + */ + protected function upgrade_1_1() { + // Update strings register with icl_register_string + $strings = get_option( 'polylang_wpml_strings' ); + if ( $strings ) { + foreach ( array_keys( $strings ) as $key ) { + $strings[ $key ]['icl'] = 1; + } + update_option( 'polylang_wpml_strings', $strings ); + } + + // Move polylang_widgets options + if ( $widgets = get_option( 'polylang_widgets' ) ) { + $this->options['widgets'] = $widgets; + delete_option( 'polylang_widgets' ); + } + } + + /** + * Upgrades if the previous version is < 1.2 + * + * @since 1.2 + */ + protected function upgrade_1_2() { + $this->options['domains'] = array(); // Option added in 1.2 + + // Need to register the taxonomies + foreach ( array( 'language', 'term_language', 'post_translations', 'term_translations' ) as $taxonomy ) { + register_taxonomy( $taxonomy, null, array( 'label' => false, 'public' => false, 'query_var' => false, 'rewrite' => false ) ); + } + + // Abort if the db upgrade has already been done previously + if ( get_terms( 'term_language', array( 'hide_empty' => 0 ) ) ) { + return; + } + + set_time_limit( 0 ); // In case we upgrade a huge site + + // Upgrade old model based on metas to new model based on taxonomies + global $wpdb; + $wpdb->termmeta = $wpdb->prefix . 'termmeta'; // Registers the termmeta table in wpdb + $languages = get_terms( 'language', array( 'hide_empty' => 0 ) ); // Don't use get_languages_list which can't work with the old model + $lang_tt_ids = array(); + + foreach ( $languages as $lang ) { + // First update language with new storage for locale and text direction + $text_direction = get_metadata( 'term', $lang->term_id, '_rtl', true ); + $desc = maybe_serialize( array( 'locale' => $lang->description, 'rtl' => $text_direction ) ); + wp_update_term( (int) $lang->term_id, 'language', array( 'description' => $desc ) ); + + // Add language to new 'term_language' taxonomy + $term_lang = wp_insert_term( $lang->name, 'term_language', array( 'slug' => 'pll_' . $lang->slug ) ); + $lang_tt_ids[ $lang->term_id ] = $term_lang['term_taxonomy_id']; // Keep the term taxonomy id for future + } + + // Get all terms with a language defined + $terms = $wpdb->get_results( "SELECT term_id, meta_value FROM {$wpdb->termmeta} WHERE meta_key = '_language'" ); + foreach ( $terms as $key => $term ) { + $terms[ $key ] = $wpdb->prepare( '( %d, %d )', $term->term_id, $lang_tt_ids[ $term->meta_value ] ); + } + + $terms = array_unique( $terms ); + + // Assign language to each term + if ( ! empty( $terms ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_relationships} ( object_id, term_taxonomy_id ) VALUES " . implode( ',', $terms ) ); + } + + // Translations + foreach ( array( 'post', 'term' ) as $type ) { + $table = $type . 'meta'; + $terms = array(); + $slugs = array(); + $tts = array(); + $trs = array(); + $description = array(); + + // Get all translated objects + // PHPCS:ignore WordPress.DB.PreparedSQL + $objects = $wpdb->get_col( "SELECT DISTINCT meta_value FROM {$wpdb->$table} WHERE meta_key = '_translations'" ); + + if ( empty( $objects ) ) { + continue; + } + + foreach ( $objects as $obj ) { + $term = uniqid( 'pll_' ); // The term name + $terms[] = $wpdb->prepare( '( %s, %s )', $term, $term ); + $slugs[] = $wpdb->prepare( '%s', $term ); + $translations = maybe_unserialize( maybe_unserialize( $obj ) ); // 2 maybe_unserialize due to an old storage bug + $description[ $term ] = maybe_serialize( $translations ); + } + + $terms = array_unique( $terms ); + + // Insert terms + if ( ! empty( $terms ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->terms} ( slug, name ) VALUES " . implode( ',', $terms ) ); + } + + // Get all terms with their term_id + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $terms = $wpdb->get_results( "SELECT term_id, slug FROM $wpdb->terms WHERE slug IN ( " . implode( ',', $slugs ) . ' )' ); + + // Prepare terms taxonomy relationship + foreach ( $terms as $term ) { + $tts[] = $wpdb->prepare( '( %d, %s, %s )', $term->term_id, $type . '_translations', $description[ $term->slug ] ); + } + + $tts = array_unique( $tts ); + + // Insert term_taxonomy + if ( ! empty( $tts ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_taxonomy} ( term_id, taxonomy, description ) VALUES " . implode( ',', $tts ) ); + } + + // Get all terms with term_taxonomy_id + $terms = get_terms( $type . '_translations', array( 'hide_empty' => false ) ); + + // Prepare objects relationships + foreach ( $terms as $term ) { + $translations = maybe_unserialize( $term->description ); + foreach ( $translations as $object_id ) { + if ( ! empty( $object_id ) ) { + $trs[] = $wpdb->prepare( '( %d, %d )', $object_id, $term->term_taxonomy_id ); + } + } + } + + $trs = array_unique( $trs ); + + // Insert term_relationships + if ( ! empty( $trs ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_relationships} ( object_id, term_taxonomy_id ) VALUES " . implode( ',', $trs ) ); + } + } + + // Upgrade of string translations is now in upgrade_1_2_1 + // Upgrade of nav menus is now in upgrade_1_2_3 + } + + /** + * Upgrades if the previous version is < 1.2.1 + * + * @since 1.2.1 + */ + protected function upgrade_1_2_1() { + // Strings translations + foreach ( get_terms( 'language', array( 'hide_empty' => 0 ) ) as $lang ) { + if ( $strings = get_option( 'polylang_mo' . $lang->term_id ) ) { + $mo = new PLL_MO(); + foreach ( $strings as $msg ) { + $mo->add_entry( $mo->make_entry( $msg[0], $msg[1] ) ); + } + $mo->export_to_db( $lang ); + } + } + } + + /** + * Upgrades if the previous version is < 1.2.3 + * Uprades multilingual menus depending on the old version due to multiple changes in menus management + * + * @since 1.2.3 + */ + public function upgrade_1_2_3() { + // Old version < 1.1 + // Multilingal locations and switcher item were stored in a dedicated option + if ( version_compare( $this->options['version'], '1.1', '<' ) ) { + if ( $menu_lang = get_option( 'polylang_nav_menus' ) ) { + $locations = array(); + + foreach ( $menu_lang as $location => $arr ) { + if ( ! in_array( $location, array_keys( get_registered_nav_menus() ) ) ) { + continue; + } + + $switch_options = array_slice( $arr, -5, 5 ); + $translations = array_diff_key( $arr, $switch_options ); + $has_switcher = array_shift( $switch_options ); + + foreach ( get_terms( 'language', array( 'hide_empty' => 0 ) ) as $lang ) { + // Move nav menus locations + if ( ! empty( $translations[ $lang->slug ] ) ) { + $locations[ $location ][ $lang->slug ] = $translations[ $lang->slug ]; + } + + // Create the menu items for the language switcher + if ( ! empty( $has_switcher ) ) { + $menu_item_db_id = wp_update_nav_menu_item( + $translations[ $lang->slug ], + 0, + array( + 'menu-item-title' => __( 'Language switcher', 'polylang' ), + 'menu-item-url' => '#pll_switcher', + 'menu-item-status' => 'publish', + ) + ); + + update_post_meta( $menu_item_db_id, '_pll_menu_item', $switch_options ); + } + } + } + + if ( ! empty( $locations ) ) { + $this->options['nav_menus'][ get_option( 'stylesheet' ) ] = $locations; + } + + delete_option( 'polylang_nav_menus' ); + } + } + + elseif ( empty( $this->options['nav_menus'] ) ) { + $menus = get_theme_mod( 'nav_menu_locations' ); + + if ( is_array( $menus ) ) { + // If old version < 1.2 + // Clean the WP option as it was a bad idea to pollute it + if ( version_compare( $this->options['version'], '1.2', '<' ) ) { + foreach ( $menus as $loc => $menu ) { + if ( strpos( $loc, '#' ) ) { + unset( $menus[ $loc ] ); + } + } + + set_theme_mod( 'nav_menu_locations', $menus ); + } + + // Get the multilingual locations + foreach ( $menus as $loc => $menu ) { + foreach ( get_terms( 'language', array( 'hide_empty' => 0 ) ) as $lang ) { + $arr[ $loc ][ $lang->slug ] = pll_get_term( $menu, $lang ); + } + } + + if ( ! empty( $arr ) ) { + $this->options['nav_menus'][ get_option( 'stylesheet' ) ] = $arr; + } + } + } + } + + /** + * Upgrades if the previous version is < 1.3 + * Moves the user biographies in default language to the 'description' user meta + * + * @since 1.3 + */ + protected function upgrade_1_3() { + $usermeta = 'description_' . $this->options['default_lang']; + $query = new WP_User_Query( array( 'blog_id' => $GLOBALS['blog_id'], 'meta_key' => $usermeta ) ); + + foreach ( $query->get_results() as $user ) { + $desc = get_user_meta( $user->ID, $usermeta, true ); + if ( ! empty( $desc ) ) { + update_user_meta( $user->ID, 'description', $desc ); + delete_user_meta( $user->ID, $usermeta ); + } + } + } + + /** + * Upgrades if the previous version is < 1.4 + * Sets a transient to delete old model data + * Deletes language cache (due to bug correction in home urls in 1.3.1 and added mo_id in 1.4) + * + * @since 1.4 + */ + protected function upgrade_1_4() { + set_transient( 'pll_upgrade_1_4', time() + 60 * 24 * 60 * 60 ); // 60 days + delete_transient( 'pll_languages_list' ); + } + + /** + * Old data were not deleted in 1.2, just in case... + * Delete them at first upgrade at least 60 days after upgrade to 1.4 + * + * @since 1.4 + */ + protected function delete_pre_1_2_data() { + // Suppress data of the old model < 1.2 + global $wpdb; + $wpdb->termmeta = $wpdb->prefix . 'termmeta'; // registers the termmeta table in wpdb in case WP < 4.4 + + // Do nothing if the termmeta table does not exists + if ( count( $wpdb->get_results( "SHOW TABLES LIKE '$wpdb->termmeta'" ) ) ) { + $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_translations'" ); + $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_language'" ); + $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_rtl'" ); + $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_translations'" ); + } + + // Delete the strings translations + $languages = get_terms( 'language', array( 'hide_empty' => false ) ); + foreach ( $languages as $lang ) { + delete_option( 'polylang_mo' . $lang->term_id ); + } + + delete_transient( 'pll_upgrade_1_4' ); + } + + /** + * Upgrades if the previous version is < 1.4.1 + * Disables the browser detection when using multiple domains + * + * @since 1.4.1 + */ + protected function upgrade_1_4_1() { + if ( 3 == $this->options['force_lang'] ) { + $this->options['browser'] = $this->options['hide_default'] = 0; + } + } + + /** + * Upgrades if the previous version is < 1.4.4 + * Uprades widgets options for language filter + * + * @since 1.4.4 + */ + protected function upgrade_1_4_4() { + foreach ( $GLOBALS['wp_registered_widgets'] as $widget ) { + if ( ! empty( $this->options['widgets'][ $widget['id'] ] ) && ! empty( $widget['callback'][0] ) && ! empty( $widget['params'][0]['number'] ) ) { + $obj = $widget['callback'][0]; + if ( is_object( $obj ) && method_exists( $obj, 'get_settings' ) && method_exists( $obj, 'save_settings' ) ) { + $settings = $obj->get_settings(); + $settings[ $widget['params'][0]['number'] ]['pll_lang'] = $this->options['widgets'][ $widget['id'] ]; + $obj->save_settings( $settings ); + } + } + } + unset( $this->options['widgets'] ); + } + + /** + * Upgrades if the previous version is < 1.5 + * Deletes language cache (due to host property added and bug on search url) + * + * @since 1.5 + */ + protected function upgrade_1_5() { + delete_transient( 'pll_languages_list' ); + } + + /** + * Upgrades if the previous version is < 1.6 + * Upgrades core language files to get the .po file (only for WP 4.0+) + * + * @since 1.6 + */ + protected function upgrade_1_6() { + if ( version_compare( $GLOBALS['wp_version'], '4.0', '>=' ) ) { + self::download_language_packs(); + } + } + + /** + * Downloads language packs + * Intended to be used only one time (at upgrade to Polylang 1.6 or first upgrade of WP 4.0 or later) + * Adapted from wp_download_language_pack + * Rewritten because wp_download_language_pack checks the existence of .mo and I need to download .po + * + * @since 1.6 + */ + public static function download_language_packs() { + $languages = pll_languages_list( array( 'fields' => 'locale' ) ); + + // Prevents upgrade if the .po file is already here. Let WP manage the upgrades :) + foreach ( $languages as $key => $locale ) { + if ( file_exists( WP_LANG_DIR . "/$locale.po" ) ) { + unset( $languages[ $key ] ); + } + } + + if ( empty( $languages ) ) { + return; + } + + require_once ABSPATH . 'wp-admin/includes/translation-install.php'; + $translations = wp_get_available_translations(); + if ( ! $translations ) { + return; + } + + $translations_to_load = array(); + + foreach ( $translations as $translation ) { + if ( in_array( $translation['language'], $languages ) ) { + $translation['type'] = 'core'; + $translations_to_load[] = (object) $translation; + } + } + + if ( ! empty( $translations_to_load ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Language_Pack_Upgrader( new Automatic_Upgrader_Skin() ); + $upgrader->bulk_upgrade( $translations_to_load, array( 'clear_update_cache' => false ) ); + } + } + + /** + * Upgrades if the previous version is < 1.7.4 + * + * @since 1.7.4 + */ + protected function upgrade_1_7_4() { + delete_transient( 'pll_languages_list' ); // Deletes language cache (due to flag properties added in 1.7, page on front removed in 1.7.2, home url fixes in 1.7.4) + flush_rewrite_rules(); // Flush rewrite rules due to custom taxonomy rewrite rule bug fix + } + + /** + * Upgrades if the previous version is < 1.8 + * + * @since 1.8 + */ + protected function upgrade_1_8() { + // Adds the flag code in languages stored in DB + $languages = include POLYLANG_DIR . '/settings/languages.php'; + + $terms = get_terms( 'language', array( 'hide_empty' => 0 ) ); + + foreach ( $terms as $lang ) { + $description = maybe_unserialize( $lang->description ); + if ( isset( $languages[ $description['locale'] ] ) ) { + $description['flag_code'] = $languages[ $description['locale'] ]['flag']; + $description = maybe_serialize( $description ); + wp_update_term( (int) $lang->term_id, 'language', array( 'description' => $description ) ); + } + } + + delete_transient( 'pll_languages_list' ); + } + + /** + * Upgrades if the previous version is < 2.0.8 + * Changes the user meta 'user_lang' to 'locale' to match WP 4.7 choice + * + * @since 2.0.8 + */ + protected function upgrade_2_0_8() { + global $wpdb; + $wpdb->update( $wpdb->usermeta, array( 'meta_key' => 'locale' ), array( 'meta_key' => 'user_lang' ) ); + } + + /** + * Upgrades if the previous version is < 2.1 + * Moves strings translations from polylang_mo post_content to post meta _pll_strings_translations + * + * @since 2.1 + */ + protected function upgrade_2_1() { + foreach ( get_terms( 'language', array( 'hide_empty' => 0 ) ) as $lang ) { + $mo_id = PLL_MO::get_id( $lang ); + $meta = get_post_meta( $mo_id, '_pll_strings_translations', true ); + + if ( empty( $meta ) ) { + $post = get_post( $mo_id, OBJECT ); + $strings = maybe_unserialize( $post->post_content ); + if ( is_array( $strings ) ) { + update_post_meta( $mo_id, '_pll_strings_translations', $strings ); + } + } + } + } + + /** + * Upgrades if the previous version is < 2.7 + * Replace numeric keys by hashes in WPML registered strings + * Dismiss the wizard notice for existing sites + * + * @since 2.7 + */ + protected function upgrade_2_7() { + $strings = get_option( 'polylang_wpml_strings' ); + if ( is_array( $strings ) ) { + $new_strings = array(); + + foreach ( $strings as $string ) { + $context = $string['context']; + $name = $string['name']; + + $key = md5( "$context | $name" ); + $new_strings[ $key ] = $string; + } + update_option( 'polylang_wpml_strings', $new_strings ); + } + + PLL_Admin_Notices::dismiss( 'wizard' ); + } + + /** + * Upgrades if the previous version is < 2.8.1 + * + * Deletes language cache due to: + * - 'redirect_lang' option removed for subdomains and multiple domains in 2.2 + * - W3C and Facebook locales added to PLL_Language objects in 2.3 + * - flags moved to a different directory in Polylang Pro 2.8 + * - bug of flags url returning html fixed in 2.8.1 + * + * @since 2.8.1 + */ + protected function upgrade_2_8_1() { + delete_transient( 'pll_languages_list' ); + } +} diff --git a/wp-content/plugins/polylang/integrations/aqua-resizer/aqua-resizer.php b/wp-content/plugins/polylang/integrations/aqua-resizer/aqua-resizer.php new file mode 100644 index 00000000..99f93077 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/aqua-resizer/aqua-resizer.php @@ -0,0 +1,32 @@ + 'aq_resize' ) ) ); + } +} diff --git a/wp-content/plugins/polylang/integrations/aqua-resizer/load.php b/wp-content/plugins/polylang/integrations/aqua-resizer/load.php new file mode 100644 index 00000000..d5dd13f2 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/aqua-resizer/load.php @@ -0,0 +1,13 @@ +aq_resizer = new PLL_Aqua_Resizer(); +PLL_Integrations::instance()->aq_resizer->init(); diff --git a/wp-content/plugins/polylang/integrations/cache/cache-compat.php b/wp-content/plugins/polylang/integrations/cache/cache-compat.php new file mode 100644 index 00000000..7185d6d7 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/cache/cache-compat.php @@ -0,0 +1,68 @@ +options['force_lang'] ) ? wp_parse_url( PLL()->links_model->home, PHP_URL_HOST ) : COOKIE_DOMAIN; + $samesite = ( 3 === PLL()->options['force_lang'] ) ? 'None' : 'Lax'; + + $js = sprintf( + '(function() { + var expirationDate = new Date(); + expirationDate.setTime( expirationDate.getTime() + %d * 1000 ); + document.cookie = "%s=%s; expires=" + expirationDate.toUTCString() + "; path=%s%s%s%s"; + }());', + esc_js( apply_filters( 'pll_cookie_expiration', YEAR_IN_SECONDS ) ), + esc_js( PLL_COOKIE ), + esc_js( pll_current_language() ), + esc_js( COOKIEPATH ), + $domain ? '; domain=' . esc_js( $domain ) : '', + is_ssl() ? '; secure' : '', + '; SameSite=' . $samesite + ); + echo ''; // phpcs:ignore WordPress.Security.EscapeOutput + } + + /** + * Informs cache plugins not to cache the home in the default language + * When the detection of the browser preferred language is active + * + * @since 2.3 + */ + public function do_not_cache_site_home() { + if ( ! defined( 'DONOTCACHEPAGE' ) && PLL()->options['browser'] && PLL()->options['hide_default'] && is_front_page() && pll_current_language() === pll_default_language() ) { + define( 'DONOTCACHEPAGE', true ); + } + } +} diff --git a/wp-content/plugins/polylang/integrations/cache/load.php b/wp-content/plugins/polylang/integrations/cache/load.php new file mode 100644 index 00000000..247f3572 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/cache/load.php @@ -0,0 +1,21 @@ +cache_compat = new PLL_Cache_Compat(), 'init' ) ); + } + }, + 0 +); + diff --git a/wp-content/plugins/polylang/integrations/custom-field-template/cft.php b/wp-content/plugins/polylang/integrations/custom-field-template/cft.php new file mode 100644 index 00000000..57ee69a9 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/custom-field-template/cft.php @@ -0,0 +1,35 @@ +ID; + } + } +} diff --git a/wp-content/plugins/polylang/integrations/custom-field-template/load.php b/wp-content/plugins/polylang/integrations/custom-field-template/load.php new file mode 100644 index 00000000..cab104dc --- /dev/null +++ b/wp-content/plugins/polylang/integrations/custom-field-template/load.php @@ -0,0 +1,21 @@ +cft = new PLL_Cft(); + PLL_Integrations::instance()->cft->init(); + } + }, + 0 +); diff --git a/wp-content/plugins/polylang/integrations/domain-mapping/domain-mapping.php b/wp-content/plugins/polylang/integrations/domain-mapping/domain-mapping.php new file mode 100644 index 00000000..4a8ad9a0 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/domain-mapping/domain-mapping.php @@ -0,0 +1,80 @@ + 1 ) { + // Don't go further if we stopped loading the plugin early ( for example when deactivate-polylang=1 ). + if ( ! function_exists( 'PLL' ) ) { + return; + } + + // Don't redirect the main site + if ( is_main_site() ) { + return; + } + + // Don't redirect post previews + if ( isset( $_GET['preview'] ) && 'true' === $_GET['preview'] ) { // phpcs:ignore WordPress.Security.NonceVerification + return; + } + + // Don't redirect theme customizer + if ( isset( $_POST['customize'] ) && isset( $_POST['theme'] ) && 'on' === $_POST['customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification + return; + } + + // If we can't associate the requested domain to a language, redirect to the default domain + $requested_url = pll_get_requested_url(); + $requested_host = wp_parse_url( $requested_url, PHP_URL_HOST ); + + $hosts = PLL()->links_model->get_hosts(); + $lang = array_search( $requested_host, $hosts ); + + if ( empty( $lang ) ) { + $status = get_site_option( 'dm_301_redirect' ) ? '301' : '302'; // Honor status redirect option + $redirect = str_replace( '://' . $requested_host, '://' . $hosts[ $options['default_lang'] ], $requested_url ); + wp_safe_redirect( $redirect, $status ); + exit; + } + } else { + // Otherwise rely on MU Domain Mapping + redirect_to_mapped_domain(); + } + } +} diff --git a/wp-content/plugins/polylang/integrations/domain-mapping/load.php b/wp-content/plugins/polylang/integrations/domain-mapping/load.php new file mode 100644 index 00000000..2c78f09a --- /dev/null +++ b/wp-content/plugins/polylang/integrations/domain-mapping/load.php @@ -0,0 +1,12 @@ +dm = new PLL_Domain_Mapping(); diff --git a/wp-content/plugins/polylang/integrations/duplicate-post/duplicate-post.php b/wp-content/plugins/polylang/integrations/duplicate-post/duplicate-post.php new file mode 100644 index 00000000..0e47179a --- /dev/null +++ b/wp-content/plugins/polylang/integrations/duplicate-post/duplicate-post.php @@ -0,0 +1,38 @@ +duplicate_post = new PLL_Duplicate_Post(); + PLL_Integrations::instance()->duplicate_post->init(); + } + }, + 0 +); diff --git a/wp-content/plugins/polylang/integrations/integrations.php b/wp-content/plugins/polylang/integrations/integrations.php new file mode 100644 index 00000000..bc574c22 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/integrations.php @@ -0,0 +1,49 @@ +is_active() || false !== $featured_ids ) { + return $featured_ids; + } + + $settings = Featured_Content::get_setting(); + + if ( ! $term = get_term_by( 'name', $settings['tag-name'], 'post_tag' ) ) { + return $featured_ids; + } + + // Get featured tag translations + $tags = PLL()->model->term->get_translations( $term->term_id ); + $ids = array(); + + // Query for featured posts in all languages + // One query per language to get the correct number of posts per language + foreach ( $tags as $tag ) { + $args = array( + 'lang' => 0, // Avoid language filters. + 'fields' => 'ids', + 'numberposts' => Featured_Content::$max_posts, + 'tax_query' => array( + array( + 'taxonomy' => 'post_tag', + 'terms' => (int) $tag, + ), + ), + ); + + // Available in Jetpack, but not in Twenty Fourteen. + if ( isset( Featured_Content::$post_types ) ) { + $args['post_type'] = Featured_Content::$post_types; + } + + $_ids = get_posts( $args ); + $ids = array_merge( $ids, $_ids ); + } + + $ids = array_map( 'absint', $ids ); + set_transient( 'featured_content_ids', $ids ); + + return $ids; + } + + /** + * Translates the featured tag id in featured content settings + * Mainly to allow hiding it when requested in featured content options + * Acts only on frontend + * + * @since 1.4 + * + * @param array $settings featured content settings + * @return array modified $settings + */ + public function option_featured_content( $settings ) { + if ( $this->is_active() && PLL() instanceof PLL_Frontend && $settings['tag-id'] && $tr = pll_get_term( $settings['tag-id'] ) ) { + $settings['tag-id'] = $tr; + } + + return $settings; + } +} diff --git a/wp-content/plugins/polylang/integrations/jetpack/jetpack.php b/wp-content/plugins/polylang/integrations/jetpack/jetpack.php new file mode 100644 index 00000000..23a35bb6 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/jetpack/jetpack.php @@ -0,0 +1,137 @@ +options['force_lang'] > 1 ) { + add_filter( 'infinite_scroll_ajax_url', array( PLL()->links_model, 'site_url' ) ); + add_filter( 'infinite_scroll_js_settings', array( $this, 'jetpack_infinite_scroll_js_settings' ) ); + } + } + + /** + * Filter the Top Posts and Pages by language. + * Adapted from the same function in jetpack-3.0.2/3rd-party/wpml.php + * + * @since 1.5.4 + * + * @param array $posts Array of the most popular posts. + * @return array + */ + public function jetpack_widget_get_top_posts( $posts ) { + foreach ( $posts as $k => $post ) { + if ( pll_current_language() !== pll_get_post_language( $post['post_id'] ) ) { + unset( $posts[ $k ] ); + } + } + + return $posts; + } + + /** + * Filter the HTML of the Contact Form and output the one requested by language. + * Adapted from the same function in jetpack-3.0.2/3rd-party/wpml.php + * Keeps using 'icl_translate' as the function registers the string + * + * @since 1.5.4 + * + * @param string $r Contact Form HTML output. + * @param string $field_label Field label. + * @return string + */ + public function grunion_contact_form_field_html_filter( $r, $field_label ) { + if ( function_exists( 'icl_translate' ) ) { + if ( pll_current_language() !== pll_default_language() ) { + $label_translation = icl_translate( 'jetpack ', $field_label . '_label', $field_label ); + $r = str_replace( $field_label, $label_translation, $r ); + } + } + + return $r; + } + + /** + * Adds opengraph support for locale and translations + * + * @since 1.6 + * + * @param array $tags opengraph tags to output + * @return array + */ + public function jetpack_ogp( $tags ) { + if ( did_action( 'pll_init' ) ) { + foreach ( PLL()->model->get_languages_list() as $language ) { + if ( PLL()->curlang->slug !== $language->slug && PLL()->links->get_translation_url( $language ) && isset( $language->facebook ) ) { + $tags['og:locale:alternate'][] = $language->facebook; + } + if ( PLL()->curlang->slug === $language->slug && isset( $language->facebook ) ) { + $tags['og:locale'] = $language->facebook; + } + } + } + return $tags; + } + + /** + * Allows to make sure that related posts are in the correct language + * + * @since 1.8 + * + * @param array $filters Array of ElasticSearch filters based on the post_id and args. + * @param string $post_id Post ID of the post for which we are retrieving Related Posts. + * @return array + */ + public function jetpack_relatedposts_filter_filters( $filters, $post_id ) { + $slug = sanitize_title( pll_get_post_language( $post_id, 'slug' ) ); + $filters[] = array( 'term' => array( 'taxonomy.language.slug' => $slug ) ); + return $filters; + } + + /** + * Fixes the settings history host for infinite scroll when using subdomains or multiple domains + * + * @since 2.1 + * + * @param array $settings + * @return array + */ + public function jetpack_infinite_scroll_js_settings( $settings ) { + $settings['history']['host'] = wp_parse_url( pll_home_url(), PHP_URL_HOST ); // Jetpack uses get_option( 'home' ) + return $settings; + } +} diff --git a/wp-content/plugins/polylang/integrations/jetpack/load.php b/wp-content/plugins/polylang/integrations/jetpack/load.php new file mode 100644 index 00000000..791f0915 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/jetpack/load.php @@ -0,0 +1,14 @@ +jetpack = new PLL_Jetpack(); // Must be loaded before the plugin is active. +add_action( 'pll_init', array( PLL_Integrations::instance()->featured_content = new PLL_Featured_Content(), 'init' ) ); diff --git a/wp-content/plugins/polylang/integrations/no-category-base/load.php b/wp-content/plugins/polylang/integrations/no-category-base/load.php new file mode 100644 index 00000000..4684789a --- /dev/null +++ b/wp-content/plugins/polylang/integrations/no-category-base/load.php @@ -0,0 +1,13 @@ +no_category_base = new PLL_No_Category_Base(); +PLL_Integrations::instance()->no_category_base->init(); diff --git a/wp-content/plugins/polylang/integrations/no-category-base/no-category-base.php b/wp-content/plugins/polylang/integrations/no-category-base/no-category-base.php new file mode 100644 index 00000000..703ac6bf --- /dev/null +++ b/wp-content/plugins/polylang/integrations/no-category-base/no-category-base.php @@ -0,0 +1,36 @@ +twenty_seventeen = new PLL_Twenty_Seventeen(), 'init' ) ); diff --git a/wp-content/plugins/polylang/integrations/twenty-seventeen/twenty-seven-teen.php b/wp-content/plugins/polylang/integrations/twenty-seventeen/twenty-seven-teen.php new file mode 100644 index 00000000..a75540fa --- /dev/null +++ b/wp-content/plugins/polylang/integrations/twenty-seventeen/twenty-seven-teen.php @@ -0,0 +1,30 @@ + 1 ), array( 'context' => 'Twenty Seventeen' ) ); + } + } +} diff --git a/wp-content/plugins/polylang/integrations/wp-importer/load.php b/wp-content/plugins/polylang/integrations/wp-importer/load.php new file mode 100644 index 00000000..180db28d --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-importer/load.php @@ -0,0 +1,12 @@ +wp_importer = new PLL_WordPress_Importer(); diff --git a/wp-content/plugins/polylang/integrations/wp-importer/wordpress-importer.php b/wp-content/plugins/polylang/integrations/wp-importer/wordpress-importer.php new file mode 100644 index 00000000..e7b51feb --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-importer/wordpress-importer.php @@ -0,0 +1,70 @@ +getFileName() ) ) . '/languages' ); + + $GLOBALS['wp_import'] = new PLL_WP_Import(); + register_importer( 'wordpress', 'WordPress', __( 'Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.', 'polylang' ), array( $GLOBALS['wp_import'], 'dispatch' ) ); // phpcs:ignore WordPress.WP.CapitalPDangit.Misspelled + } + + /** + * Sets the flag when importing a language and the file has been exported with Polylang < 1.8. + * + * @since 1.8 + * + * @param array $terms An array of arrays containing terms information form the WXR file. + * @return array + */ + public function wp_import_terms( $terms ) { + $languages = include POLYLANG_DIR . '/settings/languages.php'; + + foreach ( $terms as $key => $term ) { + if ( 'language' === $term['term_taxonomy'] ) { + $description = maybe_unserialize( $term['term_description'] ); + if ( empty( $description['flag_code'] ) && isset( $languages[ $description['locale'] ] ) ) { + $description['flag_code'] = $languages[ $description['locale'] ]['flag']; + $terms[ $key ]['term_description'] = maybe_serialize( $description ); + } + } + } + return $terms; + } +} diff --git a/wp-content/plugins/polylang/integrations/wp-importer/wp-import.php b/wp-content/plugins/polylang/integrations/wp-importer/wp-import.php new file mode 100644 index 00000000..52388b2a --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-importer/wp-import.php @@ -0,0 +1,197 @@ +terms + foreach ( $this->terms as $term ) { + if ( 'post_translations' == $term['term_taxonomy'] ) { + $this->post_translations[] = $term; + } + if ( 'term_translations' == $term['term_taxonomy'] ) { + $term_translations[] = $term; + } + } + + parent::process_terms(); + + // Update the languages list if needed + // First reset the core terms cache as WordPress Importer calls wp_suspend_cache_invalidation( true ); + wp_cache_set( 'last_changed', microtime(), 'terms' ); + PLL()->model->clean_languages_cache(); + + if ( ( $options = get_option( 'polylang' ) ) && empty( $options['default_lang'] ) && ( $languages = PLL()->model->get_languages_list() ) ) { + // Assign the default language if importer created the first language + $default_lang = reset( $languages ); + $options['default_lang'] = $default_lang->slug; + update_option( 'polylang', $options ); + } + + $this->remap_terms_relations( $term_translations ); + $this->remap_translations( $term_translations, $this->processed_terms ); + } + + /** + * Overrides WP_Import::process_post to remap posts translations + * Also merges strings translations from the WXR file to the existing ones + * + * @since 1.2 + */ + public function process_posts() { + $menu_items = $mo_posts = array(); + + // Store this for future usage as parent function unset $this->posts + foreach ( $this->posts as $post ) { + if ( 'nav_menu_item' == $post['post_type'] ) { + $menu_items[] = $post; + } + + if ( 0 === strpos( $post['post_title'], 'polylang_mo_' ) ) { + $mo_posts[] = $post; + } + } + + if ( ! empty( $mo_posts ) ) { + new PLL_MO(); // Just to register the polylang_mo post type before processing posts + } + + parent::process_posts(); + + PLL()->model->clean_languages_cache(); // To update the posts count in ( cached ) languages list + + $this->remap_translations( $this->post_translations, $this->processed_posts ); + unset( $this->post_translations ); + + // Language switcher menu items + foreach ( $menu_items as $item ) { + foreach ( $item['postmeta'] as $meta ) { + if ( '_pll_menu_item' == $meta['key'] ) { + update_post_meta( $this->processed_menu_items[ $item['post_id'] ], '_pll_menu_item', maybe_unserialize( $meta['value'] ) ); + } + } + } + + // Merge strings translations + foreach ( $mo_posts as $post ) { + $lang_id = (int) substr( $post['post_title'], 12 ); + + if ( ! empty( $this->processed_terms[ $lang_id ] ) ) { + if ( $strings = maybe_unserialize( $post['post_content'] ) ) { + $mo = new PLL_MO(); + $mo->import_from_db( $this->processed_terms[ $lang_id ] ); + foreach ( $strings as $msg ) { + $mo->add_entry_or_merge( $mo->make_entry( $msg[0], $msg[1] ) ); + } + $mo->export_to_db( $this->processed_terms[ $lang_id ] ); + } + } + // Delete the now useless imported post + wp_delete_post( $this->processed_posts[ $post['post_id'] ], true ); + } + } + + /** + * Remaps terms languages + * + * @since 1.2 + * + * @param array $terms array of terms in 'term_translations' taxonomy + */ + protected function remap_terms_relations( &$terms ) { + global $wpdb; + + $trs = array(); + + foreach ( $terms as $term ) { + $translations = maybe_unserialize( $term['term_description'] ); + foreach ( $translations as $slug => $old_id ) { + if ( $old_id && ! empty( $this->processed_terms[ $old_id ] ) && $lang = PLL()->model->get_language( $slug ) ) { + // Language relationship + $trs[] = $wpdb->prepare( '( %d, %d )', $this->processed_terms[ $old_id ], $lang->tl_term_taxonomy_id ); + + // Translation relationship + $trs[] = $wpdb->prepare( '( %d, %d )', $this->processed_terms[ $old_id ], get_term( $this->processed_terms[ $term['term_id'] ], 'term_translations' )->term_taxonomy_id ); + } + } + } + + // Insert term_relationships + if ( ! empty( $trs ) ) { + $trs = array_unique( $trs ); + + // Make sure we don't attempt to insert already existing term relationships + $existing_trs = $wpdb->get_results( + "SELECT tr.object_id, tr.term_taxonomy_id FROM {$wpdb->term_relationships} AS tr + INNER JOIN {$wpdb->term_taxonomy} AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id + WHERE tt.taxonomy IN ( 'term_language', 'term_translations' )" + ); + + foreach ( $existing_trs as $key => $tr ) { + $existing_trs[ $key ] = $wpdb->prepare( '( %d, %d )', $tr->object_id, $tr->term_taxonomy_id ); + } + + $trs = array_diff( $trs, $existing_trs ); + + if ( ! empty( $trs ) ) { + // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "INSERT INTO {$wpdb->term_relationships} ( object_id, term_taxonomy_id ) VALUES " . implode( ',', $trs ) ); + } + } + } + + /** + * Remaps translations for both posts and terms + * + * @since 1.2 + * + * @param array $terms array of terms in 'post_translations' or 'term_translations' taxonomies + * @param array $processed_objects array of posts or terms processed by WordPress Importer + */ + protected function remap_translations( &$terms, &$processed_objects ) { + global $wpdb; + + $u = array(); + + foreach ( $terms as $term ) { + $translations = maybe_unserialize( $term['term_description'] ); + $new_translations = array(); + + foreach ( $translations as $slug => $old_id ) { + if ( $old_id && ! empty( $processed_objects[ $old_id ] ) ) { + $new_translations[ $slug ] = $processed_objects[ $old_id ]; + } + } + + if ( ! empty( $new_translations ) ) { + $u['case'][] = $wpdb->prepare( 'WHEN %d THEN %s', $this->processed_terms[ $term['term_id'] ], maybe_serialize( $new_translations ) ); + $u['in'][] = (int) $this->processed_terms[ $term['term_id'] ]; + } + } + + if ( ! empty( $u ) ) { + // PHPCS:disable WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( + "UPDATE {$wpdb->term_taxonomy} + SET description = ( CASE term_id " . implode( ' ', $u['case'] ) . ' END ) + WHERE term_id IN ( ' . implode( ',', $u['in'] ) . ' )' + ); + // PHPCS:enable + } + } +} diff --git a/wp-content/plugins/polylang/integrations/wp-offload-media/as3cf.php b/wp-content/plugins/polylang/integrations/wp-offload-media/as3cf.php new file mode 100644 index 00000000..c78f3550 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-offload-media/as3cf.php @@ -0,0 +1,67 @@ +is_media_translated[ $post_id ] = ( count( pll_get_post_translations( $post_id ) ) > 1 ); + } + + /** + * Deletes the WP Offload Media information from the attachment being deleted. + * That way WP Offload Media won't delete the file stored in the cloud. + * Done after Polylang has deleted the translations informations, to avoid the synchronization of the deletion + * and of course before WP Offload Media deletes the file, normally at priority 20. + * + * @since 2.6 + * + * @param int $post_id Id of the attachment being deleted. + */ + public function prevent_file_deletion( $post_id ) { + if ( ! empty( $this->is_media_translated[ $post_id ] ) ) { + delete_post_meta( $post_id, 'amazonS3_info' ); + delete_post_meta( $post_id, 'as3cf_filesize_total' ); + } + } +} diff --git a/wp-content/plugins/polylang/integrations/wp-offload-media/load.php b/wp-content/plugins/polylang/integrations/wp-offload-media/load.php new file mode 100644 index 00000000..25657e59 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-offload-media/load.php @@ -0,0 +1,21 @@ +as3cf = new PLL_AS3CF(), 'init' ) ); + } + }, + 0 +); + diff --git a/wp-content/plugins/polylang/integrations/wp-sweep/load.php b/wp-content/plugins/polylang/integrations/wp-sweep/load.php new file mode 100644 index 00000000..a64f2c25 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-sweep/load.php @@ -0,0 +1,21 @@ +wp_sweep = new PLL_WP_Sweep(); + PLL_Integrations::instance()->wp_sweep->init(); + } + }, + 0 +); diff --git a/wp-content/plugins/polylang/integrations/wp-sweep/wp-sweep.php b/wp-content/plugins/polylang/integrations/wp-sweep/wp-sweep.php new file mode 100644 index 00000000..eba57c59 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wp-sweep/wp-sweep.php @@ -0,0 +1,61 @@ + 'term_id' ) ), + pll_languages_list( array( 'fields' => 'tl_term_id' ) ) + ); + + return array_unique( $excluded_term_ids ); + } +} diff --git a/wp-content/plugins/polylang/integrations/wpseo/load.php b/wp-content/plugins/polylang/integrations/wpseo/load.php new file mode 100644 index 00000000..a6dd0001 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wpseo/load.php @@ -0,0 +1,21 @@ +wpseo = new PLL_WPSEO(), 'init' ) ); + } + }, + 0 +); + diff --git a/wp-content/plugins/polylang/integrations/wpseo/wpseo-ogp.php b/wp-content/plugins/polylang/integrations/wpseo/wpseo-ogp.php new file mode 100644 index 00000000..b5d7bfb1 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wpseo/wpseo-ogp.php @@ -0,0 +1,55 @@ +locale = $locale; + } + + /** + * Returns the meta Opengraph alternate locale meta tag + * + * @since 2.7.3 + * + * @return string + */ + public function present() { + return sprintf( '', esc_attr( $this->get() ) ); + } + + /** + * Returns the alternate locale + * + * @since 2.7.3 + * + * @return string + */ + public function get() { + return $this->locale; + } +} + diff --git a/wp-content/plugins/polylang/integrations/wpseo/wpseo.php b/wp-content/plugins/polylang/integrations/wpseo/wpseo.php new file mode 100644 index 00000000..c7d0e249 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/wpseo/wpseo.php @@ -0,0 +1,469 @@ +options['force_lang'] > 1 ) { + add_filter( 'wpseo_enable_xml_sitemap_transient_caching', '__return_false' ); // Disable cache! otherwise WPSEO keeps only one domain (thanks to Junaid Bhura) + add_filter( 'home_url', array( $this, 'wpseo_home_url' ), 10, 2 ); // Fix home_url + add_action( 'setup_theme', array( $this, 'maybe_deactivate_sitemap' ) ); // Deactivate sitemaps for inactive languages. + } else { + // Get all terms in all languages when the language is set from the content or directory name + add_filter( 'get_terms_args', array( $this, 'wpseo_remove_terms_filter' ) ); + add_action( 'pre_get_posts', array( $this, 'before_sitemap' ), 0 ); // Needs to be fired before WPSEO_Sitemaps::redirect() + } + + add_filter( 'pll_home_url_white_list', array( $this, 'wpseo_home_url_white_list' ) ); + if ( version_compare( WPSEO_VERSION, '14.0', '<' ) ) { + add_action( 'wpseo_opengraph', array( $this, 'wpseo_ogp' ), 2 ); + } else { + add_filter( 'wpseo_frontend_presenters', array( $this, 'wpseo_frontend_presenters' ) ); + } + add_filter( 'wpseo_canonical', array( $this, 'wpseo_canonical' ) ); + add_filter( 'wpseo_frontend_presentation', array( $this, 'frontend_presentation' ) ); + add_filter( 'wpseo_breadcrumb_indexables', array( $this, 'breadcrumb_indexables' ) ); + } else { + // Primary category + add_filter( 'pll_copy_post_metas', array( $this, 'copy_post_metas' ) ); + add_filter( 'pll_translate_post_meta', array( $this, 'translate_post_meta' ), 10, 3 ); + } + } + + /** + * Registers custom post types and taxonomy titles for translation. + * + * @since 2.9 + */ + public function wpseo_translate_options() { + $keys = array(); + + foreach ( get_post_types( array( 'public' => true, '_builtin' => false ) ) as $t ) { + if ( pll_is_translated_post_type( $t ) ) { + $keys[] = 'title-' . $t; + $keys[] = 'metadesc-' . $t; + } + } + + foreach ( get_post_types( array( 'has_archive' => true, '_builtin' => false ) ) as $t ) { + if ( pll_is_translated_post_type( $t ) ) { + $keys[] = 'title-ptarchive-' . $t; + $keys[] = 'metadesc-ptarchive-' . $t; + $keys[] = 'bctitle-ptarchive-' . $t; + } + } + + foreach ( get_taxonomies( array( 'public' => true, '_builtin' => false ) ) as $t ) { + if ( pll_is_translated_taxonomy( $t ) ) { + $keys[] = 'title-tax-' . $t; + $keys[] = 'metadesc-tax-' . $t; + } + } + + if ( ! empty( $keys ) ) { + new PLL_Translate_Option( 'wpseo_titles', array_fill_keys( $keys, 1 ), array( 'context' => 'wordpress-seo' ) ); + } + } + + /** + * Fixes the home url as well as the stylesheet url + * Only when using multiple domains or subdomains + * + * @since 1.6.4 + * + * @param string $url + * @param string $path + * @return $url + */ + public function wpseo_home_url( $url, $path ) { + if ( empty( $path ) ) { + $path = ltrim( wp_parse_url( pll_get_requested_url(), PHP_URL_PATH ), '/' ); + } + + if ( 'sitemap_index.xml' === $path || preg_match( '#([^/]+?)-sitemap([0-9]+)?\.xml|([a-z]+)?-?sitemap\.xsl#', $path ) ) { + $url = PLL()->links_model->switch_language_in_link( $url, PLL()->curlang ); + } + + return $url; + } + + /** + * Get active languages for the sitemaps + * + * @since 2.0 + * + * @return array list of active language slugs, empty if all languages are active + */ + protected function wpseo_get_active_languages() { + $languages = PLL()->model->get_languages_list(); + if ( wp_list_filter( $languages, array( 'active' => false ) ) ) { + return wp_list_pluck( wp_list_filter( $languages, array( 'active' => false ), 'NOT' ), 'slug' ); + } + return array(); + } + + /** + * Modifies the sql request for posts sitemaps + * Only when using multiple domains or subdomains or if some languages are not active + * + * @since 1.6.4 + * + * @param string $sql JOIN clause + * @param string $post_type + * @return string + */ + public function wpseo_posts_join( $sql, $post_type ) { + return pll_is_translated_post_type( $post_type ) && ( PLL()->options['force_lang'] > 1 || $this->wpseo_get_active_languages() ) ? $sql . PLL()->model->post->join_clause() : $sql; + } + + /** + * Modifies the sql request for posts sitemaps + * Only when using multiple domains or subdomains or if some languages are not active + * + * @since 1.6.4 + * + * @param string $sql WHERE clause + * @param string $post_type + * @return string + */ + public function wpseo_posts_where( $sql, $post_type ) { + if ( pll_is_translated_post_type( $post_type ) ) { + if ( PLL()->options['force_lang'] > 1 ) { + return $sql . PLL()->model->post->where_clause( PLL()->curlang ); + } + + if ( $languages = $this->wpseo_get_active_languages() ) { + return $sql . PLL()->model->post->where_clause( $languages ); + } + } + return $sql; + } + + /** + * Removes the language filter (and remove inactive languages) for the taxonomy sitemaps + * Only when the language is set from the content or directory name + * + * @since 1.0.3 + * + * @param array $args get_terms arguments + * @return array modified list of arguments + */ + public function wpseo_remove_terms_filter( $args ) { + if ( isset( $GLOBALS['wp_query']->query['sitemap'] ) ) { + $args['lang'] = implode( ',', $this->wpseo_get_active_languages() ); + } + return $args; + } + + /** + * Deactivates the sitemap for inactive languages when using subdomains or multiple domains + * + * @since 2.6.1 + */ + public function maybe_deactivate_sitemap() { + global $wpseo_sitemaps; + + if ( isset( $wpseo_sitemaps ) ) { + $active_languages = $this->wpseo_get_active_languages(); + if ( ! empty( $active_languages ) && ! in_array( pll_current_language(), $active_languages ) ) { + remove_action( 'pre_get_posts', array( $wpseo_sitemaps, 'redirect' ), 1 ); + } + } + } + + /** + * Add filters before the sitemap is evaluated and outputed + * + * @since 2.6 + * + * @param object $query Instance of WP_Query being filtered. + */ + public function before_sitemap( $query ) { + $type = $query->get( 'sitemap' ); + + // Add the post post type archives in all languages to the sitemap + // Add the homepages for all languages to the sitemap when the front page displays posts + if ( $type && pll_is_translated_post_type( $type ) && ( 'post' !== $type || ! get_option( 'page_on_front' ) ) ) { + add_filter( "wpseo_sitemap_{$type}_content", array( $this, 'add_post_type_archive' ) ); + } + } + + /** + * Generates a post type archive sitemap url + * + * @since 2.6.1 + * + * @param string $link The url. + * @param string $post_type The post type name. + * @return string Formatted sitemap url. + */ + protected function format_sitemap_url( $link, $post_type ) { + global $wpseo_sitemaps; + + return $wpseo_sitemaps->renderer->sitemap_url( + array( + 'loc' => $link, + 'mod' => WPSEO_Sitemaps::get_last_modified_gmt( $post_type ), + 'pri' => 1, + 'chf' => 'daily', + ) + ); + } + + /** + * Adds the home and post type archives urls for all (active) languages to the sitemap + * + * @since 2.6 + * + * @param string $str additional urls to sitemap post + * @return string + */ + public function add_post_type_archive( $str ) { + $post_type = substr( substr( current_filter(), 14 ), 0, -8 ); + $post_type_obj = get_post_type_object( $post_type ); + $languages = wp_list_filter( PLL()->model->get_languages_list(), array( 'active' => false ), 'NOT' ); + + if ( 'post' === $post_type ) { + if ( ! empty( PLL()->options['hide_default'] ) ) { + // The home url is of course already added by WPSEO. + $languages = wp_list_filter( $languages, array( 'slug' => pll_default_language() ), 'NOT' ); + } + + foreach ( $languages as $lang ) { + $str .= $this->format_sitemap_url( pll_home_url( $lang->slug ), $post_type ); + } + } elseif ( $post_type_obj->has_archive ) { + // Exclude cases where a post type archive is attached to a page (ex: WooCommerce). + $slug = ( true === $post_type_obj->has_archive ) ? $post_type_obj->rewrite['slug'] : $post_type_obj->has_archive; + + if ( ! wpcom_vip_get_page_by_path( $slug ) ) { + // The post type archive in the current language is already added by WPSEO. + $languages = wp_list_filter( $languages, array( 'slug' => pll_current_language() ), 'NOT' ); + + foreach ( $languages as $lang ) { + PLL()->curlang = $lang; // Switch the language to get the correct archive link. + $link = get_post_type_archive_link( $post_type ); + $str .= $this->format_sitemap_url( $link, $post_type ); + } + } + } + + return $str; + } + + /** + * Filters home url + * + * @since 1.1.2 + * + * @param array $arr + * @return array + */ + public function wpseo_home_url_white_list( $arr ) { + return array_merge( $arr, array( array( 'file' => 'wordpress-seo' ) ) ); + } + + /** + * Get alternate language codes for Opengraph + * + * @since 2.7.3 + * + * @return array + */ + protected function get_ogp_alternate_languages() { + $alternates = array(); + + foreach ( PLL()->model->get_languages_list() as $language ) { + if ( PLL()->curlang->slug !== $language->slug && PLL()->links->get_translation_url( $language ) && isset( $language->facebook ) ) { + $alternates[] = $language->facebook; + } + } + + // There is a risk that 2 languages have the same Facebook locale. So let's make sure to output each locale only once. + return array_unique( $alternates ); + } + + /** + * Adds opengraph support for translations + * + * @since 1.6 + */ + public function wpseo_ogp() { + global $wpseo_og; + + // WPSEO already deals with the locale + if ( did_action( 'pll_init' ) && method_exists( $wpseo_og, 'og_tag' ) ) { + foreach ( $this->get_ogp_alternate_languages() as $lang ) { + $wpseo_og->og_tag( 'og:locale:alternate', $lang ); + } + } + } + + /** + * Adds opengraph support for translations + * + * @since 2.7.3 + * + * @param array $presenters An array of objects implementing Abstract_Indexable_Presenter + * @return array + */ + public function wpseo_frontend_presenters( $presenters ) { + $_presenters = array(); + + foreach ( $presenters as $presenter ) { + $_presenters[] = $presenter; + if ( $presenter instanceof Yoast\WP\SEO\Presenters\Open_Graph\Locale_Presenter ) { + foreach ( $this->get_ogp_alternate_languages() as $lang ) { + $_presenters[] = new PLL_WPSEO_OGP( $lang ); + } + } + } + return $_presenters; + } + + /** + * Fixes the canonical front page url as unlike WP, WPSEO does not add a trailing slash to the canonical front page url + * + * @since 1.7.10 + * + * @param string $url + * @return $url + */ + public function wpseo_canonical( $url ) { + return is_front_page( $url ) && get_option( 'permalink_structure' ) ? trailingslashit( $url ) : $url; + } + + /** + * Fixes the links and strings stored in the indexable table since Yoast SEO 14.0 + * + * @since 2.8.2 + * + * @param object $presentation The indexable presentation. + * @return object + */ + public function frontend_presentation( $presentation ) { + switch ( $presentation->model->object_type ) { + case 'home-page': + $presentation->model->permalink = pll_home_url(); + $presentation->model->title = WPSEO_Options::get( 'title-home-wpseo' ); + $presentation->model->description = WPSEO_Options::get( 'metadesc-home-wpseo' ); + break; + + case 'post-type-archive': + if ( pll_is_translated_post_type( $presentation->model->object_sub_type ) ) { + $presentation->model->permalink = get_post_type_archive_link( $presentation->model->object_sub_type ); + $presentation->model->title = WPSEO_Options::get( 'title-ptarchive-' . $presentation->model->object_sub_type ); + $presentation->model->description = WPSEO_Options::get( 'metadesc-ptarchive-' . $presentation->model->object_sub_type ); + } + break; + + case 'user': + $presentation->model->permalink = get_author_posts_url( $presentation->model->object_id ); + break; + + case 'system-page': + switch ( $presentation->model->object_sub_type ) { + case '404': + $presentation->model->title = WPSEO_Options::get( 'title-404-wpseo' ); + break; + case 'search-result': + $presentation->model->title = WPSEO_Options::get( 'title-search-wpseo' ); + break; + } + break; + } + + return $presentation; + } + + /** + * Fixes the breadcrumb links and strings stored in the indexable table since Yoast SEO 14.0 + * + * @since 2.8.3 + * + * @param array $indexables An array of Indexable objects. + * @return object + */ + public function breadcrumb_indexables( $indexables ) { + foreach ( $indexables as &$indexable ) { + switch ( $indexable->object_type ) { + case 'home-page': + $indexable->permalink = pll_home_url(); + $indexable->breadcrumb_title = pll__( WPSEO_Options::get( 'breadcrumbs-home' ) ); + break; + + case 'post-type-archive': + if ( pll_is_translated_post_type( $indexable->object_sub_type ) ) { + $indexable->permalink = get_post_type_archive_link( $indexable->object_sub_type ); + $indexable->breadcrumb_title = pll__( WPSEO_Options::get( 'bctitle-ptarchive-' . $indexable->object_sub_type ) ); + } + break; + } + } + + return $indexables; + } + + /** + * Synchronize the primary term + * + * @since 2.3.3 + * + * @param array $keys List of custom fields names. + * @return array + */ + public function copy_post_metas( $keys ) { + $taxonomies = get_taxonomies( + array( + 'hierarchical' => true, + 'public' => true, + ) + ); + + foreach ( $taxonomies as $taxonomy ) { + $keys[] = '_yoast_wpseo_primary_' . $taxonomy; + } + + return $keys; + } + + /** + * Translate the primary term during the synchronization process + * + * @since 2.3.3 + * + * @param int $value Meta value. + * @param string $key Meta key. + * @param string $lang Language of target. + * @return int + */ + public function translate_post_meta( $value, $key, $lang ) { + if ( false !== strpos( $key, '_yoast_wpseo_primary_' ) ) { + $value = pll_get_term( $value, $lang ); + } + return $value; + } +} diff --git a/wp-content/plugins/polylang/integrations/yarpp/load.php b/wp-content/plugins/polylang/integrations/yarpp/load.php new file mode 100644 index 00000000..5ea74d99 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/yarpp/load.php @@ -0,0 +1,20 @@ +yarpp = new PLL_Yarpp(), 'init' ) ); + } + }, + 0 +); diff --git a/wp-content/plugins/polylang/integrations/yarpp/yarpp.php b/wp-content/plugins/polylang/integrations/yarpp/yarpp.php new file mode 100644 index 00000000..11e66d68 --- /dev/null +++ b/wp-content/plugins/polylang/integrations/yarpp/yarpp.php @@ -0,0 +1,20 @@ +yarpp_support = 1; + } +} diff --git a/wp-content/plugins/polylang/js/admin.js b/wp-content/plugins/polylang/js/admin.js new file mode 100644 index 00000000..9568e6eb --- /dev/null +++ b/wp-content/plugins/polylang/js/admin.js @@ -0,0 +1,409 @@ +/** + * @package Polylang + */ + +jQuery( + function( $ ) { + + // languages list table + // accessibility to row actions on focus + // mainly copy paste of WP code from common.js + var transitionTimeout; + $( 'table.languages' ).on( + { // restricted to languages list table + focusin: function() { + clearTimeout( transitionTimeout ); + var focusedRowActions = $( this ).find( '.row-actions' ); + // transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help. + $( '.row-actions' ).not( this ).removeClass( 'visible' ); + focusedRowActions.addClass( 'visible' ); + }, + focusout: function() { + // Tabbing between post title and .row-actions links needs a brief pause, otherwise + // the .row-actions div gets hidden in transit in some browsers ( ahem, Firefox ). + transitionTimeout = setTimeout( + function() { + focusedRowActions.removeClass( 'visible' ); + }, + 30 + ); + } + }, + 'tr' + ); // acts on the whole tr instead of single td as we have actions links in several columns + + /** + * Common functions and variables for overriding languages and flags dropdown list by a jQuery UI selectmenu widget. + */ + + // Add a boolean variable to be able to check jQuery UI >= 1.12 which is introduced in WP 5.6. + // Backward compatibility WP < 5.6 + var isJqueryUImin112 = $.ui.version >= '1.12.0'; + // Allow to check if a flag list dropdown is present. Not present in the Wizard steps or other settings page. + var flagListExist = $( "#flag_list" ).length; + // Allow to check if a language list dropdown is present. Not present in other settings page. + var langListExist = $( "#lang_list" ).length; + // jQuery UI selectmenu widget width option + var defaultSelectmenuWidth = '95%'; + var wizardSelectmenuWidth = '100%'; + + // Inject flag image when jQuery UI selectmenu is created or an item is selected. + // jQuery UI 1.12 introduce a wrapper inside de li tag which is necessary to selectmenu widget to work correctly. + // Mainly copy from the orginal jQuery UI 1.12 selectmenu widget _renderItem method. + // Note this code works fine with jQuery UI 1.11.4 too. + var selectmenuRenderItem = function( ul, item ) { + var li = $( '
  • ' ); + var wrapper = $( '
    '); + + if ( item.disabled ) { + this._addClass( li, null, "ui-state-disabled" ); + } + this._setText( wrapper, item.label ); + + // Add the flag from the data attribute in the selected element. + wrapper.prepend( $( item.element ).data( 'flag-html' ) ); + wrapper.children( 'img' ).addClass( 'ui-icon' ); + + return li.append( wrapper ).appendTo( ul ); + }; + // Override selected item to inject flag for jQuery UI less than 1.12. + var selectmenuRefreshButtonText = function( selectElement ) { + var buttonText = $( selectElement ).selectmenu( 'instance' ).buttonText; + buttonText.prepend( $( selectElement ).children( ':selected' ).data( 'flag-html' ) ); + buttonText.children( 'img' ).addClass( 'ui-icon' ); + }; + // Override selected item since jQuery UI 1.12 which introduces extension point method _renderButtonItem. + // @see https://api.jqueryui.com/1.12/selectmenu/#method-_renderButtonItem _renderButtonItem documentation. + var selectmenuRenderButtonItem = function ( selectElement ) { + var buttonItem = $( '' ); + this._setText( buttonItem, selectElement.label ); + this._addClass( buttonItem, "ui-selectmenu-text" ); + + // Add the flag from the data attribute in the selected element. + buttonItem.prepend( $( selectElement.element ).data( 'flag-html' ) ); + buttonItem.children( 'img' ).addClass( 'ui-icon' ); + + return buttonItem; + } + + /** + * Initialize a jQuery UI selectmenu widget on a DOM element + * + * @param {*} element - The jQuery object representing the DOM element to attach the widget with. + * @param {*} config - All the parameters - options and callbacks - necessary to configure the jQuery UI selectmenu widget. + * @return {Object} - The jQuery UI selectmenu widget object instance. + */ + function initializeSelectmenuWidget( element, config ) { + // Create the jQuery UI selectmenu widget for flags list dropdown and return its instance. + var selectmenuWidgetInstance = element.selectmenu( config ).selectmenu( 'instance' ); + // Overrides each item in the jQuery UI selectmenu list by injecting flag image. + selectmenuWidgetInstance._renderItem = selectmenuRenderItem; + // Override the selected item rendering for jQuery UI 1.12 + if ( isJqueryUImin112 ) { + selectmenuWidgetInstance._renderButtonItem = selectmenuRenderButtonItem; + // Need to refresh to take in account the new button item rendering method after the selectmenu widget instanciaion. + selectmenuWidgetInstance.refresh(); + } + return selectmenuWidgetInstance + } + /** + * Selectmenu widget common parameters for its configuration: options and callbacks. + */ + + // Selectmenu widget options + var selectmenuOptions = { width: defaultSelectmenuWidth }; + + // Selectmenu widget callbacks + var selectmenuFlagListCallbacks = {}; + // Callbacks when Selectmenu widget create or select event is triggered. + var createSelectCallback = function( event, ui ) { + selectmenuRefreshButtonText( event.target ); + } + + /** + * Overrides the flag dropdown list with our customized jquery ui selectmenu. + */ + + // Callbacks when Selectmenu widget change or open event is triggered. + // Needed to correctly refresh the selected element in the list when editing an existing language or when the value change is triggered by the language choice. + // jQuery UI 1.11 callback version. + var changeOpenCallback = function( event, ui ){ + selectmenuRefreshButtonText( $( event.target ).selectmenu( 'refresh' ) ); + } + // jQueryUI 1.12 callback version. + var changeOpenCallbackjQueryUI112 = function( event, ui ){ + // Just a refresh of the menu is needed with jQuery UI 1.12 because _renderButtonItem is triggered and then inject correctly the flag. + $( event.target ).selectmenu( 'refresh' ); + } + // There is no need of create and select callbacks with jQuery UI 1.12 because overriding _renderButtonItem method do the job. + if ( isJqueryUImin112 ) { + selectmenuFlagListCallbacks = + { + change: changeOpenCallbackjQueryUI112, + open: changeOpenCallbackjQueryUI112, + }; + } else { + selectmenuFlagListCallbacks = { + create: createSelectCallback, + select: createSelectCallback, + change: changeOpenCallback, + open: changeOpenCallback, + }; + } + + // Create the selectmenu widget only if the field is present. + if ( flagListExist ) { + // Create the jQuery UI selectmenu widget for flags list dropdown and return its instance. + var selectmenuFlagList = initializeSelectmenuWidget( $( '#flag_list' ), Object.assign( {}, selectmenuOptions, selectmenuFlagListCallbacks ) ); + $( '#lang_list' ).on( + 'languageChanged', + function( event, flag ) { + // Refresh the flag field + selectmenuFlagList.element.val( flag ); + selectmenuFlagList._trigger( 'change' ); + } + ); + } + + /** + * Language choice in predefined languages in Polylang Languages settings page and wizard. + * Overrides the predefined language dropdown list with our customized jQuery ui selectmenu widget. + */ + + /** + * Fill the other language form fields from the language element selected in the language list dropdown. + * + * @param {Object} language - language object of the selected element in the language list dropdown. + */ + function fillLanguageFields( language ) { + $( '#lang_slug' ).val( language.slug ); + $( '#lang_locale' ).val( language.locale ); + $( 'input[name="rtl"]' ).val( language.rtl ); + $( '#lang_name' ).val( language.name ); + } + + /** + * Parse selected language element in the language list dropdown. + * + * @param {object} event - jQuery triggered event. + * @return {object} The language object with its named properties. + */ + function parseSelectedLanguage( event ) { + var selectedElement = $('option:selected', event.target); + var values = selectedElement.val().split(':') + return { + slug: values[0], + locale: values[1], + rtl: [values[2]], + flag: values[3], + name: selectedElement.text().split(' - ')[0] // At the moment there is no need of the 2nd part because it corresponds on the locale which is already known by splitting the selected element value + }; + } + + // Callback when selectmenu widget change event is triggered. + var changeCallback = function( event, ui ) { + var language = parseSelectedLanguage( event ); + + fillLanguageFields( language ); + + $( event.target ).trigger( 'languageChanged', language.flag ); + }; + + // Create the jQuery UI selectmenu widget languages list dropdown and return its instance. + var selectmenuLangListCallbacks = {}; + // For the wizard we need a 100% width. So we override the previous defined value of selectmenuOptions. + if( $( '#lang_list' ).closest( '.pll-wizard-content' ).length > 0 ) { + selectmenuOptions = Object.assign( selectmenuOptions, { width: wizardSelectmenuWidth } ); + } + + // There is no need of create and select callbacks with jQuery UI 1.12 because overrinding _renderButtonItem method do the job. + if ( isJqueryUImin112 ) { + selectmenuLangListCallbacks = { + change: changeCallback, + }; + } else { + selectmenuLangListCallbacks = { + create: createSelectCallback, + select: createSelectCallback, + change: changeCallback, + }; + } + if ( langListExist ) { + initializeSelectmenuWidget( $( '#lang_list' ), Object.assign( {}, selectmenuOptions, selectmenuLangListCallbacks ) ); + } + + // strings translations + // save translations when pressing enter + $( '.translation input' ).on( + 'keydown', + function( event ){ + if ( 'Enter' === event.key ) { + event.preventDefault(); + $( '#submit' ).trigger( 'click' ); + } + } + ); + + // settings page + // click on configure link + $( '#the-list' ).on( + 'click', + '.configure>a', + function(){ + $( '.pll-configure' ).hide().prev().show(); + $( this ).closest( 'tr' ).hide().next().show(); + return false; + } + ); + + // cancel + $( '#the-list' ).on( + 'click', + '.cancel', + function(){ + $( this ).closest( 'tr' ).hide().prev().show(); + } + ); + + // save settings + $( '#the-list' ).on( + 'click', + '.save', + function(){ + var tr = $( this ).closest( 'tr' ); + var parts = tr.attr( 'id' ).split( '-' ); + + var data = { + action: 'pll_save_options', + pll_ajax_settings: true, + module: parts[parts.length - 1], + _pll_nonce: $( '#_pll_nonce' ).val() + }; + + data = tr.find( ':input' ).serialize() + '&' + $.param( data ); + + $.post( + ajaxurl, + data, + function( response ) { + var res = wpAjax.parseAjaxResponse( response, 'ajax-response' ); + $.each( + res.responses, + function() { + switch ( this.what ) { + case 'license-update': + $( '#pll-license-' + this.data ).replaceWith( this.supplemental.html ); + break; + case 'success': + tr.hide().prev().show(); // close only if there is no error + case 'error': + $( '.settings-error' ).remove(); // remove previous messages if any + $( 'h1' ).after( this.data ); + + // Make notices dismissible + // copy paste of common.js from WP 4.2.2 + $( '.notice.is-dismissible' ).each( + function() { + var $this = $( this ), + $button = $( '' ), + btnText = pll_dismiss_notice || ''; + + // Ensure plain text + $button.find( '.screen-reader-text' ).text( btnText ); + + // Whitelist because of how the button is built. See above + $this.append( $button ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + + $button.on( + 'click.wp-dismiss-notice', + function( event ) { + event.preventDefault(); + $this.fadeTo( + 100, + 0, + function() { + $( this ).slideUp( + 100, + function() { + $( this ).remove(); + } + ); + } + ); + } + ); + } + ); + break; + } + } + ); + } + ); + } + ); + + // act when pressing enter or esc in configurations + $( '.pll-configure' ).on( + 'keydown', + function( event ){ + if ( 'Enter' === event.key ) { + event.preventDefault(); + $( this ).find( '.save' ).trigger( 'click' ); + } + + if ( 'Escape' === event.key ) { + event.preventDefault(); + $( this ).find( '.cancel' ).trigger( 'click' ); + } + } + ); + + // settings URL modifications + // manages visibility of fields + $( "input[name='force_lang']" ).on( + 'change', + function() { + function pll_toggle( a, test ) { + test ? a.show() : a.hide(); + } + + var value = $( this ).val(); + pll_toggle( $( '#pll-domains-table' ), 3 == value ); + pll_toggle( $( "#pll-hide-default" ), 3 > value ); + pll_toggle( $( "#pll-rewrite" ), 2 > value ); + pll_toggle( $( "#pll-redirect-lang" ), 2 > value ); + } + ); + + // settings license + // deactivate button + $( '.pll-deactivate-license' ).on( + 'click', + function() { + var data = { + action: 'pll_deactivate_license', + pll_ajax_settings: true, + id: $( this ).attr( 'id' ), + _pll_nonce: $( '#_pll_nonce' ).val() + }; + $.post( + ajaxurl, + data, + function( response ){ + $( '#pll-license-' + response.id ).replaceWith( response.html ); + } + ); + } + ); + + // Manage closing the metabox. + // close postboxes that should be closed + $( '.if-js-closed' ).removeClass( 'if-js-closed' ).addClass( 'closed' ); + // postboxes setup + if ( 'undefined' !== typeof postboxes ) { + postboxes.add_postbox_toggles( pagenow ); + } + } +); + diff --git a/wp-content/plugins/polylang/js/admin.min.js b/wp-content/plugins/polylang/js/admin.min.js new file mode 100644 index 00000000..57707e43 --- /dev/null +++ b/wp-content/plugins/polylang/js/admin.min.js @@ -0,0 +1 @@ +jQuery((function($){var transitionTimeout;$("table.languages").on({focusin:function(){clearTimeout(transitionTimeout);var focusedRowActions=$(this).find(".row-actions");$(".row-actions").not(this).removeClass("visible"),focusedRowActions.addClass("visible")},focusout:function(){transitionTimeout=setTimeout((function(){focusedRowActions.removeClass("visible")}),30)}},"tr");var isJqueryUImin112=$.ui.version>="1.12.0",flagListExist=$("#flag_list").length,langListExist=$("#lang_list").length,defaultSelectmenuWidth="95%",wizardSelectmenuWidth="100%",selectmenuRenderItem=function(ul,item){var li=$("
  • "),wrapper=$("
    ");return item.disabled&&this._addClass(li,null,"ui-state-disabled"),this._setText(wrapper,item.label),wrapper.prepend($(item.element).data("flag-html")),wrapper.children("img").addClass("ui-icon"),li.append(wrapper).appendTo(ul)},selectmenuRefreshButtonText=function(selectElement){var buttonText=$(selectElement).selectmenu("instance").buttonText;buttonText.prepend($(selectElement).children(":selected").data("flag-html")),buttonText.children("img").addClass("ui-icon")},selectmenuRenderButtonItem=function(selectElement){var buttonItem=$("");return this._setText(buttonItem,selectElement.label),this._addClass(buttonItem,"ui-selectmenu-text"),buttonItem.prepend($(selectElement.element).data("flag-html")),buttonItem.children("img").addClass("ui-icon"),buttonItem};function initializeSelectmenuWidget(element,config){var selectmenuWidgetInstance=element.selectmenu(config).selectmenu("instance");return selectmenuWidgetInstance._renderItem=selectmenuRenderItem,isJqueryUImin112&&(selectmenuWidgetInstance._renderButtonItem=selectmenuRenderButtonItem,selectmenuWidgetInstance.refresh()),selectmenuWidgetInstance}var selectmenuOptions={width:"95%"},selectmenuFlagListCallbacks={},createSelectCallback=function(event,ui){selectmenuRefreshButtonText(event.target)},changeOpenCallback=function(event,ui){selectmenuRefreshButtonText($(event.target).selectmenu("refresh"))},changeOpenCallbackjQueryUI112=function(event,ui){$(event.target).selectmenu("refresh")};if(selectmenuFlagListCallbacks=isJqueryUImin112?{change:changeOpenCallbackjQueryUI112,open:changeOpenCallbackjQueryUI112}:{create:createSelectCallback,select:createSelectCallback,change:changeOpenCallback,open:changeOpenCallback},flagListExist){var selectmenuFlagList=initializeSelectmenuWidget($("#flag_list"),Object.assign({},selectmenuOptions,selectmenuFlagListCallbacks));$("#lang_list").on("languageChanged",(function(event,flag){selectmenuFlagList.element.val(flag),selectmenuFlagList._trigger("change")}))}function fillLanguageFields(language){$("#lang_slug").val(language.slug),$("#lang_locale").val(language.locale),$('input[name="rtl"]').val(language.rtl),$("#lang_name").val(language.name)}function parseSelectedLanguage(event){var selectedElement=$("option:selected",event.target),values=selectedElement.val().split(":");return{slug:values[0],locale:values[1],rtl:[values[2]],flag:values[3],name:selectedElement.text().split(" - ")[0]}}var changeCallback=function(event,ui){var language=parseSelectedLanguage(event);fillLanguageFields(language),$(event.target).trigger("languageChanged",language.flag)},selectmenuLangListCallbacks={};$("#lang_list").closest(".pll-wizard-content").length>0&&(selectmenuOptions=Object.assign(selectmenuOptions,{width:"100%"})),selectmenuLangListCallbacks=isJqueryUImin112?{change:changeCallback}:{create:createSelectCallback,select:createSelectCallback,change:changeCallback},langListExist&&initializeSelectmenuWidget($("#lang_list"),Object.assign({},selectmenuOptions,selectmenuLangListCallbacks)),$(".translation input").on("keydown",(function(event){"Enter"===event.key&&(event.preventDefault(),$("#submit").trigger("click"))})),$("#the-list").on("click",".configure>a",(function(){return $(".pll-configure").hide().prev().show(),$(this).closest("tr").hide().next().show(),!1})),$("#the-list").on("click",".cancel",(function(){$(this).closest("tr").hide().prev().show()})),$("#the-list").on("click",".save",(function(){var tr=$(this).closest("tr"),parts=tr.attr("id").split("-"),data={action:"pll_save_options",pll_ajax_settings:!0,module:parts[parts.length-1],_pll_nonce:$("#_pll_nonce").val()};data=tr.find(":input").serialize()+"&"+$.param(data),$.post(ajaxurl,data,(function(response){var res=wpAjax.parseAjaxResponse(response,"ajax-response");$.each(res.responses,(function(){switch(this.what){case"license-update":$("#pll-license-"+this.data).replaceWith(this.supplemental.html);break;case"success":tr.hide().prev().show();case"error":$(".settings-error").remove(),$("h1").after(this.data),$(".notice.is-dismissible").each((function(){var $this=$(this),$button=$(''),btnText=pll_dismiss_notice||"";$button.find(".screen-reader-text").text(btnText),$this.append($button),$button.on("click.wp-dismiss-notice",(function(event){event.preventDefault(),$this.fadeTo(100,0,(function(){$(this).slideUp(100,(function(){$(this).remove()}))}))}))}))}}))}))})),$(".pll-configure").on("keydown",(function(event){"Enter"===event.key&&(event.preventDefault(),$(this).find(".save").trigger("click")),"Escape"===event.key&&(event.preventDefault(),$(this).find(".cancel").trigger("click"))})),$("input[name='force_lang']").on("change",(function(){function pll_toggle(a,test){test?a.show():a.hide()}var value=$(this).val();pll_toggle($("#pll-domains-table"),3==value),pll_toggle($("#pll-hide-default"),3>value),pll_toggle($("#pll-rewrite"),2>value),pll_toggle($("#pll-redirect-lang"),2>value)})),$(".pll-deactivate-license").on("click",(function(){var data={action:"pll_deactivate_license",pll_ajax_settings:!0,id:$(this).attr("id"),_pll_nonce:$("#_pll_nonce").val()};$.post(ajaxurl,data,(function(response){$("#pll-license-"+response.id).replaceWith(response.html)}))})),$(".if-js-closed").removeClass("if-js-closed").addClass("closed"),"undefined"!=typeof postboxes&&postboxes.add_postbox_toggles(pagenow)})); \ No newline at end of file diff --git a/wp-content/plugins/polylang/js/block-editor.js b/wp-content/plugins/polylang/js/block-editor.js new file mode 100644 index 00000000..8c059855 --- /dev/null +++ b/wp-content/plugins/polylang/js/block-editor.js @@ -0,0 +1,203 @@ +/** + * @package Polylang + */ + +/** + * Filter REST API requests to add the language in the request + * + * @since 2.5 + */ +wp.apiFetch.use( + function( options, next ) { + // If options.url is defined, this is not a REST request but a direct call to post.php for legacy metaboxes. + if ( 'undefined' === typeof options.url ) { + if ( 'undefined' === typeof options.data || null === options.data ) { + // GET + options.path += ( ( options.path.indexOf( '?' ) >= 0 ) ? '&lang=' : '?lang=' ) + getCurrentLanguage(); + } else { + // PUT, POST + options.data.lang = getCurrentLanguage(); + } + } + return next( options ); + } +); + +/** + * Get the language from the HTML form + * + * @since 2.5 + * + * @return {Element.value} + */ +function getCurrentLanguage() { + return document.querySelector( '[name=post_lang_choice]' ).value; +} + +/** + * Save post after lang choice is done and redirect to the same page for refreshing all the data + * + * @since 2.5 + */ +jQuery( + function( $ ) { + // savePost after changing the post's language and reload page for refreshing post translated data + $( '.post_lang_choice' ).on( + 'change', + function() { + const select = wp.data.select; + const dispatch = wp.data.dispatch; + const subscribe = wp.data.subscribe; + + let unsubscribe = null; + + // Listen if the savePost is done + const savePostIsDone = new Promise( + function( resolve, reject ) { + unsubscribe = subscribe( + function() { + const isSavePostSucceeded = select( 'core/editor' ).didPostSaveRequestSucceed(); + const isSavePostFailed = select( 'core/editor' ).didPostSaveRequestFail(); + if ( isSavePostSucceeded || isSavePostFailed ) { + if ( isSavePostFailed ) { + reject(); + } else { + resolve(); + } + } + } + ); + } + ); + + // Specific case for empty posts + if ( location.pathname.match( /post-new.php/gi ) ) { + const title = select( 'core/editor' ).getEditedPostAttribute( 'title' ); + const content = select( 'core/editor' ).getEditedPostAttribute( 'content' ); + const excerpt = select( 'core/editor' ).getEditedPostAttribute( 'excerpt' ); + if ( '' === title && '' === content && '' === excerpt ) { + // Change the new_lang parameter with the new language value for reloading the page + // WPCS location.search is never written in the page, just used to relaoad page ( See line 94 ) with the right value of new_lang + // new_lang input is controlled server side in PHP. The value come from the dropdown list of language returned and escaped server side + if ( -1 != location.search.indexOf( 'new_lang' ) ) { + // use regexp non capturing group to replace new_lang parameter no matter where it is and capture other parameters which can be behind it + window.location.search = window.location.search.replace( /(?:new_lang=[^&]*)(&)?(.*)/, 'new_lang=' + this.value + '$1$2' ); // phpcs:ignore WordPressVIPMinimum.JS.Window.location, WordPressVIPMinimum.JS.Window.VarAssignment + } else { + window.location.search = window.location.search + ( ( -1 != window.location.search.indexOf( '?' ) ) ? '&' : '?' ) + 'new_lang=' + this.value; // phpcs:ignore WordPressVIPMinimum.JS.Window.location, WordPressVIPMinimum.JS.Window.VarAssignment + } + } + } + + // For empty posts savePost does nothing + dispatch( 'core/editor' ).savePost(); + + savePostIsDone.then( + function() { + // If the post is well saved, we can reload the page + unsubscribe(); + window.location.reload(); + }, + function() { + // If the post save failed + unsubscribe(); + } + ).catch( + function() { + // If an exception is thrown + unsubscribe(); + } + ); + } + ); + } +); + +/** + * Handles internals of the metabox: + * Language select, autocomplete input field. + * + * @since 1.5 + */ +jQuery( + function( $ ) { + // Ajax for changing the post's language in the languages metabox + $( '.post_lang_choice' ).on( + 'change', + function() { + var data = { + action: 'post_lang_choice', + lang: $( this ).val(), + post_type: $( '#post_type' ).val(), + post_id: $( '#post_ID' ).val(), + _pll_nonce: $( '#_pll_nonce' ).val() + } + + $.post( + ajaxurl, + data, + function( response ) { + var res = wpAjax.parseAjaxResponse( response, 'ajax-response' ); + $.each( + res.responses, + function() { + switch ( this.what ) { + case 'translations': // Translations fields + // Data is built and come from server side and is well escaped when necessary + $( '.translations' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + init_translations(); + break; + case 'flag': // Flag in front of the select dropdown + // Data is built and come from server side and is well escaped when necessary + $( '.pll-select-flag' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + break; + } + } + ); + } + ); + } + ); + + // Translations autocomplete input box + function init_translations() { + $( '.tr_lang' ).each( + function(){ + var tr_lang = $( this ).attr( 'id' ).substring( 8 ); + var td = $( this ).parent().parent().siblings( '.pll-edit-column' ); + + $( this ).autocomplete( + { + minLength: 0, + + source: ajaxurl + '?action=pll_posts_not_translated' + + '&post_language=' + $( '.post_lang_choice' ).val() + + '&translation_language=' + tr_lang + + '&post_type=' + $( '#post_type' ).val() + + '&_pll_nonce=' + $( '#_pll_nonce' ).val(), + + select: function( event, ui ) { + $( '#htr_lang_' + tr_lang ).val( ui.item.id ); + // ui.item.link is built and come from server side and is well escaped when necessary + td.html( ui.item.link ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + }, + } + ); + + // When the input box is emptied + $( this ).on( + 'blur', + function() { + if ( ! $( this ).val() ) { + $( '#htr_lang_' + tr_lang ).val( 0 ); + // Value is retrieved from HTML already generated server side + td.html( td.siblings( '.hidden' ).children().clone() ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + } + } + ); + } + ); + } + + init_translations(); + } +); diff --git a/wp-content/plugins/polylang/js/block-editor.min.js b/wp-content/plugins/polylang/js/block-editor.min.js new file mode 100644 index 00000000..8a37b0e4 --- /dev/null +++ b/wp-content/plugins/polylang/js/block-editor.min.js @@ -0,0 +1 @@ +function getCurrentLanguage(){return document.querySelector("[name=post_lang_choice]").value}wp.apiFetch.use((function(options,next){return void 0===options.url&&(void 0===options.data||null===options.data?options.path+=(options.path.indexOf("?")>=0?"&lang=":"?lang=")+getCurrentLanguage():options.data.lang=getCurrentLanguage()),next(options)})),jQuery((function($){$(".post_lang_choice").on("change",(function(){const select=wp.data.select,dispatch=wp.data.dispatch,subscribe=wp.data.subscribe;let unsubscribe=null;const savePostIsDone=new Promise((function(resolve,reject){unsubscribe=subscribe((function(){const isSavePostSucceeded=select("core/editor").didPostSaveRequestSucceed(),isSavePostFailed=select("core/editor").didPostSaveRequestFail();(isSavePostSucceeded||isSavePostFailed)&&(isSavePostFailed?reject():resolve())}))}));if(location.pathname.match(/post-new.php/gi)){const title=select("core/editor").getEditedPostAttribute("title"),content=select("core/editor").getEditedPostAttribute("content"),excerpt=select("core/editor").getEditedPostAttribute("excerpt");""===title&&""===content&&""===excerpt&&(-1!=location.search.indexOf("new_lang")?window.location.search=window.location.search.replace(/(?:new_lang=[^&]*)(&)?(.*)/,"new_lang="+this.value+"$1$2"):window.location.search=window.location.search+(-1!=window.location.search.indexOf("?")?"&":"?")+"new_lang="+this.value)}dispatch("core/editor").savePost(),savePostIsDone.then((function(){unsubscribe(),window.location.reload()}),(function(){unsubscribe()})).catch((function(){unsubscribe()}))}))})),jQuery((function($){function init_translations(){$(".tr_lang").each((function(){var tr_lang=$(this).attr("id").substring(8),td=$(this).parent().parent().siblings(".pll-edit-column");$(this).autocomplete({minLength:0,source:ajaxurl+"?action=pll_posts_not_translated&post_language="+$(".post_lang_choice").val()+"&translation_language="+tr_lang+"&post_type="+$("#post_type").val()+"&_pll_nonce="+$("#_pll_nonce").val(),select:function(event,ui){$("#htr_lang_"+tr_lang).val(ui.item.id),td.html(ui.item.link)}}),$(this).on("blur",(function(){$(this).val()||($("#htr_lang_"+tr_lang).val(0),td.html(td.siblings(".hidden").children().clone()))}))}))}$(".post_lang_choice").on("change",(function(){var data={action:"post_lang_choice",lang:$(this).val(),post_type:$("#post_type").val(),post_id:$("#post_ID").val(),_pll_nonce:$("#_pll_nonce").val()};$.post(ajaxurl,data,(function(response){var res=wpAjax.parseAjaxResponse(response,"ajax-response");$.each(res.responses,(function(){switch(this.what){case"translations":$(".translations").html(this.data),init_translations();break;case"flag":$(".pll-select-flag").html(this.data)}}))}))})),init_translations()})); \ No newline at end of file diff --git a/wp-content/plugins/polylang/js/classic-editor.js b/wp-content/plugins/polylang/js/classic-editor.js new file mode 100644 index 00000000..6ddbb3e9 --- /dev/null +++ b/wp-content/plugins/polylang/js/classic-editor.js @@ -0,0 +1,213 @@ +/** + * @package Polylang + */ + +// tag suggest in metabox +jQuery( + function( $ ) { + $.ajaxPrefilter( + function( options, originalOptions, jqXHR ) { + var lang = $( '.post_lang_choice' ).val(); + if ( 'string' === typeof options.data && -1 !== options.url.indexOf( 'action=ajax-tag-search' ) && lang ) { + options.data = 'lang=' + lang + '&' + options.data; + } + } + ); + } +); + +// overrides tagBox.get +jQuery( + function( $ ) { + // overrides function to add the language + tagBox.get = function( id ) { + var tax = id.substr( id.indexOf( '-' ) + 1 ); + + // add the language in the $_POST variable + var data = { + action: 'get-tagcloud', + lang: $( '.post_lang_choice' ).val(), + tax: tax + } + + $.post( + ajaxurl, + data, + function( r, stat ) { + if ( 0 == r || 'success' != stat ) { + r = wpAjax.broken; + } + + // @see code from WordPress core https://github.com/WordPress/WordPress/blob/5.2.2/wp-admin/js/tags-box.js#L291 + // @see wp_generate_tag_cloud function which generate the escaped HTML https://github.com/WordPress/WordPress/blob/a02b5cc2a8eecb8e076fbb7cf4de7bd2ec8a8eb1/wp-includes/category-template.php#L966-L975 + r = $( '
    ' ).addClass( 'the-tagcloud' ).attr( 'id', 'tagcloud-' + tax ).html( r ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + $( 'a', r ).click( + function(){ + tagBox.flushTags( $( this ).closest( '.inside' ).children( '.tagsdiv' ), this ); + return false; + } + ); + + var tagCloud = $( '#tagcloud-' + tax ); + // add an if else condition to allow modifying the tags outputed when switching the language + var v = tagCloud.css( 'display' ); + if ( v ) { + // See the comment above when r variable is created. + $( '#tagcloud-' + tax ).replaceWith( r ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.replaceWith + $( '#tagcloud-' + tax ).css( 'display', v ); + } + else { + // See the comment above when r variable is created. + $( '#' + id ).after( r ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.after + } + } + ); + } + } +); + +jQuery( + function ( $ ) { + // collect taxonomies - code partly copied from WordPress + var taxonomies = new Array(); + $( '.categorydiv' ).each( + function(){ + var this_id = $( this ).attr( 'id' ), taxonomyParts, taxonomy; + + taxonomyParts = this_id.split( '-' ); + taxonomyParts.shift(); + taxonomy = taxonomyParts.join( '-' ); + taxonomies.push( taxonomy ); // store the taxonomy for future use + + // add our hidden field in the new category form - for each hierarchical taxonomy + // to set the language when creating a new category + // html code inserted come from html code itself. + $( '#' + taxonomy + '-add-submit' ).before( // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.before + $( '' ).attr( 'type', 'hidden' ) + .attr( 'id', taxonomy + '-lang' ) + .attr( 'name', 'term_lang_choice' ) + .attr( 'value', $( '.post_lang_choice' ).val() ) + ); + } + ); + + // ajax for changing the post's language in the languages metabox + $( '.post_lang_choice' ).change( + function() { + var value = $( this ).val(); + var lang = $( this ).children( 'option[value="' + value + '"]' ).attr( 'lang' ); + var dir = $( '.pll-translation-column > span[lang="' + lang + '"]' ).attr( 'dir' ); + + var data = { + action: 'post_lang_choice', + lang: value, + post_type: $( '#post_type' ).val(), + taxonomies: taxonomies, + post_id: $( '#post_ID' ).val(), + _pll_nonce: $( '#_pll_nonce' ).val() + } + + $.post( + ajaxurl, + data, + function( response ) { + var res = wpAjax.parseAjaxResponse( response, 'ajax-response' ); + $.each( + res.responses, + function() { + switch ( this.what ) { + case 'translations': // translations fields + // Data is built and come from server side and is well escaped when necessary + $( '.translations' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + init_translations(); + break; + case 'taxonomy': // categories metabox for posts + var tax = this.data; + // @see wp_terms_checklist https://github.com/WordPress/WordPress/blob/5.2.2/wp-admin/includes/template.php#L175 + // @see https://github.com/WordPress/WordPress/blob/5.2.2/wp-admin/includes/class-walker-category-checklist.php#L89-L111 + $( '#' + tax + 'checklist' ).html( this.supplemental.all ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + // @see wp_popular_terms_checklist https://github.com/WordPress/WordPress/blob/5.2.2/wp-admin/includes/template.php#L236 + $( '#' + tax + 'checklist-pop' ).html( this.supplemental.populars ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + // @see wp_dropdown_categories https://github.com/WordPress/WordPress/blob/5.5.1/wp-includes/category-template.php#L336 + // which is called by PLL_Admin_Classic_Editor::post_lang_choice to generate supplemental.dropdown + $( '#new' + tax + '_parent' ).replaceWith( this.supplemental.dropdown ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.replaceWith + $( '#' + tax + '-lang' ).val( $( '.post_lang_choice' ).val() ); // hidden field + break; + case 'pages': // parent dropdown list for pages + // @see wp_dropdown_pages https://github.com/WordPress/WordPress/blob/5.2.2/wp-includes/post-template.php#L1186-L1208 + // @see https://github.com/WordPress/WordPress/blob/5.2.2/wp-includes/class-walker-page-dropdown.php#L88 + $( '#parent_id' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + break; + case 'flag': // flag in front of the select dropdown + // Data is built and come from server side and is well escaped when necessary + $( '.pll-select-flag' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + break; + case 'permalink': // Sample permalink + var div = $( '#edit-slug-box' ); + if ( '-1' != this.data && div.children().length ) { + // @see get_sample_permalink_html https://github.com/WordPress/WordPress/blob/5.2.2/wp-admin/includes/post.php#L1425-L1454 + div.html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + } + break; + } + } + ); + + // modifies the language in the tag cloud + $( '.tagcloud-link' ).each( + function() { + var id = $( this ).attr( 'id' ); + tagBox.get( id ); + } + ); + + // Modifies the text direction + $( 'body' ).removeClass( 'pll-dir-rtl' ).removeClass( 'pll-dir-ltr' ).addClass( 'pll-dir-' + dir ); + $( '#content_ifr' ).contents().find( 'html' ).attr( 'lang', lang ).attr( 'dir', dir ); + $( '#content_ifr' ).contents().find( 'body' ).attr( 'dir', dir ); + } + ); + } + ); + + // translations autocomplete input box + function init_translations() { + $( '.tr_lang' ).each( + function(){ + var tr_lang = $( this ).attr( 'id' ).substring( 8 ); + var td = $( this ).parent().parent().siblings( '.pll-edit-column' ); + + $( this ).autocomplete( + { + minLength: 0, + source: ajaxurl + '?action=pll_posts_not_translated' + + '&post_language=' + $( '.post_lang_choice' ).val() + + '&translation_language=' + tr_lang + + '&post_type=' + $( '#post_type' ).val() + + '&_pll_nonce=' + $( '#_pll_nonce' ).val(), + select: function( event, ui ) { + $( '#htr_lang_' + tr_lang ).val( ui.item.id ); + // ui.item.link is built and come from server side and is well escaped when necessary + td.html( ui.item.link ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + }, + } + ); + + // when the input box is emptied + $( this ).on( + 'blur', + function() { + if ( ! $( this ).val() ) { + $( '#htr_lang_' + tr_lang ).val( 0 ); + // Value is retrieved from HTML already generated server side + td.html( td.siblings( '.hidden' ).children().clone() ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + } + } + ); + } + ); + } + + init_translations(); + } +); diff --git a/wp-content/plugins/polylang/js/classic-editor.min.js b/wp-content/plugins/polylang/js/classic-editor.min.js new file mode 100644 index 00000000..f531f784 --- /dev/null +++ b/wp-content/plugins/polylang/js/classic-editor.min.js @@ -0,0 +1 @@ +jQuery(function(t){t.ajaxPrefilter(function(a,l,n){var e=t(".post_lang_choice").val();"string"==typeof a.data&&-1!==a.url.indexOf("action=ajax-tag-search")&&e&&(a.data="lang="+e+"&"+a.data)})}),jQuery(function(t){tagBox.get=function(a){var l=a.substr(a.indexOf("-")+1),n={action:"get-tagcloud",lang:t(".post_lang_choice").val(),tax:l};t.post(ajaxurl,n,function(n,e){0!=n&&"success"==e||(n=wpAjax.broken),n=t("
    ").addClass("the-tagcloud").attr("id","tagcloud-"+l).html(n),t("a",n).click(function(){return tagBox.flushTags(t(this).closest(".inside").children(".tagsdiv"),this),!1});var i=t("#tagcloud-"+l).css("display");i?(t("#tagcloud-"+l).replaceWith(n),t("#tagcloud-"+l).css("display",i)):t("#"+a).after(n)})}}),jQuery(function(t){var a=new Array;function l(){t(".tr_lang").each(function(){var a=t(this).attr("id").substring(8),l=t(this).parent().parent().siblings(".pll-edit-column");t(this).autocomplete({minLength:0,source:ajaxurl+"?action=pll_posts_not_translated&post_language="+t(".post_lang_choice").val()+"&translation_language="+a+"&post_type="+t("#post_type").val()+"&_pll_nonce="+t("#_pll_nonce").val(),select:function(n,e){t("#htr_lang_"+a).val(e.item.id),l.html(e.item.link)}}),t(this).on("blur",function(){t(this).val()||(t("#htr_lang_"+a).val(0),l.html(l.siblings(".hidden").children().clone()))})})}t(".categorydiv").each(function(){var l,n;(l=t(this).attr("id").split("-")).shift(),n=l.join("-"),a.push(n),t("#"+n+"-add-submit").before(t("").attr("type","hidden").attr("id",n+"-lang").attr("name","term_lang_choice").attr("value",t(".post_lang_choice").val()))}),t(".post_lang_choice").change(function(){var n=t(this).val(),e=t(this).children('option[value="'+n+'"]').attr("lang"),i=t('.pll-translation-column > span[lang="'+e+'"]').attr("dir"),s={action:"post_lang_choice",lang:n,post_type:t("#post_type").val(),taxonomies:a,post_id:t("#post_ID").val(),_pll_nonce:t("#_pll_nonce").val()};t.post(ajaxurl,s,function(a){var n=wpAjax.parseAjaxResponse(a,"ajax-response");t.each(n.responses,function(){switch(this.what){case"translations":t(".translations").html(this.data),l();break;case"taxonomy":var a=this.data;t("#"+a+"checklist").html(this.supplemental.all),t("#"+a+"checklist-pop").html(this.supplemental.populars),t("#new"+a+"_parent").replaceWith(this.supplemental.dropdown),t("#"+a+"-lang").val(t(".post_lang_choice").val());break;case"pages":t("#parent_id").html(this.data);break;case"flag":t(".pll-select-flag").html(this.data);break;case"permalink":var n=t("#edit-slug-box");"-1"!=this.data&&n.children().length&&n.html(this.data)}}),t(".tagcloud-link").each(function(){var a=t(this).attr("id");tagBox.get(a)}),t("body").removeClass("pll-dir-rtl").removeClass("pll-dir-ltr").addClass("pll-dir-"+i),t("#content_ifr").contents().find("html").attr("lang",e).attr("dir",i),t("#content_ifr").contents().find("body").attr("dir",i)})}),l()}); diff --git a/wp-content/plugins/polylang/js/nav-menu.js b/wp-content/plugins/polylang/js/nav-menu.js new file mode 100644 index 00000000..bb7c1ea5 --- /dev/null +++ b/wp-content/plugins/polylang/js/nav-menu.js @@ -0,0 +1,103 @@ +/** + * Handles the options in the language switcher nav menu metabox. + * + * @package Polylang + */ + +jQuery( document ).ready( + function( $ ) { + $( '#update-nav-menu' ).bind( + 'click', + function( e ) { + if ( e.target && e.target.className && -1 != e.target.className.indexOf( 'item-edit' ) ) { + $( "input[value='#pll_switcher'][type=text]" ).parent().parent().parent().each( + function(){ + var item = $( this ).attr( 'id' ).substring( 19 ); + $( this ).children( 'p:not( .field-move )' ).remove(); // remove default fields we don't need + + // item is a number part of id of parent menu item built by WordPress + // pll_data is built server side with i18n strings without HTML and data retrieved from post meta + // the usage of attr method is safe before append call. + h = $( '' ).attr( + { + type: 'hidden', + id: 'edit-menu-item-title-' + item, + name: 'menu-item-title[' + item + ']', + value: pll_data.title + } + ); + $( this ).append( h ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + + h = $( '' ).attr( + { + type: 'hidden', + id: 'edit-menu-item-url-' + item, + name: 'menu-item-url[' + item + ']', + value: '#pll_switcher' + } + ); + $( this ).append( h ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + + // a hidden field which exits only if our jQuery code has been executed + h = $( '' ).attr( + { + type: 'hidden', + id: 'edit-menu-item-pll-detect-' + item, + name: 'menu-item-pll-detect[' + item + ']', + value: 1 + } + ); + $( this ).append( h ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + + ids = Array( 'hide_if_no_translation', 'hide_current', 'force_home', 'show_flags', 'show_names', 'dropdown' ); // reverse order + + // add the fields + for ( var i = 0, idsLength = ids.length; i < idsLength; i++ ) { + p = $( '

    ' ).attr( 'class', 'description' ); + // p is hardcoded just above by using attr method which is safe. + $( this ).prepend( p ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend + // item is a number part of id of parent menu item built by WordPress + // pll_data is built server side with i18n strings without HTML + label = $( '

    ' ).text( lang[1] ) ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + td.append( desc ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + } + ); + + td.append( '
    ' ); + // Whitelist because description come from html code generated by WordPress + td.append( span ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + } +); diff --git a/wp-content/plugins/polylang/js/user.min.js b/wp-content/plugins/polylang/js/user.min.js new file mode 100644 index 00000000..ff2f4f58 --- /dev/null +++ b/wp-content/plugins/polylang/js/user.min.js @@ -0,0 +1 @@ +jQuery(document).ready(function(e){var n=e("#description").parent(),d=e("#description").clone(),i=n.children(".description").clone();n.children().remove(),e(".biography").each(function(){lang=e(this).attr("name").split("___"),desc=d.clone(),desc.attr("name","description_"+lang[0]),desc.attr("id","description_"+lang[0]),desc.html(e(this).val()),n.append(e("
    ").text(lang[1])),n.append(desc)}),n.append("
    "),n.append(i)}); diff --git a/wp-content/plugins/polylang/js/widgets.js b/wp-content/plugins/polylang/js/widgets.js new file mode 100644 index 00000000..78772b08 --- /dev/null +++ b/wp-content/plugins/polylang/js/widgets.js @@ -0,0 +1,132 @@ +/** + * Adds a flag to the widgets filtered by a language. + * + * @package Polylang + */ + +jQuery( + function( $ ) { + var widgets_container, widgets_selector, flags; + + if ( 'undefined' !== typeof pll_widgets && pll_widgets.hasOwnProperty( 'flags' ) ) { + flags = pll_widgets.flags; + } + + /** + * Prepend widget titles with a flag once a language is selected. + * + * @param {object} widget The widget element. + * @return {void} Nothing. + */ + function add_flag( widget ) { + if ( ! flags ) { + return; + } + widget = $( widget ); + var title = $( '.widget-top .widget-title h3', widget ), + locale = $( '.pll-lang-choice option:selected', widget ).val(), + // Icon is HTML built and come from server side and is well escaped when necessary + icon = ( locale && flags.hasOwnProperty( locale ) ) ? flags[ locale ] : null; + + if ( icon ) { + icon += '   '; + var current = $( '.pll-lang', title ); + if ( current.length ) { + current.html( icon ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + } else { + flag = $( '' ).addClass( 'pll-lang' ).html( icon ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html + // See the comment above about the icon which is safe. So it is also safe to prepend flag which uses icon. + title.prepend( flag ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend + } + } else { + $( '.pll-lang', title ).remove(); + } + } + + if ( 'undefined' !== typeof wp.customize ) { + + widgets_container = $( '#customize-controls' ); + widgets_selector = '.customize-control .widget'; + + /** + * WP Customizer add control listener. + * + * @link https://wordpress.stackexchange.com/questions/256536/callback-after-wordpress-customizer-complete-loading + * + * @param {object} control The control type. + * @return {void} Nothing. + */ + function customize_add_flag( control ) { + if ( ! control.extended( wp.customize.Widgets.WidgetControl ) ) { + return; + } + + /* + * Make sure the widget's contents are embedded; normally this is done + * when the control is expanded, for DOM performance reasons. + */ + control.embedWidgetContent(); + + // Now we know for sure the widget is fully embedded. + add_flag( control.container.find( '.widget' ) ); + } + wp.customize.control.each( customize_add_flag ); + wp.customize.control.bind( 'add', customize_add_flag ); + + } else { + + widgets_container = $( '#widgets-right' ); + widgets_selector = '.widget'; + + } + + // Add flags on load. + $( widgets_selector, widgets_container ).each( + function() { + add_flag( this ); + } + ); + + // Update flags. + widgets_container.on( + 'change', + '.pll-lang-choice', + function() { + add_flag( $( this ).parents( '.widget' ) ); + } + ); + + function pll_toggle( a, test ) { + test ? a.show() : a.hide(); + } + + // Remove all options if dropdown is checked. + $( '.widgets-sortables,.control-section-sidebar' ).on( + 'change', + '.pll-dropdown', + function() { + var this_id = $( this ).parent().parent().parent().children( '.widget-id' ).attr( 'value' ); + pll_toggle( $( '.no-dropdown-' + this_id ), true != $( this ).prop( 'checked' ) ); + } + ); + + // Disallow unchecking both show names and show flags. + var options = ['-show_flags', '-show_names']; + $.each( + options, + function( i, v ) { + $( '.widgets-sortables,.control-section-sidebar' ).on( + 'change', + '.pll' + v, + function() { + var this_id = $( this ).parent().parent().parent().children( '.widget-id' ).attr( 'value' ); + if ( true != $( this ).prop( 'checked' ) ) { + $( '#widget-' + this_id + options[ 1 - i ] ).prop( 'checked', true ); + } + } + ); + } + ); + + } +); diff --git a/wp-content/plugins/polylang/js/widgets.min.js b/wp-content/plugins/polylang/js/widgets.min.js new file mode 100644 index 00000000..2234a912 --- /dev/null +++ b/wp-content/plugins/polylang/js/widgets.min.js @@ -0,0 +1 @@ +jQuery(function(e){var t,n,i;function o(t){if(i){t=e(t);var n=e(".widget-top .widget-title h3",t),o=e(".pll-lang-choice option:selected",t).val(),l=o&&i.hasOwnProperty(o)?i[o]:null;if(l){l+="   ";var a=e(".pll-lang",n);a.length?a.html(l):(flag=e("").addClass("pll-lang").html(l),n.prepend(flag))}else e(".pll-lang",n).remove()}}if("undefined"!=typeof pll_widgets&&pll_widgets.hasOwnProperty("flags")&&(i=pll_widgets.flags),void 0!==wp.customize){function l(e){e.extended(wp.customize.Widgets.WidgetControl)&&(e.embedWidgetContent(),o(e.container.find(".widget")))}t=e("#customize-controls"),n=".customize-control .widget",wp.customize.control.each(l),wp.customize.control.bind("add",l)}else t=e("#widgets-right"),n=".widget";e(n,t).each(function(){o(this)}),t.on("change",".pll-lang-choice",function(){o(e(this).parents(".widget"))}),e(".widgets-sortables,.control-section-sidebar").on("change",".pll-dropdown",function(){var t,n=e(this).parent().parent().parent().children(".widget-id").attr("value");t=e(".no-dropdown-"+n),1!=e(this).prop("checked")?t.show():t.hide()});var a=["-show_flags","-show_names"];e.each(a,function(t,n){e(".widgets-sortables,.control-section-sidebar").on("change",".pll"+n,function(){var n=e(this).parent().parent().parent().children(".widget-id").attr("value");1!=e(this).prop("checked")&&e("#widget-"+n+a[1-t]).prop("checked",!0)})})}); diff --git a/wp-content/plugins/polylang/modules/lingotek/image01.gif b/wp-content/plugins/polylang/modules/lingotek/image01.gif new file mode 100644 index 00000000..0ae60ac5 Binary files /dev/null and b/wp-content/plugins/polylang/modules/lingotek/image01.gif differ diff --git a/wp-content/plugins/polylang/modules/lingotek/image02.png b/wp-content/plugins/polylang/modules/lingotek/image02.png new file mode 100644 index 00000000..0293bb44 Binary files /dev/null and b/wp-content/plugins/polylang/modules/lingotek/image02.png differ diff --git a/wp-content/plugins/polylang/modules/lingotek/image03.png b/wp-content/plugins/polylang/modules/lingotek/image03.png new file mode 100644 index 00000000..95ed5464 Binary files /dev/null and b/wp-content/plugins/polylang/modules/lingotek/image03.png differ diff --git a/wp-content/plugins/polylang/modules/lingotek/image04.png b/wp-content/plugins/polylang/modules/lingotek/image04.png new file mode 100644 index 00000000..210a1f6a Binary files /dev/null and b/wp-content/plugins/polylang/modules/lingotek/image04.png differ diff --git a/wp-content/plugins/polylang/modules/lingotek/lingotek.php b/wp-content/plugins/polylang/modules/lingotek/lingotek.php new file mode 100644 index 00000000..e4f5c93d --- /dev/null +++ b/wp-content/plugins/polylang/modules/lingotek/lingotek.php @@ -0,0 +1,299 @@ +%s', + admin_url( 'admin.php?page=mlang_lingotek' ), + __( 'Learn more', 'polylang' ) + ); + + if ( $link = $this->get_activate_link() ) { + $content .= ' ' . __( 'Click on Activate Lingotek to start translating.', 'polylang' ); + + $buttons = sprintf( + '%s', + $link, + __( 'Activate Lingotek', 'polylang' ) + ) . $buttons; + } + + if ( is_plugin_active( self::LINGOTEK ) ) { // Needs /wp-admin/includes/plugin.php to be loaded + PLL_Admin_Notices::dismiss( 'lingotek' ); + } else { + PLL_Admin_Notices::add_notice( 'lingotek', '

    ' . $content . '

    ' . $buttons . '

    ' ); + } + } + } + + /** + * Adds the Lingotek tab in Polylang settings + * + * @since 1.7.7 + * + * @param array $tabs list of tabs + * @return array modified liste of tabs + */ + public function add_tab( $tabs ) { + $tabs['lingotek'] = 'Lingotek'; + return $tabs; + } + + /** + * Displays the content in the Lingotek tab + * + * @since 1.7.7 + */ + public function display_tab() { + PLL_Admin_Notices::dismiss( 'lingotek' ); + + $activate_link = $this->get_activate_link(); + + $links = array( + 'activate' => array( + 'label' => is_plugin_active( self::LINGOTEK ) ? __( 'Activated', 'polylang' ) : __( 'Activate', 'polylang' ), + 'link' => $activate_link, + 'classes' => 'button button-primary' . ( $activate_link ? '' : ' disabled' ), + ), + 'translation' => array( + 'label' => __( 'Request Translation', 'polylang' ), + 'link' => 'http://www.lingotek.com/wordpress/translation_bid', + 'new_tab' => true, + 'classes' => 'button button-primary', + ), + 'services' => array( + 'label' => __( 'Request Services', 'polylang' ), + 'link' => 'http://www.lingotek.com/wordpress/extra_services', + 'new_tab' => true, + 'classes' => 'button button-primary', + ), + ); + + printf( '

    %s

    ', esc_html__( 'Polylang is now fully integrated with Lingotek, a professional translation management system!', 'polylang' ) ); + + $this->box( + __( 'Automatically translate my site', 'polylang' ), + __( 'Polylang is now fully integrated with Lingotek!', 'polylang' ), + array( + __( 'Access free machine translation for your site for up to 100,000 characters.', 'polylang' ), + __( 'If you\'re on a tight budget, looking for near-instant results, and are okay with less-than-perfect quality, machine translation is an excellent option.', 'polylang' ), + ), + array_intersect_key( $links, array_flip( array( 'activate' ) ) ), + 'image01.gif' + ); + + $this->box( + __( 'Translation Management System', 'polylang' ), + __( 'Do you need to connect to a professional translation management system?', 'polylang' ), + array( + __( 'Access free machine translation for your site for up to 100,000 characters.', 'polylang' ), + __( 'Access an online translator workbench.', 'polylang' ), + __( 'Have linguists compare side-by-side versions of original and translated text.', 'polylang' ), + __( 'Save and re-use previously translated material (leverage translation memory (TM)).', 'polylang' ), + ), + array_intersect_key( $links, array_flip( array( 'activate' ) ) ), + 'image02.png' + ); + + $this->box( + __( 'Professionally translate my site', 'polylang' ), + __( 'Do you need professional translations for your site?', 'polylang' ), + array( + __( 'Start the process of getting a professional translation bid.', 'polylang' ), + __( 'When you activate your account, Lingotek will be able to get an accurate count of the number of words in your site. Then tell them which languages you wish to have them translated into.', 'polylang' ), + __( 'Once activated, click on the "request translation bid" and a certified translation project manager will contact you for a no-obligations translation bid.', 'polylang' ), + ), + array_intersect_key( $links, array_flip( array( 'activate', 'translation' ) ) ), + 'image03.png' + ); + + $this->box( + __( 'Need extra services?', 'polylang' ), + __( 'Do you need help translating your site?', 'polylang' ), + array( + __( 'Start the process of getting extra services.', 'polylang' ), + __( 'Do you need someone to run your localization project?', 'polylang' ), + __( 'Do you need customized workflows?', 'polylang' ), + __( 'Do you have existing Translation Memories you would like to use?', 'polylang' ), + __( 'Do you need help creating glossaries and terminologies?', 'polylang' ), + ), + array_intersect_key( $links, array_flip( array( 'activate', 'services' ) ) ), + 'image04.png' + ); + } + + /** + * Styles the content of the Lingotek tab + * + * @since 1.7.7 + */ + public function print_css() { + ?> + + +
    +
    +
    + +
    +

    +

    + %s ', + esc_attr( $link_details['classes'] ), + esc_url( $link_details['link'] ), + empty( $link_details['new_tab'] ) ? '' : ' target = "_blank"', + esc_html( $link_details['label'] ) + ); + } + ?> +
    +
    +
      + %s', esc_html( $item ) ); + } + ?> +
    + +
    + +
    + model->get_languages_list() ) { + add_filter( + 'pll_settings_modules', + function( $modules ) { + $modules[] = 'PLL_Settings_Share_Slug'; + return $modules; + } + ); +} diff --git a/wp-content/plugins/polylang/modules/share-slug/settings-share-slug.php b/wp-content/plugins/polylang/modules/share-slug/settings-share-slug.php new file mode 100644 index 00000000..023990b9 --- /dev/null +++ b/wp-content/plugins/polylang/modules/share-slug/settings-share-slug.php @@ -0,0 +1,95 @@ + 'share-slugs', + 'title' => __( 'Share slugs', 'polylang' ), + 'description' => __( 'Allows to share the same url slug across languages for posts and terms.', 'polylang' ), + ) + ); + + if ( class_exists( 'PLL_Share_Post_Slug', true ) && get_option( 'permalink_structure' ) ) { + add_action( 'admin_print_footer_scripts', array( $this, 'print_js' ) ); + } + } + + /** + * Tells if the module is active + * + * @since 1.9 + * + * @return bool + */ + public function is_active() { + return class_exists( 'PLL_Share_Post_Slug', true ) && $this->options['force_lang'] && get_option( 'permalink_structure' ); + } + + /** + * Displays upgrade message + * + * @since 1.9 + * + * @return string + */ + public function get_upgrade_message() { + return class_exists( 'PLL_Share_Post_Slug', true ) ? '' : $this->default_upgrade_message(); + } + + /** + * Displays the javascript to handle dynamically the change in url modifications + * as sharing slugs is not possible when the language is set from the content + * + * @since 1.9 + */ + public function print_js() { + wp_enqueue_script( 'jquery' ); + + $activated = sprintf( '%s', $this->action_links['activated'] ); + $deactivated = sprintf( '%s', $this->action_links['deactivated'] ); + + ?> + + model = &$polylang->model; + $this->static_pages = &$polylang->static_pages; + + // Information tab. + add_filter( 'debug_information', array( $this, 'info_options' ), 15 ); + add_filter( 'debug_information', array( $this, 'info_languages' ), 15 ); + + // Tests Tab. + add_filter( 'site_status_tests', array( $this, 'status_tests' ) ); + } + + /** + * Returns a list of keys to exclude from the site health information. + * + * @since 2.8 + * + * @return array List of option keys to ignore. + */ + protected function exclude_options_keys() { + return array( + 'uninstall', + 'first_activation', + ); + } + + /** + * Returns a list of keys to exclude from the site health information. + * + * @since 2.8 + * + * @return array List of language keys to ignore. + */ + protected function exclude_language_keys() { + return array( + 'flag', + 'host', + 'taxonomy', + 'description', + 'parent', + 'filter', + 'custom_flag', + ); + } + + /** + * Formats an array with language as keys to display in options information. + * + * @since 2.8 + * + * @param array $array An array with language as keys. + * @return string + */ + protected function format_array_with_languages( $array ) { + array_walk( + $array, + function ( &$value, $key ) { + $value = "$key => $value"; + } + ); + + return implode( ' | ', $array ); + } + + /** + * Add Polylang Options to Site Health Informations tab. + * + * @since 2.8 + * + * @param array $debug_info The debug information to be added to the core information page. + * @return array + */ + public function info_options( $debug_info ) { + $fields = array(); + foreach ( $this->model->options as $key => $value ) { + if ( in_array( $key, $this->exclude_options_keys() ) ) { + continue; + } + + if ( ! is_array( $value ) ) { + if ( empty( $value ) ) { + $value = '0'; + } + + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = $value; + } elseif ( empty( $value ) ) { + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = '0'; + } else { + switch ( $key ) { + case 'post_types': + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = implode( ', ', $this->model->get_translated_post_types() ); + break; + case 'taxonomies': + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = implode( ', ', $this->model->get_translated_taxonomies() ); + break; + case 'domains': + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = $this->format_array_with_languages( $value ); + break; + case 'nav_menus': + $current_theme = get_stylesheet(); + if ( isset( $value[ $current_theme ] ) ) { + foreach ( $value[ $current_theme ] as $location => $lang ) { + /* translators: placeholder is the menu location name */ + $fields[ $location ]['label'] = sprintf( 'menu: %s', $location ); + $fields[ $location ]['value'] = $this->format_array_with_languages( $lang ); + } + } + break; + case 'media': + foreach ( $value as $sub_key => $sub_value ) { + $fields[ "$key-$sub_key" ]['label'] = "$key $sub_key"; + $fields[ "$key-$sub_key" ]['value'] = $sub_value; + } + break; + default: + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = implode( ', ', $value ); + break; + } + } + } + + $debug_info['pll_options'] = array( + /* translators: placeholder is the plugin name */ + 'label' => sprintf( esc_html__( '%s Options', 'polylang' ), POLYLANG ), + 'fields' => $fields, + ); + + return $debug_info; + } + + /** + * Add Polylang Languages settings to Site Health Informations tab. + * + * @since 2.8 + * + * @param array $debug_info The debug information to be added to the core information page. + * @return array + */ + public function info_languages( $debug_info ) { + foreach ( $this->model->get_languages_list() as $language ) { + $fields = array(); + + foreach ( $language as $key => $value ) { + if ( in_array( $key, $this->exclude_language_keys(), true ) ) { + continue; + } + + if ( empty( $value ) ) { + $value = '0'; + } + + $fields[ $key ]['label'] = $key; + $fields[ $key ]['value'] = $value; + + if ( 'term_group' === $key ) { + $fields[ $key ]['label'] = 'order'; // Changed for readability but not translated as other keys are not. + } + } + + $debug_info[ 'pll_language_' . $language->slug ] = array( + /* translators: placeholder is the language name */ + 'label' => sprintf( esc_html__( 'Language: %s', 'polylang' ), esc_html( $language->name ) ), + /* translators: placeholder is the flag image */ + 'description' => sprintf( esc_html__( 'Flag used in the language switcher: %s', 'polylang' ), $this->get_flag( $language ) ), + 'fields' => $fields, + ); + } + + return $debug_info; + } + + /** + * Returns the flag used in the language switcher. + * + * @since 2.8 + * + * @param object $language Language object. + * @return string + */ + protected function get_flag( $language ) { + $flag = $language->get_display_flag(); + return empty( $flag ) ? '' . esc_html__( 'Undefined', 'polylang' ) . '' : $flag; + } + + /** + * Add a Site Health test on homepage translation. + * + * @since 2.8 + * + * @param array $tests Array with tests declaration data. + * @return array + */ + public function status_tests( $tests ) { + // Add the test only if the homepage displays static page. + if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) ) { + $tests['direct']['pll_homepage'] = array( + 'label' => esc_html__( 'Homepage translated', 'polylang' ), + 'test' => array( $this, 'homepage_test' ), + ); + } + return $tests; + } + + /** + * Test if the home page is translated or not. + * + * @since 2.8 + * + * @return array $result Array with test results. + */ + public function homepage_test() { + $result = array( + 'label' => esc_html__( 'All languages have a translated homepage', 'polylang' ), + 'status' => 'good', + 'badge' => array( + 'label' => POLYLANG, + 'color' => 'blue', + ), + 'description' => sprintf( + '

    %s

    ', + esc_html__( 'It is mandatory to translate the static front page in all languages.', 'polylang' ) + ), + 'actions' => '', + 'test' => 'pll_homepage', + ); + + $message = $this->static_pages->get_must_translate_message(); + + if ( ! empty( $message ) ) { + $result['status'] = 'critical'; + $result['label'] = esc_html__( 'The homepage is not translated in all languages', 'polylang' ); + $result['description'] = sprintf( '

    %s

    ', $message ); + } + return $result; + } +} diff --git a/wp-content/plugins/polylang/modules/site-health/load.php b/wp-content/plugins/polylang/modules/site-health/load.php new file mode 100644 index 00000000..7e89e5fc --- /dev/null +++ b/wp-content/plugins/polylang/modules/site-health/load.php @@ -0,0 +1,14 @@ +model->get_languages_list() ) { + $polylang->site_health = new PLL_Admin_Site_Health( $polylang ); +} diff --git a/wp-content/plugins/polylang/modules/sitemaps/load.php b/wp-content/plugins/polylang/modules/sitemaps/load.php new file mode 100644 index 00000000..bc23dcbf --- /dev/null +++ b/wp-content/plugins/polylang/modules/sitemaps/load.php @@ -0,0 +1,13 @@ +model->get_languages_list() ) { + $polylang->sitemaps = new PLL_Sitemaps( $polylang ); + $polylang->sitemaps->init(); +} diff --git a/wp-content/plugins/polylang/modules/sitemaps/multilingual-sitemaps-provider.php b/wp-content/plugins/polylang/modules/sitemaps/multilingual-sitemaps-provider.php new file mode 100644 index 00000000..431cb44f --- /dev/null +++ b/wp-content/plugins/polylang/modules/sitemaps/multilingual-sitemaps-provider.php @@ -0,0 +1,215 @@ +name = $provider->name; + $this->object_type = $provider->object_type; + + $this->provider = $provider; + $this->links_model = &$links_model; + $this->model = &$links_model->model; + } + + /** + * Gets a URL list for a sitemap. + * + * @since 2.8 + * + * @param int $page_num Page of results. + * @param string $object_subtype Optional. Object subtype name. Default empty. + * @return array Array of URLs for a sitemap. + */ + public function get_url_list( $page_num, $object_subtype = '' ) { + return $this->provider->get_url_list( $page_num, $object_subtype ); + } + + /** + * Gets the max number of pages available for the object type. + * + * @since 2.8 + * + * @param string $object_subtype Optional. Object subtype. Default empty. + * @return int Total number of pages. + */ + public function get_max_num_pages( $object_subtype = '' ) { + return $this->provider->get_max_num_pages( $object_subtype ); + } + + /** + * Filters the query arguments to add the language. + * + * @since 2.8 + * + * @param array $args Sitemap provider WP_Query or WP_Term_Query arguments. + * @return array + */ + public static function query_args( $args ) { + if ( ! empty( self::$filter_lang ) ) { + $args['lang'] = self::$filter_lang; + } + return $args; + } + + /** + * Gets data for a given sitemap type. + * + * @since 2.8 + * + * @param string $object_subtype_name Object subtype name if any. + * @param string $lang Optionnal language name. + * @return array + */ + protected function get_sitemap_data( $object_subtype_name, $lang = '' ) { + $object_subtype_name = (string) $object_subtype_name; + + if ( ! empty( $lang ) ) { + self::$filter_lang = $lang; + } + + $return = array( + 'name' => implode( '-', array_filter( array( $object_subtype_name, $lang ) ) ), + 'pages' => $this->get_max_num_pages( $object_subtype_name ), + ); + + self::$filter_lang = ''; + return $return; + } + + /** + * Gets data about each sitemap type. + * + * @since 2.8 + * + * @return array[] Array of sitemap types including object subtype name and number of pages. + */ + public function get_sitemap_type_data() { + $sitemap_data = array(); + + add_filter( 'wp_sitemaps_posts_query_args', array( __CLASS__, 'query_args' ) ); + add_filter( 'wp_sitemaps_taxonomies_query_args', array( __CLASS__, 'query_args' ) ); + + $object_subtypes = $this->get_object_subtypes(); + + if ( empty( $object_subtypes ) ) { + foreach ( $this->model->get_languages_list( array( 'fields' => 'slug' ) ) as $language ) { + $sitemap_data[] = $this->get_sitemap_data( '', $language ); + } + } + + switch ( $this->provider->name ) { + case 'posts': + $func = array( $this->model, 'is_translated_post_type' ); + break; + case 'taxonomies': + $func = array( $this->model, 'is_translated_taxonomy' ); + break; + default: + return $sitemap_data; + } + + foreach ( array_keys( $object_subtypes ) as $object_subtype_name ) { + if ( call_user_func( $func, $object_subtype_name ) ) { + foreach ( $this->model->get_languages_list( array( 'fields' => 'slug' ) ) as $language ) { + $sitemap_data[] = $this->get_sitemap_data( $object_subtype_name, $language ); + } + } else { + $sitemap_data[] = $this->get_sitemap_data( $object_subtype_name ); + } + } + + return $sitemap_data; + } + + /** + * Gets the URL of a sitemap entry. + * + * @since 2.8 + * + * @param string $name The name of the sitemap. + * @param int $page The page of the sitemap. + * @return string The composed URL for a sitemap entry. + */ + public function get_sitemap_url( $name, $page ) { + // Check if a language was added in $name. + $pattern = '#(' . implode( '|', $this->model->get_languages_list( array( 'fields' => 'slug' ) ) ) . ')$#'; + if ( preg_match( $pattern, $name, $matches ) ) { + $lang = $this->model->get_language( $matches[1] ); + $name = preg_replace( '#(-?' . $lang->slug . ')$#', '', $name ); + $url = $this->provider->get_sitemap_url( $name, $page ); + return $this->links_model->add_language_to_link( $url, $lang ); + } + + // If no language is present in $name, we may attempt to get the current sitemap url (e.g. in redirect_canonical() ). + if ( get_query_var( 'lang' ) ) { + $lang = $this->model->get_language( get_query_var( 'lang' ) ); + $url = $this->provider->get_sitemap_url( $name, $page ); + return $this->links_model->add_language_to_link( $url, $lang ); + } + + return $this->provider->get_sitemap_url( $name, $page ); + } + + /** + * Returns the list of supported object subtypes exposed by the provider. + * + * @since 2.8 + * + * @return array List of object subtypes objects keyed by their name. + */ + public function get_object_subtypes() { + return $this->provider->get_object_subtypes(); + } +} diff --git a/wp-content/plugins/polylang/modules/sitemaps/sitemaps.php b/wp-content/plugins/polylang/modules/sitemaps/sitemaps.php new file mode 100644 index 00000000..ca1676a4 --- /dev/null +++ b/wp-content/plugins/polylang/modules/sitemaps/sitemaps.php @@ -0,0 +1,191 @@ +curlang = &$polylang->curlang; + $this->links_model = &$polylang->links_model; + $this->model = &$polylang->model; + $this->options = &$polylang->options; + } + + /** + * Setups actions and filters. + * + * @since 2.8 + */ + public function init() { + add_filter( 'pll_home_url_white_list', array( $this, 'home_url_white_list' ) ); + + if ( $this->options['force_lang'] < 2 ) { + add_filter( 'pll_set_language_from_query', array( $this, 'set_language_from_query' ), 10, 2 ); + add_filter( 'rewrite_rules_array', array( $this, 'rewrite_rules' ) ); + add_filter( 'wp_sitemaps_add_provider', array( $this, 'replace_provider' ) ); + } elseif ( method_exists( $this->links_model, 'site_url' ) ) { + add_filter( 'wp_sitemaps_index_entry', array( $this, 'index_entry' ) ); + add_filter( 'wp_sitemaps_stylesheet_url', array( $this->links_model, 'site_url' ) ); + add_filter( 'wp_sitemaps_stylesheet_index_url', array( $this->links_model, 'site_url' ) ); + add_filter( 'home_url', array( $this, 'sitemap_url' ) ); + } + } + + /** + * Assigns the current language to the default language when the sitemap url + * doesn't include any language. + * + * @since 2.8 + * + * @param string|bool $lang Current language code, false if not set yet. + * @param object $query Main WP query object. + * @return string|bool + */ + public function set_language_from_query( $lang, $query ) { + if ( isset( $query->query['sitemap'] ) && empty( $query->query['lang'] ) ) { + $lang = $this->options['default_lang']; + } + return $lang; + } + + /** + * Whitelists the home url filter for the sitemaps + * + * @since 2.8 + * + * @param array $whitelist White list. + * @return array; + */ + public function home_url_white_list( $whitelist ) { + $whitelist[] = array( 'file' => 'class-wp-sitemaps-posts' ); + return $whitelist; + } + + /** + * Filters the sitemaps rewrite rules to take the languages into account. + * + * @since 2.8 + * + * @param array $rules Rewrite rules. + * @return array + */ + public function rewrite_rules( $rules ) { + global $wp_rewrite; + + $languages = $this->model->get_languages_list( array( 'fields' => 'slug' ) ); + + if ( empty( $languages ) ) { + return $rules; + } + + if ( $this->options['hide_default'] ) { + $languages = array_diff( $languages, array( $this->options['default_lang'] ) ); + } + + $slug = $wp_rewrite->root . ( $this->options['rewrite'] ? '^' : '^language/' ) . '(' . implode( '|', $languages ) . ')/'; + + $newrules = array(); + + foreach ( $rules as $key => $rule ) { + if ( isset( $slug ) && false !== strpos( $rule, 'sitemap=$matches[1]' ) ) { + $newrules[ str_replace( '^wp-sitemap', $slug . 'wp-sitemap', $key ) ] = str_replace( + array( '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '[1]', '?' ), + array( '[9]', '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '?lang=$matches[1]&' ), + $rule + ); // Should be enough! + } + + $newrules[ $key ] = $rule; + } + return $newrules; + } + + /** + * Replaces a sitemap provider by our decorator. + * + * @since 2.8 + * + * @param WP_Sitemaps_Provider $provider Instance of a WP_Sitemaps_Provider. + * @return WP_Sitemaps_Provider + */ + public function replace_provider( $provider ) { + if ( $provider instanceof WP_Sitemaps_Provider ) { + $provider = new PLL_Multilingual_Sitemaps_Provider( $provider, $this->links_model ); + } + return $provider; + } + + /** + * Filters the sitemap index entries for subdomains and multiple domains. + * + * @since 2.8 + * + * @param array $sitemap_entry Sitemap entry for the post. + * return array + */ + public function index_entry( $sitemap_entry ) { + $sitemap_entry['loc'] = $this->links_model->site_url( $sitemap_entry['loc'] ); + return $sitemap_entry; + } + + /** + * Makes sure that the sitemap urls are always evaluated on the current domain. + * + * @since 2.8.4 + * + * @param string $url A sitemap url. + * @return string + */ + public function sitemap_url( $url ) { + if ( false !== strpos( $url, '/wp-sitemap' ) ) { + $url = $this->links_model->site_url( $url ); + } + return $url; + } +} diff --git a/wp-content/plugins/polylang/modules/sync/admin-sync.php b/wp-content/plugins/polylang/modules/sync/admin-sync.php new file mode 100644 index 00000000..65e7bb08 --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/admin-sync.php @@ -0,0 +1,222 @@ +model->post->get_translation( $id, sanitize_key( $_GET['new_lang'] ) ) ) { + $post_parent = $parent; + } + } + return $post_parent; + } + + /** + * Copy menu order, comment, ping status and optionally the date when creating a new tanslation + * + * @since 2.5 + * + * @param array $data An array of slashed post data. + * @return array + */ + public function wp_insert_post_data( $data ) { + if ( isset( $GLOBALS['pagenow'], $_GET['from_post'], $_GET['new_lang'] ) && 'post-new.php' === $GLOBALS['pagenow'] && $this->model->is_translated_post_type( $data['post_type'] ) ) { + check_admin_referer( 'new-post-translation' ); + + $from_post_id = (int) $_GET['from_post']; + $from_post = get_post( $from_post_id ); + + foreach ( array( 'menu_order', 'comment_status', 'ping_status' ) as $property ) { + $data[ $property ] = $from_post->$property; + } + + // Copy the date only if the synchronization is activated + if ( in_array( 'post_date', $this->options['sync'] ) ) { + $data['post_date'] = $from_post->post_date; + $data['post_date_gmt'] = $from_post->post_date_gmt; + } + } + + return $data; + } + + /** + * Copy post metas, and taxonomies when using "Add new" ( translation ) + * + * @since 2.5 + */ + public function new_post_translation() { + global $post; + static $done = array(); + + if ( isset( $GLOBALS['pagenow'], $_GET['from_post'], $_GET['new_lang'] ) && 'post-new.php' === $GLOBALS['pagenow'] && $this->model->is_translated_post_type( $post->post_type ) ) { + check_admin_referer( 'new-post-translation' ); + + // Capability check already done in post-new.php + $from_post_id = (int) $_GET['from_post']; + $lang = $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ); + + if ( ! $from_post_id || ! $lang || ! empty( $done[ $from_post_id ] ) ) { + return; + } + + $done[ $from_post_id ] = true; // Avoid a second duplication in the block editor. Using an array only to allow multiple phpunit tests. + + $this->taxonomies->copy( $from_post_id, $post->ID, $lang->slug ); + $this->post_metas->copy( $from_post_id, $post->ID, $lang->slug ); + + if ( is_sticky( $from_post_id ) ) { + stick_post( $post->ID ); + } + } + } + + /** + * Get post fields to synchronize + * + * @since 2.4 + * + * @param object $post Post object + * @return array + */ + protected function get_fields_to_sync( $post ) { + global $wpdb; + + $postarr = parent::get_fields_to_sync( $post ); + + // For new drafts, save the date now otherwise it is overriden by WP. Thanks to JoryHogeveen. See #32. + if ( in_array( 'post_date', $this->options['sync'] ) && isset( $GLOBALS['pagenow'], $_GET['from_post'], $_GET['new_lang'] ) && 'post-new.php' === $GLOBALS['pagenow'] ) { + check_admin_referer( 'new-post-translation' ); + + unset( $postarr['post_date'] ); + unset( $postarr['post_date_gmt'] ); + + $original = get_post( (int) $_GET['from_post'] ); + $wpdb->update( + $wpdb->posts, + array( + 'post_date' => $original->post_date, + 'post_date_gmt' => $original->post_date_gmt, + ), + array( 'ID' => $post->ID ) + ); + } + + if ( isset( $GLOBALS['post_type'] ) ) { + $post_type = $GLOBALS['post_type']; + } elseif ( isset( $_REQUEST['post_type'] ) ) { + $post_type = sanitize_key( $_REQUEST['post_type'] ); // 2nd case for quick edit + } + + // Make sure not to impact media translations when creating them at the same time as post + if ( in_array( 'post_parent', $this->options['sync'] ) && ( ! isset( $post_type ) || $post_type !== $post->post_type ) ) { + unset( $postarr['post_parent'] ); + } + + return $postarr; + } + + /** + * Synchronizes post fields in translations + * + * @since 1.2 + * + * @param int $post_id post id + * @param object $post post object + * @param array $translations post translations + */ + public function pll_save_post( $post_id, $post, $translations ) { + parent::pll_save_post( $post_id, $post, $translations ); + + // Sticky posts + if ( in_array( 'sticky_posts', $this->options['sync'] ) ) { + $stickies = get_option( 'sticky_posts' ); + if ( isset( $_REQUEST['sticky'] ) && 'sticky' === $_REQUEST['sticky'] ) { // phpcs:ignore WordPress.Security.NonceVerification + $stickies = array_merge( $stickies, array_values( $translations ) ); + } else { + $stickies = array_diff( $stickies, array_values( $translations ) ); + } + update_option( 'sticky_posts', array_unique( $stickies ) ); + } + } + + /** + * Some backward compatibility with Polylang < 2.3 + * allows to call PLL()->sync->copy_post_metas() and PLL()->sync->copy_taxonomies() + * used for example in Polylang for WooCommerce + * the compatibility is however only partial as the 4th argument $sync is lost + * + * @since 2.3 + * + * @param string $func Function name + * @param array $args Function arguments + */ + public function __call( $func, $args ) { + $obj = substr( $func, 5 ); + + if ( is_object( $this->$obj ) && method_exists( $this->$obj, 'copy' ) ) { + if ( WP_DEBUG ) { + $debug = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + $i = 1 + empty( $debug[1]['line'] ); // The file and line are in $debug[2] if the function was called using call_user_func + + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + '%1$s was called incorrectly in %3$s on line %4$s: the call to PLL()->sync->%1$s() has been deprecated in Polylang 2.3, use PLL()->sync->%2$s->copy() instead.' . "\nError handler", + esc_html( $func ), + esc_html( $obj ), + esc_html( $debug[ $i ]['file'] ), + absint( $debug[ $i ]['line'] ) + ) + ); + } + return call_user_func_array( array( $this->$obj, 'copy' ), $args ); + } + + $debug = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions + trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions + sprintf( + 'Call to undefined function PLL()->sync->%1$s() in %2$s on line %3$s' . "\nError handler", + esc_html( $func ), + esc_html( $debug[0]['file'] ), + absint( $debug[0]['line'] ) + ), + E_USER_ERROR + ); + } +} diff --git a/wp-content/plugins/polylang/modules/sync/load.php b/wp-content/plugins/polylang/modules/sync/load.php new file mode 100644 index 00000000..96a155ea --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/load.php @@ -0,0 +1,26 @@ +model->get_languages_list() ) { + if ( $polylang instanceof PLL_Admin_Base ) { + $polylang->sync = new PLL_Admin_Sync( $polylang ); + } else { + $polylang->sync = new PLL_Sync( $polylang ); + } + + add_filter( + 'pll_settings_modules', + function( $modules ) { + $modules[] = 'PLL_Settings_Sync'; + return $modules; + } + ); +} diff --git a/wp-content/plugins/polylang/modules/sync/settings-sync.php b/wp-content/plugins/polylang/modules/sync/settings-sync.php new file mode 100644 index 00000000..1f0b5577 --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/settings-sync.php @@ -0,0 +1,114 @@ + 'sync', + 'title' => __( 'Synchronization', 'polylang' ), + 'description' => __( 'The synchronization options allow to maintain exact same values (or translations in the case of taxonomies and page parent) of meta content between the translations of a post or page.', 'polylang' ), + ) + ); + } + + /** + * Deactivates the module + * + * @since 1.8 + */ + public function deactivate() { + $this->options['sync'] = array(); + update_option( 'polylang', $this->options ); + } + + /** + * Displays the settings form + * + * @since 1.8 + */ + protected function form() { + ?> +
      + $str ) { + printf( + '
    • ', + esc_attr( $key ), + checked( in_array( $key, $this->options['sync'] ), true, false ), + esc_html( $str ) + ); + } + ?> +
    + empty( $options['sync'] ) ? array() : array_keys( $options['sync'], 1 ) ); + return $newoptions; // take care to return only validated options + } + + /** + * Get the row actions + * + * @since 1.8 + * + * @return array + */ + protected function get_actions() { + return empty( $this->options['sync'] ) ? array( 'configure' ) : array( 'configure', 'deactivate' ); + } + + /** + * List the post metas to synchronize + * + * @since 1.0 + * + * @return array + */ + public static function list_metas_to_sync() { + return array( + 'taxonomies' => __( 'Taxonomies', 'polylang' ), + 'post_meta' => __( 'Custom fields', 'polylang' ), + 'comment_status' => __( 'Comment status', 'polylang' ), + 'ping_status' => __( 'Ping status', 'polylang' ), + 'sticky_posts' => __( 'Sticky posts', 'polylang' ), + 'post_date' => __( 'Published date', 'polylang' ), + 'post_format' => __( 'Post format', 'polylang' ), + 'post_parent' => __( 'Page parent', 'polylang' ), + '_wp_page_template' => __( 'Page template', 'polylang' ), + 'menu_order' => __( 'Page order', 'polylang' ), + '_thumbnail_id' => __( 'Featured image', 'polylang' ), + ); + } +} diff --git a/wp-content/plugins/polylang/modules/sync/sync-metas.php b/wp-content/plugins/polylang/modules/sync/sync-metas.php new file mode 100644 index 00000000..078ebec9 --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/sync-metas.php @@ -0,0 +1,371 @@ +model = &$polylang->model; + + add_filter( "add_{$this->meta_type}_metadata", array( $this, 'can_synchronize_metadata' ), 1, 3 ); + add_filter( "update_{$this->meta_type}_metadata", array( $this, 'can_synchronize_metadata' ), 1, 3 ); + add_filter( "delete_{$this->meta_type}_metadata", array( $this, 'can_synchronize_metadata' ), 1, 3 ); + + $this->add_all_meta_actions(); + + add_action( "pll_save_{$this->meta_type}", array( $this, 'save_object' ), 10, 3 ); + } + + /** + * Removes "added_{$this->meta_type}_meta" action + * + * @since 2.3 + */ + protected function remove_add_meta_action() { + remove_action( "added_{$this->meta_type}_meta", array( $this, 'add_meta' ), 10, 4 ); + } + + /** + * Removes all meta synchronization actions and filters + * + * @since 2.3 + */ + protected function remove_all_meta_actions() { + $this->remove_add_meta_action(); + + remove_filter( "update_{$this->meta_type}_metadata", array( $this, 'update_metadata' ), 999, 5 ); + remove_action( "update_{$this->meta_type}_meta", array( $this, 'update_meta' ), 10, 4 ); + + remove_action( "delete_{$this->meta_type}_meta", array( $this, 'store_metas_to_sync' ), 10, 2 ); + remove_action( "deleted_{$this->meta_type}_meta", array( $this, 'delete_meta' ), 10, 4 ); + } + + /** + * Adds "added_{$this->meta_type}_meta" action + * + * @since 2.3 + */ + protected function restore_add_meta_action() { + add_action( "added_{$this->meta_type}_meta", array( $this, 'add_meta' ), 10, 4 ); + } + + /** + * Adds meta synchronization actions and filters + * + * @since 2.3 + */ + protected function add_all_meta_actions() { + $this->restore_add_meta_action(); + + add_filter( "update_{$this->meta_type}_metadata", array( $this, 'update_metadata' ), 999, 5 ); // Very late in case a filter prevents the meta to be updated + add_action( "update_{$this->meta_type}_meta", array( $this, 'update_meta' ), 10, 4 ); + + add_action( "delete_{$this->meta_type}_meta", array( $this, 'store_metas_to_sync' ), 10, 2 ); + add_action( "deleted_{$this->meta_type}_meta", array( $this, 'delete_meta' ), 10, 4 ); + } + + /** + * Maybe modify ("translate") a meta value when it is copied or synchronized + * + * @since 2.3 + * + * @param mixed $value Meta value + * @param string $key Meta key + * @param int $from Id of the source + * @param int $to Id of the target + * @param string $lang Language of target + * @return mixed + */ + protected function maybe_translate_value( $value, $key, $from, $to, $lang ) { + /** + * Filter a meta value before is copied or synchronized + * + * @since 2.3 + * + * @param mixed $value Meta value + * @param string $key Meta key + * @param string $lang Language of target + * @param int $from Id of the source + * @param int $to Id of the target + */ + return apply_filters( "pll_translate_{$this->meta_type}_meta", maybe_unserialize( $value ), $key, $lang, $from, $to ); + } + + /** + * Get the custom fields to copy or synchronize + * + * @since 2.3 + * + * @param int $from Id of the post from which we copy informations + * @param int $to Id of the post to which we paste informations + * @param string $lang Language slug + * @param bool $sync True if it is synchronization, false if it is a copy + * @return array List of meta keys + */ + protected function get_metas_to_copy( $from, $to, $lang, $sync = false ) { + /** + * Filter the custom fields to copy or synchronize + * + * @since 0.6 + * @since 1.9.2 The `$from`, `$to`, `$lang` parameters were added. + * + * @param array $keys List of custom fields names + * @param bool $sync True if it is synchronization, false if it is a copy + * @param int $from Id of the post from which we copy informations + * @param int $to Id of the post to which we paste informations + * @param string $lang Language slug + */ + return array_unique( apply_filters( "pll_copy_{$this->meta_type}_metas", array(), $sync, $from, $to, $lang ) ); + } + + /** + * Disallow modifying synchronized meta if the current user can not modify translations + * + * @since 2.6 + * + * @param null|bool $check Whether to allow adding/updating/deleting metadata. + * @param int $id Object ID. + * @param string $meta_key Meta key. + * @return null|bool + */ + public function can_synchronize_metadata( $check, $id, $meta_key ) { + if ( ! $this->model->{$this->meta_type}->current_user_can_synchronize( $id ) ) { + $tr_ids = $this->model->{$this->meta_type}->get_translations( $id ); + + foreach ( $tr_ids as $lang => $tr_id ) { + if ( $tr_id != $id ) { + $to_copy = $this->get_metas_to_copy( $id, $tr_id, $lang, true ); + if ( in_array( $meta_key, $to_copy ) ) { + return false; + } + } + } + } + return $check; + } + + /** + * Synchronize added metas across translations + * + * @since 2.3 + * + * @param int $mid Meta id. + * @param int $id Object ID. + * @param string $meta_key Meta key. + * @param mixed $meta_value Meta value. Must be serializable if non-scalar. + */ + public function add_meta( $mid, $id, $meta_key, $meta_value ) { + static $avoid_recursion = false; + + if ( ! $avoid_recursion ) { + $avoid_recursion = true; + $tr_ids = $this->model->{$this->meta_type}->get_translations( $id ); + + foreach ( $tr_ids as $lang => $tr_id ) { + if ( $tr_id != $id ) { + $to_copy = $this->get_metas_to_copy( $id, $tr_id, $lang, true ); + if ( in_array( $meta_key, $to_copy ) ) { + $meta_value = $this->maybe_translate_value( $meta_value, $meta_key, $id, $tr_id, $lang ); + add_metadata( $this->meta_type, $tr_id, wp_slash( $meta_key ), is_object( $meta_value ) ? $meta_value : wp_slash( $meta_value ) ); + } + } + } + + $avoid_recursion = false; + } + } + + /** + * Stores the previous value when updating metas + * + * @since 2.3 + * + * @param null|bool $r Not used + * @param int $id Object ID. + * @param string $meta_key Meta key. + * @param mixed $meta_value Meta value. Must be serializable if non-scalar. + * @param mixed $prev_value If specified, only update existing metadata entries with the specified value. + * @return null|bool Unchanged + */ + public function update_metadata( $r, $id, $meta_key, $meta_value, $prev_value ) { + if ( null === $r ) { + $hash = md5( "$id|$meta_key|" . maybe_serialize( $meta_value ) ); + $this->prev_value[ $hash ] = $prev_value; + } + return $r; + } + + /** + * Synchronize updated metas across translations + * + * @since 2.3 + * + * @param int $mid Meta id. + * @param int $id Object ID. + * @param string $meta_key Meta key. + * @param mixed $meta_value Meta value. Must be serializable if non-scalar. + */ + public function update_meta( $mid, $id, $meta_key, $meta_value ) { + static $avoid_recursion = false; + + if ( ! $avoid_recursion ) { + $avoid_recursion = true; + $hash = md5( "$id|$meta_key|" . maybe_serialize( $meta_value ) ); + + $prev_meta = get_metadata_by_mid( $this->meta_type, $mid ); + + if ( $prev_meta ) { + $this->remove_add_meta_action(); // We don't want to sync back the new metas + $tr_ids = $this->model->{$this->meta_type}->get_translations( $id ); + + foreach ( $tr_ids as $lang => $tr_id ) { + if ( $tr_id != $id && in_array( $meta_key, $this->get_metas_to_copy( $id, $tr_id, $lang, true ) ) ) { + if ( empty( $this->prev_value[ $hash ] ) || $this->prev_value[ $hash ] === $prev_meta->meta_value ) { + $prev_value = $this->maybe_translate_value( $prev_meta->meta_value, $meta_key, $id, $tr_id, $lang ); + $meta_value = $this->maybe_translate_value( $meta_value, $meta_key, $id, $tr_id, $lang ); + update_metadata( $this->meta_type, $tr_id, wp_slash( $meta_key ), is_object( $meta_value ) ? $meta_value : wp_slash( $meta_value ), $prev_value ); + } + } + } + $this->restore_add_meta_action(); + } + + unset( $this->prev_value[ $hash ] ); + $avoid_recursion = false; + } + } + + /** + * Store metas to synchronize before deleting them + * + * @since 2.3 + * + * @param array $mids Not used + * @param int $id Object ID. + */ + public function store_metas_to_sync( $mids, $id ) { + $tr_ids = $this->model->{$this->meta_type}->get_translations( $id ); + + foreach ( $tr_ids as $lang => $tr_id ) { + $this->to_copy[ $id ][ $tr_id ] = $this->get_metas_to_copy( $id, $tr_id, $lang, true ); + } + } + + /** + * Synchronize deleted meta across translations + * + * @since 2.3 + * + * @param array $mids Not used + * @param int $id Object ID. + * @param string $key Meta key. + * @param mixed $value Meta value. + */ + public function delete_meta( $mids, $id, $key, $value ) { + static $avoid_recursion = false; + + if ( ! $avoid_recursion ) { + $avoid_recursion = true; + + $tr_ids = $this->model->{$this->meta_type}->get_translations( $id ); + + foreach ( $tr_ids as $lang => $tr_id ) { + if ( $tr_id != $id ) { + if ( in_array( $key, $this->to_copy[ $id ][ $tr_id ] ) ) { + if ( '' !== $value && null !== $value && false !== $value ) { // Same test as WP + $value = $this->maybe_translate_value( $value, $key, $id, $tr_id, $lang ); + } + delete_metadata( $this->meta_type, $tr_id, wp_slash( $key ), is_object( $value ) ? $value : wp_slash( $value ) ); + } + } + } + } + + $avoid_recursion = false; + } + + /** + * Copy or synchronize metas + * + * @since 2.3 + * + * @param int $from Id of the source object + * @param int $to Id of the target object + * @param string $lang Language code of the target object + * @param bool $sync Optional, defaults to true. True if it is synchronization, false if it is a copy + */ + public function copy( $from, $to, $lang, $sync = false ) { + $this->remove_all_meta_actions(); + + remove_action( "delete_{$this->meta_type}_meta", array( $this, 'store_metas_to_sync' ), 10, 2 ); + remove_action( "deleted_{$this->meta_type}_meta", array( $this, 'delete_meta' ), 10, 4 ); + + $to_copy = $this->get_metas_to_copy( $from, $to, $lang, $sync ); + $metas = get_metadata( $this->meta_type, $from ); + $tr_metas = get_metadata( $this->meta_type, $to ); + + foreach ( $to_copy as $key ) { + if ( empty( $metas[ $key ] ) ) { + if ( ! empty( $tr_metas[ $key ] ) ) { + // If the meta key is not present in the source object, delete all values + delete_metadata( $this->meta_type, $to, wp_slash( $key ) ); + } + } else { + if ( ! empty( $tr_metas[ $key ] ) && 1 === count( $metas[ $key ] ) && 1 === count( $tr_metas[ $key ] ) ) { + // One custom field to update + $value = reset( $metas[ $key ] ); + $value = maybe_unserialize( $value ); + $to_value = $this->maybe_translate_value( $value, $key, $from, $to, $lang ); + update_metadata( $this->meta_type, $to, wp_slash( $key ), is_object( $to_value ) ? $to_value : wp_slash( $to_value ) ); + } else { + // Multiple custom fields, either in the source or the target + if ( ! empty( $tr_metas[ $key ] ) ) { + // The synchronization of multiple values custom fields is easier if we delete all metas first + delete_metadata( $this->meta_type, $to, wp_slash( $key ) ); + } + + foreach ( $metas[ $key ] as $value ) { + $value = maybe_unserialize( $value ); + $to_value = $this->maybe_translate_value( $value, $key, $from, $to, $lang ); + add_metadata( $this->meta_type, $to, wp_slash( $key ), is_object( $to_value ) ? $to_value : wp_slash( $to_value ) ); + } + } + } + } + + $this->add_all_meta_actions(); + } + + /** + * If synchronized custom fields were previously not synchronized, it is expected + * that saving a post (or term) will synchronize them. + * + * @since 2.3 + * + * @param int $object_id Id of the object being asaved + * @param object $obj Not used + * @param array $translations The list of translations object ids + */ + public function save_object( $object_id, $obj, $translations ) { + foreach ( $translations as $tr_lang => $tr_id ) { + if ( $tr_id != $object_id ) { + $this->copy( $object_id, $tr_id, $tr_lang, true ); + } + } + } +} diff --git a/wp-content/plugins/polylang/modules/sync/sync-post-metas.php b/wp-content/plugins/polylang/modules/sync/sync-post-metas.php new file mode 100644 index 00000000..54a39b1a --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/sync-post-metas.php @@ -0,0 +1,87 @@ +meta_type = 'post'; + + parent::__construct( $polylang ); + + $this->options = &$polylang->options; + + add_filter( 'pll_translate_post_meta', array( $this, 'translate_thumbnail_id' ), 10, 3 ); + } + + /** + * Get the custom fields to copy or synchronize + * + * @since 2.3 + * + * @param int $from Id of the post from which we copy informations + * @param int $to Id of the post to which we paste informations + * @param string $lang Language slug + * @param bool $sync True if it is synchronization, false if it is a copy + * @return array List of meta keys + */ + protected function get_metas_to_copy( $from, $to, $lang, $sync = false ) { + // Copy or synchronize post metas and allow plugins to do the same + $metas = get_post_custom( $from ); + $keys = array(); + + // Get public meta keys ( including from translated post in case we just deleted a custom field ) + if ( ! $sync || in_array( 'post_meta', $this->options['sync'] ) ) { + foreach ( $keys = array_unique( array_merge( array_keys( $metas ), array_keys( get_post_custom( $to ) ) ) ) as $k => $meta_key ) { + if ( is_protected_meta( $meta_key ) ) { + unset( $keys[ $k ] ); + } + } + } + + // Add page template and featured image + foreach ( array( '_wp_page_template', '_thumbnail_id' ) as $meta ) { + if ( ! $sync || in_array( $meta, $this->options['sync'] ) ) { + $keys[] = $meta; + } + } + + if ( $this->options['media_support'] ) { + $keys[] = '_wp_attached_file'; + $keys[] = '_wp_attachment_metadata'; + $keys[] = '_wp_attachment_backup_sizes'; + $keys[] = '_wp_attachment_is_custom_header'; // Random header image + } + + /** This filter is documented in modules/sync/sync-metas.php */ + return array_unique( apply_filters( 'pll_copy_post_metas', $keys, $sync, $from, $to, $lang ) ); + } + + /** + * Translates the thumbnail id + * + * @since 2.3 + * + * @param int $value Thumbnail id + * @param string $key Meta key + * @param string $lang Language code + * @return int + */ + public function translate_thumbnail_id( $value, $key, $lang ) { + return ( $this->options['media_support'] && '_thumbnail_id' === $key && $to_value = $this->model->post->get_translation( $value, $lang ) ) ? $to_value : $value; + } +} diff --git a/wp-content/plugins/polylang/modules/sync/sync-tax.php b/wp-content/plugins/polylang/modules/sync/sync-tax.php new file mode 100644 index 00000000..b76bd77f --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/sync-tax.php @@ -0,0 +1,290 @@ +model = &$polylang->model; + $this->options = &$polylang->options; + + add_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 5 ); + add_action( 'pll_save_term', array( $this, 'create_term' ), 10, 3 ); + add_action( 'pre_delete_term', array( $this, 'pre_delete_term' ) ); + add_action( 'delete_term', array( $this, 'delete_term' ) ); + } + + /** + * Get the list of taxonomies to copy or to synchronize + * + * @since 1.7 + * @since 2.1 The `$from`, `$to`, `$lang` parameters were added. + * + * @param bool $sync True if it is synchronization, false if it is a copy + * @param int $from Id of the post from which we copy informations, optional, defaults to null + * @param int $to Id of the post to which we paste informations, optional, defaults to null + * @param string $lang Language slug, optional, defaults to null + * @return array List of taxonomy names + */ + protected function get_taxonomies_to_copy( $sync, $from = null, $to = null, $lang = null ) { + $taxonomies = ! $sync || in_array( 'taxonomies', $this->options['sync'] ) ? $this->model->get_translated_taxonomies() : array(); + if ( ! $sync || in_array( 'post_format', $this->options['sync'] ) ) { + $taxonomies[] = 'post_format'; + } + + /** + * Filter the taxonomies to copy or synchronize + * + * @since 1.7 + * @since 2.1 The `$from`, `$to`, `$lang` parameters were added. + * + * @param array $taxonomies List of taxonomy names + * @param bool $sync True if it is synchronization, false if it is a copy + * @param int $from Id of the post from which we copy informations + * @param int $to Id of the post to which we paste informations + * @param string $lang Language slug + */ + return array_unique( apply_filters( 'pll_copy_taxonomies', $taxonomies, $sync, $from, $to, $lang ) ); + } + + /** + * When copying or synchronizing terms, translate terms in translatable taxonomies + * + * @since 2.3 + * + * @param array $object_id Object ID + * @param array $terms List of terms ids assigned to the source post + * @param string $taxonomy Taxonomy name + * @param string $lang Language slug + * @return array List of terms ids to assign to the target post + */ + protected function maybe_translate_terms( $object_id, $terms, $taxonomy, $lang ) { + if ( is_array( $terms ) && $this->model->is_translated_taxonomy( $taxonomy ) ) { + $newterms = array(); + + // Convert to term ids if we got tag names + $strings = array_map( 'is_string', $terms ); + if ( in_array( true, $strings, true ) ) { + $terms = get_the_terms( $object_id, $taxonomy ); + $terms = wp_list_pluck( $terms, 'term_id' ); + } + + foreach ( $terms as $term ) { + /** + * Filter the translated term when a post translation is created or synchronized + * + * @since 2.3 + * + * @param int $tr_term Translated term id + * @param int $term Source term id + * @param string $lang Language slug + */ + if ( $term_id = apply_filters( 'pll_maybe_translate_term', $this->model->term->get_translation( $term, $lang ), $term, $lang ) ) { + $newterms[] = (int) $term_id; // Cast is important otherwise we get 'numeric' tags + } + } + + return $newterms; + } + + return $terms; // Empty $terms or untranslated taxonomy + } + + /** + * Maybe copy taxonomy terms from one post to the other + * + * @since 2.6 + * + * @param int $object_id Source object ID. + * @param int $tr_id Target object ID. + * @param string $lang Target language. + * @param array $terms An array of object terms. + * @param string $taxonomy Taxonomy slug. + * @param bool $append Whether to append new terms to the old terms. + */ + protected function copy_object_terms( $object_id, $tr_id, $lang, $terms, $taxonomy, $append ) { + $to_copy = $this->get_taxonomies_to_copy( true, $object_id, $tr_id, $lang ); + + if ( in_array( $taxonomy, $to_copy ) ) { + $newterms = $this->maybe_translate_terms( $object_id, $terms, $taxonomy, $lang ); + + // For some reasons, the user may have untranslated terms in the translation. Don't forget them. + if ( $this->model->is_translated_taxonomy( $taxonomy ) ) { + $tr_terms = get_the_terms( $tr_id, $taxonomy ); + if ( is_array( $tr_terms ) ) { + foreach ( $tr_terms as $term ) { + if ( ! $this->model->term->get_translation( $term->term_id, $this->model->post->get_language( $object_id ) ) ) { + $newterms[] = (int) $term->term_id; + } + } + } + } + + wp_set_object_terms( $tr_id, $newterms, $taxonomy, $append ); + } + + } + + /** + * When assigning terms to a post, assign translated terms to the translated posts (synchronisation) + * + * @since 2.3 + * + * @param int $object_id Object ID. + * @param array $terms An array of object terms. + * @param array $tt_ids An array of term taxonomy IDs. + * @param string $taxonomy Taxonomy slug. + * @param bool $append Whether to append new terms to the old terms. + */ + public function set_object_terms( $object_id, $terms, $tt_ids, $taxonomy, $append ) { + static $avoid_recursion = false; + $taxonomy_object = get_taxonomy( $taxonomy ); + + // Make sure that the taxonomy is registered for a post type + if ( ! $avoid_recursion && array_filter( $taxonomy_object->object_type, 'post_type_exists' ) ) { + $avoid_recursion = true; + + $tr_ids = $this->model->post->get_translations( $object_id ); + + foreach ( $tr_ids as $lang => $tr_id ) { + if ( $tr_id !== $object_id ) { + if ( $this->model->post->current_user_can_synchronize( $object_id ) ) { + $this->copy_object_terms( $object_id, $tr_id, $lang, $terms, $taxonomy, $append ); + } else { + // No permission to synchronize, so let's synchronize in reverse order + $orig_lang = array_search( $object_id, $tr_ids ); + $tr_terms = get_the_terms( $tr_id, $taxonomy ); + + if ( false === $tr_terms ) { + $tr_terms = array(); + } + + if ( is_array( $tr_terms ) ) { + $tr_terms = wp_list_pluck( $tr_terms, 'term_id' ); + $this->copy_object_terms( $tr_id, $object_id, $orig_lang, $tr_terms, $taxonomy, $append ); + } + break; + } + } + } + + $avoid_recursion = false; + } + } + + /** + * Copy terms fron one post to a translation, does not sync + * + * @since 2.3 + * + * @param int $from Id of the source post + * @param int $to Id of the target post + * @param string $lang Language slug + */ + public function copy( $from, $to, $lang ) { + remove_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 6 ); + + // Get taxonomies to sync for this post type + $taxonomies = array_intersect( get_post_taxonomies( $from ), $this->get_taxonomies_to_copy( false, $from, $to, $lang ) ); + + // Update the term cache to reduce the number of queries in the loop + update_object_term_cache( $from, get_post_type( $from ) ); + + // Copy + foreach ( $taxonomies as $tax ) { + if ( $terms = get_the_terms( $from, $tax ) ) { + $terms = array_map( 'intval', wp_list_pluck( $terms, 'term_id' ) ); + $newterms = $this->maybe_translate_terms( $from, $terms, $tax, $lang ); + + if ( ! empty( $newterms ) ) { + wp_set_object_terms( $to, $newterms, $tax ); + } + } + } + + add_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 6 ); + } + + /** + * When creating a new term, associate it to posts having translations associated to the translated terms + * + * @since 2.3 + * + * @param int $term_id Id of the created term + * @param string $taxonomy Taxonomy + * @param array $translations Ids of the translations of the created term + */ + public function create_term( $term_id, $taxonomy, $translations ) { + if ( doing_action( 'create_term' ) && in_array( $taxonomy, $this->get_taxonomies_to_copy( true ) ) ) { + // Get all posts associated to the translated terms + $tr_posts = get_posts( + array( + 'numberposts' => -1, + 'nopaging' => true, + 'post_type' => 'any', + 'post_status' => 'any', + 'fields' => 'ids', + 'tax_query' => array( + array( + 'taxonomy' => $taxonomy, + 'field' => 'id', + 'terms' => array_merge( array( $term_id ), array_values( $translations ) ), + 'include_children' => false, + ), + ), + ) + ); + + $lang = $this->model->term->get_language( $term_id ); // Language of the created term + $posts = array(); + + foreach ( $tr_posts as $post_id ) { + $post = $this->model->post->get_translation( $post_id, $lang ); + + if ( $post ) { + $posts[] = $post; + } + } + + $posts = array_unique( $posts ); + + foreach ( $posts as $post_id ) { + if ( current_user_can( 'assign_term', $term_id ) ) { + wp_set_object_terms( $post_id, $term_id, $taxonomy, true ); + } + } + } + } + + /** + * Deactivate the synchronization of terms before deleting a term + * to avoid translated terms to be removed from translated posts + * + * @since 2.3.2 + */ + public function pre_delete_term() { + remove_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 5 ); + } + + /** + * Re-activate the synchronization of terms after a term is deleted + * + * @since 2.3.2 + */ + public function delete_term() { + add_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 5 ); + } +} diff --git a/wp-content/plugins/polylang/modules/sync/sync-term-metas.php b/wp-content/plugins/polylang/modules/sync/sync-term-metas.php new file mode 100644 index 00000000..34a8bd18 --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/sync-term-metas.php @@ -0,0 +1,25 @@ +meta_type = 'term'; + + parent::__construct( $polylang ); + } +} diff --git a/wp-content/plugins/polylang/modules/sync/sync.php b/wp-content/plugins/polylang/modules/sync/sync.php new file mode 100644 index 00000000..d03bb8fe --- /dev/null +++ b/wp-content/plugins/polylang/modules/sync/sync.php @@ -0,0 +1,233 @@ +model = &$polylang->model; + $this->options = &$polylang->options; + + $this->taxonomies = new PLL_Sync_Tax( $polylang ); + $this->post_metas = new PLL_Sync_Post_Metas( $polylang ); + $this->term_metas = new PLL_Sync_Term_Metas( $polylang ); + + add_filter( 'wp_insert_post_parent', array( $this, 'can_sync_post_parent' ), 10, 3 ); + add_filter( 'wp_insert_post_data', array( $this, 'can_sync_post_data' ), 10, 2 ); + + add_action( 'pll_save_post', array( $this, 'pll_save_post' ), 10, 3 ); + add_action( 'created_term', array( $this, 'sync_term_parent' ), 10, 3 ); + add_action( 'edited_term', array( $this, 'sync_term_parent' ), 10, 3 ); + + add_action( 'pll_duplicate_term', array( $this->term_metas, 'copy' ), 10, 3 ); + + if ( $this->options['media_support'] ) { + add_action( 'pll_translate_media', array( $this->taxonomies, 'copy' ), 10, 3 ); + add_action( 'pll_translate_media', array( $this->post_metas, 'copy' ), 10, 3 ); + add_action( 'edit_attachment', array( $this, 'edit_attachment' ) ); + } + + add_filter( 'pre_update_option_sticky_posts', array( $this, 'sync_sticky_posts' ), 10, 2 ); + } + + /** + * Get post fields to synchornize + * + * @since 2.4 + * + * @param object $post Post object + * @return array + */ + protected function get_fields_to_sync( $post ) { + $postarr = array(); + + foreach ( array( 'comment_status', 'ping_status', 'menu_order' ) as $property ) { + if ( in_array( $property, $this->options['sync'] ) ) { + $postarr[ $property ] = $post->$property; + } + } + + if ( in_array( 'post_date', $this->options['sync'] ) ) { + $postarr['post_date'] = $post->post_date; + $postarr['post_date_gmt'] = $post->post_date_gmt; + } + + if ( in_array( 'post_parent', $this->options['sync'] ) ) { + $postarr['post_parent'] = wp_get_post_parent_id( $post->ID ); + } + + return $postarr; + } + + /** + * Prevents synchronized post parent modification if the current user hasn't enough rights + * + * @since 2.6 + * + * @param int $post_parent Post parent ID + * @param int $post_id Post ID, unused + * @param array $postarr Array of parsed post data + * @return int + */ + public function can_sync_post_parent( $post_parent, $post_id, $postarr ) { + if ( ! empty( $postarr['ID'] ) && ! $this->model->post->current_user_can_synchronize( $postarr['ID'] ) ) { + $tr_ids = $this->model->post->get_translations( $postarr['ID'] ); + foreach ( $tr_ids as $tr_id ) { + if ( $tr_id !== $postarr['ID'] && $post = get_post( $tr_id ) ) { + $post_parent = $post->post_parent; + break; + } + } + } + return $post_parent; + } + + /** + * Prevents synchronized post data modification if the current user hasn't enough rights + * + * @since 2.6 + * + * @param array $data An array of slashed post data. + * @param array $postarr An array of sanitized, but otherwise unmodified post data. + * @return array + */ + public function can_sync_post_data( $data, $postarr ) { + if ( ! empty( $postarr['ID'] ) && ! $this->model->post->current_user_can_synchronize( $postarr['ID'] ) ) { + foreach ( $this->model->post->get_translations( $postarr['ID'] ) as $tr_id ) { + if ( $tr_id !== $postarr['ID'] && $post = get_post( $tr_id ) ) { + $to_sync = $this->get_fields_to_sync( $post ); + $data = array_merge( $data, $to_sync ); + break; + } + } + } + return $data; + } + + /** + * Synchronizes post fields in translations + * + * @since 2.4 + * + * @param int $post_id post id + * @param object $post post object + * @param array $translations post translations + */ + public function pll_save_post( $post_id, $post, $translations ) { + global $wpdb; + + if ( $this->model->post->current_user_can_synchronize( $post_id ) ) { + $postarr = $this->get_fields_to_sync( $post ); + + if ( ! empty( $postarr ) ) { + foreach ( $translations as $lang => $tr_id ) { + if ( ! $tr_id || $tr_id === $post_id ) { + continue; + } + + $tr_arr = $postarr; + unset( $tr_arr['post_parent'] ); + + // Do not udpate the translation parent if the user set a parent with no translation. + if ( isset( $postarr['post_parent'] ) ) { + $post_parent = $postarr['post_parent'] ? $this->model->post->get_translation( $postarr['post_parent'], $lang ) : 0; + if ( ! ( $postarr['post_parent'] && ! $post_parent ) ) { + $tr_arr['post_parent'] = $post_parent; + } + } + + // Update all the rows at once. + if ( ! empty( $tr_arr ) ) { + // Don't use wp_update_post to avoid infinite loop. + $wpdb->update( $wpdb->posts, $tr_arr, array( 'ID' => $tr_id ) ); + clean_post_cache( $tr_id ); + } + } + } + } + } + + /** + * Synchronize term parent in translations + * Calling clean_term_cache *after* this is mandatory otherwise the $taxonomy_children option is not correctly updated + * + * @since 2.3 + * + * @param int $term_id Term id. + * @param int $tt_id Term taxonomy id, not used. + * @param string $taxonomy Taxonomy name. + */ + public function sync_term_parent( $term_id, $tt_id, $taxonomy ) { + global $wpdb; + + if ( is_taxonomy_hierarchical( $taxonomy ) && $this->model->is_translated_taxonomy( $taxonomy ) ) { + $term = get_term( $term_id ); + $translations = $this->model->term->get_translations( $term_id ); + + foreach ( $translations as $lang => $tr_id ) { + if ( ! empty( $tr_id ) && $tr_id !== $term_id ) { + $tr_parent = $this->model->term->get_translation( $term->parent, $lang ); + $wpdb->update( + $wpdb->term_taxonomy, + array( 'parent' => isset( $tr_parent ) ? $tr_parent : 0 ), + array( 'term_taxonomy_id' => get_term( (int) $tr_id, $taxonomy )->term_taxonomy_id ) + ); + + clean_term_cache( $tr_id, $taxonomy ); // OK since WP 3.9 + } + } + } + } + + /** + * Synchronizes terms and metas in translations for media + * + * @since 1.8 + * + * @param int $post_id post id + */ + public function edit_attachment( $post_id ) { + $this->pll_save_post( $post_id, get_post( $post_id ), $this->model->post->get_translations( $post_id ) ); + } + + /** + * Synchronize sticky posts + * + * @since 2.3 + * + * @param array $value New option value + * @param array $old_value Old option value + * @return array + */ + public function sync_sticky_posts( $value, $old_value ) { + if ( in_array( 'sticky_posts', $this->options['sync'] ) ) { + // Stick post + if ( $sticked = array_diff( $value, $old_value ) ) { + $translations = $this->model->post->get_translations( reset( $sticked ) ); + $value = array_unique( array_merge( $value, array_values( $translations ) ) ); + } + + // Unstick post + if ( $unsticked = array_diff( $old_value, $value ) ) { + $translations = $this->model->post->get_translations( reset( $unsticked ) ); + $value = array_unique( array_diff( $value, array_values( $translations ) ) ); + } + } + + return $value; + } +} diff --git a/wp-content/plugins/polylang/modules/translate-slugs/load.php b/wp-content/plugins/polylang/modules/translate-slugs/load.php new file mode 100644 index 00000000..b6d4802b --- /dev/null +++ b/wp-content/plugins/polylang/modules/translate-slugs/load.php @@ -0,0 +1,20 @@ +model->get_languages_list() ) { + add_filter( + 'pll_settings_modules', + function( $modules ) { + $modules[] = 'PLL_Settings_Translate_Slugs'; + return $modules; + } + ); +} diff --git a/wp-content/plugins/polylang/modules/translate-slugs/settings-translate-slugs.php b/wp-content/plugins/polylang/modules/translate-slugs/settings-translate-slugs.php new file mode 100644 index 00000000..fde395c9 --- /dev/null +++ b/wp-content/plugins/polylang/modules/translate-slugs/settings-translate-slugs.php @@ -0,0 +1,58 @@ + 'translate-slugs', + 'title' => __( 'Translate slugs', 'polylang' ), + 'description' => __( 'Allows to translate custom post types and taxonomies slugs in urls.', 'polylang' ), + ) + ); + } + + /** + * Tells if the module is active + * + * @since 1.9 + * + * @return bool + */ + public function is_active() { + return class_exists( 'PLL_Translate_Slugs_Model', true ) && get_option( 'permalink_structure' ); + } + + /** + * Displays upgrade message + * + * @since 1.9 + * + * @return string + */ + public function get_upgrade_message() { + return class_exists( 'PLL_Translate_Slugs_Model', true ) ? '' : $this->default_upgrade_message(); + } +} diff --git a/wp-content/plugins/polylang/modules/wizard/css/wizard.css b/wp-content/plugins/polylang/modules/wizard/css/wizard.css new file mode 100644 index 00000000..6ba67aa7 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/css/wizard.css @@ -0,0 +1,950 @@ +@charset "UTF-8"; +body { + margin: 65px auto 24px; + box-shadow: none; + background: #f1f1f1; + padding: 0 +} + +#pll-logo { + border: 0; + margin: 0 0 24px; + padding: 0; + text-align: center; + font-family: sans-serif; + font-size: 64px; + text-transform: uppercase; + color: #000; + line-height: normal; +} +#pll-logo a { + display: flex; + justify-content: center; + color: #000; + text-decoration: none; +} + +#pll-logo img { + max-width: 100%; + margin-right: 16px; +} +.rtl #pll-logo img { + margin-right: 0; + margin-left: 16px; +} + +.pll-wizard-footer { + text-align: center +} + +.pll-wizard .select2-container { + text-align: left; + width: auto +} + +.pll-wizard .hidden { + display: none +} + +.pll-wizard-content { + box-shadow: 0 1px 3px rgba(0, 0, 0, .13); + padding: 2em; + margin: 0 0 20px; + background: #fff; + overflow: hidden; + zoom: 1; + text-align: left; +} +.rtl .pll-wizard-content{ + text-align: right; +} + +.pll-wizard-content h1, +.pll-wizard-content h2, +.pll-wizard-content h3, +.pll-wizard-content table { + margin: 0 0 20px; + border: 0; + padding: 0; + color: #666; + clear: none; + font-weight: 500 +} + +.pll-wizard-content p { + margin: 20px 0; + font-size: 1em; + line-height: 1.75em; + color: #666 +} + +.pll-wizard-content table { + font-size: 1em; + line-height: 1.75em; + color: #666; + width: 100%; + margin-top: 20px; +} +.pll-wizard-content table td span{ + display: inline-block; +} + +.pll-wizard-content table caption { + caption-side: bottom; + font-style: italic; + text-align: right; +} +.rtl .pll-wizard-content table caption { + text-align: left; +} + +.pll-wizard-content table caption .icon-default-lang{ + font-style: normal; +} + +.pll-wizard-content a { + color: #a03f3f; +} + +.pll-wizard-content a:focus, +.pll-wizard-content a:hover, +.pll-wizard-footer-links:hover { + color: #dd5454 +} + +.pll-wizard-content .pll-wizard-next-steps { + overflow: hidden; + margin: 0 0 24px; + padding-bottom: 2px +} + +.pll-wizard-content .pll-wizard-next-steps h2 { + margin-bottom: 12px +} + +.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-first { + float: left; + width: 50%; + box-sizing: border-box +} + +.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-last { + float: right; + width: 50%; + box-sizing: border-box +} + +.pll-wizard-content .pll-wizard-next-steps ul { + padding: 0 2em 0 0; + list-style: none outside; + margin: 0 +} + +.pll-wizard-content .pll-wizard-next-steps ul li a { + display: block; + padding: 0 0 .75em +} + +.pll-wizard-content .pll-wizard-next-steps ul li a::before { + color: #82878c; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0 10px 0 0; + top: 1px; + position: relative; + text-decoration: none!important; + vertical-align: top +} + +.pll-wizard-steps { + padding: 0 0 24px; + margin: 0; + list-style: none outside; + overflow: hidden; + color: #ccc; + width: 100%; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: inline-flex +} + +.pll-wizard-steps li { + width: 100%; + float: left; + padding: 0 0 .8em; + margin: 0; + text-align: center; + position: relative; + border-bottom: 4px solid #ccc; + line-height: 1.4em +} + +.pll-wizard-steps li a { + color: #a03f3f; + text-decoration: none; + padding: 1.5em; + margin: -1.5em; + position: relative; + z-index: 1 +} + +.pll-wizard-steps li a:focus, +.pll-wizard-steps li a:hover { + color: #dd5454; + text-decoration: underline +} + +.pll-wizard-steps li::before { + content: ""; + border: 4px solid #ccc; + border-radius: 100%; + width: 4px; + height: 4px; + position: absolute; + bottom: 0; + left: 50%; + margin-left: -6px; + margin-bottom: -8px; + background: #fff +} + +.pll-wizard-steps li.active { + border-color: #a03f3f; + color: #a03f3f; + font-weight: 700 +} + +.pll-wizard-steps li.active::before { + border-color: #a03f3f +} + +.pll-wizard-steps li.done { + border-color: #a03f3f; + color: #a03f3f +} + +.pll-wizard-steps li.done::before { + border-color: #a03f3f; + background: #a03f3f +} + +.pll-wizard .pll-wizard-actions { + overflow: hidden; + margin: 20px 0 0; + position: relative +} + +.pll-wizard .pll-wizard-actions .button { + font-size: 16px; + font-weight: 300; + padding: 1em 2em; + line-height: 1em; + margin-right: .5em; + margin-bottom: 2px; + margin-top: 10px; + height: auto; + border-radius: 4px; + box-shadow: none; + min-width: auto; + border-color: #a03f3f; + color: #a03f3f; +} + +.pll-wizard .pll-wizard-content .button { + border-color: #a03f3f; + color: #a03f3f; +} + +.pll-wizard .pll-wizard-content .button-primary, +.pll-wizard .pll-wizard-actions .button-primary { + background-color: #a03f3f; + border-color: #a03f3f; + color: #fff; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 0 #a03f3f; + text-shadow: 0 -1px 1px #a03f3f, 1px 0 1px #a03f3f, 0 1px 1px #a03f3f, -1px 0 1px #a03f3f; + margin: 0; + opacity: 1 +} + +.pll-wizard .pll-wizard-content .button-small .dashicons { + font-size: 15px; + height: auto; + vertical-align: middle; +} + +.pll-wizard .button-primary:active, +.pll-wizard .button-primary:focus, +.pll-wizard input[type="checkbox"]:focus + label.button-primary, +.pll-wizard .button-primary:hover { + background: #dd5454; + border-color: #dd5454; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 0 #dd5454 +} +.pll-wizard .pll-wizard-actions .button-primary[disabled], +.pll-wizard .pll-wizard-actions .button-primary:disabled, +.pll-wizard .pll-wizard-actions .button-primary.disabled { + cursor: wait; + background-color: #bb5454 !important; + border-color: #bb5454 !important; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 0 #bb5454 !important; + text-shadow: 0 -1px 1px #bb5454, 1px 0 1px #bb5454, 0 1px 1px #bb5454, -1px 0 1px #bb5454 !important; + color: #ffa3a3 !important; +} +.pll-wizard-content p:last-child { + margin-bottom: 0 +} + +.pll-wizard-footer-links { + font-size: .85em; + color: #7b7b7b; + margin: 1.18em auto; + display: inline-block; + text-align: center +} + +.pll-wizard-services { + border: 1px solid #eee; + padding: 0; + margin: 0 0 1em; + list-style: none outside; + border-radius: 4px; + overflow: hidden +} + +.pll-wizard-services p { + margin: 0 0 1em 0; + padding: 0; + font-size: 1em; + line-height: 1.5em +} + +.pll-wizard-service-item { + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + padding: 0; + border-bottom: 1px solid #eee; + color: #666; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center +} + +.media-step .pll-wizard-service-item{ + border: 0; +} + +.media-step .pll-wizard-service-item:last-child{ + display: block; +} + +.media-step .pll-wizard-service-item .pll-wizard-service-enable{ + padding-bottom: 0; +} + +.pll-wizard-service-item:last-child { + border-bottom: 0 +} + +.pll-wizard-service-item .pll-wizard-service-name { + -webkit-flex-basis: 0; + flex-basis: 0; + min-width: 160px; + text-align: center; + font-weight: 700; + padding: 2em 0; + -webkit-align-self: stretch; + align-self: stretch; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: baseline; + -webkit-align-items: baseline; + align-items: baseline +} + +.pll-wizard-service-item .pll-wizard-service-name img { + max-width: 75px +} + +.pll-wizard-service-item .pll-wizard-service-description { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + padding: 20px +} + +.pll-wizard-service-item .pll-wizard-service-example { + padding: 0 20px 20px +} + +.pll-wizard-service-item .pll-wizard-service-example p{ + text-align: right; +} +.rtl .pll-wizard-service-item .pll-wizard-service-example p{ + text-align: left; +} + +.pll-wizard-service-item .pll-wizard-service-description p { + margin-bottom: 1em +} + +.pll-wizard-service-item .pll-wizard-service-description p:last-child { + margin-bottom: 0 +} + +.pll-wizard-service-item .pll-wizard-service-description .pll-wizard-service-settings-description { + display: block; + font-style: italic; + color: #999 +} + +.pll-wizard-service-item .pll-wizard-service-enable { + -webkit-flex-basis: 0; + flex-basis: 0; + min-width: 75px; + text-align: center; + cursor: pointer; + padding: 2em 0; + position: relative; + max-height: 1.5em; + -webkit-align-self: flex-start; + align-self: flex-start; + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + order: 3 +} + +.pll-wizard-service-item .pll-wizard-service-toggle { + position: relative +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] { + position:absolute; + opacity: 0; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label { + position: relative; + display: inline-block; + width: 44px; + height: 20px; + border-radius: 10em; + cursor: pointer; + text-indent: -9999px; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:focus + label { + border:1px dashed #777; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::before, +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::after { + content: ''; + position: absolute; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::before { + left: 0; + top: 0; + width: 44px; + height: 20px; + background: #ddd; + border-radius: 10em; + transition: background-color .2s; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::after { + width: 16px; + height: 16px; + transition: all .2s; + border-radius: 50%; + background: #fff; + margin: 2px; + top: 0; + left: 0; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked + label::before { + background:#a03f3f; +} + +.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked + label::after { + right: 0; + left:auto; +} + +.pll-wizard-service-item .pll-wizard-service-settings { + display: none; + margin-top: .75em; + margin-bottom: 0; + cursor: default +} + +.pll-wizard-service-item .pll-wizard-service-settings.hide { + display: none +} + +.pll-wizard-service-item.checked .pll-wizard-service-settings { + display: inline-block +} + +.pll-wizard-service-item.checked .pll-wizard-service-settings.hide { + display: none +} + +.pll-wizard-service-item.closed { + border-bottom: 0 +} + +.step { + text-align: center +} + +.pll-wizard .button .dashicons{ + vertical-align: middle; +} +.rtl .dashicons-arrow-right-alt2:before { + content: "\f341"; +} +.pll-wizard .pll-wizard-actions .button:active, +.pll-wizard .pll-wizard-actions .button:focus, +.pll-wizard .pll-wizard-actions .button:hover { + box-shadow: none +} + +.pll-wizard-next-steps { + border: 1px solid #eee; + border-radius: 4px; + list-style: none; + padding: 0 +} + +.pll-wizard-next-steps li { + padding: 0 +} + +.pll-wizard-next-steps .pll-wizard-next-step-item { + display: -webkit-box; + display: -webkit-flex; + display: flex; + border-top: 1px solid #eee +} + +.pll-wizard-next-steps .pll-wizard-next-step-item.no-border, +.pll-wizard-next-steps .pll-wizard-next-step-item:first-child { + border-top: 0 +} + +.pll-wizard-next-steps .pll-wizard-next-step-description { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + margin: 1.5em +} + +.pll-wizard-next-steps .pll-wizard-next-step-action { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + flex-grow: 0; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center +} + +.pll-wizard-next-steps .pll-wizard-next-step-action .button { + margin: 1em 1.5em +} + +.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-description, +.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-actions, +.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-action .button{ + margin-top: 0; +} + + +.pll-wizard-next-steps p.next-step-heading { + margin: 0; + font-size: .95em; + font-weight: 400; + font-variant: all-petite-caps +} + +.pll-wizard-next-steps p.next-step-extra-info { + margin: 0 +} + +.pll-wizard-next-steps h3.next-step-description { + margin: 0; + font-size: 16px; + font-weight: 600; +} + +.pll-wizard-next-steps .pll-wizard-additional-steps { + border-top: 1px solid #eee; +} + +.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-next-step-description { + margin-bottom: 0 +} + +.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions { + margin: 0 0 1.5em 0; +} + +.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button { + font-size: 15px; + margin: 1em 0 1em 1.5em; +} +.rtl .pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button { + margin: 1em 1.5em 1em 0; +} + +.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button::last-child { + margin-right: 1.5em; +} + +.pll-wizard-content img{ + max-width: 100%; + margin-right: 0.5em; +} +.rtl .pll-wizard-content img{ + margin-left: 0.5em; +} + +.pll-wizard-content .form-field label{ + margin-bottom: 5px; + display: block; +} + +.pll-wizard-content .form-field select{ + padding: 3px; +} + +.pll-wizard-content .languages-step select, +.pll-wizard-content .untranslated-contents-step select{ + width: 100%; +} + +.languages-step .form-field .button{ + margin-left: 15px; +} +.languages-step .form-field .button > span{ + margin-right: 0.3em; +} +.rtl .languages-step .form-field .button{ + margin-left: 0; + margin-right: 15px; +} +.rtl .languages-step .form-field .button > span{ + margin-left: 0.3em; + margin-right: 0; +} + +.pll-wizard-content .languages-step .select-language-field{ + display: flex; +} + +.pll-wizard-content #languages{ + display: none; +} +.pll-wizard-content #languages tr th:first-child{ + width: 80%; +} +.pll-wizard-content #languages .dashicons{ + color: #a03f3f; +} +.pll-wizard-content #languages img{ + margin-right: 5px; +} +.pll-wizard-content .error{ + color: #a03f3f; + font-weight: bold; +} +.pll-wizard-content #messages .error{ + background: #fccfcf; + padding: 0.5rem; + border: 1px solid #a03f3f; + margin-bottom: 0.5rem; +} + +.pll-wizard-content #slide-toggle{ + position:absolute; + opacity: 0; +} + +.pll-wizard-content #slide-toggle + label{ + position:relative; +} +.pll-wizard-content #slide-toggle + label + span{ + display: block; +} + +.pll-wizard-content #slide-toggle + label .dashicons{ + margin-right: 0.3em; +} +.rtl .pll-wizard-content #slide-toggle + label .dashicons{ + margin-left: 0.3em; + margin-right: 0; +} +.pll-wizard-content #slide-toggle ~ #screenshot > img { + max-height: 500px; + margin-top: 10px; + -webkit-transition: all .5s cubic-bezier(0, 1, 0.5, 1); + transition: all .5s cubic-bezier(0, 1, 0.5, 1); +} +.pll-wizard-content #slide-toggle:checked ~ #screenshot > img { + max-height: 0; +} +.hide { + display: none; +} + +input[type="text"].field-in-error, +input[type="password"].field-in-error, +input[type="checkbox"].field-in-error, +input[type="color"].field-in-error, +input[type="date"].field-in-error, +input[type="datetime"].field-in-error, +input[type="datetime-local"].field-in-error, +input[type="email"].field-in-error, +input[type="month"].field-in-error, +input[type="number"].field-in-error, +input[type="search"].field-in-error, +input[type="radio"].field-in-error, +input[type="tel"].field-in-error, +input[type="text"].field-in-error, +input[type="time"].field-in-error, +input[type="url"].field-in-error, +input[type="week"].field-in-error, +select.field-in-error, +textarea.field-in-error, +span.field-in-error, +.field-in-error{ + border-color: #a03f3f; +} + +input[type="text"].field-in-error:focus, +input[type="password"].field-in-error:focus, +input[type="checkbox"].field-in-error:focus, +input[type="color"].field-in-error:focus, +input[type="date"].field-in-error:focus, +input[type="datetime"].field-in-error:focus, +input[type="datetime-local"].field-in-error:focus, +input[type="email"].field-in-error:focus, +input[type="month"].field-in-error:focus, +input[type="number"].field-in-error:focus, +input[type="search"].field-in-error:focus, +input[type="radio"].field-in-error:focus, +input[type="tel"].field-in-error:focus, +input[type="text"].field-in-error:focus, +input[type="time"].field-in-error:focus, +input[type="url"].field-in-error:focus, +input[type="week"].field-in-error:focus, +select.field-in-error:focus, +textarea.field-in-error:focus, +span.field-in-error:focus, +.field-in-error:focus{ + border: 1px solid #a03f3f; + box-shadow: 0 0 2px rgba(160, 63, 63, 0.8); + outline-color: #a03f3f; + outline-style: auto; + outline-width: thin; +} + +/* override install styles by returning back to forms styles */ +.form-table input.regular-text{ + width: 25em; +} +.form-table input.field-in-error{ + border-color: #a03f3f; +} +#pll-licenses-table td{ + padding: 10px 9px; +} +#pll-licenses-table .license-valid td p{ + min-width: 35em; +} +#pll-licenses-table .pll-deactivate-license{ + margin: 0 0 0 20px; +} +.rtl #pll-licenses-table .pll-deactivate-license{ + margin: 0 10px 0 0; +} +.pll-wizard-content .documentation { + padding: 24px 24px 0; + margin: 0 0 24px; + overflow: hidden; + background: #f5f5f5 +} + +.pll-wizard-content .documentation p { + padding: 0; + margin: 0 0 12px; +} +.documentation-container { + display: -webkit-box; + display: -webkit-flex; + display: flex; + justify-content: flex-end; +} + +.documentation-container .documentation-button-container { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + flex-grow: 0; +} + +.wc-setup .wc-setup-actions .button.documentation-button { + height: 42px; + padding: 0 1em; + margin: 0; +} +#dialog{ + display: none; +} +.pll-wizard .ui-dialog.ui-widget-content{ + max-height: none; +} +.pll-wizard .ui-dialog-title::before{ + content: "\f534"; + font-family: dashicons; + display: inline-block; + line-height: 1; + font-weight: 400; + font-style: normal; + speak: none; + text-decoration: inherit; + text-transform: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 20px; + height: 20px; + font-size: 20px; + vertical-align: middle; + text-align: center; + margin: 0 5px 5px 0; + transition: color 0.1s ease-in; +} +.rtl.pll-wizard .ui-dialog-title::before{ + margin-right: 0; + margin-left: 5px; +} +.pll-wizard .ui-dialog ul{ + list-style: disc; + padding-left: 20px; +} +.rtl.pll-wizard .ui-dialog ul{ + padding-left: 0; + padding-right: 20px; +} +.pll-wizard li{ + margin-bottom: 0; +} +#translations{ + border-collapse: collapse; +} +#translations tbody:nth-child(odd){ + background-color: #f9f9f9; +} +#translations.striped > tbody > :nth-child(odd) { + background-color: transparent; /* Override common WordPress style */ +} +.pll-wizard-content mark{ + background: transparent none; +} +.pll-wizard-content mark{ + color: #7ad03a; +} +@media screen and (max-width: 782px) { + /* Override WordPress button css rules */ + .languages-step .form-field .button{ + font-size: 13px; + line-height: 26px; + height: 28px; + padding: 0 10px 1px; + vertical-align: top; + } + + #pll-licenses-table .pll-deactivate-license{ + margin: 10px 0 5px; + } +} +@media only screen and (max-width:620px) { + /* Override dialog width rule */ + .ui-dialog{ + width: 100% !important; + } + +} +@media only screen and (max-width:500px) { + #pll-logo a, + .select-language-field{ + flex-direction: column; + } + .select-language-field .action-buttons{ + display: flex; + justify-content: flex-end; + } + .languages-step .form-field .button{ + margin: 5px 0 0; + } +} +@media only screen and (max-width:400px) { + #pll-logo { + font-size: 56px; + } + .pll-wizard-steps { + display: none + } + .pll-wizard-service-item { + -webkit-flex-wrap: wrap; + flex-wrap: wrap + } + .pll-wizard-service-item .pll-wizard-service-enable { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + order: 2; + padding: 20px 0 0 + } + .pll-wizard-service-item .pll-wizard-service-description { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + order: 3 + } + .pll-wizard-service-item .pll-wizard-service-name { + padding: 20px 20px 0; + text-align: left; + -webkit-box-pack: justify!important; + -webkit-justify-content: space-between!important; + justify-content: space-between!important + } + .pll-wizard-service-item .pll-wizard-service-name img { + margin: 0 + } + .pll-wizard-next-steps .pll-wizard-next-step-item { + -webkit-flex-wrap: wrap; + flex-wrap: wrap + } + .pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-description { + margin-bottom: 0 + } + .pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-action p { + margin: 0 + } +} +@media only screen and (max-width:360px) { + #pll-logo { + font-size: 48px; + } +} diff --git a/wp-content/plugins/polylang/modules/wizard/css/wizard.min.css b/wp-content/plugins/polylang/modules/wizard/css/wizard.min.css new file mode 100644 index 00000000..37dd9fe7 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/css/wizard.min.css @@ -0,0 +1 @@ +@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#pll-logo{border:0;margin:0 0 24px;padding:0;text-align:center;font-family:sans-serif;font-size:64px;text-transform:uppercase;color:#000;line-height:normal}#pll-logo a{display:flex;justify-content:center;color:#000;text-decoration:none}#pll-logo img{max-width:100%;margin-right:16px}.rtl #pll-logo img{margin-right:0;margin-left:16px}.pll-wizard-footer{text-align:center}.pll-wizard .select2-container{text-align:left;width:auto}.pll-wizard .hidden{display:none}.pll-wizard-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.rtl .pll-wizard-content{text-align:right}.pll-wizard-content h1,.pll-wizard-content h2,.pll-wizard-content h3,.pll-wizard-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.pll-wizard-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.pll-wizard-content table{font-size:1em;line-height:1.75em;color:#666;width:100%;margin-top:20px}.pll-wizard-content table td span{display:inline-block}.pll-wizard-content table caption{caption-side:bottom;font-style:italic;text-align:right}.rtl .pll-wizard-content table caption{text-align:left}.pll-wizard-content table caption .icon-default-lang{font-style:normal}.pll-wizard-content a{color:#a03f3f}.pll-wizard-content a:focus,.pll-wizard-content a:hover,.pll-wizard-footer-links:hover{color:#dd5454}.pll-wizard-content .pll-wizard-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.pll-wizard-content .pll-wizard-next-steps h2{margin-bottom:12px}.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-first{float:left;width:50%;box-sizing:border-box}.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-last{float:right;width:50%;box-sizing:border-box}.pll-wizard-content .pll-wizard-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.pll-wizard-content .pll-wizard-next-steps ul li a{display:block;padding:0 0 .75em}.pll-wizard-content .pll-wizard-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.pll-wizard-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex}.pll-wizard-steps li{width:100%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.pll-wizard-steps li a{color:#a03f3f;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.pll-wizard-steps li a:focus,.pll-wizard-steps li a:hover{color:#dd5454;text-decoration:underline}.pll-wizard-steps li::before{content:"";border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.pll-wizard-steps li.active{border-color:#a03f3f;color:#a03f3f;font-weight:700}.pll-wizard-steps li.active::before{border-color:#a03f3f}.pll-wizard-steps li.done{border-color:#a03f3f;color:#a03f3f}.pll-wizard-steps li.done::before{border-color:#a03f3f;background:#a03f3f}.pll-wizard .pll-wizard-actions{overflow:hidden;margin:20px 0 0;position:relative}.pll-wizard .pll-wizard-actions .button{font-size:16px;font-weight:300;padding:1em 2em;line-height:1em;margin-right:.5em;margin-bottom:2px;margin-top:10px;height:auto;border-radius:4px;box-shadow:none;min-width:auto;border-color:#a03f3f;color:#a03f3f}.pll-wizard .pll-wizard-content .button{border-color:#a03f3f;color:#a03f3f}.pll-wizard .pll-wizard-actions .button-primary,.pll-wizard .pll-wizard-content .button-primary{background-color:#a03f3f;border-color:#a03f3f;color:#fff;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a03f3f;text-shadow:0 -1px 1px #a03f3f,1px 0 1px #a03f3f,0 1px 1px #a03f3f,-1px 0 1px #a03f3f;margin:0;opacity:1}.pll-wizard .pll-wizard-content .button-small .dashicons{font-size:15px;height:auto;vertical-align:middle}.pll-wizard .button-primary:active,.pll-wizard .button-primary:focus,.pll-wizard .button-primary:hover,.pll-wizard input[type=checkbox]:focus+label.button-primary{background:#dd5454;border-color:#dd5454;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #dd5454}.pll-wizard .pll-wizard-actions .button-primary.disabled,.pll-wizard .pll-wizard-actions .button-primary:disabled,.pll-wizard .pll-wizard-actions .button-primary[disabled]{cursor:wait;background-color:#bb5454!important;border-color:#bb5454!important;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #bb5454!important;text-shadow:0 -1px 1px #bb5454,1px 0 1px #bb5454,0 1px 1px #bb5454,-1px 0 1px #bb5454!important;color:#ffa3a3!important}.pll-wizard-content p:last-child{margin-bottom:0}.pll-wizard-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.pll-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.pll-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.pll-wizard-service-item{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.media-step .pll-wizard-service-item{border:0}.media-step .pll-wizard-service-item:last-child{display:block}.media-step .pll-wizard-service-item .pll-wizard-service-enable{padding-bottom:0}.pll-wizard-service-item:last-child{border-bottom:0}.pll-wizard-service-item .pll-wizard-service-name{-webkit-flex-basis:0;flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;-webkit-align-self:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:baseline;-webkit-align-items:baseline;align-items:baseline}.pll-wizard-service-item .pll-wizard-service-name img{max-width:75px}.pll-wizard-service-item .pll-wizard-service-description{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;padding:20px}.pll-wizard-service-item .pll-wizard-service-example{padding:0 20px 20px}.pll-wizard-service-item .pll-wizard-service-example p{text-align:right}.rtl .pll-wizard-service-item .pll-wizard-service-example p{text-align:left}.pll-wizard-service-item .pll-wizard-service-description p{margin-bottom:1em}.pll-wizard-service-item .pll-wizard-service-description p:last-child{margin-bottom:0}.pll-wizard-service-item .pll-wizard-service-description .pll-wizard-service-settings-description{display:block;font-style:italic;color:#999}.pll-wizard-service-item .pll-wizard-service-enable{-webkit-flex-basis:0;flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;-webkit-align-self:flex-start;align-self:flex-start;-webkit-box-ordinal-group:4;-webkit-order:3;order:3}.pll-wizard-service-item .pll-wizard-service-toggle{position:relative}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]{position:absolute;opacity:0}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label{position:relative;display:inline-block;width:44px;height:20px;border-radius:10em;cursor:pointer;text-indent:-9999px}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:focus+label{border:1px dashed #777}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label::after,.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label::before{content:'';position:absolute}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label::before{left:0;top:0;width:44px;height:20px;background:#ddd;border-radius:10em;transition:background-color .2s}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label::after{width:16px;height:16px;transition:all .2s;border-radius:50%;background:#fff;margin:2px;top:0;left:0}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked+label::before{background:#a03f3f}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked+label::after{right:0;left:auto}.pll-wizard-service-item .pll-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.pll-wizard-service-item .pll-wizard-service-settings.hide{display:none}.pll-wizard-service-item.checked .pll-wizard-service-settings{display:inline-block}.pll-wizard-service-item.checked .pll-wizard-service-settings.hide{display:none}.pll-wizard-service-item.closed{border-bottom:0}.step{text-align:center}.pll-wizard .button .dashicons{vertical-align:middle}.rtl .dashicons-arrow-right-alt2:before{content:"\f341"}.pll-wizard .pll-wizard-actions .button:active,.pll-wizard .pll-wizard-actions .button:focus,.pll-wizard .pll-wizard-actions .button:hover{box-shadow:none}.pll-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.pll-wizard-next-steps li{padding:0}.pll-wizard-next-steps .pll-wizard-next-step-item{display:-webkit-box;display:-webkit-flex;display:flex;border-top:1px solid #eee}.pll-wizard-next-steps .pll-wizard-next-step-item.no-border,.pll-wizard-next-steps .pll-wizard-next-step-item:first-child{border-top:0}.pll-wizard-next-steps .pll-wizard-next-step-description{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;margin:1.5em}.pll-wizard-next-steps .pll-wizard-next-step-action{-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.pll-wizard-next-steps .pll-wizard-next-step-action .button{margin:1em 1.5em}.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-actions,.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-action .button,.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-description{margin-top:0}.pll-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.pll-wizard-next-steps p.next-step-extra-info{margin:0}.pll-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.pll-wizard-next-steps .pll-wizard-additional-steps{border-top:1px solid #eee}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-next-step-description{margin-bottom:0}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions{margin:0 0 1.5em 0}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.rtl .pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button{margin:1em 1.5em 1em 0}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button::last-child{margin-right:1.5em}.pll-wizard-content img{max-width:100%;margin-right:.5em}.rtl .pll-wizard-content img{margin-left:.5em}.pll-wizard-content .form-field label{margin-bottom:5px;display:block}.pll-wizard-content .form-field select{padding:3px}.pll-wizard-content .languages-step select,.pll-wizard-content .untranslated-contents-step select{width:100%}.languages-step .form-field .button{margin-left:15px}.languages-step .form-field .button>span{margin-right:.3em}.rtl .languages-step .form-field .button{margin-left:0;margin-right:15px}.rtl .languages-step .form-field .button>span{margin-left:.3em;margin-right:0}.pll-wizard-content .languages-step .select-language-field{display:flex}.pll-wizard-content #languages{display:none}.pll-wizard-content #languages tr th:first-child{width:80%}.pll-wizard-content #languages .dashicons{color:#a03f3f}.pll-wizard-content #languages img{margin-right:5px}.pll-wizard-content .error{color:#a03f3f;font-weight:700}.pll-wizard-content #messages .error{background:#fccfcf;padding:.5rem;border:1px solid #a03f3f;margin-bottom:.5rem}.pll-wizard-content #slide-toggle{position:absolute;opacity:0}.pll-wizard-content #slide-toggle+label{position:relative}.pll-wizard-content #slide-toggle+label+span{display:block}.pll-wizard-content #slide-toggle+label .dashicons{margin-right:.3em}.rtl .pll-wizard-content #slide-toggle+label .dashicons{margin-left:.3em;margin-right:0}.pll-wizard-content #slide-toggle~#screenshot>img{max-height:500px;margin-top:10px;-webkit-transition:all .5s cubic-bezier(0,1,.5,1);transition:all .5s cubic-bezier(0,1,.5,1)}.pll-wizard-content #slide-toggle:checked~#screenshot>img{max-height:0}.hide{display:none}.field-in-error,input[type=checkbox].field-in-error,input[type=color].field-in-error,input[type=date].field-in-error,input[type=datetime-local].field-in-error,input[type=datetime].field-in-error,input[type=email].field-in-error,input[type=month].field-in-error,input[type=number].field-in-error,input[type=password].field-in-error,input[type=radio].field-in-error,input[type=search].field-in-error,input[type=tel].field-in-error,input[type=text].field-in-error,input[type=time].field-in-error,input[type=url].field-in-error,input[type=week].field-in-error,select.field-in-error,span.field-in-error,textarea.field-in-error{border-color:#a03f3f}.field-in-error:focus,input[type=checkbox].field-in-error:focus,input[type=color].field-in-error:focus,input[type=date].field-in-error:focus,input[type=datetime-local].field-in-error:focus,input[type=datetime].field-in-error:focus,input[type=email].field-in-error:focus,input[type=month].field-in-error:focus,input[type=number].field-in-error:focus,input[type=password].field-in-error:focus,input[type=radio].field-in-error:focus,input[type=search].field-in-error:focus,input[type=tel].field-in-error:focus,input[type=text].field-in-error:focus,input[type=time].field-in-error:focus,input[type=url].field-in-error:focus,input[type=week].field-in-error:focus,select.field-in-error:focus,span.field-in-error:focus,textarea.field-in-error:focus{border:1px solid #a03f3f;box-shadow:0 0 2px rgba(160,63,63,.8);outline-color:#a03f3f;outline-style:auto;outline-width:thin}.form-table input.regular-text{width:25em}.form-table input.field-in-error{border-color:#a03f3f}#pll-licenses-table td{padding:10px 9px}#pll-licenses-table .license-valid td p{min-width:35em}#pll-licenses-table .pll-deactivate-license{margin:0 0 0 20px}.rtl #pll-licenses-table .pll-deactivate-license{margin:0 10px 0 0}.pll-wizard-content .documentation{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.pll-wizard-content .documentation p{padding:0;margin:0 0 12px}.documentation-container{display:-webkit-box;display:-webkit-flex;display:flex;justify-content:flex-end}.documentation-container .documentation-button-container{-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.wc-setup .wc-setup-actions .button.documentation-button{height:42px;padding:0 1em;margin:0}#dialog{display:none}.pll-wizard .ui-dialog.ui-widget-content{max-height:none}.pll-wizard .ui-dialog-title::before{content:"\f534";font-family:dashicons;display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px;height:20px;font-size:20px;vertical-align:middle;text-align:center;margin:0 5px 5px 0;transition:color .1s ease-in}.rtl.pll-wizard .ui-dialog-title::before{margin-right:0;margin-left:5px}.pll-wizard .ui-dialog ul{list-style:disc;padding-left:20px}.rtl.pll-wizard .ui-dialog ul{padding-left:0;padding-right:20px}.pll-wizard li{margin-bottom:0}#translations{border-collapse:collapse}#translations tbody:nth-child(odd){background-color:#f9f9f9}#translations.striped>tbody>:nth-child(odd){background-color:transparent}.pll-wizard-content mark{background:transparent none}.pll-wizard-content mark{color:#7ad03a}@media screen and (max-width:782px){.languages-step .form-field .button{font-size:13px;line-height:26px;height:28px;padding:0 10px 1px;vertical-align:top}#pll-licenses-table .pll-deactivate-license{margin:10px 0 5px}}@media only screen and (max-width:620px){.ui-dialog{width:100%!important}}@media only screen and (max-width:500px){#pll-logo a,.select-language-field{flex-direction:column}.select-language-field .action-buttons{display:flex;justify-content:flex-end}.languages-step .form-field .button{margin:5px 0 0}}@media only screen and (max-width:400px){#pll-logo{font-size:56px}.pll-wizard-steps{display:none}.pll-wizard-service-item{-webkit-flex-wrap:wrap;flex-wrap:wrap}.pll-wizard-service-item .pll-wizard-service-enable{-webkit-box-ordinal-group:3;-webkit-order:2;order:2;padding:20px 0 0}.pll-wizard-service-item .pll-wizard-service-description{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}.pll-wizard-service-item .pll-wizard-service-name{padding:20px 20px 0;text-align:left;-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;justify-content:space-between!important}.pll-wizard-service-item .pll-wizard-service-name img{margin:0}.pll-wizard-next-steps .pll-wizard-next-step-item{-webkit-flex-wrap:wrap;flex-wrap:wrap}.pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-description{margin-bottom:0}.pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-action p{margin:0}}@media only screen and (max-width:360px){#pll-logo{font-size:48px}} diff --git a/wp-content/plugins/polylang/modules/wizard/html-wizard-notice.php b/wp-content/plugins/polylang/modules/wizard/html-wizard-notice.php new file mode 100644 index 00000000..5e5f47cc --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/html-wizard-notice.php @@ -0,0 +1,49 @@ + 'mlang_wizard', + ), + admin_url( 'admin.php' ) +); +?> +

    + + + + +

    +

    + + + + +

    diff --git a/wp-content/plugins/polylang/modules/wizard/images/media-screen-rtl.png b/wp-content/plugins/polylang/modules/wizard/images/media-screen-rtl.png new file mode 100644 index 00000000..89f337d5 Binary files /dev/null and b/wp-content/plugins/polylang/modules/wizard/images/media-screen-rtl.png differ diff --git a/wp-content/plugins/polylang/modules/wizard/images/media-screen.png b/wp-content/plugins/polylang/modules/wizard/images/media-screen.png new file mode 100644 index 00000000..d5b5550d Binary files /dev/null and b/wp-content/plugins/polylang/modules/wizard/images/media-screen.png differ diff --git a/wp-content/plugins/polylang/modules/wizard/images/polylang-logo.png b/wp-content/plugins/polylang/modules/wizard/images/polylang-logo.png new file mode 100644 index 00000000..928b0ab1 Binary files /dev/null and b/wp-content/plugins/polylang/modules/wizard/images/polylang-logo.png differ diff --git a/wp-content/plugins/polylang/modules/wizard/js/languages-step.js b/wp-content/plugins/polylang/modules/wizard/js/languages-step.js new file mode 100644 index 00000000..92892ffa --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/js/languages-step.js @@ -0,0 +1,302 @@ +/** + * @package Polylang + */ + +jQuery( + function( $ ) { + var addLanguageForm = $( '.languages-step' ); // Form element. + var languageFields = $( '#language-fields' ); // Element where to append hidden fields for creating language. + var languagesTable = $( '#languages' ); // Table element contains languages list to create. + var languagesListTable = $( '#languages tbody' ); // Table rows with languages list to create. + var definedLanguagesListTable = $( '#defined-languages tbody' ); // Table rows with already defined languages list. + var languagesList = $( '#lang_list' ); // Select form element with predefined languages without already created languages. + var nextStepButton = $( '[name="save_step"]' ); // The button for continuing to the next step. + var messagesContainer = $( '#messages' ); // Element where to display error messages. + var languagesMap = new Map(); // Languages map object for managing the languages to create. + var dialog = $( '#dialog' ); // Dialog box for alerting the language selected has not been added to the list. + + /** + * Add a language in the list to create it in Polylang settings + * + * @param {object} language The language object + */ + function addLanguage( language ) { + // language properties come from the select dropdown which is built server side and well escaped. + // see template view-wizard-step-languages.php. + var languageValueHtml = $( '' ).text( language.text ).prepend( language.flagUrl ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend + var languageTrashIconHtml = $( '' ) + .append( // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + $( '' ) + .addClass( 'dashicons dashicons-trash' ) + .attr( 'data-language', language.locale ) + .append( // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + $( '' ) + .addClass( 'screen-reader-text' ) + .text( pll_wizard_params.i18n_remove_language_icon ) + ) + ); + // see the comment and the harcoded code above. languageTrashIconHtml and languageValueHtml are safe. + var languageLineHtml = $( '' ).prepend( languageTrashIconHtml ).prepend( languageValueHtml ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend + var languageFieldHtml = $( '' ).attr( + { + type: 'hidden', + name: 'languages[]' + } + ).val( language.locale ); + + languagesList.val( '' ); + languagesList.selectmenu( 'refresh' ); // Refresh jQuery selectmenu widget after changing the value. + + languagesMap.set( language.locale, language ); + + // see above how languageLineHtml is built. + languagesListTable.append( languageLineHtml ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + // Bind click event on trash icon. + languagesListTable.on( + 'click', + 'span[data-language=' + language.locale + ']', + function( event ) { + event.preventDefault(); + // Remove line in languages table. + $( this ).parents( 'tr' ).remove(); + // Remove input field. + var languageField = languageFields.children( 'input[value=' + $( this ).data( 'language' ) + ']' ).remove(); + // If there is no more languages hide languages table. + if ( languagesListTable.children().length <= 0 ) { + languagesTable.hide(); + } + // Remove language from the Map. + languagesMap.delete( $( this ).data( 'language' ) ); + // Hide error message. + hideError(); + } + ); + // see above how languageFieldHtml is built. + // Add hidden input field for posting the form. + languageFields.append( languageFieldHtml ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + + } + + /** + * Display an error message + * + * @param {string} message The message to display + */ + function showError( message ) { + messagesContainer.empty(); + // html is harcoded and use of jQuery text method which is safe to add message value. + // In addition message is i18n value which is initialized server side in PLL_Wizard::add_step_languages and correctly escaped. + messagesContainer.prepend( $( '

    ' ).addClass( 'error' ).text( message ) ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend + } + + /** + * Hide all error messages and fields in error + */ + function hideError() { + messagesContainer.empty(); + addLanguageForm.find( '.error' ).removeClass( 'error field-in-error' ); + } + + /** + * Style the field to indicate where the error is + * + * @param {object} field The jQuery element which is in error + */ + function showFieldInError( field ) { + field.addClass( 'error field-in-error' ); + } + + /** + * Focus on a specific element + * + * @param {object} field The jQuery element which will be focused + */ + function focusOnField( field ) { + field.trigger( 'focus' ); + } + + /** + * Disable a specific button + * + * @param {object} button + */ + function disableButton( button ){ + button.prop( 'disabled', true ); + // Because the button is disabled we need to add the value of the button to ensure it will pass in the request. + addLanguageForm.append( // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append + $( '' ).prop( + { + type: 'hidden', + name: button.prop( 'name' ), + value: button.prop( 'value' ) + } + ) + ); + } + + /** + * Remove error when a new selection is done in languages list. + */ + languagesList.on( + 'selectmenuchange', + function() { + hideError();; + } + ); + /** + * Bind click event on "Add language" button + */ + $( '#add-language' ).on( + 'click', + function( event ) { + hideError(); + var selectedOption = event.currentTarget.form.lang_list.options[event.currentTarget.form.lang_list.selectedIndex]; + if ( '' !== selectedOption.value && ! languagesMap.has( selectedOption.value ) ) { + addLanguage( + { + locale: selectedOption.value, + text: selectedOption.innerText, + name: $( selectedOption ).data( 'language-name' ), + flagUrl: $( selectedOption ).data( 'flag-html' ) + } + ); + // Show table of languages. + languagesTable.show(); + // Put back the focus on the select language field after clicking on "Add language button". + focusOnField( $( '#lang_list-button' ) ); + } else { + var message = pll_wizard_params.i18n_no_language_selected; + if ( languagesMap.has( selectedOption.value ) ) { + message = pll_wizard_params.i18n_language_already_added; + } + showError( message ); + showFieldInError( languagesList.next( 'span.ui-selectmenu-button' ) ); + focusOnField( $( '#lang_list-button' ) ); + + } + } + ); + + /** + * Bind submit event on "add_lang" form + */ + addLanguageForm.on( + 'submit', + function( event ) { + // Verify if there is at least one language. + var isLanguagesAlreadyDefined = definedLanguagesListTable.children().length > 0; + var selectedLanguage = $( '#lang_list' ).val(); + if ( languagesMap.size <= 0 && ! isLanguagesAlreadyDefined ) { + if ( '' === selectedLanguage ) { + showError( pll_wizard_params.i18n_no_language_added ); + showFieldInError( languagesList.next( 'span.ui-selectmenu-button' ) ); + focusOnField( $( '#lang_list-button' ) ); + } else { + showError( pll_wizard_params.i18n_add_language_needed ); + showFieldInError( languagesList.next( 'span.ui-selectmenu-button' ) ); + focusOnField( $( '#add-language' ) ); // Put the focus on the "Add language" button. + } + return false; + } + // Verify if the language has been added in the list otherwise display a dialog box to confirm what to do. + if ( '' !== selectedLanguage ) { + // Verify we don't add a duplicate language before opening the dialog box otherwise display an error message. + if ( ! languagesMap.has( selectedLanguage ) ) { + dialog.dialog( 'open' ); + } else { + showError( pll_wizard_params.i18n_language_already_added ); + showFieldInError( languagesList.next( 'span.ui-selectmenu-button' ) ); + focusOnField( $( '#lang_list-button' ) ); + } + return false; + } + disableButton( nextStepButton ); + } + ); + + // Is there an error return by PHP ? + var searchParams = new URLSearchParams( document.location.search ); + if ( searchParams.has( 'activate_error' ) ) { + // If the error code exists, display it. + if ( undefined !== pll_wizard_params[ searchParams.get( 'activate_error' ) ] ) { + showError( pll_wizard_params[ searchParams.get( 'activate_error' ) ] ); + } + } + + function confirmDialog( what ) { + switch ( what ) { + case 'yes': + var selectedOption = $( '#lang_list' ).children( ':selected' ); + addLanguage( + { + locale: selectedOption[0].value, + text: selectedOption[0].innerText, + name: $( selectedOption ).data( 'language-name' ), + flagUrl: $( selectedOption ).data( 'flag-html' ) + } + ); + break; + case 'no': + // Empty select form field and submit again the form. + languagesList.val( '' ); + break; + case 'ignore': + } + dialog.dialog( 'close' ); + if ( 'ignore' === what ) { + focusOnField( $( '#lang_list-button' ) ); + } else { + addLanguageForm.submit(); + } + } + + // Initialize dialog box in the case a language is selected but not added in the list. + dialog.dialog( + { + autoOpen: false, + modal: true, + draggable: false, + resizable: false, + title: pll_wizard_params.i18n_dialog_title, + minWidth: 600, + maxWidth: '100%', + open: function( event, ui ) { + // Change dialog box position for rtl language + if ( $( 'body' ).hasClass( 'rtl' ) ) { + $( this ).parent().css( + { + right: $( this ).parent().css( 'left' ), + left: 'auto' + } + ); + } + // Display language name and flag information in dialog box. + $( this ).find( '#dialog-language' ).text( $( '#lang_list' ).children( ':selected' )[0].innerText ); + // language properties come from the select dropdown #lang_list which is built server side and well escaped. + // see template view-wizard-step-languages.php. + $( this ).find( '#dialog-language-flag' ).empty().prepend( $( '#lang_list' ).children( ':selected' ).data( 'flag-html' ) ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend + }, + buttons: [ + { + text: pll_wizard_params.i18n_dialog_yes_button, + click: function( event ) { + confirmDialog( 'yes' ); + } + }, + { + text: pll_wizard_params.i18n_dialog_no_button, + click: function( event ) { + confirmDialog( 'no' ); + } + }, + { + text: pll_wizard_params.i18n_dialog_ignore_button, + click: function( event ) { + confirmDialog( 'ignore' ); + } + } + ] + } + ) + } +); diff --git a/wp-content/plugins/polylang/modules/wizard/js/languages-step.min.js b/wp-content/plugins/polylang/modules/wizard/js/languages-step.min.js new file mode 100644 index 00000000..0682bb14 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/js/languages-step.min.js @@ -0,0 +1 @@ +jQuery(function(a){var e=a(".languages-step"),n=a("#language-fields"),t=a("#languages"),l=a("#languages tbody"),i=a("#defined-languages tbody"),r=a("#lang_list"),d=a('[name="save_step"]'),s=a("#messages"),o=new Map,g=a("#dialog");function u(e){var i=a("").text(e.text).prepend(e.flagUrl),d=a("").append(a("").addClass("dashicons dashicons-trash").attr("data-language",e.locale).append(a("").addClass("screen-reader-text").text(pll_wizard_params.i18n_remove_language_icon))),s=a("").prepend(d).prepend(i),g=a("").attr({type:"hidden",name:"languages[]"}).val(e.locale);r.val(""),r.selectmenu("refresh"),o.set(e.locale,e),l.append(s),l.on("click","span[data-language="+e.locale+"]",function(e){e.preventDefault(),a(this).parents("tr").remove();n.children("input[value="+a(this).data("language")+"]").remove();l.children().length<=0&&t.hide(),o.delete(a(this).data("language")),c()}),n.append(g)}function p(e){s.empty(),s.prepend(a("

    ").addClass("error").text(e))}function c(){s.empty(),e.find(".error").removeClass("error field-in-error")}function _(a){a.addClass("error field-in-error")}function m(a){a.trigger("focus")}r.on("selectmenuchange",function(){c()}),a("#add-language").on("click",function(e){c();var n=e.currentTarget.form.lang_list.options[e.currentTarget.form.lang_list.selectedIndex];if(""===n.value||o.has(n.value)){var l=pll_wizard_params.i18n_no_language_selected;o.has(n.value)&&(l=pll_wizard_params.i18n_language_already_added),p(l),_(r.next("span.ui-selectmenu-button")),m(a("#lang_list-button"))}else u({locale:n.value,text:n.innerText,name:a(n).data("language-name"),flagUrl:a(n).data("flag-html")}),t.show(),m(a("#lang_list-button"))}),e.on("submit",function(n){var t,l=i.children().length>0,s=a("#lang_list").val();return o.size<=0&&!l?(""===s?(p(pll_wizard_params.i18n_no_language_added),_(r.next("span.ui-selectmenu-button")),m(a("#lang_list-button"))):(p(pll_wizard_params.i18n_add_language_needed),_(r.next("span.ui-selectmenu-button")),m(a("#add-language"))),!1):""!==s?(o.has(s)?(p(pll_wizard_params.i18n_language_already_added),_(r.next("span.ui-selectmenu-button")),m(a("#lang_list-button"))):g.dialog("open"),!1):((t=d).prop("disabled",!0),void e.append(a("").prop({type:"hidden",name:t.prop("name"),value:t.prop("value")})))});var h=new URLSearchParams(document.location.search);function f(n){switch(n){case"yes":var t=a("#lang_list").children(":selected");u({locale:t[0].value,text:t[0].innerText,name:a(t).data("language-name"),flagUrl:a(t).data("flag-html")});break;case"no":r.val("")}g.dialog("close"),"ignore"===n?m(a("#lang_list-button")):e.submit()}h.has("activate_error")&&void 0!==pll_wizard_params[h.get("activate_error")]&&p(pll_wizard_params[h.get("activate_error")]),g.dialog({autoOpen:!1,modal:!0,draggable:!1,resizable:!1,title:pll_wizard_params.i18n_dialog_title,minWidth:600,maxWidth:"100%",open:function(e,n){a("body").hasClass("rtl")&&a(this).parent().css({right:a(this).parent().css("left"),left:"auto"}),a(this).find("#dialog-language").text(a("#lang_list").children(":selected")[0].innerText),a(this).find("#dialog-language-flag").empty().prepend(a("#lang_list").children(":selected").data("flag-html"))},buttons:[{text:pll_wizard_params.i18n_dialog_yes_button,click:function(a){f("yes")}},{text:pll_wizard_params.i18n_dialog_no_button,click:function(a){f("no")}},{text:pll_wizard_params.i18n_dialog_ignore_button,click:function(a){f("ignore")}}]})}); diff --git a/wp-content/plugins/polylang/modules/wizard/load.php b/wp-content/plugins/polylang/modules/wizard/load.php new file mode 100644 index 00000000..914e6074 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/load.php @@ -0,0 +1,14 @@ +wizard = new PLL_Wizard( $polylang ); +} diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-page.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-page.php new file mode 100644 index 00000000..e38e3d32 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-page.php @@ -0,0 +1,108 @@ + + +> + + + + + <?php + printf( + /* translators: %s is the plugin name */ + esc_html__( '%s › Setup', 'polylang' ), + esc_html( POLYLANG ) + ); + ?> + + + + steps[ $this->step ]['scripts'] ); ?> + styles, $this->steps[ $this->step ]['styles'] ) ); ?> + + + +

    + + + + +

    +
      + steps as $step_key => $step ) { + $is_completed = array_search( $this->step, array_keys( $this->steps ), true ) > array_search( $step_key, array_keys( $this->steps ), true ); + + if ( $step_key === $this->step ) { + ?> +
    1. + +
    2. + + + +
    3. + +
    4. + +
    +
    +
    step}-step" ); ?>"> + steps[ $this->step ]['view'] ) ) { + call_user_func( $this->steps[ $this->step ]['view'], $this ); + } + ?> + step ) : ?> +

    + +

    + +
    +
    + + + diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-step-home-page.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-home-page.php new file mode 100644 index 00000000..dd607725 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-home-page.php @@ -0,0 +1,135 @@ +model->get_languages_list(); +$default_language = count( $languages ) > 0 ? $this->options['default_lang'] : null; +$home_page_id = get_option( 'page_on_front' ); +$translations = $this->model->post->get_translations( $home_page_id ); +$untranslated_languages = array(); +$home_page = $home_page_id > 0 ? get_post( $home_page_id ) : null; +$home_page_language = $this->model->post->get_language( $home_page_id ); + +foreach ( $languages as $language ) { + if ( ! $this->model->post->get( $home_page_id, $language ) ) { + $untranslated_languages[] = $language; + } +} +?> + + + + + +

    +

    + ' . esc_html( $home_page->post_title ) . '' + ); + ?> +
    + flag . ' ' . esc_html( $home_page_language->name ) . ' ' . esc_html( $home_page_language->locale ) . '' //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ) + ?> +
    + +

    +

    + +

    + + + + + + + + + model->get_language( $lang ); + ?> + + + + + +
    + flag; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo ' ' . esc_html( $language->name ) . ' ' . esc_html( $language->locale ) . ' '; + ?> + slug === $default_language ) : ?> + + + + + + + +
    + + + + + + + = 1 ) : ?> + + + + + + + + + + + + + + + + + + + +
    + + +
    + flag; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo ' ' . esc_html( $lg->name ) . ' ' . esc_html( $lg->locale ) . ' '; + ?> + slug === $default_language ) : ?> + + + + + + + +
    diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-step-languages.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-languages.php new file mode 100644 index 00000000..29688616 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-languages.php @@ -0,0 +1,141 @@ +model->get_languages_list(); +$default_language = count( $existing_languages ) > 0 ? $this->options['default_lang'] : null; + +$languages_list = array_diff_key( + PLL_Settings::get_predefined_languages(), + wp_list_pluck( $existing_languages, 'locale', 'locale' ) +); +?> +
    +

    + +

    +

    + +

    +

    +
    +
    +
    + +
    + +
    + +
    +
    +
    + + + + + + + + + +
    + + + + + + + + + + + ' . "\n", + esc_attr( $lg->locale ), + esc_html( $lg->name ), + $lg->flag, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $default_language === $lg->slug ? ' ' . esc_html__( 'Default language', 'polylang' ) . '' : '' + ); + } + ?> + +
    %3$s%2$s - %1$s %4$s
    + +
    +

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

    +

    + +

    +
      +
    • + ' . esc_html__( 'Yes', 'polylang' ) . '' + ); + ?> +
    • +
    • + ' . esc_html__( 'No', 'polylang' ) . '' + ); + ?> +
    • +
    • + ' . esc_html__( 'Ignore', 'polylang' ) . '' + ); + ?> +
    • +
    +
    diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-step-last.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-last.php new file mode 100644 index 00000000..234fff05 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-last.php @@ -0,0 +1,114 @@ + +

    + +
    +

    +
    +

    + + + +

    +
    +
    + +
      +
    • +
      +

      +

      +

      + +

      +
      +
      +

      + + + +

      +
      +
    • +
    • +
      +

      +

      +

      +
      +
      +

      + + + +

      +
      +
    • + +
    • +
      +

      +

      +

      + +

      +
      +
      +

      + + + +

      +
      +
    • + + +
    • +
      +

      +

      +

      + ' . esc_html__( 'Polylang Business Pack', 'polylang' ) . '' + ); + ?> +

      +
      +
      +

      + + + +

      +
      +
    • + +
    • +
      +

      + + + +

      +
      +
    • +
    diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-step-licenses.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-licenses.php new file mode 100644 index 00000000..e184f32c --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-licenses.php @@ -0,0 +1,38 @@ + +

    + + +

    +

    +
    + +

    + +
    +
    + + + get_form_field(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } + ?> + +
    +
    diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-step-media.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-media.php new file mode 100644 index 00000000..b0aec2db --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-media.php @@ -0,0 +1,62 @@ + +

    +

    + + + +

    +

    + +

    +
      +
    • +
      + + + /> + +
      +
      +

      + +

      +
      +
    • +
    • +
      +

      + + + + + +

      +
      +
    • +
    diff --git a/wp-content/plugins/polylang/modules/wizard/view-wizard-step-untranslated-contents.php b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-untranslated-contents.php new file mode 100644 index 00000000..1f771f6d --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/view-wizard-step-untranslated-contents.php @@ -0,0 +1,38 @@ +model->get_languages_list(); +$default_language = ! empty( $languages_list ) ? $this->options['default_lang'] : ''; +?> +

    +

    +
    +
    + +

    +
    + + +
    diff --git a/wp-content/plugins/polylang/modules/wizard/wizard.php b/wp-content/plugins/polylang/modules/wizard/wizard.php new file mode 100644 index 00000000..e42aec35 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wizard/wizard.php @@ -0,0 +1,798 @@ +options = &$polylang->options; + $this->model = &$polylang->model; + + // Display Wizard page before any other action to ensure displaying it outside the WordPress admin context. + // Hooked on admin_init with priority 40 to ensure PLL_Wizard_Pro is corretly initialized. + add_action( 'admin_init', array( $this, 'setup_wizard_page' ), 40 ); + // Add Wizard submenu. + add_filter( 'pll_settings_tabs', array( $this, 'settings_tabs' ), 10, 1 ); + // Add filter to select screens where to display the notice. + add_filter( 'pll_can_display_notice', array( $this, 'can_display_notice' ), 10, 2 ); + + // Default steps. + add_filter( 'pll_wizard_steps', array( $this, 'add_step_licenses' ), 100 ); + add_filter( 'pll_wizard_steps', array( $this, 'add_step_languages' ), 200 ); + add_filter( 'pll_wizard_steps', array( $this, 'add_step_media' ), 300 ); + add_filter( 'pll_wizard_steps', array( $this, 'add_step_untranslated_contents' ), 400 ); + add_filter( 'pll_wizard_steps', array( $this, 'add_step_home_page' ), 500 ); + add_filter( 'pll_wizard_steps', array( $this, 'add_step_last' ), 999 ); + } + + /** + * Save an activation transient when Polylang is activating to redirect to the wizard + * + * @param bool $network_wide if activated for all sites in the network. + * @since 2.7 + */ + public static function start_wizard( $network_wide ) { + $options = get_option( 'polylang' ); + + if ( wp_doing_ajax() || $network_wide || ! empty( $options ) ) { + return; + } + set_transient( 'pll_activation_redirect', 1, 30 ); + } + + /** + * Redirect to the wizard depending on the context + * + * @since 2.7 + */ + public function redirect_to_wizard() { + if ( get_transient( 'pll_activation_redirect' ) ) { + $do_redirect = true; + if ( ( isset( $_GET['page'] ) && 'mlang_wizard' === sanitize_key( $_GET['page'] ) || isset( $_GET['activate-multi'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + delete_transient( 'pll_activation_redirect' ); + $do_redirect = false; + } + + if ( $do_redirect ) { + wp_safe_redirect( + esc_url_raw( + add_query_arg( + array( + 'page' => 'mlang_wizard', + ), + admin_url( 'admin.php' ) + ) + ) + ); + exit; + } + } + } + + /** + * Add an admin Polylang submenu to access the wizard + * + * @param array $tabs Submenus list. + * @return array Submenus list updated. + * @since 2.7 + */ + public function settings_tabs( $tabs ) { + $tabs['wizard'] = esc_html__( 'Setup', 'polylang' ); + return $tabs; + } + + /** + * Return if the media step is displayable + * + * @param array $languages List of language objects. + * @return bool + * @since 2.7 + */ + public function is_media_step_displayable( $languages ) { + $media = array(); + // If there is no language or only one the media step is displayable. + if ( ! $languages || count( $languages ) < 2 ) { + return true; + } + foreach ( $languages as $language ) { + $media[ $language->slug ] = $this->model->count_posts( + $language, + array( + 'post_type' => array( 'attachment' ), + 'post_status' => 'inherit', + ) + ); + } + return count( array_filter( $media ) ) === 0; + } + + /** + * Check if the licenses step is displayable + * + * @return bool + * @since 2.7 + */ + public function is_licenses_step_displayable() { + $licenses = apply_filters( 'pll_settings_licenses', array() ); + return count( $licenses ) > 0; + } + + /** + * Setup the wizard page + * + * @since 2.7 + */ + public function setup_wizard_page() { + + PLL_Admin_Notices::add_notice( 'wizard', $this->wizard_notice() ); + + $this->redirect_to_wizard(); + if ( ! Polylang::is_wizard() ) { + return; + } + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( esc_html__( 'Sorry, you are not allowed to manage options for this site.', 'polylang' ) ); + } + + // Enqueue scripts and styles especially for the wizard. + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + + $this->steps = apply_filters( 'pll_wizard_steps', $this->steps ); + $step = isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification + + $this->step = $step && array_key_exists( $step, $this->steps ) ? $step : current( array_keys( $this->steps ) ); + + $languages = $this->model->get_languages_list(); + + if ( count( $languages ) === 0 && ! in_array( $this->step, array( 'licenses', 'languages' ) ) ) { + wp_safe_redirect( esc_url_raw( $this->get_step_link( 'languages' ) ) ); + exit; + } + + if ( count( $languages ) > 0 && $this->model->get_objects_with_no_lang( 1 ) && ! in_array( $this->step, array( 'licenses', 'languages', 'media', 'untranslated-contents' ) ) ) { + wp_safe_redirect( esc_url_raw( $this->get_step_link( 'untranslated-contents' ) ) ); + exit; + } + + // Call the handler of the step for going to the next step. + // Be careful nonce verification with check_admin_referer must be done in each handler. + if ( ! empty( $_POST['save_step'] ) && isset( $this->steps[ $this->step ]['handler'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing + call_user_func( $this->steps[ $this->step ]['handler'] ); + } + + $this->display_wizard_page(); + // Ensure nothing is done after including the page. + exit; + } + + /** + * Adds some admin screens where to display the wizard notice + * + * @param bool $can_display_notice Whether the notice can be displayed. + * @param string $notice The notice name. + * @return bool + * @since 2.7 + */ + public function can_display_notice( $can_display_notice, $notice ) { + if ( ! $can_display_notice && 'wizard' === $notice ) { + $screen = get_current_screen(); + $can_display_notice = in_array( + $screen->base, + array( + 'edit', + 'upload', + 'options-general', + ) + ); + } + return $can_display_notice; + } + + /** + * Return html code of the wizard notice + * + * @since 2.7 + */ + public function wizard_notice() { + ob_start(); + include __DIR__ . '/html-wizard-notice.php'; + return ob_get_clean(); + } + + /** + * Display the wizard page + * + * @since 2.7 + */ + public function display_wizard_page() { + set_current_screen(); + include __DIR__ . '/view-wizard-page.php'; + } + + /** + * Enqueue scripts and styles for the wizard + * + * @since 2.7 + */ + public function enqueue_scripts() { + wp_enqueue_style( 'polylang_admin', plugins_url( '/css/admin' . $this->get_suffix() . '.css', POLYLANG_FILE ), array(), POLYLANG_VERSION ); + wp_enqueue_style( 'pll-wizard', plugins_url( '/modules/wizard/css/wizard' . $this->get_suffix() . '.css', POLYLANG_FILE ), array( 'dashicons', 'install', 'common', 'forms' ), POLYLANG_VERSION ); + + $this->styles = array( 'polylang_admin', 'pll-wizard' ); + } + + /** + * Get the suffix to enqueue non minified files in a Debug context + * + * @return string Empty when SCRIPT_DEBUG equal to true + * otherwise .min + * @since 2.7 + */ + public function get_suffix() { + return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + } + + /** + * Get the URL for the step's screen. + * + * @param string $step slug (default: current step). + * @return string URL for the step if it exists. + * Empty string on failure. + * @since 2.7 + */ + public function get_step_link( $step = '' ) { + if ( ! $step ) { + $step = $this->step; + } + + $keys = array_keys( $this->steps ); + + $step_index = array_search( $step, $keys, true ); + if ( false === $step_index ) { + return ''; + } + + return add_query_arg( 'step', $keys[ $step_index ], remove_query_arg( 'activate_error' ) ); + } + + /** + * Get the URL for the next step's screen. + * + * @param string $step slug (default: current step). + * @return string URL for next step if a next step exists. + * Admin URL if it's the last step. + * Empty string on failure. + * @since 2.7 + */ + public function get_next_step_link( $step = '' ) { + if ( ! $step ) { + $step = $this->step; + } + + $keys = array_keys( $this->steps ); + if ( end( $keys ) === $step ) { + return admin_url(); + } + + $step_index = array_search( $step, $keys, true ); + if ( false === $step_index ) { + return ''; + } + + return add_query_arg( 'step', $keys[ $step_index + 1 ], remove_query_arg( 'activate_error' ) ); + } + + /** + * Add licenses step to the wizard + * + * @param array $steps List of steps. + * @return array List of steps updated. + * @since 2.7 + */ + public function add_step_licenses( $steps ) { + // Add ajax action on deactivate button in licenses step. + add_action( 'wp_ajax_pll_deactivate_license', array( $this, 'deactivate_license' ) ); + + wp_enqueue_script( 'pll_admin', plugins_url( '/js/admin' . $this->get_suffix() . '.js', POLYLANG_FILE ), array( 'jquery', 'jquery-ui-selectmenu' ), POLYLANG_VERSION, true ); + wp_localize_script( 'pll_admin', 'pll_dismiss_notice', esc_html__( 'Dismiss this notice.', 'polylang' ) ); + if ( $this->is_licenses_step_displayable() ) { + $steps['licenses'] = array( + 'name' => esc_html__( 'Licenses', 'polylang' ), + 'view' => array( $this, 'display_step_licenses' ), + 'handler' => array( $this, 'save_step_licenses' ), + 'scripts' => array( 'pll_admin' ), // Polylang admin script used by deactivate license button. + 'styles' => array(), + ); + } + return $steps; + } + + /** + * Display the languages step form + * + * @since 2.7 + */ + public function display_step_licenses() { + include __DIR__ . '/view-wizard-step-licenses.php'; + } + + /** + * Execute the languages step + * + * @since 2.7 + */ + public function save_step_licenses() { + check_admin_referer( 'pll-wizard', '_pll_nonce' ); + + $redirect = $this->get_next_step_link(); + $licenses = apply_filters( 'pll_settings_licenses', array() ); + + foreach ( $licenses as $license ) { + if ( ! empty( $_POST['licenses'][ $license->id ] ) ) { + $updated_license = $license->activate_license( sanitize_key( $_POST['licenses'][ $license->id ] ) ); + if ( ! empty( $updated_license->license_data ) && false === $updated_license->license_data->success ) { + // Stay on this step with an error. + $redirect = add_query_arg( + array( + 'step' => $this->step, + 'activate_error' => 'i18n_license_key_error', + ) + ); + } + } + } + + wp_safe_redirect( esc_url_raw( $redirect ) ); + exit; + } + + /** + * Ajax method to deactivate a license + * + * @since 2.7 + */ + public function deactivate_license() { + check_ajax_referer( 'pll-wizard', '_pll_nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( -1 ); + } + + if ( ! isset( $_POST['id'] ) ) { + wp_die( 0 ); + } + + $id = substr( sanitize_text_field( wp_unslash( $_POST['id'] ) ), 11 ); + $licenses = apply_filters( 'pll_settings_licenses', array() ); + $license = $licenses[ $id ]; + $license->deactivate_license(); + + wp_send_json( + array( + 'id' => $id, + 'html' => $license->get_form_field(), + ) + ); + } + + /** + * Add languages step to the wizard + * + * @param array $steps List of steps. + * @return array List of steps updated. + * @since 2.7 + */ + public function add_step_languages( $steps ) { + wp_enqueue_script( 'pll-wizard-language-choice', plugins_url( '/js/admin' . $this->get_suffix() . '.js', POLYLANG_FILE ), array( 'jquery', 'jquery-ui-selectmenu' ), POLYLANG_VERSION, true ); + wp_localize_script( 'pll-wizard-language-choice', 'pll_dismiss_notice', esc_html__( 'Dismiss this notice.', 'polylang' ) ); + wp_register_script( 'pll-wizard-languages', plugins_url( '/modules/wizard/js/languages-step' . $this->get_suffix() . '.js', POLYLANG_FILE ), array( 'jquery', 'jquery-ui-dialog' ), POLYLANG_VERSION, true ); + wp_localize_script( + 'pll-wizard-languages', + 'pll_wizard_params', + array( + 'i18n_no_language_selected' => esc_html__( 'You need to select a language to be added.', 'polylang' ), + 'i18n_language_already_added' => esc_html__( 'You already added this language.', 'polylang' ), + 'i18n_no_language_added' => esc_html__( 'You need to add at least one language.', 'polylang' ), + 'i18n_add_language_needed' => esc_html__( 'You selected a language, however, to be able to continue, you need to add it.', 'polylang' ), + 'i18n_pll_add_language' => esc_html__( 'Impossible to add the language.', 'polylang' ), + 'i18n_pll_invalid_locale' => esc_html__( 'Enter a valid WordPress locale', 'polylang' ), + 'i18n_pll_invalid_slug' => esc_html__( 'The language code contains invalid characters', 'polylang' ), + 'i18n_pll_non_unique_slug' => esc_html__( 'The language code must be unique', 'polylang' ), + 'i18n_pll_invalid_name' => esc_html__( 'The language must have a name', 'polylang' ), + 'i18n_pll_invalid_flag' => esc_html__( 'The flag does not exist', 'polylang' ), + 'i18n_dialog_title' => esc_html__( "A language wasn't added.", 'polylang' ), + 'i18n_dialog_yes_button' => esc_html__( 'Yes', 'polylang' ), + 'i18n_dialog_no_button' => esc_html__( 'No', 'polylang' ), + 'i18n_dialog_ignore_button' => esc_html__( 'Ignore', 'polylang' ), + 'i18n_remove_language_icon' => esc_html__( 'Remove this language', 'polylang' ), + ) + ); + wp_enqueue_script( 'pll-wizard-languages' ); + wp_enqueue_style( 'pll-wizard-selectmenu', plugins_url( '/css/selectmenu' . $this->get_suffix() . '.css', POLYLANG_FILE ), array( 'dashicons', 'install', 'common', 'wp-jquery-ui-dialog' ), POLYLANG_VERSION ); + $steps['languages'] = array( + 'name' => esc_html__( 'Languages', 'polylang' ), + 'view' => array( $this, 'display_step_languages' ), + 'handler' => array( $this, 'save_step_languages' ), + 'scripts' => array( 'pll-wizard-languages', 'pll-wizard-language-choice' ), + 'styles' => array( 'pll-wizard-selectmenu' ), + ); + return $steps; + } + + /** + * Display the languages step form + * + * @since 2.7 + */ + public function display_step_languages() { + include __DIR__ . '/view-wizard-step-languages.php'; + } + + /** + * Execute the languages step + * + * @since 2.7 + */ + public function save_step_languages() { + check_admin_referer( 'pll-wizard', '_pll_nonce' ); + + $existing_languages = $this->model->get_languages_list(); + + $all_languages = include POLYLANG_DIR . '/settings/languages.php'; + $languages = isset( $_POST['languages'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['languages'] ) ) : false; + $saved_languages = array(); + + // If there is no language added or defined. + if ( empty( $languages ) && empty( $existing_languages ) ) { + // Stay on this step with an error. + wp_safe_redirect( + esc_url_raw( + add_query_arg( + array( + 'step' => $this->step, + 'activate_error' => 'i18n_no_language_added', + ) + ) + ) + ); + exit; + } + + // Otherwise process the languages to add or skip the step if no language has been added. + if ( ! empty( $languages ) ) { + require_once ABSPATH . 'wp-admin/includes/translation-install.php'; + // Remove duplicate values. + $languages = array_unique( $languages ); + // For each language add it in Polylang settings. + foreach ( $languages as $locale ) { + $saved_languages = $all_languages[ $locale ]; + + $saved_languages['slug'] = $saved_languages['code']; + $saved_languages['rtl'] = (int) ( 'rtl' === $saved_languages['dir'] ); + $saved_languages['term_group'] = 0; // Default term_group. + + $language_added = $this->model->add_language( $saved_languages ); + + if ( $language_added instanceof WP_Error && array_key_exists( 'pll_non_unique_slug', $language_added->errors ) ) { + // Get the slug from the locale : lowercase and dash instead of underscore. + $saved_languages['slug'] = strtolower( str_replace( '_', '-', $saved_languages['locale'] ) ); + $language_added = $this->model->add_language( $saved_languages ); + } + + if ( $language_added instanceof WP_Error ) { + // Stay on this step with an error. + $error_keys = array_keys( $language_added->errors ); + wp_safe_redirect( + esc_url_raw( + add_query_arg( + array( + 'step' => $this->step, + 'activate_error' => 'i18n_' . reset( $error_keys ), + ) + ) + ) + ); + exit; + } + + if ( 'en_US' !== $locale && current_user_can( 'install_languages' ) ) { + wp_download_language_pack( $locale ); + } + } + } + wp_safe_redirect( esc_url_raw( $this->get_next_step_link() ) ); + exit; + } + + /** + * Add media step to the wizard + * Add media step to the wizard + * + * @param array $steps List of steps. + * @return array List of steps updated. + * @since 2.7 + */ + public function add_step_media( $steps ) { + $languages = $this->model->get_languages_list(); + + if ( $this->is_media_step_displayable( $languages ) ) { + $steps['media'] = array( + 'name' => esc_html__( 'Media', 'polylang' ), + 'view' => array( $this, 'display_step_media' ), + 'handler' => array( $this, 'save_step_media' ), + 'scripts' => array(), + 'styles' => array(), + ); + } + return $steps; + } + + /** + * Display the media step form + * + * @since 2.7 + */ + public function display_step_media() { + include __DIR__ . '/view-wizard-step-media.php'; + } + + /** + * Execute the media step + * + * @since 2.7 + */ + public function save_step_media() { + check_admin_referer( 'pll-wizard', '_pll_nonce' ); + + $media_support = isset( $_POST['media_support'] ) ? sanitize_key( $_POST['media_support'] ) === 'yes' : false; + + $this->options['media_support'] = $media_support; + + update_option( 'polylang', $this->options ); + + wp_safe_redirect( esc_url_raw( $this->get_next_step_link() ) ); + exit; + } + + /** + * Add untranslated contents step to the wizard + * + * @param array $steps List of steps. + * @return array List of steps updated. + * @since 2.7 + */ + public function add_step_untranslated_contents( $steps ) { + if ( ! $this->model->get_languages_list() || $this->model->get_objects_with_no_lang( 1 ) ) { + wp_enqueue_script( 'pll-wizard-language-choice', plugins_url( '/js/admin' . $this->get_suffix() . '.js', POLYLANG_FILE ), array( 'jquery', 'jquery-ui-selectmenu' ), POLYLANG_VERSION, true ); + wp_localize_script( 'pll-wizard-language-choice', 'pll_dismiss_notice', esc_html__( 'Dismiss this notice.', 'polylang' ) ); + wp_enqueue_style( 'pll-wizard-selectmenu', plugins_url( '/css/selectmenu' . $this->get_suffix() . '.css', POLYLANG_FILE ), array( 'dashicons', 'install', 'common' ), POLYLANG_VERSION ); + $steps['untranslated-contents'] = array( + 'name' => esc_html__( 'Content', 'polylang' ), + 'view' => array( $this, 'display_step_untranslated_contents' ), + 'handler' => array( $this, 'save_step_untranslated_contents' ), + 'scripts' => array( 'pll-wizard-language-choice' ), + 'styles' => array( 'pll-wizard-selectmenu' ), + ); + } + return $steps; + } + + /** + * Display the untranslated contents step form + * + * @since 2.7 + */ + public function display_step_untranslated_contents() { + include __DIR__ . '/view-wizard-step-untranslated-contents.php'; + } + + /** + * Execute the untranslated contents step + * + * @since 2.7 + */ + public function save_step_untranslated_contents() { + check_admin_referer( 'pll-wizard', '_pll_nonce' ); + + $lang = isset( $_POST['language'] ) ? sanitize_text_field( wp_unslash( $_POST['language'] ) ) : false; + + if ( empty( $lang ) ) { + $lang = $this->options['default_lang']; + } + + $language = $this->model->get_language( $lang ); + + while ( $nolang = $this->model->get_objects_with_no_lang( 1000 ) ) { + if ( ! empty( $nolang['posts'] ) ) { + $this->model->set_language_in_mass( 'post', $nolang['posts'], $language->slug ); + } + if ( ! empty( $nolang['terms'] ) ) { + $this->model->set_language_in_mass( 'term', $nolang['terms'], $language->slug ); + } + } + + wp_safe_redirect( esc_url_raw( $this->get_next_step_link() ) ); + exit; + } + + /** + * Add home page step to the wizard + * + * @param array $steps List of steps. + * @return array List of steps updated. + * @since 2.7 + */ + public function add_step_home_page( $steps ) { + $languages = $this->model->get_languages_list(); + $home_page_id = get_option( 'page_on_front' ); + + $translations = $this->model->post->get_translations( $home_page_id ); + + if ( $home_page_id > 0 && ( ! $languages || count( $languages ) === 1 || count( $translations ) !== count( $languages ) ) ) { + $steps['home-page'] = array( + 'name' => esc_html__( 'Homepage', 'polylang' ), + 'view' => array( $this, 'display_step_home_page' ), + 'handler' => array( $this, 'save_step_home_page' ), + 'scripts' => array(), + 'styles' => array(), + ); + } + return $steps; + } + + /** + * Display the home page step form + * + * @since 2.7 + */ + public function display_step_home_page() { + include __DIR__ . '/view-wizard-step-home-page.php'; + } + + /** + * Execute the home page step + * + * @since 2.7 + */ + public function save_step_home_page() { + check_admin_referer( 'pll-wizard', '_pll_nonce' ); + + $languages = $this->model->get_languages_list(); + + $default_language = count( $languages ) > 0 ? $this->options['default_lang'] : null; + $home_page = isset( $_POST['home_page'] ) ? sanitize_key( $_POST['home_page'] ) : false; + $home_page_title = isset( $_POST['home_page_title'] ) ? sanitize_text_field( wp_unslash( $_POST['home_page_title'] ) ) : esc_html__( 'Homepage', 'polylang' ); + $home_page_language = isset( $_POST['home_page_language'] ) ? sanitize_key( $_POST['home_page_language'] ) : false; + + $untranslated_languages = isset( $_POST['untranslated_languages'] ) ? array_map( 'sanitize_key', $_POST['untranslated_languages'] ) : array(); + + call_user_func( + apply_filters( 'pll_wizard_create_home_page_translations', array( $this, 'create_home_page_translations' ) ), + $default_language, + $home_page, + $home_page_title, + $home_page_language, + $untranslated_languages + ); + + $this->model->clean_languages_cache(); + + wp_safe_redirect( esc_url_raw( $this->get_next_step_link() ) ); + exit; + } + + /** + * Create home page translations for each language defined. + * + * @since 2.7 + * + * @param string $default_language slug of the default language; null if no default language is defined. + * @param int $home_page post_id of the home page if it's defined, false otherwise. + * @param string $home_page_title home page title if it's defined, 'Homepage' otherwise. + * @param string $home_page_language slug of the home page if it's defined, false otherwise. + * @param array $untranslated_languages array of languages which needs to have a home page translated. + */ + public function create_home_page_translations( $default_language, $home_page, $home_page_title, $home_page_language, $untranslated_languages ) { + $translations = $this->model->post->get_translations( $home_page ); + + foreach ( $untranslated_languages as $language ) { + $language_properties = $this->model->get_language( $language ); + $id = wp_insert_post( + array( + 'post_title' => $home_page_title . ' - ' . $language_properties->name, + 'post_type' => 'page', + 'post_status' => 'publish', + ) + ); + $translations[ $language ] = $id; + pll_set_post_language( $id, $language ); + } + pll_save_post_translations( $translations ); + } + + /** + * Add last step to the wizard + * + * @param array $steps List of steps. + * @return array List of steps updated. + * @since 2.7 + */ + public function add_step_last( $steps ) { + $steps['last'] = array( + 'name' => esc_html__( 'Ready!', 'polylang' ), + 'view' => array( $this, 'display_step_last' ), + 'handler' => array( $this, 'save_step_last' ), + 'scripts' => array(), + 'styles' => array(), + ); + return $steps; + } + + /** + * Display the last step form + * + * @since 2.7 + */ + public function display_step_last() { + // We ran the wizard once. So we can dismiss its notice. + PLL_Admin_Notices::dismiss( 'wizard' ); + include __DIR__ . '/view-wizard-step-last.php'; + } + + /** + * Execute the last step + * + * @since 2.7 + */ + public function save_step_last() { + check_admin_referer( 'pll-wizard', '_pll_nonce' ); + + wp_safe_redirect( esc_url_raw( $this->get_next_step_link() ) ); + exit; + } +} diff --git a/wp-content/plugins/polylang/modules/wpml/load.php b/wp-content/plugins/polylang/modules/wpml/load.php new file mode 100644 index 00000000..7b4d3454 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wpml/load.php @@ -0,0 +1,25 @@ +model->get_languages_list() ) { + if ( ! defined( 'PLL_WPML_COMPAT' ) || PLL_WPML_COMPAT ) { + PLL_WPML_Compat::instance(); // WPML API + PLL_WPML_Config::instance(); // wpml-config.xml + } + + add_filter( + 'pll_settings_modules', + function( $modules ) { + $modules[] = 'PLL_Settings_WPML'; + return $modules; + } + ); +} diff --git a/wp-content/plugins/polylang/modules/wpml/settings-wpml.php b/wp-content/plugins/polylang/modules/wpml/settings-wpml.php new file mode 100644 index 00000000..7d21e8af --- /dev/null +++ b/wp-content/plugins/polylang/modules/wpml/settings-wpml.php @@ -0,0 +1,47 @@ + 'wpml', + 'title' => __( 'WPML compatibility', 'polylang' ), + 'description' => __( 'Polylang\'s WPML compatibility mode', 'polylang' ), + ) + ); + } + + /** + * Tells if the module is active + * + * @since 1.8 + * + * @return bool + */ + public function is_active() { + return ! defined( 'PLL_WPML_COMPAT' ) || PLL_WPML_COMPAT; + } +} diff --git a/wp-content/plugins/polylang/modules/wpml/wpml-api.php b/wp-content/plugins/polylang/modules/wpml/wpml-api.php new file mode 100644 index 00000000..7a410ef5 --- /dev/null +++ b/wp-content/plugins/polylang/modules/wpml/wpml-api.php @@ -0,0 +1,297 @@ + not applicable + add_filter( 'wpml_current_language', 'pll_current_language', 10, 0 ); + add_filter( 'wpml_default_language', 'pll_default_language', 10, 0 ); + // wpml_add_language_selector => not implemented + // wpml_footer_language_selector => not applicable + add_action( 'wpml_add_language_form_field', array( $this, 'wpml_add_language_form_field' ) ); + add_filter( 'wpml_language_is_active', array( $this, 'wpml_language_is_active' ), 10, 2 ); + add_filter( 'wpml_is_rtl', array( $this, 'wpml_is_rtl' ) ); + // wpml_language_form_input_field => See wpml_add_language_form_field + // wpml_language_has_switched => See wpml_switch_language + // wpml_element_trid => not implemented + // wpml_get_element_translations => not implemented + // wpml_language_switcher => not implemented + // wpml_browser_redirect_language_params => not implemented + // wpml_enqueue_browser_redirect_language => not applicable + // wpml_enqueued_browser_redirect_language => not applicable + // wpml_encode_string => not applicable + // wpml_decode_string => not applicable + + // Retrieving Language Information for Content + + add_filter( 'wpml_post_language_details', 'wpml_get_language_information', 10, 2 ); + add_action( 'wpml_switch_language', array( __CLASS__, 'wpml_switch_language' ), 10, 2 ); + add_filter( 'wpml_element_language_code', array( $this, 'wpml_element_language_code' ), 10, 3 ); + // wpml_element_language_details => not applicable + + // Retrieving Localized Content + + add_filter( 'wpml_home_url', 'pll_home_url', 10, 0 ); + add_filter( 'wpml_element_link', 'icl_link_to_element', 10, 7 ); + add_filter( 'wpml_object_id', 'icl_object_id', 10, 4 ); + add_filter( 'wpml_translate_single_string', array( $this, 'wpml_translate_single_string' ), 10, 4 ); + // wpml_translate_string => not applicable + // wpml_unfiltered_admin_string => not implemented + add_filter( 'wpml_permalink', array( $this, 'wpml_permalink' ), 10, 2 ); + // wpml_elements_without_translations => not implemented + add_filter( 'wpml_get_translated_slug', array( $this, 'wpml_get_translated_slug' ), 10, 3 ); + + // Finding the Translation State of Content + + // wpml_element_translation_type => not implemented + add_filter( 'wpml_element_has_translations', array( $this, 'wpml_element_has_translations' ), 10, 3 ); + // wpml_master_post_from_duplicate => not applicable + // wpml_post_duplicates => not applicable + + // Inserting Content + + // wpml_admin_make_post_duplicates => not applicable + // wpml_make_post_duplicates => not applicable + add_action( 'wpml_register_single_string', 'icl_register_string', 10, 3 ); + // wpml_register_string => not applicable + // wpml_register_string_packages => not applicable + // wpml_delete_package_action => not applicable + // wpml_show_package_language_ui => not applicable + // wpml_set_element_language_details => not implemented + // wpml_multilingual_options => not applicable + + // Miscellaneous + + // wpml_element_type => not applicable + // wpml_setting => not applicable + // wpml_sub_setting => not applicable + // wpml_editor_cf_to_display => not applicable + // wpml_tm_save_translation_cf => not implemented + // wpml_tm_xliff_export_translated_cf => not applicable + // wpml_tm_xliff_export_original_cf => not applicable + // wpml_duplicate_generic_string => not applicable + // wpml_translatable_user_meta_fields => not implemented + // wpml_cross_domain_language_data => not applicable + // wpml_get_cross_domain_language_data => not applicable + // wpml_loaded => not applicable + // wpml_st_loaded => not applicable + // wpml_tm_loaded => not applicable + // wpml_hide_management_column (3.4.1) => not applicable + // wpml_ls_directories_to_scan => not applicable + // wpml_ls_model_css_classes => not applicable + // wpml_ls_model_language_css_classes => not applicable + // wpml_tf_feedback_open_link => not applicable + // wpml_sync_custom_field => not implemented + // wpml_sync_all_custom_fields => not implemented + // wpml_is_redirected => not implemented + + // Updating Content + + // wpml_set_translation_mode_for_post_type => not implemented + } + + /** + * Get a list of the languages enabled for a site + * + * @since 2.0 + * + * @param mixed $null Not used + * @param array| string $args See arguments of icl_get_languages() + * @return array Array of arrays per language + */ + public function wpml_active_languages( $null, $args = '' ) { + return icl_get_languages( $args ); + } + + /** + * In WPML, get a language's native and translated name for display in a custom language switcher + * Since Polylang does not implement the translated name, always returns only the native name, + * so the 3rd, 4th and 5th parameters are not used. + * + * @since 2.2 + * + * @param mixed $null Not used. + * @param string $native_name The language native name. + * @return string + */ + public function wpml_display_language_names( $null, $native_name ) { + return $native_name; + } + + /** + * Returns an HTML hidden input field with name=”lang” and as value the current language + * + * @since 2.0 + */ + public function wpml_add_language_form_field() { + $lang = pll_current_language(); + $field = sprintf( '', esc_attr( $lang ) ); + $field = apply_filters( 'wpml_language_form_input_field', $field, $lang ); + echo $field; // phpcs:ignore WordPress.Security.EscapeOutput + } + + /** + * Find out if a specific language is enabled for the site + * + * @since 2.0 + * + * @param mixed $null Not used + * @param string $slug Language code + * @return bool + */ + public function wpml_language_is_active( $null, $slug ) { + $language = PLL()->model->get_language( $slug ); + return empty( $language->active ) || true === $language->active; + } + + /** + * Find out whether the current language text direction is RTL or not + * + * @since 2.0 + * + * @return bool + */ + public function wpml_is_rtl() { + return pll_current_language( 'is_rtl' ); + } + + /** + * Switches whole site to the given language or restores the language that was set when first calling this function. + * Unlike the WPML original action, it is not possible to set the current language and the cookie to different values. + * + * @since 2.7 + * + * @param null|string $lang Language code to switch into, restores the original language if null. + * @param bool|string $cookie Optionally also switches the cookie. + */ + public static function wpml_switch_language( $lang = null, $cookie = false ) { + if ( null === self::$original_language ) { + self::$original_language = PLL()->curlang; + } + + if ( empty( $lang ) ) { + PLL()->curlang = self::$original_language; + } elseif ( 'all' === $lang ) { + PLL()->curlang = null; + } elseif ( in_array( $lang, pll_languages_list() ) ) { + PLL()->curlang = PLL()->model->get_language( $lang ); + } + + if ( $cookie && isset( PLL()->choose_lang ) ) { + PLL()->choose_lang->maybe_setcookie(); + } + + do_action( 'wpml_language_has_switched', $lang, $cookie, self::$original_language ); + } + + /** + * Get the language code for a translatable element + * + * @since 2.0 + * + * @param mixed $language_code + * @param array $args An array with two keys element_id => post_id or term_taxonomy_id, element_type => post type or taxonomy + * @return string + */ + public function wpml_element_language_code( $language_code, $args ) { + $type = $args['element_type']; + $id = $args['element_id']; + $pll_type = ( 'post' == $type || pll_is_translated_post_type( $type ) ) ? 'post' : ( 'term' == $type || pll_is_translated_taxonomy( $type ) ? 'term' : false ); + if ( 'term' === $pll_type && $term = get_term_by( 'term_taxonomy_id', $id ) ) { + $id = $term->term_id; + } + return $pll_type ? call_user_func( "pll_get_{$pll_type}_language", $id ) : $language_code; + } + + /** + * Translates a string + * + * @since 2.0 + * + * @param string $string The string's original value + * @param string $context The string's registered context + * @param string $name The string's registered name + * @param null|string $lang Optional, return the translation in this language, defaults to current language + * @return string The translated string + */ + public function wpml_translate_single_string( $string, $context, $name, $lang = null ) { + $has_translation = null; // Passed by reference + return icl_translate( $context, $name, $string, false, $has_translation, $lang ); + } + + /** + * Converts a permalink to a language specific permalink + * + * @since 2.2 + * + * @param string $url The url to filter + * @param null|string $lang Langage code, optional, defaults to the current language + * @return string + */ + public function wpml_permalink( $url, $lang = '' ) { + $lang = PLL()->model->get_language( $lang ); + + if ( empty( $lang ) && ! empty( PLL()->curlang ) ) { + $lang = PLL()->curlang; + } + + return empty( $lang ) ? $url : PLL()->links_model->switch_language_in_link( $url, $lang ); + } + + /** + * Translates a post type slug + * + * @since 2.2 + * + * @param string $slug Post type slug + * @param string $post_type Post type name + * @param string $lang Optional language code (defaults to current language) + * @return string + */ + public function wpml_get_translated_slug( $slug, $post_type, $lang = null ) { + if ( isset( PLL()->translate_slugs ) ) { + if ( empty( $lang ) ) { + $lang = pll_current_language(); + } + + $slug = PLL()->translate_slugs->slugs_model->get_translated_slug( $post_type, $lang ); + } + return $slug; + } + + /** + * Find out whether a post type or a taxonomy term is translated + * + * @since 2.0 + * + * @param mixed $null + * @param int $id The post_id or term_id + * @param string $type The post type or taxonomy + * @return bool + */ + public function wpml_element_has_translations( $null, $id, $type ) { + $pll_type = ( 'post' == $type || pll_is_translated_post_type( $type ) ) ? 'post' : ( 'term' == $type || pll_is_translated_taxonomy( $type ) ? 'term' : false ); + return ( $pll_type && $translations = call_user_func( "pll_get_{$pll_type}_translations", $id ) ) ? count( $translations ) > 1 : false; + } +} diff --git a/wp-content/plugins/polylang/modules/wpml/wpml-compat.php b/wp-content/plugins/polylang/modules/wpml/wpml-compat.php new file mode 100644 index 00000000..34981dbe --- /dev/null +++ b/wp-content/plugins/polylang/modules/wpml/wpml-compat.php @@ -0,0 +1,155 @@ +api = new PLL_WPML_API(); + + self::$strings = get_option( 'polylang_wpml_strings', array() ); + + add_action( 'pll_language_defined', array( $this, 'define_constants' ) ); + add_action( 'pll_no_language_defined', array( $this, 'define_constants' ) ); + add_filter( 'pll_get_strings', array( $this, 'get_strings' ) ); + } + + /** + * Access to the single instance of the class + * + * @since 1.7 + * + * @return object + */ + public static function instance() { + if ( empty( self::$instance ) ) { + self::$instance = new self(); + } + return self::$instance; + } + + /** + * Defines two WPML constants once the language has been defined + * The compatibility with WPML is not perfect on admin side as the constants are defined + * in 'setup_theme' by Polylang ( based on user info ) and 'plugins_loaded' by WPML ( based on cookie ) + * + * @since 0.9.5 + */ + public function define_constants() { + if ( ! empty( PLL()->curlang ) ) { + if ( ! defined( 'ICL_LANGUAGE_CODE' ) ) { + define( 'ICL_LANGUAGE_CODE', PLL()->curlang->slug ); + } + + if ( ! defined( 'ICL_LANGUAGE_NAME' ) ) { + define( 'ICL_LANGUAGE_NAME', PLL()->curlang->name ); + } + } elseif ( ! PLL() instanceof PLL_Frontend ) { + if ( ! defined( 'ICL_LANGUAGE_CODE' ) ) { + define( 'ICL_LANGUAGE_CODE', 'all' ); + } + + if ( ! defined( 'ICL_LANGUAGE_NAME' ) ) { + define( 'ICL_LANGUAGE_NAME', '' ); + } + } + } + + /** + * Unlike pll_register_string, icl_register_string stores the string in database + * so we need to do the same as some plugins or themes may expect this + * we use a serialized option to do this + * + * @since 1.0.2 + * + * @param string $context The group in which the string is registered. + * @param string $name A unique name for the string. + * @param string $string The string to register. + */ + public function register_string( $context, $name, $string ) { + // If a string has already been registered with the same name and context, let's replace it. + $exist_string = $this->get_string_by_context_and_name( $context, $name ); + if ( $exist_string && $exist_string !== $string ) { + $languages = PLL()->model->get_languages_list(); + + // Assign translations of the old string to the new string, except for the default language. + foreach ( $languages as $language ) { + if ( pll_default_language() !== $language->slug ) { + $mo = new PLL_MO(); + $mo->import_from_db( $language ); + $mo->add_entry( $mo->make_entry( $string, $mo->translate( $exist_string ) ) ); + $mo->export_to_db( $language ); + } + } + $this->unregister_string( $context, $name ); + } + + // Registers the string if it does not exist yet (multiline as in WPML). + $to_register = array( 'context' => $context, 'name' => $name, 'string' => $string, 'multiline' => true, 'icl' => true ); + if ( ! in_array( $to_register, self::$strings ) && $to_register['string'] ) { + $key = md5( "$context | $name" ); + self::$strings[ $key ] = $to_register; + update_option( 'polylang_wpml_strings', self::$strings ); + } + } + + /** + * Removes a string from the registered strings list + * + * @since 1.0.2 + * + * @param string $context The group in which the string is registered. + * @param string $name A unique name for the string. + */ + public function unregister_string( $context, $name ) { + $key = md5( "$context | $name" ); + if ( isset( self::$strings[ $key ] ) ) { + unset( self::$strings[ $key ] ); + update_option( 'polylang_wpml_strings', self::$strings ); + } + } + + /** + * Adds strings registered by icl_register_string to those registered by pll_register_string + * + * @since 1.0.2 + * + * @param array $strings existing registered strings + * @return array registered strings with added strings through WPML API + */ + public function get_strings( $strings ) { + return empty( self::$strings ) ? $strings : array_merge( $strings, self::$strings ); + } + + /** + * Get a registered string by its context and name + * + * @since 2.0 + * + * @param string $context The group in which the string is registered. + * @param string $name A unique name for the string. + * @return bool|string The registered string, false if none was found. + */ + public function get_string_by_context_and_name( $context, $name ) { + $key = md5( "$context | $name" ); + return isset( self::$strings[ $key ] ) ? self::$strings[ $key ]['string'] : false; + } +} diff --git a/wp-content/plugins/polylang/modules/wpml/wpml-config.php b/wp-content/plugins/polylang/modules/wpml/wpml-config.php new file mode 100644 index 00000000..5fd976df --- /dev/null +++ b/wp-content/plugins/polylang/modules/wpml/wpml-config.php @@ -0,0 +1,231 @@ +init(); + } + } + + /** + * Access to the single instance of the class + * + * @since 1.7 + * + * @return object + */ + public static function instance() { + if ( empty( self::$instance ) ) { + self::$instance = new self(); + } + return self::$instance; + } + + /** + * Finds the wpml-config.xml files to parse and setup filters + * + * @since 1.0 + */ + public function init() { + $this->xmls = array(); + + // Plugins + // Don't forget sitewide active plugins thanks to Reactorshop http://wordpress.org/support/topic/polylang-and-yoast-seo-plugin/page/2?replies=38#post-4801829 + $plugins = ( is_multisite() && $sitewide_plugins = get_site_option( 'active_sitewide_plugins' ) ) && is_array( $sitewide_plugins ) ? array_keys( $sitewide_plugins ) : array(); + $plugins = array_merge( $plugins, get_option( 'active_plugins', array() ) ); + + foreach ( $plugins as $plugin ) { + if ( file_exists( $file = WP_PLUGIN_DIR . '/' . dirname( $plugin ) . '/wpml-config.xml' ) && false !== $xml = simplexml_load_file( $file ) ) { + $this->xmls[ dirname( $plugin ) ] = $xml; + } + } + + // Theme + if ( file_exists( $file = ( $template = get_template_directory() ) . '/wpml-config.xml' ) && false !== $xml = simplexml_load_file( $file ) ) { + $this->xmls[ get_template() ] = $xml; + } + + // Child theme + if ( ( $stylesheet = get_stylesheet_directory() ) !== $template && file_exists( $file = $stylesheet . '/wpml-config.xml' ) && false !== $xml = simplexml_load_file( $file ) ) { + $this->xmls[ get_stylesheet() ] = $xml; + } + + // Custom + if ( file_exists( $file = PLL_LOCAL_DIR . '/wpml-config.xml' ) && false !== $xml = simplexml_load_file( $file ) ) { + $this->xmls['Polylang'] = $xml; + } + + if ( ! empty( $this->xmls ) ) { + add_filter( 'pll_copy_post_metas', array( $this, 'copy_post_metas' ), 20, 2 ); + add_filter( 'pll_copy_term_metas', array( $this, 'copy_term_metas' ), 20, 2 ); + add_filter( 'pll_get_post_types', array( $this, 'translate_types' ), 10, 2 ); + add_filter( 'pll_get_taxonomies', array( $this, 'translate_taxonomies' ), 10, 2 ); + + foreach ( $this->xmls as $context => $xml ) { + foreach ( $xml->xpath( 'admin-texts/key' ) as $key ) { + $attributes = $key->attributes(); + $name = (string) $attributes['name']; + + if ( false !== strpos( $name, '*' ) ) { + $pattern = '#^' . str_replace( '*', '(?:.+)', $name ) . '$#'; + $names = preg_grep( $pattern, array_keys( wp_load_alloptions() ) ); + + foreach ( $names as $_name ) { + $this->register_or_translate_option( $context, $_name, $key ); + } + } else { + $this->register_or_translate_option( $context, $name, $key ); + } + } + } + } + } + + /** + * Adds custom fields to the list of metas to copy when creating a new translation + * + * @since 1.0 + * + * @param array $metas the list of custom fields to copy or synchronize + * @param bool $sync true for sync, false for copy + * @return array the list of custom fields to copy or synchronize + */ + public function copy_post_metas( $metas, $sync ) { + foreach ( $this->xmls as $xml ) { + foreach ( $xml->xpath( 'custom-fields/custom-field' ) as $cf ) { + $attributes = $cf->attributes(); + if ( 'copy' == $attributes['action'] || ( ! $sync && in_array( $attributes['action'], array( 'translate', 'copy-once' ) ) ) ) { + $metas[] = (string) $cf; + } else { + $metas = array_diff( $metas, array( (string) $cf ) ); + } + } + } + return $metas; + } + + /** + * Adds term metas to the list of metas to copy when creating a new translation + * + * @since 2.6 + * + * @param array $metas The list of term metas to copy or synchronize. + * @param bool $sync True for sync, false for copy. + * @return array The list of term metas to copy or synchronize. + */ + public function copy_term_metas( $metas, $sync ) { + foreach ( $this->xmls as $xml ) { + foreach ( $xml->xpath( 'custom-term-fields/custom-term-field' ) as $cf ) { + $attributes = $cf->attributes(); + if ( 'copy' == $attributes['action'] || ( ! $sync && in_array( $attributes['action'], array( 'translate', 'copy-once' ) ) ) ) { + $metas[] = (string) $cf; + } else { + $metas = array_diff( $metas, array( (string) $cf ) ); + } + } + } + return $metas; + } + + /** + * Language and translation management for custom post types + * + * @since 1.0 + * + * @param array $types list of post type names for which Polylang manages language and translations + * @param bool $hide true when displaying the list in Polylang settings + * @return array list of post type names for which Polylang manages language and translations + */ + public function translate_types( $types, $hide ) { + foreach ( $this->xmls as $xml ) { + foreach ( $xml->xpath( 'custom-types/custom-type' ) as $pt ) { + $attributes = $pt->attributes(); + if ( 1 == $attributes['translate'] && ! $hide ) { + $types[ (string) $pt ] = (string) $pt; + } else { + unset( $types[ (string) $pt ] ); // The theme/plugin author decided what to do with the post type so don't allow the user to change this + } + } + } + return $types; + } + + /** + * Language and translation management for custom taxonomies + * + * @since 1.0 + * + * @param array $taxonomies list of taxonomy names for which Polylang manages language and translations + * @param bool $hide true when displaying the list in Polylang settings + * @return array list of taxonomy names for which Polylang manages language and translations + */ + public function translate_taxonomies( $taxonomies, $hide ) { + foreach ( $this->xmls as $xml ) { + foreach ( $xml->xpath( 'taxonomies/taxonomy' ) as $tax ) { + $attributes = $tax->attributes(); + if ( 1 == $attributes['translate'] && ! $hide ) { + $taxonomies[ (string) $tax ] = (string) $tax; + } else { + unset( $taxonomies[ (string) $tax ] ); // the theme/plugin author decided what to do with the taxonomy so don't allow the user to change this + } + } + } + return $taxonomies; + } + + /** + * Registers or translates the strings for an option + * + * @since 2.8 + * + * @param string $context The group in which the strings will be registered. + * @param string $name Option name. + * @param object $key XML node. + */ + protected function register_or_translate_option( $context, $name, $key ) { + $option_keys = $this->xml_to_array( $key ); + new PLL_Translate_Option( $name, reset( $option_keys ), array( 'context' => $context ) ); + } + + /** + * Recursively transforms xml nodes to an array, ready for PLL_Translate_Option. + * + * @since 2.9 + * + * @param object $key XML node. + * @param array $arr Array of option keys to translate. + * @return array + */ + protected function xml_to_array( $key, &$arr = array() ) { + $attributes = $key->attributes(); + $name = (string) $attributes['name']; + $children = $key->children(); + + if ( count( $children ) ) { + foreach ( $children as $child ) { + $arr[ $name ] = $this->xml_to_array( $child, $arr[ $name ] ); + } + } else { + $arr[ $name ] = true; // Multiline as in WPML. + } + return $arr; + } +} diff --git a/wp-content/plugins/polylang/modules/wpml/wpml-legacy-api.php b/wp-content/plugins/polylang/modules/wpml/wpml-legacy-api.php new file mode 100644 index 00000000..a794bc9c --- /dev/null +++ b/wp-content/plugins/polylang/modules/wpml/wpml-legacy-api.php @@ -0,0 +1,386 @@ + whether to skip missing translation or not, 0 or 1, defaults to 0 + * orderby => 'id', 'code', 'name', defaults to 'id' + * order => 'ASC' or 'DESC', defaults to 'ASC' + * link_empty_to => link to use when the translation is missing {$lang} is replaced by the language code + * + * List of parameters returned per language: + * + * id => the language id + * active => whether this is the active language or no, 0 or 1 + * native_name => the language name + * missing => whether the translation is missing or not, 0 or 1 + * translated_name => empty, does not exist in Polylang + * language_code => the language code ( slug ) + * country_flag_url => the url of the flag + * url => the url of the translation + * + * @since 1.0 + * + * @param string|array $args optional + * @return array array of arrays per language + */ + function icl_get_languages( $args = '' ) { + $args = wp_parse_args( $args, array( 'skip_missing' => 0, 'orderby' => 'id', 'order' => 'ASC' ) ); + $orderby = ( isset( $args['orderby'] ) && 'code' == $args['orderby'] ) ? 'slug' : ( isset( $args['orderby'] ) && 'name' == $args['orderby'] ? 'name' : 'id' ); + $order = ( ! empty( $args['order'] ) && 'desc' == $args['order'] ) ? 'DESC' : 'ASC'; + + $arr = array(); + + // NB: When 'skip_missing' is false, WPML returns all languages even if there is no content + $languages = PLL()->model->get_languages_list( array( 'hide_empty' => $args['skip_missing'] ) ); + $languages = wp_list_sort( $languages, $orderby, $order ); // Since WP 4.7 + + foreach ( $languages as $lang ) { + // We can find a translation only on frontend once the global $wp_query object has been instantiated + if ( method_exists( PLL()->links, 'get_translation_url' ) && ! empty( $GLOBALS['wp_query'] ) ) { + $url = PLL()->links->get_translation_url( $lang ); + } + + // It seems that WPML does not bother of skip_missing parameter on admin side and before the $wp_query object has been filled + if ( empty( $url ) && ! empty( $args['skip_missing'] ) && ! is_admin() && did_action( 'parse_query' ) ) { + continue; + } + + $arr[ $lang->slug ] = array( + 'id' => $lang->term_id, + 'active' => isset( PLL()->curlang->slug ) && PLL()->curlang->slug == $lang->slug ? 1 : 0, + 'native_name' => $lang->name, + 'missing' => empty( $url ) ? 1 : 0, + 'translated_name' => '', // Does not exist in Polylang + 'language_code' => $lang->slug, + 'country_flag_url' => $lang->get_display_flag_url(), + 'url' => ! empty( $url ) ? $url : + ( empty( $args['link_empty_to'] ) ? PLL()->links->get_home_url( $lang ) : + str_replace( '{$lang}', $lang->slug, $args['link_empty_to'] ) ), + ); + } + + // Apply undocumented WPML filter + $arr = apply_filters( 'icl_ls_languages', $arr ); + + return $arr; + } +} + +if ( ! function_exists( 'icl_link_to_element' ) ) { + /** + * Used for creating language dependent links in themes + * + * @since 1.0 + * @since 2.0 add support for arguments 6 and 7 + * + * @param int $id object id + * @param string $type optional, post type or taxonomy name of the object, defaults to 'post' + * @param string $text optional, the link text. If not specified will produce the name of the element in the current language + * @param array $args optional, an array of arguments to add to the link, defaults to empty + * @param string $anchor optional, the anchor to add to the link, defaults to empty + * @param bool $echo optional, whether to echo the link, defaults to true + * @param bool $return_original_if_missing optional, whether to return a value if the translation is missing + * @return string a language dependent link + */ + function icl_link_to_element( $id, $type = 'post', $text = '', $args = array(), $anchor = '', $echo = true, $return_original_if_missing = true ) { + if ( 'tag' == $type ) { + $type = 'post_tag'; + } + + $pll_type = ( 'post' == $type || pll_is_translated_post_type( $type ) ) ? 'post' : ( 'term' == $type || pll_is_translated_taxonomy( $type ) ? 'term' : false ); + if ( $pll_type && ( $lang = pll_current_language() ) && ( $tr_id = PLL()->model->$pll_type->get_translation( $id, $lang ) ) && ( 'term' === $pll_type || PLL()->model->post->current_user_can_read( $tr_id ) ) ) { + $id = $tr_id; + } elseif ( ! $return_original_if_missing ) { + return ''; + } + + if ( post_type_exists( $type ) ) { + $link = get_permalink( $id ); + if ( empty( $text ) ) { + $text = get_the_title( $id ); + } + } elseif ( taxonomy_exists( $type ) ) { + $link = get_term_link( $id, $type ); + if ( empty( $text ) && ( $term = get_term( $id, $type ) ) && ! empty( $term ) && ! is_wp_error( $term ) ) { + $text = $term->name; + } + } + + if ( empty( $link ) || is_wp_error( $link ) ) { + return ''; + } + + if ( ! empty( $args ) ) { + $link .= ( false === strpos( $link, '?' ) ? '?' : '&' ) . http_build_query( $args ); + } + + if ( ! empty( $anchor ) ) { + $link .= '#' . $anchor; + } + + $link = sprintf( '%s', esc_url( $link ), esc_html( $text ) ); + + if ( $echo ) { + echo $link; // phpcs:ignore WordPress.Security.EscapeOutput + } + + return $link; + } +} + +if ( ! function_exists( 'icl_object_id' ) ) { + /** + * Used for calculating the IDs of objects (usually categories) in the current language + * + * @since 0.9.5 + * + * @param int $id Object id + * @param string $type Optional, post type or taxonomy name of the object, defaults to 'post' + * @param bool $return_original_if_missing Optional, true if Polylang should return the original id if the translation is missing, defaults to false + * @param string $lang Optional, language code, defaults to current language + * @return int|null The object id of the translation, null if the translation is missing and $return_original_if_missing set to false + */ + function icl_object_id( $id, $type = 'post', $return_original_if_missing = false, $lang = false ) { + $lang = $lang ? $lang : pll_current_language(); + + if ( 'nav_menu' === $type ) { + $theme = get_option( 'stylesheet' ); + if ( isset( PLL()->options['nav_menus'][ $theme ] ) ) { + foreach ( PLL()->options['nav_menus'][ $theme ] as $menu ) { + if ( array_search( $id, $menu ) && ! empty( $menu[ $lang ] ) ) { + $tr_id = $menu[ $lang ]; + break; + } + } + } + } elseif ( $pll_type = ( 'post' === $type || pll_is_translated_post_type( $type ) ) ? 'post' : ( 'term' === $type || pll_is_translated_taxonomy( $type ) ? 'term' : false ) ) { + $tr_id = PLL()->model->$pll_type->get_translation( $id, $lang ); + } + + return ! empty( $tr_id ) ? $tr_id : ( $return_original_if_missing ? $id : null ); + } +} + +if ( ! function_exists( 'wpml_object_id_filter' ) ) { + /** + * Undocumented alias of `icl_object_id` introduced in WPML 3.2, used by Yith WooCommerce compare + * + * @since 2.2.4 + * + * @param int $id object id + * @param string $type optional, post type or taxonomy name of the object, defaults to 'post' + * @param bool $return_original_if_missing optional, true if Polylang should return the original id if the translation is missing, defaults to false + * @param string $lang optional, language code, defaults to current language + * @return int|null the object id of the translation, null if the translation is missing and $return_original_if_missing set to false + */ + function wpml_object_id_filter( $id, $type = 'post', $return_original_if_missing = false, $lang = null ) { + return icl_object_id( $id, $type, $return_original_if_missing, $lang ); + } +} + +if ( ! function_exists( 'wpml_get_language_information' ) ) { + /** + * Undocumented function used by the theme Maya + * returns the post language + * + * @see https://wpml.org/forums/topic/canonical-urls-for-wpml-duplicated-posts/#post-52198 for the original WPML code + * + * @since 1.8 + * + * @param null $empty optional, not used + * @param int $post_id optional, post id, defaults to current post + * @return array + */ + function wpml_get_language_information( $empty = null, $post_id = null ) { + if ( empty( $post_id ) ) { + $post_id = get_the_ID(); + } + + // FIXME WPML may return a WP_Error object + return false === ( $lang = PLL()->model->post->get_language( $post_id ) ) ? array() : array( + 'language_code' => $lang->slug, + 'locale' => $lang->locale, + 'text_direction' => (bool) $lang->is_rtl, + 'display_name' => $lang->name, // Seems to be the post language name displayed in the current language, not a feature in Polylang + 'native_name' => $lang->name, + 'different_language' => pll_current_language() !== $lang->slug, + ); + } +} + +if ( ! function_exists( 'icl_register_string' ) ) { + /** + * Registers a string for translation in the "strings translation" panel + * + * The 4th and 5th parameters $allow_empty_value and $source_lang are not used by Polylang. + * + * @since 0.9.3 + * + * @param string $context the group in which the string is registered, defaults to 'polylang' + * @param string $name a unique name for the string + * @param string $string the string to register + */ + function icl_register_string( $context, $name, $string ) { + PLL_WPML_Compat::instance()->register_string( $context, $name, $string ); + } +} + +if ( ! function_exists( 'icl_unregister_string' ) ) { + /** + * Removes a string from the "strings translation" panel + * + * @since 1.0.2 + * + * @param string $context the group in which the string is registered, defaults to 'polylang' + * @param string $name a unique name for the string + */ + function icl_unregister_string( $context, $name ) { + PLL_WPML_Compat::instance()->unregister_string( $context, $name ); + } +} + +if ( ! function_exists( 'icl_t' ) ) { + /** + * Gets the translated value of a string ( previously registered with icl_register_string or pll_register_string ) + * + * @since 0.9.3 + * @since 1.9.2 argument 3 is optional + * @since 2.0 add support for arguments 4 to 6 + * + * @param string $context the group in which the string is registered + * @param string $name a unique name for the string + * @param string $string the string to translate, optional for strings registered with icl_register_string + * @param bool|null $has_translation optional, not supported in Polylang + * @param bool $bool optional, not used + * @param string|null $lang optional, return the translation in this language, defaults to current language + * @return string the translated string + */ + function icl_t( $context, $name, $string = false, &$has_translation = null, $bool = false, $lang = null ) { + return icl_translate( $context, $name, $string, false, $has_translation, $lang ); + } +} + +if ( ! function_exists( 'icl_translate' ) ) { + /** + * Undocumented function used by NextGen Gallery + * used in PLL_Plugins_Compat for Jetpack with only 3 arguments + * + * @since 1.0.2 + * @since 2.0 add support for arguments 5 and 6, strings are no more automatically registered + * + * @param string $context the group in which the string is registered + * @param string $name a unique name for the string + * @param string $string the string to translate, optional for strings registered with icl_register_string + * @param bool $bool optional, not used + * @param bool|null $has_translation optional, not supported in Polylang + * @param string|null $lang optional, return the translation in this language, defaults to current language + * @return string the translated string + */ + function icl_translate( $context, $name, $string = false, $bool = false, &$has_translation = null, $lang = null ) { + // FIXME WPML can automatically registers the string based on an option + if ( empty( $string ) ) { + $string = PLL_WPML_Compat::instance()->get_string_by_context_and_name( $context, $name ); + } + return empty( $lang ) ? pll__( $string ) : pll_translate_string( $string, $lang ); + } +} + +if ( ! function_exists( 'wpml_get_copied_fields_for_post_edit' ) ) { + /** + * Undocumented function used by Types + * FIXME: tested only with Types + * probably incomplete as Types locks the custom fields for a new post, but not when edited + * This is probably linked to the fact that WPML has always an original post in the default language and not Polylang :) + * + * @since 1.1.2 + * + * @return array + */ + function wpml_get_copied_fields_for_post_edit() { + if ( empty( $_GET['from_post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + return array(); + } + + $arr = array( 'original_post_id' => (int) $_GET['from_post'] ); // phpcs:ignore WordPress.Security.NonceVerification + + // Don't know what WPML does but Polylang does copy all public meta keys by default + foreach ( $keys = array_unique( array_keys( get_post_custom( $arr['original_post_id'] ) ) ) as $k => $meta_key ) { + if ( is_protected_meta( $meta_key ) ) { + unset( $keys[ $k ] ); + } + } + + // Apply our filter and fill the expected output ( see /types/embedded/includes/fields-post.php ) + /** This filter is documented in modules/sync/admin-sync.php */ + $arr['fields'] = array_unique( apply_filters( 'pll_copy_post_metas', empty( $keys ) ? array() : $keys, false ) ); + return $arr; + } +} + +if ( ! function_exists( 'icl_get_default_language' ) ) { + /** + * Undocumented function used by Warp 6 by Yootheme + * + * @since 1.0.5 + * + * @return string default language code + */ + function icl_get_default_language() { + return pll_default_language(); + } +} + +if ( ! function_exists( 'wpml_get_default_language' ) ) { + /** + * Undocumented function reported to be used by Table Rate Shipping for WooCommerce + * + * @see https://wordpress.org/support/topic/add-wpml-compatibility-function + * + * @since 1.8.2 + * + * @return string default language code + */ + function wpml_get_default_language() { + return pll_default_language(); + } +} + +if ( ! function_exists( 'icl_get_current_language' ) ) { + /** + * Undocumented function used by Ultimate Member + * + * @since 2.2.4 + * + * @return string Current language code + */ + function icl_get_current_language() { + return pll_current_language(); + } +} diff --git a/wp-content/plugins/polylang/polylang.php b/wp-content/plugins/polylang/polylang.php new file mode 100644 index 00000000..d4464958 --- /dev/null +++ b/wp-content/plugins/polylang/polylang.php @@ -0,0 +1,73 @@ +. + */ + +if ( ! defined( 'ABSPATH' ) ) { + exit; // Don't access directly. +}; + +if ( defined( 'POLYLANG_VERSION' ) ) { + // The user is attempting to activate a second plugin instance, typically Polylang and Polylang Pro. + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + require_once ABSPATH . 'wp-includes/pluggable.php'; + if ( is_plugin_active( plugin_basename( __FILE__ ) ) ) { + deactivate_plugins( plugin_basename( __FILE__ ) ); // Deactivate this plugin. + // WP does not allow us to send a custom meaningful message, so just tell the plugin has been deactivated. + wp_safe_redirect( add_query_arg( 'deactivate', 'true', remove_query_arg( 'activate' ) ) ); + exit; + } +} else { + // Go on loading the plugin + define( 'POLYLANG_VERSION', '2.9.2' ); + define( 'PLL_MIN_WP_VERSION', '5.1' ); + define( 'PLL_MIN_PHP_VERSION', '5.6' ); + + define( 'POLYLANG_FILE', __FILE__ ); + define( 'POLYLANG_DIR', __DIR__ ); + + if ( ! defined( 'POLYLANG_BASENAME' ) ) { + define( 'POLYLANG_BASENAME', plugin_basename( __FILE__ ) ); // Plugin name as known by WP. + require __DIR__ . '/vendor/autoload.php'; + } + + define( 'POLYLANG', ucwords( str_replace( '-', ' ', dirname( POLYLANG_BASENAME ) ) ) ); + + if ( empty( $_GET['deactivate-polylang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + new Polylang(); + } +} diff --git a/wp-content/plugins/polylang/readme.txt b/wp-content/plugins/polylang/readme.txt new file mode 100644 index 00000000..4e6f85c6 --- /dev/null +++ b/wp-content/plugins/polylang/readme.txt @@ -0,0 +1,113 @@ +=== Polylang === +Contributors: Chouby, manooweb, raaaahman, marianne38, sebastienserre +Donate link: https://polylang.pro +Tags: multilingual, bilingual, translate, translation, language, multilanguage, international, localization +Requires at least: 5.1 +Tested up to: 5.6 +Requires PHP: 5.6 +Stable tag: 2.9.2 +License: GPLv3 or later +License URI: https://www.gnu.org/licenses/gpl-3.0.html + +Making WordPress multilingual + +== Description == + += Features = + +Polylang allows you to create a bilingual or multilingual WordPress site. You write posts, pages and create categories and post tags as usual, and then define the language for each of them. The translation of a post, whether it is in the default language or not, is optional. + +* You can use as many languages as you want. RTL language scripts are supported. WordPress languages packs are automatically downloaded and updated. +* You can translate posts, pages, media, categories, post tags, menus, widgets... +* Custom post types, custom taxonomies, sticky posts and post formats, RSS feeds and all default WordPress widgets are supported. +* The language is either set by the content or by the language code in url, or you can use one different subdomain or domain per language +* Categories, post tags as well as some other metas are automatically copied when adding a new post or page translation +* A customizable language switcher is provided as a widget or in the nav menu + +> The author does not provide support on the wordpress.org forum. Support and extra features are available to [Polylang Pro](https://polylang.pro) users. + +If you wish to migrate from WPML, you can use the plugin [WPML to Polylang](https://wordpress.org/plugins/wpml-to-polylang/) + +If you wish to use a professional or automatic translation service, you can install [Lingotek Translation](https://wordpress.org/plugins/lingotek-translation/), as an addon of Polylang. Lingotek offers a complete translation management system which provides services such as translation memory or semi-automated translation processes (e.g. machine translation > human translation > legal review). + += Credits = + +Thanks a lot to all translators who [help translating Polylang](https://translate.wordpress.org/projects/wp-plugins/polylang). +Thanks a lot to [Alex Lopez](http://www.alexlopez.rocks/) for the design of the logo. +Most of the flags included with Polylang are coming from [famfamfam](http://famfamfam.com/) and are public domain. +Wherever third party code has been used, credit has been given in the code’s comments. + += Do you like Polylang? = + +Don't hesitate to [give your feedback](http://wordpress.org/support/view/plugin-reviews/polylang#postform). + +== Installation == + +1. Make sure you are using WordPress 5.1 or later and that your server is running PHP 5.6 or later (same requirement as WordPress itself) +1. If you tried other multilingual plugins, deactivate them before activating Polylang, otherwise, you may get unexpected results! +1. Install and activate the plugin as usual from the 'Plugins' menu in WordPress. +1. Go to the languages settings page and create the languages you need +1. Add the 'language switcher' widget to let your visitors switch the language. +1. Take care that your theme must come with the corresponding .mo files (Polylang automatically downloads them when they are available for themes and plugins in this repository). If your theme is not internationalized yet, please refer to the [Theme Handbook](https://developer.wordpress.org/themes/functionality/internationalization/) or ask the theme author to internationalize it. + +== Frequently Asked Questions == + += Where to find help ? = + +* First time users should read [Polylang - Getting started](https://polylang.pro/doc-category/getting-started/), which explains the basics with a lot of screenshots. +* Read the [documentation](https://polylang.pro/doc/). It includes a [FAQ](https://polylang.pro/doc-category/faq/) and the [documentation for developers](https://polylang.pro/doc-category/developers/). +* Search the [community support forum](https://wordpress.org/search/). You will probably find your answer here. +* Read the sticky posts in the [community support forum](http://wordpress.org/support/plugin/polylang). +* If you still have a problem, open a new thread in the [community support forum](http://wordpress.org/support/plugin/polylang). +* [Polylang Pro](https://polylang.pro) users have access to our helpdesk. + += Is Polylang compatible with WooCommerce? = + +* You need a separate addon to make Polylang and WooCommerce work together. [A Premium addon](https://polylang.pro/downloads/polylang-for-woocommerce/) is available. + += Do you need translation services? = + +* If you want to use professional or automatic translation services, install and activate the [Lingotek Translation](https://wordpress.org/plugins/lingotek-translation/) plugin. + +== Screenshots == + +1. The Polylang languages admin panel +2. The Strings translations admin panel +3. Multilingual media library +4. The Edit Post screen with the Languages metabox + +== Changelog == + += 2.9.2 (2021-02-02) = + +* Pro: Fix translation of CPTUI plural label and description not working +* Add Spanish (Ecuador) to the list of predefined languages +* Fix typo in "WordPress" string translation group. Props Viktor Szépe #682 + += 2.9.1 (2020-12-15) = + +* Fix PHP notice: Undefined property: PLL_Cache_Compat::$options with cache plugins. Props bahaa-almahamid. #658 +* Fix title of the search results page with Yoast SEO > 14.0 + += 2.9 (2020-12-07) = + +* Add compatibility with WordPress 5.6 +* Pro: Add locale fallback used when the theme or plugins translations are not available +* Pro: Fix SSO and browser preferred language redirect when using multiple domains +* Pro: Fix post slugs for German and Danish in the REST API +* Pro: Fix a fatal error in ACF integration when saving url modifications with multiple domains +* Pro: Fix a deprecated notice fired by ACF since the version 5.9.2 +* Pro: Fix ACF relationship fields not reloaded when changing the language in the classic editor +* Update plugin updater to version 1.8 +* Add Lower Sorbian to the list of predefined language +* Options are now translated on backend when using the admin language filter +* Keep previous translations when modifying an option value +* Add navigation markup to the language switcher widget +* Fix canonical redirect for taxonomy terms +* Fix a fatal error when deleting a post with a translation group corrupted in the database +* Fix a fatal error when switching to plain permalinks and using multiple domains +* Fix a conflict with WP Sweep which could corrupt languages +* Fix title displayed instead of meta description with Yoast SEO > 14.0 +* Fix PHP Notice: Undefined index: wp_the_query in /frontend/choose-lang-content.php on line 92 + +See [changelog.txt](https://plugins.svn.wordpress.org/polylang/trunk/changelog.txt) for older changelog diff --git a/wp-content/plugins/polylang/settings/flags.php b/wp-content/plugins/polylang/settings/flags.php new file mode 100644 index 00000000..60e8d9f7 --- /dev/null +++ b/wp-content/plugins/polylang/settings/flags.php @@ -0,0 +1,276 @@ + __( 'Andorra', 'polylang' ), + 'ae' => __( 'United Arab Emirates', 'polylang' ), + 'af' => __( 'Afghanistan', 'polylang' ), + 'ag' => __( 'Antigua and Barbuda', 'polylang' ), + 'ai' => __( 'Anguilla', 'polylang' ), + 'al' => __( 'Albania', 'polylang' ), + 'am' => __( 'Armenia', 'polylang' ), + 'an' => __( 'Netherlands Antilles', 'polylang' ), + 'ao' => __( 'Angola', 'polylang' ), + 'ar' => __( 'Argentina', 'polylang' ), + 'arab' => __( 'Arab league', 'polylang' ), + 'as' => __( 'American Samoa', 'polylang' ), + 'at' => __( 'Austria', 'polylang' ), + 'au' => __( 'Australia', 'polylang' ), + 'aw' => __( 'Aruba', 'polylang' ), + 'ax' => __( 'Åland Islands', 'polylang' ), + 'az' => __( 'Azerbaijan', 'polylang' ), + 'ba' => __( 'Bosnia and Herzegovina', 'polylang' ), + 'basque' => __( 'Basque Country', 'polylang' ), + 'bb' => __( 'Barbados', 'polylang' ), + 'bd' => __( 'Bangladesh', 'polylang' ), + 'be' => __( 'Belgium', 'polylang' ), + 'bf' => __( 'Burkina Faso', 'polylang' ), + 'bg' => __( 'Bulgaria', 'polylang' ), + 'bh' => __( 'Bahrain', 'polylang' ), + 'bi' => __( 'Burundi', 'polylang' ), + 'bj' => __( 'Benin', 'polylang' ), + 'bm' => __( 'Bermuda', 'polylang' ), + 'bn' => __( 'Brunei', 'polylang' ), + 'bo' => __( 'Bolivia', 'polylang' ), + 'br' => __( 'Brazil', 'polylang' ), + 'bs' => __( 'Bahamas', 'polylang' ), + 'bt' => __( 'Bhutan', 'polylang' ), + 'bw' => __( 'Botswana', 'polylang' ), + 'by' => __( 'Belarus', 'polylang' ), + 'bz' => __( 'Belize', 'polylang' ), + 'ca' => __( 'Canada', 'polylang' ), + 'catalonia' => __( 'Catalonia', 'polylang' ), + 'cc' => __( 'Cocos', 'polylang' ), + 'cd' => __( 'Democratic Republic of the Congo', 'polylang' ), + 'cf' => __( 'Central African Republic', 'polylang' ), + 'cg' => __( 'Congo', 'polylang' ), + 'ch' => __( 'Switzerland', 'polylang' ), + 'ci' => __( 'Ivory Coast', 'polylang' ), + 'ck' => __( 'Cook Islands', 'polylang' ), + 'cl' => __( 'Chile', 'polylang' ), + 'cm' => __( 'Cameroon', 'polylang' ), + 'cn' => __( 'China', 'polylang' ), + 'co' => __( 'Colombia', 'polylang' ), + 'cr' => __( 'Costa Rica', 'polylang' ), + 'cu' => __( 'Cuba', 'polylang' ), + 'cv' => __( 'Cape Verde', 'polylang' ), + 'cx' => __( 'Christmas Island', 'polylang' ), + 'cy' => __( 'Cyprus', 'polylang' ), + 'cz' => __( 'Czech Republic', 'polylang' ), + 'de' => __( 'Germany', 'polylang' ), + 'dj' => __( 'Djibouti', 'polylang' ), + 'dk' => __( 'Denmark', 'polylang' ), + 'dm' => __( 'Dominica', 'polylang' ), + 'do' => __( 'Dominican Republic', 'polylang' ), + 'dz' => __( 'Algeria', 'polylang' ), + 'ec' => __( 'Ecuador', 'polylang' ), + 'ee' => __( 'Estonia', 'polylang' ), + 'eg' => __( 'Egypt', 'polylang' ), + 'eh' => __( 'Western Sahara', 'polylang' ), + 'england' => __( 'England', 'polylang' ), + 'er' => __( 'Eritrea', 'polylang' ), + 'es' => __( 'Spain', 'polylang' ), + 'esperanto' => __( 'Esperanto', 'polylang' ), + 'et' => __( 'Ethiopia', 'polylang' ), + 'fi' => __( 'Finland', 'polylang' ), + 'fj' => __( 'Fiji', 'polylang' ), + 'fk' => __( 'Falkland Islands', 'polylang' ), + 'fm' => __( 'Micronesia', 'polylang' ), + 'fo' => __( 'Faroe Islands', 'polylang' ), + 'fr' => __( 'France', 'polylang' ), + 'ga' => __( 'Gabon', 'polylang' ), + 'galicia' => __( 'Galicia', 'polylang' ), + 'gb' => __( 'United Kingdom', 'polylang' ), + 'gd' => __( 'Grenada', 'polylang' ), + 'ge' => __( 'Georgia', 'polylang' ), + 'gh' => __( 'Ghana', 'polylang' ), + 'gi' => __( 'Gibraltar', 'polylang' ), + 'gl' => __( 'Greenland', 'polylang' ), + 'gm' => __( 'Gambia', 'polylang' ), + 'gn' => __( 'Guinea', 'polylang' ), + 'gp' => __( 'Guadeloupe', 'polylang' ), + 'gq' => __( 'Equatorial Guinea', 'polylang' ), + 'gr' => __( 'Greece', 'polylang' ), + 'gs' => __( 'South Georgia and the South Sandwich Islands', 'polylang' ), + 'gt' => __( 'Guatemala', 'polylang' ), + 'gu' => __( 'Guam', 'polylang' ), + 'gw' => __( 'Guinea-Bissau', 'polylang' ), + 'gy' => __( 'Guyana', 'polylang' ), + 'hk' => __( 'Hong Kong', 'polylang' ), + 'hm' => __( 'Heard Island and McDonald Islands', 'polylang' ), + 'hn' => __( 'Honduras', 'polylang' ), + 'hr' => __( 'Croatia', 'polylang' ), + 'ht' => __( 'Haiti', 'polylang' ), + 'hu' => __( 'Hungary', 'polylang' ), + 'id' => __( 'Indonesia', 'polylang' ), + 'ie' => __( 'Republic of Ireland', 'polylang' ), + 'il' => __( 'Israel', 'polylang' ), + 'in' => __( 'India', 'polylang' ), + 'io' => __( 'British Indian Ocean Territory', 'polylang' ), + 'iq' => __( 'Iraq', 'polylang' ), + 'ir' => __( 'Iran', 'polylang' ), + 'is' => __( 'Iceland', 'polylang' ), + 'it' => __( 'Italy', 'polylang' ), + 'jm' => __( 'Jamaica', 'polylang' ), + 'jo' => __( 'Jordan', 'polylang' ), + 'jp' => __( 'Japan', 'polylang' ), + 'ke' => __( 'Kenya', 'polylang' ), + 'kg' => __( 'Kyrgyzstan', 'polylang' ), + 'kh' => __( 'Cambodia', 'polylang' ), + 'ki' => __( 'Kiribati', 'polylang' ), + 'km' => __( 'Comoros', 'polylang' ), + 'kn' => __( 'Saint Kitts and Nevis', 'polylang' ), + 'kp' => __( 'North Korea', 'polylang' ), + 'kr' => __( 'South Korea', 'polylang' ), + 'kurdistan' => __( 'Kurdistan', 'polylang' ), + 'kw' => __( 'Kuwait', 'polylang' ), + 'ky' => __( 'Cayman Islands', 'polylang' ), + 'kz' => __( 'Kazakhstan', 'polylang' ), + 'la' => __( 'Laos', 'polylang' ), + 'lb' => __( 'Lebanon', 'polylang' ), + 'lc' => __( 'Saint Lucia', 'polylang' ), + 'li' => __( 'Liechtenstein', 'polylang' ), + 'lk' => __( 'Sri Lanka', 'polylang' ), + 'lr' => __( 'Liberia', 'polylang' ), + 'ls' => __( 'Lesotho', 'polylang' ), + 'lt' => __( 'Lithuania', 'polylang' ), + 'lu' => __( 'Luxembourg', 'polylang' ), + 'lv' => __( 'Latvia', 'polylang' ), + 'ly' => __( 'Libya', 'polylang' ), + 'ma' => __( 'Morocco', 'polylang' ), + 'mc' => __( 'Monaco', 'polylang' ), + 'md' => __( 'Moldova', 'polylang' ), + 'me' => __( 'Montenegro', 'polylang' ), + 'mg' => __( 'Madagascar', 'polylang' ), + 'mh' => __( 'Marshall Islands', 'polylang' ), + 'mk' => __( 'North Macedonia', 'polylang' ), + 'ml' => __( 'Mali', 'polylang' ), + 'mm' => __( 'Myanmar', 'polylang' ), + 'mn' => __( 'Mongolia', 'polylang' ), + 'mo' => __( 'Macao', 'polylang' ), + 'mp' => __( 'Northern Mariana Islands', 'polylang' ), + 'mq' => __( 'Martinique', 'polylang' ), + 'mr' => __( 'Mauritania', 'polylang' ), + 'ms' => __( 'Montserrat', 'polylang' ), + 'mt' => __( 'Malta', 'polylang' ), + 'mu' => __( 'Mauritius', 'polylang' ), + 'mv' => __( 'Maldives', 'polylang' ), + 'mw' => __( 'Malawi', 'polylang' ), + 'mx' => __( 'Mexico', 'polylang' ), + 'my' => __( 'Malaysia', 'polylang' ), + 'mz' => __( 'Mozambique', 'polylang' ), + 'na' => __( 'Namibia', 'polylang' ), + 'nc' => __( 'New Caledonia', 'polylang' ), + 'ne' => __( 'Niger', 'polylang' ), + 'nf' => __( 'Norfolk Island', 'polylang' ), + 'ng' => __( 'Nigeria', 'polylang' ), + 'ni' => __( 'Nicaragua', 'polylang' ), + 'nl' => __( 'Netherlands', 'polylang' ), + 'no' => __( 'Norway', 'polylang' ), + 'np' => __( 'Nepal', 'polylang' ), + 'nr' => __( 'Nauru', 'polylang' ), + 'nu' => __( 'Niue', 'polylang' ), + 'nz' => __( 'New Zealand', 'polylang' ), + 'occitania' => __( 'Occitania', 'polylang' ), + 'om' => __( 'Oman', 'polylang' ), + 'pa' => __( 'Panama', 'polylang' ), + 'pe' => __( 'Peru', 'polylang' ), + 'pf' => __( 'French Polynesia', 'polylang' ), + 'pg' => __( 'Papua New Guinea', 'polylang' ), + 'ph' => __( 'Philippines', 'polylang' ), + 'pk' => __( 'Pakistan', 'polylang' ), + 'pl' => __( 'Poland', 'polylang' ), + 'pm' => __( 'Saint Pierre and Miquelon', 'polylang' ), + 'pn' => __( 'Pitcairn', 'polylang' ), + 'pr' => __( 'Puerto Rico', 'polylang' ), + 'ps' => __( 'Palestinian Territory', 'polylang' ), + 'pt' => __( 'Portugal', 'polylang' ), + 'pw' => __( 'Belau', 'polylang' ), + 'py' => __( 'Paraguay', 'polylang' ), + 'qa' => __( 'Qatar', 'polylang' ), + 'quebec' => __( 'Quebec', 'polylang' ), + 'ro' => __( 'Romania', 'polylang' ), + 'rs' => __( 'Serbia', 'polylang' ), + 'ru' => __( 'Russia', 'polylang' ), + 'rw' => __( 'Rwanda', 'polylang' ), + 'sa' => __( 'Saudi Arabia', 'polylang' ), + 'sb' => __( 'Solomon Islands', 'polylang' ), + 'sc' => __( 'Seychelles', 'polylang' ), + 'scotland' => __( 'Scotland', 'polylang' ), + 'sd' => __( 'Sudan', 'polylang' ), + 'se' => __( 'Sweden', 'polylang' ), + 'sg' => __( 'Singapore', 'polylang' ), + 'sh' => __( 'Saint Helena', 'polylang' ), + 'si' => __( 'Slovenia', 'polylang' ), + 'sk' => __( 'Slovakia', 'polylang' ), + 'sl' => __( 'Sierra Leone', 'polylang' ), + 'sm' => __( 'San Marino', 'polylang' ), + 'sn' => __( 'Senegal', 'polylang' ), + 'so' => __( 'Somalia', 'polylang' ), + 'sr' => __( 'Suriname', 'polylang' ), + 'ss' => __( 'South Sudan', 'polylang' ), + 'st' => __( 'São Tomé and Príncipe', 'polylang' ), + 'sv' => __( 'El Salvador', 'polylang' ), + 'sy' => __( 'Syria', 'polylang' ), + 'sz' => __( 'Swaziland', 'polylang' ), + 'tc' => __( 'Turks and Caicos Islands', 'polylang' ), + 'td' => __( 'Chad', 'polylang' ), + 'tf' => __( 'French Southern Territories', 'polylang' ), + 'tg' => __( 'Togo', 'polylang' ), + 'th' => __( 'Thailand', 'polylang' ), + 'tibet' => __( 'Tibet', 'polylang' ), + 'tj' => __( 'Tajikistan', 'polylang' ), + 'tk' => __( 'Tokelau', 'polylang' ), + 'tl' => __( 'Timor-Leste', 'polylang' ), + 'tm' => __( 'Turkmenistan', 'polylang' ), + 'tn' => __( 'Tunisia', 'polylang' ), + 'to' => __( 'Tonga', 'polylang' ), + 'tr' => __( 'Turkey', 'polylang' ), + 'tt' => __( 'Trinidad and Tobago', 'polylang' ), + 'tv' => __( 'Tuvalu', 'polylang' ), + 'tw' => __( 'Taiwan', 'polylang' ), + 'tz' => __( 'Tanzania', 'polylang' ), + 'ua' => __( 'Ukraine', 'polylang' ), + 'ug' => __( 'Uganda', 'polylang' ), + 'us' => __( 'United States', 'polylang' ), + 'uy' => __( 'Uruguay', 'polylang' ), + 'uz' => __( 'Uzbekistan', 'polylang' ), + 'va' => __( 'Vatican', 'polylang' ), + 'vc' => __( 'Saint Vincent and the Grenadines', 'polylang' ), + 've' => __( 'Venezuela', 'polylang' ), + 'veneto' => __( 'Veneto', 'polylang' ), + 'vg' => __( 'British Virgin Islands', 'polylang' ), + 'vi' => __( 'United States Virgin Islands', 'polylang' ), + 'vn' => __( 'Vietnam', 'polylang' ), + 'vu' => __( 'Vanuatu', 'polylang' ), + 'wales' => __( 'Wales', 'polylang' ), + 'wf' => __( 'Wallis and Futuna', 'polylang' ), + 'ws' => __( 'Western Samoa', 'polylang' ), + 'ye' => __( 'Yemen', 'polylang' ), + 'yt' => __( 'Mayotte', 'polylang' ), + 'za' => __( 'South Africa', 'polylang' ), + 'zm' => __( 'Zambia', 'polylang' ), + 'zw' => __( 'Zimbabwe', 'polylang' ), +); + +/** + * Filter the list of predefined flags + * + * @since 1.8 + * + * @param array $flags + */ +return apply_filters( 'pll_predefined_flags', $flags ); diff --git a/wp-content/plugins/polylang/settings/languages.php b/wp-content/plugins/polylang/settings/languages.php new file mode 100644 index 00000000..a02b08e3 --- /dev/null +++ b/wp-content/plugins/polylang/settings/languages.php @@ -0,0 +1,1204 @@ + ISO 639-1 language code + * [locale] => WordPress locale + * [name] => name + * [dir] => text direction + * [flag] => flag code + * [w3c] => W3C locale + * [facebook] => Facebook locale + * + * Facebook locales without equivalent WordPress locale: + * 'ay_BO' (Aymara) + * 'bp_IN' (Bhojpuri) + * 'ck_US' (Cherokee) + * 'en_IN' (English India) + * 'gx_GR' (Classical Greek) + * 'ig_NG' (Igbo) + * 'ik_US' (Inupiak) + * 'iu_CA' (Inuktitut) + * 'ja_KS' (Japanese Kansai) + * 'ks_IN' (Cachemiri) + * 'lg_UG' (Ganda) + * 'nd_ZW' (Ndebele) + * 'nr_ZA' (Southern Ndebele) + * 'ns_ZA' (Northern Sotho) + * 'ny_MW' (Chewa) + * 'qc_GT' (Quiché) + * 'qu_PE' (Quechua) + * 'se_NO' (Northern Sami) + * 'ss_SZ' (Swazi) + * 'st_ZA' (Southern Sotho) + * 'tl_ST' (Klingon) + * 'tn_BW' (Tswana) + * 'ts_ZA' (Tsonga) + * 've_ZA' (Venda) + * 'wo_SN' (Wolof) + * 'yi_DE' (Yiddish) + * 'zu_ZA' (Zulu) + * 'zz_TR' (Zazaki) + */ +return array( + 'af' => array( + 'code' => 'af', + 'locale' => 'af', + 'name' => 'Afrikaans', + 'dir' => 'ltr', + 'flag' => 'za', + 'facebook' => 'af_ZA', + ), + 'ak' => array( + 'facebook' => 'ak_GH', + ), + 'am' => array( + 'facebook' => 'am_ET', + ), + 'ar' => array( + 'code' => 'ar', + 'locale' => 'ar', + 'name' => 'العربية', + 'dir' => 'rtl', + 'flag' => 'arab', + 'facebook' => 'ar_AR', + ), + 'arq' => array( + 'facebook' => 'ar_AR', + ), + 'ary' => array( + 'code' => 'ar', + 'locale' => 'ary', + 'name' => 'العربية المغربية', + 'dir' => 'rtl', + 'flag' => 'ma', + 'facebook' => 'ar_AR', + ), + 'as' => array( + 'code' => 'as', + 'locale' => 'as', + 'name' => 'অসমীয়া', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'as_IN', + ), + 'az' => array( + 'code' => 'az', + 'locale' => 'az', + 'name' => 'Azərbaycan', + 'dir' => 'ltr', + 'flag' => 'az', + 'facebook' => 'az_AZ', + ), + 'azb' => array( + 'code' => 'az', + 'locale' => 'azb', + 'name' => 'گؤنئی آذربایجان', + 'dir' => 'rtl', + 'flag' => 'az', + ), + 'bel' => array( + 'code' => 'be', + 'locale' => 'bel', + 'name' => 'Беларуская мова', + 'dir' => 'ltr', + 'flag' => 'by', + 'w3c' => 'be', + 'facebook' => 'be_BY', + ), + 'bg_BG' => array( + 'code' => 'bg', + 'locale' => 'bg_BG', + 'name' => 'български', + 'dir' => 'ltr', + 'flag' => 'bg', + 'facebook' => 'bg_BG', + ), + 'bn_BD' => array( + 'code' => 'bn', + 'locale' => 'bn_BD', + 'name' => 'বাংলা', + 'dir' => 'ltr', + 'flag' => 'bd', + 'facebook' => 'bn_IN', + ), + 'bo' => array( + 'code' => 'bo', + 'locale' => 'bo', + 'name' => 'བོད་ཡིག', + 'dir' => 'ltr', + 'flag' => 'tibet', + ), + 'bre' => array( + 'w3c' => 'br', + 'facebook' => 'br_FR', + ), + 'bs_BA' => array( + 'code' => 'bs', + 'locale' => 'bs_BA', + 'name' => 'Bosanski', + 'dir' => 'ltr', + 'flag' => 'ba', + 'facebook' => 'bs_BA', + ), + 'ca' => array( + 'code' => 'ca', + 'locale' => 'ca', + 'name' => 'Català', + 'dir' => 'ltr', + 'flag' => 'catalonia', + 'facebook' => 'ca_ES', + ), + 'ceb' => array( + 'code' => 'ceb', + 'locale' => 'ceb', + 'name' => 'Cebuano', + 'dir' => 'ltr', + 'flag' => 'ph', + 'facebook' => 'cx_PH', + ), + 'ckb' => array( + 'code' => 'ku', + 'locale' => 'ckb', + 'name' => 'کوردی', + 'dir' => 'rtl', + 'flag' => 'kurdistan', + 'facebook' => 'cb_IQ', + ), + 'co' => array( + 'facebook' => 'co_FR', + ), + 'cs_CZ' => array( + 'code' => 'cs', + 'locale' => 'cs_CZ', + 'name' => 'Čeština', + 'dir' => 'ltr', + 'flag' => 'cz', + 'facebook' => 'cs_CZ', + ), + 'cy' => array( + 'code' => 'cy', + 'locale' => 'cy', + 'name' => 'Cymraeg', + 'dir' => 'ltr', + 'flag' => 'wales', + 'facebook' => 'cy_GB', + ), + 'da_DK' => array( + 'code' => 'da', + 'locale' => 'da_DK', + 'name' => 'Dansk', + 'dir' => 'ltr', + 'flag' => 'dk', + 'facebook' => 'da_DK', + ), + 'de_AT' => array( + 'code' => 'de', + 'locale' => 'de_AT', + 'name' => 'Deutsch', + 'dir' => 'ltr', + 'flag' => 'at', + 'facebook' => 'de_DE', + ), + 'de_CH' => array( + 'code' => 'de', + 'locale' => 'de_CH', + 'name' => 'Deutsch', + 'dir' => 'ltr', + 'flag' => 'ch', + 'facebook' => 'de_DE', + ), + 'de_CH_informal' => array( + 'code' => 'de', + 'locale' => 'de_CH_informal', + 'name' => 'Deutsch', + 'dir' => 'ltr', + 'flag' => 'ch', + 'w3c' => 'de-CH', + 'facebook' => 'de_DE', + ), + 'de_DE' => array( + 'code' => 'de', + 'locale' => 'de_DE', + 'name' => 'Deutsch', + 'dir' => 'ltr', + 'flag' => 'de', + 'facebook' => 'de_DE', + ), + 'de_DE_formal' => array( + 'code' => 'de', + 'locale' => 'de_DE_formal', + 'name' => 'Deutsch', + 'dir' => 'ltr', + 'flag' => 'de', + 'w3c' => 'de-DE', + 'facebook' => 'de_DE', + ), + 'dsb' => array( + 'code' => 'dsb', + 'locale' => 'dsb', + 'name' => 'Dolnoserbšćina', + 'dir' => 'ltr', + 'flag' => 'de', + ), + 'dzo' => array( + 'code' => 'dz', + 'locale' => 'dzo', + 'name' => 'རྫོང་ཁ', + 'dir' => 'ltr', + 'flag' => 'bt', + 'w3c' => 'dz', + ), + 'el' => array( + 'code' => 'el', + 'locale' => 'el', + 'name' => 'Ελληνικά', + 'dir' => 'ltr', + 'flag' => 'gr', + 'facebook' => 'el_GR', + ), + 'en_AU' => array( + 'code' => 'en', + 'locale' => 'en_AU', + 'name' => 'English', + 'dir' => 'ltr', + 'flag' => 'au', + 'facebook' => 'en_US', + ), + 'en_CA' => array( + 'code' => 'en', + 'locale' => 'en_CA', + 'name' => 'English', + 'dir' => 'ltr', + 'flag' => 'ca', + 'facebook' => 'en_US', + ), + 'en_GB' => array( + 'code' => 'en', + 'locale' => 'en_GB', + 'name' => 'English', + 'dir' => 'ltr', + 'flag' => 'gb', + 'facebook' => 'en_GB', + ), + 'en_NZ' => array( + 'code' => 'en', + 'locale' => 'en_NZ', + 'name' => 'English', + 'dir' => 'ltr', + 'flag' => 'nz', + 'facebook' => 'en_US', + ), + 'en_US' => array( + 'code' => 'en', + 'locale' => 'en_US', + 'name' => 'English', + 'dir' => 'ltr', + 'flag' => 'us', + 'facebook' => 'en_US', + ), + 'en_ZA' => array( + 'code' => 'en', + 'locale' => 'en_ZA', + 'name' => 'English', + 'dir' => 'ltr', + 'flag' => 'za', + 'facebook' => 'en_US', + ), + 'eo' => array( + 'code' => 'eo', + 'locale' => 'eo', + 'name' => 'Esperanto', + 'dir' => 'ltr', + 'flag' => 'esperanto', + 'facebook' => 'eo_EO', + ), + 'es_AR' => array( + 'code' => 'es', + 'locale' => 'es_AR', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'ar', + 'facebook' => 'es_LA', + ), + 'es_CL' => array( + 'code' => 'es', + 'locale' => 'es_CL', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'cl', + 'facebook' => 'es_CL', + ), + 'es_CO' => array( + 'code' => 'es', + 'locale' => 'es_CO', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'co', + 'facebook' => 'es_CO', + ), + 'es_CR' => array( + 'code' => 'es', + 'locale' => 'es_CR', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'cr', + 'facebook' => 'es_LA', + ), + 'es_EC' => array( + 'code' => 'es', + 'locale' => 'es_EC', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'ec', + 'facebook' => 'es_LA', + ), + 'es_ES' => array( + 'code' => 'es', + 'locale' => 'es_ES', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'es', + 'facebook' => 'es_ES', + ), + 'es_GT' => array( + 'code' => 'es', + 'locale' => 'es_GT', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'gt', + 'facebook' => 'es_LA', + ), + 'es_MX' => array( + 'code' => 'es', + 'locale' => 'es_MX', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'mx', + 'facebook' => 'es_MX', + ), + 'es_PE' => array( + 'code' => 'es', + 'locale' => 'es_PE', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'pe', + 'facebook' => 'es_LA', + ), + 'es_PR' => array( + 'code' => 'es', + 'locale' => 'es_PR', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'pr', + 'facebook' => 'es_LA', + ), + 'es_UY' => array( + 'code' => 'es', + 'locale' => 'es_UY', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 'uy', + 'facebook' => 'es_LA', + ), + 'es_VE' => array( + 'code' => 'es', + 'locale' => 'es_VE', + 'name' => 'Español', + 'dir' => 'ltr', + 'flag' => 've', + 'facebook' => 'es_VE', + ), + 'et' => array( + 'code' => 'et', + 'locale' => 'et', + 'name' => 'Eesti', + 'dir' => 'ltr', + 'flag' => 'ee', + 'facebook' => 'et_EE', + ), + 'eu' => array( + 'code' => 'eu', + 'locale' => 'eu', + 'name' => 'Euskara', + 'dir' => 'ltr', + 'flag' => 'basque', + 'facebook' => 'eu_ES', + ), + 'fa_AF' => array( + 'code' => 'fa', + 'locale' => 'fa_AF', + 'name' => 'فارسی', + 'dir' => 'rtl', + 'flag' => 'af', + 'facebook' => 'fa_IR', + ), + 'fa_IR' => array( + 'code' => 'fa', + 'locale' => 'fa_IR', + 'name' => 'فارسی', + 'dir' => 'rtl', + 'flag' => 'ir', + 'facebook' => 'fa_IR', + ), + 'fi' => array( + 'code' => 'fi', + 'locale' => 'fi', + 'name' => 'Suomi', + 'dir' => 'ltr', + 'flag' => 'fi', + 'facebook' => 'fi_FI', + ), + 'fo' => array( + 'code' => 'fo', + 'locale' => 'fo', + 'name' => 'Føroyskt', + 'dir' => 'ltr', + 'flag' => 'fo', + 'facebook' => 'fo_FO', + ), + 'fr_BE' => array( + 'code' => 'fr', + 'locale' => 'fr_BE', + 'name' => 'Français', + 'dir' => 'ltr', + 'flag' => 'be', + 'facebook' => 'fr_FR', + ), + 'fr_CA' => array( + 'code' => 'fr', + 'locale' => 'fr_CA', + 'name' => 'Français', + 'dir' => 'ltr', + 'flag' => 'quebec', + 'facebook' => 'fr_CA', + ), + 'fr_FR' => array( + 'code' => 'fr', + 'locale' => 'fr_FR', + 'name' => 'Français', + 'dir' => 'ltr', + 'flag' => 'fr', + 'facebook' => 'fr_FR', + ), + 'fuc' => array( + 'facebook' => 'ff_NG', + ), + 'fur' => array( + 'code' => 'fur', + 'locale' => 'fur', + 'name' => 'Furlan', + 'dir' => 'ltr', + 'flag' => 'it', + ), + 'fy' => array( + 'code' => 'fy', + 'locale' => 'fy', + 'name' => 'Frysk', + 'dir' => 'ltr', + 'flag' => 'nl', + 'facebook' => 'fy_NL', + ), + 'ga' => array( + 'facebook' => 'ga_IE', + ), + 'gax' => array( + 'facebook' => 'om_ET', + ), + 'gd' => array( + 'code' => 'gd', + 'locale' => 'gd', + 'name' => 'Gàidhlig', + 'dir' => 'ltr', + 'flag' => 'scotland', + ), + 'gl_ES' => array( + 'code' => 'gl', + 'locale' => 'gl_ES', + 'name' => 'Galego', + 'dir' => 'ltr', + 'flag' => 'galicia', + 'facebook' => 'gl_ES', + ), + 'gn' => array( + 'facebook' => 'gn_PY', + ), + 'gu' => array( + 'code' => 'gu', + 'locale' => 'gu', + 'name' => 'ગુજરાતી', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'gu_IN', + ), + 'hat' => array( + 'facebook' => 'ht_HT', + ), + 'hau' => array( + 'facebook' => 'ha_NG', + ), + 'haz' => array( + 'code' => 'haz', + 'locale' => 'haz', + 'name' => 'هزاره گی', + 'dir' => 'rtl', + 'flag' => 'af', + ), + 'he_IL' => array( + 'code' => 'he', + 'locale' => 'he_IL', + 'name' => 'עברית', + 'dir' => 'rtl', + 'flag' => 'il', + 'facebook' => 'he_IL', + ), + 'hi_IN' => array( + 'code' => 'hi', + 'locale' => 'hi_IN', + 'name' => 'हिन्दी', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'hi_IN', + ), + 'hr' => array( + 'code' => 'hr', + 'locale' => 'hr', + 'name' => 'Hrvatski', + 'dir' => 'ltr', + 'flag' => 'hr', + 'facebook' => 'hr_HR', + ), + 'hu_HU' => array( + 'code' => 'hu', + 'locale' => 'hu_HU', + 'name' => 'Magyar', + 'dir' => 'ltr', + 'flag' => 'hu', + 'facebook' => 'hu_HU', + ), + 'hsb' => array( + 'code' => 'hsb', + 'locale' => 'hsb', + 'name' => 'Hornjoserbšćina', + 'dir' => 'ltr', + 'flag' => 'de', + ), + 'hy' => array( + 'code' => 'hy', + 'locale' => 'hy', + 'name' => 'Հայերեն', + 'dir' => 'ltr', + 'flag' => 'am', + 'facebook' => 'hy_AM', + ), + 'id_ID' => array( + 'code' => 'id', + 'locale' => 'id_ID', + 'name' => 'Bahasa Indonesia', + 'dir' => 'ltr', + 'flag' => 'id', + 'facebook' => 'id_ID', + ), + 'ido' => array( + 'w3c' => 'io', + ), + 'is_IS' => array( + 'code' => 'is', + 'locale' => 'is_IS', + 'name' => 'Íslenska', + 'dir' => 'ltr', + 'flag' => 'is', + 'facebook' => 'is_IS', + ), + 'it_IT' => array( + 'code' => 'it', + 'locale' => 'it_IT', + 'name' => 'Italiano', + 'dir' => 'ltr', + 'flag' => 'it', + 'facebook' => 'it_IT', + ), + 'ja' => array( + 'code' => 'ja', + 'locale' => 'ja', + 'name' => '日本語', + 'dir' => 'ltr', + 'flag' => 'jp', + 'facebook' => 'ja_JP', + ), + 'jv_ID' => array( + 'code' => 'jv', + 'locale' => 'jv_ID', + 'name' => 'Basa Jawa', + 'dir' => 'ltr', + 'flag' => 'id', + 'facebook' => 'jv_ID', + ), + 'ka_GE' => array( + 'code' => 'ka', + 'locale' => 'ka_GE', + 'name' => 'ქართული', + 'dir' => 'ltr', + 'flag' => 'ge', + 'facebook' => 'ka_GE', + ), + 'kab' => array( + 'code' => 'kab', + 'locale' => 'kab', + 'name' => 'Taqbaylit', + 'dir' => 'ltr', + 'flag' => 'dz', + ), + 'kin' => array( + 'w3c' => 'rw', + 'facebook' => 'rw_RW', + ), + 'kk' => array( + 'code' => 'kk', + 'locale' => 'kk', + 'name' => 'Қазақ тілі', + 'dir' => 'ltr', + 'flag' => 'kz', + 'facebook' => 'kk_KZ', + ), + 'km' => array( + 'code' => 'km', + 'locale' => 'km', + 'name' => 'ភាសាខ្មែរ', + 'dir' => 'ltr', + 'flag' => 'kh', + 'facebook' => 'km_KH', + ), + 'kn' => array( + 'code' => 'kn', + 'locale' => 'kn', + 'name' => 'ಕನ್ನಡ', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'kn_IN', + ), + 'ko_KR' => array( + 'code' => 'ko', + 'locale' => 'ko_KR', + 'name' => '한국어', + 'dir' => 'ltr', + 'flag' => 'kr', + 'facebook' => 'ko_KR', + ), + 'ku' => array( + 'facebook' => 'ku_TR', + ), + 'ky_KY' => array( + 'facebook' => 'ky_KG', + ), + 'la' => array( + 'facebook' => 'la_VA', + ), + 'li' => array( + 'facebook' => 'li_NL', + ), + 'lin' => array( + 'facebook' => 'ln_CD', + ), + 'lo' => array( + 'code' => 'lo', + 'locale' => 'lo', + 'name' => 'ພາສາລາວ', + 'dir' => 'ltr', + 'flag' => 'la', + 'facebook' => 'lo_LA', + ), + 'lt_LT' => array( + 'code' => 'lt', + 'locale' => 'lt_LT', + 'name' => 'Lietuviškai', + 'dir' => 'ltr', + 'flag' => 'lt', + 'facebook' => 'lt_LT', + ), + 'lv' => array( + 'code' => 'lv', + 'locale' => 'lv', + 'name' => 'Latviešu valoda', + 'dir' => 'ltr', + 'flag' => 'lv', + 'facebook' => 'lv_LV', + ), + 'mg_MG' => array( + 'facebook' => 'mg_MG', + ), + 'mk_MK' => array( + 'code' => 'mk', + 'locale' => 'mk_MK', + 'name' => 'македонски јазик', + 'dir' => 'ltr', + 'flag' => 'mk', + 'facebook' => 'mk_MK', + ), + 'ml_IN' => array( + 'code' => 'ml', + 'locale' => 'ml_IN', + 'name' => 'മലയാളം', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'ml_IN', + ), + 'mlt' => array( + 'facebook' => 'mt_MT', + ), + 'mn' => array( + 'code' => 'mn', + 'locale' => 'mn', + 'name' => 'Монгол хэл', + 'dir' => 'ltr', + 'flag' => 'mn', + 'facebook' => 'mn_MN', + ), + 'mr' => array( + 'code' => 'mr', + 'locale' => 'mr', + 'name' => 'मराठी', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'mr_IN', + ), + 'mri' => array( + 'w3c' => 'mi', + 'facebook' => 'mi_NZ', + ), + 'ms_MY' => array( + 'code' => 'ms', + 'locale' => 'ms_MY', + 'name' => 'Bahasa Melayu', + 'dir' => 'ltr', + 'flag' => 'my', + 'facebook' => 'ms_MY', + ), + 'my_MM' => array( + 'code' => 'my', + 'locale' => 'my_MM', + 'name' => 'ဗမာစာ', + 'dir' => 'ltr', + 'flag' => 'mm', + 'facebook' => 'my_MM', + ), + 'nb_NO' => array( + 'code' => 'nb', + 'locale' => 'nb_NO', + 'name' => 'Norsk Bokmål', + 'dir' => 'ltr', + 'flag' => 'no', + 'facebook' => 'nb_NO', + ), + 'ne_NP' => array( + 'code' => 'ne', + 'locale' => 'ne_NP', + 'name' => 'नेपाली', + 'dir' => 'ltr', + 'flag' => 'np', + 'facebook' => 'ne_NP', + ), + 'nl_BE' => array( + 'code' => 'nl', + 'locale' => 'nl_BE', + 'name' => 'Nederlands', + 'dir' => 'ltr', + 'flag' => 'be', + 'facebook' => 'nl_BE', + ), + 'nl_NL' => array( + 'code' => 'nl', + 'locale' => 'nl_NL', + 'name' => 'Nederlands', + 'dir' => 'ltr', + 'flag' => 'nl', + 'facebook' => 'nl_NL', + ), + 'nl_NL_formal' => array( + 'code' => 'nl', + 'locale' => 'nl_NL_formal', + 'name' => 'Nederlands', + 'dir' => 'ltr', + 'flag' => 'nl', + 'w3c' => 'nl-NL', + 'facebook' => 'nl_NL', + ), + 'nn_NO' => array( + 'code' => 'nn', + 'locale' => 'nn_NO', + 'name' => 'Norsk Nynorsk', + 'dir' => 'ltr', + 'flag' => 'no', + 'facebook' => 'nn_NO', + ), + 'oci' => array( + 'code' => 'oc', + 'locale' => 'oci', + 'name' => 'Occitan', + 'dir' => 'ltr', + 'flag' => 'occitania', + 'w3c' => 'oc', + ), + 'ory' => array( + 'facebook' => 'or_IN', + ), + 'pa_IN' => array( + 'code' => 'pa', + 'locale' => 'pa_IN', + 'name' => 'ਪੰਜਾਬੀ', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'pa_IN', + ), + 'pl_PL' => array( + 'code' => 'pl', + 'locale' => 'pl_PL', + 'name' => 'Polski', + 'dir' => 'ltr', + 'flag' => 'pl', + 'facebook' => 'pl_PL', + ), + 'ps' => array( + 'code' => 'ps', + 'locale' => 'ps', + 'name' => 'پښتو', + 'dir' => 'rtl', + 'flag' => 'af', + 'facebook' => 'ps_AF', + ), + 'pt_AO' => array( + 'code' => 'pt', + 'locale' => 'pt_AO', + 'name' => 'Português', + 'dir' => 'ltr', + 'flag' => 'ao', + 'facebook' => 'pt_PT', + ), + 'pt_BR' => array( + 'code' => 'pt', + 'locale' => 'pt_BR', + 'name' => 'Português', + 'dir' => 'ltr', + 'flag' => 'br', + 'facebook' => 'pt_BR', + ), + 'pt_PT' => array( + 'code' => 'pt', + 'locale' => 'pt_PT', + 'name' => 'Português', + 'dir' => 'ltr', + 'flag' => 'pt', + 'facebook' => 'pt_PT', + ), + 'pt_PT_ao90' => array( + 'code' => 'pt', + 'locale' => 'pt_PT_ao90', + 'name' => 'Português', + 'dir' => 'ltr', + 'flag' => 'pt', + 'facebook' => 'pt_PT', + ), + 'rhg' => array( + 'code' => 'rhg', + 'locale' => 'rhg', + 'name' => 'Ruáinga', + 'dir' => 'ltr', + 'flag' => 'mm', + ), + 'ro_RO' => array( + 'code' => 'ro', + 'locale' => 'ro_RO', + 'name' => 'Română', + 'dir' => 'ltr', + 'flag' => 'ro', + 'facebook' => 'ro_RO', + ), + 'roh' => array( + 'w3c' => 'rm', + 'facebook' => 'rm_CH', + ), + 'ru_RU' => array( + 'code' => 'ru', + 'locale' => 'ru_RU', + 'name' => 'Русский', + 'dir' => 'ltr', + 'flag' => 'ru', + 'facebook' => 'ru_RU', + ), + 'sa_IN' => array( + 'facebook' => 'sa_IN', + ), + 'sah' => array( + 'code' => 'sah', + 'locale' => 'sah', + 'name' => 'Сахалыы', + 'dir' => 'ltr', + 'flag' => 'ru', + ), + 'si_LK' => array( + 'code' => 'si', + 'locale' => 'si_LK', + 'name' => 'සිංහල', + 'dir' => 'ltr', + 'flag' => 'lk', + 'facebook' => 'si_LK', + ), + 'sk_SK' => array( + 'code' => 'sk', + 'locale' => 'sk_SK', + 'name' => 'Slovenčina', + 'dir' => 'ltr', + 'flag' => 'sk', + 'facebook' => 'sk_SK', + ), + 'skr' => array( + 'code' => 'skr', + 'locale' => 'skr', + 'name' => 'سرائیکی', + 'dir' => 'rtl', + 'flag' => 'pk', + ), + 'sl_SI' => array( + 'code' => 'sl', + 'locale' => 'sl_SI', + 'name' => 'Slovenščina', + 'dir' => 'ltr', + 'flag' => 'si', + 'facebook' => 'sl_SI', + ), + 'sna' => array( + 'facebook' => 'sn_ZW', + ), + 'snd' => array( + 'code' => 'sd', + 'locale' => 'snd', + 'name' => 'سنڌي', + 'dir' => 'rtl', + 'flag' => 'pk', + ), + 'so_SO' => array( + 'code' => 'so', + 'locale' => 'so_SO', + 'name' => 'Af-Soomaali', + 'dir' => 'ltr', + 'flag' => 'so', + 'facebook' => 'so_SO', + ), + 'sq' => array( + 'code' => 'sq', + 'locale' => 'sq', + 'name' => 'Shqip', + 'dir' => 'ltr', + 'flag' => 'al', + 'facebook' => 'sq_AL', + ), + 'sr_RS' => array( + 'code' => 'sr', + 'locale' => 'sr_RS', + 'name' => 'Српски језик', + 'dir' => 'ltr', + 'flag' => 'rs', + 'facebook' => 'sr_RS', + ), + 'srd' => array( + 'w3c' => 'sc', + 'facebook' => 'sc_IT', + ), + 'su_ID' => array( + 'code' => 'su', + 'locale' => 'su_ID', + 'name' => 'Basa Sunda', + 'dir' => 'ltr', + 'flag' => 'id', + 'facebook' => 'su_ID', + ), + 'sv_SE' => array( + 'code' => 'sv', + 'locale' => 'sv_SE', + 'name' => 'Svenska', + 'dir' => 'ltr', + 'flag' => 'se', + 'facebook' => 'sv_SE', + ), + 'sw' => array( + 'code' => 'sw', + 'locale' => 'sw', + 'name' => 'Kiswahili', + 'dir' => 'ltr', + 'flag' => 'ke', + 'facebook' => 'sw_KE', + ), + 'syr' => array( + 'facebook' => 'sy_SY', + ), + 'szl' => array( + 'code' => 'szl', + 'locale' => 'szl', + 'name' => 'Ślōnskŏ gŏdka', + 'dir' => 'ltr', + 'flag' => 'pl', + 'facebook' => 'sz_PL', + ), + 'ta_IN' => array( + 'code' => 'ta', + 'locale' => 'ta_IN', + 'name' => 'தமிழ்', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'ta_IN', + ), + 'ta_LK' => array( + 'code' => 'ta', + 'locale' => 'ta_LK', + 'name' => 'தமிழ்', + 'dir' => 'ltr', + 'flag' => 'lk', + 'facebook' => 'ta_IN', + ), + 'tah' => array( + 'code' => 'ty', + 'locale' => 'tah', + 'name' => 'Reo Tahiti', + 'dir' => 'ltr', + 'flag' => 'pf', + ), + 'te' => array( + 'code' => 'te', + 'locale' => 'te', + 'name' => 'తెలుగు', + 'dir' => 'ltr', + 'flag' => 'in', + 'facebook' => 'te_IN', + ), + 'tg' => array( + 'facebook' => 'tg_TJ', + ), + 'th' => array( + 'code' => 'th', + 'locale' => 'th', + 'name' => 'ไทย', + 'dir' => 'ltr', + 'flag' => 'th', + 'facebook' => 'th_TH', + ), + 'tl' => array( + 'code' => 'tl', + 'locale' => 'tl', + 'name' => 'Tagalog', + 'dir' => 'ltr', + 'flag' => 'ph', + 'facebook' => 'tl_PH', + ), + 'tr_TR' => array( + 'code' => 'tr', + 'locale' => 'tr_TR', + 'name' => 'Türkçe', + 'dir' => 'ltr', + 'flag' => 'tr', + 'facebook' => 'tr_TR', + ), + 'tt_RU' => array( + 'code' => 'tt', + 'locale' => 'tt_RU', + 'name' => 'Татар теле', + 'dir' => 'ltr', + 'flag' => 'ru', + 'facebook' => 'tt_RU', + ), + 'tuk' => array( + 'w3c' => 'tk', + 'facebook' => 'tk_TM', + ), + 'tzm' => array( + 'facebook' => 'tz_MA', + ), + 'ug_CN' => array( + 'code' => 'ug', + 'locale' => 'ug_CN', + 'name' => 'Uyƣurqə', + 'dir' => 'ltr', + 'flag' => 'cn', + ), + 'uk' => array( + 'code' => 'uk', + 'locale' => 'uk', + 'name' => 'Українська', + 'dir' => 'ltr', + 'flag' => 'ua', + 'facebook' => 'uk_UA', + ), + 'ur' => array( + 'code' => 'ur', + 'locale' => 'ur', + 'name' => 'اردو', + 'dir' => 'rtl', + 'flag' => 'pk', + 'facebook' => 'ur_PK', + ), + 'uz_UZ' => array( + 'code' => 'uz', + 'locale' => 'uz_UZ', + 'name' => 'Oʻzbek', + 'dir' => 'ltr', + 'flag' => 'uz', + 'facebook' => 'uz_UZ', + ), + 'vec' => array( + 'code' => 'vec', + 'locale' => 'vec', + 'name' => 'Vèneto', + 'dir' => 'ltr', + 'flag' => 'veneto', + ), + 'vi' => array( + 'code' => 'vi', + 'locale' => 'vi', + 'name' => 'Tiếng Việt', + 'dir' => 'ltr', + 'flag' => 'vn', + 'facebook' => 'vi_VN', + ), + 'xho' => array( + 'facebook' => 'xh_ZA', + ), + 'yor' => array( + 'facebook' => 'yo_NG', + ), + 'zh_CN' => array( + 'code' => 'zh', + 'locale' => 'zh_CN', + 'name' => '中文 (中国)', + 'dir' => 'ltr', + 'flag' => 'cn', + 'facebook' => 'zh_CN', + ), + 'zh_HK' => array( + 'code' => 'zh', + 'locale' => 'zh_HK', + 'name' => '中文 (香港)', + 'dir' => 'ltr', + 'flag' => 'hk', + 'facebook' => 'zh_HK', + ), + 'zh_TW' => array( + 'code' => 'zh', + 'locale' => 'zh_TW', + 'name' => '中文 (台灣)', + 'dir' => 'ltr', + 'flag' => 'tw', + 'facebook' => 'zh_TW', + ), +); diff --git a/wp-content/plugins/polylang/settings/settings-browser.php b/wp-content/plugins/polylang/settings/settings-browser.php new file mode 100644 index 00000000..d29f860f --- /dev/null +++ b/wp-content/plugins/polylang/settings/settings-browser.php @@ -0,0 +1,105 @@ +options = &$polylang->options; + parent::__construct( + $polylang, + array( + 'module' => 'browser', + 'title' => __( 'Detect browser language', 'polylang' ), + 'description' => __( 'When the front page is visited, set the language according to the browser preference', 'polylang' ), + 'active_option' => $this->is_available() ? 'browser' : false, + ) + ); + + if ( ! class_exists( 'PLL_Xdata_Domain', true ) ) { + add_action( 'admin_print_footer_scripts', array( $this, 'print_js' ) ); + } + } + + /** + * Tells if the option is available + * + * @since 2.0 + * + * @return bool + */ + protected function is_available() { + return ( 3 > $this->options['force_lang'] ) || class_exists( 'PLL_Xdata_Domain', true ); + } + + /** + * Tells if the module is active + * + * @since 1.8 + * + * @return bool + */ + public function is_active() { + return $this->is_available() ? parent::is_active() : false; + } + + /** + * Displays the javascript to handle dynamically the change in url modifications + * as the preferred browser language is not used when the language is set from different domains + * + * @since 1.8 + */ + public function print_js() { + wp_enqueue_script( 'jquery' ); + + if ( parent::is_active() && 3 > $this->options['force_lang'] ) { + $func = 'removeClass( "inactive" ).addClass( "active" )'; + $link = sprintf( '%s', $this->action_links['deactivate'] ); + } + else { + $func = 'removeClass( "active" ).addClass( "inactive" )'; + $link = sprintf( '%s', $this->action_links['activate'] ); + } + + $deactivated = sprintf( '%s', $this->action_links['deactivated'] ); + + ?> + + 'cpt', + 'title' => __( 'Custom post types and Taxonomies', 'polylang' ), + 'description' => __( 'Activate languages and translations management for the custom post types and the taxonomies.', 'polylang' ), + ) + ); + + $public_post_types = get_post_types( array( 'public' => true, '_builtin' => false ) ); + /** This filter is documented in include/model.php */ + $this->post_types = array_unique( apply_filters( 'pll_get_post_types', $public_post_types, true ) ); + + /** This filter is documented in include/model.php */ + $programmatically_active_post_types = array_unique( apply_filters( 'pll_get_post_types', array(), false ) ); + $this->disabled_post_types = array_intersect( $programmatically_active_post_types, $this->post_types ); + + $public_taxonomies = get_taxonomies( array( 'public' => true, '_builtin' => false ) ); + $public_taxonomies = array_diff( $public_taxonomies, get_taxonomies( array( '_pll' => true ) ) ); + /** This filter is documented in include/model.php */ + $this->taxonomies = array_unique( apply_filters( 'pll_get_taxonomies', $public_taxonomies, true ) ); + + /** This filter is documented in include/model.php */ + $programmatically_active_taxonomies = array_unique( apply_filters( 'pll_get_taxonomies', array(), false ) ); + $this->disabled_taxonomies = array_intersect( $programmatically_active_taxonomies, $this->taxonomies ); + } + + /** + * Tells if the module is active + * + * @since 1.8 + * + * @return bool + */ + public function is_active() { + return ! empty( $this->post_types ) || ! empty( $this->taxonomies ); + } + + /** + * Displays the settings form + * + * @since 1.8 + */ + protected function form() { + if ( ! empty( $this->post_types ) ) {?> +

    +
      + post_types as $post_type ) { + $pt = get_post_type_object( $post_type ); + if ( ! empty( $pt ) ) { + $disabled = in_array( $post_type, $this->disabled_post_types ); + printf( + '
    • ', + esc_attr( $post_type ), + checked( in_array( $post_type, $this->options['post_types'] ) || $disabled, true, false ), + disabled( $disabled, true, false ), + esc_html( $pt->labels->name ) + ); + } + } + ?> +
    +

    + taxonomies ) ) { + ?> +

    +
      + taxonomies as $taxonomy ) { + $tax = get_taxonomy( $taxonomy ); + if ( ! empty( $tax ) ) { + $disabled = in_array( $taxonomy, $this->disabled_taxonomies ); + printf( + '
    • ', + esc_attr( $taxonomy ), + checked( in_array( $taxonomy, $this->options['taxonomies'] ) || $disabled, true, false ), + disabled( $disabled, true, false ), + esc_html( $tax->labels->name ) + ); + } + } + ?> +
    +

    + 'licenses', + 'title' => __( 'License keys', 'polylang' ), + 'description' => __( 'Manage licenses for Polylang Pro and add-ons.', 'polylang' ), + ) + ); + + $this->buttons['cancel'] = sprintf( '', __( 'Close', 'polylang' ) ); + + $this->items = apply_filters( 'pll_settings_licenses', array() ); + + add_action( 'wp_ajax_pll_deactivate_license', array( $this, 'deactivate_license' ) ); + } + + /** + * Tells if the module is active + * + * @since 1.9 + * + * @return bool + */ + public function is_active() { + return ! empty( $this->items ); + } + + /** + * Displays the settings form + * + * @since 1.9 + */ + protected function form() { + if ( ! empty( $this->items ) ) { ?> + + items as $item ) { + echo $this->get_row( $item ); // phpcs:ignore WordPress.Security.EscapeOutput + } + ?> +
    + get_form_field(); + } + + /** + * Ajax method to save the license keys and activate the licenses at the same time + * Overrides parent's method + * + * @since 1.9 + */ + public function save_options() { + check_ajax_referer( 'pll_options', '_pll_nonce' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( -1 ); + } + + if ( isset( $_POST['module'] ) && $this->module === $_POST['module'] && ! empty( $_POST['licenses'] ) ) { + $x = new WP_Ajax_Response(); + foreach ( $this->items as $item ) { + if ( ! empty( $_POST['licenses'][ $item->id ] ) ) { + $updated_item = $item->activate_license( sanitize_key( $_POST['licenses'][ $item->id ] ) ); + $x->Add( array( 'what' => 'license-update', 'data' => $item->id, 'supplemental' => array( 'html' => $this->get_row( $updated_item ) ) ) ); + } + } + + // Updated message + add_settings_error( 'general', 'settings_updated', __( 'Settings saved.', 'polylang' ), 'updated' ); + ob_start(); + settings_errors(); + $x->Add( array( 'what' => 'success', 'data' => ob_get_clean() ) ); + $x->send(); + } + } + + /** + * Ajax method to deactivate a license + * + * @since 1.9 + */ + public function deactivate_license() { + check_ajax_referer( 'pll_options', '_pll_nonce' ); + + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( -1 ); + } + + if ( ! isset( $_POST['id'] ) ) { + wp_die( 0 ); + } + + $id = substr( sanitize_text_field( wp_unslash( $_POST['id'] ) ), 11 ); + wp_send_json( + array( + 'id' => $id, + 'html' => $this->get_row( $this->items[ $id ]->deactivate_license() ), + ) + ); + } +} diff --git a/wp-content/plugins/polylang/settings/settings-media.php b/wp-content/plugins/polylang/settings/settings-media.php new file mode 100644 index 00000000..aba2494c --- /dev/null +++ b/wp-content/plugins/polylang/settings/settings-media.php @@ -0,0 +1,37 @@ + 'media', + 'title' => __( 'Media', 'polylang' ), + 'description' => __( 'Activate languages and translations for media', 'polylang' ), + 'active_option' => 'media_support', + ) + ); + } +} diff --git a/wp-content/plugins/polylang/settings/settings-module.php b/wp-content/plugins/polylang/settings/settings-module.php new file mode 100644 index 00000000..43f770f8 --- /dev/null +++ b/wp-content/plugins/polylang/settings/settings-module.php @@ -0,0 +1,338 @@ +options = &$polylang->options; + $this->model = &$polylang->model; + $this->links_model = &$polylang->links_model; + + $args = wp_parse_args( + $args, + array( + 'title' => '', + 'description' => '', + 'active_option' => false, + ) + ); + + foreach ( $args as $prop => $value ) { + $this->$prop = $value; + } + + // All possible action links, even if not always a link ;-) + $this->action_links = array( + 'configure' => sprintf( + '%s', + esc_attr__( 'Configure this module', 'polylang' ), + '#', + esc_html__( 'Settings', 'polylang' ) + ), + 'deactivate' => sprintf( + '%s', + esc_attr__( 'Deactivate this module', 'polylang' ), + esc_url( wp_nonce_url( '?page=mlang&tab=modules&pll_action=deactivate&noheader=true&module=' . $this->module, 'pll_deactivate' ) ), + esc_html__( 'Deactivate', 'polylang' ) + ), + 'activate' => sprintf( + '%s', + esc_attr__( 'Activate this module', 'polylang' ), + esc_url( wp_nonce_url( '?page=mlang&tab=modules&pll_action=activate&noheader=true&module=' . $this->module, 'pll_activate' ) ), + esc_html__( 'Activate', 'polylang' ) + ), + 'activated' => esc_html__( 'Activated', 'polylang' ), + 'deactivated' => esc_html__( 'Deactivated', 'polylang' ), + ); + + $this->buttons = array( + 'cancel' => sprintf( '', esc_html__( 'Cancel', 'polylang' ) ), + 'save' => sprintf( '', esc_html__( 'Save Changes', 'polylang' ) ), + ); + + // Ajax action to save options + add_action( 'wp_ajax_pll_save_options', array( $this, 'save_options' ) ); + } + + /** + * Tells if the module is active + * + * @since 1.8 + * + * @return bool + */ + public function is_active() { + return empty( $this->active_option ) || ! empty( $this->options[ $this->active_option ] ); + } + + /** + * Activates the module + * + * @since 1.8 + */ + public function activate() { + if ( ! empty( $this->active_option ) ) { + $this->options[ $this->active_option ] = true; + update_option( 'polylang', $this->options ); + } + } + + /** + * Deactivates the module + * + * @since 1.8 + */ + public function deactivate() { + if ( ! empty( $this->active_option ) ) { + $this->options[ $this->active_option ] = false; + update_option( 'polylang', $this->options ); + } + } + + /** + * Protected method to display a configuration form + * + * @since 1.8 + */ + protected function form() { + // Child classes can provide a form + } + + /** + * Public method returning the form if any + * + * @since 1.8 + * + * @return string + */ + public function get_form() { + // Read the form only once + if ( false === $this->form ) { + ob_start(); + $this->form(); + $this->form = ob_get_clean(); + } + + return $this->form; + } + + /** + * Allows child classes to validate their options before saving + * + * @since 1.8 + * + * @param array $options Raw options + * @return array Options + */ + protected function update( $options ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + return array(); // It's responsibility of the child class to decide what is saved + } + + /** + * Ajax method to save the options + * + * @since 1.8 + */ + public function save_options() { + check_ajax_referer( 'pll_options', '_pll_nonce' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( -1 ); + } + + if ( isset( $_POST['module'] ) && $this->module === $_POST['module'] ) { + // It's up to the child class to decide which options are saved, whether there are errors or not + $post = array_diff_key( $_POST, array_flip( array( 'action', 'module', 'pll_ajax_backend', '_pll_nonce' ) ) ); + $options = $this->update( $post ); + $this->options = array_merge( $this->options, $options ); + update_option( 'polylang', $this->options ); + + // Refresh language cache in case home urls have been modified + $this->model->clean_languages_cache(); + + // Refresh rewrite rules in case rewrite, hide_default, post types or taxonomies options have been modified + // Don't use flush_rewrite_rules as we don't have the right links model and permastruct + delete_option( 'rewrite_rules' ); + + ob_start(); + + if ( ! get_settings_errors() ) { + // Send update message + add_settings_error( 'general', 'settings_updated', __( 'Settings saved.', 'polylang' ), 'updated' ); + settings_errors(); + $x = new WP_Ajax_Response( array( 'what' => 'success', 'data' => ob_get_clean() ) ); + $x->send(); + } else { + // Send error messages + settings_errors(); + $x = new WP_Ajax_Response( array( 'what' => 'error', 'data' => ob_get_clean() ) ); + $x->send(); + } + } + } + + /** + * Get the row actions + * + * @since 1.8 + * + * @return array + */ + protected function get_actions() { + $actions = array(); + + if ( $this->is_active() && $this->get_form() ) { + $actions[] = 'configure'; + } + + if ( $this->active_option ) { + $actions[] = $this->is_active() ? 'deactivate' : 'activate'; + } + + if ( empty( $actions ) ) { + $actions[] = $this->is_active() ? 'activated' : 'deactivated'; + } + + return $actions; + } + + /** + * Get the actions links + * + * @since 1.8 + * + * @return array + */ + public function get_action_links() { + return array_intersect_key( $this->action_links, array_flip( $this->get_actions() ) ); + } + + /** + * Default upgrade message ( to Pro version ) + * + * @since 1.9 + * + * @return string + */ + protected function default_upgrade_message() { + return sprintf( + '%s %s', + __( 'To enable this feature, you need Polylang Pro.', 'polylang' ), + 'https://polylang.pro', + __( 'Upgrade now.', 'polylang' ) + ); + } + + /** + * Allows child classes to display an upgrade message + * + * @since 1.9 + * + * @return string + */ + public function get_upgrade_message() { + return ''; + } + + /** + * Get the buttons + * + * @since 1.9 + * + * @return array + */ + public function get_buttons() { + return $this->buttons; + } +} diff --git a/wp-content/plugins/polylang/settings/settings-url.php b/wp-content/plugins/polylang/settings/settings-url.php new file mode 100644 index 00000000..012aa593 --- /dev/null +++ b/wp-content/plugins/polylang/settings/settings-url.php @@ -0,0 +1,314 @@ + 'url', + 'title' => __( 'URL modifications', 'polylang' ), + 'description' => __( 'Decide how your URLs will look like.', 'polylang' ), + 'configure' => true, + ) + ); + + $this->links_model = &$polylang->links_model; + $this->page_on_front = &$polylang->static_pages->page_on_front; + } + + /** + * Displays the fieldset to choose how the language is set + * + * @since 1.8 + */ + protected function force_lang() { + ?> + +

    + +

    ' . esc_html( home_url( $this->links_model->using_permalinks ? 'en/my-post/' : '?lang=en&p=1' ) ) . ''; ?>

    + +

    ' . esc_html( str_replace( array( '://', 'www.' ), array( '://en.', '' ), home_url( 'my-post/' ) ) ) . ''; ?>

    + + options['force_lang'] ? '' : 'style="display: none;"'; ?>> + model->get_languages_list() as $lg ) { + $url = isset( $this->options['domains'][ $lg->slug ] ) ? $this->options['domains'][ $lg->slug ] : ( $lg->slug == $this->options['default_lang'] ? $this->links_model->home : '' ); + printf( + '' . + '', + esc_attr( $lg->slug ), + esc_attr( $lg->name ), + esc_url( $url ) + ); + } + ?> +
    + + + + +

    ' . esc_html( home_url( 'en/' ) ) . ''; ?>

    + +

    ' . esc_html( home_url( 'language/en/' ) ) . ''; ?>

    + + +

    + model->post->get_language( $this->page_on_front ); + $lang = $lang ? $lang : $this->model->get_language( $this->options['default_lang'] ); + printf( + /* translators: %1$s example url when the option is active. %2$s example url when the option is not active */ + esc_html__( 'Example: %1$s instead of %2$s', 'polylang' ), + '' . esc_html( $this->links_model->home_url( $lang ) ) . '', + '' . esc_html( _get_page_link( $this->page_on_front ) ) . '' + ); + ?> +

    + +
    +
    + force_lang(); ?> +
    +
    + +
    +
    $this->options['force_lang'] ? '' : 'style="display: none;"'; ?>> + hide_default(); ?> +
    + links_model->using_permalinks ) { + ?> +
    $this->options['force_lang'] ? '' : 'style="display: none;"'; ?>> + rewrite(); ?> +
    + page_on_front ) { + ?> +
    $this->options['force_lang'] ? '' : 'style="display: none;"'; ?>> + redirect_lang(); ?> +
    + +
    + $domain ) { + if ( empty( $domain ) ) { + $lang = $this->model->get_language( $key ); + add_settings_error( + 'general', + 'pll_invalid_domain', + esc_html( + sprintf( + /* translators: %s is a native language name */ + __( 'Please enter a valid URL for %s.', 'polylang' ), + $lang->name + ) + ) + ); + } + else { + $newoptions['domains'][ $key ] = esc_url_raw( trim( $domain ) ); + } + } + } + + foreach ( array( 'hide_default', 'redirect_lang' ) as $key ) { + $newoptions[ $key ] = isset( $options[ $key ] ) ? 1 : 0; + } + + if ( 3 == $options['force_lang'] ) { + if ( ! class_exists( 'PLL_Xdata_Domain', true ) ) { + $newoptions['browser'] = 0; + } + $newoptions['hide_default'] = 0; + } + + // Check if domains exist + if ( $newoptions['force_lang'] > 1 ) { + $this->check_domains( $newoptions ); + } + + return $newoptions; // Take care to return only validated options + } + + /** + * Check if subdomains or domains are accessible + * + * @since 1.8 + * + * @param array $options new set of options to test + */ + protected function check_domains( $options ) { + $options = array_merge( $this->options, $options ); + $model = new PLL_Model( $options ); + $links_model = $model->get_links_model(); + foreach ( $this->model->get_languages_list() as $lang ) { + $url = add_query_arg( 'deactivate-polylang', 1, $links_model->home_url( $lang ) ); + // Don't redefine vip_safe_wp_remote_get() as it has not the same signature as wp_remote_get() + $response = function_exists( 'vip_safe_wp_remote_get' ) ? vip_safe_wp_remote_get( esc_url_raw( $url ) ) : wp_remote_get( esc_url_raw( $url ) ); + $response_code = wp_remote_retrieve_response_code( $response ); + + if ( 200 != $response_code ) { + add_settings_error( + 'general', + 'pll_invalid_domain', + esc_html( + sprintf( + /* translators: %s is an url */ + __( 'Polylang was unable to access the %s URL. Please check that the URL is valid.', 'polylang' ), + $url + ) + ) + ); + } + } + } +} diff --git a/wp-content/plugins/polylang/settings/settings.php b/wp-content/plugins/polylang/settings/settings.php new file mode 100644 index 00000000..90d422d9 --- /dev/null +++ b/wp-content/plugins/polylang/settings/settings.php @@ -0,0 +1,405 @@ + inherited, reference to Polylang options array + * model => inherited, reference to PLL_Model object + * links_model => inherited, reference to PLL_Links_Model object + * links => inherited, reference to PLL_Admin_Links object + * static_pages => inherited, reference to PLL_Admin_Static_Pages object + * filters_links => inherited, reference to PLL_Filters_Links object + * curlang => inherited, optional, current language used to filter admin content + * pref_lang => inherited, preferred language used as default when saving posts or terms + * + * @since 1.2 + */ +class PLL_Settings extends PLL_Admin_Base { + + /** + * Name of the active module + * + * @var string $active_tab + */ + protected $active_tab; + + /** + * Array of modules classes + * + * @var array $modules + */ + protected $modules; + + /** + * Constructor + * + * @since 1.2 + * + * @param object $links_model + */ + public function __construct( &$links_model ) { + parent::__construct( $links_model ); + + if ( isset( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $this->active_tab = 'mlang' === $_GET['page'] ? 'lang' : substr( sanitize_key( $_GET['page'] ), 6 ); // phpcs:ignore WordPress.Security.NonceVerification + } + + PLL_Admin_Strings::init(); + + add_action( 'admin_init', array( $this, 'register_settings_modules' ) ); + + // Adds screen options and the about box in the languages admin panel + add_action( 'load-toplevel_page_mlang', array( $this, 'load_page' ) ); + add_action( 'load-languages_page_mlang_strings', array( $this, 'load_page_strings' ) ); + + // Saves per-page value in screen option + add_filter( 'set-screen-option', array( $this, 'set_screen_option' ), 10, 3 ); + } + + /** + * Initializes the modules + * + * @since 1.8 + */ + public function register_settings_modules() { + $modules = array(); + + if ( $this->model->get_languages_list() ) { + $modules = array( + 'PLL_Settings_Url', + 'PLL_Settings_Browser', + 'PLL_Settings_Media', + 'PLL_Settings_CPT', + ); + } + + $modules[] = 'PLL_Settings_Licenses'; + + /** + * Filter the list of setting modules + * + * @since 1.8 + * + * @param array $modules the list of module classes + */ + $modules = apply_filters( 'pll_settings_modules', $modules ); + + foreach ( $modules as $key => $class ) { + $key = is_numeric( $key ) ? strtolower( str_replace( 'PLL_Settings_', '', $class ) ) : $key; + $this->modules[ $key ] = new $class( $this ); + } + } + + /** + * Loads the about metabox + * + * @since 0.8 + */ + public function metabox_about() { + include __DIR__ . '/view-about.php'; + } + + /** + * Adds screen options and the about box in the languages admin panel + * + * @since 0.9.5 + */ + public function load_page() { + if ( ! defined( 'PLL_DISPLAY_ABOUT' ) || PLL_DISPLAY_ABOUT ) { + add_meta_box( + 'pll-about-box', + __( 'About Polylang', 'polylang' ), + array( $this, 'metabox_about' ), + 'toplevel_page_mlang', + 'normal' + ); + } + + add_screen_option( + 'per_page', + array( + 'label' => __( 'Languages', 'polylang' ), + 'default' => 10, + 'option' => 'pll_lang_per_page', + ) + ); + + add_action( 'admin_notices', array( $this, 'notice_objects_with_no_lang' ) ); + } + + /** + * Adds screen options in the strings translations admin panel + * + * @since 2.1 + */ + public function load_page_strings() { + add_screen_option( + 'per_page', + array( + 'label' => __( 'Strings translations', 'polylang' ), + 'default' => 10, + 'option' => 'pll_strings_per_page', + ) + ); + } + + /** + * Save the "Views/Uploads per page" option set by this user + * + * @since 0.9.5 + * + * @param mixed $status false or value returned by previous filter + * @param string $option Name of the option being changed + * @param string $value Value of the option + * + * @return string New value if this is our option, otherwise nothing + */ + public function set_screen_option( $status, $option, $value ) { + return 'pll_lang_per_page' === $option || 'pll_strings_per_page' === $option ? $value : $status; + } + + /** + * Manages the user input for the languages pages + * + * @since 1.9 + * + * @param string $action + */ + public function handle_actions( $action ) { + switch ( $action ) { + case 'add': + check_admin_referer( 'add-lang', '_wpnonce_add-lang' ); + $errors = $this->model->add_language( $_POST ); + + if ( is_wp_error( $errors ) ) { + foreach ( $errors->get_error_messages() as $message ) { + add_settings_error( 'general', 'pll_add_language', $message ); + } + } else { + add_settings_error( 'general', 'pll_languages_created', __( 'Language added.', 'polylang' ), 'updated' ); + $locale = sanitize_text_field( wp_unslash( $_POST['locale'] ) ); // phpcs:ignore WordPress.Security + + if ( 'en_US' !== $locale && current_user_can( 'install_languages' ) ) { + // Attempts to install the language pack + require_once ABSPATH . 'wp-admin/includes/translation-install.php'; + if ( ! wp_download_language_pack( $locale ) ) { + add_settings_error( 'general', 'pll_download_mo', __( 'The language was created, but the WordPress language file was not downloaded. Please install it manually.', 'polylang' ) ); + } + + // Force checking for themes and plugins translations updates + wp_clean_themes_cache(); + wp_clean_plugins_cache(); + } + } + self::redirect(); // To refresh the page ( possible thanks to the $_GET['noheader']=true ) + break; + + case 'delete': + check_admin_referer( 'delete-lang' ); + + if ( ! empty( $_GET['lang'] ) && $this->model->delete_language( (int) $_GET['lang'] ) ) { + add_settings_error( 'general', 'pll_languages_deleted', __( 'Language deleted.', 'polylang' ), 'updated' ); + } + + self::redirect(); // To refresh the page ( possible thanks to the $_GET['noheader']=true ) + break; + + case 'update': + check_admin_referer( 'add-lang', '_wpnonce_add-lang' ); + $errors = $this->model->update_language( $_POST ); + + if ( is_wp_error( $errors ) ) { + foreach ( $errors->get_error_messages() as $message ) { + add_settings_error( 'general', 'pll_update_language', $message ); + } + } else { + add_settings_error( 'general', 'pll_languages_updated', __( 'Language updated.', 'polylang' ), 'updated' ); + } + + self::redirect(); // To refresh the page ( possible thanks to the $_GET['noheader']=true ) + break; + + case 'default-lang': + check_admin_referer( 'default-lang' ); + + if ( $lang = $this->model->get_language( (int) $_GET['lang'] ) ) { + $this->model->update_default_lang( $lang->slug ); + } + + self::redirect(); // To refresh the page ( possible thanks to the $_GET['noheader']=true ) + break; + + case 'content-default-lang': + check_admin_referer( 'content-default-lang' ); + + if ( $nolang = $this->model->get_objects_with_no_lang() ) { + if ( ! empty( $nolang['posts'] ) ) { + $this->model->set_language_in_mass( 'post', $nolang['posts'], $this->options['default_lang'] ); + } + if ( ! empty( $nolang['terms'] ) ) { + $this->model->set_language_in_mass( 'term', $nolang['terms'], $this->options['default_lang'] ); + } + } + + self::redirect(); // To refresh the page ( possible thanks to the $_GET['noheader']=true ) + break; + + case 'activate': + check_admin_referer( 'pll_activate' ); + if ( isset( $_GET['module'] ) ) { + $module = sanitize_key( $_GET['module'] ); + if ( isset( $this->modules[ $module ] ) ) { + $this->modules[ $module ]->activate(); + } + } + self::redirect(); + break; + + case 'deactivate': + check_admin_referer( 'pll_deactivate' ); + if ( isset( $_GET['module'] ) ) { + $module = sanitize_key( $_GET['module'] ); + if ( isset( $this->modules[ $module ] ) ) { + $this->modules[ $module ]->deactivate(); + } + } + self::redirect(); + break; + + default: + /** + * Fires when a non default action has been sent to Polylang settings + * + * @since 1.8 + */ + do_action( "mlang_action_$action" ); + break; + } + } + + /** + * Displays the 3 tabs pages: languages, strings translations, settings + * Also manages user input for these pages + * + * @since 0.1 + */ + public function languages_page() { + switch ( $this->active_tab ) { + case 'lang': + // Prepare the list table of languages + $list_table = new PLL_Table_Languages(); + $list_table->prepare_items( $this->model->get_languages_list() ); + break; + + case 'strings': + $string_table = new PLL_Table_String( $this->model->get_languages_list() ); + $string_table->prepare_items(); + break; + } + + // Handle user input + $action = isset( $_REQUEST['pll_action'] ) ? sanitize_key( $_REQUEST['pll_action'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification + if ( 'edit' === $action && ! empty( $_GET['lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + // phpcs:ignore WordPress.Security.NonceVerification, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + $edit_lang = $this->model->get_language( (int) $_GET['lang'] ); + } else { + $this->handle_actions( $action ); + } + + // Displays the page + include __DIR__ . '/view-languages.php'; + } + + /** + * Enqueues scripts and styles + */ + public function admin_enqueue_scripts() { + parent::admin_enqueue_scripts(); + + $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + + wp_enqueue_script( 'pll_admin', plugins_url( '/js/admin' . $suffix . '.js', POLYLANG_FILE ), array( 'jquery', 'wp-ajax-response', 'postbox', 'jquery-ui-selectmenu' ), POLYLANG_VERSION ); + wp_localize_script( 'pll_admin', 'pll_flag_base_url', plugins_url( '/flags/', POLYLANG_FILE ) ); + wp_localize_script( 'pll_admin', 'pll_dismiss_notice', esc_html__( 'Dismiss this notice.', 'polylang' ) ); + + wp_enqueue_style( 'pll_selectmenu', plugins_url( '/css/selectmenu' . $suffix . '.css', POLYLANG_FILE ), array(), POLYLANG_VERSION ); + } + + /** + * Displays a notice when there are objects with no language assigned + * + * @since 1.8 + */ + public function notice_objects_with_no_lang() { + if ( ! empty( $this->options['default_lang'] ) && $this->model->get_objects_with_no_lang( 1 ) ) { + printf( + '

    %s %s

    ', + esc_html__( 'There are posts, pages, categories or tags without language.', 'polylang' ), + esc_url( wp_nonce_url( '?page=mlang&pll_action=content-default-lang&noheader=true', 'content-default-lang' ) ), + esc_html__( 'You can set them all to the default language.', 'polylang' ) + ); + } + } + + /** + * Redirects to language page ( current active tab ) + * saves error messages in a transient for reuse in redirected page + * + * @since 1.5 + * + * @param array $args query arguments to add to the url + */ + public static function redirect( $args = array() ) { + if ( $errors = get_settings_errors() ) { + set_transient( 'settings_errors', $errors, 30 ); + $args['settings-updated'] = 1; + } + // Remove possible 'pll_action' and 'lang' query args from the referer before redirecting + wp_safe_redirect( add_query_arg( $args, remove_query_arg( array( 'pll_action', 'lang' ), wp_get_referer() ) ) ); + exit; + } + + /** + * Get the list of predefined languages + * + * @since 2.3 + */ + public static function get_predefined_languages() { + require_once ABSPATH . 'wp-admin/includes/translation-install.php'; + + $languages = include __DIR__ . '/languages.php'; + $translations = wp_get_available_translations(); + + // Keep only languages with existing WP language pack + // Unless the transient has expired and we don't have an internet connection to refresh it + if ( ! empty( $translations ) ) { + $translations['en_US'] = ''; // Languages packs don't include en_US + $languages = array_intersect_key( $languages, $translations ); + } + + /** + * Filter the list of predefined languages + * + * @since 1.7.10 + * @since 2.3 The languages arrays use associative keys instead of numerical keys + * @see https://github.com/polylang/polylang/blob/2.8.2/settings/languages.php the list of predefined languages + * + * @param array $languages + */ + $languages = apply_filters( 'pll_predefined_languages', $languages ); + + // Keep only languages with all necessary informations + foreach ( $languages as $k => $lang ) { + if ( ! isset( $lang['code'], $lang['locale'], $lang['name'], $lang['dir'], $lang['flag'] ) ) { + unset( $languages[ $k ] ); + } + } + + return $languages; + } +} diff --git a/wp-content/plugins/polylang/settings/table-languages.php b/wp-content/plugins/polylang/settings/table-languages.php new file mode 100644 index 00000000..8b937d1e --- /dev/null +++ b/wp-content/plugins/polylang/settings/table-languages.php @@ -0,0 +1,275 @@ + 'Languages', // Do not translate ( used for css class ) + 'ajax' => false, + ) + ); + } + + /** + * Generates content for a single row of the table + * + * @since 1.8 + * + * @param object $item The current item + */ + public function single_row( $item ) { + /** + * Filter the list of classes assigned a row in the languages list table + * + * @since 1.8 + * + * @param array $classes list of class names + * @param object $item the current item + */ + $classes = apply_filters( 'pll_languages_row_classes', array(), $item ); + echo '' : ' class="' . esc_attr( implode( ' ', $classes ) ) . '">' ); + $this->single_row_columns( $item ); + echo ''; + } + + /** + * Displays the item information in a column ( default case ) + * + * @since 0.1 + * + * @param object $item + * @param string $column_name + * @return string + */ + public function column_default( $item, $column_name ) { + switch ( $column_name ) { + case 'locale': + case 'slug': + return esc_html( $item->$column_name ); + + case 'term_group': + case 'count': + return (int) $item->$column_name; + + default: + return $item->$column_name; // flag + } + } + + /** + * Displays the item information in the column 'name' + * Displays the edit and delete action links + * + * @since 0.1 + * + * @param object $item + * @return string + */ + public function column_name( $item ) { + return sprintf( + '%s', + esc_attr__( 'Edit this language', 'polylang' ), + esc_url( admin_url( 'admin.php?page=mlang&pll_action=edit&lang=' . $item->term_id ) ), + esc_html( $item->name ) + ); + } + + /** + * Displays the item information in the default language + * Displays the 'make default' action link + * + * @since 1.8 + * + * @param object $item + * @return string + */ + public function column_default_lang( $item ) { + $options = get_option( 'polylang' ); + + if ( $options['default_lang'] != $item->slug ) { + $s = sprintf( + '
    + %3$s +
    ', + esc_attr__( 'Select as default language', 'polylang' ), + wp_nonce_url( '?page=mlang&pll_action=default-lang&noheader=true&lang=' . $item->term_id, 'default-lang' ), + /* translators: accessibility text, %s is a native language name */ + esc_html( sprintf( __( 'Choose %s as default language', 'polylang' ), $item->name ) ) + ); + + /** + * Filter the default language row action in the languages list table + * + * @since 1.8 + * + * @param string $s html markup of the action + * @param object $item + */ + $s = apply_filters( 'pll_default_lang_row_action', $s, $item ); + } else { + $s = sprintf( + '%1$s', + /* translators: accessibility text */ + esc_html__( 'Default language', 'polylang' ) + ); + } + + return $s; + } + + /** + * Gets the list of columns + * + * @since 0.1 + * + * @return array the list of column titles + */ + public function get_columns() { + return array( + 'name' => esc_html__( 'Full name', 'polylang' ), + 'locale' => esc_html__( 'Locale', 'polylang' ), + 'slug' => esc_html__( 'Code', 'polylang' ), + 'default_lang' => sprintf( '%2$s', esc_attr__( 'Default language', 'polylang' ), esc_html__( 'Default language', 'polylang' ) ), + 'term_group' => esc_html__( 'Order', 'polylang' ), + 'flag' => esc_html__( 'Flag', 'polylang' ), + 'count' => esc_html__( 'Posts', 'polylang' ), + ); + } + + /** + * Gets the list of sortable columns + * + * @since 0.1 + * + * @return array + */ + public function get_sortable_columns() { + return array( + 'name' => array( 'name', true ), // sorted by name by default + 'locale' => array( 'locale', false ), + 'slug' => array( 'slug', false ), + 'term_group' => array( 'term_group', false ), + 'count' => array( 'count', false ), + ); + } + + /** + * Gets the name of the default primary column. + * + * @since 2.1 + * + * @return string Name of the default primary column, in this case, 'name'. + */ + protected function get_default_primary_column_name() { + return 'name'; + } + + /** + * Generates and display row actions links for the list table. + * + * @since 1.8 + * + * @param object $item The item being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string The row actions output. + */ + protected function handle_row_actions( $item, $column_name, $primary ) { + if ( $primary !== $column_name ) { + return ''; + } + + $actions = array( + 'edit' => sprintf( + '%s', + esc_attr__( 'Edit this language', 'polylang' ), + esc_url( admin_url( 'admin.php?page=mlang&pll_action=edit&lang=' . $item->term_id ) ), + esc_html__( 'Edit', 'polylang' ) + ), + 'delete' => sprintf( + '%s', + esc_attr__( 'Delete this language and all its associated data', 'polylang' ), + wp_nonce_url( '?page=mlang&pll_action=delete&noheader=true&lang=' . $item->term_id, 'delete-lang' ), + esc_js( __( 'You are about to permanently delete this language. Are you sure?', 'polylang' ) ), + esc_html__( 'Delete', 'polylang' ) + ), + ); + + /** + * Filter the list of row actions in the languages list table + * + * @since 1.8 + * + * @param array $actions list of html markup actions + * @param object $item + */ + $actions = apply_filters( 'pll_languages_row_actions', $actions, $item ); + + return $this->row_actions( $actions ); + } + + /** + * Sort items + * + * @since 0.1 + * + * @param object $a The first object to compare + * @param object $b The second object to compare + * @return int -1 or 1 if $a is considered to be respectively less than or greater than $b. + */ + protected function usort_reorder( $a, $b ) { + $orderby = ! empty( $_GET['orderby'] ) ? sanitize_key( $_GET['orderby'] ) : 'name'; // phpcs:ignore WordPress.Security.NonceVerification + // Determine sort order + if ( is_numeric( $a->$orderby ) ) { + $result = $a->$orderby > $b->$orderby ? 1 : -1; + } else { + $result = strcmp( $a->$orderby, $b->$orderby ); + } + // Send final sort direction to usort + return ( empty( $_GET['order'] ) || 'asc' === $_GET['order'] ) ? $result : -$result; // phpcs:ignore WordPress.Security.NonceVerification + } + + /** + * Prepares the list of items for displaying + * + * @since 0.1 + * + * @param array $data + */ + public function prepare_items( $data = array() ) { + $per_page = $this->get_items_per_page( 'pll_lang_per_page' ); + $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns() ); + + usort( $data, array( $this, 'usort_reorder' ) ); + + $total_items = count( $data ); + $this->items = array_slice( $data, ( $this->get_pagenum() - 1 ) * $per_page, $per_page ); + + $this->set_pagination_args( + array( + 'total_items' => $total_items, + 'per_page' => $per_page, + 'total_pages' => ceil( $total_items / $per_page ), + ) + ); + } +} diff --git a/wp-content/plugins/polylang/settings/table-settings.php b/wp-content/plugins/polylang/settings/table-settings.php new file mode 100644 index 00000000..f3653d21 --- /dev/null +++ b/wp-content/plugins/polylang/settings/table-settings.php @@ -0,0 +1,190 @@ + 'Settings', // Do not translate ( used for css class ) + 'ajax' => false, + ) + ); + } + + /** + * Get the table classes for styling + * + * @since 1.8 + */ + protected function get_table_classes() { + return array( 'wp-list-table', 'widefat', 'plugins', 'pll-settings' ); // get the style of the plugins list table + one specific class + } + + /** + * Displays a single row + * + * @since 1.8 + * + * @param object $item PLL_Settings_Module object + */ + public function single_row( $item ) { + // Classes to reuse css from the plugins list table + $classes = $item->is_active() ? 'active' : 'inactive'; + if ( $message = $item->get_upgrade_message() ) { + $classes .= ' update'; + } + + // Display the columns + printf( '', esc_attr( $item->module ), esc_attr( $classes ) ); + $this->single_row_columns( $item ); + echo ''; + + // Display an upgrade message if there is any, reusing css from the plugins updates + if ( $message = $item->get_upgrade_message() ) { + printf( + ' + %s + ', + sprintf( '

    %s

    ', $message ) // phpcs:ignore WordPress.Security.EscapeOutput + ); + } + + // The settings if there are + // "inactive" class to reuse css from the plugins list table + if ( $form = $item->get_form() ) { + printf( + ' + + %s + %s +

    + %s +

    + + ', + esc_attr( $item->module ), + esc_html( $item->title ), + $form, // phpcs:ignore + implode( $item->get_buttons() ) // phpcs:ignore + ); + } + } + + /** + * Generates the columns for a single row of the table + * + * @since 1.8 + * + * @param object $item The current item + */ + protected function single_row_columns( $item ) { + $column_info = $this->get_column_info(); + $columns = $column_info[0]; + $primary = $column_info[3]; + + foreach ( array_keys( $columns ) as $column_name ) { + $classes = "$column_name column-$column_name"; + if ( $primary === $column_name ) { + $classes .= ' column-primary'; + } + + if ( 'cb' == $column_name ) { + echo ''; + echo $this->column_cb( $item ); // phpcs:ignore WordPress.Security.EscapeOutput + echo ''; + } else { + printf( '', esc_attr( $classes ) ); + echo $this->column_default( $item, $column_name ); // phpcs:ignore WordPress.Security.EscapeOutput + echo ''; + } + } + } + + /** + * Displays the item information in a column ( default case ) + * + * @since 1.8 + * + * @param object $item + * @param string $column_name + * @return string + */ + protected function column_default( $item, $column_name ) { + if ( 'plugin-title' == $column_name ) { + return sprintf( '%s', esc_html( $item->title ) ) . $this->row_actions( $item->get_action_links(), true /*always visible*/ ); + } + return $item->$column_name; + } + + /** + * Gets the list of columns + * + * @since 1.8 + * + * @return array the list of column titles + */ + public function get_columns() { + return array( + 'cb' => '', // For the 4px border inherited from plugins when the module is activated + 'plugin-title' => esc_html__( 'Module', 'polylang' ), // plugin-title for styling + 'description' => esc_html__( 'Description', 'polylang' ), + ); + } + + /** + * Gets the name of the primary column. + * + * @since 1.8 + * + * @return string The name of the primary column. + */ + protected function get_primary_column_name() { + return 'plugin-title'; + } + + /** + * Prepares the list of items for displaying + * + * @since 1.8 + * + * @param array $items + */ + public function prepare_items( $items = array() ) { + $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns(), $this->get_primary_column_name() ); + + // Sort rows, lowest priority on top. + usort( + $items, + function( $a, $b ) { + return $a->priority > $b->priority ? 1 : -1; + } + ); + $this->items = $items; + } + + /** + * Avoids displaying an empty tablenav + * + * @since 2.1 + * + * @param string $which 'top' or 'bottom' + */ + protected function display_tablenav( $which ) {} // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable +} diff --git a/wp-content/plugins/polylang/settings/table-string.php b/wp-content/plugins/polylang/settings/table-string.php new file mode 100644 index 00000000..8c41f937 --- /dev/null +++ b/wp-content/plugins/polylang/settings/table-string.php @@ -0,0 +1,413 @@ + 'Strings translations', // Do not translate ( used for css class ) + 'ajax' => false, + ) + ); + + $this->languages = $languages; + $this->strings = PLL_Admin_Strings::get_strings(); + $this->groups = array_unique( wp_list_pluck( $this->strings, 'context' ) ); + + $this->selected_group = -1; + + if ( ! empty( $_GET['group'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $group = sanitize_text_field( wp_unslash( $_GET['group'] ) ); // phpcs:ignore WordPress.Security.NonceVerification + if ( in_array( $group, $this->groups ) ) { + $this->selected_group = $group; + } + } + + add_action( 'mlang_action_string-translation', array( $this, 'save_translations' ) ); + } + + /** + * Displays the item information in a column ( default case ) + * + * @since 0.6 + * + * @param array $item + * @param string $column_name + * @return string + */ + public function column_default( $item, $column_name ) { + return $item[ $column_name ]; + } + + /** + * Displays the checkbox in first column + * + * @since 1.1 + * + * @param array $item + * @return string + */ + public function column_cb( $item ) { + return sprintf( + '', + esc_attr( $item['row'] ), + /* translators: accessibility text, %s is a string potentially in any language */ + sprintf( __( 'Select %s', 'polylang' ), format_to_edit( $item['string'] ) ), + empty( $item['icl'] ) ? 'disabled' : '' // Only strings registered with WPML API can be removed + ); + } + + /** + * Displays the string to translate + * + * @since 1.0 + * + * @param array $item + * @return string + */ + public function column_string( $item ) { + return format_to_edit( $item['string'] ); // Don't interpret special chars for the string column + } + + /** + * Displays the translations to edit + * + * @since 0.6 + * + * @param array $item + * @return string + */ + public function column_translations( $item ) { + $languages = array_combine( wp_list_pluck( $this->languages, 'slug' ), wp_list_pluck( $this->languages, 'name' ) ); + $out = ''; + + foreach ( $item['translations'] as $key => $translation ) { + $input_type = $item['multiline'] ? + '' : + ''; + $out .= sprintf( + '
    ' . $input_type . '
    ' . "\n", + esc_attr( $key ), + esc_attr( $item['row'] ), + esc_html( $languages[ $key ] ), + format_to_edit( $translation ) // Don't interpret special chars + ); + } + + return $out; + } + + /** + * Gets the list of columns + * + * @since 0.6 + * + * @return array the list of column titles + */ + public function get_columns() { + return array( + 'cb' => '', // Checkbox + 'string' => esc_html__( 'String', 'polylang' ), + 'name' => esc_html__( 'Name', 'polylang' ), + 'context' => esc_html__( 'Group', 'polylang' ), + 'translations' => esc_html__( 'Translations', 'polylang' ), + ); + } + + /** + * Gets the list of sortable columns + * + * @since 0.6 + * + * @return array + */ + public function get_sortable_columns() { + return array( + 'string' => array( 'string', false ), + 'name' => array( 'name', false ), + 'context' => array( 'context', false ), + ); + } + + /** + * Gets the name of the default primary column. + * + * @since 2.1 + * + * @return string Name of the default primary column, in this case, 'string'. + */ + protected function get_default_primary_column_name() { + return 'string'; + } + + /** + * Search for a string in translations. Case insensitive. + * + * @since 2.6 + * + * @param array $mos An array of PLL_MO objects + * @param string $s Searched string + * @return array Found strings + */ + protected function search_in_translations( $mos, $s ) { + $founds = array(); + + foreach ( $mos as $mo ) { + foreach ( wp_list_pluck( $mo->entries, 'translations' ) as $string => $translation ) { + if ( false !== stripos( $translation[0], $s ) ) { + $founds[] = $string; + } + } + } + + return array_unique( $founds ); + } + + /** + * Sort items + * + * @since 0.6 + * + * @param object $a The first object to compare + * @param object $b The second object to compare + * @return int -1 or 1 if $a is considered to be respectively less than or greater than $b. + */ + protected function usort_reorder( $a, $b ) { + if ( ! empty( $_GET['orderby'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification + $orderby = sanitize_key( $_GET['orderby'] ); // phpcs:ignore WordPress.Security.NonceVerification + if ( isset( $a[ $orderby ], $b[ $orderby ] ) ) { + $result = strcmp( $a[ $orderby ], $b[ $orderby ] ); // Determine sort order + return ( empty( $_GET['order'] ) || 'asc' === $_GET['order'] ) ? $result : -$result; // phpcs:ignore WordPress.Security.NonceVerification + } + } + + return 0; + } + + /** + * Prepares the list of items for displaying + * + * @since 0.6 + */ + public function prepare_items() { + // Is admin language filter active? + if ( $lg = get_user_meta( get_current_user_id(), 'pll_filter_content', true ) ) { + $languages = wp_list_filter( $this->languages, array( 'slug' => $lg ) ); + } else { + $languages = $this->languages; + } + + // Load translations + $mo = array(); + foreach ( $languages as $language ) { + $mo[ $language->slug ] = new PLL_MO(); + $mo[ $language->slug ]->import_from_db( $language ); + } + + $data = $this->strings; + + // Filter by selected group + if ( -1 !== $this->selected_group ) { + $data = wp_list_filter( $data, array( 'context' => $this->selected_group ) ); + } + + // Filter by searched string + $s = empty( $_GET['s'] ) ? '' : wp_unslash( $_GET['s'] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput + + if ( ! empty( $s ) ) { + // Search in translations + $in_translations = $this->search_in_translations( $mo, $s ); + + foreach ( $data as $key => $row ) { + if ( stripos( $row['name'], $s ) === false && stripos( $row['string'], $s ) === false && ! in_array( $row['string'], $in_translations ) ) { + unset( $data[ $key ] ); + } + } + } + + // Sorting + uasort( $data, array( $this, 'usort_reorder' ) ); + + // Paging + $per_page = $this->get_items_per_page( 'pll_strings_per_page' ); + $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns() ); + + $total_items = count( $data ); + $this->items = array_slice( $data, ( $this->get_pagenum() - 1 ) * $per_page, $per_page, true ); + + $this->set_pagination_args( + array( + 'total_items' => $total_items, + 'per_page' => $per_page, + 'total_pages' => ceil( $total_items / $per_page ), + ) + ); + + // Translate strings + // Kept for the end as it is a slow process + foreach ( $languages as $language ) { + foreach ( $this->items as $key => $row ) { + $this->items[ $key ]['translations'][ $language->slug ] = $mo[ $language->slug ]->translate( $row['string'] ); + $this->items[ $key ]['row'] = $key; // Store the row number for convenience + } + } + } + + /** + * Get the list of possible bulk actions + * + * @since 1.1 + * + * @return array + */ + public function get_bulk_actions() { + return array( 'delete' => __( 'Delete', 'polylang' ) ); + } + + /** + * Get the current action selected from the bulk actions dropdown. + * overrides parent function to avoid submit button to trigger bulk actions + * + * @since 1.8 + * + * @return string|false The action name or False if no action was selected + */ + public function current_action() { + return empty( $_POST['submit'] ) ? parent::current_action() : false; // phpcs:ignore WordPress.Security.NonceVerification + } + + /** + * Displays the dropdown list to filter strings per group + * + * @since 1.1 + * + * @param string $which only 'top' is supported + */ + public function extra_tablenav( $which ) { + if ( 'top' !== $which ) { + return; + } + + echo '
    '; + printf( + '', + /* translators: accessibility text */ + esc_html__( 'Filter by group', 'polylang' ) + ); + echo '' . "\n"; + + submit_button( __( 'Filter', 'polylang' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); + echo '
    '; + } + + /** + * Saves the strings translations in DB + * Optionaly clean the DB + * + * @since 1.9 + */ + public function save_translations() { + check_admin_referer( 'string-translation', '_wpnonce_string-translation' ); + + if ( ! empty( $_POST['submit'] ) ) { + foreach ( $this->languages as $language ) { + if ( empty( $_POST['translation'][ $language->slug ] ) ) { // In case the language filter is active ( thanks to John P. Bloch ) + continue; + } + + $mo = new PLL_MO(); + $mo->import_from_db( $language ); + + $translations = array_map( 'trim', wp_unslash( $_POST['translation'][ $language->slug ] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + foreach ( $translations as $key => $translation ) { + /** + * Filter the string translation before it is saved in DB + * Allows to sanitize strings registered with pll_register_string + * + * @since 1.6 + * @since 2.7 The translation passed to the filter is unslashed. + * + * @param string $translation The string translation. + * @param string $name The name as defined in pll_register_string. + * @param string $context The context as defined in pll_register_string. + */ + $translation = apply_filters( 'pll_sanitize_string_translation', $translation, $this->strings[ $key ]['name'], $this->strings[ $key ]['context'] ); + $mo->add_entry( $mo->make_entry( $this->strings[ $key ]['string'], $translation ) ); + } + + // Clean database ( removes all strings which were registered some day but are no more ) + if ( ! empty( $_POST['clean'] ) ) { + $new_mo = new PLL_MO(); + + foreach ( $this->strings as $string ) { + $new_mo->add_entry( $mo->make_entry( $string['string'], $mo->translate( $string['string'] ) ) ); + } + } + + isset( $new_mo ) ? $new_mo->export_to_db( $language ) : $mo->export_to_db( $language ); + } + + add_settings_error( 'general', 'pll_strings_translations_updated', __( 'Translations updated.', 'polylang' ), 'updated' ); + + /** + * Fires after the strings translations are saved in DB + * + * @since 1.2 + */ + do_action( 'pll_save_strings_translations' ); + } + + // Unregisters strings registered through WPML API + if ( $this->current_action() === 'delete' && ! empty( $_POST['strings'] ) && function_exists( 'icl_unregister_string' ) ) { + foreach ( array_map( 'sanitize_key', $_POST['strings'] ) as $key ) { + icl_unregister_string( $this->strings[ $key ]['context'], $this->strings[ $key ]['name'] ); + } + } + + // To refresh the page ( possible thanks to the $_GET['noheader']=true ) + $args = array_intersect_key( $_REQUEST, array_flip( array( 's', 'paged', 'group' ) ) ); + if ( ! empty( $_GET['paged'] ) && ! empty( $_POST['submit'] ) ) { + $args['paged'] = (int) $_GET['paged']; // Don't rely on $_REQUEST['paged'] or $_POST['paged']. See #14 + } + if ( ! empty( $args['s'] ) ) { + $args['s'] = urlencode( $args['s'] ); // Searched string needs to be encoded as it comes from $_POST + } + PLL_Settings::redirect( $args ); + } +} diff --git a/wp-content/plugins/polylang/settings/view-about.php b/wp-content/plugins/polylang/settings/view-about.php new file mode 100644 index 00000000..dbea7642 --- /dev/null +++ b/wp-content/plugins/polylang/settings/view-about.php @@ -0,0 +1,30 @@ + +

    + ', + '' + ); + if ( ! defined( 'POLYLANG_PRO' ) ) { + echo ' '; + printf( + /* translators: %1$s is link start tag, %2$s is link end tag. */ + esc_html__( 'Support and extra features are available to %1$sPolylang Pro%2$s users.', 'polylang' ), + '', + '' + ); + } + ?> +

    diff --git a/wp-content/plugins/polylang/settings/view-languages.php b/wp-content/plugins/polylang/settings/view-languages.php new file mode 100644 index 00000000..ea0493ab --- /dev/null +++ b/wp-content/plugins/polylang/settings/view-languages.php @@ -0,0 +1,35 @@ + +
    +

    + active_tab ) { + case 'lang': // Languages tab + case 'strings': // String translations tab + case 'settings': // Settings tab + include __DIR__ . '/view-tab-' . $this->active_tab . '.php'; + // Intentional fall-through to upgrade to fire the action below. + + default: + /** + * Fires when loading the active Polylang settings tab + * Allows plugins to add their own tab + * + * @since 1.5.1 + */ + do_action( 'pll_settings_active_tab_' . $this->active_tab ); + break; + } + ?> +
    diff --git a/wp-content/plugins/polylang/settings/view-tab-lang.php b/wp-content/plugins/polylang/settings/view-tab-lang.php new file mode 100644 index 00000000..f43e1798 --- /dev/null +++ b/wp-content/plugins/polylang/settings/view-tab-lang.php @@ -0,0 +1,181 @@ + +
    +
    +
    + display(); + ?> +
    + +
    +
    +
    + +
    +
    + +
    +

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

    +
    + +
    + + ', + ! empty( $edit_lang ) ? esc_attr( $edit_lang->name ) : '' + ); + ?> +

    +
    + +
    + + ', + ! empty( $edit_lang ) ? esc_attr( $edit_lang->locale ) : '' + ); + ?> +

    +
    + +
    + + ', + ! empty( $edit_lang ) ? esc_attr( $edit_lang->slug ) : '' + ); + ?> +

    +
    + +
    + + %s', + checked( ! empty( $edit_lang ) && $edit_lang->is_rtl, false, false ), + esc_html__( 'left to right', 'polylang' ) + ); + printf( + '', + checked( ! empty( $edit_lang ) && $edit_lang->is_rtl, true, false ), + esc_html__( 'right to left', 'polylang' ) + ); + ?> +

    +
    + +
    + + +

    +
    + +
    + + ', + ! empty( $edit_lang ) ? esc_attr( $edit_lang->term_group ) : '' + ); + ?> +

    +
    + +
    +
    +
    +
    +
    diff --git a/wp-content/plugins/polylang/settings/view-tab-settings.php b/wp-content/plugins/polylang/settings/view-tab-settings.php new file mode 100644 index 00000000..0a038b3b --- /dev/null +++ b/wp-content/plugins/polylang/settings/view-tab-settings.php @@ -0,0 +1,19 @@ + +
    + prepare_items( $this->modules ); + $list_table->display(); + ?> +
    diff --git a/wp-content/plugins/polylang/settings/view-tab-strings.php b/wp-content/plugins/polylang/settings/view-tab-strings.php new file mode 100644 index 00000000..7f3a304c --- /dev/null +++ b/wp-content/plugins/polylang/settings/view-tab-strings.php @@ -0,0 +1,33 @@ + +
    +
    + + search_box( __( 'Search translations', 'polylang' ), 'translations' ); + wp_nonce_field( 'string-translation', '_wpnonce_string-translation' ); + $string_table->display(); + printf( '
    ', esc_html__( 'Clean strings translation database', 'polylang' ) ); + ?> +

    + +
    +
    + +
    + +
    diff --git a/wp-content/plugins/polylang/uninstall.php b/wp-content/plugins/polylang/uninstall.php new file mode 100644 index 00000000..d5afd053 --- /dev/null +++ b/wp-content/plugins/polylang/uninstall.php @@ -0,0 +1,153 @@ +get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) { + switch_to_blog( $blog_id ); + $this->uninstall(); + } + restore_current_blog(); + } + else { + $this->uninstall(); + } + } + + /** + * Removes ALL plugin data + * only when the relevant option is active + * + * @since 0.5 + */ + public function uninstall() { + global $wpdb; + + do_action( 'pll_uninstall' ); + + // Suppress data of the old model < 1.2 + // FIXME: to remove when support for v1.1.6 will be dropped + $wpdb->termmeta = $wpdb->prefix . 'termmeta'; // registers the termmeta table in wpdb + + // Do nothing if the termmeta table does not exists + if ( count( $wpdb->get_results( "SHOW TABLES LIKE '$wpdb->termmeta'" ) ) ) { + $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_translations'" ); + $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_language'" ); + $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_rtl'" ); + $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_translations'" ); + } + + // Need to register the taxonomies + $pll_taxonomies = array( 'language', 'term_language', 'post_translations', 'term_translations' ); + foreach ( $pll_taxonomies as $taxonomy ) { + register_taxonomy( $taxonomy, null, array( 'label' => false, 'public' => false, 'query_var' => false, 'rewrite' => false ) ); + } + + $languages = get_terms( 'language', array( 'hide_empty' => false ) ); + + // Delete users options + foreach ( get_users( array( 'fields' => 'ID' ) ) as $user_id ) { + delete_user_meta( $user_id, 'pll_filter_content' ); + delete_user_meta( $user_id, 'pll_dismissed_notices' ); // Legacy meta. + foreach ( $languages as $lang ) { + delete_user_meta( $user_id, 'description_' . $lang->slug ); + } + } + + // Delete menu language switchers + $ids = get_posts( + array( + 'post_type' => 'nav_menu_item', + 'numberposts' => -1, + 'nopaging' => true, + 'fields' => 'ids', + 'meta_key' => '_pll_menu_item', + ) + ); + + foreach ( $ids as $id ) { + wp_delete_post( $id, true ); + } + + // Delete the strings translations ( <1.2 ) + // FIXME: to remove when support for v1.1.6 will be dropped + foreach ( $languages as $lang ) { + delete_option( 'polylang_mo' . $lang->term_id ); + } + + // Delete the strings translations 1.2+ + register_post_type( 'polylang_mo', array( 'rewrite' => false, 'query_var' => false ) ); + $ids = get_posts( + array( + 'post_type' => 'polylang_mo', + 'post_status' => 'any', + 'numberposts' => -1, + 'nopaging' => true, + 'fields' => 'ids', + ) + ); + foreach ( $ids as $id ) { + wp_delete_post( $id, true ); + } + + // Delete all what is related to languages and translations + $term_ids = array(); + $tt_ids = array(); + + foreach ( get_terms( $pll_taxonomies, array( 'hide_empty' => false ) ) as $term ) { + $term_ids[] = (int) $term->term_id; + $tt_ids[] = (int) $term->term_taxonomy_id; + } + + if ( ! empty( $term_ids ) ) { + $term_ids = array_unique( $term_ids ); + $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + } + + if ( ! empty( $tt_ids ) ) { + $tt_ids = array_unique( $tt_ids ); + $wpdb->query( "DELETE FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN ( " . implode( ',', $tt_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared + } + + // Delete options + delete_option( 'polylang' ); + delete_option( 'widget_polylang' ); // Automatically created by WP + delete_option( 'polylang_wpml_strings' ); // Strings registered with icl_register_string + delete_option( 'polylang_licenses' ); + delete_option( 'pll_dismissed_notices' ); + + // Delete transients + delete_transient( 'pll_languages_list' ); + delete_transient( 'pll_upgrade_1_4' ); + } +} + +new PLL_Uninstall(); diff --git a/wp-content/plugins/polylang/vendor/autoload.php b/wp-content/plugins/polylang/vendor/autoload.php new file mode 100644 index 00000000..e6c7f79b --- /dev/null +++ b/wp-content/plugins/polylang/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/wp-content/plugins/polylang/vendor/composer/LICENSE b/wp-content/plugins/polylang/vendor/composer/LICENSE new file mode 100644 index 00000000..f27399a0 --- /dev/null +++ b/wp-content/plugins/polylang/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +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/plugins/polylang/vendor/composer/autoload_classmap.php b/wp-content/plugins/polylang/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..3b8e0c42 --- /dev/null +++ b/wp-content/plugins/polylang/vendor/composer/autoload_classmap.php @@ -0,0 +1,123 @@ + $baseDir . '/integrations/wp-offload-media/as3cf.php', + 'PLL_Admin' => $baseDir . '/admin/admin.php', + 'PLL_Admin_Base' => $baseDir . '/admin/admin-base.php', + 'PLL_Admin_Block_Editor' => $baseDir . '/admin/admin-block-editor.php', + 'PLL_Admin_Classic_Editor' => $baseDir . '/admin/admin-classic-editor.php', + 'PLL_Admin_Filters' => $baseDir . '/admin/admin-filters.php', + 'PLL_Admin_Filters_Columns' => $baseDir . '/admin/admin-filters-columns.php', + 'PLL_Admin_Filters_Media' => $baseDir . '/admin/admin-filters-media.php', + 'PLL_Admin_Filters_Post' => $baseDir . '/admin/admin-filters-post.php', + 'PLL_Admin_Filters_Post_Base' => $baseDir . '/admin/admin-filters-post-base.php', + 'PLL_Admin_Filters_Term' => $baseDir . '/admin/admin-filters-term.php', + 'PLL_Admin_Links' => $baseDir . '/admin/admin-links.php', + 'PLL_Admin_Model' => $baseDir . '/admin/admin-model.php', + 'PLL_Admin_Nav_Menu' => $baseDir . '/admin/admin-nav-menu.php', + 'PLL_Admin_Notices' => $baseDir . '/admin/admin-notices.php', + 'PLL_Admin_Site_Health' => $baseDir . '/modules/site-health/admin-site-health.php', + 'PLL_Admin_Static_Pages' => $baseDir . '/admin/admin-static-pages.php', + 'PLL_Admin_Strings' => $baseDir . '/admin/admin-strings.php', + 'PLL_Admin_Sync' => $baseDir . '/modules/sync/admin-sync.php', + 'PLL_Aqua_Resizer' => $baseDir . '/integrations/aqua-resizer/aqua-resizer.php', + 'PLL_Base' => $baseDir . '/include/base.php', + 'PLL_CRUD_Posts' => $baseDir . '/include/crud-posts.php', + 'PLL_CRUD_Terms' => $baseDir . '/include/crud-terms.php', + 'PLL_Cache' => $baseDir . '/include/cache.php', + 'PLL_Cache_Compat' => $baseDir . '/integrations/cache/cache-compat.php', + 'PLL_Cft' => $baseDir . '/integrations/custom-field-template/cft.php', + 'PLL_Choose_Lang' => $baseDir . '/frontend/choose-lang.php', + 'PLL_Choose_Lang_Content' => $baseDir . '/frontend/choose-lang-content.php', + 'PLL_Choose_Lang_Domain' => $baseDir . '/frontend/choose-lang-domain.php', + 'PLL_Choose_Lang_Url' => $baseDir . '/frontend/choose-lang-url.php', + 'PLL_Cookie' => $baseDir . '/include/cookie.php', + 'PLL_Domain_Mapping' => $baseDir . '/integrations/domain-mapping/domain-mapping.php', + 'PLL_Duplicate_Post' => $baseDir . '/integrations/duplicate-post/duplicate-post.php', + 'PLL_Featured_Content' => $baseDir . '/integrations/jetpack/featured-content.php', + 'PLL_Filters' => $baseDir . '/include/filters.php', + 'PLL_Filters_Links' => $baseDir . '/include/filters-links.php', + 'PLL_Filters_Sanitization' => $baseDir . '/include/filters-sanitization.php', + 'PLL_Frontend' => $baseDir . '/frontend/frontend.php', + 'PLL_Frontend_Auto_Translate' => $baseDir . '/frontend/frontend-auto-translate.php', + 'PLL_Frontend_Filters' => $baseDir . '/frontend/frontend-filters.php', + 'PLL_Frontend_Filters_Links' => $baseDir . '/frontend/frontend-filters-links.php', + 'PLL_Frontend_Filters_Search' => $baseDir . '/frontend/frontend-filters-search.php', + 'PLL_Frontend_Links' => $baseDir . '/frontend/frontend-links.php', + 'PLL_Frontend_Nav_Menu' => $baseDir . '/frontend/frontend-nav-menu.php', + 'PLL_Frontend_Static_Pages' => $baseDir . '/frontend/frontend-static-pages.php', + 'PLL_Install' => $baseDir . '/install/install.php', + 'PLL_Install_Base' => $baseDir . '/install/install-base.php', + 'PLL_Integrations' => $baseDir . '/integrations/integrations.php', + 'PLL_Jetpack' => $baseDir . '/integrations/jetpack/jetpack.php', + 'PLL_Language' => $baseDir . '/include/language.php', + 'PLL_License' => $baseDir . '/include/license.php', + 'PLL_Lingotek' => $baseDir . '/modules/lingotek/lingotek.php', + 'PLL_Links' => $baseDir . '/include/links.php', + 'PLL_Links_Abstract_Domain' => $baseDir . '/include/links-abstract-domain.php', + 'PLL_Links_Default' => $baseDir . '/include/links-default.php', + 'PLL_Links_Directory' => $baseDir . '/include/links-directory.php', + 'PLL_Links_Domain' => $baseDir . '/include/links-domain.php', + 'PLL_Links_Model' => $baseDir . '/include/links-model.php', + 'PLL_Links_Permalinks' => $baseDir . '/include/links-permalinks.php', + 'PLL_Links_Subdomain' => $baseDir . '/include/links-subdomain.php', + 'PLL_MO' => $baseDir . '/include/mo.php', + 'PLL_Model' => $baseDir . '/include/model.php', + 'PLL_Multilingual_Sitemaps_Provider' => $baseDir . '/modules/sitemaps/multilingual-sitemaps-provider.php', + 'PLL_Nav_Menu' => $baseDir . '/include/nav-menu.php', + 'PLL_No_Category_Base' => $baseDir . '/integrations/no-category-base/no-category-base.php', + 'PLL_OLT_Manager' => $baseDir . '/include/olt-manager.php', + 'PLL_Plugin_Updater' => $baseDir . '/install/plugin-updater.php', + 'PLL_Pointer' => $baseDir . '/include/pointer.php', + 'PLL_Query' => $baseDir . '/include/query.php', + 'PLL_REST_Request' => $baseDir . '/include/rest-request.php', + 'PLL_Settings' => $baseDir . '/settings/settings.php', + 'PLL_Settings_Browser' => $baseDir . '/settings/settings-browser.php', + 'PLL_Settings_CPT' => $baseDir . '/settings/settings-cpt.php', + 'PLL_Settings_Licenses' => $baseDir . '/settings/settings-licenses.php', + 'PLL_Settings_Media' => $baseDir . '/settings/settings-media.php', + 'PLL_Settings_Module' => $baseDir . '/settings/settings-module.php', + 'PLL_Settings_Share_Slug' => $baseDir . '/modules/share-slug/settings-share-slug.php', + 'PLL_Settings_Sync' => $baseDir . '/modules/sync/settings-sync.php', + 'PLL_Settings_Translate_Slugs' => $baseDir . '/modules/translate-slugs/settings-translate-slugs.php', + 'PLL_Settings_Url' => $baseDir . '/settings/settings-url.php', + 'PLL_Settings_WPML' => $baseDir . '/modules/wpml/settings-wpml.php', + 'PLL_Sitemaps' => $baseDir . '/modules/sitemaps/sitemaps.php', + 'PLL_Static_Pages' => $baseDir . '/include/static-pages.php', + 'PLL_Switcher' => $baseDir . '/include/switcher.php', + 'PLL_Sync' => $baseDir . '/modules/sync/sync.php', + 'PLL_Sync_Metas' => $baseDir . '/modules/sync/sync-metas.php', + 'PLL_Sync_Post_Metas' => $baseDir . '/modules/sync/sync-post-metas.php', + 'PLL_Sync_Tax' => $baseDir . '/modules/sync/sync-tax.php', + 'PLL_Sync_Term_Metas' => $baseDir . '/modules/sync/sync-term-metas.php', + 'PLL_T15S' => $baseDir . '/install/t15s.php', + 'PLL_Table_Languages' => $baseDir . '/settings/table-languages.php', + 'PLL_Table_Settings' => $baseDir . '/settings/table-settings.php', + 'PLL_Table_String' => $baseDir . '/settings/table-string.php', + 'PLL_Translate_Option' => $baseDir . '/include/translate-option.php', + 'PLL_Translated_Object' => $baseDir . '/include/translated-object.php', + 'PLL_Translated_Post' => $baseDir . '/include/translated-post.php', + 'PLL_Translated_Term' => $baseDir . '/include/translated-term.php', + 'PLL_Twenty_Seventeen' => $baseDir . '/integrations/twenty-seventeen/twenty-seven-teen.php', + 'PLL_Upgrade' => $baseDir . '/install/upgrade.php', + 'PLL_WPML_API' => $baseDir . '/modules/wpml/wpml-api.php', + 'PLL_WPML_Compat' => $baseDir . '/modules/wpml/wpml-compat.php', + 'PLL_WPML_Config' => $baseDir . '/modules/wpml/wpml-config.php', + 'PLL_WPSEO' => $baseDir . '/integrations/wpseo/wpseo.php', + 'PLL_WPSEO_OGP' => $baseDir . '/integrations/wpseo/wpseo-ogp.php', + 'PLL_WP_Import' => $baseDir . '/integrations/wp-importer/wp-import.php', + 'PLL_WP_Sweep' => $baseDir . '/integrations/wp-sweep/wp-sweep.php', + 'PLL_Walker_Dropdown' => $baseDir . '/include/walker-dropdown.php', + 'PLL_Walker_List' => $baseDir . '/include/walker-list.php', + 'PLL_Widget_Calendar' => $baseDir . '/include/widget-calendar.php', + 'PLL_Widget_Languages' => $baseDir . '/include/widget-languages.php', + 'PLL_Wizard' => $baseDir . '/modules/wizard/wizard.php', + 'PLL_WordPress_Importer' => $baseDir . '/integrations/wp-importer/wordpress-importer.php', + 'PLL_Yarpp' => $baseDir . '/integrations/yarpp/yarpp.php', + 'Polylang' => $baseDir . '/include/class-polylang.php', +); diff --git a/wp-content/plugins/polylang/vendor/composer/autoload_namespaces.php b/wp-content/plugins/polylang/vendor/composer/autoload_namespaces.php new file mode 100644 index 00000000..b7fc0125 --- /dev/null +++ b/wp-content/plugins/polylang/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInitb2e9581550b70057025a8e7128ef798f::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/wp-content/plugins/polylang/vendor/composer/autoload_static.php b/wp-content/plugins/polylang/vendor/composer/autoload_static.php new file mode 100644 index 00000000..6c8799d9 --- /dev/null +++ b/wp-content/plugins/polylang/vendor/composer/autoload_static.php @@ -0,0 +1,133 @@ + __DIR__ . '/../..' . '/integrations/wp-offload-media/as3cf.php', + 'PLL_Admin' => __DIR__ . '/../..' . '/admin/admin.php', + 'PLL_Admin_Base' => __DIR__ . '/../..' . '/admin/admin-base.php', + 'PLL_Admin_Block_Editor' => __DIR__ . '/../..' . '/admin/admin-block-editor.php', + 'PLL_Admin_Classic_Editor' => __DIR__ . '/../..' . '/admin/admin-classic-editor.php', + 'PLL_Admin_Filters' => __DIR__ . '/../..' . '/admin/admin-filters.php', + 'PLL_Admin_Filters_Columns' => __DIR__ . '/../..' . '/admin/admin-filters-columns.php', + 'PLL_Admin_Filters_Media' => __DIR__ . '/../..' . '/admin/admin-filters-media.php', + 'PLL_Admin_Filters_Post' => __DIR__ . '/../..' . '/admin/admin-filters-post.php', + 'PLL_Admin_Filters_Post_Base' => __DIR__ . '/../..' . '/admin/admin-filters-post-base.php', + 'PLL_Admin_Filters_Term' => __DIR__ . '/../..' . '/admin/admin-filters-term.php', + 'PLL_Admin_Links' => __DIR__ . '/../..' . '/admin/admin-links.php', + 'PLL_Admin_Model' => __DIR__ . '/../..' . '/admin/admin-model.php', + 'PLL_Admin_Nav_Menu' => __DIR__ . '/../..' . '/admin/admin-nav-menu.php', + 'PLL_Admin_Notices' => __DIR__ . '/../..' . '/admin/admin-notices.php', + 'PLL_Admin_Site_Health' => __DIR__ . '/../..' . '/modules/site-health/admin-site-health.php', + 'PLL_Admin_Static_Pages' => __DIR__ . '/../..' . '/admin/admin-static-pages.php', + 'PLL_Admin_Strings' => __DIR__ . '/../..' . '/admin/admin-strings.php', + 'PLL_Admin_Sync' => __DIR__ . '/../..' . '/modules/sync/admin-sync.php', + 'PLL_Aqua_Resizer' => __DIR__ . '/../..' . '/integrations/aqua-resizer/aqua-resizer.php', + 'PLL_Base' => __DIR__ . '/../..' . '/include/base.php', + 'PLL_CRUD_Posts' => __DIR__ . '/../..' . '/include/crud-posts.php', + 'PLL_CRUD_Terms' => __DIR__ . '/../..' . '/include/crud-terms.php', + 'PLL_Cache' => __DIR__ . '/../..' . '/include/cache.php', + 'PLL_Cache_Compat' => __DIR__ . '/../..' . '/integrations/cache/cache-compat.php', + 'PLL_Cft' => __DIR__ . '/../..' . '/integrations/custom-field-template/cft.php', + 'PLL_Choose_Lang' => __DIR__ . '/../..' . '/frontend/choose-lang.php', + 'PLL_Choose_Lang_Content' => __DIR__ . '/../..' . '/frontend/choose-lang-content.php', + 'PLL_Choose_Lang_Domain' => __DIR__ . '/../..' . '/frontend/choose-lang-domain.php', + 'PLL_Choose_Lang_Url' => __DIR__ . '/../..' . '/frontend/choose-lang-url.php', + 'PLL_Cookie' => __DIR__ . '/../..' . '/include/cookie.php', + 'PLL_Domain_Mapping' => __DIR__ . '/../..' . '/integrations/domain-mapping/domain-mapping.php', + 'PLL_Duplicate_Post' => __DIR__ . '/../..' . '/integrations/duplicate-post/duplicate-post.php', + 'PLL_Featured_Content' => __DIR__ . '/../..' . '/integrations/jetpack/featured-content.php', + 'PLL_Filters' => __DIR__ . '/../..' . '/include/filters.php', + 'PLL_Filters_Links' => __DIR__ . '/../..' . '/include/filters-links.php', + 'PLL_Filters_Sanitization' => __DIR__ . '/../..' . '/include/filters-sanitization.php', + 'PLL_Frontend' => __DIR__ . '/../..' . '/frontend/frontend.php', + 'PLL_Frontend_Auto_Translate' => __DIR__ . '/../..' . '/frontend/frontend-auto-translate.php', + 'PLL_Frontend_Filters' => __DIR__ . '/../..' . '/frontend/frontend-filters.php', + 'PLL_Frontend_Filters_Links' => __DIR__ . '/../..' . '/frontend/frontend-filters-links.php', + 'PLL_Frontend_Filters_Search' => __DIR__ . '/../..' . '/frontend/frontend-filters-search.php', + 'PLL_Frontend_Links' => __DIR__ . '/../..' . '/frontend/frontend-links.php', + 'PLL_Frontend_Nav_Menu' => __DIR__ . '/../..' . '/frontend/frontend-nav-menu.php', + 'PLL_Frontend_Static_Pages' => __DIR__ . '/../..' . '/frontend/frontend-static-pages.php', + 'PLL_Install' => __DIR__ . '/../..' . '/install/install.php', + 'PLL_Install_Base' => __DIR__ . '/../..' . '/install/install-base.php', + 'PLL_Integrations' => __DIR__ . '/../..' . '/integrations/integrations.php', + 'PLL_Jetpack' => __DIR__ . '/../..' . '/integrations/jetpack/jetpack.php', + 'PLL_Language' => __DIR__ . '/../..' . '/include/language.php', + 'PLL_License' => __DIR__ . '/../..' . '/include/license.php', + 'PLL_Lingotek' => __DIR__ . '/../..' . '/modules/lingotek/lingotek.php', + 'PLL_Links' => __DIR__ . '/../..' . '/include/links.php', + 'PLL_Links_Abstract_Domain' => __DIR__ . '/../..' . '/include/links-abstract-domain.php', + 'PLL_Links_Default' => __DIR__ . '/../..' . '/include/links-default.php', + 'PLL_Links_Directory' => __DIR__ . '/../..' . '/include/links-directory.php', + 'PLL_Links_Domain' => __DIR__ . '/../..' . '/include/links-domain.php', + 'PLL_Links_Model' => __DIR__ . '/../..' . '/include/links-model.php', + 'PLL_Links_Permalinks' => __DIR__ . '/../..' . '/include/links-permalinks.php', + 'PLL_Links_Subdomain' => __DIR__ . '/../..' . '/include/links-subdomain.php', + 'PLL_MO' => __DIR__ . '/../..' . '/include/mo.php', + 'PLL_Model' => __DIR__ . '/../..' . '/include/model.php', + 'PLL_Multilingual_Sitemaps_Provider' => __DIR__ . '/../..' . '/modules/sitemaps/multilingual-sitemaps-provider.php', + 'PLL_Nav_Menu' => __DIR__ . '/../..' . '/include/nav-menu.php', + 'PLL_No_Category_Base' => __DIR__ . '/../..' . '/integrations/no-category-base/no-category-base.php', + 'PLL_OLT_Manager' => __DIR__ . '/../..' . '/include/olt-manager.php', + 'PLL_Plugin_Updater' => __DIR__ . '/../..' . '/install/plugin-updater.php', + 'PLL_Pointer' => __DIR__ . '/../..' . '/include/pointer.php', + 'PLL_Query' => __DIR__ . '/../..' . '/include/query.php', + 'PLL_REST_Request' => __DIR__ . '/../..' . '/include/rest-request.php', + 'PLL_Settings' => __DIR__ . '/../..' . '/settings/settings.php', + 'PLL_Settings_Browser' => __DIR__ . '/../..' . '/settings/settings-browser.php', + 'PLL_Settings_CPT' => __DIR__ . '/../..' . '/settings/settings-cpt.php', + 'PLL_Settings_Licenses' => __DIR__ . '/../..' . '/settings/settings-licenses.php', + 'PLL_Settings_Media' => __DIR__ . '/../..' . '/settings/settings-media.php', + 'PLL_Settings_Module' => __DIR__ . '/../..' . '/settings/settings-module.php', + 'PLL_Settings_Share_Slug' => __DIR__ . '/../..' . '/modules/share-slug/settings-share-slug.php', + 'PLL_Settings_Sync' => __DIR__ . '/../..' . '/modules/sync/settings-sync.php', + 'PLL_Settings_Translate_Slugs' => __DIR__ . '/../..' . '/modules/translate-slugs/settings-translate-slugs.php', + 'PLL_Settings_Url' => __DIR__ . '/../..' . '/settings/settings-url.php', + 'PLL_Settings_WPML' => __DIR__ . '/../..' . '/modules/wpml/settings-wpml.php', + 'PLL_Sitemaps' => __DIR__ . '/../..' . '/modules/sitemaps/sitemaps.php', + 'PLL_Static_Pages' => __DIR__ . '/../..' . '/include/static-pages.php', + 'PLL_Switcher' => __DIR__ . '/../..' . '/include/switcher.php', + 'PLL_Sync' => __DIR__ . '/../..' . '/modules/sync/sync.php', + 'PLL_Sync_Metas' => __DIR__ . '/../..' . '/modules/sync/sync-metas.php', + 'PLL_Sync_Post_Metas' => __DIR__ . '/../..' . '/modules/sync/sync-post-metas.php', + 'PLL_Sync_Tax' => __DIR__ . '/../..' . '/modules/sync/sync-tax.php', + 'PLL_Sync_Term_Metas' => __DIR__ . '/../..' . '/modules/sync/sync-term-metas.php', + 'PLL_T15S' => __DIR__ . '/../..' . '/install/t15s.php', + 'PLL_Table_Languages' => __DIR__ . '/../..' . '/settings/table-languages.php', + 'PLL_Table_Settings' => __DIR__ . '/../..' . '/settings/table-settings.php', + 'PLL_Table_String' => __DIR__ . '/../..' . '/settings/table-string.php', + 'PLL_Translate_Option' => __DIR__ . '/../..' . '/include/translate-option.php', + 'PLL_Translated_Object' => __DIR__ . '/../..' . '/include/translated-object.php', + 'PLL_Translated_Post' => __DIR__ . '/../..' . '/include/translated-post.php', + 'PLL_Translated_Term' => __DIR__ . '/../..' . '/include/translated-term.php', + 'PLL_Twenty_Seventeen' => __DIR__ . '/../..' . '/integrations/twenty-seventeen/twenty-seven-teen.php', + 'PLL_Upgrade' => __DIR__ . '/../..' . '/install/upgrade.php', + 'PLL_WPML_API' => __DIR__ . '/../..' . '/modules/wpml/wpml-api.php', + 'PLL_WPML_Compat' => __DIR__ . '/../..' . '/modules/wpml/wpml-compat.php', + 'PLL_WPML_Config' => __DIR__ . '/../..' . '/modules/wpml/wpml-config.php', + 'PLL_WPSEO' => __DIR__ . '/../..' . '/integrations/wpseo/wpseo.php', + 'PLL_WPSEO_OGP' => __DIR__ . '/../..' . '/integrations/wpseo/wpseo-ogp.php', + 'PLL_WP_Import' => __DIR__ . '/../..' . '/integrations/wp-importer/wp-import.php', + 'PLL_WP_Sweep' => __DIR__ . '/../..' . '/integrations/wp-sweep/wp-sweep.php', + 'PLL_Walker_Dropdown' => __DIR__ . '/../..' . '/include/walker-dropdown.php', + 'PLL_Walker_List' => __DIR__ . '/../..' . '/include/walker-list.php', + 'PLL_Widget_Calendar' => __DIR__ . '/../..' . '/include/widget-calendar.php', + 'PLL_Widget_Languages' => __DIR__ . '/../..' . '/include/widget-languages.php', + 'PLL_Wizard' => __DIR__ . '/../..' . '/modules/wizard/wizard.php', + 'PLL_WordPress_Importer' => __DIR__ . '/../..' . '/integrations/wp-importer/wordpress-importer.php', + 'PLL_Yarpp' => __DIR__ . '/../..' . '/integrations/yarpp/yarpp.php', + 'Polylang' => __DIR__ . '/../..' . '/include/class-polylang.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->classMap = ComposerStaticInitb2e9581550b70057025a8e7128ef798f::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/wp-content/plugins/polylang/vendor/composer/installed.json b/wp-content/plugins/polylang/vendor/composer/installed.json new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/wp-content/plugins/polylang/vendor/composer/installed.json @@ -0,0 +1 @@ +[] diff --git a/wp-content/plugins/pronamic-ideal/admin/methods-wp-admin.php b/wp-content/plugins/pronamic-ideal/admin/methods-wp-admin.php new file mode 100644 index 00000000..4a172ce9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/admin/methods-wp-admin.php @@ -0,0 +1,58 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + + + + + + + + + + + + + + + + + + + + + + + +
    + ', esc_attr( $method['icon'] ) ); + } + + ?> + + + + %s', + esc_attr( $method['url'] ), + esc_html( $method['url'] ) + ); + } + + ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/admin/page-about.php b/wp-content/plugins/pronamic-ideal/admin/page-about.php new file mode 100644 index 00000000..806eb800 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/admin/page-about.php @@ -0,0 +1,92 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Plugin; + +/** + * Page about + * + * @version 5.8.0 + */ + +// If this file is called directly, abort. +if ( ! defined( 'WPINC' ) ) { + die; +} + +?> +
    +

    + +
    + plugin->get_version() ) + ); + + ?> +
    + +
    + plugin->get_version() ) + ); + + ?> +
    + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/admin/tab-getting-started.php b/wp-content/plugins/pronamic-ideal/admin/tab-getting-started.php new file mode 100644 index 00000000..2389681b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/admin/tab-getting-started.php @@ -0,0 +1,176 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +// If this file is called directly, abort. +if ( ! defined( 'WPINC' ) ) { + die; +} + +?> +
    +
    +

    + +

    + + +

    + +

    + %2$s', + esc_url( $this->plugin->tracking_module->get_tracking_url( __( 'https://www.pronamic.eu/payment-providers/', 'pronamic_ideal' ) ) ), + esc_html__( 'View supported payment providers', 'pronamic_ideal' ) + ); + + ?> +

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

    + +

    + +

    + +

    + +

    + +

    + %2$s', + esc_url( + add_query_arg( + array( + 'post_type' => 'pronamic_gateway', + ), + admin_url( 'post-new.php' ) + ) + ), + esc_html__( 'Add new payment provider configuration', 'pronamic_ideal' ) + ); + + ?> +

    +
    +
    + +
    +
    +

    + +

    + +

    + +

    + +

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

    + +

    + +

    + +

    + %2$s', + esc_url( $this->plugin->tracking_module->get_tracking_url( __( 'https://www.pronamic.eu/plugins/pronamic-ideal/', 'pronamic_ideal' ) ) ), + esc_html__( 'View supported e-commerce plugins', 'pronamic_ideal' ) + ); + + ?> +

    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/admin/tab-new.php b/wp-content/plugins/pronamic-ideal/admin/tab-new.php new file mode 100644 index 00000000..38a9a3de --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/admin/tab-new.php @@ -0,0 +1,130 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +if ( ! defined( 'WPINC' ) ) { + die; +} + +?> +
    +
    +

    + +

    + +

    + +

    + +

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

    + +

    + +

    +
    +
    + +
    +
    +

    + +

    + +

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

    + +

    + +

    +
    +
    + +
    +
    +

    + +

    + +

    +
    + +
    + +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/composer.json b/wp-content/plugins/pronamic-ideal/composer.json new file mode 100644 index 00000000..e25291ba --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/composer.json @@ -0,0 +1,132 @@ +{ + "name": "pronamic/wp-pronamic-ideal", + "type": "wordpress-plugin", + "description": "The Pronamic Pay plugin adds payment methods like iDEAL, Bancontact, credit card and more to your WordPress site for a variety of payment providers.", + "keywords": ["pronamic", "ideal", "wordpress", "pay"], + "homepage": "https://github.com/pronamic/wp-pronamic-ideal", + "license": "GPL-3.0-or-later" , + "authors": [ + { + "name": "Remco Tolsma", + "email": "remco@pronamic.nl", + "homepage": "https://www.remcotolsma.nl/", + "role": "Developer" + }, + { + "name": "Reüel van der Steege", + "email": "reuel@pronamic.nl", + "homepage": "https://www.reuel.nl/", + "role": "Developer" + }, + { + "name": "Karel-Jan Tolsma", + "email": "kareljan@pronamic.nl", + "homepage": "https://www.kareljantolsma.nl/", + "role": "Designer" + }, + { + "name": "Leo Oosterloo", + "email": "leo@pronamic.nl", + "homepage": "http://www.leo-oosterloo.eu/", + "role": "Designer" + } + ], + "repositories": [ + { + "type": "composer", + "url": "https://wpackagist.org/" + } + ], + "config": { + "platform": { + "php": "5.6.20" + }, + "sort-packages": true + }, + "require": { + "php": ">=5.6.20", + "composer/installers": "^1.7", + "pronamic/wp-datetime": "^1.2", + "pronamic/wp-money": "^1.2", + "wp-pay-extensions/charitable": "^2.2", + "wp-pay-extensions/contact-form-7": "^1.0", + "wp-pay-extensions/easy-digital-downloads": "^2.1", + "wp-pay-extensions/event-espresso": "^2.2", + "wp-pay-extensions/event-espresso-legacy": "^2.2", + "wp-pay-extensions/formidable-forms": "^2.2", + "wp-pay-extensions/give": "^2.1", + "wp-pay-extensions/gravityforms": "^2.5", + "wp-pay-extensions/memberpress": "^2.2", + "wp-pay-extensions/ninjaforms": "^1.4", + "wp-pay-extensions/restrict-content-pro": "^2.3", + "wp-pay-extensions/s2member": "^2.2", + "wp-pay-extensions/woocommerce": "^2.2", + "wp-pay-extensions/wp-e-commerce": "^2.1", + "wp-pay-gateways/adyen": "^1.3", + "wp-pay-gateways/buckaroo": "^2.1", + "wp-pay-gateways/ems-e-commerce": "^2.1", + "wp-pay-gateways/icepay": "^2.1", + "wp-pay-gateways/ideal": "^2.1", + "wp-pay-gateways/ideal-advanced-v3": "^2.1", + "wp-pay-gateways/ideal-basic": "^2.1", + "wp-pay-gateways/ing-kassa-compleet": "^2.1", + "wp-pay-gateways/mollie": "^2.2", + "wp-pay-gateways/multisafepay": "^2.1", + "wp-pay-gateways/ogone": "^2.1", + "wp-pay-gateways/omnikassa-2": "^2.3", + "wp-pay-gateways/pay-nl": "^2.1", + "wp-pay-gateways/payvision": "^1.0", + "wp-pay-gateways/sisow": "^2.1", + "wp-pay-gateways/targetpay": "^2.1", + "wp-pay/core": "^2.6", + "wp-pay/fundraising": "^1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7", + "phpunit/phpunit-selenium": "^3.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-pay-gateways/paypal": "dev-develop as 1.0.0", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "scripts": { + "coveralls": "vendor/bin/php-coveralls -v", + "phpcbf":"vendor/bin/phpcbf", + "phpcs": "vendor/bin/phpcs -s -v", + "phplint": "find src tests -name '*.php' | xargs -n 1 -P 4 php -l", + "phpmd": "vendor/bin/phpmd src,tests text phpmd.ruleset.xml --suffixes php", + "phpstan": "vendor/bin/phpstan analyse", + "phpunit": "vendor/bin/phpunit --colors=always", + "php-lint-plugin": "find -L . -type f -path ./.git -prune -o -path ./deploy -prune -o -path ./node_modules -prune -o -path ./repositories -prune -o -path ./vendor -prune -o -path ./wordpress -prune -o -path ./wp-content -prune -o -name '*.php' -print0 | xargs -0 -n 1 -P 4 php -l -n", + "php-lint-wp-pay": "find -L ./repositories/ -type f -name .git -prune -o -name node_modules -prune -o -name vendor -prune -o -name wordpress -prune -o -name wp-content -prune -o -name '*.php' -print0 | xargs -0 -n 1 -P 4 php -l -n", + "post-install-cmd": "echo 'Optionally run: composer bin all install'", + "post-update-cmd": "echo 'Optionally run: composer bin all update'", + "psalm": "vendor/bin/psalm", + "make-pot": "wp pronamic i18n make-pot . languages/pronamic_ideal.pot --slug='pronamic-ideal'", + "update-po": "find languages/*.po -type f -exec msgmerge --update --backup=off {} languages/pronamic_ideal.pot \\;", + "generate-readme-txt": "php src/readme-txt/readme.php > readme.txt", + "generate-readme-md": "php src/readme-md/README.php > README.md", + "generate-readme": [ + "@generate-readme-txt", + "@generate-readme-md" + ], + "generate-changelog-md": "php src/changelog-md/CHANGELOG.php > CHANGELOG.md", + "generate-changelog": [ + "@generate-readme-txt", + "@generate-changelog-md" + ], + "build": [ + "@generate-readme", + "@generate-changelog", + "@make-pot", + "@update-po" + ] + } +} diff --git a/wp-content/plugins/pronamic-ideal/composer.lock b/wp-content/plugins/pronamic-ideal/composer.lock new file mode 100644 index 00000000..be004411 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/composer.lock @@ -0,0 +1,6679 @@ +{ + "_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": "9945e1676992280d1ba2f3675fee1877", + "packages": [ + { + "name": "composer/installers", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d", + "reference": "1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.6.* || ^2.0", + "composer/semver": "^1 || ^3", + "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan-phpunit": "^0.12.16", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.3" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Starbug", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "modulework", + "modx", + "moodle", + "osclass", + "phpbb", + "piwik", + "ppi", + "processwire", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "symfony", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v1.10.0" + }, + "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": "2021-01-14T11:07:16+00:00" + }, + { + "name": "icepay/icepay", + "version": "2.5.3", + "source": { + "type": "git", + "url": "https://github.com/ICEPAYdev/icepay.git", + "reference": "0c517325a6fd55edf64fadfd50eacf044fb6055e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ICEPAYdev/icepay/zipball/0c517325a6fd55edf64fadfd50eacf044fb6055e", + "reference": "0c517325a6fd55edf64fadfd50eacf044fb6055e", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "description": "ICEPAY library to integrate ICEPAY in your projects.", + "homepage": "https://icepay.com/", + "keywords": [ + "afterpay", + "api", + "bancontact", + "banktransfer", + "creditcard", + "gateway", + "icepay", + "ideal", + "mistercash", + "payment", + "payments", + "paypal", + "paysafecard", + "phone", + "refund", + "service", + "sofort", + "sofortbanking", + "yourgift" + ], + "support": { + "issues": "https://github.com/icepay/icepay/issues", + "source": "https://github.com/icepay/icepay" + }, + "time": "2015-09-17T08:32:44+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.10", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + }, + "time": "2020-05-27T16:41:55+00:00" + }, + { + "name": "pronamic/wp-datetime", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/pronamic/wp-datetime.git", + "reference": "cf16fe56ab819535e33760115d60bc8fdbb31c44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pronamic/wp-datetime/zipball/cf16fe56ab819535e33760115d60bc8fdbb31c44", + "reference": "cf16fe56ab819535e33760115d60bc8fdbb31c44", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "koodimonni-language/de_de": "*", + "koodimonni-language/fr_fr": "*", + "koodimonni-language/ja": "*", + "koodimonni-language/nl_nl": "*", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.5", + "squizlabs/php_codesniffer": "^3.5", + "vlucas/phpdotenv": "^2.0", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\DateTime\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "WordPress DateTime library.", + "support": { + "issues": "https://github.com/pronamic/wp-datetime/issues", + "source": "https://github.com/pronamic/wp-datetime/tree/1.2.0" + }, + "time": "2020-10-08T12:58:21+00:00" + }, + { + "name": "pronamic/wp-gravityforms-nl", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/pronamic/wp-gravityforms-nl.git", + "reference": "3b561651e2e0e68912d1d777a45928724cdecb6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pronamic/wp-gravityforms-nl/zipball/3b561651e2e0e68912d1d777a45928724cdecb6e", + "reference": "3b561651e2e0e68912d1d777a45928724cdecb6e", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "koodimonni-language/nl_nl": "*", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.4", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.5", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\GravityFormsNL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "WordPress Gravity Forms (nl) library.", + "support": { + "issues": "https://github.com/pronamic/wp-gravityforms-nl/issues", + "source": "https://github.com/pronamic/wp-gravityforms-nl/tree/3.0.1" + }, + "time": "2020-11-09T10:39:56+00:00" + }, + { + "name": "pronamic/wp-money", + "version": "1.2.5", + "source": { + "type": "git", + "url": "https://github.com/pronamic/wp-money.git", + "reference": "d40e63265ac954e8c40d29ed09e65989a091f024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pronamic/wp-money/zipball/d40e63265ac954e8c40d29ed09e65989a091f024", + "reference": "d40e63265ac954e8c40d29ed09e65989a091f024", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "koodimonni-language/de_de": "*", + "koodimonni-language/fr_fr": "*", + "koodimonni-language/nl_nl": "*", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.4", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "vlucas/phpdotenv": "^2.0", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Money\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "WordPress Money library.", + "support": { + "issues": "https://github.com/pronamic/wp-money/issues", + "source": "https://github.com/pronamic/wp-money/tree/1.2.5" + }, + "time": "2020-07-08T11:43:27+00:00" + }, + { + "name": "viison/address-splitter", + "version": "0.3.4", + "source": { + "type": "git", + "url": "https://github.com/pickware/address-splitter.git", + "reference": "ebad709276aaadce94a3a1fe2507aa38a467a94a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pickware/address-splitter/zipball/ebad709276aaadce94a3a1fe2507aa38a467a94a", + "reference": "ebad709276aaadce94a3a1fe2507aa38a467a94a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "VIISON\\AddressSplitter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "VIISON GmbH", + "email": "contact@viison.com" + } + ], + "description": "Tries to split an address line into street name, house number and other additional information like building, apartment information etc.", + "support": { + "issues": "https://github.com/pickware/address-splitter/issues", + "source": "https://github.com/pickware/address-splitter/tree/0.3.4" + }, + "time": "2019-10-24T09:23:47+00:00" + }, + { + "name": "wp-pay-extensions/charitable", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/charitable.git", + "reference": "79cf6d9f912354e5c7eddc681cbb4ec106c9dc5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/charitable/zipball/79cf6d9f912354e5c7eddc681cbb4ec106c9dc5a", + "reference": "79cf6d9f912354e5c7eddc681cbb4ec106c9dc5a", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "charitable/charitable": "^1.6", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Charitable driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/charitable/", + "keywords": [ + "charitable", + "extension", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/charitable/issues", + "source": "https://github.com/wp-pay-extensions/charitable" + }, + "time": "2021-01-14T16:29:39+00:00" + }, + { + "name": "wp-pay-extensions/contact-form-7", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/contact-form-7.git", + "reference": "6a15910f5530c48024785e1692b76aafa1cdd1b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/contact-form-7/zipball/6a15910f5530c48024785e1692b76aafa1cdd1b5", + "reference": "6a15910f5530c48024785e1692b76aafa1cdd1b5", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Contact Form 7 driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/contact-form-7/", + "keywords": [ + "contact-form-7", + "extension", + "gateway", + "pay", + "payments", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/contact-form-7/issues", + "source": "https://github.com/wp-pay-extensions/contact-form-7/" + }, + "time": "2021-01-14T13:40:04+00:00" + }, + { + "name": "wp-pay-extensions/easy-digital-downloads", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/easy-digital-downloads.git", + "reference": "3b83aa12470864e49c4a83a571ab1b608ef066df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/easy-digital-downloads/zipball/3b83aa12470864e49c4a83a571ab1b608ef066df", + "reference": "3b83aa12470864e49c4a83a571ab1b608ef066df", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "easydigitaldownloads/easy-digital-downloads": "^2.9", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Easy Digital Downloads driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/easy-digital-downloads/", + "keywords": [ + "digital", + "downlaods", + "easy", + "edd", + "extension", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/easy-digital-downloads/issues", + "source": "https://github.com/wp-pay-extensions/easy-digital-downloads" + }, + "time": "2021-01-14T13:44:36+00:00" + }, + { + "name": "wp-pay-extensions/event-espresso", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/event-espresso.git", + "reference": "e88d597d2078db30c3ac33200128ff9c02628dab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/event-espresso/zipball/e88d597d2078db30c3ac33200128ff9c02628dab", + "reference": "e88d597d2078db30c3ac33200128ff9c02628dab", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Event Espresso driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/event-espresso/", + "keywords": [ + "espresso", + "event", + "event-espresso", + "events", + "extension", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/event-espresso/issues", + "source": "https://github.com/wp-pay-extensions/event-espresso" + }, + "time": "2021-01-14T13:50:49+00:00" + }, + { + "name": "wp-pay-extensions/event-espresso-legacy", + "version": "2.3.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/event-espresso-legacy.git", + "reference": "0e54c1e7b4513230963981dbe1a007474e2428a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/event-espresso-legacy/zipball/0e54c1e7b4513230963981dbe1a007474e2428a8", + "reference": "0e54c1e7b4513230963981dbe1a007474e2428a8", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Event Espresso (legacy 3.1) driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/event-espresso-legacy/", + "keywords": [ + "espresso", + "event", + "event-espresso", + "events", + "extension", + "legacy", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/event-espresso-legacy/issues", + "source": "https://github.com/wp-pay-extensions/event-espresso-legacy" + }, + "time": "2021-01-19T22:00:41+00:00" + }, + { + "name": "wp-pay-extensions/formidable-forms", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/formidable-forms.git", + "reference": "d6cd255494a78de71e6dac79f398943d595f0419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/formidable-forms/zipball/d6cd255494a78de71e6dac79f398943d595f0419", + "reference": "d6cd255494a78de71e6dac79f398943d595f0419", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Formidable Forms driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/formidable-forms/", + "keywords": [ + "Forms", + "extension", + "formidable", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/formidable-forms/issues", + "source": "https://github.com/wp-pay-extensions/formidable-forms" + }, + "time": "2021-01-21T15:14:46+00:00" + }, + { + "name": "wp-pay-extensions/give", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/give.git", + "reference": "b289c35ad66ff49fa3b958d5442886da9ab69c11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/give/zipball/b289c35ad66ff49fa3b958d5442886da9ab69c11", + "reference": "b289c35ad66ff49fa3b958d5442886da9ab69c11", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "impress-org/givewp": "^2.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\Give\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Give driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/give/", + "keywords": [ + "extension", + "give", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/give/issues", + "source": "https://github.com/wp-pay-extensions/give" + }, + "time": "2021-01-14T14:39:06+00:00" + }, + { + "name": "wp-pay-extensions/gravityforms", + "version": "2.5.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/gravityforms.git", + "reference": "f24264e26c90af504e92cad42b8f6a1b12586897" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/gravityforms/zipball/f24264e26c90af504e92cad42b8f6a1b12586897", + "reference": "f24264e26c90af504e92cad42b8f6a1b12586897", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "pronamic/wp-gravityforms-nl": "^3.0", + "wp-pay/core": "^2.5" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.3", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6", + "wp-premium/gravityforms": "^2.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Gravity Forms driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/gravityforms/", + "keywords": [ + "extension", + "gravityforms", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/gravityforms/issues", + "source": "https://github.com/wp-pay-extensions/gravityforms" + }, + "time": "2021-01-14T14:42:48+00:00" + }, + { + "name": "wp-pay-extensions/memberpress", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/memberpress.git", + "reference": "be09a5b47657accbb92f6ffe394ea3809b6eb597" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/memberpress/zipball/be09a5b47657accbb92f6ffe394ea3809b6eb597", + "reference": "be09a5b47657accbb92f6ffe394ea3809b6eb597", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6", + "wp-premium/memberpress-basic": "^1.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "MemberPress driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/memberpress/", + "keywords": [ + "extension", + "memberpress", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/memberpress/issues", + "source": "https://github.com/wp-pay-extensions/memberpress" + }, + "time": "2021-01-18T12:02:13+00:00" + }, + { + "name": "wp-pay-extensions/ninjaforms", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/ninjaforms.git", + "reference": "a2a66cdc390060a04e4e52d684fd63edad90c6f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/ninjaforms/zipball/a2a66cdc390060a04e4e52d684fd63edad90c6f4", + "reference": "a2a66cdc390060a04e4e52d684fd63edad90c6f4", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6", + "wpackagist-plugin/ninja-forms": "3.4.33" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Ruben Droogh", + "homepage": "http://www.rubendroogh.nl/", + "role": "Developer" + } + ], + "description": "Ninja Forms driver for the WordPress payment processing library.", + "keywords": [ + "Forms", + "extension", + "ninja", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/ninjaforms/issues", + "source": "https://github.com/wp-pay-extensions/ninjaforms" + }, + "time": "2021-01-21T15:31:59+00:00" + }, + { + "name": "wp-pay-extensions/restrict-content-pro", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/restrict-content-pro.git", + "reference": "089b41b1766d28c1758db38b43637b2fa5c092d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/restrict-content-pro/zipball/089b41b1766d28c1758db38b43637b2fa5c092d5", + "reference": "089b41b1766d28c1758db38b43637b2fa5c092d5", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "restrictcontentpro/restrict-content": "2.2.3", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.2", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Restrict Content Pro driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/restrict-content-pro/", + "keywords": [ + "content", + "extension", + "pay", + "pro", + "pronamic", + "restrict", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/restrict-content-pro/issues", + "source": "https://github.com/wp-pay-extensions/restrict-content-pro" + }, + "time": "2021-01-14T15:04:22+00:00" + }, + { + "name": "wp-pay-extensions/s2member", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/s2member.git", + "reference": "3f5953a9539c339f8e8e435484d280d1b7b0c399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/s2member/zipball/3f5953a9539c339f8e8e435484d280d1b7b0c399", + "reference": "3f5953a9539c339f8e8e435484d280d1b7b0c399", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6", + "wpsharks/s2member": "190822" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "s2Member driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/s2member/", + "keywords": [ + "extension", + "pay", + "pronamic", + "s2member", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/s2member/issues", + "source": "https://github.com/wp-pay-extensions/s2member" + }, + "time": "2021-01-14T15:10:31+00:00" + }, + { + "name": "wp-pay-extensions/woocommerce", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/woocommerce.git", + "reference": "840135da3344b7be8f461598f378952ebe1db865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/woocommerce/zipball/840135da3344b7be8f461598f378952ebe1db865", + "reference": "840135da3344b7be8f461598f378952ebe1db865", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "woocommerce/woocommerce": "^4.9", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6", + "wp-premium/woocommerce-subscriptions": "2.4.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "WooCommerce driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/woocommerce/", + "keywords": [ + "extension", + "pay", + "pronamic", + "woocommerce", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/woocommerce/issues", + "source": "https://github.com/wp-pay-extensions/woocommerce" + }, + "time": "2021-01-14T15:18:04+00:00" + }, + { + "name": "wp-pay-extensions/wp-e-commerce", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/wp-e-commerce.git", + "reference": "e0564854b8973bae6c0845085ddfc7e0d31bbb8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/wp-e-commerce/zipball/e0564854b8973bae6c0845085ddfc7e0d31bbb8f", + "reference": "e0564854b8973bae6c0845085ddfc7e0d31bbb8f", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-e-commerce/wp-e-commerce": "^3.14", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "WP eCommerce driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/wp-e-commerce/", + "keywords": [ + "extension", + "pay", + "pronamic", + "wordpress", + "wp", + "wp-e-commerce" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/wp-e-commerce/issues", + "source": "https://github.com/wp-pay-extensions/wp-e-commerce" + }, + "time": "2021-01-14T15:22:42+00:00" + }, + { + "name": "wp-pay-gateways/adyen", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/adyen.git", + "reference": "21c8880af3d474a6cbf610c17837a87a5a0fa8b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/adyen/zipball/21c8880af3d474a6cbf610c17837a87a5a0fa8b7", + "reference": "21c8880af3d474a6cbf610c17837a87a5a0fa8b7", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.2", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.8", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Adyen driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/adyen/", + "keywords": [ + "adyen", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/adyen/issues", + "source": "https://github.com/wp-pay-gateways/adyen" + }, + "time": "2021-01-14T11:00:29+00:00" + }, + { + "name": "wp-pay-gateways/buckaroo", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/buckaroo.git", + "reference": "e05dafc6f6447679d7dd2d1ebd311e647d83002d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/buckaroo/zipball/e05dafc6f6447679d7dd2d1ebd311e647d83002d", + "reference": "e05dafc6f6447679d7dd2d1ebd311e647d83002d", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Buckaroo driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/buckaroo/", + "keywords": [ + "buckaroo", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/buckaroo/issues", + "source": "https://github.com/wp-pay-gateways/buckaroo" + }, + "time": "2020-04-20T07:17:06+00:00" + }, + { + "name": "wp-pay-gateways/ems-e-commerce", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ems-e-commerce.git", + "reference": "dc9d102177b96ced30aef0d1c13ac5d10ced6983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ems-e-commerce/zipball/dc9d102177b96ced30aef0d1c13ac5d10ced6983", + "reference": "dc9d102177b96ced30aef0d1c13ac5d10ced6983", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "EMS e-Commerce Gateway driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ems-e-commerce/", + "keywords": [ + "EMS", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ems-e-commerce/issues", + "source": "https://github.com/wp-pay-gateways/ems-e-commerce" + }, + "time": "2020-04-20T07:17:20+00:00" + }, + { + "name": "wp-pay-gateways/icepay", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/icepay.git", + "reference": "95d3414ce34fff945ba672aec039dbd9932c5890" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/icepay/zipball/95d3414ce34fff945ba672aec039dbd9932c5890", + "reference": "95d3414ce34fff945ba672aec039dbd9932c5890", + "shasum": "" + }, + "require": { + "icepay/icepay": "^2.5.0", + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "ICEPAY driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/icepay/", + "keywords": [ + "gateway", + "icepay", + "ideal", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/icepay/issues", + "source": "https://github.com/wp-pay-gateways/icepay" + }, + "time": "2020-03-19T09:38:50+00:00" + }, + { + "name": "wp-pay-gateways/ideal", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ideal.git", + "reference": "722eb55059fa34cc194ae501770a135ac5092973" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ideal/zipball/722eb55059fa34cc194ae501770a135ac5092973", + "reference": "722eb55059fa34cc194ae501770a135ac5092973", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "iDEAL driver for the WordPress payment processing library.", + "homepage": "https://github.com/wp-pay-gateways/ideal", + "keywords": [ + "gateway", + "ideal", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "issues": "https://github.com/wp-pay-gateways/ideal/issues", + "source": "https://github.com/wp-pay-gateways/ideal/tree/2.1.0" + }, + "time": "2020-03-19T09:41:04+00:00" + }, + { + "name": "wp-pay-gateways/ideal-advanced-v3", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ideal-advanced-v3.git", + "reference": "b8eb3a46e0ce14340f3893f79bcf62216576e1ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ideal-advanced-v3/zipball/b8eb3a46e0ce14340f3893f79bcf62216576e1ce", + "reference": "b8eb3a46e0ce14340f3893f79bcf62216576e1ce", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-openssl": "*", + "php": ">=5.6.20", + "wp-pay-gateways/ideal": "^2.1", + "wp-pay/core": "^2.5" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.2", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.5", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "iDEAL Advanced v3 driver for the WordPress payment processing library.", + "homepage": "https://github.com/wp-pay-gateways/ideal-advanced-v3", + "keywords": [ + "advanced", + "gateway", + "ideal", + "pay", + "pronamic", + "v3", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ideal-advanced-v3/issues", + "source": "https://github.com/wp-pay-gateways/ideal-advanced-v3" + }, + "time": "2020-11-17T22:09:54+00:00" + }, + { + "name": "wp-pay-gateways/ideal-basic", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ideal-basic.git", + "reference": "9dbde9b582819a966d9ef5f548a46113ad567784" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ideal-basic/zipball/9dbde9b582819a966d9ef5f548a46113ad567784", + "reference": "9dbde9b582819a966d9ef5f548a46113ad567784", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay-gateways/ideal": "^2.1", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "iDEAL Basic driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ideal-basic/", + "keywords": [ + "basic", + "gateway", + "ideal", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ideal-basic/issues", + "source": "https://github.com/wp-pay-gateways/ideal-basic" + }, + "time": "2020-11-10T22:22:33+00:00" + }, + { + "name": "wp-pay-gateways/ing-kassa-compleet", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ing-kassa-compleet.git", + "reference": "12c5a13384e80dc2c0cf415380ec7d40d37e13ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ing-kassa-compleet/zipball/12c5a13384e80dc2c0cf415380ec7d40d37e13ed", + "reference": "12c5a13384e80dc2c0cf415380ec7d40d37e13ed", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "ING Kassa Compleet driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ing-kassa-compleet/", + "keywords": [ + "compleet", + "gateway", + "ing", + "kassa", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ing-kassa-compleet/issues", + "source": "https://github.com/wp-pay-gateways/ing-kassa-compleet" + }, + "time": "2020-03-19T09:49:36+00:00" + }, + { + "name": "wp-pay-gateways/mollie", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/mollie.git", + "reference": "fe5ded7431eed0eb9f4bcd931adba3f97566a81d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/mollie/zipball/fe5ded7431eed0eb9f4bcd931adba3f97566a81d", + "reference": "fe5ded7431eed0eb9f4bcd931adba3f97566a81d", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.3", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-cli/wp-cli": "^2.3", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Mollie driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/mollie/", + "keywords": [ + "gateway", + "mollie", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/mollie/issues", + "source": "https://github.com/wp-pay-gateways/mollie" + }, + "time": "2021-01-18T13:24:32+00:00" + }, + { + "name": "wp-pay-gateways/multisafepay", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/multisafepay.git", + "reference": "9b6efe8dd9db71055e2f4ef2943d7d88efa252ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/multisafepay/zipball/9b6efe8dd9db71055e2f4ef2943d7d88efa252ae", + "reference": "9b6efe8dd9db71055e2f4ef2943d7d88efa252ae", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "MultiSafepay driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/multisafepay/", + "keywords": [ + "gateway", + "ideal", + "multisafepay", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/multisafepay/issues", + "source": "https://github.com/wp-pay-gateways/multisafepay" + }, + "time": "2021-01-18T12:01:44+00:00" + }, + { + "name": "wp-pay-gateways/ogone", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ogone.git", + "reference": "05a79e308e12b6ec97975bdac419b3474de03185" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ogone/zipball/05a79e308e12b6ec97975bdac419b3474de03185", + "reference": "05a79e308e12b6ec97975bdac419b3474de03185", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Ingenico/Ogone driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ogone/", + "keywords": [ + "gateway", + "ingenico", + "ogone", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ogone/issues", + "source": "https://github.com/wp-pay-gateways/ogone" + }, + "time": "2020-07-08T11:46:23+00:00" + }, + { + "name": "wp-pay-gateways/omnikassa-2", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/omnikassa-2.git", + "reference": "0f20c1b49c54c722f35b5387410389af43cc1726" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/omnikassa-2/zipball/0f20c1b49c54c722f35b5387410389af43cc1726", + "reference": "0f20c1b49c54c722f35b5387410389af43cc1726", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.2", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-variable-analysis": "^2.9", + "slevomat/coding-standard": "^6.4", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "OmniKassa 2.0 driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/omnikassa-2/", + "keywords": [ + "gateway", + "omnikassa", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/omnikassa-2/issues", + "source": "https://github.com/wp-pay-gateways/omnikassa-2" + }, + "time": "2021-01-21T15:15:01+00:00" + }, + { + "name": "wp-pay-gateways/pay-nl", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/pay-nl.git", + "reference": "cd7a59ca00617a8fc9ea78d0486082ef6c429ef7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/pay-nl/zipball/cd7a59ca00617a8fc9ea78d0486082ef6c429ef7", + "reference": "cd7a59ca00617a8fc9ea78d0486082ef6c429ef7", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Pay.nl driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/pay-nl/", + "keywords": [ + "gateway", + "ideal", + "pay", + "pay-nl", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/pay-nl/issues", + "source": "https://github.com/wp-pay-gateways/pay-nl" + }, + "time": "2020-11-09T16:07:45+00:00" + }, + { + "name": "wp-pay-gateways/payvision", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/payvision.git", + "reference": "6f9e063d326f9284655bc10f0abd315126d6b565" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/payvision/zipball/6f9e063d326f9284655bc10f0abd315126d6b565", + "reference": "6f9e063d326f9284655bc10f0abd315126d6b565", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.5" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.2", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7", + "roots/wordpress": "^5.5", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.9", + "slevomat/coding-standard": "^6.4", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Payvision driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/payvision/", + "keywords": [ + "gateway", + "pay", + "payvision", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/payvision/issues", + "source": "https://github.com/wp-pay-gateways/payvision" + }, + "time": "2021-01-18T12:01:55+00:00" + }, + { + "name": "wp-pay-gateways/sisow", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/sisow.git", + "reference": "08fe7391bf5e141aaf135f6d1e3bb1e0fb124d0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/sisow/zipball/08fe7391bf5e141aaf135f6d1e3bb1e0fb124d0b", + "reference": "08fe7391bf5e141aaf135f6d1e3bb1e0fb124d0b", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Sisow driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/sisow/", + "keywords": [ + "gateway", + "pay", + "pronamic", + "sisow", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/sisow/issues", + "source": "https://github.com/wp-pay-gateways/sisow" + }, + "time": "2020-03-19T10:15:13+00:00" + }, + { + "name": "wp-pay-gateways/targetpay", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/targetpay.git", + "reference": "0121adfe450fcb037792d382756798fa2b8877c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/targetpay/zipball/0121adfe450fcb037792d382756798fa2b8877c8", + "reference": "0121adfe450fcb037792d382756798fa2b8877c8", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "TargetPay driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/targetpay/", + "keywords": [ + "gateway", + "pay", + "pronamic", + "targetpay", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/targetpay/issues", + "source": "https://github.com/wp-pay-gateways/targetpay" + }, + "time": "2020-03-19T10:20:47+00:00" + }, + { + "name": "wp-pay/core", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/wp-pay/core.git", + "reference": "b1ce9c7ccffd5dd0337a7b15116d8b4902e96a40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay/core/zipball/b1ce9c7ccffd5dd0337a7b15116d8b4902e96a40", + "reference": "b1ce9c7ccffd5dd0337a7b15116d8b4902e96a40", + "shasum": "" + }, + "require": { + "composer/installers": "^1.7", + "ext-dom": "*", + "ext-libxml": "*", + "ext-simplexml": "*", + "php": ">=5.6.20", + "pronamic/wp-datetime": "^1.2", + "pronamic/wp-money": "^1.2", + "viison/address-splitter": "^0.3.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.2", + "php-coveralls/php-coveralls": "^2.4", + "php-stubs/wp-cli-stubs": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-cli/wp-cli": "^2.3", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6", + "wpackagist-plugin/shortcode-ui": "^0.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\": "src/" + }, + "files": [ + "includes/functions.php", + "includes/xmlseclibs/xmlseclibs-ing.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "https://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "https://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Core components for the WordPress payment processing library.", + "homepage": "https://www.wp-pay.org/", + "keywords": [ + "core", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay/core/issues", + "source": "https://github.com/wp-pay/core" + }, + "time": "2021-01-21T15:15:38+00:00" + }, + { + "name": "wp-pay/fundraising", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay/fundraising.git", + "reference": "75ea3bbdaa90e223ff5dcbe54bb3309e9a51ccff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay/fundraising/zipball/75ea3bbdaa90e223ff5dcbe54bb3309e9a51ccff", + "reference": "75ea3bbdaa90e223ff5dcbe54bb3309e9a51ccff", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.1", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7", + "pronamic/wp-money": "^1.2", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.8", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-pay/core": "^2.5", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Fundraising\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Fundraising add-on for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/addons/fundraising/", + "keywords": [ + "addon", + "crowdfunding", + "donations", + "fundraising", + "pay", + "progress", + "pronamic", + "target", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay/fundraising/issues", + "source": "https://github.com/wp-pay/fundraising" + }, + "time": "2020-12-17T12:12:19+00:00" + } + ], + "packages-dev": [ + { + "name": "bamarni/composer-bin-plugin", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/bamarni/composer-bin-plugin.git", + "reference": "9329fb0fbe29e0e1b2db8f4639a193e4f5406225" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bamarni/composer-bin-plugin/zipball/9329fb0fbe29e0e1b2db8f4639a193e4f5406225", + "reference": "9329fb0fbe29e0e1b2db8f4639a193e4f5406225", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^5.5.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "symfony/console": "^2.5 || ^3.0 || ^4.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Bamarni\\Composer\\Bin\\Plugin" + }, + "autoload": { + "psr-4": { + "Bamarni\\Composer\\Bin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "No conflicts for your bin dependencies", + "keywords": [ + "composer", + "conflict", + "dependency", + "executable", + "isolation", + "tool" + ], + "support": { + "issues": "https://github.com/bamarni/composer-bin-plugin/issues", + "source": "https://github.com/bamarni/composer-bin-plugin/tree/master" + }, + "time": "2020-05-03T08:27:20+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "f28d44c286812c714741478d968104c5e604a1d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", + "reference": "f28d44c286812c714741478d968104c5e604a1d4", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + }, + "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": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/1.4.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": "2020-11-13T08:04:11+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.1", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c", + "reference": "fe390591e0241955f22eb9ba327d137e501c771c", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "phpcompatibility/php-compatibility": "^9.0", + "sensiolabs/security-checker": "^4.1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2020-12-07T18:04:37+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/master" + }, + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, + "time": "2020-06-16T21:01:06+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "60d379c243457e073cff02bc323a2a86cb355631" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.0" + }, + "time": "2020-09-30T07:37:28+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.7.0" + }, + "time": "2020-09-30T07:37:11+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.x" + }, + "time": "2017-10-19T19:58:43+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v2.0.19", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "446fc9faa5c2a9ddf65eb7121c0af7e857295241" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/446fc9faa5c2a9ddf65eb7121c0af7e857295241", + "reference": "446fc9faa5c2a9ddf65eb7121c0af7e857295241", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T10:06:57+00:00" + }, + { + "name": "pdepend/pdepend", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38", + "reference": "c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4|^5", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5", + "symfony/filesystem": "^2.3.0|^3|^4|^5" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0 || ^1.2.3", + "gregwar/rst": "^1.0", + "phpunit/phpunit": "^4.8.35|^5.7", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/master" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2020-06-20T10:53:13+00:00" + }, + { + "name": "php-coveralls/php-coveralls", + "version": "v2.4.3", + "source": { + "type": "git", + "url": "https://github.com/php-coveralls/php-coveralls.git", + "reference": "909381bd40a17ae6e9076051f0d73293c1c091af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/909381bd40a17ae6e9076051f0d73293c1c091af", + "reference": "909381bd40a17ae6e9076051f0d73293c1c091af", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "php": "^5.5 || ^7.0 || ^8.0", + "psr/log": "^1.0", + "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0", + "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0", + "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" + }, + "suggest": { + "symfony/http-kernel": "Allows Symfony integration" + }, + "bin": [ + "bin/php-coveralls" + ], + "type": "library", + "autoload": { + "psr-4": { + "PhpCoveralls\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kitamura Satoshi", + "email": "with.no.parachute@gmail.com", + "homepage": "https://www.facebook.com/satooshi.jp", + "role": "Original creator" + }, + { + "name": "Takashi Matsuo", + "email": "tmatsuo@google.com" + }, + { + "name": "Google Inc" + }, + { + "name": "Dariusz Ruminski", + "email": "dariusz.ruminski@gmail.com", + "homepage": "https://github.com/keradus" + }, + { + "name": "Contributors", + "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" + } + ], + "description": "PHP client library for Coveralls API", + "homepage": "https://github.com/php-coveralls/php-coveralls", + "keywords": [ + "ci", + "coverage", + "github", + "test" + ], + "support": { + "issues": "https://github.com/php-coveralls/php-coveralls/issues", + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.4.3" + }, + "time": "2020-12-24T09:17:03+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.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", + "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/b862bc32f7e860d0b164b199bd995e690b4b191c", + "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "paragonie/random_compat": "dev-master", + "paragonie/sodium_compat": "dev-master" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || 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" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "time": "2019-11-04T15:17:54+00:00" + }, + { + "name": "phpcompatibility/phpcompatibility-wp", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", + "reference": "41bef18ba688af638b7310666db28e1ea9158b2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/41bef18ba688af638b7310666db28e1ea9158b2f", + "reference": "41bef18ba688af638b7310666db28e1ea9158b2f", + "shasum": "" + }, + "require": { + "phpcompatibility/php-compatibility": "^9.0", + "phpcompatibility/phpcompatibility-paragonie": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || 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", + "wordpress" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "time": "2019-08-28T14:22:28+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" + }, + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", + "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/3.x" + }, + "time": "2017-11-10T14:09:06+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/master" + }, + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpmd/phpmd", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "ce10831d4ddc2686c1348a98069771dd314534a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/ce10831d4ddc2686c1348a98069771dd314534a8", + "reference": "ce10831d4ddc2686c1348a98069771dd314534a8", + "shasum": "" + }, + "require": { + "composer/xdebug-handler": "^1.0", + "ext-xml": "*", + "pdepend/pdepend": "^2.7.1", + "php": ">=5.3.9" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0 || ^1.3.2", + "ext-json": "*", + "ext-simplexml": "*", + "gregwar/rst": "^1.0", + "mikey179/vfsstream": "^1.6.4", + "phpunit/phpunit": "^4.8.36 || ^5.7.27", + "squizlabs/php_codesniffer": "^2.0" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "library", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "https://phpmd.org/", + "keywords": [ + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.9.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2020-09-23T22:06:32+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.10.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "451c3cd1418cf640de218914901e51b064abb093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5 || ^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" + }, + "time": "2020-03-05T15:02:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "^1.3", + "phpunit/php-text-template": "^1.2", + "phpunit/php-token-stream": "^1.4.2 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "^1.0 || ^2.0" + }, + "require-dev": { + "ext-xdebug": "^2.1.4", + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-xdebug": "^2.5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "irc": "irc://irc.freenode.net/phpunit", + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/4.0" + }, + "time": "2017-04-02T07:44:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "irc": "irc://irc.freenode.net/phpunit", + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" + }, + "time": "2017-11-27T13:52:08+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + }, + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/1.4" + }, + "abandoned": true, + "time": "2017-12-04T08:55:13+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "5.7.27", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.4", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "^1.2.4", + "sebastian/diff": "^1.4.3", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.1", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "^1.0.6|^2.0.1", + "symfony/yaml": "~2.1|~3.0|~4.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/5.7.27" + }, + "time": "2018-02-01T05:50:59+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "support": { + "irc": "irc://irc.freenode.net/phpunit", + "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", + "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/3.4" + }, + "abandoned": true, + "time": "2017-06-30T09:13:00+00:00" + }, + { + "name": "phpunit/phpunit-selenium", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/giorgiosironi/phpunit-selenium.git", + "reference": "343ba4e389ad97046c78fb2c7111e199795e7a80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/giorgiosironi/phpunit-selenium/zipball/343ba4e389ad97046c78fb2c7111e199795e7a80", + "reference": "343ba4e389ad97046c78fb2c7111e199795e7a80", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "php": ">=5.6", + "phpunit/phpunit": "~5.0", + "sebastian/comparator": "~1.0" + }, + "require-dev": { + "phing/phing": "2.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Giorgio Sironi", + "email": "info@giorgiosironi.com", + "role": "developer" + }, + { + "name": "Ivan Kurnosov", + "email": "zerkms@zerkms.com", + "role": "developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "original developer" + }, + { + "name": "Paul Briton", + "role": "developer" + } + ], + "description": "Selenium Server integration for PHPUnit", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "selenium", + "testing", + "xunit" + ], + "support": { + "irc": "irc://irc.freenode.net/phpunit", + "issues": "https://github.com/sebastianbergmann/phpunit-selenium/issues", + "source": "https://github.com/giorgiosironi/phpunit-selenium/tree/master" + }, + "time": "2017-01-23T22:12:35+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://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/master" + }, + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://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/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "roots/wordpress", + "version": "5.6", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress.git", + "reference": "5.6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.6" + }, + "require": { + "php": ">=5.3.2", + "roots/wordpress-core-installer": ">=1.0.0" + }, + "type": "wordpress-core", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "WordPress Community", + "homepage": "https://wordpress.org/about/" + } + ], + "description": "WordPress is web software you can use to create a beautiful website or blog.", + "homepage": "https://wordpress.org/", + "keywords": [ + "blog", + "cms", + "wordpress" + ], + "support": { + "docs": "https://developer.wordpress.org/", + "forum": "https://wordpress.org/support/", + "irc": "irc://irc.freenode.net/wordpress", + "issues": "https://core.trac.wordpress.org/", + "rss": "https://wordpress.org/news/feed/", + "source": "https://core.trac.wordpress.org/browser", + "wiki": "https://codex.wordpress.org/" + }, + "funding": [ + { + "url": "https://github.com/roots", + "type": "github" + }, + { + "url": "https://www.patreon.com/rootsdev", + "type": "patreon" + } + ], + "time": "2020-12-08T22:15:57+00:00" + }, + { + "name": "roots/wordpress-core-installer", + "version": "1.100.0", + "source": { + "type": "git", + "url": "https://github.com/roots/wordpress-core-installer.git", + "reference": "73f8488e5178c5d54234b919f823a9095e2b1847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/roots/wordpress-core-installer/zipball/73f8488e5178c5d54234b919f823a9095e2b1847", + "reference": "73f8488e5178c5d54234b919f823a9095e2b1847", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.6.0" + }, + "conflict": { + "composer/installers": "<1.0.6" + }, + "replace": { + "johnpbloch/wordpress-core-installer": "*" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "phpunit/phpunit": ">=5.7.27" + }, + "type": "composer-plugin", + "extra": { + "class": "Roots\\Composer\\WordPressCorePlugin" + }, + "autoload": { + "psr-4": { + "Roots\\Composer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "John P. Bloch", + "email": "me@johnpbloch.com" + }, + { + "name": "Roots", + "email": "team@roots.io" + } + ], + "description": "A custom installer to handle deploying WordPress with composer", + "keywords": [ + "wordpress" + ], + "support": { + "issues": "https://github.com/roots/wordpress-core-installer/issues", + "source": "https://github.com/roots/wordpress-core-installer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/roots", + "type": "github" + }, + { + "url": "https://www.patreon.com/rootsdev", + "type": "patreon" + } + ], + "time": "2020-08-20T00:27:30+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:15:22+00:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/1.2" + }, + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/1.4" + }, + "time": "2017-05-22T07:24:03+00:00" + }, + { + "name": "sebastian/environment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/master" + }, + "time": "2016-11-26T07:53:53+00:00" + }, + { + "name": "sebastian/exporter", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/master" + }, + "time": "2016-11-19T08:54:04+00:00" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1" + }, + "time": "2015-10-12T03:26:01+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master" + }, + "time": "2017-02-18T15:18:39+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" + }, + "time": "2016-11-19T07:33:16+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" + }, + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.5.8", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", + "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2020-10-23T02:01:07+00:00" + }, + { + "name": "symfony/config", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f", + "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/filesystem": "~2.8|~3.0|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3", + "symfony/finder": "<3.3" + }, + "require-dev": { + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~3.3|~4.0", + "symfony/finder": "~3.3|~4.0", + "symfony/yaml": "~3.0|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "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": "Symfony Config Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/console", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "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": "Symfony Console Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/ab42889de57fdfcfcc0759ab102e2fd4ea72dcae", + "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "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": "Symfony Debug Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51d2a2708c6ceadad84393f8581df1dcf9e5e84b", + "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<3.3.7", + "symfony/finder": "<3.3", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "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": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e58d7841cddfed6e846829040dca2cca0ebbbbb3", + "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "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": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/aed596913b70fae57be53d86faa2e9ef85a2297b", + "reference": "aed596913b70fae57be53d86faa2e9ef85a2297b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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.19.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": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "4ad5115c0f5d5172a9fe8147675ec6de266d8826" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/4ad5115c0f5d5172a9fe8147675ec6de266d8826", + "reference": "4ad5115c0f5d5172a9fe8147675ec6de266d8826", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.19.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": "2020-10-21T09:57:48+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8db0ae7936b42feb370840cf24de1a144fb0ef27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8db0ae7936b42feb370840cf24de1a144fb0ef27", + "reference": "8db0ae7936b42feb370840cf24de1a144fb0ef27", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "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.19.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": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.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": "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.19.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": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3fe414077251a81a1b15b1c709faf5c2fbae3d4e", + "reference": "3fe414077251a81a1b15b1c709faf5c2fbae3d4e", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "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 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php70/tree/v1.19.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": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "beecef6b463b06954638f02378f52496cb84bacc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/beecef6b463b06954638f02378f52496cb84bacc", + "reference": "beecef6b463b06954638f02378f52496cb84bacc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.19.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": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/298b81faad4ce60e94466226b2abbb8c9bca7462", + "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "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": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "88289caa3c166321883f67fe5130188ebbb47094" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", + "reference": "88289caa3c166321883f67fe5130188ebbb47094", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v3.4.47" + }, + "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": "2020-10-24T10:57:07+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.9.1" + }, + "time": "2020-07-08T17:02:28+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "7da1894633f168fe244afc6de00d141f27517b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", + "reference": "7da1894633f168fe244afc6de00d141f27517b62", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.3.1" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." + }, + "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", + "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" + }, + "time": "2020-05-13T23:57:56+00:00" + }, + { + "name": "wp-pay-gateways/paypal", + "version": "dev-develop", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/paypal.git", + "reference": "2e9b39c94a286c3c89c6f5ee4e421539cc1bceb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/paypal/zipball/2e9b39c94a286c3c89c6f5ee4e421539cc1bceb7", + "reference": "2e9b39c94a286c3c89c6f5ee4e421539cc1bceb7", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.9", + "slevomat/coding-standard": "^6.4", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\PayPal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "PayPal driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/paypal/", + "keywords": [ + "gateway", + "pay", + "paypal", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/paypal/issues", + "source": "https://github.com/wp-pay-gateways/paypal" + }, + "time": "2021-01-20T12:56:52+00:00" + }, + { + "name": "wp-phpunit/wp-phpunit", + "version": "5.6.0", + "source": { + "type": "git", + "url": "https://github.com/wp-phpunit/wp-phpunit.git", + "reference": "7130a214573cc8c12a0f8fe8a74b18b453bce1e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/7130a214573cc8c12a0f8fe8a74b18b453bce1e9", + "reference": "7130a214573cc8c12a0f8fe8a74b18b453bce1e9", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "__loaded.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Evan Mattson", + "email": "me@aaemnnost.tv" + }, + { + "name": "WordPress Community", + "homepage": "https://wordpress.org/about/" + } + ], + "description": "WordPress core PHPUnit library", + "homepage": "https://github.com/wp-phpunit", + "keywords": [ + "phpunit", + "test", + "wordpress" + ], + "support": { + "docs": "https://github.com/wp-phpunit/docs", + "issues": "https://github.com/wp-phpunit/issues", + "source": "https://github.com/wp-phpunit/wp-phpunit" + }, + "time": "2020-12-09T18:06:02+00:00" + } + ], + "aliases": [ + { + "package": "wp-pay-gateways/paypal", + "version": "dev-develop", + "alias": "1.0.0", + "alias_normalized": "1.0.0.0" + } + ], + "minimum-stability": "stable", + "stability-flags": { + "wp-pay-gateways/paypal": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.6.20" + }, + "platform-dev": [], + "platform-overrides": { + "php": "5.6.20" + }, + "plugin-api-version": "2.0.0" +} diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-100x100-campaign.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-100x100-campaign.html new file mode 100644 index 00000000..a0723ef8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-100x100-campaign.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-100x100.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-100x100.html new file mode 100644 index 00000000..bee26f55 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-100x100.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x100-campaign.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x100-campaign.html new file mode 100644 index 00000000..a10af399 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x100-campaign.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x100.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x100.html new file mode 100644 index 00000000..229c7e70 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x100.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x55-campaign.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x55-campaign.html new file mode 100644 index 00000000..f2c85250 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x55-campaign.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x55.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x55.html new file mode 100644 index 00000000..a90ec459 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-155x55.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x100-campaign.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x100-campaign.html new file mode 100644 index 00000000..858c8468 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x100-campaign.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x100.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x100.html new file mode 100644 index 00000000..648d3e6a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x100.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x60-campaign.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x60-campaign.html new file mode 100644 index 00000000..7bbdbd67 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x60-campaign.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x60.html b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x60.html new file mode 100644 index 00000000..75b44680 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/ideal/banner-234x60.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-big.html b/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-big.html new file mode 100644 index 00000000..20eb9653 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-big.html @@ -0,0 +1,3 @@ + + iDEAL en creditcard + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-medium.html b/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-medium.html new file mode 100644 index 00000000..ff04bc8c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-medium.html @@ -0,0 +1,3 @@ + + iDEAL en creditcard + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-small.html b/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-small.html new file mode 100644 index 00000000..2adab0d6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/mollie/badge-betaling-groen-small.html @@ -0,0 +1,3 @@ + + iDEAL en creditcard + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-big.html b/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-big.html new file mode 100644 index 00000000..5efb73fd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-big.html @@ -0,0 +1,3 @@ + + Mollie + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-medium.html b/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-medium.html new file mode 100644 index 00000000..0430ff47 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-medium.html @@ -0,0 +1,3 @@ + + Mollie + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-small.html b/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-small.html new file mode 100644 index 00000000..f1c36645 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/html/mollie/badge-powered-small.html @@ -0,0 +1,3 @@ + + Mollie + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60.png new file mode 100644 index 00000000..9c93dee0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@2x.png new file mode 100644 index 00000000..f5c5268f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@3x.png new file mode 100644 index 00000000..aa62f058 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@4x.png new file mode 100644 index 00000000..a5c41fd9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24.png new file mode 100644 index 00000000..aea1b03c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@2x.png new file mode 100644 index 00000000..6aa737ad Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@3x.png new file mode 100644 index 00000000..fedc85b7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@4x.png new file mode 100644 index 00000000..2d56ad3f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32.png new file mode 100644 index 00000000..cf1fa0c2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@2x.png new file mode 100644 index 00000000..f64bdf1d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@3x.png new file mode 100644 index 00000000..2d56ad3f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@4x.png new file mode 100644 index 00000000..21451b45 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32.png new file mode 100644 index 00000000..b837b0a7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@2x.png new file mode 100644 index 00000000..7ae23652 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@3x.png new file mode 100644 index 00000000..0087d746 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@4x.png new file mode 100644 index 00000000..1dc27181 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48.png new file mode 100644 index 00000000..f7e628ee Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@2x.png new file mode 100644 index 00000000..0bddd41c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@3x.png new file mode 100644 index 00000000..168e00a2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@4x.png new file mode 100644 index 00000000..33cc4559 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64.png new file mode 100644 index 00000000..f64bdf1d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@2x.png new file mode 100644 index 00000000..21451b45 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@3x.png new file mode 100644 index 00000000..5327676d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@4x.png new file mode 100644 index 00000000..69d81d6d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/abn-amro/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/active0.png b/wp-content/plugins/pronamic-ideal/images/active0.png new file mode 100644 index 00000000..51c9bc31 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/active0.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/active1.png b/wp-content/plugins/pronamic-ideal/images/active1.png new file mode 100644 index 00000000..f4540a42 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/active1.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60.png new file mode 100644 index 00000000..7f10e4c1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@2x.png new file mode 100644 index 00000000..26468704 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@3x.png new file mode 100644 index 00000000..e541b17f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@4x.png new file mode 100644 index 00000000..cbb823e8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24.png new file mode 100644 index 00000000..017a8a25 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@2x.png new file mode 100644 index 00000000..070fec7a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@3x.png new file mode 100644 index 00000000..3bf6abd7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@4x.png new file mode 100644 index 00000000..f83d267a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32.png new file mode 100644 index 00000000..bf220452 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@2x.png new file mode 100644 index 00000000..faa70680 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@3x.png new file mode 100644 index 00000000..f83d267a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@4x.png new file mode 100644 index 00000000..a5d5fd20 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32.png new file mode 100644 index 00000000..32eba8d6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@2x.png new file mode 100644 index 00000000..85732e79 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@3x.png new file mode 100644 index 00000000..62945f74 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@4x.png new file mode 100644 index 00000000..c2c7a206 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48.png new file mode 100644 index 00000000..2888bb66 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@2x.png new file mode 100644 index 00000000..e27ff6a4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@3x.png new file mode 100644 index 00000000..dd385bfa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@4x.png new file mode 100644 index 00000000..4150446f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64.png new file mode 100644 index 00000000..faa70680 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@2x.png new file mode 100644 index 00000000..a5d5fd20 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@3x.png new file mode 100644 index 00000000..865d0a05 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@4x.png new file mode 100644 index 00000000..68b384b3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/alipay/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60.png new file mode 100644 index 00000000..07159bfb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@2x.png new file mode 100644 index 00000000..3e6183a3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@3x.png new file mode 100644 index 00000000..05a311a7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@4x.png new file mode 100644 index 00000000..df5b5126 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24.png new file mode 100644 index 00000000..f87c2749 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@2x.png new file mode 100644 index 00000000..80bc6823 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@3x.png new file mode 100644 index 00000000..59fb86d7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@4x.png new file mode 100644 index 00000000..b6dd28db Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32.png new file mode 100644 index 00000000..e19b912d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@2x.png new file mode 100644 index 00000000..7ab906ad Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@3x.png new file mode 100644 index 00000000..b6dd28db Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@4x.png new file mode 100644 index 00000000..fb0d0cb5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32.png new file mode 100644 index 00000000..db2be584 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@2x.png new file mode 100644 index 00000000..5ea2acc2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@3x.png new file mode 100644 index 00000000..9d4b3cb0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@4x.png new file mode 100644 index 00000000..e2a471c0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48.png new file mode 100644 index 00000000..4c1255b2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@2x.png new file mode 100644 index 00000000..d2734b1d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@3x.png new file mode 100644 index 00000000..d864a1ab Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@4x.png new file mode 100644 index 00000000..aed00e33 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64.png new file mode 100644 index 00000000..7ab906ad Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@2x.png new file mode 100644 index 00000000..fb0d0cb5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@3x.png new file mode 100644 index 00000000..a1e25686 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@4x.png new file mode 100644 index 00000000..a1fcc002 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/asn-bank/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60.png new file mode 100644 index 00000000..96a13993 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@2x.png new file mode 100644 index 00000000..636ab1e8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@3x.png new file mode 100644 index 00000000..3af5813a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@4x.png new file mode 100644 index 00000000..f46c30b8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-16x16.png new file mode 100644 index 00000000..98054531 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24.png new file mode 100644 index 00000000..696a0f5c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@2x.png new file mode 100644 index 00000000..dd7211fa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@3x.png new file mode 100644 index 00000000..b452be57 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@4x.png new file mode 100644 index 00000000..c5a6414b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32.png new file mode 100644 index 00000000..78399ba2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@2x.png new file mode 100644 index 00000000..30bef813 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@3x.png new file mode 100644 index 00000000..c5a6414b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@4x.png new file mode 100644 index 00000000..46a595d5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32.png new file mode 100644 index 00000000..92653d2c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@2x.png new file mode 100644 index 00000000..5c9771ce Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@3x.png new file mode 100644 index 00000000..1620a6b7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@4x.png new file mode 100644 index 00000000..e8b4dbc8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48.png new file mode 100644 index 00000000..4271fe63 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@2x.png new file mode 100644 index 00000000..a29a2d74 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@3x.png new file mode 100644 index 00000000..150bc2ba Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@4x.png new file mode 100644 index 00000000..a5292e0e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64.png new file mode 100644 index 00000000..30bef813 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@2x.png new file mode 100644 index 00000000..46a595d5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@3x.png new file mode 100644 index 00000000..7f6d7a49 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@4x.png new file mode 100644 index 00000000..d86cc48e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bancontact/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/bancontact/wc-icon.png new file mode 100644 index 00000000..1254c8d3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bancontact/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60.png new file mode 100644 index 00000000..79e8352e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@2x.png new file mode 100644 index 00000000..725677b2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@3x.png new file mode 100644 index 00000000..72cf9473 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@4x.png new file mode 100644 index 00000000..c69b1dce Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24.png new file mode 100644 index 00000000..6ba29e5c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@2x.png new file mode 100644 index 00000000..a8c9969e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@3x.png new file mode 100644 index 00000000..8b061d5e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@4x.png new file mode 100644 index 00000000..59b8a8e3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32.png new file mode 100644 index 00000000..889c8944 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@2x.png new file mode 100644 index 00000000..91382c58 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@3x.png new file mode 100644 index 00000000..59b8a8e3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@4x.png new file mode 100644 index 00000000..436443f3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32.png new file mode 100644 index 00000000..e7befe22 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@2x.png new file mode 100644 index 00000000..bcbeaf61 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@3x.png new file mode 100644 index 00000000..1fa05af5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@4x.png new file mode 100644 index 00000000..f1982aa1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48.png new file mode 100644 index 00000000..4576f603 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@2x.png new file mode 100644 index 00000000..3cd74f99 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@3x.png new file mode 100644 index 00000000..399d4f79 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@4x.png new file mode 100644 index 00000000..ecb0bc69 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64.png new file mode 100644 index 00000000..e8f8c479 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@2x.png new file mode 100644 index 00000000..436443f3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@3x.png new file mode 100644 index 00000000..ca1f6846 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@4x.png new file mode 100644 index 00000000..0221c3fa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bank-transfer/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60.png new file mode 100644 index 00000000..5fb90052 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@2x.png new file mode 100644 index 00000000..d4e47203 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@3x.png new file mode 100644 index 00000000..db9715cb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@4x.png new file mode 100644 index 00000000..c16d416c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24.png new file mode 100644 index 00000000..464677c2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@2x.png new file mode 100644 index 00000000..992f37d3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@3x.png new file mode 100644 index 00000000..3ff87d86 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@4x.png new file mode 100644 index 00000000..0127ec00 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32.png new file mode 100644 index 00000000..6e261501 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@2x.png new file mode 100644 index 00000000..e65a9062 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@3x.png new file mode 100644 index 00000000..0127ec00 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@4x.png new file mode 100644 index 00000000..e6f1920e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32.png new file mode 100644 index 00000000..bc9fd449 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@2x.png new file mode 100644 index 00000000..ac69b347 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@3x.png new file mode 100644 index 00000000..ab887286 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@4x.png new file mode 100644 index 00000000..a9b0de63 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48.png new file mode 100644 index 00000000..9fca78e6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@2x.png new file mode 100644 index 00000000..853ee086 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@3x.png new file mode 100644 index 00000000..08585888 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@4x.png new file mode 100644 index 00000000..bb681bfe Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64.png new file mode 100644 index 00000000..e65a9062 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@2x.png new file mode 100644 index 00000000..e6f1920e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@3x.png new file mode 100644 index 00000000..c53619c4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@4x.png new file mode 100644 index 00000000..7c49c6ef Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/belfius/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60.png new file mode 100644 index 00000000..ade3a64a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@2x.png new file mode 100644 index 00000000..3da199e9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@3x.png new file mode 100644 index 00000000..b7c6c010 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@4x.png new file mode 100644 index 00000000..2faca492 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24.png new file mode 100644 index 00000000..9bfdc80c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@2x.png new file mode 100644 index 00000000..1e22e002 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@3x.png new file mode 100644 index 00000000..c63d5e8e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@4x.png new file mode 100644 index 00000000..28524454 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32.png new file mode 100644 index 00000000..7920c3dc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@2x.png new file mode 100644 index 00000000..dbd14cce Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@3x.png new file mode 100644 index 00000000..c3a7b272 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@4x.png new file mode 100644 index 00000000..600fe5f7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32.png new file mode 100644 index 00000000..8553e85e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@2x.png new file mode 100644 index 00000000..ebd5bf94 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@3x.png new file mode 100644 index 00000000..3469156c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@4x.png new file mode 100644 index 00000000..3b03bd37 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48.png new file mode 100644 index 00000000..0906b233 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@2x.png new file mode 100644 index 00000000..13fcce54 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@3x.png new file mode 100644 index 00000000..e628089c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@4x.png new file mode 100644 index 00000000..22a918e4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64.png new file mode 100644 index 00000000..9866387f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@2x.png new file mode 100644 index 00000000..6615ef59 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@3x.png new file mode 100644 index 00000000..b3a052b7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@4x.png new file mode 100644 index 00000000..7e874bc4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bitcoin/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60.png new file mode 100644 index 00000000..9874247f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@2x.png new file mode 100644 index 00000000..3d32cc30 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@3x.png new file mode 100644 index 00000000..ae7bd067 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@4x.png new file mode 100644 index 00000000..e2e329dd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24.png new file mode 100644 index 00000000..af249c79 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@2x.png new file mode 100644 index 00000000..8fdcb65b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@3x.png new file mode 100644 index 00000000..1bbb44d9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@4x.png new file mode 100644 index 00000000..ad93544f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32.png new file mode 100644 index 00000000..26ea3e61 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@2x.png new file mode 100644 index 00000000..0f7ed941 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@3x.png new file mode 100644 index 00000000..ad93544f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@4x.png new file mode 100644 index 00000000..562a1524 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32.png new file mode 100644 index 00000000..179cfbd9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@2x.png new file mode 100644 index 00000000..0e914cc8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@3x.png new file mode 100644 index 00000000..c7199881 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@4x.png new file mode 100644 index 00000000..5cd117db Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48.png new file mode 100644 index 00000000..b1bdd8b6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@2x.png new file mode 100644 index 00000000..f30e4256 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@3x.png new file mode 100644 index 00000000..038117a9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@4x.png new file mode 100644 index 00000000..aeec5a3e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64.png new file mode 100644 index 00000000..9f715803 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@2x.png new file mode 100644 index 00000000..10c24a18 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@3x.png new file mode 100644 index 00000000..c5515b69 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@4x.png new file mode 100644 index 00000000..c05689cb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/bunq/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60.png new file mode 100644 index 00000000..087d09d0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@2x.png new file mode 100644 index 00000000..6b9b01da Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@3x.png new file mode 100644 index 00000000..92d8e14a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@4x.png new file mode 100644 index 00000000..9e80080d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x128.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x128.png new file mode 100644 index 00000000..58194833 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x128.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x163.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x163.png new file mode 100644 index 00000000..c9c26110 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x163.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24.png new file mode 100644 index 00000000..5223e567 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@2x.png new file mode 100644 index 00000000..032c0926 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@3x.png new file mode 100644 index 00000000..78b4d371 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@4x.png new file mode 100644 index 00000000..d392048c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32.png new file mode 100644 index 00000000..e892d9c7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@2x.png new file mode 100644 index 00000000..aa9186d4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@3x.png new file mode 100644 index 00000000..c5064670 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@4x.png new file mode 100644 index 00000000..9fbfcb88 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32.png new file mode 100644 index 00000000..00aaf1eb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@2x.png new file mode 100644 index 00000000..b101827c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@3x.png new file mode 100644 index 00000000..38231c1e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@4x.png new file mode 100644 index 00000000..08cc34f9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48.png new file mode 100644 index 00000000..d9fc762c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@2x.png new file mode 100644 index 00000000..82f9e639 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@3x.png new file mode 100644 index 00000000..870ad76d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@4x.png new file mode 100644 index 00000000..2f209b3e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64.png new file mode 100644 index 00000000..06c08c50 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@2x.png new file mode 100644 index 00000000..121c1d59 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@3x.png new file mode 100644 index 00000000..d5c47b91 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@4x.png new file mode 100644 index 00000000..8febe1a6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/credit-card/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/credit-card/wc-icon.png new file mode 100644 index 00000000..ad55c09d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/credit-card/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60.png new file mode 100644 index 00000000..7d2a7270 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@2x.png new file mode 100644 index 00000000..e9252b2b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@3x.png new file mode 100644 index 00000000..00af3a0e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@4x.png new file mode 100644 index 00000000..9cbb4b6b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24.png new file mode 100644 index 00000000..565f5ade Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@2x.png new file mode 100644 index 00000000..1af5b506 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@3x.png new file mode 100644 index 00000000..5b86982e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@4x.png new file mode 100644 index 00000000..8ff890aa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32.png new file mode 100644 index 00000000..d1a9d542 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@2x.png new file mode 100644 index 00000000..f526456d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@3x.png new file mode 100644 index 00000000..8ff890aa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@4x.png new file mode 100644 index 00000000..24c4f7c8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32.png new file mode 100644 index 00000000..0be1dc2b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@2x.png new file mode 100644 index 00000000..38aaa1e0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@3x.png new file mode 100644 index 00000000..e8bf87a9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@4x.png new file mode 100644 index 00000000..95d93f16 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48.png new file mode 100644 index 00000000..d96c61a1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@2x.png new file mode 100644 index 00000000..7466efd9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@3x.png new file mode 100644 index 00000000..619d4236 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@4x.png new file mode 100644 index 00000000..8eb40dff Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64.png new file mode 100644 index 00000000..70a3b49c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@2x.png new file mode 100644 index 00000000..3feee9fc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@3x.png new file mode 100644 index 00000000..ef9fc306 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@4x.png new file mode 100644 index 00000000..a24f42c0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-bancontact/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60.png new file mode 100644 index 00000000..140b788b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@2x.png new file mode 100644 index 00000000..3b34a2f2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@3x.png new file mode 100644 index 00000000..0676b7de Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@4x.png new file mode 100644 index 00000000..99323e2b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24.png new file mode 100644 index 00000000..cdf7ff93 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@2x.png new file mode 100644 index 00000000..04952d3b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@3x.png new file mode 100644 index 00000000..54b58b58 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@4x.png new file mode 100644 index 00000000..5d0fcdc1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32.png new file mode 100644 index 00000000..e2cba22d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@2x.png new file mode 100644 index 00000000..cc759b6f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@3x.png new file mode 100644 index 00000000..5d0fcdc1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@4x.png new file mode 100644 index 00000000..e4a548f9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32.png new file mode 100644 index 00000000..73b89a73 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@2x.png new file mode 100644 index 00000000..358f53fc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@3x.png new file mode 100644 index 00000000..9ca6d1a4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@4x.png new file mode 100644 index 00000000..692d97f1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48.png new file mode 100644 index 00000000..e88299be Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@2x.png new file mode 100644 index 00000000..1a812f4b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@3x.png new file mode 100644 index 00000000..71e3ebd1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@4x.png new file mode 100644 index 00000000..4c6395bb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64.png new file mode 100644 index 00000000..95e35b3d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@2x.png new file mode 100644 index 00000000..8a9b0a6f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@3x.png new file mode 100644 index 00000000..e761f295 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@4x.png new file mode 100644 index 00000000..26aeb7c7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-ideal/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60.png new file mode 100644 index 00000000..ccdaf57e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@2x.png new file mode 100644 index 00000000..d796c153 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@3x.png new file mode 100644 index 00000000..2d3473ee Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@4x.png new file mode 100644 index 00000000..135ff3d1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24.png new file mode 100644 index 00000000..6f0837e3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@2x.png new file mode 100644 index 00000000..86e1bba2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@3x.png new file mode 100644 index 00000000..388d7e74 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@4x.png new file mode 100644 index 00000000..97bb48f2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32.png new file mode 100644 index 00000000..6ad7ba89 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@2x.png new file mode 100644 index 00000000..ae48e316 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@3x.png new file mode 100644 index 00000000..d2e5617d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@4x.png new file mode 100644 index 00000000..6c25f489 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32.png new file mode 100644 index 00000000..d7fa543f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@2x.png new file mode 100644 index 00000000..f7332751 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@3x.png new file mode 100644 index 00000000..e41b56a7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@4x.png new file mode 100644 index 00000000..163849fd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48.png new file mode 100644 index 00000000..1c9cab33 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@2x.png new file mode 100644 index 00000000..d1d2f96a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@3x.png new file mode 100644 index 00000000..7f8c52ad Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@4x.png new file mode 100644 index 00000000..679b981f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64.png new file mode 100644 index 00000000..7b21f74a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@2x.png new file mode 100644 index 00000000..5698bfa8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@3x.png new file mode 100644 index 00000000..9326d226 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@4x.png new file mode 100644 index 00000000..731507f7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit-sofort/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60.png new file mode 100644 index 00000000..10838a92 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@2x.png new file mode 100644 index 00000000..0ca9dfd8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@3x.png new file mode 100644 index 00000000..1cd8ddf6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@4x.png new file mode 100644 index 00000000..c50ac7ae Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24.png new file mode 100644 index 00000000..3d155ba6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@2x.png new file mode 100644 index 00000000..8b8d7c7f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@3x.png new file mode 100644 index 00000000..1e6a2397 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@4x.png new file mode 100644 index 00000000..01a97aa7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32.png new file mode 100644 index 00000000..99c78ad1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@2x.png new file mode 100644 index 00000000..bd218245 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@3x.png new file mode 100644 index 00000000..ee40ac05 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@4x.png new file mode 100644 index 00000000..0097f232 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32.png new file mode 100644 index 00000000..5875dcc1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@2x.png new file mode 100644 index 00000000..801db99b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@3x.png new file mode 100644 index 00000000..8cfc3cb6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@4x.png new file mode 100644 index 00000000..5bf5cb1a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48.png new file mode 100644 index 00000000..ac0ba937 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@2x.png new file mode 100644 index 00000000..4f113bc7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@3x.png new file mode 100644 index 00000000..41f4aedd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@4x.png new file mode 100644 index 00000000..da393cbd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64.png new file mode 100644 index 00000000..95807a0b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@2x.png new file mode 100644 index 00000000..f578a47a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@3x.png new file mode 100644 index 00000000..619f9efd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@4x.png new file mode 100644 index 00000000..56ff799f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/direct-debit/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60.png new file mode 100644 index 00000000..ba7ebfc5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@2x.png new file mode 100644 index 00000000..2ca98930 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@3x.png new file mode 100644 index 00000000..50973e57 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@4x.png new file mode 100644 index 00000000..0ba1f67d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24.png new file mode 100644 index 00000000..83d3c6e4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@2x.png new file mode 100644 index 00000000..a8efac23 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@3x.png new file mode 100644 index 00000000..79571f69 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@4x.png new file mode 100644 index 00000000..6e9b9595 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32.png new file mode 100644 index 00000000..97234416 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@2x.png new file mode 100644 index 00000000..2212ecfb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@3x.png new file mode 100644 index 00000000..6e9b9595 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@4x.png new file mode 100644 index 00000000..3ea92934 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32.png new file mode 100644 index 00000000..5a90a374 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@2x.png new file mode 100644 index 00000000..4fc6214a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@3x.png new file mode 100644 index 00000000..5d5adf6c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@4x.png new file mode 100644 index 00000000..3a4121c3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48.png new file mode 100644 index 00000000..09c23d4f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@2x.png new file mode 100644 index 00000000..8e69fb58 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@3x.png new file mode 100644 index 00000000..a70a6271 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@4x.png new file mode 100644 index 00000000..3ef50faf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64.png new file mode 100644 index 00000000..2212ecfb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@2x.png new file mode 100644 index 00000000..3ea92934 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@3x.png new file mode 100644 index 00000000..1761b1f1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@4x.png new file mode 100644 index 00000000..08fa03ce Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/giropay/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60.png new file mode 100644 index 00000000..4417eb54 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@2x.png new file mode 100644 index 00000000..f98e76e6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@3x.png new file mode 100644 index 00000000..b7d5d962 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@4x.png new file mode 100644 index 00000000..4db633ae Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24.png new file mode 100644 index 00000000..4fccc20a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@2x.png new file mode 100644 index 00000000..78b87726 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@3x.png new file mode 100644 index 00000000..59d01b24 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@4x.png new file mode 100644 index 00000000..e6d2e028 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32.png new file mode 100644 index 00000000..9baaa6ca Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@2x.png new file mode 100644 index 00000000..1681b7fc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@3x.png new file mode 100644 index 00000000..6e53cce2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@4x.png new file mode 100644 index 00000000..972a71e8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32.png new file mode 100644 index 00000000..85bca81c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@2x.png new file mode 100644 index 00000000..a1df08f4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@3x.png new file mode 100644 index 00000000..638a184d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@4x.png new file mode 100644 index 00000000..2dd680ee Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48.png new file mode 100644 index 00000000..44997c54 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@2x.png new file mode 100644 index 00000000..700fe727 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@3x.png new file mode 100644 index 00000000..b3fa4449 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@4x.png new file mode 100644 index 00000000..1b950213 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64.png new file mode 100644 index 00000000..ba8ab375 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@2x.png new file mode 100644 index 00000000..06114c5e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@3x.png new file mode 100644 index 00000000..92bbc9dc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@4x.png new file mode 100644 index 00000000..b242dd61 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/gulden/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60.png new file mode 100644 index 00000000..fc955f38 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@2x.png new file mode 100644 index 00000000..1f10df4f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@3x.png new file mode 100644 index 00000000..cafa3f22 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@4x.png new file mode 100644 index 00000000..701acc00 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24.png new file mode 100644 index 00000000..f992d9bd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@2x.png new file mode 100644 index 00000000..71699479 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@3x.png new file mode 100644 index 00000000..1b79aefa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@4x.png new file mode 100644 index 00000000..378eeb34 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32.png new file mode 100644 index 00000000..ffa89870 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@2x.png new file mode 100644 index 00000000..74c12c3b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@3x.png new file mode 100644 index 00000000..378eeb34 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@4x.png new file mode 100644 index 00000000..d5ec168b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32.png new file mode 100644 index 00000000..a597d502 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@2x.png new file mode 100644 index 00000000..7123b7ab Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@3x.png new file mode 100644 index 00000000..c0a22112 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@4x.png new file mode 100644 index 00000000..10844583 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48.png new file mode 100644 index 00000000..043c5a6d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@2x.png new file mode 100644 index 00000000..ebfa2650 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@3x.png new file mode 100644 index 00000000..314d2d34 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@4x.png new file mode 100644 index 00000000..abbcb989 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64.png new file mode 100644 index 00000000..02c866ac Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@2x.png new file mode 100644 index 00000000..ca49039c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@3x.png new file mode 100644 index 00000000..c9676e10 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@4x.png new file mode 100644 index 00000000..d6981cba Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/handelsbanken/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/icon-16x16.png new file mode 100644 index 00000000..01e4f340 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/icon-24x24.png new file mode 100644 index 00000000..c3278b03 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/icon-32x32.png new file mode 100644 index 00000000..6b649b5c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/icon-50x50.png b/wp-content/plugins/pronamic-ideal/images/icon-50x50.png new file mode 100644 index 00000000..47f3ec05 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/icon-50x50.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal-logo-pay-off-2-lines.png b/wp-content/plugins/pronamic-ideal/images/ideal-logo-pay-off-2-lines.png new file mode 100644 index 00000000..8c5afd35 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal-logo-pay-off-2-lines.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-1-groot.gif b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-1-groot.gif new file mode 100644 index 00000000..3252c368 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-1-groot.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-1-klein.gif b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-1-klein.gif new file mode 100644 index 00000000..0a47cc0f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-1-klein.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-2-groot.gif b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-2-groot.gif new file mode 100644 index 00000000..8e1a329c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-2-groot.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-2-klein.gif b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-2-klein.gif new file mode 100644 index 00000000..acf2e7b6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-Payoff-2-klein.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-groot.gif b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-groot.gif new file mode 100644 index 00000000..416dd7f6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-groot.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-klein.gif b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-klein.gif new file mode 100644 index 00000000..d97a9e84 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal.nl/iDEAL-klein.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/ee-4-icon.png b/wp-content/plugins/pronamic-ideal/images/ideal/ee-4-icon.png new file mode 100644 index 00000000..25565277 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/ee-4-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60.png new file mode 100644 index 00000000..ed8e90bf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@2x.png new file mode 100644 index 00000000..a4554e6c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@3x.png new file mode 100644 index 00000000..b90c3727 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@4x.png new file mode 100644 index 00000000..47f18e28 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-16x16.png new file mode 100644 index 00000000..a7fdce16 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24.png new file mode 100644 index 00000000..065af8c5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@2x.png new file mode 100644 index 00000000..742ece15 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@3x.png new file mode 100644 index 00000000..6b0e94a5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@4x.png new file mode 100644 index 00000000..8bb1ee21 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32.png new file mode 100644 index 00000000..7acd781f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@2x.png new file mode 100644 index 00000000..a6edf197 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@3x.png new file mode 100644 index 00000000..8bb1ee21 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@4x.png new file mode 100644 index 00000000..4f092999 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32.png new file mode 100644 index 00000000..2f534758 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@2x.png new file mode 100644 index 00000000..01251e13 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@3x.png new file mode 100644 index 00000000..8d91000c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@4x.png new file mode 100644 index 00000000..45c1de95 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48.png new file mode 100644 index 00000000..dd494423 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@2x.png new file mode 100644 index 00000000..ef5896a3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@3x.png new file mode 100644 index 00000000..743c2d60 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@4x.png new file mode 100644 index 00000000..182e9d81 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64.png new file mode 100644 index 00000000..a6edf197 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@2x.png new file mode 100644 index 00000000..4f092999 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@3x.png new file mode 100644 index 00000000..a09fe544 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@4x.png new file mode 100644 index 00000000..02175e79 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ideal/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/ideal/wc-icon.png new file mode 100644 index 00000000..f8aba088 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ideal/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60.png new file mode 100644 index 00000000..8c0631f0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@2x.png new file mode 100644 index 00000000..28a15466 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@3x.png new file mode 100644 index 00000000..576a14f5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@4x.png new file mode 100644 index 00000000..12338ddc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24.png new file mode 100644 index 00000000..3aa64f82 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@2x.png new file mode 100644 index 00000000..cbaf32c6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@3x.png new file mode 100644 index 00000000..63e82614 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@4x.png new file mode 100644 index 00000000..db5237f5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32.png new file mode 100644 index 00000000..58efec0e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@2x.png new file mode 100644 index 00000000..d4f93a4b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@3x.png new file mode 100644 index 00000000..db5237f5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@4x.png new file mode 100644 index 00000000..36cb713c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32.png new file mode 100644 index 00000000..5afe3769 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@2x.png new file mode 100644 index 00000000..3bf74377 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@3x.png new file mode 100644 index 00000000..a871662d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@4x.png new file mode 100644 index 00000000..243bf458 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48.png new file mode 100644 index 00000000..e2e64292 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@2x.png new file mode 100644 index 00000000..3356e251 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@3x.png new file mode 100644 index 00000000..42042682 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@4x.png new file mode 100644 index 00000000..bd22ea82 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64.png new file mode 100644 index 00000000..d4f93a4b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@2x.png new file mode 100644 index 00000000..36cb713c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@3x.png new file mode 100644 index 00000000..92cfb31b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@4x.png new file mode 100644 index 00000000..e5d33249 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/idealqr/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60.png new file mode 100644 index 00000000..8802aa91 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@2x.png new file mode 100644 index 00000000..e5b50a93 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@3x.png new file mode 100644 index 00000000..8d5788e4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@4x.png new file mode 100644 index 00000000..020fb31b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24.png new file mode 100644 index 00000000..5ae7ac8a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@2x.png new file mode 100644 index 00000000..6d9e10a8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@3x.png new file mode 100644 index 00000000..5b1e7861 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@4x.png new file mode 100644 index 00000000..9f3b0094 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32.png new file mode 100644 index 00000000..8f8ede02 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@2x.png new file mode 100644 index 00000000..5cc5f431 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@3x.png new file mode 100644 index 00000000..9f3b0094 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@4x.png new file mode 100644 index 00000000..53c24efa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32.png new file mode 100644 index 00000000..92b70217 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@2x.png new file mode 100644 index 00000000..efa5bb5e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@3x.png new file mode 100644 index 00000000..26d9a831 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@4x.png new file mode 100644 index 00000000..256a1e1a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48.png new file mode 100644 index 00000000..f8290b63 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@2x.png new file mode 100644 index 00000000..db301279 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@3x.png new file mode 100644 index 00000000..ae9f3083 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@4x.png new file mode 100644 index 00000000..58b2027d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64.png new file mode 100644 index 00000000..5cc5f431 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@2x.png new file mode 100644 index 00000000..53c24efa Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@3x.png new file mode 100644 index 00000000..fc1fccde Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@4x.png new file mode 100644 index 00000000..3729104c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/ing-bank/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0021.png b/wp-content/plugins/pronamic-ideal/images/issuers/0021.png new file mode 100644 index 00000000..df1c8355 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0021.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0031.png b/wp-content/plugins/pronamic-ideal/images/issuers/0031.png new file mode 100644 index 00000000..2a0347b8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0031.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0091.png b/wp-content/plugins/pronamic-ideal/images/issuers/0091.png new file mode 100644 index 00000000..73c15305 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0091.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0161.png b/wp-content/plugins/pronamic-ideal/images/issuers/0161.png new file mode 100644 index 00000000..e6945673 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0161.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0511.gif b/wp-content/plugins/pronamic-ideal/images/issuers/0511.gif new file mode 100644 index 00000000..92bd434b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0511.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0721.png b/wp-content/plugins/pronamic-ideal/images/issuers/0721.png new file mode 100644 index 00000000..0fd2a8e5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0721.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0751.png b/wp-content/plugins/pronamic-ideal/images/issuers/0751.png new file mode 100644 index 00000000..d4bbaaab Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0751.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0761.png b/wp-content/plugins/pronamic-ideal/images/issuers/0761.png new file mode 100644 index 00000000..a43c41e2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0761.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/0771.png b/wp-content/plugins/pronamic-ideal/images/issuers/0771.png new file mode 100644 index 00000000..d4bbaaab Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/0771.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/abn_amro-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/abn_amro-125.png new file mode 100644 index 00000000..e764c576 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/abn_amro-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/abn_amro-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/abn_amro-64.png new file mode 100644 index 00000000..14a09e5b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/abn_amro-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/asn-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/asn-125.png new file mode 100644 index 00000000..6c306450 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/asn-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/asn-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/asn-64.png new file mode 100644 index 00000000..3fa56fec Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/asn-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/bunq-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/bunq-125.png new file mode 100644 index 00000000..9535e00c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/bunq-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/bunq-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/bunq-64.png new file mode 100644 index 00000000..4b91d694 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/bunq-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/ing-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/ing-125.png new file mode 100644 index 00000000..47fda897 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/ing-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/ing-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/ing-64.png new file mode 100644 index 00000000..1cc8f3f1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/ing-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/knab-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/knab-125.png new file mode 100644 index 00000000..59977776 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/knab-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/knab-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/knab-64.png new file mode 100644 index 00000000..c4cc6639 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/knab-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/moneyou-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/moneyou-125.png new file mode 100644 index 00000000..6ba72f04 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/moneyou-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/moneyou-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/moneyou-64.png new file mode 100644 index 00000000..4797bf2e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/moneyou-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/rabobank-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/rabobank-125.png new file mode 100644 index 00000000..62e49e4f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/rabobank-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/rabobank-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/rabobank-64.png new file mode 100644 index 00000000..fc5e14e1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/rabobank-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/regiobank-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/regiobank-125.png new file mode 100644 index 00000000..cf803954 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/regiobank-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/regiobank-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/regiobank-64.png new file mode 100644 index 00000000..13ffdcd5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/regiobank-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/sns-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/sns-125.png new file mode 100644 index 00000000..122b0b26 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/sns-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/sns-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/sns-64.png new file mode 100644 index 00000000..c36654d9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/sns-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/test-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/test-125.png new file mode 100644 index 00000000..283114b0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/test-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/test-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/test-64.png new file mode 100644 index 00000000..0f9d6ffd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/test-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/triodos-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/triodos-125.png new file mode 100644 index 00000000..15b94340 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/triodos-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/triodos-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/triodos-64.png new file mode 100644 index 00000000..a48fe1ef Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/triodos-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/van_lanschot-125.png b/wp-content/plugins/pronamic-ideal/images/issuers/van_lanschot-125.png new file mode 100644 index 00000000..6d199196 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/van_lanschot-125.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/issuers/van_lanschot-64.png b/wp-content/plugins/pronamic-ideal/images/issuers/van_lanschot-64.png new file mode 100644 index 00000000..7f3c6509 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/issuers/van_lanschot-64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60.png new file mode 100644 index 00000000..c2e47401 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@2x.png new file mode 100644 index 00000000..3b5ee6a3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@3x.png new file mode 100644 index 00000000..1703f9f9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@4x.png new file mode 100644 index 00000000..3179d099 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24.png new file mode 100644 index 00000000..55640133 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@2x.png new file mode 100644 index 00000000..493ed73d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@3x.png new file mode 100644 index 00000000..311e8569 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@4x.png new file mode 100644 index 00000000..c434315d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32.png new file mode 100644 index 00000000..14019073 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@2x.png new file mode 100644 index 00000000..5df41f9a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@3x.png new file mode 100644 index 00000000..c434315d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@4x.png new file mode 100644 index 00000000..97f8a95e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32.png new file mode 100644 index 00000000..e9b77839 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@2x.png new file mode 100644 index 00000000..4b3772ca Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@3x.png new file mode 100644 index 00000000..e0cc9e3f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@4x.png new file mode 100644 index 00000000..ba5f9781 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48.png new file mode 100644 index 00000000..27d305ed Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@2x.png new file mode 100644 index 00000000..01e8e34c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@3x.png new file mode 100644 index 00000000..eeb5aee8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@4x.png new file mode 100644 index 00000000..126b0435 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64.png new file mode 100644 index 00000000..5df41f9a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@2x.png new file mode 100644 index 00000000..97f8a95e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@3x.png new file mode 100644 index 00000000..7841ab8a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@4x.png new file mode 100644 index 00000000..06df33a5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/kbc/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60.png new file mode 100644 index 00000000..022c2b68 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@2x.png new file mode 100644 index 00000000..dcc0566a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@3x.png new file mode 100644 index 00000000..7a02c654 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@4x.png new file mode 100644 index 00000000..58d94650 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24.png new file mode 100644 index 00000000..2fb08d98 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@2x.png new file mode 100644 index 00000000..f3ee17af Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@3x.png new file mode 100644 index 00000000..70a75c3a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@4x.png new file mode 100644 index 00000000..8df7d35c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32.png new file mode 100644 index 00000000..2527d5c5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@2x.png new file mode 100644 index 00000000..23bd81bf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@3x.png new file mode 100644 index 00000000..8df7d35c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@4x.png new file mode 100644 index 00000000..b49b0047 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32.png new file mode 100644 index 00000000..591da1fc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@2x.png new file mode 100644 index 00000000..213c8bb1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@3x.png new file mode 100644 index 00000000..c9bfccf0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@4x.png new file mode 100644 index 00000000..c07743a0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48.png new file mode 100644 index 00000000..47a8e878 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@2x.png new file mode 100644 index 00000000..d09c5f96 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@3x.png new file mode 100644 index 00000000..d6cc5970 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@4x.png new file mode 100644 index 00000000..20dee6cf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64.png new file mode 100644 index 00000000..23bd81bf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@2x.png new file mode 100644 index 00000000..b49b0047 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@3x.png new file mode 100644 index 00000000..2fbf0ee0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@4x.png new file mode 100644 index 00000000..be7f562b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/knab/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/loading.gif b/wp-content/plugins/pronamic-ideal/images/loading.gif new file mode 100644 index 00000000..e2ceb886 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/loading.gif differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60.png new file mode 100644 index 00000000..d3eb0192 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@2x.png new file mode 100644 index 00000000..f83f61dd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@3x.png new file mode 100644 index 00000000..7cd5e526 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@4x.png new file mode 100644 index 00000000..14e97667 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24.png new file mode 100644 index 00000000..6c0a3248 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@2x.png new file mode 100644 index 00000000..0c895568 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@3x.png new file mode 100644 index 00000000..27629c44 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@4x.png new file mode 100644 index 00000000..140533b1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32.png new file mode 100644 index 00000000..00c0cc33 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@2x.png new file mode 100644 index 00000000..8d96432a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@3x.png new file mode 100644 index 00000000..140533b1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@4x.png new file mode 100644 index 00000000..3da5b5cf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32.png new file mode 100644 index 00000000..a4162ee9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@2x.png new file mode 100644 index 00000000..36bc8b5b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@3x.png new file mode 100644 index 00000000..5a375fb7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@4x.png new file mode 100644 index 00000000..09971166 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48.png new file mode 100644 index 00000000..db9bf1d2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@2x.png new file mode 100644 index 00000000..23027455 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@3x.png new file mode 100644 index 00000000..5f96cde2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@4x.png new file mode 100644 index 00000000..e6430df7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64.png new file mode 100644 index 00000000..8d96432a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@2x.png new file mode 100644 index 00000000..3da5b5cf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@3x.png new file mode 100644 index 00000000..cfe7aa93 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@4x.png new file mode 100644 index 00000000..fcfb9270 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/maestro/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/minitix/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/minitix/icon-24x24.png new file mode 100644 index 00000000..58c29608 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/minitix/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/minitix/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/minitix/wc-icon.png new file mode 100644 index 00000000..988b5a9a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/minitix/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-16x16.png new file mode 100644 index 00000000..98054531 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-24x24.png new file mode 100644 index 00000000..132f2a4b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-32x32.png new file mode 100644 index 00000000..5e77c41b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-64x48.png new file mode 100644 index 00000000..b257c473 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mister-cash/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mister-cash/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/mister-cash/wc-icon.png new file mode 100644 index 00000000..1254c8d3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mister-cash/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mollie/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/mollie/icon-16x16.png new file mode 100644 index 00000000..7403ab93 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mollie/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/mollie/mollie-logo-style-x-small.png b/wp-content/plugins/pronamic-ideal/images/mollie/mollie-logo-style-x-small.png new file mode 100644 index 00000000..c491863a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/mollie/mollie-logo-style-x-small.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60.png new file mode 100644 index 00000000..30881c83 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@2x.png new file mode 100644 index 00000000..210691d0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@3x.png new file mode 100644 index 00000000..25a233ba Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@4x.png new file mode 100644 index 00000000..9a33336f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24.png new file mode 100644 index 00000000..606bb46f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@2x.png new file mode 100644 index 00000000..e9d7b359 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@3x.png new file mode 100644 index 00000000..c4e7e488 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@4x.png new file mode 100644 index 00000000..a3cf7cd7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32.png new file mode 100644 index 00000000..7d8c3998 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@2x.png new file mode 100644 index 00000000..39d5adf8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@3x.png new file mode 100644 index 00000000..10d21f32 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@4x.png new file mode 100644 index 00000000..3e86d4a1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32.png new file mode 100644 index 00000000..29431478 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@2x.png new file mode 100644 index 00000000..aa415fef Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@3x.png new file mode 100644 index 00000000..a29ab816 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@4x.png new file mode 100644 index 00000000..988a4279 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48.png new file mode 100644 index 00000000..8a545856 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@2x.png new file mode 100644 index 00000000..74546a52 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@3x.png new file mode 100644 index 00000000..738ac268 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@4x.png new file mode 100644 index 00000000..e053285e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64.png new file mode 100644 index 00000000..39d5adf8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@2x.png new file mode 100644 index 00000000..a0e4b4da Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@3x.png new file mode 100644 index 00000000..c6e5ef25 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@4x.png new file mode 100644 index 00000000..c7eac567 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/moneyou/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-16x16.png new file mode 100644 index 00000000..e925afe2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-24x24.png new file mode 100644 index 00000000..7fd54699 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-32x32.png new file mode 100644 index 00000000..a38ff5d0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/omnikassa/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60.png new file mode 100644 index 00000000..77425e68 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@2x.png new file mode 100644 index 00000000..a815b1de Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@3x.png new file mode 100644 index 00000000..f86c4ad7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@4x.png new file mode 100644 index 00000000..17617f81 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24.png new file mode 100644 index 00000000..94d3909b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@2x.png new file mode 100644 index 00000000..abe7bc3f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@3x.png new file mode 100644 index 00000000..a7a93e61 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@4x.png new file mode 100644 index 00000000..47069ba0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32.png new file mode 100644 index 00000000..5aeda7b1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@2x.png new file mode 100644 index 00000000..51b218af Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@3x.png new file mode 100644 index 00000000..7b883bd6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@4x.png new file mode 100644 index 00000000..99de35e0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32.png new file mode 100644 index 00000000..f9b5d53e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@2x.png new file mode 100644 index 00000000..bee5522e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@3x.png new file mode 100644 index 00000000..02c20645 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@4x.png new file mode 100644 index 00000000..09cb2f42 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48.png new file mode 100644 index 00000000..b7a7dec0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@2x.png new file mode 100644 index 00000000..48ab1498 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@3x.png new file mode 100644 index 00000000..d4211602 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@4x.png new file mode 100644 index 00000000..b6877b2e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64.png new file mode 100644 index 00000000..51b218af Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@2x.png new file mode 100644 index 00000000..99de35e0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@3x.png new file mode 100644 index 00000000..46aa6779 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@4x.png new file mode 100644 index 00000000..00832e37 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/payconiq/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60.png new file mode 100644 index 00000000..c7b45ad9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@2x.png new file mode 100644 index 00000000..2e90efae Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@3x.png new file mode 100644 index 00000000..00de616c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@4x.png new file mode 100644 index 00000000..2242cac6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-16x16.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-16x16.png new file mode 100644 index 00000000..fc74e4f5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-16x16.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24.png new file mode 100644 index 00000000..9d507247 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@2x.png new file mode 100644 index 00000000..04367280 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@3x.png new file mode 100644 index 00000000..49c1ae08 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@4x.png new file mode 100644 index 00000000..aa0244c3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32.png new file mode 100644 index 00000000..1b82d7a2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@2x.png new file mode 100644 index 00000000..2540b3f1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@3x.png new file mode 100644 index 00000000..aa0244c3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@4x.png new file mode 100644 index 00000000..9a453e30 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32.png new file mode 100644 index 00000000..42fbf2b0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@2x.png new file mode 100644 index 00000000..9ddee67c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@3x.png new file mode 100644 index 00000000..740f574d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@4x.png new file mode 100644 index 00000000..d39c500b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48.png new file mode 100644 index 00000000..936adbb8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@2x.png new file mode 100644 index 00000000..ea7ef0e7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@3x.png new file mode 100644 index 00000000..37dac782 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@4x.png new file mode 100644 index 00000000..e2871945 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64.png new file mode 100644 index 00000000..9e4fc4db Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@2x.png new file mode 100644 index 00000000..94790286 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@3x.png new file mode 100644 index 00000000..a9db9681 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@4x.png new file mode 100644 index 00000000..6bb020f2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/paypal/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/paypal/wc-icon.png new file mode 100644 index 00000000..8f49ee86 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/paypal/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/pronamic-logo-white.png b/wp-content/plugins/pronamic-ideal/images/pronamic-logo-white.png new file mode 100644 index 00000000..e1656b45 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/pronamic-logo-white.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/pronamic-logo-white.svg b/wp-content/plugins/pronamic-ideal/images/pronamic-logo-white.svg new file mode 100644 index 00000000..fb6c7501 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/images/pronamic-logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60.png new file mode 100644 index 00000000..a0d6ac26 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@2x.png new file mode 100644 index 00000000..a7651793 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@3x.png new file mode 100644 index 00000000..3782382c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@4x.png new file mode 100644 index 00000000..f9d29469 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24.png new file mode 100644 index 00000000..b043b2a7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@2x.png new file mode 100644 index 00000000..f7c1409b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@3x.png new file mode 100644 index 00000000..4aaee475 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@4x.png new file mode 100644 index 00000000..baef3f73 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32.png new file mode 100644 index 00000000..18fb93f4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@2x.png new file mode 100644 index 00000000..c0e51bbc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@3x.png new file mode 100644 index 00000000..0cc0ff1c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@4x.png new file mode 100644 index 00000000..93e2d6c9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32.png new file mode 100644 index 00000000..5bd0e740 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@2x.png new file mode 100644 index 00000000..ad010fb6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@3x.png new file mode 100644 index 00000000..f8a83594 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@4x.png new file mode 100644 index 00000000..6a23f443 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48.png new file mode 100644 index 00000000..f813f014 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@2x.png new file mode 100644 index 00000000..256540f9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@3x.png new file mode 100644 index 00000000..97b403ba Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@4x.png new file mode 100644 index 00000000..eeb0dc0c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64.png new file mode 100644 index 00000000..9fc6a110 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@2x.png new file mode 100644 index 00000000..6e796d11 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@3x.png new file mode 100644 index 00000000..ac9f03de Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@4x.png new file mode 100644 index 00000000..263a720b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/rabobank/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60.png new file mode 100644 index 00000000..512d9694 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@2x.png new file mode 100644 index 00000000..e6dac06a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@3x.png new file mode 100644 index 00000000..c05098a2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@4x.png new file mode 100644 index 00000000..5136d40c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24.png new file mode 100644 index 00000000..f3db16cf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@2x.png new file mode 100644 index 00000000..271385e8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@3x.png new file mode 100644 index 00000000..54432d9b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@4x.png new file mode 100644 index 00000000..56a5d5d0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32.png new file mode 100644 index 00000000..a812d083 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@2x.png new file mode 100644 index 00000000..f52ccbdd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@3x.png new file mode 100644 index 00000000..56a5d5d0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@4x.png new file mode 100644 index 00000000..aa87d275 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32.png new file mode 100644 index 00000000..a3fd22af Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@2x.png new file mode 100644 index 00000000..b6a1bb67 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@3x.png new file mode 100644 index 00000000..f4229d58 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@4x.png new file mode 100644 index 00000000..8d4d7d62 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48.png new file mode 100644 index 00000000..c3a73c45 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@2x.png new file mode 100644 index 00000000..88875f43 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@3x.png new file mode 100644 index 00000000..ef86e2c6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@4x.png new file mode 100644 index 00000000..147fd9a7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64.png new file mode 100644 index 00000000..f52ccbdd Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@2x.png new file mode 100644 index 00000000..aa87d275 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@3x.png new file mode 100644 index 00000000..fb46fd94 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@4x.png new file mode 100644 index 00000000..ca6a3cd9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/regiobank/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sepa-bancontact/wc-sepa-bancontact.png b/wp-content/plugins/pronamic-ideal/images/sepa-bancontact/wc-sepa-bancontact.png new file mode 100644 index 00000000..808ea7be Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sepa-bancontact/wc-sepa-bancontact.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sepa-ideal/wc-sepa-ideal.png b/wp-content/plugins/pronamic-ideal/images/sepa-ideal/wc-sepa-ideal.png new file mode 100644 index 00000000..02c68ed6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sepa-ideal/wc-sepa-ideal.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sepa-sofort/wc-sepa-sofort.png b/wp-content/plugins/pronamic-ideal/images/sepa-sofort/wc-sepa-sofort.png new file mode 100644 index 00000000..f090bf32 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sepa-sofort/wc-sepa-sofort.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60.png new file mode 100644 index 00000000..3b34b935 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@2x.png new file mode 100644 index 00000000..c6738931 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@3x.png new file mode 100644 index 00000000..5b883ef9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@4x.png new file mode 100644 index 00000000..af0206f5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24.png new file mode 100644 index 00000000..446f0f01 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@2x.png new file mode 100644 index 00000000..247fbfa5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@3x.png new file mode 100644 index 00000000..90ea1f08 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@4x.png new file mode 100644 index 00000000..eb6d114f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32.png new file mode 100644 index 00000000..7bffd3ce Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@2x.png new file mode 100644 index 00000000..8c90dd1c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@3x.png new file mode 100644 index 00000000..9b4e84f8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@4x.png new file mode 100644 index 00000000..fdd9d08a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32.png new file mode 100644 index 00000000..4d478526 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@2x.png new file mode 100644 index 00000000..1d30afbe Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@3x.png new file mode 100644 index 00000000..50f619fb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@4x.png new file mode 100644 index 00000000..b286abc9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48.png new file mode 100644 index 00000000..8d8be2b5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@2x.png new file mode 100644 index 00000000..5b28b870 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@3x.png new file mode 100644 index 00000000..3b5e29be Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@4x.png new file mode 100644 index 00000000..6e4d9679 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64.png new file mode 100644 index 00000000..c79950d4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@2x.png new file mode 100644 index 00000000..01b2d5ef Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@3x.png new file mode 100644 index 00000000..0c07ef94 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@4x.png new file mode 100644 index 00000000..e2169036 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sns-bank/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60.png new file mode 100644 index 00000000..1bcf7e9a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@2x.png new file mode 100644 index 00000000..3de66ffc Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@3x.png new file mode 100644 index 00000000..b1613f41 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@4x.png new file mode 100644 index 00000000..16c92490 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24.png new file mode 100644 index 00000000..707af9ee Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@2x.png new file mode 100644 index 00000000..76e9ff2c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@3x.png new file mode 100644 index 00000000..51854759 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@4x.png new file mode 100644 index 00000000..3a836b11 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32.png new file mode 100644 index 00000000..7d1bd8d3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@2x.png new file mode 100644 index 00000000..a423e82d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@3x.png new file mode 100644 index 00000000..3a836b11 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@4x.png new file mode 100644 index 00000000..01c315e8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32.png new file mode 100644 index 00000000..b9fa1b9a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@2x.png new file mode 100644 index 00000000..fd69c976 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@3x.png new file mode 100644 index 00000000..7c156a98 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@4x.png new file mode 100644 index 00000000..533d0d4b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48.png new file mode 100644 index 00000000..97b112b6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@2x.png new file mode 100644 index 00000000..65b1064a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@3x.png new file mode 100644 index 00000000..7445b7b0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@4x.png new file mode 100644 index 00000000..df541bdb Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64.png new file mode 100644 index 00000000..a423e82d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@2x.png new file mode 100644 index 00000000..01c315e8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@3x.png new file mode 100644 index 00000000..be158e99 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@4x.png new file mode 100644 index 00000000..c661c5d5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/sofort/wc-icon.png b/wp-content/plugins/pronamic-ideal/images/sofort/wc-icon.png new file mode 100644 index 00000000..f252f173 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/sofort/wc-icon.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60.png new file mode 100644 index 00000000..d8707eac Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@2x.png new file mode 100644 index 00000000..987e04f0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@3x.png new file mode 100644 index 00000000..12f9f6f4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@4x.png new file mode 100644 index 00000000..d351a525 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24.png new file mode 100644 index 00000000..042cd54b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@2x.png new file mode 100644 index 00000000..0d136e61 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@3x.png new file mode 100644 index 00000000..07d5e09a Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@4x.png new file mode 100644 index 00000000..33ffaeb9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32.png new file mode 100644 index 00000000..4e3945de Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@2x.png new file mode 100644 index 00000000..772697f4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@3x.png new file mode 100644 index 00000000..33ffaeb9 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@4x.png new file mode 100644 index 00000000..37f91dc7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32.png new file mode 100644 index 00000000..fc57a779 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@2x.png new file mode 100644 index 00000000..d73fba66 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@3x.png new file mode 100644 index 00000000..9706bc2f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@4x.png new file mode 100644 index 00000000..ae816203 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48.png new file mode 100644 index 00000000..e141d6d6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@2x.png new file mode 100644 index 00000000..1774ff7e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@3x.png new file mode 100644 index 00000000..c4c95cef Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@4x.png new file mode 100644 index 00000000..2c7e946b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64.png new file mode 100644 index 00000000..772697f4 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@2x.png new file mode 100644 index 00000000..37f91dc7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@3x.png new file mode 100644 index 00000000..fe1c0f25 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@4x.png new file mode 100644 index 00000000..09dcb952 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/triodos-bank/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60.png new file mode 100644 index 00000000..774fdf21 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@2x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@2x.png new file mode 100644 index 00000000..389a53f8 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@3x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@3x.png new file mode 100644 index 00000000..6b908093 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@4x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@4x.png new file mode 100644 index 00000000..4d21d588 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-125x60@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24.png new file mode 100644 index 00000000..e640830b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@2x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@2x.png new file mode 100644 index 00000000..101564b1 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@3x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@3x.png new file mode 100644 index 00000000..7c9e0606 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@4x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@4x.png new file mode 100644 index 00000000..0208a098 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-24x24@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32.png new file mode 100644 index 00000000..957720a5 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@2x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@2x.png new file mode 100644 index 00000000..78ab84b0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@3x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@3x.png new file mode 100644 index 00000000..0208a098 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@4x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@4x.png new file mode 100644 index 00000000..33e816b6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-32x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32.png new file mode 100644 index 00000000..7efc866b Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@2x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@2x.png new file mode 100644 index 00000000..2eeebe4c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@3x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@3x.png new file mode 100644 index 00000000..73c56657 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@4x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@4x.png new file mode 100644 index 00000000..b63d16bf Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-51x32@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48.png new file mode 100644 index 00000000..0e2678ed Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@2x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@2x.png new file mode 100644 index 00000000..2a73995f Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@3x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@3x.png new file mode 100644 index 00000000..bb4e98fe Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@4x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@4x.png new file mode 100644 index 00000000..a67397a0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x48@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64.png new file mode 100644 index 00000000..78ab84b0 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@2x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@2x.png new file mode 100644 index 00000000..33e816b6 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@2x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@3x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@3x.png new file mode 100644 index 00000000..287de276 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@3x.png differ diff --git a/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@4x.png b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@4x.png new file mode 100644 index 00000000..287ca496 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/images/van-lanschot/icon-64x64@4x.png differ diff --git a/wp-content/plugins/pronamic-ideal/includes/updates/update-2.0.0.php b/wp-content/plugins/pronamic-ideal/includes/updates/update-2.0.0.php new file mode 100644 index 00000000..fdc55ca3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/includes/updates/update-2.0.0.php @@ -0,0 +1,541 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Execute changes made in Pronamic Pay 2.0.0 + * + * @link https://github.com/WordPress/WordPress/blob/3.5.1/wp-admin/includes/upgrade.php#L413 + * @since 2.0.0 + */ + +// Check if there is not already an upgrade running +if ( get_transient( 'pronamic_pay_upgrade_200' ) ) { + return; +} + +set_transient( 'pronamic_pay_upgrade_200', true, 3600 ); // 60 minutes + +// Upgrade +global $wpdb; + +require_once ABSPATH . '/wp-admin/includes/upgrade.php'; + +$charset_collate = ''; +if ( ! empty( $wpdb->charset ) ) { + $charset_collate = 'DEFAULT CHARACTER SET ' . $wpdb->charset; +} +if ( ! empty( $wpdb->collate ) ) { + $charset_collate .= ' COLLATE ' . $wpdb->collate; +} + +/* + +-- You can undo the database upgrade by executing the following queries + +UPDATE wp_pronamic_ideal_configurations SET post_id = null; +DELETE FROM wp_posts WHERE post_type = 'pronamic_gateway'; + +UPDATE wp_pronamic_ideal_payments SET post_id = null; +DELETE FROM wp_posts WHERE post_type = 'pronamic_payment'; + +UPDATE wp_rg_ideal_feeds SET post_id = null; +DELETE FROM wp_posts WHERE post_type = 'pronamic_pay_gf'; + +UPDATE wp_options SET option_value = 0 WHERE option_name = 'pronamic_pay_db_version'; + +DELETE FROM wp_postmeta WHERE post_id NOT IN ( SELECT ID FROM wp_posts ); + +*/ + +/** + * Configs + */ + +global $pronamic_ideal; + +$config_table = $wpdb->prefix . 'pronamic_ideal_configurations'; + +$sql = "CREATE TABLE $config_table ( + id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT, + post_id BIGINT(20) UNSIGNED NULL, + variant_id VARCHAR(64) NULL, + merchant_id VARCHAR(64) NULL, + sub_id VARCHAR(64) NULL, + mode VARCHAR(64) NULL, + hash_key VARCHAR(64) NULL, + private_key TEXT NULL, + private_key_password VARCHAR(64) NULL, + private_certificate TEXT NULL, + meta LONGTEXT, + PRIMARY KEY (id) +) $charset_collate;"; + +dbDelta( $sql ); + +// Query +$query = " + SELECT + * + FROM + $config_table + WHERE + post_id IS NULL + LIMIT + 1 + ; +"; + +$have_configs = true; + +while ( $have_configs ) { + $configs = $wpdb->get_results( $query ); // WPCS: unprepared SQL ok. + + $have_configs = ! empty( $configs ); + + foreach ( $configs as $config ) { + /* translators: %d: configuration ID */ + $title = sprintf( __( 'Configuration %d', 'pronamic_ideal' ), $config->id ); + + // Post + $post = array( + 'post_title' => $title, + 'post_type' => 'pronamic_gateway', + 'post_status' => 'publish', + ); + + $post_id = wp_insert_post( $post ); + + if ( $post_id ) { + $wpdb->update( + $config_table, + array( + 'post_id' => $post_id, + ), + array( + 'id' => $config->id, + ), + '%d', + '%d' + ); + + // Meta + // We ignore (@) all notice of not existing properties + $config_meta = json_decode( $config->meta ); + + $meta = array(); + + $meta['legacy_id'] = $config->id; + $meta['id'] = $config->variant_id; + $meta['mode'] = $config->mode; + + // iDEAL + $meta['ideal_merchant_id'] = $config->merchant_id; + $meta['ideal_sub_id'] = $config->sub_id; + + // iDEAL Basic + $meta['ideal_hash_key'] = $config->hash_key; + + // iDEAL Advanced + $meta['ideal_private_key'] = $config->private_key; + $meta['ideal_private_key_password'] = $config->private_key_password; + $meta['ideal_private_certificate'] = $config->private_certificate; + + // OmniKassa + if ( 'rabobank-omnikassa' === $config->variant_id ) { + $meta['omnikassa_merchant_id'] = $config->merchant_id; + $meta['omnikassa_secret_key'] = $config->hash_key; + + $key_version = @$config_meta->keyVersion; + // In Pronamic iDEAL v1.0 we stored the key version in the iDEAL sub ID + $key_version = empty( $key_version ) ? $config->sub_id : $key_version; + + $meta['omnikassa_key_version'] = $key_version; + + unset( $meta['ideal_merchant_id'] ); + unset( $meta['ideal_hash_key'] ); + } + + // Buckaroo + $meta['buckaroo_website_key'] = @$config_meta->buckarooWebsiteKey; + $meta['buckaroo_secret_key'] = @$config_meta->buckarooSecretKey; + + // Icepay + $meta['icepay_merchant_id'] = @$config_meta->icepayMerchantId; + $meta['icepay_secret_code'] = @$config_meta->icepaySecretCode; + + // Mollie + $meta['mollie_partner_id'] = @$config_meta->molliePartnerId; + $meta['mollie_profile_key'] = @$config_meta->mollieProfileKey; + + // Sisow + $meta['sisow_merchant_id'] = @$config_meta->sisowMerchantId; + $meta['sisow_merchant_key'] = @$config_meta->sisowMerchantKey; + + // TargetPay + $meta['targetpay_layout_code'] = @$config_meta->targetPayLayoutCode; + + // Qantani + $meta['qantani_merchant_id'] = @$config_meta->qantani_merchant_id; + $meta['qantani_merchant_key'] = @$config_meta->qantani_merchant_key; + $meta['qantani_merchant_secret'] = @$config_meta->qantani_merchant_secret; + + // Ogone + $meta['ogone_psp_id'] = @$config_meta->pspId; + $meta['ogone_sha_in_pass_phrase'] = @$config_meta->shaInPassPhrase; + $meta['ogone_sha_out_pass_phrase'] = @$config_meta->shaOutPassPhrase; + $meta['ogone_user_id'] = @$config_meta->ogone_user_id; + $meta['ogone_password'] = @$config_meta->ogone_password; + + // Other + $meta['country'] = @$config_meta->country; + $meta['state_or_province'] = @$config_meta->stateOrProvince; + $meta['locality'] = @$config_meta->locality; + $meta['organization'] = @$config_meta->organization; + $meta['organization_unit'] = @$config_meta->organizationUnit; + $meta['common_name'] = @$config_meta->commonName; + $meta['email'] = @$config_meta->eMailAddress; + + foreach ( $meta as $key => $value ) { + if ( ! empty( $value ) ) { + $meta_key = '_pronamic_gateway_' . $key; + + update_post_meta( $post_id, $meta_key, $value ); + } + } + } + } +} + +/** + * Config IDs map + */ +$query = " + SELECT + id, + post_id + FROM + $config_table + ; +"; + +$config_ids_map = array(); + +$config_ids = $wpdb->get_results( $query ); // WPCS: unprepared SQL ok. + +foreach ( $config_ids as $config_id ) { + $config_ids_map[ $config_id->id ] = $config_id->post_id; +} + +/** + * Gravity Forms payment feeds + */ +$feeds_table = $wpdb->prefix . 'rg_ideal_feeds'; + +$sql = "CREATE TABLE $feeds_table ( + id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT, + post_id BIGINT(20) UNSIGNED NULL, + form_id MEDIUMINT(8) UNSIGNED NOT NULL, + configuration_id MEDIUMINT(8) UNSIGNED NOT NULL, + is_active TINYINT(1) NOT NULL DEFAULT 1, + meta LONGTEXT, + PRIMARY KEY (id), + KEY form_id (form_id), + KEY configuration_id (configuration_id) +) $charset_collate;"; + +dbDelta( $sql ); + +// Query +$query = " + SELECT + * + FROM + $feeds_table + WHERE + post_id IS NULL + LIMIT + 1 + ; +"; + +$have_feeds = true; + +while ( $have_feeds ) { + $feeds = $wpdb->get_results( $query ); // WPCS: unprepared SQL ok. + + $have_feeds = ! empty( $feeds ); + + foreach ( $feeds as $feed ) { + // Post + $post = array( + 'post_title' => sprintf( + /* translators: %d: payment feed ID */ + __( 'Payment Form %d', 'pronamic_ideal' ), + $feed->id + ), + 'post_type' => 'pronamic_pay_gf', + 'post_status' => 'publish', + ); + + $post_id = wp_insert_post( $post ); + + if ( $post_id ) { + $wpdb->update( + $feeds_table, + array( + 'post_id' => $post_id, + ), + array( + 'id' => $feed->id, + ), + '%d', + '%d' + ); + + // Meta + // We ignore (@) all notice of not existing properties + $meta = array(); + + $feed_meta = json_decode( $feed->meta, true ); + + $meta['form_id'] = $feed->form_id; + $meta['config_id'] = @$config_ids_map[ $feed->configuration_id ]; + $meta['is_active'] = $feed->is_active; + $meta['transaction_description'] = @$feed_meta['transactionDescription']; + $meta['delay_notification_ids'] = @$feed_meta['delayNotificationIds']; + $meta['delay_admin_notification'] = @$feed_meta['delayAdminNotification']; + $meta['delay_user_notification'] = @$feed_meta['delayUserNotification']; + $meta['delay_post_creation'] = @$feed_meta['delayPostCreation']; + $meta['condition_enabled'] = @$feed_meta['conditionEnabled']; + $meta['condition_field_id'] = @$feed_meta['conditionFieldId']; + $meta['condition_operator'] = @$feed_meta['conditionOperator']; + $meta['condition_value'] = @$feed_meta['conditionValue']; + $meta['user_role_field_id'] = @$feed_meta['userRoleFieldId']; + $meta['fields'] = @$feed_meta['fields']; + $meta['links'] = @$feed_meta['links']; + + if ( is_array( $meta['links'] ) ) { + foreach ( $meta['links'] as &$link ) { + if ( isset( $link['pageId'] ) ) { + $link['page_id'] = $link['pageId']; + } + } + } + + foreach ( $meta as $key => $value ) { + if ( ! empty( $value ) ) { + $meta_key = '_pronamic_pay_gf_' . $key; + + update_post_meta( $post_id, $meta_key, $value ); + } + } + } + } +} + +/** + * Payments. + */ +$payments_table = $wpdb->prefix . 'pronamic_ideal_payments'; + +$sql = "CREATE TABLE $payments_table ( + id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT, + post_id BIGINT(20) UNSIGNED NULL, + configuration_id MEDIUMINT(8) UNSIGNED NOT NULL, + purchase_id VARCHAR(16) NULL, + transaction_id VARCHAR(32) NULL, + date_gmt DATETIME NOT NULL, + amount DECIMAL(10, 2) NOT NULL, + currency VARCHAR(8) NOT NULL, + expiration_period VARCHAR(8) NOT NULL, + language VARCHAR(8) NOT NULL, + entrance_code VARCHAR(40) NULL, + description TEXT NOT NULL, + consumer_name VARCHAR(35) NULL, + consumer_account_number VARCHAR(10) NULL, + consumer_iban VARCHAR(34) NULL, + consumer_bic VARCHAR(11) NULL, + consumer_city VARCHAR(24) NULL, + status VARCHAR(32) NULL DEFAULT NULL, + status_requests MEDIUMINT(8) DEFAULT 0, + source VARCHAR(32) NULL DEFAULT NULL, + source_id VARCHAR(32) NULL DEFAULT NULL, + email VARCHAR(128) NULL DEFAULT NULL, + PRIMARY KEY (id) +) $charset_collate;"; + +dbDelta( $sql ); + +// We convert the payments in groups of 100 so not everything will load in memory at once. +$query = " + SELECT + * + FROM + $payments_table + WHERE + post_id IS NULL + LIMIT + 1 + ; +"; + +$have_payments = true; + +while ( $have_payments ) { + $payments = $wpdb->get_results( $query ); // WPCS: unprepared SQL ok. + + $have_payments = ! empty( $payments ); + + foreach ( $payments as $payment ) { + // Post + $post = array( + 'post_title' => sprintf( + /* translators: %d: payment ID */ + __( 'Payment %d', 'pronamic_ideal' ), + $payment->id + ), + 'post_date' => get_date_from_gmt( $payment->date_gmt ), + 'post_date_gmt' => $payment->date_gmt, + 'post_type' => 'pronamic_payment', + 'post_status' => 'publish', + ); + + $post_id = wp_insert_post( $post ); + + if ( $post_id ) { + $wpdb->update( + $payments_table, + array( + 'post_id' => $post_id, + ), + array( + 'id' => $payment->id, + ), + '%d', + '%d' + ); + + // Meta + $meta = array( + 'config_id' => @$config_ids_map[ $payment->configuration_id ], + 'purchase_id' => $payment->purchase_id, + 'transaction_id' => $payment->transaction_id, + 'currency' => $payment->currency, + 'amount' => $payment->amount, + 'expiration_period' => $payment->expiration_period, + 'language' => $payment->language, + 'entrance_code' => $payment->entrance_code, + 'description' => $payment->description, + 'consumer_name' => $payment->consumer_name, + 'consumer_account_number' => $payment->consumer_account_number, + 'consumer_iban' => $payment->consumer_iban, + 'consumer_bic' => $payment->consumer_bic, + 'consumer_city' => $payment->consumer_city, + 'status' => $payment->status, + 'source' => $payment->source, + 'source_id' => $payment->source_id, + 'email' => $payment->email, + ); + + foreach ( $meta as $key => $value ) { + if ( ! empty( $value ) ) { + $meta_key = '_pronamic_payment_' . $key; + + update_post_meta( $post_id, $meta_key, $value ); + } + } + } + } +} + +////////////////////////////////////////////////// +// Options config IDs +////////////////////////////////////////////////// + +$options = array( + // EventEspresso + // @link https://github.com/pronamic/wp-pronamic-ideal/blob/1.3.4/classes/Pronamic/EventEspresso/IDeal/AddOn.php#L72 + 'pronamic_ideal_event_espresso_configuration_id' => 'pronamic_pay_ideal_event_espreso_config_id', + // Jigoshop + // @link https://github.com/pronamic/wp-pronamic-ideal/blob/1.3.4/classes/Pronamic/Jigoshop/IDeal/IDealGateway.php#L62 + 'jigoshop_pronamic_ideal_enabled' => 'pronamic_pay_ideal_jigoshop_enabled', + 'jigoshop_pronamic_ideal_title' => 'pronamic_pay_ideal_jigoshop_title', + 'jigoshop_pronamic_ideal_description' => 'pronamic_pay_ideal_jigoshop_description', + 'jigoshop_pronamic_ideal_configuration_id' => 'pronamic_pay_ideal_jigoshop_config_id', + // Membership + 'pronamic_ideal_membership_chosen_configuration' => 'pronamic_pay_ideal_membership_config_id', + // s2Member + // @link https://github.com/pronamic/wp-pronamic-ideal/blob/1.3.4/classes/Pronamic/S2Member/Bridge/Settings.php#L52 + 'pronamic_ideal_s2member_chosen_configuration' => 'pronamic_pay_ideal_s2member_config_id', + // WP e-Commerce + // @link https://github.com/pronamic/wp-pronamic-ideal/blob/1.3.4/classes/Pronamic/WPeCommerce/IDeal/IDealMerchant.php#L35 + 'pronamic_ideal_wpsc_configuration_id' => 'pronamic_pay_ideal_wpsc_config_id', +); + +foreach ( $options as $key_old => $key_new ) { + $value = get_option( $key_old ); + + if ( ! empty( $value ) ) { + $value_new = @$config_ids_map[ $value ]; + + update_option( $key_new, $value_new ); + } +} + +////////////////////////////////////////////////// +// Complex options config IDs +////////////////////////////////////////////////// + +// Shopp +// @link https://github.com/pronamic/wp-pronamic-ideal/blob/1.3.4/classes/Pronamic/Shopp/IDeal/GatewayModule.php#L72 +$shopp_meta_table = $wpdb->prefix . 'shopp_meta'; + +// @link http://cube3x.com/2013/04/how-to-check-if-table-exists-in-wordpress-database/ +if ( $shopp_meta_table === $wpdb->get_var( "SHOW TABLES LIKE '$shopp_meta_table';" ) ) { // WPCS: unprepared SQL ok. + $query = "SELECT id, value FROM $shopp_meta_table WHERE type = 'setting' AND name = 'Pronamic_Shopp_IDeal_GatewayModule';"; + + $row = $wpdb->get_row( $query ); // WPCS: unprepared SQL ok. + + if ( $row ) { + $settings = maybe_unserialize( $row->value ); + + if ( is_array( $settings ) && isset( $settings['pronamic_shopp_ideal_configuration'] ) ) { + $value = $settings['pronamic_shopp_ideal_configuration']; + + $settings['config_id'] = @$config_ids_map[ $value ]; + + $wpdb->update( + $shopp_meta_table, + array( + 'value' => serialize( $settings ), + ), + array( + 'id' => $row->id, + ) + ); + } + } +} + +// WooCommerce +// @link https://github.com/pronamic/wp-pronamic-ideal/blob/1.3.4/classes/Pronamic/WooCommerce/IDeal/IDealGateway.php#L42 +$settings = get_option( 'woocommerce_pronamic_ideal_settings' ); + +if ( is_array( $settings ) && isset( $settings['configuration_id'] ) ) { + $value = $settings['configuration_id']; + + $settings['config_id'] = @$config_ids_map[ $value ]; + + unset( $settings['configuration_id'] ); + + update_option( 'woocommerce_pronamic_pay_ideal_settings', $settings ); +} + +delete_transient( 'pronamic_pay_upgrade_200' ); diff --git a/wp-content/plugins/pronamic-ideal/includes/updates/update-2.0.1.php b/wp-content/plugins/pronamic-ideal/includes/updates/update-2.0.1.php new file mode 100644 index 00000000..a93b7da4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/includes/updates/update-2.0.1.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Execute changes made in Pronamic Pay 2.0.1 + * + * @link https://github.com/WordPress/WordPress/blob/3.5.1/wp-admin/includes/upgrade.php#L413 + * @since 2.1.0 + */ + +global $wpdb; + +/* + +-- You can undo the database upgrade by executing the following queries + +DELETE FROM wp_options WHERE option_name = 'pronamic_pay_license_key'; + +*/ + +/** + * Options. + */ +$options = array( + 'pronamic_ideal_key' => 'pronamic_pay_license_key', +); + +foreach ( $options as $key_old => $key_new ) { + $value = get_option( $key_old ); + + if ( ! empty( $value ) ) { + update_option( $key_new, $value ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/includes/updates/update-3.3.0.php b/wp-content/plugins/pronamic-ideal/includes/updates/update-3.3.0.php new file mode 100644 index 00000000..7cbf0371 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/includes/updates/update-3.3.0.php @@ -0,0 +1,30 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Execute changes made in Pronamic Pay 3.3.0 + * + * @link https://github.com/WordPress/WordPress/blob/3.5.1/wp-admin/includes/upgrade.php#L413 + * @since 3.3.0 + */ + +$license_md5 = get_option( 'pronamic_pay_license_key' ); + +$url = add_query_arg( 'license', $license_md5, 'http://api.pronamic.eu/licenses/convert-md5/1.0/' ); + +$result = wp_remote_get( $url ); + +if ( 200 === wp_remote_retrieve_response_code( $result ) ) { + $body = wp_remote_retrieve_body( $result ); + + if ( 32 === strlen( $body ) ) { + update_option( 'pronamic_pay_license_key', $body ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/includes/updates/update-3.7.0.php b/wp-content/plugins/pronamic-ideal/includes/updates/update-3.7.0.php new file mode 100644 index 00000000..98b11e81 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/includes/updates/update-3.7.0.php @@ -0,0 +1,54 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Execute changes made in Pronamic Pay 3.7.0 + * + * @link https://github.com/WordPress/WordPress/blob/3.5.1/wp-admin/includes/upgrade.php#L413 + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/updates/woocommerce-update-2.2.php + * @since 3.7.0 + */ + +global $wpdb; + +// States +$states = array( + '' => 'payment_pending', + 'Success' => 'payment_completed', + 'Cancelled' => 'payment_cancelled', + 'Expired' => 'payment_expired', + 'Failure' => 'payment_failed', + 'Open' => 'payment_pending', +); + +foreach ( $states as $meta_value => $post_status ) { + $condition = empty( $meta_value ) ? 'IS NULL' : '= %s'; + + $query = " + UPDATE + $wpdb->posts AS post + LEFT JOIN + $wpdb->postmeta AS meta_status + ON post.ID = meta_status.post_id AND meta_status.meta_key = '_pronamic_payment_status' + SET + post.post_status = %s + WHERE + post.post_type = 'pronamic_payment' + AND + post.post_status = 'publish' + AND + meta_status.meta_value $condition + ; + "; + + $query = $wpdb->prepare( $query, $post_status, $meta_value ); // WPCS: unprepared SQL ok. + + $wpdb->query( $query ); // WPCS: unprepared SQL ok. +} diff --git a/wp-content/plugins/pronamic-ideal/includes/updates/update-3.7.2.php b/wp-content/plugins/pronamic-ideal/includes/updates/update-3.7.2.php new file mode 100644 index 00000000..a755bf09 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/includes/updates/update-3.7.2.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +require dirname( __FILE__ ) . '/update-3.7.0.php'; diff --git a/wp-content/plugins/pronamic-ideal/index.php b/wp-content/plugins/pronamic-ideal/index.php new file mode 100644 index 00000000..49d255dd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/index.php @@ -0,0 +1 @@ +\n" +"Language-Team: Pronamic \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.1\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. Plugin Name of the plugin +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:26 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:29 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:278 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentAction.php:35 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:78 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:121 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:52 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:153 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:100 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:1003 +#: vendor/wp-pay/core/src/Payments/StatusChecker.php:169 +#: vendor/wp-pay/core/views/notice-license.php:20 +#: vendor/wp-pay/core/views/notice-license.php:28 +#: vendor/wp-pay/core/views/notice-webhook-url.php:51 +msgid "Pronamic Pay" +msgstr "Pronamic Pay" + +#. Plugin URI of the plugin +#: admin/tab-getting-started.php:169 +msgid "https://www.pronamic.eu/plugins/pronamic-ideal/" +msgstr "https://www.pronamic.eu/plugins/pronamic-ideal/" + +#. Description of the plugin +msgid "" +"The Pronamic Pay plugin adds payment methods like iDEAL, Bancontact, credit " +"card and more to your WordPress site for a variety of payment providers." +msgstr "" +"Das Pronamic Pay Plugin fügt Zahlungsmethoden wie SOFORT Banking, " +"Kreditkarte, iDEAL, Bancontact und mehr für eine Vielzahl von " +"Zahlungsanbietern hinzu." + +#. Author of the plugin +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:41 +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:44 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:60 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:84 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:53 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:66 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:194 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:61 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:101 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:162 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:103 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:104 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:121 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:217 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:98 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:99 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:49 +msgid "Pronamic" +msgstr "Pronamic" + +#. Author URI of the plugin +msgid "https://www.pronamic.eu/" +msgstr "https://www.pronamic.eu/" + +#: admin/methods-wp-admin.php:17 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:230 +msgid "Icon" +msgstr "Symbol" + +#: admin/methods-wp-admin.php:18 +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:55 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:58 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:403 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:128 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:54 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:349 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:31 +#: vendor/wp-pay/core/views/tab-extensions.php:32 +msgid "Name" +msgstr "Name" + +#: admin/methods-wp-admin.php:19 +msgid "Website" +msgstr "Webseite" + +#: admin/page-about.php:26 vendor/wp-pay/core/src/Admin/AdminAboutPage.php:70 +msgid "Welcome to Pronamic Pay" +msgstr "Willkommen bei Pronamic Pay" + +#. translators: %s: Plugin version number +#: admin/page-about.php:33 +msgid "" +"Thanks for installing Pronamic Pay. Version %s is more powerful, stable and " +"secure than ever before. We hope you enjoy using it." +msgstr "" +"Vielen Dank für die Installation von Pronamic Pay. Version %s ist " +"leistungsfähiger, stabiler und sicherer als je zuvor. Wir hoffen, Sie " +"genießen es, es zu benutzen." + +#. translators: %s: Plugin version number +#: admin/page-about.php:45 +msgid "Version: %s" +msgstr "Version: %s" + +#: admin/page-about.php:56 +msgid "What is new?" +msgstr "Was ist neu?" + +#: admin/page-about.php:57 vendor/wp-pay/core/views/page-dashboard.php:377 +msgid "Getting started" +msgstr "Erste Schritte" + +#: admin/tab-getting-started.php:19 +msgid "Step 1: open an account with a payment provider" +msgstr "Schritt 1: öffnen Sie ein Konto bei einem Zahlungsanbieter" + +#: admin/tab-getting-started.php:24 +msgid "" +"To start accepting online payments, you'll first need to register with a " +"payment provider. Payment\n" +"providers are responsible for the actual processing of transactions. We " +"support most popular Dutch payment\n" +"providers and banks, but are not a payment provider ourselves. The Pronamic " +"Pay plugin is the glue between\n" +"the chosen payment provider and a wide variety of supported e-commerce " +"plugins." +msgstr "" +"Um Online-Zahlungen zu akzeptieren, müssen Sie sich zunächst bei einem " +"Zahlungsanbieter registrieren. Zahlungsanbieter sind für die tatsächliche " +"Abwicklung von Transaktionen verantwortlich. Wir unterstützen die " +"beliebtesten Zahlungsanbieter und Banken, sind aber selbst kein " +"Zahlungsanbieter. Das Pronamic Pay-Plugin ist die Verbindung zwischen dem " +"gewählten Zahlungsanbieter und einer Vielzahl von unterstützten E-Commerce-" +"Plugins." + +#: admin/tab-getting-started.php:41 +msgid "https://www.pronamic.eu/payment-providers/" +msgstr "https://www.pronamic.eu/payment-providers/" + +#: admin/tab-getting-started.php:42 +msgid "View supported payment providers" +msgstr "Sehen Sie sich die unterstützten Zahlungsanbieter an" + +#: admin/tab-getting-started.php:60 +msgid "Step 2: add payment provider configuration" +msgstr "Schritt 2: fügen Sie die Konfiguration des Zahlungsanbieters hinzu" + +#: admin/tab-getting-started.php:65 +msgid "" +"Create a new configuration via Pay » Configurations » Add new. The account " +"details to use\n" +"are provided by the payment provider via e-mail or through a dashboard." +msgstr "" +"Erstellen Sie eine neue Konfiguration über Bezahlen » Konfigurationen » Neu " +"hinzufügen. Die zu verwendenden Kontoinformationen werden vom " +"Zahlungsanbieter per E-Mail oder über ein Dashboard bereitgestellt." + +#: admin/tab-getting-started.php:77 +msgid "" +"Some payment providers need additional setup to receive automatic payment " +"status updates in WordPress. Please\n" +"see the \"Transaction Feedback\" tab of the configuration for details." +msgstr "" +"Einige Zahlungsanbieter benötigen zusätzliche Einstellungen, um automatische " +"Zahlungsstatus-Updates in WordPress zu erhalten. Details finden Sie auf der " +"Registerkarte \"Transaktionsfeedback\" der Konfiguration." + +#: admin/tab-getting-started.php:99 +msgid "Add new payment provider configuration" +msgstr "Fügen Sie eine neue Zahlungsanbieterkonfiguration hinzu" + +#: admin/tab-getting-started.php:109 +msgid "Step 3: test configuration" +msgstr "Schritt 3: test Konfiguration" + +#: admin/tab-getting-started.php:114 +msgid "" +"After the payment provider configuration has been added, the \"Test\" " +"section below the\n" +"settings box can be used to test the configuration. You can choose from " +"various payment methods (depending on the\n" +"payment provider) and enter an amount for the payment. The configuration is " +"working properly if you are redirected to a\n" +"screen that mentions the same amount." +msgstr "" +"Nachdem die Konfiguration des Zahlungsanbieters hinzugefügt wurde, kann der " +"Abschnitt \"Test\" unter dem Einstellungsfeld zum Testen der Konfiguration " +"verwendet werden. Sie können zwischen verschiedenen Zahlungsmethoden wählen " +"(abhängig vom Zahlungsanbieter) und einen Betrag für die Zahlung eingeben. " +"Die Konfiguration funktioniert ordnungsgemäß, wenn Sie zu einem Bildschirm " +"weitergeleitet werden, der den gleichen Betrag enthält." + +#: admin/tab-getting-started.php:128 +msgid "" +"Testing different amounts might be mandatory for your payment provider. If " +"so, an additional box with\n" +"amounts will be shown. You need to test all these amounts before your live " +"account will be activated by the payment provider." +msgstr "" +"Das Testen verschiedener Beträge ist möglicherweise für Ihren " +"Zahlungsanbieter obligatorisch. Wenn ja, wird eine zusätzliche Box mit " +"Beträgen angezeigt. Sie müssen alle diese Beträge testen, bevor Ihr Live-" +"Konto vom Zahlungsanbieter aktiviert wird." + +#: admin/tab-getting-started.php:149 +msgid "Step 4: configure e-commerce plugin" +msgstr "Schritt 4: konfigurieren Sie das E-Commerce-Plugin" + +#: admin/tab-getting-started.php:154 +msgid "" +"To actually use the configuration to receive payments, you need to configure " +"your e-commerce\n" +"plugin. Many popular e-commerce plugins are supported. These plugins usually " +"have their own payment settings\n" +"page, where you choose which configuration to use in the payment methods " +"that are provided by the Pronamic Pay plugin." +msgstr "" +"Um die Konfiguration tatsächlich zu verwenden, um Zahlungen zu erhalten, " +"müssen Sie Ihr E-Commerce-Plugin konfigurieren. Viele populäre E-Commerce-" +"Plugins werden unterstützt. Diese Plugins haben normalerweise eine eigene " +"Seite mit Zahlungseinstellungen, auf der Sie auswählen, welche Konfiguration " +"in den Zahlungsmethoden des Pronamic Pay-Plugins verwendet werden soll." + +#: admin/tab-getting-started.php:170 +msgid "View supported e-commerce plugins" +msgstr "Sehen Sie sich die unterstützten E-Commerce-Plugins an" + +#: admin/tab-new.php:18 +msgid "New Logo" +msgstr "Neues Logo" + +#: admin/tab-new.php:23 +msgid "" +"With the newest 5.8 version of Pronamic Pay we’re introducing a totally new " +"brand identity. Just as our Pronamic logo we’re using the letter ‘P’, from " +"Pay, as a recognition point. Our new colors yellow and blue are supporting " +"the sector. Yellow stands for prosperity and gold. Blue stands for safety " +"and our Dutch roots." +msgstr "" +"Mit der neuesten 5.8 Version von Pronamic Pay führen wir eine völlig neue " +"Markenidentität ein. Genau wie unser Pronamic-Logo verwenden wir den " +"Buchstaben 'P' von Pay als Erkennungspunkt. Unsere neuen Farben Gelb und " +"Blau unterstützen die Branche. Gelb steht für Wohlstand und Gold. Blue steht " +"für Sicherheit und unsere niederländischen Wurzeln." + +#: admin/tab-new.php:34 +msgid "" +"With this new identity we are trying to create a uniform and recognizable " +"brand for the future. Our new brand logo and identity is visible when you " +"visit our WordPress plugin page. Also, after updating to version 5.8, a new " +"WordPress admin icon is shown." +msgstr "" +"Mit dieser neuen Identität versuchen wir, eine einheitliche und erkennbare " +"Marke für die Zukunft zu schaffen. Unser neues Markenlogo und unsere neue " +"Identität sind sichtbar, wenn Sie unsere WordPress-Plugin-Seite besuchen. " +"Auch nach der Aktualisierung auf Version 5.8 wird ein neues WordPress-Admin-" +"Symbol angezeigt." + +#: admin/tab-new.php:44 +msgid "" +"https://www.wp-pay.org/wp-content/uploads/2019/10/pronamic-pay-5.8-update-" +"banner-en.png" +msgstr "" +"https://www.wp-pay.org/wp-content/uploads/2019/10/pronamic-pay-5.8-update-" +"banner-en.png" + +#: admin/tab-new.php:54 +msgid "WordPress Health Status" +msgstr "Status des Website-Zustandes" + +#: admin/tab-new.php:59 +msgid "" +"WordPress version 5.2 introduced the WordPress Health Status page. We’ve " +"migrated our Pronamic Pay status page and combined it with the new WordPress " +"Health Status page. You can find the new page in your dashboard under " +"‘Tools’ » ‘Site Health’." +msgstr "" +"WordPress Version 5.2 führte die Seite Status des Website-Zustandes ein. Wir " +"haben unsere Pronamic Pay Statusseite migriert und mit der neuen Seite " +"Status des Website-Zustandes kombiniert. Sie finden die neue Seite in Ihrem " +"Dashboard unter ‘Werkzeuge’ » ‘Website-Zustand’." + +#: admin/tab-new.php:71 +msgid "Rabobank - OmniKassa 2.0" +msgstr "Rabobank - OmniKassa 2.0" + +#: admin/tab-new.php:76 +msgid "" +"We’ve enhanced the ‘Order ID’ reference that our plugin communicates and " +"gives back to OmniKassa 2.0. The length of the payment reference is " +"increased from 10 to 24 characters. Our plugin monitor reads the given " +"‘Order ID’ and checks if it answers the OmniKassa 2.0 demands. The reference " +"field may only contain alphanumeric characters (a-z, A-Z, 0-9). Other " +"characters, for example ‘.’, ‘@’, ‘_’, are not allowed." +msgstr "" +"Wir haben den 'Order ID'-Verweis verbessert, den unser Plugin kommuniziert " +"und OmniKassa 2.0 zurückgibt. Die Länge der Zahlungsreferenz wird von 10 auf " +"24 Zeichen erhöht. Unser Plugin-Monitor liest die angegebene 'Order ID' und " +"prüft, ob er die OmniKassa 2.0-Anforderungen erfüllt. Das Referenzfeld darf " +"nur alphanumerische Zeichen enthalten (a-z, A-Z, 0-9). Andere Zeichen, z. B. " +"'.', ''', '_', '_', sind nicht zulässig." + +#: admin/tab-new.php:96 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:63 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:267 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:325 +msgid "Gravity Forms" +msgstr "Gravity Forms" + +#: admin/tab-new.php:101 +msgid "" +"Support for the Gravity Forms plugin within a WordPress multisite is " +"enhanced. Our Gravity Forms extension is not loaded if Gravity Forms is not " +"activated in one of the network sites. We’ve also updated the Gravity Forms " +"internationalisation. The text strings in our extension are now better " +"translatable, even if your WordPress site uses a Right-to-Left text " +"direction." +msgstr "" +"Die Unterstützung für das Gravity Forms Plugin innerhalb einer WordPress-" +"Multisite wird verbessert. Unsere Gravity Forms-Erweiterung wird nicht " +"geladen, wenn Gravity Forms nicht in einem der Netzwerkstandorte aktiviert " +"ist. Wir haben auch die Internationalisierung von Gravity Forms " +"aktualisiert. Die Textzeichenfolgen in unserer Erweiterung sind jetzt besser " +"übersetzbar, auch wenn Ihre WordPress-Website eine Rechts-nach-Links-" +"Textrichtung verwendet." + +#: admin/tab-new.php:113 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:37 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:420 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:428 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:436 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:535 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:627 +msgid "Restrict Content Pro" +msgstr "Restrict Content Pro" + +#: admin/tab-new.php:118 +msgid "" +"The team of Sandhills Development, the developers behind Restrict Content " +"Pro are very active. Version 3.0 of their plugin is released in february " +"2019. With this 3.0 release we needed to update our support for the plugin. " +"Sadly some new features in Restrict Content Pro 3.0 weren’t backwards " +"compatible. Therefor we needed to rewrite some elements of our extension. " +"The biggest improvement within Restrict Content Pro 3.0 regards the " +"membership renewal process. After a recurring payment is created a " +"membership is instantly extended. Previously this would only happen after a " +"payment was successful, this process could take up to 5 days. Now if a " +"payment fails or expires the membership will temporarily stop and will get " +"the ‘pending’ status." +msgstr "" +"Das Team von Sandhills Development, die Entwickler hinter Restrict Content " +"Pro, sind sehr aktiv. Version 3.0 ihres Plugins wird im Februar 2019 " +"veröffentlicht. Mit dieser Version 3.0 mussten wir unseren Support für das " +"Plugin aktualisieren. Leider waren einige neue Funktionen in Restrict " +"Content Pro 3.0 nicht abwärtskompatibel. Deshalb mussten wir einige Elemente " +"unserer Erweiterung umschreiben. Die größte Verbesserung in Restrict Content " +"Pro 3.0 betrifft den Prozess der Mitgliedschaftserneuerung. Nachdem eine " +"wiederkehrende Zahlung erstellt wurde, wird eine Mitgliedschaft sofort " +"verlängert. Bisher würde dies nur geschehen, nachdem eine Zahlung " +"erfolgreich war, könnte dieser Prozess bis zu 5 Tage dauern. Wenn nun eine " +"Zahlung fehlschlägt oder abläuft, wird die Mitgliedschaft vorübergehend " +"beendet und erhält den Status \"Ausstehend\"." + +#. translators: %d: configuration ID +#: includes/updates/update-2.0.0.php:104 +msgid "Configuration %d" +msgstr "Konfiguration %d" + +#. translators: %d: payment feed ID +#: includes/updates/update-2.0.0.php:280 +msgid "Payment Form %d" +msgstr "Zahlungsformular %d" + +#. translators: %d: payment ID +#: includes/updates/update-2.0.0.php:401 +msgid "Payment %d" +msgstr "Zahlung %d" + +#: pronamic-ideal.php:240 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: pronamic-ideal.php:257 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-advanced-v3-with-" +"wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-advanced-v3-with-" +"wordpress-via-pronamic-pay/" + +#: pronamic-ideal.php:275 vendor/wp-pay-gateways/mollie/tests/bootstrap.php:24 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-mollie-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-mollie-with-wordpress-via-" +"pronamic-pay/" + +#: pronamic-ideal.php:316 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-rabobank-ideal-professional-" +"v3-with-wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-rabobank-ideal-professional-" +"v3-with-wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-extensions/charitable/src/BancontactGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/BancontactGateway.php:35 +#: vendor/wp-pay-extensions/give/src/BancontactGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:209 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:218 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:231 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:109 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:288 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:301 +msgid "Bancontact" +msgstr "Bancontact" + +#: vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php:35 +#: vendor/wp-pay-extensions/give/src/BankTransferGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:210 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:114 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:289 +msgid "Bank Transfer" +msgstr "Banküberweisung" + +#. translators: %s: Charitable donation ID +#: vendor/wp-pay-extensions/charitable/src/CharitableHelper.php:39 +msgid "Charitable donation %s" +msgstr "Charitable Spende %s" + +#: vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php:35 +#: vendor/wp-pay-extensions/give/src/CreditCardGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:212 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:119 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:271 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:296 +msgid "Credit Card" +msgstr "Kreditkarte" + +#: vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php:35 +#: vendor/wp-pay-extensions/give/src/DirectDebitGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:213 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:275 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:297 +msgid "Direct Debit" +msgstr "Lastschrift" + +#: vendor/wp-pay-extensions/charitable/src/Extension.php:36 +#: vendor/wp-pay-extensions/charitable/src/Extension.php:252 +msgid "Charitable" +msgstr "Charitable" + +#. translators: %s: source id +#: vendor/wp-pay-extensions/charitable/src/Extension.php:258 +#: vendor/wp-pay-extensions/give/src/Extension.php:225 +msgid "Donation %s" +msgstr "Spende %s" + +#: vendor/wp-pay-extensions/charitable/src/Extension.php:273 +msgid "Charitable Donation" +msgstr "Charitable Spende" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:64 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:299 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:118 +#: vendor/wp-pay-extensions/give/src/Gateway.php:121 +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:65 +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:126 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:405 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:109 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:887 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:152 +#: vendor/wp-pay-extensions/s2member/src/Settings.php:41 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:240 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:251 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:265 +#: views/eshop/settings-meta-box.php:26 +msgid "Configuration" +msgstr "Konfiguration" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:72 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:124 +#: vendor/wp-pay-extensions/give/src/Gateway.php:130 +msgid "Transaction description" +msgstr "Transaktionsbeschreibung" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:74 +msgid "Charitable donation {donation_id}" +msgstr "Charitable Spende {donation_id}" + +#. translators: %s: {tag} +#. translators: %s: {order_id} {payment_id} +#. translators: %s: {site_url} {home_url} +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:76 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:126 +#: vendor/wp-pay-extensions/give/src/Gateway.php:133 +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:108 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:173 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:199 +msgid "Available tags: %s" +msgstr "Verfügbare Tags: %s" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:84 +#: vendor/wp-pay-extensions/give/src/Gateway.php:111 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:163 +msgid "" +"This payment method does not use a predefined payment method for the " +"payment. Some payment providers list all activated payment methods for your " +"account to choose from. Use payment method specific gateways (such as " +"'iDEAL') to let customers choose their desired payment method at checkout." +msgstr "" +"Diese Zahlungsmethode verwendet keine vordefinierte Zahlungsmethode für die " +"Zahlung. Einige Zahlungsanbieter listen alle aktivierten Zahlungsmethoden " +"für Ihr Konto auf. Verwenden Sie gateway-spezifische Gateways (z. B. " +"'iDEAL'), damit die Kunden beim Bezahlen ihre gewünschte Zahlungsmethode " +"auswählen können." + +#: vendor/wp-pay-extensions/charitable/src/IDealGateway.php:34 +#: vendor/wp-pay-extensions/charitable/src/IDealGateway.php:37 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:61 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:186 +#: vendor/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php:43 +#: vendor/wp-pay-extensions/give/src/IDealGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:226 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:238 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:246 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:135 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:306 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:318 +msgid "iDEAL" +msgstr "iDEAL" + +#: vendor/wp-pay-extensions/charitable/src/SofortGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/SofortGateway.php:35 +#: vendor/wp-pay-extensions/give/src/SofortGateway.php:32 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:327 +msgid "SOFORT Banking" +msgstr "Sofortüberweisung" + +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:52 +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:229 +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:253 +msgid "Contact Form 7" +msgstr "Contact Form 7" + +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:149 +msgid "Please wait while redirecting for payment" +msgstr "Bitte warten Sie, während umleiten für die Zahlung" + +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:241 +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:265 +msgid "Contact Form 7 Entry" +msgstr "Contact Form 7 Eintrag" + +#. translators: %s: payment data title +#: vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php:158 +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:385 +#: vendor/wp-pay-extensions/gravityforms/src/Processor.php:244 +#: vendor/wp-pay-extensions/memberpress/src/Pronamic.php:63 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:95 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:349 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:178 +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:120 +msgid "Payment for %s" +msgstr "Zahlung für %s" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php:161 +msgid "Contact Form 7 Entry @ %s" +msgstr "Contact Form 7 Eintrag @ %s" + +#. translators: %s: payment number +#: vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php:172 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:403 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:550 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:47 +msgid "Payment %s" +msgstr "Zahlung %s" + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php:151 +msgid "Input amount is invalid." +msgstr "Eingabebetrag ist ungültig." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php:152 +msgid "The input amount is invalid." +msgstr "Der Eingabebetrag ist ungültig." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php:166 +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:528 +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:540 +#: vendor/wp-pay-extensions/ninjaforms/src/IssuersField.php:94 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:456 +#: vendor/wp-pay/core/views/tab-system_status.php:395 +msgid "Issuer" +msgstr "Aussteller" + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php:194 +msgid "Payment method required." +msgstr "Zahlungsmethode erforderlich." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php:195 +msgid "The payment method is invalid." +msgstr "Die Zahlungsmethode ist ungültig." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php:209 +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:58 +#: vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php:14 +msgid "Payment method" +msgstr "Zahlungsmethode" + +#. translators: 1: Pronamic Pay plugin name, 2: documentation URL anchor +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:14 +msgid "" +"Generate a tag for an issuer field. %1$s requires a field with the " +"`pronamic_pay_amount` option, but payment method and issuer fields are " +"optional in most cases. For step-by-step instructions on receiving payments " +"with Contact Form 7, please see %2$s." +msgstr "" +"Generieren Sie ein Tag für ein Ausstellerfeld. %1$s erfordert ein Feld mit " +"der Option `pronamic_pay_amount`, aber die Felder für Zahlungsmethode und " +"Aussteller sind in den meisten Fällen optional. Eine Schritt-für-Schritt-" +"Anleitung zum Empfang von Zahlungen mit Contact Form 7 finden Sie unter %2$s." + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:16 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:19 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-contact-form-7-to-pronamic-" +"pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-contact-form-7-to-pronamic-" +"pay/" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:16 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:19 +msgid "How to connect Contact Form 7 to Pronamic Pay" +msgstr "So verbinden Sie das Contact Form 7 mit Pronamic Pay" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:37 +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:42 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:40 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:45 +msgid "Field type" +msgstr "Feldtyp" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:46 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:49 +msgid "Required field" +msgstr "Pflichtfeld" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:66 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:108 +msgid "Id attribute" +msgstr "Id-Attribut" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:76 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:118 +msgid "Class attribute" +msgstr "CSS-Klasse" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:91 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:133 +msgid "Insert Tag" +msgstr "Tag einfügen" + +#. translators: %s: mail-tag placeholder HTML +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:102 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:145 +msgid "" +"To use the value input through this field in a mail field, you need to " +"insert the corresponding mail-tag (%s) into the field on the Mail tab." +msgstr "" +"Um den Eingabewert mittels dieses Feldes in einem E-Mail-Feld zu verwenden, " +"müssen Sie den entsprechenden E-Mail-Tag (%s) in das Feld auf der " +"Registerkarte E-Mail einfügen." + +#. translators: 1: Pronamic Pay plugin name, 2: documentation URL anchor +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:17 +msgid "" +"Generate a tag for a payment method field. %1$s requires a field with the " +"`pronamic_pay_amount` option, but payment method and issuer fields are " +"optional in most cases. For step-by-step instructions on receiving payments " +"with Contact Form 7, please see %2$s." +msgstr "" +"Generieren Sie ein Tag für ein Zahlungsmethodenfeld. %1$s erfordert ein Feld " +"mit der Option `pronamic_pay_amount`, aber die Felder für Zahlungsmethode " +"und Aussteller sind in den meisten Fällen optional. Eine Schritt-für-Schritt-" +"Anleitung zum Empfang von Zahlungen mit Contact Forms 7 finden Sie unter " +"%2$s." + +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:68 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:73 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:83 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:172 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:313 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php:88 +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:38 +msgid "Payment Methods" +msgstr "Zahlungsmethoden" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:29 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:397 +msgid "Easy Digital Downloads" +msgstr "Easy Digital Downloads" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:240 +msgid "payment reserved at gateway" +msgstr "Zahlung am Zahlungsgateway reserviert" + +#. translators: %s: payment id +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:260 +msgid "payment #%s" +msgstr "Zahlung #%s" + +#. translators: %s: payment edit link +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:267 +msgid "" +"Create an invoice at payment gateway for %1$s after processing the order." +msgstr "" +"Erstellen Sie eine Rechnung am Zahlungsportal für %1$s nach der Bearbeitung " +"der Bestellung." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:278 +msgid "Payment completed." +msgstr "Zahlung abgeschlossen." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:290 +msgid "Payment open." +msgstr "Zahlung offen." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:294 +msgid "Payment unknown." +msgstr "Zahlung unbekannt." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:418 +msgid "Easy Digital Downloads Order" +msgstr "Easy Digital Downloads Bestellung" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:484 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:406 +msgid "Cancelled" +msgstr "Abgebrochen" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:498 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:528 +msgctxt "Easy Digital Downloads cancelled payment status" +msgid "Cancelled" +msgstr "Abgebrochen" + +#. translators: %s: count value +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:504 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:183 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:142 +msgid "Cancelled (%s)" +msgid_plural "Cancelled (%s)" +msgstr[0] "Storniert (%s)" +msgstr[1] "Storniert (%s)" + +#. translators: 1: Gateway admin label prefix, 2: Gateway admin label +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:83 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:102 +msgid "%1$s - %2$s" +msgstr "%1$s - %2$s" + +#. translators: %s: admin label +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:168 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:141 +msgid "%s Settings" +msgstr "%s Einstellungen" + +#. translators: %s: gateway admin label +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:170 +msgid "Configure the %s settings" +msgstr "Konfigurieren Sie die %s Einstellungen" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:175 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:174 +msgid "Gateway Configuration" +msgstr "Gateway-Konfiguration" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:182 +msgid "Checkout Label" +msgstr "Kasse-Label" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:190 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:220 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:338 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:510 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:525 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:60 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:62 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:61 +msgid "Description" +msgstr "Beschreibung" + +#. translators: %s: {edd_cart_details_name} +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:196 +msgid "Default: %s" +msgstr "Standard: %s" + +#. translators: %s: {edd_cart_details_name} +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:198 +msgid "Available Tags: %s" +msgstr "Verfügbare Tags: % s" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:311 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:561 +#: vendor/wp-pay-extensions/give/src/Gateway.php:263 +#: vendor/wp-pay-extensions/give/src/Gateway.php:341 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:251 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:274 +msgid "Payment Error" +msgstr "Zahlungsfehler" + +#. translators: %s: payment data JSON +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:314 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:564 +msgid "" +"Payment creation failed before sending buyer to the payment provider. " +"Payment data: %s" +msgstr "" +"Die Zahlungserstellung ist fehlgeschlagen, bevor der Käufer an den " +"Zahlungsanbieter gesendet wurde. Zahlungsdaten: %s" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:370 +msgid "Easy Digital Downloads order %s" +msgstr "Easy Digital Downloads Bestellung %s" + +#. translators: %s: payment id +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:596 +msgid "Payment %s pending." +msgstr "Zahlung %s steht aus." + +#. translators: %s: attendee ID +#: vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php:37 +msgid "Attendee %s" +msgstr "Teilnehmer %s" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:45 +msgid "Event Espresso (legacy)" +msgstr "Event Espresso (Erbe)" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:177 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:203 +msgid "Pay with iDEAL" +msgstr "Bezahlen mit iDEAL" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:213 +msgid "Choose a different payment option" +msgstr "Wählen Sie eine andere Zahlungsoption" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:275 +msgid "Click to toggle" +msgstr "Zum Umschalten klicken" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:289 +msgid "Deactivate Pronamic Pay?" +msgstr "Pronamic Pay deaktivieren?" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:322 +msgid "Update Settings" +msgstr "Einstellungen aktualisieren" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:330 +msgid "Activate Pronamic Pay?" +msgstr "Pronamic Pay aktivieren?" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:421 +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:46 +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:164 +msgid "Event Espresso" +msgstr "Event Espresso" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:427 +msgid "Attendee #%s" +msgstr "Teilnehmer #%s" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:442 +msgid "Event Espresso Attendee" +msgstr "Event Espresso-Teilnehmer" + +#: vendor/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php:34 +msgid "Event Espresso transaction %s" +msgstr "Event Espresso Transaktion %s" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:170 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:379 +msgid "Transaction %s" +msgstr "Transaktion %s" + +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:185 +msgid "Event Espresso Transaction" +msgstr "Event Espresso Transaktion" + +#. translators: %s: error message +#: vendor/wp-pay-extensions/event-espresso/src/Gateway.php:190 +msgid "Errors communicating with gateway: %s" +msgstr "Fehler bei der Kommunikation mit dem Gateway: %s" + +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:127 +msgid "Event Espresso transaction {transaction_id}" +msgstr "Event Espresso Transaktion {transaction_id}" + +#: vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php:57 +msgid "Banks" +msgstr "Banken" + +#: vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php:74 +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:567 +msgid "Choose a bank for iDEAL payment" +msgstr "Wählen Sie eine Bank für die Zahlung mit iDEAL" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:54 +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:244 +msgid "Formidable Forms" +msgstr "Formidable Forms" + +#. translators: %s: source id +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:258 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:275 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:333 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:241 +msgid "Entry #%s" +msgstr "Eintrag #%s" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:275 +msgid "Formidable Forms Entry" +msgstr "Formidable Forms Eintrag" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:378 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:88 +msgid "Submission" +msgstr "Vorschlag" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:387 +msgid "Formidable entry %s" +msgstr "Formidable Eintrag %s" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:525 +msgid "Pronamic payment pending" +msgstr "Pronamic Zahlung ausstehend" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:526 +msgid "Pronamic payment success" +msgstr "Pronamic Zahlung Erfolg" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:527 +msgid "Pronamic payment cancelled" +msgstr "Pronamic Zahlung abgebrochen" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:528 +msgid "Pronamic payment expired" +msgstr "Pronamic Zahlung abgelaufen" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:529 +msgid "Pronamic payment failed" +msgstr "Pronamic Zahlung fehlgeschlagen" + +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:94 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:722 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:735 +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:140 +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:218 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:265 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:552 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:69 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:110 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:77 +msgid "Payment Method" +msgstr "Zahlungsart" + +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:114 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:795 +msgid "Choose a payment method" +msgstr "Wählen Sie eine Zahlungsmethode" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:22 +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:223 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:264 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:340 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:290 +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:89 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:448 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:481 +#: vendor/wp-pay/core/views/form.php:50 +#: vendor/wp-pay/core/views/meta-box-form-options.php:53 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:110 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:68 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:70 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:85 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:31 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:29 +msgid "Amount" +msgstr "Betrag" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:35 +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:71 +msgid "— Select Field —" +msgstr "— Feld auswählen —" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:98 +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:66 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:404 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:196 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:172 +msgid "Transaction Description" +msgstr "Transaktionsbeschreibung" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:107 +msgid "" +"Enter a transactaction description, you can use Formidable Forms shortcodes." +msgstr "" +"Geben Sie eine Transaktionsbeschreibung ein, Sie können Formidable Forms " +"Shortcodes verwenden." + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:116 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:125 +msgid "Delay email notifications until payment has been received." +msgstr "" +"Verzögern Sie das Senden von Benachrichtigungen bis die Zahlung eingegangen " +"ist." + +#: vendor/wp-pay-extensions/give/src/Extension.php:51 +#: vendor/wp-pay-extensions/give/src/Extension.php:219 +msgid "Give" +msgstr "Give" + +#: vendor/wp-pay-extensions/give/src/Extension.php:240 +msgid "Give Donation" +msgstr "Give Spende" + +#: vendor/wp-pay-extensions/give/src/Gateway.php:138 +msgid "Give donation {donation_id}" +msgstr "Give Spende {donation_id}" + +#: vendor/wp-pay-extensions/give/src/Gateway.php:234 +msgid "Nonce verification has failed" +msgstr "Nonce Überprüfung fehlgeschlagen" + +#: vendor/wp-pay-extensions/give/src/Gateway.php:234 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:408 +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:527 +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:123 +#: vendor/wp-pay/core/src/Plugin.php:1072 vendor/wp-pay/core/views/form.php:185 +msgid "Error" +msgstr "Fehler" + +#. translators: %s: payment data as JSON +#: vendor/wp-pay-extensions/give/src/Gateway.php:266 +msgid "" +"Payment creation failed before sending buyer to payment provider. Payment " +"data: %s" +msgstr "" +"Die Zahlungserstellung ist fehlgeschlagen, bevor der Käufer an den " +"Zahlungsanbieter gesendet wurde. Zahlungsdaten: %s" + +#. translators: %s: Give donation ID +#: vendor/wp-pay-extensions/give/src/GiveHelper.php:36 +msgid "Give donation %s" +msgstr "Give Spende %s" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:65 +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:79 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:56 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:58 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:69 +msgid "Payment Feeds" +msgstr "Zahlung-Feeds" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:115 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:102 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:836 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:208 +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:96 +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:134 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:1004 +#: vendor/wp-pay/core/src/Core/Gateway.php:769 +#: vendor/wp-pay/core/views/subscription-mandate.php:224 +#: vendor/wp-pay/core/views/subscription-renew.php:82 +msgid "Pay" +msgstr "Bezahlen" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:151 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:415 +msgid "Payment Status" +msgstr "Zahlungsstatus" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:156 +msgid "Payment Date" +msgstr "Zahlungsdatum" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:161 +msgid "Transaction Id" +msgstr "Transaktions-ID" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:166 +msgid "Payment Amount" +msgstr "Zahlungsbetrag" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:171 +msgid "Pronamic Payment ID" +msgstr "Pronamic Zahlungs-ID" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:176 +msgid "Pronamic Pay Again URL" +msgstr "Pronamic Wieder Bezahlen URL" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:182 +msgid "Pronamic bank transfer recipient reference" +msgstr "Pronamic Banküberweisungsempfängerreferenz" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:187 +msgid "Pronamic bank transfer recipient bank name" +msgstr "Pronamic Banküberweisungsempfänger-Bankname" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:192 +msgid "Pronamic bank transfer recipient name" +msgstr "Pronamic Banküberweisungsempfängername" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:197 +msgid "Pronamic bank transfer recipient IBAN" +msgstr "Pronamic Banküberweisungsempfänger IBAN" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:202 +msgid "Pronamic bank transfer recipient BIC" +msgstr "Pronamic Banküberweisungsempfänger BIC" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:207 +msgid "Pronamic bank transfer recipient city" +msgstr "Pronamic Banküberweisungempfängerstadt" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:212 +msgid "Pronamic bank transfer recipient country" +msgstr "Pronamic Banküberweisungsempfängerland" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:217 +msgid "Pronamic bank transfer recipient account number" +msgstr "Pronamic Banküberweisung Empfängerkontonummer" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:223 +msgid "Pronamic Subscription Payment ID" +msgstr "Pronamic Abonnement Zahlungs-ID" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:228 +msgid "Pronamic Subscription Amount" +msgstr "Pronamic Abonnement Betrag" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:233 +msgid "Pronamic Subscription Cancel URL" +msgstr "Pronamic Abonnement Stornieren URL" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:238 +msgid "Pronamic Subscription Renew URL" +msgstr "Pronamic Abonnement Erneuerungs-URL" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:243 +msgid "Pronamic Subscription Renewal Date" +msgstr "Pronamic Abonnement Verlängerungsdatum" + +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:63 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:214 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:82 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:167 +msgid "Title" +msgstr "Titel" + +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:64 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:84 +msgid "Form" +msgstr "Formular" + +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:67 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:86 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:341 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:292 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:172 +#: vendor/wp-pay/core/views/meta-box-notes.php:33 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:36 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:27 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:32 +#: vendor/wp-pay/core/views/tab-system_status.php:404 +msgid "Date" +msgstr "Datum" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:290 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:348 +msgid "Gravity Forms Entry" +msgstr "Gravity Forms Eintrag" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:694 +msgid "Subscription manually activated." +msgstr "Abonnement manuell aktiviert." + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:849 +msgid "Subscription manually canceled." +msgstr "Abonnement manuell abgebrochen." + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1219 +msgid "Subscribing the user to ActiveCampaign" +msgstr "Abonnieren des Benutzers für ActiveCampaign" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1225 +msgid "Subscribing the user to AWeber" +msgstr "Abonnieren des Benutzers zu AWeber" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1240 +msgid "Subscribing the user to Campaign Monitor" +msgstr "Abonnieren des Benutzers für Campaign Monitor" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1256 +msgid "Subscribing the user to MailChimp" +msgstr "Abonnieren des Benutzers für MailChimp" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1272 +msgid "Creating quotes and invoices with Sliced Invoices" +msgstr "Erstellen von Angeboten und Rechnungen mit Sliced Invoices" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1278 +msgid "Sending estimates and invoices with Moneybird" +msgstr "Senden von Schätzungen und Rechnungen mit Moneybird" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1284 +msgid "Sending data to Twilio" +msgstr "Senden von Daten an Twilio" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1290 +msgid "Sending a trigger to Webhooks" +msgstr "Einen Auslöser an Webhooks senden" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1296 +msgid "Uploading files to Dropbox" +msgstr "Hochladen von Dateien zu Dropbox" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1302 +msgid "Sending data to Zapier" +msgstr "Daten an Zapier senden" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1318 +msgid "Registering the user" +msgstr "Registrieren des Benutzers" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1324 +msgid "Start the Workflow once payment has been received." +msgstr "Starten Sie den Workflow, sobald die Zahlung eingegangen ist." + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:72 +msgid "Payment Fields" +msgstr "Zahlungsfelder" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:102 +#: vendor/wp-pay/core/src/GatewayPostType.php:58 +msgid "Payment Gateway Configuration" +msgstr "Zahlungsgateway-Konfiguration" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:109 +msgid "— Use Payment Feed Setting —" +msgstr "— Verwendung Zahlung Feed Einstellung —" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:126 +msgid "Display Mode" +msgstr "Anzeigemodus" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:132 +msgid "— Use field default —" +msgstr "— Feldvorgabe verwenden —" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:133 +msgctxt "Field display mode" +msgid "Select" +msgstr "Auswählen" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:134 +msgctxt "Field display mode" +msgid "List with icons" +msgstr "Liste mit Symbole" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:135 +msgctxt "Field display mode" +msgid "Small icons" +msgstr "Kleine Symbole" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:136 +msgctxt "Field display mode" +msgid "Large icons" +msgstr "Große Symbole" + +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:495 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:63 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:602 +msgid "New Payment Feed" +msgstr "Neuer Zahlungs-Feed" + +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:505 +msgid "This field is not supported by your payment gateway." +msgstr "Dieses Feld wird von Ihrem Zahlungsgateway nicht unterstützt." + +#. translators: %s: new feed URL +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:508 +msgid "" +"Please remove it from this form or add a " +"supported payment gateway." +msgstr "" +"Bitte entfernen Sie es aus diesem Formular oder fügen Sie ein unterstütztes Zahlungsgateway hinzu." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:94 +msgid "Pronamic Pay Add-On" +msgstr "Pronamic Pay Add-On" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:147 +msgid "Payment feed" +msgstr "Zahlungs-Feed" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:244 +msgid "Pay Feeds" +msgstr "Zahlungs-Feeds" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:256 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:60 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:114 +#: vendor/wp-pay/core/src/GatewayPostType.php:59 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:54 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:53 +msgid "Add New" +msgstr "Neue hinzufügen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:420 +msgid "Default pay feed" +msgstr "Standard Zahlungs-Feed" + +#. translators: 1: , 2: +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:471 +msgid "This form doesn't have any pay feeds. Let's go %1$screate one%2$s." +msgstr "" +"Dieses Formular hat keine Zahlungs-Feeds. Lass uns %1$seinen erstellen%2$s." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:497 +msgid "Payment Completed" +msgstr "Zahlung abgeschlossen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:498 +msgid "Payment Failed" +msgstr "Zahlung fehlgeschlagen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:499 +msgid "Payment Pending" +msgstr "Zahlung ausstehend" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:502 +msgid "Subscription Created" +msgstr "Abonnement erstellt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:503 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:485 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:145 +#: vendor/wp-pay/core/src/Settings.php:99 +msgid "Subscription Canceled" +msgstr "Abonnement gekündigt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:504 +msgid "Subscription Expired" +msgstr "Abonnement abgelaufen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:505 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:119 +msgid "Subscription Renewal Notice" +msgstr "Abonnement-Erneuerung-Ankündigung" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:506 +msgid "Subscription Payment Added" +msgstr "Abonnementzahlung hinzugefügt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:507 +msgid "Subscription Payment Failed" +msgstr "Abonnementzahlung fehlgeschlagen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:59 +msgid "Payment Feed" +msgstr "Zahlungs-Feed" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:61 +msgid "Add New Payment Feed" +msgstr "Neue Zahlung-Feed hinzufügen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:62 +msgid "Edit Payment Feed" +msgstr "Zahlung-Feed bearbeiten" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:64 +msgid "All Payment Feeds" +msgstr "Alle Zahlung-Feeds" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:65 +msgid "View Payment Feed" +msgstr "Zahlung-Feed ansehen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:66 +msgid "Search Payment Feeds" +msgstr "Zahlung-Feeds suchen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:67 +msgid "No payment feeds found." +msgstr "Keine Zahlung-Feeds gefunden." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:68 +msgid "No payment feeds found in Trash." +msgstr "Keine Zahlung-Feeds im Papierkorb gefunden." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:70 +msgid "Filter payment feeds list" +msgstr "Zahlung-Feeds-liste filtern" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:71 +msgid "Payment feeds list navigation" +msgstr "Zahlungs-Feed-Liste-Navigation" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:72 +msgid "Payment feeds list" +msgstr "Zahlung-Feeds-Liste" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php:19 +msgid "There was an error updating this payment feed." +msgstr "Beim Aktualisieren dieses Zahlungs-Feed ist ein Fehler aufgetreten." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php:24 +msgid "Payment feed updated successfully." +msgstr "Zahlungs-Feed wurde erfolgreich aktualisiert." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php:40 +msgid "Enter title here" +msgstr "Titel hier eingeben" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:65 +#: vendor/wp-pay-extensions/s2member/src/Settings.php:31 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:52 +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:26 +msgid "General" +msgstr "Allgemein" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:66 +msgid "Status pages" +msgstr "Statusseiten" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:67 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:332 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:333 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:611 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:288 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:508 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:52 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:151 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:36 +msgid "Subscription" +msgstr "Abonnement" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:68 +msgid "Fields" +msgstr "Felder" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:69 +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:30 +msgid "Advanced" +msgstr "Erweitert" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:87 +msgid "The Gravity Forms form to process payments for." +msgstr "Das Gravity Forms-Formular zur Verarbeitung von Zahlungen für." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:91 +msgid "— Select a form —" +msgstr "— Formular auswählen —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:112 +msgid "" +"Gateway configuration, created via Pay » Configurations." +msgstr "" +"Gateway-Konfiguration, erstellt über Bezahlen » Konfigurationen ." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:136 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:180 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:85 +#: vendor/wp-pay-gateways/icepay/src/Integration.php:83 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:262 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:161 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:210 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:465 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:52 +msgid "Order ID" +msgstr "Bestellung ID" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:139 +msgid "Order ID." +msgstr "Bestellnummer." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:152 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:215 +msgid "Default:" +msgstr "Standard:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:172 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:235 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:299 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:95 +#: vendor/wp-pay-gateways/icepay/src/Integration.php:93 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:74 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:228 +msgid "Available tags:" +msgstr "Verfügbare Tags:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:189 +msgid "" +"An order ID makes it easier to match payments from transaction overviews to " +"a form and is required by some payment providers." +msgstr "" +"Eine Bestellnummer erleichtert die Anpassung von Zahlungen aus " +"Transaktionsübersichten auf ein Formular und wird von einigen " +"Zahlungsanbietern verlangt." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:199 +msgid "" +"Transaction description that will be send with the payment. Use tags to " +"customize the description." +msgstr "" +"Transaktionsbeschreibung die mit der Zahlung gesendet wird. Verwenden Sie " +"Tags, um die Beschreibung anzupassen." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:252 +msgid "" +"A description which uses tags and results in more than 32 characters will be " +"truncated." +msgstr "" +"Eine Beschreibung die Tags und Ergebnisse in mehr als 32 Zeichen verwendet, " +"wird abgeschnitten." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:258 +msgid "Send Notifications Delay" +msgstr "Benachrichtigungsverzögerung senden" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:260 +msgid "" +"Notifications for which sending will be delayed until the payment has been " +"received." +msgstr "" +"Benachrichtigungen deren Versand verzögert wird bis die Zahlung eingegangen " +"ist." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:264 +msgid "Delay sending notifications until payment has been received." +msgstr "" +"Verzögern Sie das Senden von Benachrichtigungen bis die Zahlung eingegangen " +"ist." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:321 +msgid "Admin notification" +msgstr "Admin Benachrichtigung" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:328 +msgid "User notification" +msgstr "Benutzer Benachrichtigung" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:342 +msgid "Delay actions" +msgstr "Aktionen verzögern" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:344 +msgid "" +"Actions for which execution will be delayed until the payment has been " +"received." +msgstr "" +"Aktionen deren Ausführung verzögert wird bis die Zahlung eingegangen ist." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:348 +msgid "Delay actions until payment has been received." +msgstr "Aktionen verzögern bis die Zahlung eingegangen ist." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:374 +msgid "Creating a post" +msgstr "Erstellen eines Posts" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:398 +msgid "" +"Set Gravity Forms confirmations, pages or URLs to redirect to after a " +"payment with the mentioned status." +msgstr "" +"Legen Sie Gravity Forms Bestätigungen, Seiten oder URLs fest, auf die nach " +"einer Zahlung mit dem genannten Status umgeleitet werden soll." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:405 +#: vendor/wp-pay/core/views/tab-system_status.php:398 +msgid "Success" +msgstr "Erfolgreich" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:407 +#: vendor/wp-pay/core/src/Plugin.php:1071 +msgid "Expired" +msgstr "Abgelaufen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:409 +msgid "Open" +msgstr "Offen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:446 +msgid "Confirmation:" +msgstr "Bestätigung:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:462 +msgid "Page:" +msgstr "Seite:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:471 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:197 +msgid "— Select —" +msgstr "— Auswählen —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:481 +msgid "URL:" +msgstr "URL:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:493 +msgid "Set the subscription details for recurring payments." +msgstr "Legen Sie die Abonnementdetails für wiederkehrende Zahlungen fest." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:500 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:506 +msgid "Recurring amount" +msgstr "Wiederkehrender Betrag" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:511 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:126 +msgid "None" +msgstr "Keiner" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:518 +msgid "Form total" +msgstr "Formularsumme" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:525 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:570 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:624 +msgid "Form field" +msgstr "Formularfeld" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:539 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:545 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:495 +msgid "Interval" +msgstr "Intervall" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:550 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:612 +msgid "Fixed" +msgstr "Fest" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:554 +msgctxt "Recurring payment" +msgid "Every" +msgstr "Jedes" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:559 +msgid "day(s)" +msgstr "Tag(e)" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:560 +msgid "week(s)" +msgstr "Woche(n)" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:561 +msgid "month(s)" +msgstr "Monat(e)" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:562 +msgid "year(s)" +msgstr "Jahr(e)" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:576 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:141 +msgid "days" +msgstr "tage" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:583 +msgid "Use a field value of 0 days for one-time payments." +msgstr "Verwenden Sie einen Feldwert von 0 Tagen für einmalige Zahlungen." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:596 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:602 +msgid "Number of Periods" +msgstr "Anzahl der Perioden" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:606 +#: vendor/wp-pay/core/src/Util.php:294 +msgctxt "Recurring payment" +msgid "Unlimited" +msgstr "Unbegrenzt" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:618 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:630 +msgctxt "Recurring payment" +msgid "times" +msgstr "mal" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:640 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:646 +msgid "Fixed Subscription Period" +msgstr "Feste Abonnementdauer" + +#. translators: nl: Een vaste abonnementsperiode zorgt ervoor dat de periodes van alle verkochte abonnementen op één lijn liggen. +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:653 +msgid "" +"A fixed subscription period ensures that periods of all sold subscriptions " +"are aligned." +msgstr "" +"Ein fester Abonnementdauer stellt sicher, dass die Perioden aller verkauften " +"Abonnements ausgerichtet werden." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:662 +msgid "Entry Date" +msgstr "Beitrittsdatum" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:744 +msgid "Not Available" +msgstr "Nicht verfügbar" + +#. translators: %s: input HTML +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:760 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:273 +msgid "On %s" +msgstr "Am %s" + +#. translators: %s: Monthday (1-27), 2: Monthday (1-27). +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:783 +msgid "On the %s th day of the month" +msgstr "Le %s ème jour du mois" + +#. translators: 1: Month (Jan-Dec). +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:813 +msgid "On %1$s %2$s" +msgstr "Sur %1$s %2$s" + +#. translators: nl: Bereken bedrag uitlijingsperiode pro rata. +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:831 +msgid "Prorate the amount of the alignment period." +msgstr "Prorate le montant de la période d’alignement." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:844 +#, fuzzy +msgid "" +"Set corresponding form fields to include user data in the payment data with " +"some payment providers." +msgstr "" +"Définir les champs de formulairecorrespondants pour inclure les données " +"utilisateur dans les données de paiement avec certains fournisseurs de " +"paiement." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:850 +msgid "Prefix Name" +msgstr "Nom du Préfixe" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:851 +#: vendor/wp-pay/core/views/form.php:109 vendor/wp-pay/core/views/form.php:112 +msgid "First Name" +msgstr "Prénom" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:852 +msgid "Middle Name" +msgstr "Deuxième nom" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:853 +#: vendor/wp-pay/core/views/form.php:117 vendor/wp-pay/core/views/form.php:120 +msgid "Last Name" +msgstr "Nom" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:854 +msgid "Suffix Name" +msgstr "Nom de Suffix" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:855 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:562 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:357 +msgid "Address" +msgstr "Adresse" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:856 +msgid "Address 2" +msgstr "Adresse 2" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:857 +msgid "Zip" +msgstr "Code postal" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:858 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:110 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:580 +msgid "City" +msgstr "Ville" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:859 +msgid "State" +msgstr "État" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:860 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:136 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:589 +msgid "Country" +msgstr "Pays" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:861 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:598 +msgid "Telephone Number" +msgstr "Numéro de téléphone" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:862 +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:167 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:134 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:433 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:55 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:536 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:534 +msgid "Email" +msgstr "E-mail" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:863 +msgid "Account Holder Name" +msgstr "Nom du titulaire du compte" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:864 +msgid "Account IBAN" +msgstr "Compte IBAN" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:865 +msgid "Company Name" +msgstr "Nom de l'entreprise" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:866 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:301 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:325 +#, fuzzy +msgid "VAT Number" +msgstr "Numéro de la carte" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:887 +msgid "— From first name field —" +msgstr "— Du champ du prénom —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:889 +msgid "— From first address field —" +msgstr "— Du champ de première adresse —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:891 +msgid "— First phone field —" +msgstr "— Premier champ téléphonique —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:893 +msgid "— First email address field —" +msgstr "— Premier champ d'adresse e-mail —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:915 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:140 +#, fuzzy +msgid "Optional settings for advanced usage only." +msgstr "Paramètres optionnels pour une utilisation avancée uniquement." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:922 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:954 +msgid "Conditional Logic" +msgstr "Logique conditionnelle" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:967 +#, fuzzy +msgid "" +"Set conditional logic to only use this gateway if the entry matches the " +"condition(s)." +msgstr "" +"Définir une condition pour n'utiliser la passerelle que si l'entrée " +"correspond à la condition." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:974 +msgid "Update user role" +msgstr "Mise à jour du rôle de l'utilisateur" + +#. translators: %s: Pronamic Pay version number, i.e. 4.7.0 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:36 +msgid "Pronamic Pay v%s" +msgstr "Pronamic Pay v%s" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:45 +#, fuzzy +msgid "" +"Thank you for updating! This new version of Pronamic Pay changes how you " +"manage your payment feeds." +msgstr "" +"Merci d'avoir mis à jour! Cette nouvelle version de Pronamic Pay modifie la " +"façon dont vous gérez vos flux de paiement." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:51 +#, fuzzy +msgid "Manage pay feeds contextually" +msgstr "Gérer les flux de rémunération dans son contexte" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:53 +#, fuzzy +msgid "" +"Pay feeds are now accessed via the Pay sub-menu within the Form Settings." +msgstr "" +"Les flux payants sont désormais accessibles via le sous-menu Pay dans les " +"Paramètres de formulaire." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:62 +msgid "I understand this change, hide this message." +msgstr "Je comprends ce changement, cachez ce message." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:65 +msgid "Please wait…" +msgstr "Veuillez patienter…" + +#: vendor/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php:50 +#: vendor/wp-pay-extensions/memberpress/views/subscription-form.php:14 +msgid "Pronamic Subscription" +msgstr "Abonnement Pronamic" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:47 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:344 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:366 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:394 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:472 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:547 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:598 +msgid "MemberPress" +msgstr "MemberPress" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:155 +msgid "Payment failed. Please try again." +msgstr "Paiement échoué. Veuillez réessayer." + +#. translators: %s: MemberPress +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:343 +msgid "%s subscription deleted." +msgstr "%s abonnement supprimé." + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:406 +msgid "Subscription %s" +msgstr "Abonnement %s" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:421 +msgid "MemberPress Transaction" +msgstr "Transaction MemberPress" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:433 +msgid "MemberPress Subscription" +msgstr "Abonnement MemberPress" + +#. translators: %s: payment method name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:71 +msgid "Pronamic - %s" +msgstr "Pronamic - %s" + +#. translators: %s: extension name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:471 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:593 +msgid "%s subscription on hold." +msgstr "%s abonnement en attente." + +#. translators: %s: extension name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:546 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:622 +msgid "%s subscription reactivated." +msgstr "%s abonnement réactivé." + +#. translators: %s: extension name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:597 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:657 +msgid "%s subscription cancelled." +msgstr "%s abonnement annulé." + +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:842 +#, fuzzy +msgid "" +"JavaScript is disabled in your browser. You will not be able to complete " +"your purchase until you either enable JavaScript in your browser, or switch " +"to a browser that supports it." +msgstr "" +"JavaScript est désactivé dans votre navigateur. Vous ne serez pas en mesure " +"de terminer votre achat jusqu'à ce que vous activez JavaScript dans votre " +"navigateur, ou passer à un navigateur qui le prend en charge." + +#. translators: %s: order id +#: vendor/wp-pay-extensions/memberpress/src/Pronamic.php:66 +msgid "MemberPress transaction %s" +msgstr "Transaction MemberPress %s" + +#: vendor/wp-pay-extensions/memberpress/views/transaction-form.php:14 +msgid "Pronamic Payment" +msgstr "Paiement Pronamic" + +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:37 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:220 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:260 +msgid "Ninja Forms" +msgstr "Ninja Forms" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:245 +msgid "#%s" +msgstr "#%s" + +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:271 +msgid "Ninja Forms Entry" +msgstr "Entrée Ninja Forms" + +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:189 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:138 +msgid "Payment Status Pages" +msgstr "Pages d'état de paiement" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:211 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:292 +msgid "Bitcoin" +msgstr "Bitcoin" + +#. translators: %s: payment method +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:217 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:225 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:233 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:300 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:305 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:310 +msgid "Direct Debit (mandate via %s)" +msgstr "Débit direct (mandat via %s)" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:234 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:240 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:261 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:150 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:311 +msgid "SOFORT" +msgstr "SOFORT" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:239 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:145 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:324 +msgid "PayPal" +msgstr "PayPal" + +#. translators: %s: Restrict Content Pro +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:419 +msgid "Subscription activated by %s." +msgstr "Abonnement activé par %s." + +#. translators: %s: Restrict Content Pro +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:427 +msgid "Subscription canceled by %s." +msgstr "Abonnement annulé par %s." + +#. translators: %s: Restrict Content Pro +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:435 +msgid "Subscription pending by %s." +msgstr "Abonnement en attente par %s." + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:569 +msgid "Restrict Content Pro Payment" +msgstr "Restrict Content Pro Paiement" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:612 +msgid "Restrict Content Pro Membership" +msgstr "Restrict Content Pro Adhésion" + +#. translators: %s: source id +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:642 +msgid "Membership %s" +msgstr "Membership %s" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:153 +msgid "Checkout label" +msgstr "Étiquette de la caisse" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:168 +msgid "Enter a label to display at checkout." +msgstr "Entrez une étiquette à afficher à la caisse." + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:189 +msgid "Choose your configuration." +msgstr "Choisissez votre configuration." + +#. translators: %s: JSON encoded payment data +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:270 +#, fuzzy +msgid "" +"Payment creation failed before sending buyer to the payment provider. Error: " +"%s" +msgstr "" +"La création de paiement a échoué avant d'envoyer l'acheteur au fournisseur " +"de paiement. Erreur: %s" + +#. translators: %s: Potential WordPress user ID. +#: vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php:327 +msgid "" +"Since Restrict Content Pro 3 a subscription must be linked to a Restrict " +"Content Pro membership. Unfortunately, this subscription could not be linked " +"to a Restrict Content Pro membership based on the source ID %s. That is why " +"this subscription has been put on hold so that it can be corrected manually." +msgstr "" + +#. translators: 1: Old source, 2: Old source ID, 3: New source, 4: New source ID. +#: vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php:354 +msgid "" +"Since Restrict Content Pro 3 a subscription must be linked to a Restrict " +"Content Pro membership. That's why source \"%1$s\" with ID \"%2$s\" was " +"updated to source \"%3$s\" with ID \"%4$s\"." +msgstr "" + +#. translators: 1: Old source, 2: Old source ID, 3: New source, 4: New source ID. +#: vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php:437 +msgid "" +"Since Restrict Content Pro 3 a payment must be linked to a Restrict Content " +"Pro payment. That's why source \"%1$s\" with ID \"%2$s\" was updated to " +"source \"%3$s\" with ID %4$s\"." +msgstr "" + +#. translators: %s: Restrict Content Pro payment ID +#: vendor/wp-pay-extensions/restrict-content-pro/src/Util.php:49 +msgid "Restrict Content Pro payment %s" +msgstr "Paiement Restrict Content Pro %s" + +#. translators: %s: Restrict Content Pro discount code +#: vendor/wp-pay-extensions/restrict-content-pro/src/Util.php:173 +msgid "Discount code `%s`" +msgstr "Code de réduction `%s`" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Util.php:192 +msgid "Fees" +msgstr "Frais" + +#: vendor/wp-pay-extensions/restrict-content-pro/views/edit-membership.php:16 +msgid "Pronamic Pay Subscription:" +msgstr "Abonnement Pronamic Pay" + +#: vendor/wp-pay-extensions/restrict-content-pro/views/edit-payment.php:16 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:118 +msgid "Pronamic Pay Payment" +msgstr "Paiement Pronamic Pay" + +#: vendor/wp-pay-extensions/s2member/src/Extension.php:39 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:424 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:435 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:446 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:457 +msgid "s2Member" +msgstr "s2Member" + +#. translators: 1: %%email%%, 2: %%password%%, 3: blog name +#: vendor/wp-pay-extensions/s2member/src/Extension.php:93 +#, fuzzy +msgid "" +"Thanks %1$s! Your membership has been approved.\n" +"\n" +"Your password is %2$s. Please change your password when you login.\n" +"\n" +"If you have any trouble, please feel free to contact us.\n" +"\n" +"Best Regards,\n" +"%3$s" +msgstr "" +"Merci %1$s! Votre adhésion a été approuvée.\n" +"\n" +"Votre mot de passe est %2$s. Veuillez changer votre mot de passe lorsque " +"vous vous connectez.\n" +"\n" +"Si vous avez des problèmes, n'hésitez pas à nous contacter.\n" +"\n" +"Sinceres salutations\n" +"%3$s" + +#. translators: 1: %%email%%, 2: %%subscription_renewal_date%%, 3: %%subscription_cancel_url%%, 4: blog name +#: vendor/wp-pay-extensions/s2member/src/Extension.php:131 +#, fuzzy +msgid "" +"Dear %1$s,\n" +"\n" +"Your membership is due for renewal on %2$s.\n" +"\n" +"To cancel your subscription, visit %3$s\n" +"\n" +"Best Regards,\n" +"%4$s" +msgstr "" +"Chers %1$s,\n" +"\n" +"Votre adhésion doit être renouvelée sur %2$s.\n" +"\n" +"Pour annuler votre abonnement, visitez %3$s\n" +"\n" +"Sinceres salutations\n" +"%4$s" + +#: vendor/wp-pay-extensions/s2member/src/Extension.php:200 +msgid "Account Confirmation" +msgstr "Confirmation du compte" + +#. translators: 1: email, 2: role, 3: capability +#: vendor/wp-pay-extensions/s2member/src/Extension.php:273 +#, fuzzy +msgid "" +"Update user \"%1$s\" to role \"%2$s\" and added custom capability \"%3$s\"." +msgstr "" +"Mettre à jour l'utilisateur \"%1$s\" pour le rôle \"%2$s\" et a ajouté la " +"capacité personnalisée \"%3$s\"." + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:26 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:47 +msgid "1 day" +msgstr "1 jour" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:27 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:48 +msgid "2 day" +msgstr "2 jours" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:28 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:49 +msgid "3 day" +msgstr "3 jours" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:29 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:50 +msgid "4 day" +msgstr "4 jours" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:30 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:51 +msgid "5 day" +msgstr "5 jours" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:31 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:52 +msgid "6 day" +msgstr "6 jours" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:32 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:53 +msgid "1 week" +msgstr "1 semaine" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:33 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:54 +msgid "2 week" +msgstr "2 semaines" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:34 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:55 +msgid "3 week" +msgstr "3 semaines" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:35 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:56 +msgid "1 month" +msgstr "1 mois" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:36 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:57 +msgid "2 month" +msgstr "2 mois" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:37 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:58 +msgid "3 month" +msgstr "3 mois" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:38 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:59 +msgid "4 month" +msgstr "4 mois" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:39 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:60 +msgid "5 month" +msgstr "5 mois" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:40 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:61 +msgid "6 month" +msgstr "6 mois" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:41 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:62 +msgid "1 year" +msgstr "1 an" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:42 +msgid "2 years" +msgstr "2 ans" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:43 +msgid "3 years" +msgstr "3 ans" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:44 +msgid "4 years" +msgstr "4 ans" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:45 +msgid "5 years" +msgstr "5 ans" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:46 +msgid "lifetime" +msgstr "à vie" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:56 +msgid "Signup Confirmation Email Message" +msgstr "Message d'email de confirmation d’inscription" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:71 +msgid "Subscription Renewal Notice Email Subject" +msgstr "Objet d’email d’avis de renouvellement d’abonnement" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:86 +msgid "Subscription Renewal Notice Email Message" +msgstr "Message d'email d’avis de renouvellement d’abonnement" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:135 +msgid "Pronamic Pay Options" +msgstr "Options Pronamic Pay" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:136 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:246 +msgid "Payment Options" +msgstr "Options de paiement" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:144 +msgid "Pronamic Pay Buttons Generator" +msgstr "Générateur de boutons de Pronamic Pay" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:145 +msgid "Payment Buttons" +msgstr "Boutons de paiement" + +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:95 +#, fuzzy +msgid "iDEAL s2Member Payment || {{order_id}}" +msgstr "iDEAL s2Member Paiement L'ordre de l'ordre" + +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:254 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:303 +msgid "The payment gateway could not be found." +msgstr "La passerelle de paiement n'a pas pu être trouvée." + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:60 +msgid "Generator" +msgstr "Générateur" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:80 +msgid "Single payment" +msgstr "Paiement unique" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:83 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:443 +msgid "Recurring payment" +msgstr "Paiement récurrent" + +#. translators: 1: amount input, 2: period select +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:99 +msgid "I want to charge %1$s for %2$s" +msgstr "Je veux facturer %1$ pour %2$s" + +#. translators: %s: level select +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:112 +msgid "access to level %s content." +msgstr "l'accès au contenu de niveau %s." + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:120 +msgid "Description:" +msgstr "Description:" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:124 +msgid "Button text:" +msgstr "Bouton texte:" + +#. translators: %s: default code +#. translators: %s: {payment_id} +#. translators: %s: {payment_id} +#. translators: %s: 0 +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:129 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:258 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:274 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:307 +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:110 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:103 +#: vendor/wp-pay-gateways/icepay/src/Integration.php:101 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:49 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:82 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:178 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:236 +#: vendor/wp-pay-gateways/sisow/src/Integration.php:141 +msgid "Default: %s" +msgstr "Par défaut: %s" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:142 +#: vendor/wp-pay/core/src/Core/Gateway.php:396 +msgctxt "Payment method field" +msgid "All available methods" +msgstr "Toutes les méthodes disponibles" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:162 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:171 +msgid "Shortcode" +msgstr "Shortcode" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:48 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:594 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:623 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:658 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:829 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1166 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1220 +msgid "WooCommerce" +msgstr "WooCommerce" + +#. translators: %s: payment method +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:230 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:245 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:260 +msgid "" +"By using this payment method you authorize us via %s to debit payments from " +"your bank account." +msgstr "" +"En utilisant ce mode de paiement, vous nous autorisez via %s à débiter les " +"paiements de votre compte bancaire." + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:297 +#, fuzzy +msgid "" +"With iDEAL you can easily pay online in the secure environment of your own " +"bank." +msgstr "" +"Avec iDEAL, vous pouvez facilement payer en ligne dans l'environnement " +"sécurisé de votre propre banque." + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:382 +#, fuzzy +msgid "We process your order as soon as we have processed your payment." +msgstr "Nous traitons votre commande dès que nous avons traité votre paiement." + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:443 +msgid "reserved payment cancelled" +msgstr "paiement réservé annulé" + +#. translators: 1: payment URL, 2: payment ID, 3: WooCommerce payment method title, 4: Pronamic payment status +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:489 +#, fuzzy +msgid "Payment #%2$s via \"%3$s\" updated to \"%4$s\"." +msgstr "" +"Paiement de 2 $s par l'intermédiaire de « % 3 $ » mis à " +"jour à « % 4 $ »." + +#. translators: 1: payment URL, 2: payment ID +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:511 +#, fuzzy +msgid "" +"Create an invoice at payment gateway for payment #%2$s " +"after processing the order." +msgstr "" +"Créez une facture à la passerelle de paiement pour le paiement de 2 $s après le traitement de la commande." + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:837 +msgid "Date of birth checkout field" +msgstr "Champ de la date de naissance" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:848 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:853 +msgid "Add date of birth field" +msgstr "Ajouter le champ date de naissance" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:854 +msgid "Add date of birth field to billing checkout fields" +msgstr "Ajouter un champ de date de naissance aux champs de facturation" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:863 +msgid "Gender checkout field" +msgstr "Champ de genre au la caisse" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:874 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:879 +msgid "Add gender field" +msgstr "Ajouter le champ de genre" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:880 +msgid "Add gender field to billing checkout fields" +msgstr "Ajouter le champ de genre aux champs de caisse de facturation" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:898 +#, fuzzy +msgid "" +"Extra fields are used for post-pay payment methods such as AfterPay and " +"Klarna." +msgstr "" +"Des champs supplémentaires sont utilisés pour les méthodes de paiement post-" +"paiement telles que AfterPay et Klarna." + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1012 +msgid "— Select a checkout field —" +msgstr "— Sélectionnez un champ de caisse —" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1058 +#: vendor/wp-pay/core/src/Core/Gateway.php:618 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:420 +msgid "Date of birth" +msgstr "Date de naissance" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1069 +#: vendor/wp-pay/core/src/Core/Gateway.php:580 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:442 +msgid "Gender" +msgstr "Sexe" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1072 +#: vendor/wp-pay/core/src/Core/Gateway.php:585 +msgid "— Select gender —" +msgstr "— Sélectionnez le sexe —" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1073 +#: vendor/wp-pay/core/src/Core/Gateway.php:586 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:449 +msgid "Female" +msgstr "Femme" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1074 +#: vendor/wp-pay/core/src/Core/Gateway.php:587 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:453 +msgid "Male" +msgstr "Homme" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1075 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:457 +msgid "Other" +msgstr "Autre" + +#. translators: %s: order number +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1181 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1237 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:190 +msgid "Order %s" +msgstr "Commande %s" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1196 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1252 +msgid "WooCommerce Order" +msgstr "Commande WooCommerce" + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:120 +msgid "Proceed to %s" +msgstr "Payer avec %s" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:204 +msgid "Enable/Disable" +msgstr "Activer/Désactiver" + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:208 +msgid "Enable %s" +msgstr "Activer %s" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:216 +msgid "This controls the title which the user sees during checkout." +msgstr "" +"Cela détermine le titre que les utilisateurs verront durant la commande." + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:224 +#, fuzzy +msgid "" +"Give the customer instructions for paying via %s, and let them know that " +"their order won't be shipping until the money is received." +msgstr "" +"Donnez au client des instructions pour payer via %s, et faites-lui savoir " +"que leur commande ne sera pas d'expédition jusqu'à ce que l'argent est reçu." + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:235 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:272 +msgid "This controls the icon which the user sees during checkout." +msgstr "Cela contrôle l'icône que l'utilisateur voit lors de la caisse." + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:251 +msgid "Payment Description" +msgstr "Description du Paiement" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:256 +msgid "This controls the payment description." +msgstr "Cela contrôle la description des paiements." + +#. translators: %s: default code +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:258 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:262 +msgid "Order {order_number}" +msgstr "Commande {order_number}" + +#. translators: %s: tags +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:260 +msgid "Tags: %s" +msgstr "Mots-clés: %s" + +#. translators: %s: WooCommerce checkout settings URL +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:309 +msgid "" +"You have to select an gateway configuration on the WooCommerce checkout settings page." +msgstr "" +"Vous devez sélectionner une configuration de passerelle sur la page des " +"paramètres de caisse WooCommerce." + +#. translators: %s: order id +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:352 +msgid "WooCommerce order %s" +msgstr "Ordre WooCommerce %s" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:715 +msgid "Awaiting payment." +msgstr "En attente de paiement." + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:1091 +msgid "A required field for the %s payment method is empty." +msgstr "Un champ requis pour le mode de paiement %s est vide." + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:50 +msgid "WP eCommerce" +msgstr "WP eCommerce" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:103 +msgid "Pronamic - AfterPay" +msgstr "Pronamic - AfterPay" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:104 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:285 +msgid "AfterPay" +msgstr "AfterPay" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:108 +msgid "Pronamic - Bancontact" +msgstr "Pronamic - Bancontact" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:113 +msgid "Pronamic - Bank Transfer" +msgstr "Pronamic - Transfert bancaire" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:118 +msgid "Pronamic - Credit Card" +msgstr "Pronamic - Carte de crédit" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:123 +msgid "Pronamic - Focum" +msgstr "Pronamic - Focum" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:124 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:314 +msgid "Focum" +msgstr "Focum" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:128 +msgid "Pronamic - Giropay" +msgstr "Pronamic - Giropay" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:129 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:315 +msgid "Giropay" +msgstr "Giropay" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:133 +msgid "Pronamic - iDEAL" +msgstr "Pronamic - iDEAL" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:139 +msgid "Pronamic - Maestro" +msgstr "Pronamic - Maestro" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:140 +#: vendor/wp-pay/core/src/Cards.php:81 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:322 +msgid "Maestro" +msgstr "Maestro" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:144 +msgid "Pronamic - PayPal" +msgstr "Pronamic - PayPal" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:149 +msgid "Pronamic - SOFORT" +msgstr "Pronamic - SOFORT" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:302 +msgid "WP e-Commerce" +msgstr "WP e-Commerce" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:314 +msgid "Purchase #%s" +msgstr "Achat #%s" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:329 +msgid "WP e-Commerce Purchase" +msgstr "Achat WP e-Commerce" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:181 +msgid "WP eCommerce order %s" +msgstr "WP eCommerce commande %s" + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:286 +msgid "Payment completed successfully." +msgstr "Le paiement a été effectué avec succès." + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:287 +msgid "" +"The order has been received and we are waiting for the payment to clear." +msgstr "La commande a été reçue et nous attendons que le paiement soit clair." + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:288 +msgid "" +"The payment has been refused. Please try again using a different method or " +"card." +msgstr "" +"Le paiement a été refusé. S’il vous plaît essayer à nouveau en utilisant une " +"méthode différente ou une carte." + +#. translators: %s: exception message +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:337 +#: vendor/wp-pay-gateways/adyen/src/WebSdkGateway.php:328 +msgid "Error getting payment result: %s" +msgstr "Erreur obtenant le résultat de paiement: %s" + +#. translators: %s: exception message +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:400 +#, fuzzy +msgid "Error getting payment details: %s" +msgstr "Erreur obtenant le résultat de paiement: %s" + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:571 +msgid "Credit or debit card" +msgstr "Carte de crédit ou de débit" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:44 +#, fuzzy +msgid "https://www.adyen.com/" +msgstr "https://www.adyen.com/fr_FR/pricing" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:45 +msgid "https://www.adyen.com/pricing" +msgstr "https://www.adyen.com/fr_FR/pricing" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:47 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:32 +msgid "test" +msgstr "test" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:48 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:33 +msgid "live" +msgstr "live" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:50 +#, fuzzy +msgid "https://www.pronamic.eu/manuals/using-adyen-pronamic-pay/" +msgstr "https://www.pronamic.eu/plugins/pronamic-ideal/" + +#. translators: Translate 'notification' the same as in the Adyen dashboard. +#: vendor/wp-pay-gateways/adyen/src/Integration.php:147 +msgctxt "Adyen" +msgid "Adyen Notification Authentication" +msgstr "Authentification de notification Adyen" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:154 +msgid "User Name" +msgstr "Nom d'utilisateur" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:165 +msgid "Password" +msgstr "Mot de passe" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:183 +msgid "" +"Set the user name and password below and in the webhook authentication " +"settings in the Adyen dashboard for increased security (recommended)." +msgstr "" +"Définir le nom d'utilisateur et le mot de passe ci-dessous et dans les " +"paramètres d'authentification webhook dans le tableau de bord Adyen pour une " +"sécurité accrue (recommandé)." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:223 +msgctxt "adyen" +msgid "Merchant Account" +msgstr "Compte marchand" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:226 +msgid "" +"The merchant account identifier, with which you want to process the " +"transaction." +msgstr "" +"L’identifiant de compte marchand, avec lequel vous souhaitez traiter la " +"transaction." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:234 +msgctxt "adyen" +msgid "API Key" +msgstr "Clé API" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:237 +#, fuzzy +msgid "API key as mentioned in the payment provider dashboard." +msgstr "Clé API mentionnée dans le tableau de bord du fournisseur de paiement." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:241 +msgid "Adyen documentation: \"How to get the API key\"." +msgstr "Documentation Adyen: \"How to get the API key\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:250 +msgctxt "adyen" +msgid "API Live URL Prefix" +msgstr "Préfixe d'URL API Live" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:253 +#, fuzzy +msgid "" +"The unique prefix for the live API URL, as mentioned at Account » " +"API URLs in the Adyen dashboard." +msgstr "" +"Le préfixe unique pour l'URL API en direct, comme mentionné à compte " +"» URL API dans le tableau de bord Adyen." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:257 +msgid "Adyen documentation: \"Live URL prefix\"." +msgstr "Documentation Adyen : \"Live URL prefix\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:266 +msgctxt "adyen" +msgid "Origin Key" +msgstr "Clé d’origine" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:273 +msgid "" +"An origin key is a client-side key that is used to validate Adyen's " +"JavaScript component library. It is required for the Drop-in and Component " +"integrations." +msgstr "" +"Une clé d’origine est une clé côté client qui est utilisée pour valider la " +"bibliothèque de composants JavaScript d’Adyen. Il est nécessaire pour les " +"intégrations Drop-in et Component." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:277 +#, fuzzy +msgid "Adyen documentation: \"How to get an origin key\"." +msgstr "Documentation Adyen: \"How to get the API key\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:289 +msgid "Merchant Order Reference" +msgstr "Référence de l’ordre marchand" + +#. translators: %s: parameterName +#: vendor/wp-pay-gateways/adyen/src/Integration.php:294 +msgid "The Adyen %s parameter." +msgstr "Le Adyen paramètre %s." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:318 +#, fuzzy +msgctxt "adyen" +msgid "Apple Pay Merchant ID" +msgstr "ID du Marchand" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:321 +msgid "Your Apple Pay Merchant ID. Required for accepting live payments." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:325 +#, fuzzy +msgid "Adyen documentation: \"Apple Pay Drop-in - Before you begin\"." +msgstr "Documentation Adyen : \"Live URL prefix\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:327 +#, fuzzy +msgid "Apple documentation: \"Configuring your environment\"." +msgstr "Documentation Adyen: \"How to get the API key\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:336 +#, fuzzy +msgid "Apple Pay Merchant Identity Certificate" +msgstr "ID du Marchand" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:340 +msgid "" +"The Apple Pay Merchant Identity certificate required for secure " +"communication with Apple." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:344 +#, fuzzy +msgid "" +"Adyen documentation: \"Enable Apple Pay - Create a merchant identity " +"certificate\"." +msgstr "Documentation Adyen : \"Live URL prefix\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:353 +#, fuzzy +msgid "Apple Pay Merchant Identity Private Key" +msgstr "ID du Marchand" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:357 +msgid "" +"The private key of the Apple Pay Merchant Identity certificate for secure " +"communication with Apple." +msgstr "" +"La clé privée du certificat Apple Pay Merchant Identity pour une " +"communication sécurisée avec Apple." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:365 +msgctxt "adyen" +msgid "Apple Pay Merchant Identity Private Key Password" +msgstr "Apple Pay Merchant Identity Mot de passe clé privé" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:368 +msgid "Your Apple Pay Merchant Identity Certificate private key password." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:376 +msgctxt "adyen" +msgid "Google Pay Merchant ID" +msgstr "Google Pay Merchant ID" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:379 +msgid "Your Google Merchant ID. Required for accepting live payments." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:383 +#, fuzzy +msgid "Adyen documentation: \"Google Pay Drop-in - Test and go live\"." +msgstr "Documentation Adyen: \"How to get the API key\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:385 +msgid "Google documentation: \"Deploy production environment\"." +msgstr "Documentation Google: \"Deploy production environment\"." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:392 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:89 +#: vendor/wp-pay-gateways/mollie/src/Integration.php:187 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:245 +msgid "Webhook URL" +msgstr "URL Webhook" + +#. translators: %s: payment provider name +#. translators: %s: ING Kassa Compleet +#: vendor/wp-pay-gateways/adyen/src/Integration.php:399 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:96 +#, fuzzy +msgid "" +"Copy the Webhook URL to the %s dashboard to receive automatic transaction " +"status updates." +msgstr "" +"Copiez l'URL Webhook au tableau de bord %s pour recevoir des mises à jour " +"automatiques de l'état des transactions." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:400 +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:142 +#: vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php:39 +#: vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php:37 +msgid "Adyen" +msgstr "Adyen" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:412 +msgid "SSL Version" +msgstr "Version de SSL" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:414 +#, fuzzy +msgid "Choose the SSL Version of your server on the Adyen Customer Area." +msgstr "Choisissez la version SSL de votre serveur sur la zone client Adyen." + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:425 +msgctxt "adyen notification" +msgid "Method" +msgstr "Méthode" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:427 +msgid "JSON" +msgstr "JSON" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:433 +msgid "Authentication" +msgstr "Authentification" + +#. translators: %s: Pronamic Pay settings page URL. +#: vendor/wp-pay-gateways/adyen/src/Integration.php:437 +msgid "" +"Go to the Pronamic Pay settings page for webhook " +"authentication settings." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:481 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:397 +#, fuzzy +msgid "SHA Fingerprint" +msgstr "Empreinte digitale SHA" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:488 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:403 +msgid "M j, Y @ G:i" +msgstr "M j, Y @ G:i" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:491 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:406 +msgid "Valid From" +msgstr "Valide à partir de" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:496 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:411 +msgid "Valid To" +msgstr "Valide jusqu'au" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:505 +msgid "" +"Upload an Apple Pay Merchant Identity certificate, which can be exported " +"from Keychain Access on Mac as a PKCS#12 (*.p12) file." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:515 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:560 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:309 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:425 +msgid "Download" +msgstr "Télécharger" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:526 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:578 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:320 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:436 +msgid "Upload" +msgstr "Télécharger" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:572 +msgid "" +"Leave empty to auto fill when uploading an Apple Pay Merchant Identity " +"PKCS#12 certificate file." +msgstr "" +"Laissez vide pour remplir automatiquement lors du téléchargement d'un " +"fichier de certificat Apple Pay Merchant Identity PKCS#12." + +#. translators: %s: Help URL. +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:87 +msgid "HTTP Authorization header is missing, read %s for more information." +msgstr "" + +#. translators: Translate 'notification' the same as in the Adyen dashboard. +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:102 +msgctxt "Adyen" +msgid "Sorry, you are not allowed to post Adyen notifications." +msgstr "Désolé, vous n’êtes pas autorisé à poster des notifications Adyen." + +#. translators: Translate 'notification' the same as in the Adyen dashboard. +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:124 +msgctxt "Adyen" +msgid "Cannot parse JSON notification." +msgstr "Impossible d'inséquer la notification JSON." + +#. translators: %s: payment provider name +#. translators: %s: Buckaroo +#. translators: %s: EMS +#. translators: %s: ICEPAY +#. translators: %s: ING +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:141 +#: vendor/wp-pay-gateways/buckaroo/src/Listener.php:71 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php:34 +#: vendor/wp-pay-gateways/icepay/src/Listener.php:48 +#: vendor/wp-pay-gateways/ideal-basic/src/Listener.php:36 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php:46 +#: vendor/wp-pay-gateways/mollie/src/WebhookController.php:108 +msgid "Webhook requested by %s." +msgstr "Webhook demandé par %s." + +#. translators: %s: item index +#: vendor/wp-pay-gateways/adyen/src/PaymentRequestHelper.php:104 +#: vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php:165 +msgid "Item %s" +msgstr "Article %s" + +#. translators: %s: payment provider name +#: vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php:38 +#: vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php:36 +msgid "Verified payment result." +msgstr "Résultat de paiement vérifié." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:56 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:73 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:90 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:204 +msgid "Payment ID." +msgstr "ID de paiement." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:112 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:263 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:426 +msgid "No payment ID given in `payment_id` parameter." +msgstr "Aucun ID de paiement donné dans le paramètre `payment_id`." + +#. translators: %s: payment ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:123 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:274 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:437 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:254 +#, fuzzy +msgid "Could not find payment with ID `%s`." +msgstr "Impossible de trouver le paiement avec ID `%s`." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:136 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:287 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:450 +msgid "No data given in request body." +msgstr "Aucune donnée fournie dans le corps de la demande." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:146 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:297 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:460 +#, fuzzy +msgid "No gateway configuration ID given in payment." +msgstr "" +"Aucun ID de configuration de passerelle donné dans le paramètre 'config'id'." + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:157 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:308 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:471 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:288 +#, fuzzy +msgid "Could not find gateway with ID `%s`." +msgstr "Impossible de trouver passerelle avec ID `%s`." + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:169 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:320 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:483 +#, fuzzy +msgid "Could not find client in gateway with ID `%s`." +msgstr "Impossible de trouver le client dans la passerelle avec ID `%s`." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:181 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:331 +msgid "No payment method given." +msgstr "Aucun mode de paiement donné." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:191 +#, fuzzy +msgid "Gateway does not support method to create payment." +msgstr "Cette passerelle ne prend pas en charge l'enregistrement webhook." + +#. translators: 1: error message, 2: error code +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:205 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:368 +msgid "%1$s (error %2$s)" +msgstr "%1$s (erreur %2$s)" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:354 +#, fuzzy +msgid "Gateway does not support sending additional payment details." +msgstr "Cette passerelle ne prend pas en charge l'enregistrement webhook." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:500 +msgid "Apple Pay merchant identifier not configured in gateway settings." +msgstr "" +"Identifiant marchand Apple Pay non configuré dans les paramètres de " +"passerelle." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:507 +msgid "No Apple Pay merchant validation URL given." +msgstr "Aucune URL de validation Apple Pay marchand donnée." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:532 +msgid "Invalid Apple Pay Merchant Identity configuration." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:540 +#, fuzzy +msgid "Error creating merchant identity files." +msgstr "Erreur obtenant le résultat de paiement: %s" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:610 +#, fuzzy +msgid "Error reading merchant identity files." +msgstr "Erreur obtenant le résultat de paiement: %s" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:55 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:222 +msgid "Gateway configuration ID." +msgstr "ID de configuration de passerelle." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:59 +msgid "Payload." +msgstr "Charge." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:63 +msgid "Result code." +msgstr "Code de résultat." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:67 +msgid "Result text." +msgstr "Texte de résultat." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:87 +#, fuzzy +msgid "No gateway configuration ID given in `config_id` parameter." +msgstr "" +"Aucun ID de configuration de passerelle donné dans le paramètre 'config'id'." + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:96 +msgid "No payload given in `payload` parameter." +msgstr "Aucune charge utile donnée dans le paramètre `payload`." + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:108 +msgid "Could not found gateway with ID `%s`." +msgstr "Impossible de trouver passerelle avec ID `%s`." + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:120 +msgid "Could not found client in gateway with ID `%s`." +msgstr "Impossible de trouver le client dans la passerelle avec ID `%s`." + +#. translators: %s: Adyen merchant reference +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:142 +msgid "Could not found payment with ID `%s`." +msgstr "Impossible de trouver le paiement avec ID `%s`." + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:63 +msgid "HTTP Authorization header test" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:87 +msgid "HTTP Basic authentication is working" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:90 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:171 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:252 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:288 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:321 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:350 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:497 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:931 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:932 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:535 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:169 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:50 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:52 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:63 +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:46 +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:62 +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:127 +#: vendor/wp-pay/core/views/pointer-payments.php:12 +msgid "Payments" +msgstr "Paiements" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:95 +msgid "" +"HTTP Basic authentication is required to securely receive Adyen " +"notifications." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:117 +msgid "Could not reach HTTP Authorization header test endpoint." +msgstr "" +"N’a pas pu atteindre le point de terminaison de test de l’en-tête HTTP " +"Authorization." + +#: vendor/wp-pay-gateways/adyen/views/checkout-drop-in.php:19 +#: vendor/wp-pay-gateways/adyen/views/checkout-web-sdk.php:19 +msgid "Checkout" +msgstr "Commander" + +#: vendor/wp-pay-gateways/buckaroo/src/Client.php:459 +msgid "Unable to retrieve issuers from Buckaroo." +msgstr "Impossible de récupérer les émetteurs de Buckaroo." + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:217 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:335 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:593 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:53 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:29 +msgid "Payment" +msgstr "Paiement" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:219 +msgid "Status Code" +msgstr "Code d'état" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:220 +msgid "Status Code Detail" +msgstr "Détail du code de statut" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:221 +msgid "Status Message" +msgstr "Message d'état" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:222 +msgid "Invoice Number" +msgstr "Numéro de facture" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:224 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:263 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:440 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:474 +msgid "Currency" +msgstr "Devise" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:225 +msgid "Timestamp" +msgstr "Horodatage" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:226 +#, fuzzy +msgid "Service iDEAL Consumer Issuer" +msgstr "Service iDEAL Consumer Issuer" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:227 +#, fuzzy +msgid "Service iDEAL Consumer Name" +msgstr "Nom de consommateur iDEAL service" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:228 +#, fuzzy +msgid "Service iDEAL Consumer IBAN" +msgstr "Service iDEAL Consumer IBAN" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:229 +#, fuzzy +msgid "Service iDEAL Consumer BIC" +msgstr "Service iDEAL Consumer BIC" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:230 +msgid "Transactions" +msgstr "Transactions" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:236 +msgid "Buckaroo data:" +msgstr "Données Buckaroo:" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:30 +msgid "http://www.buckaroo-payments.com" +msgstr "https://buckaroo.eu" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:38 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-buckaroo-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:60 +msgid "Website Key" +msgstr "Clé du site Web" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:63 +#, fuzzy +msgid "" +"Website key as mentioned in the Buckaroo dashboard on the page \"Profile » " +"Website\"." +msgstr "" +"Clé du site Web mentionnée dans le tableau de bord Buckaroo sur la page " +"\"Profile\" Website.com." + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:71 +msgid "Secret Key" +msgstr "Clé secrète" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:74 +#, fuzzy +msgid "" +"Secret key as mentioned in the Buckaroo dashboardb on the page " +"\"Configuration » Secret Key for Digital Signature\"." +msgstr "" +"Clé secrète mentionnée dans le tableau de bord Buckaroo b sur la page " +"\"Configuration\" Secret Key for Digital Signature\"." + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:82 +msgid "Excluded services" +msgstr "Services exclus" + +#. translators: %s: brq_exludedservices +#. translators: %s: brq_invoicenumber +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:87 +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:102 +msgid "This controls the Buckaroo %s parameter." +msgstr "Cela contrôle le paramètre Buckaroo %s." + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:97 +msgid "Invoice number" +msgstr "Numéro de facture" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:117 +msgid "Push URL" +msgstr "Push URL" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:122 +#, fuzzy +msgid "" +"The Push URL as sent with each transaction to receive automatic payment " +"status updates on." +msgstr "" +"L'URL Push telle qu'envoyée à chaque transaction pour recevoir des mises à " +"jour automatiques de l'état des paiements." + +#: vendor/wp-pay-gateways/buckaroo/src/Listener.php:72 +msgid "Buckaroo" +msgstr "Buckaroo" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:179 +msgid "Approval code" +msgstr "Code d'approbation" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:181 +msgctxt "creditcard" +msgid "Reference number" +msgstr "N° de référence" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:182 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:201 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:261 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:327 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:328 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:285 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:286 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:545 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:518 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:216 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:44 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:43 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:26 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:27 +msgid "Status" +msgstr "Statut" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:183 +msgid "Time of transaction processing" +msgstr "Temps de traitement des transactions" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:184 +msgid "Identification for transaction" +msgstr "Identification pour transaction" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:185 +msgid "Fail reason" +msgstr "Raison d'échec" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:186 +msgid "Response hash" +msgstr "Hash de réponse" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:187 +msgid "Processor response code" +msgstr "Code de réponse du processeur" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:188 +msgid "Fail code" +msgstr "Code d'échec" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:189 +msgid "Terminal ID" +msgstr "ID terminal" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:190 +msgid "Creditcard issuing bank" +msgstr "Banque émettrice de cartes de crédit" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:191 +msgid "Creditcard country" +msgstr "Pays de carte de crédit" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:192 +msgid "Creditcard brand" +msgstr "Marque de carte de crédit" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:198 +#, fuzzy +msgid "EMS e-Commerce transaction data in response message:" +msgstr "Données de transaction e-Commerce EMS dans le message de réponse :" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:40 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ems-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:62 +msgctxt "ems" +msgid "Storename" +msgstr "Storename" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:72 +msgctxt "ems" +msgid "Shared Secret" +msgstr "Secret partagé" + +#. translators: %s: {orderId} +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:90 +msgid "The EMS e-Commerce %s parameter." +msgstr "Le paramètre EMS e-Commerce %s." + +#. translators: Translate 'notification' the same as in the EMS e-Commerce dashboard. +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:113 +msgctxt "EMS e-Commerce" +msgid "Notification URL" +msgstr "URL de notification" + +#. translators: Translate 'notification' the same as in the EMS e-Commerce dashboard. +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:119 +#, fuzzy +msgctxt "EMS e-Commerce" +msgid "" +"The Notification URL as sent with each transaction to receive automatic " +"payment status updates on." +msgstr "" +"L'URL de notification envoyée à chaque transaction pour recevoir des mises à " +"jour automatiques de l'état des paiements." + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php:35 +msgid "EMS" +msgstr "EMS" + +#: vendor/wp-pay-gateways/icepay/src/Gateway.php:126 +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:94 +msgctxt "Payment method name" +msgid "AMEX" +msgstr "American Express" + +#: vendor/wp-pay-gateways/icepay/src/Gateway.php:130 +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:96 +msgctxt "Payment method name" +msgid "MASTER" +msgstr "MasterCard" + +#: vendor/wp-pay-gateways/icepay/src/Gateway.php:134 +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:97 +msgctxt "Payment method name" +msgid "VISA" +msgstr "Visa" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:30 +msgid "https://icepay.com/nl/en/pricing-and-accounts/" +msgstr "https://icepay.fr/compte-et-tarifs/" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:31 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-icepay-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:59 +msgctxt "icepay" +msgid "Merchant ID" +msgstr "ID du Marchand" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:61 +#, fuzzy +msgid "" +"Merchant ID as mentioned in the ICEPAY dashboard at the \"My websites\" page." +msgstr "" +"ID marchand mentionné dans le tableau de bord ICEPAY sur la page \" Mes " +"sites Web \"." + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:69 +msgctxt "icepay" +msgid "Secret Code" +msgstr "Code secret" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:72 +#, fuzzy +msgid "" +"Secret Code as mentioned in the ICEPAY dashboard at the \"My websites\" page." +msgstr "" +"Code secret tel que mentionné dans le tableau de bord ICEPAY à la page \"Mes " +"sites Web\"." + +#. translators: %s: OrderID +#: vendor/wp-pay-gateways/icepay/src/Integration.php:88 +msgid "The Icepay %s parameter." +msgstr "Le paramètre Icepay %s." + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:110 +msgid "Thank you page URL" +msgstr "Merci page URL" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:120 +msgid "Error page URL" +msgstr "URL de la page d'erreur" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:130 +msgid "Postback URL" +msgstr "Postback URL" + +#: vendor/wp-pay-gateways/icepay/src/Listener.php:49 +msgid "ICEPAY" +msgstr "ICEPAY" + +#. translators: %s: response code +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php:163 +msgid "" +"The response code (%s) from the iDEAL provider was incorrect." +msgstr "" +"Le code de réponse (%s) du fournisseur iDEAL était incorrect." + +#. translators: %s: XML document element name +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php:208 +msgid "Unknwon iDEAL message (%s)" +msgstr "Réponse inconnue de iDEAL (%s)" + +#. translators: %s: exception message +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php:189 +#, fuzzy +msgid "Error getting payment status: %s" +msgstr "Erreur obtenant le résultat de paiement: %s" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:38 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:39 +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:29 +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:30 +msgid "https://www.ideal.nl/en/" +msgstr "https://www.ideal.nl/en/" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:77 +msgid "Private key and certificate" +msgstr "Clé privée et certificat" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:88 +msgid "Organization" +msgstr "Organisation" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:90 +msgid "Organization name, e.g. Pronamic" +msgstr "Nom de l'organisation, p. ex. Pronamic" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:99 +msgid "Organization Unit" +msgstr "Unité de l'organisation" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:101 +msgid "Organization unit, e.g. Administration" +msgstr "Unité d'organisation, p. ex. Administration" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:112 +msgid "City, e.g. Amsterdam" +msgstr "Ville, p. ex. Amsterdam" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:121 +msgid "State / province" +msgstr "État / province" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:123 +msgid "State or province, e.g. Friesland" +msgstr "État ou province, p. ex. Île-de-France" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:140 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:146 +msgid "2 letter country code, e.g." +msgstr "Code de pays de 2 lettres, p. ex. FR" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:157 +msgid "E-mail address" +msgstr "Adresse e-mail" + +#. translators: %s: admin email +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:160 +msgid "E-mail address, e.g. %s" +msgstr "Adresse e-mail, p. ex. %s" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:172 +msgid "Number Days Valid" +msgstr "Nombre jours valides" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:175 +#, fuzzy +msgid "" +"Number of days the generated certificate will be valid for, e.g. 1825 days " +"for the maximum duration of 5 years." +msgstr "" +"Nombre de jours pour le certificat généré sera valide, par exemple 1825 " +"jours pour la durée maximale de 5 ans." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:184 +msgid "Private Key Password" +msgstr "Mot de passe clé privé" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:188 +#, fuzzy +msgid "" +"A random password which will be used for the generation of the private key " +"and certificate." +msgstr "" +"Un mot de passe aléatoire qui sera utilisé pour la génération de la clé " +"privée et le certificat." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:197 +msgid "Private Key" +msgstr "Clé privée" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:201 +#, fuzzy +msgid "" +"The private key is used for secure communication with the payment provider. " +"If left empty, the private key will be generated using the given private key " +"password." +msgstr "" +"La clé privée est utilisée pour une communication sécurisée avec le " +"fournisseur de paiement. Si elle est laissée vide, la clé privée sera " +"générée à l'aide du mot de passe clé privé donné." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:210 +msgid "Private Certificate" +msgstr "Certificat privé" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:214 +#, fuzzy +msgid "" +"The certificate is used for secure communication with the payment provider. " +"If left empty, the certificate will be generated using the private key and " +"given organization details." +msgstr "" +"Le certificat est utilisé pour une communication sécurisée avec le " +"fournisseur de paiement. S'il est laissé vide, le certificat sera généré à " +"l'aide de la clé privée et des détails de l'organisation donnés." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:237 +msgid "The private key and certificate have not yet been configured." +msgstr "La clé privée et le certificat n'ont pas encore été configurés." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:242 +#, fuzzy +msgid "" +"A private key and certificate are required for communication with the " +"payment provider. Enter the organization details from the iDEAL account " +"below to generate these required files." +msgstr "" +"Une clé privée et un certificat sont requis pour la communication avec le " +"fournisseur de paiement. Entrez les détails de l'organisation à partir du " +"compte iDEAL ci-dessous pour générer les fichiers requis." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:247 +#, fuzzy +msgid "" +"A private key and certificate have been configured. The certificate must be " +"uploaded to the payment provider dashboard to complete configuration." +msgstr "" +"Une clé privée et un certificat ont été configurés. Le certificat doit être " +"téléchargé sur le tableau de bord du fournisseur de paiement pour compléter " +"la configuration." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:255 +msgid "Download certificate" +msgstr "Télécharger le certificat" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:281 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:343 +msgid "ideal.key" +msgstr "ideal.key" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:292 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:379 +msgid "OpenSSL command" +msgstr "Commande OpenSSL" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:299 +#, fuzzy +msgid "" +"Leave empty and save the configuration to generate the private key or view " +"the OpenSSL command." +msgstr "" +"Laissez vide et enregistrez la configuration pour générer la clé privée ou " +"afficher la commande OpenSSL." + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:344 +msgid "ideal.cer" +msgstr "ideal.cer" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:386 +#, fuzzy +msgid "" +"Leave empty and save the configuration to generate the certificate or view " +"the OpenSSL command." +msgstr "" +"Laissez vide et enregistrez la configuration pour générer le certificat ou " +"afficher la commande OpenSSL." + +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:66 +msgid "Hash Key" +msgstr "Clé de hash" + +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:69 +#, fuzzy +msgid "" +"Hash key (also known as: key or secret key) as mentioned in the payment " +"provider dashboard." +msgstr "" +"Clé de hh (également connue sous le nom de clé ou clé secrète) comme " +"mentionné dans le tableau de bord du fournisseur de paiement." + +#. translators: Translate 'XML notification URL' the same as in the iDEAL Basic dashboard. +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:77 +msgctxt "iDEAL Basic dashboard" +msgid "XML Notification URL" +msgstr "URL de notification XML" + +#. translators: Translate 'XML notification URL' the same as in the iDEAL Basic dashboard. +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:91 +#, fuzzy +msgctxt "iDEAL Basic dashboard" +msgid "" +"Copy the XML notification URL to the payment provider dashboard to receive " +"automatic transaction status updates." +msgstr "" +"Copiez l'URL de notification XML au tableau de bord du fournisseur de " +"paiement pour recevoir les mises à jour automatiques de l'état des " +"transactions." + +#: vendor/wp-pay-gateways/ideal-basic/src/Listener.php:37 +msgid "iDEAL Basic" +msgstr "iDEAL Basic" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:26 +msgid "Merchant ID" +msgstr "ID du Marchand" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:31 +msgid "Merchant ID (or Acceptant ID)" +msgstr "ID marchand (ou acceptant ID)" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:32 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:55 +msgid "as mentioned in the payment provider dashboard" +msgstr "comme mentionné dans le tableau de bord du fournisseur de paiement" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:43 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:54 +msgid "Sub ID" +msgstr "Sous-ID" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:64 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:91 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:752 +msgid "Purchase ID" +msgstr "ID d'achat" + +#. translators: %s: purchaseID +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:69 +msgid "The iDEAL %s parameter." +msgstr "Le paramètre iDEAL %s." + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:45 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ing-kassa-compleet-with-" +"wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:72 +msgctxt "ing_kassa_compleet" +msgid "API Key" +msgstr "Clé API" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:77 +msgid "API key" +msgstr "Clé API" + +#. translators: %s: ING Kassa Compleet +#. translators: %s: payment provider name +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:80 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:68 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:84 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:100 +msgid "as mentioned in the %s dashboard" +msgstr "comme mentionné dans le tableau de bord %s" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:81 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:97 +msgid "ING Kassa Compleet" +msgstr "ING Kassa Compleet" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php:47 +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:64 +msgid "ING" +msgstr "ING" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:142 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:143 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:275 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:306 +#: vendor/wp-pay-gateways/mollie/src/WebhookController.php:109 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:33 +msgid "Mollie" +msgstr "Mollie" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:152 +msgid "Mollie Profiles" +msgstr "Profils Mollie" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:153 +msgid "Profiles" +msgstr "Profils" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:161 +msgid "Mollie Customers" +msgstr "Clients Mollie" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:162 +msgid "Customers" +msgstr "Clients" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:170 +msgid "Mollie Payments" +msgstr "Paiements Mollie" + +#. translators: 1: Mollie chargeback ID, 2: Mollie payment ID +#: vendor/wp-pay-gateways/mollie/src/Gateway.php:743 +msgid "Subscription put on hold due to chargeback `%1$s` of payment `%2$s`." +msgstr "" + +#. translators: 1: old mandate ID, 2: new mandate ID +#: vendor/wp-pay-gateways/mollie/src/Gateway.php:782 +#, fuzzy +msgid "Mandate for subscription changed from \"%1$s\" to \"%2$s\"." +msgstr "Le statut d'abonnement est passé de \"%1$s\" à \"%2$s\"." + +#. translators: 1: old payment method, 2: new payment method +#: vendor/wp-pay-gateways/mollie/src/Gateway.php:810 +#, fuzzy +msgid "Payment method for subscription changed from \"%1$s\" to \"%2$s\"." +msgstr "Le statut de paiement est passé de \"%1$s\" à \"%2$s\"." + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:57 +msgid "https://www.mollie.com/en/pricing" +msgstr "https://www.mollie.com/fr/pricing" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:158 +msgctxt "mollie" +msgid "API Key" +msgstr "Clé API" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:161 +#, fuzzy +msgid "API key as mentioned in the payment provider dashboard" +msgstr "Clé API mentionnée dans le tableau de bord du fournisseur de paiement" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:169 +msgctxt "mollie" +msgid "Due date days" +msgstr "Jours d'échéance" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:174 +msgid "Number of days after which a bank transfer payment expires." +msgstr "Nombre de jours après l’expiration d’un paiement de virement bancaire." + +#. translators: 1: 1, 2: 100, 3: 12 +#: vendor/wp-pay-gateways/mollie/src/Integration.php:177 +msgid "Minimum %1$s and maximum %2$s days. Default: %3$s days." +msgstr "Minimum %1$s et maximum %2$s jours. Par défaut : %3$s jours." + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:192 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:250 +#, fuzzy +msgid "" +"The Webhook URL as sent with each transaction to receive automatic payment " +"status updates on." +msgstr "" +"L'URL Webhook envoyée à chaque transaction pour recevoir des mises à jour " +"automatiques de l'état des paiements." + +#. translators: %s: Mollie payment ID anchor. +#: vendor/wp-pay-gateways/mollie/views/meta-box-payment.php:39 +msgid "Payment: %s" +msgstr "Paiement: %s" + +#. translators: %s: Mollie customer ID anchor. +#: vendor/wp-pay-gateways/mollie/views/meta-box-payment.php:67 +#: vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php:37 +msgid "Customer: %s" +msgstr "Client: %s" + +#. translators: %s: Mollie mandate ID +#: vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php:68 +msgid "Mandate: %s" +msgstr "Mandat: %s" + +#. translators: %s: Mollie customer ID. +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:99 +msgid "Customer %s" +msgstr "Client %s " + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:116 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:199 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:432 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:64 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:52 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:84 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:44 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:28 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:35 +msgid "ID" +msgstr "ID" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:122 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:200 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:850 +msgid "Mode" +msgstr "Mode" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:124 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:231 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:53 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:274 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:746 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:145 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:292 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:861 +msgid "Test" +msgstr "Test" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:124 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:235 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:146 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:857 +msgid "Live" +msgstr "Live" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:153 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:527 +msgid "Locale" +msgstr "Lieu" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:171 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:70 +msgid "Link" +msgstr "Lien" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:194 +msgid "Mandates" +msgstr "Mandats" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:202 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:431 +msgid "Method" +msgstr "Méthode" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:203 +msgid "Details" +msgstr "Détails " + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:204 +msgid "Mandate Reference" +msgstr "Référence du mandat" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:205 +msgid "Signature Date" +msgstr "Date de signature" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:206 +msgid "Created On" +msgstr "Créé le" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:215 +msgid "No mandates found." +msgstr "Aucun mandat n’a été trouvé." + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:251 +msgid "Pending" +msgstr "En attente" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:255 +#: vendor/wp-pay/core/src/LicenseManager.php:245 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:341 +#: vendor/wp-pay/core/views/tab-system_status.php:36 +msgid "Valid" +msgstr "Valide" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:296 +msgid "Card Holder" +msgstr "Titulaire de la carte" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:305 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:267 +msgid "Card Number" +msgstr "Numéro de la carte" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:314 +msgid "Card Label" +msgstr "Étiquette de carte" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:323 +msgid "Card Fingerprint" +msgstr "Empreinte digitale de la carte" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:332 +msgid "Card Expiry Date" +msgstr "Date d'expiration" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:348 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:607 +msgid "Consumer Name" +msgstr "Nom du consommateur" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:357 +#, fuzzy +msgid "Consumer Account" +msgstr "Numéro de compte du consommateur" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:366 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:634 +msgid "Consumer BIC" +msgstr "Consommateur BIC" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:427 +msgid "WordPress Users" +msgstr "Utilisateurs WordPress" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:434 +msgid "Display Name" +msgstr "Afficher le nom" + +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:100 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:107 +#, fuzzy +msgid "Change Payment State" +msgstr "Vérifier l'état des paiement" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:46 +msgctxt "mollie" +msgid "Customers" +msgstr "Clients" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:84 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:344 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:119 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:126 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:133 +msgid "Yes" +msgstr "Oui" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:84 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:344 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:119 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:126 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:133 +msgid "No" +msgstr "Non" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:110 +msgid "" +"Mollie offers the possibility to register payers as a customer within the " +"Mollie payment platform. This functionality remembers payment preferences to " +"make future payments easier. The Mollie customers can be linked to WordPress " +"users. This is a list of Mollie customers associated with this WordPress " +"user. For subscriptions, a Mollie customer mandate can be used for recurring " +"payments." +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:95 +msgctxt "Payment method name" +msgid "Maestro" +msgstr "Maestro" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:30 +msgid "http://www.multisafepay.com/" +msgstr "https://www.multisafepay.com/be_fr/" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:38 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-multisafepay-with-wordpress-" +"via-pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:61 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:66 +msgid "Account ID" +msgstr "ID de compte" + +#. translators: %s: payment provider name +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:68 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:84 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:100 +msgid "MultiSafepay" +msgstr "MultiSafepay" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:77 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:82 +msgid "Site ID" +msgstr "Identifiant du site" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:93 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:98 +msgid "Site Security Code" +msgstr "Code de sécurité du site" + +#: vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php:15 +msgid "https://payment-services.ingenico.com/nl/en" +msgstr "https://www.ingenico.fr" + +#: vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php:16 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ingenico-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/ogone/src/Listener.php:42 +msgid "Webhook requested." +msgstr "Webhook demandé." + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:266 +msgid "Acceptance" +msgstr "Acceptation" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:268 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:691 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:153 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:32 +msgid "End Date" +msgstr "Date de fin" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:269 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:553 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:543 +msgid "Customer Name" +msgstr "Nom du client" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:270 +msgid "Transaction Date" +msgstr "Date de transaction" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:271 +msgid "Pay ID" +msgstr "Pay ID" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:272 +msgid "NC Error" +msgstr "NC Error" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:273 +msgid "Brand" +msgstr "Marque" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:274 +msgid "IP" +msgstr "IP" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:275 +msgid "SHA Signature" +msgstr "Signature SHA" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:281 +#, fuzzy +msgid "Ogone transaction data in response message:" +msgstr "Données de transaction Ogone dans le message de réponse :" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:32 +#, fuzzy +msgid "" +"Account details are provided by the payment provider after registration. " +"These settings need to match with the payment provider dashboard." +msgstr "" +"Les détails du compte sont fournis par le fournisseur de paiement après " +"l'enregistrement. Ces paramètres doivent correspondre avec le tableau de " +"bord du fournisseur de paiement." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:40 +msgid "PSPID" +msgstr "PSPID" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:43 +#, fuzzy +msgid "PSPID as mentioned in the payment provider dashboard." +msgstr "" +"PSPID comme mentionné dans le tableau de bord du fournisseur de paiement." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:51 +msgid "API user ID" +msgstr "ID utilisateur API" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:54 +#, fuzzy +msgid "" +"User ID of the API user in the payment provider dashboard: Configuration " +"» Users" +msgstr "" +"ID utilisateur de l'utilisateur API dans le tableau de bord du fournisseur " +"de paiement : Configuration 'raquo; Utilisateurs" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:62 +msgid "API user password" +msgstr "Mot de passe utilisateur API" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:65 +#, fuzzy +msgid "" +"Password of the API user in the payment provider dashboard: Configuration " +"» Users" +msgstr "" +"Mot de passe de l'utilisateur de l'API dans le tableau de bord du " +"fournisseur de paiement : Configuration 'raquo; Utilisateurs" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:74 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:87 +#, fuzzy +msgid "SHA-IN Pass phrase" +msgstr "PHRASE SHA-IN Pass" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:77 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:90 +#, fuzzy +msgid "" +"SHA-IN pass phrase as mentioned in the payment provider dashboard: " +"Configuration » Technical information » Data and origin " +"verification." +msgstr "" +"EXPRESSION de passage SHA-IN mentionnée dans le tableau de bord du " +"fournisseur de paiement : Configuration 'raquo; Informations techniques " +"'raquo; Vérification des données et de l'origine." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:99 +#, fuzzy +msgid "SHA-OUT Pass phrase" +msgstr "Phrase SHA-OUT Pass" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:102 +#, fuzzy +msgid "" +"SHA-OUT pass phrase as mentioned in the payment provider dashboard: " +"Configuration » Technical information » Transaction feedback." +msgstr "" +"EXPRESSION de passage SHA-OUT mentionnée dans le tableau de bord du " +"fournisseur de paiement : Configuration 'raquo; Informations techniques " +"'raquo; Commentaires sur les transactions." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:110 +msgid "Hash algorithm" +msgstr "Algorithme de hachage" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:114 +msgid "SHA-1" +msgstr "SHA-1" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:115 +msgid "SHA-256" +msgstr "SHA-256" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:116 +msgid "SHA-512" +msgstr "SHA-512" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:127 +msgid "3-D Secure" +msgstr "3-D Secure" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:129 +msgid "Enable 3-D Secure protocol" +msgstr "Activer le protocole 3D Secure" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:149 +msgid "Form Action URL" +msgstr "URL d'action de forme" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:152 +#, fuzzy +msgid "" +"With this setting you can override the default Ingenico e-Commerce form " +"action URL to the payment processing page." +msgstr "" +"Avec ce paramètre, vous pouvez remplacer l'URL d'action de formulaire " +"Ingenico e-Commerce par défaut à la page de traitement des paiements." + +#. translators: %s: ORDERID +#. translators: %s: PARAMVAR +#. translators: %s: ALIASUSAGE +#. translators: %s: TP +#: vendor/wp-pay-gateways/ogone/src/Settings.php:166 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:194 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:225 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:241 +msgid "The Ingenico %s parameter." +msgstr "Le paramètre Ingenico %s." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:189 +msgid "Parameter Variable" +msgstr "Parameter Variable" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:209 +msgid "Alias" +msgstr "Alias" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:211 +msgid "Enable alias registration" +msgstr "Activer l'enregistrement des alias" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:212 +#, fuzzy +msgid "" +"Enable alias creation as reference for batch payments. Requires the Alias " +"Manager option (`REQ1`) to be enabled for the Ingenico account." +msgstr "" +"Activer la création d'alias comme référence pour les paiements par lots. " +"Nécessite l'option Alias Manager ('REQ1') pour être activée pour le compte " +"Ingenico." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:220 +msgid "Alias Usage" +msgstr "Utilisation d'alias" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:228 +#, fuzzy +msgid "Description on payment page of how aliases are used." +msgstr "" +"Description sur la page de paiement de la façon dont les alias sont utilisés." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:236 +msgid "Template Page" +msgstr "Page de modèle" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:252 +#, fuzzy +msgid "" +"The URLs below need to be copied to the payment provider dashboard to " +"receive automatic transaction status updates." +msgstr "" +"Les URL ci-dessous doivent être copiées sur le tableau de bord du " +"fournisseur de paiement pour recevoir des mises à jour automatiques de " +"l'état des transactions." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:258 +msgid "URL accepted, on hold or uncertain" +msgstr "URL acceptée, en attente ou incertaine" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:262 +#, fuzzy +msgid "" +"Direct HTTP server-to-server request URL for payment statuses accepted, on " +"hold or uncertain\"." +msgstr "" +"URL de demande directe de serveur à serveur pour les statuts de paiement " +"acceptés, en attente ou incertains\"." + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:269 +msgid "URL cancel or deny" +msgstr "URL annuler ou refuser" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:273 +#, fuzzy +msgid "" +"Direct HTTP server-to-server request URL for payment statuses \"cancelled by " +"the client\" or \"too many rejections by the acquirer\"." +msgstr "" +"UrL de demande directe de serveur à serveur pour les statuts de paiement " +"\"annulés par le client\" ou \"trop de rejets par l'acquéreur\"." + +#: vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php:255 +msgid "OmniKassa 2.0 return URL requested:" +msgstr "OmniKassa 2.0 URL de retour demandé:" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php:337 +msgid "OmniKassa 2.0 webhook URL requested:" +msgstr "OmniKassa 2.0 webhook URL demandé:" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:48 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-rabo-omnikassa-2-0-with-" +"wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-rabobank-ideal-professional-" +"v3-with-wordpress-via-pronamic-pay/" + +#. translators: 1: Pronamic Pay, 2: Documentation link, 3: .test +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:147 +msgid "" +"%1$s — OmniKassa 2 does not accept payments from %3$s " +"environments." +msgstr "" +"%1$s — OmniKassa 2 n’accepte pas les paiements en " +"provenance d’environnements %3$s." + +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:188 +msgctxt "omnikassa" +msgid "Refresh Token" +msgstr "Rafraîchir Données" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:198 +msgctxt "omnikassa" +msgid "Signing Key" +msgstr "Clé de signature" + +#. translators: %s: merchantOrderId +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:215 +#, fuzzy +msgid "This setting defines the OmniKassa 2.0 %s field." +msgstr "Ce paramètre définit le champ OmniKassa 2.0 %s." + +#. translators: %s: merchantOrderId +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:222 +#, fuzzy +msgid "" +"The OmniKassa 2.0 %s field must consist strictly of 24 alphanumeric " +"characters, other characters, such as \".\", \"@\", \" \" (space), etc. are " +"not allowed." +msgstr "" +"Le champ OmniKassa 2.0 %s doit se composer strictement de 24 caractères " +"alphanumériques, d'autres caractères, tels que \".\",\" \" , \" \" " +"\" (espace), etc. ne sont pas autorisés." + +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:93 +msgid "Unknown response from Pay.nl." +msgstr "Réponse inconnue de Pay.nl." + +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:109 +msgid "Unknown response from Pay.nl error." +msgstr "Réponse inconnue de Pay.nl erreur." + +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:126 +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:219 +msgid "Unknown Pay.nl error." +msgstr "Erreur de Pay.nl inconnue." + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:34 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-pay-nl-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#. translators: 1: payment provider name +#. translators: %s: Sisow +#. translators: 1: TargetPay +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:55 +#: vendor/wp-pay-gateways/sisow/src/Integration.php:101 +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:53 +#, fuzzy +msgid "" +"Account details are provided by %1$s after registration. These settings need " +"to match with the %1$s dashboard." +msgstr "" +"Les détails du compte sont fournis par %1$s après inscription. Ces " +"paramètres doivent correspondre avec le tableau de bord %1$s." + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:56 +msgid "Pay.nl" +msgstr "Pay.nl" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:65 +msgid "Token" +msgstr "Jeton" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:68 +#, fuzzy +msgid "" +"Token as mentioned at Merchant » Company data (Connection) " +"in the payment provider dashboard." +msgstr "" +"Jeton tel que mentionné à Merchant » Données de la société " +"(Connection) dans le tableau de bord du fournisseur de paiement." + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:76 +msgid "Service ID" +msgstr "Frais de service" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:79 +#, fuzzy +msgid "" +"Service ID as mentioned at Manage » Services in the payment " +"provider dashboard." +msgstr "" +"ID de service mentionné chez Manage » Services dans le " +"tableau de bord du fournisseur de paiement." + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:42 +#: vendor/wp-pay-gateways/paypal/src/Integration.php:43 +#, fuzzy +msgid "https://www.paypal.com/" +msgstr "https://www.adyen.com/fr_FR/" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:45 +#, fuzzy +msgid "https://www.pronamic.eu/manuals/using-paypal-pronamic-pay/" +msgstr "https://www.pronamic.eu/plugins/pronamic-ideal/" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:94 +msgctxt "paypal" +msgid "Email" +msgstr "E-mail" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:97 +msgid "Enter your PayPal account's email." +msgstr "" + +#: vendor/wp-pay-gateways/paypal/src/NotificationsController.php:49 +#, fuzzy +msgid "PayPal gateway configuration ID." +msgstr "ID de configuration de passerelle." + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:62 +#: vendor/wp-pay/core/src/Cards.php:103 +msgid "ABN Amro" +msgstr "ABN Amro" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:63 +#: vendor/wp-pay/core/src/Cards.php:138 +msgid "Rabobank" +msgstr "Rabobank" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:65 +#: vendor/wp-pay/core/src/Cards.php:148 +msgid "SNS Bank" +msgstr "SNS Bank" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:66 +#: vendor/wp-pay/core/src/Cards.php:108 +msgid "ASN Bank" +msgstr "ASN Bank" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:67 +#: vendor/wp-pay/core/src/Cards.php:143 +msgid "RegioBank" +msgstr "RegioBank" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:68 +#: vendor/wp-pay/core/src/Cards.php:153 +msgid "Triodos Bank" +msgstr "Triodos Bank" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:69 +#: vendor/wp-pay/core/src/Cards.php:128 +msgid "Knab" +msgstr "Knab" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:70 +msgid "Van Lanschot Bankiers" +msgstr "Van Lanschot Bankiers" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:71 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:293 +msgid "Bunq" +msgstr "Bunq" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:72 +#: vendor/wp-pay/core/src/Cards.php:133 +msgid "Moneyou" +msgstr "Moneyou" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:73 +#: vendor/wp-pay/core/src/Cards.php:118 +msgid "Handelsbanken" +msgstr "Handelsbanken" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:42 +#: vendor/wp-pay-gateways/payvision/src/Integration.php:43 +#, fuzzy +msgid "https://www.payvision.com/" +msgstr "https://www.adyen.com/fr_FR/" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:45 +#, fuzzy +msgid "https://www.pronamic.eu/manuals/using-payvision-pronamic-pay/" +msgstr "https://www.pronamic.eu/plugins/pronamic-ideal/" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:89 +msgctxt "payvision" +msgid "Business Id" +msgstr "Business Id" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:92 +msgid "" +"A Merchant connecting to the platform is identified by its Business ID " +"(“businessId”)." +msgstr "" +"Un marchand se connectant à la plateforme est identifié par son Business ID " +"(”businessId”)." + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:103 +msgctxt "payvision" +msgid "User" +msgstr "Utilisateur" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:113 +msgctxt "payvision" +msgid "Password" +msgstr "Mot de passe" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:123 +#, fuzzy +msgctxt "payvision" +msgid "Store ID" +msgstr "ID source" + +#. translators: %s: XML document element name +#: vendor/wp-pay-gateways/sisow/src/Client.php:152 +msgid "Unknwon Sisow message (%s)" +msgstr "Réponse inconnue de Sisow (%s)" + +#: vendor/wp-pay-gateways/sisow/src/Client.php:165 +msgid "Sisow Bank (test)" +msgstr "Sisow Bank (test)" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:48 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-sisow-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:102 +msgid "Sisow" +msgstr "Sisow" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:112 +msgctxt "sisow" +msgid "Merchant ID" +msgstr "ID du Marchand" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:115 +#, fuzzy +msgid "" +"Merchant ID as mentioned at My Profile in the Sisow " +"dashboard." +msgstr "" +"ID marchand mentionné à mon profil dans le tableau de bord " +"Sisow." + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:124 +msgctxt "sisow" +msgid "Merchant Key" +msgstr "Clé Marchant" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:127 +#, fuzzy +msgid "" +"Merchant Key as mentioned at My Profile in the Sisow " +"dashboard." +msgstr "" +"Clé marchande mentionnée à mon profil dans le tableau de " +"bord Sisow." + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:136 +msgctxt "sisow" +msgid "Shop ID" +msgstr "ID boutique" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:139 +#, fuzzy +msgid "" +"Shop ID as mentioned at My Profile in the Sisow dashboard." +msgstr "" +"ID de magasin comme mentionné à mon profil dans le tableau " +"de bord Sisow." + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:29 +msgid "https://www.targetpay.com/info/ideal?setlang=en" +msgstr "https://www.targetpay.com/info/ideal?setlang=en" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:32 +#, fuzzy +msgid "" +"https://www.pronamic.eu/support/how-to-connect-targetpay-with-wordpress-via-" +"pronamic-pay/" +msgstr "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:54 +msgid "TargetPay" +msgstr "TargetPay" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:63 +msgid "Layout Code" +msgstr "Code de mise en page" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:65 +#, fuzzy +msgid "" +"Layout code as mentioned at Sub accounts in the TargetPay " +"dashboard." +msgstr "" +"Code de mise en page mentionné dans les comptes Sub dans le " +"tableau de bord TargetPay." + +#: vendor/wp-pay/core/src/Admin/AdminAboutPage.php:69 +msgid "About Pronamic Pay" +msgstr "À propos du Pronamic Pay" + +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:75 +#: vendor/wp-pay/core/views/page-dashboard.php:27 +msgid "Pronamic Pay Status" +msgstr "Statut de Pronamic Pay" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:90 +msgid "%s completed" +msgstr "%s terminés" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:92 +msgid "%s pending" +msgstr "%s en attente" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:94 +msgid "%s cancelled" +msgstr "%s annulé" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:96 +msgid "%s failed" +msgstr "%s échoué" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:98 +msgid "%s expired" +msgstr "%s expiré" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:83 +msgid "Variant" +msgstr "Variante" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:85 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:187 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:1048 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:67 +#: vendor/wp-pay/core/views/pointer-dashboard.php:12 +msgid "Dashboard" +msgstr "Tableau de bord" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:229 +msgid "Default" +msgstr "Par défaut" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:506 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:736 +msgid "M j, Y @ H:i" +msgstr "M j, Y @ H:i" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:510 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:516 +msgid "Configuration updated." +msgstr "Configuration mise à jour." + +#. translators: %s: date and time of the revision +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:520 +#, fuzzy +msgid "Configuration restored to revision from %s." +msgstr "Configuration restaurée à la révision à partir de %s." + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:523 +msgid "Configuration published." +msgstr "Configuration publiée." + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:525 +msgid "Configuration saved." +msgstr "Configuration enregistrée." + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:527 +msgid "Configuration submitted." +msgstr "Configuration soumise." + +#. translators: %s: scheduled date +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:530 +#, fuzzy +msgid "Configuration scheduled for: %s." +msgstr "Configuration prévue pour : %s." + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:532 +#, fuzzy +msgid "Configuration draft updated." +msgstr "Projet de configuration mis à jour." + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:57 +msgid "Support license key" +msgstr "Clé de licence de support" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:58 +msgid "No license key found" +msgstr "Aucune clé de licence trouvée" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:64 +msgid "License status" +msgstr "Statut de la licence" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:70 +msgid "Next scheduled license check" +msgstr "Prochaine vérification de licence prévue" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:76 +#: vendor/wp-pay/core/views/tab-system_status.php:231 +msgid "Time (UTC)" +msgstr "Heure (UTC)" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:77 +#: vendor/wp-pay/core/views/tab-system_status.php:234 +msgid "Y/m/d g:i:s A" +msgstr "Y/m/d g:i:s A" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:81 +msgid "Not available" +msgstr "Non disponible" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:88 +msgid "OpenSSL version" +msgstr "Version OpenSSL" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:94 +msgid "Active plugin integrations" +msgstr "Intégrations actives de plugin" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:190 +msgid "Pronamic Pay license key is valid" +msgstr "La clé de licence de Pronamic Pay est valide" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:193 +#, fuzzy +msgid "" +"A valid license is required for technical support and continued plugin " +"updates." +msgstr "" +"Une licence valide est requise pour le support technique et les mises à jour " +"continues de plugin." + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:206 +msgid "No valid license key for Pronamic Pay" +msgstr "Aucune clé de licence valide pour Pronamic Pay" + +#. translators: %s: WordPress version number +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:247 +msgid "WordPress version is supported by Pronamic Pay (%s)" +msgstr "La version WordPress est prise en charge par Pronamic Pay (%s)" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:250 +msgid "Pronamic Pay requires at least WordPress 4.7." +msgstr "Pronamic Pay nécessite au moins WordPress 4.7." + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:262 +msgid "Pronamic Pay requires at least WordPress 4.7" +msgstr "Pronamic Pay nécessite au moins WordPress 4.7" + +#. translators: %s: WordPress memory limit +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:283 +msgid "WordPress memory limit is sufficient (%s)" +msgstr "La limite de mémoire WordPress est suffisante (%s)" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:286 +msgid "" +"Pronamic Pay recommends setting the WordPress memory limit to at least 64 MB." +msgstr "" +"Pronamic Pay recommande de définir la limite de mémoire WordPress à au moins " +"64 Mo." + +#. translators: %s: WordPress memory limit +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:301 +msgid "Increase WordPress memory limit (%s) to at least 64 MB" +msgstr "Augmenter la limite de mémoire WordPress (%s) à au moins 64 Mo" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:318 +msgid "Character encoding is set to UTF-8" +msgstr "L'encodage des caractères est réglé sur UTF-8" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:319 +msgid "" +"Pronamic Pay recommends to use the UTF-8 character encoding for payments." +msgstr "" +"Pronamic Pay recommande d'utiliser l'encodage de caractères UTF-8 pour les " +"paiements." + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:332 +msgid "Character encoding is not set to UTF-8" +msgstr "L'encodage des caractères n'est pas réglé sur UTF-8" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:347 +msgid "SHA1 hashing algorithm is available" +msgstr "L'algorithme de hachage SHA1 est disponible" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:348 +#, fuzzy +msgid "" +"Payment gateways often use the SHA1 hashing algorithm, therefore Pronamic " +"Pay advises to enable this hashing algorithm." +msgstr "" +"Les passerelles de paiement utilisent souvent l'algorithme de hachage SHA1, " +"c'est pourquoi Pronamic Pay conseille d'activer cet algorithme de hachage." + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:363 +#, fuzzy +msgid "SHA1 hashing algorithm is not available for Pronamic Pay" +msgstr "" +"L'algorithme de hachage SHA1 n'est pas disponible pour la rémunération " +"pronamic" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:457 +msgid "Untested plugin versions (issues with payments might occur):" +msgstr "" +"Versions plugin non testées (des problèmes de paiement peuvent survenir):" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:467 +#, fuzzy +msgid "" +"Outdated unsupported plugin versions for which payments can not be processed:" +msgstr "" +"Versions de plugin non prises en compte obsolètes pour lesquelles les " +"paiements ne peuvent pas être traités :" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:476 +msgid "Supported plugin versions:" +msgstr "Versions plugin prises en charge:" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:482 +msgid "Pronamic Pay extensions are compatible" +msgstr "Les extensions de Pronamic Pay sont compatibles" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:484 +msgid "" +"Pronamic Pay uses extensions to integrate with form, booking and other e-" +"commerce plugins. All extensions support the currently activated plugin " +"version." +msgstr "" +"Pronamic Pay utilise des extensions pour s'intégrer aux plugins de " +"formulaire, de réservation et autres plugins commerce électronique. Toutes " +"les extensions prennent en charge la version plugin actuellement activée." + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:487 +msgid "Pronamic Pay extensions are incompatible" +msgstr "Les extensions de Pronamic Pay sont incompatibles" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:489 +msgid "" +"Pronamic Pay uses extensions to integrate with form, booking and other e-" +"commerce plugins. Not all extensions support the version of the currently " +"activated plugin." +msgstr "" +"Pronamic Pay utilise des extensions pour s'intégrer aux plugins de " +"formulaire, de réservation et autres plugins commerce électronique. Toutes " +"les extensions ne prennent pas en charge la version du plugin actuellement " +"activé." + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:416 +msgid "payment" +msgstr "paiement" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:423 +msgid "Payment completed" +msgstr "Paiement terminé" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:424 +msgid "completed" +msgstr "terminé" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:427 +msgid "The payment has been successfully completed." +msgstr "Le paiement a été effectué avec succès." + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:435 +msgid "Payment cancelled" +msgstr "Paiement reçu" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:436 +msgid "cancelled" +msgstr "annulé" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:439 +msgid "You have cancelled the payment." +msgstr "Vous avez annulé le paiement." + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:447 +msgid "Payment expired" +msgstr "Paiement expiré" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:448 +msgid "expired" +msgstr "expiré" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:451 +msgid "Your payment session has expired." +msgstr "Votre session de paiement a expiré." + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:459 +msgid "Payment error" +msgstr "Erreur de paiement" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:460 +msgid "error" +msgstr "erreur" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:463 +msgid "An error has occurred during payment." +msgstr "Une erreur s'est produite pendant le paiement." + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:471 +msgid "Payment status unknown" +msgstr "État de paiement inconnu" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:472 +msgid "unknown" +msgstr "inconnu" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:475 +msgid "The payment status is unknown." +msgstr "L'état de paiement est inconnu." + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:486 +msgid "subscription" +msgstr "abonnement" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:489 +msgid "The subscription has been canceled." +msgstr "L’abonnement a été annulé." + +#. translators: %s: order ID +#: vendor/wp-pay/core/src/Admin/AdminModule.php:671 +msgid "Test %s" +msgstr "Test %s" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:937 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:938 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:49 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:51 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:62 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:45 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:61 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:126 +msgid "Subscriptions" +msgstr "Abonnements" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:943 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:944 +#: vendor/wp-pay/core/views/pointer-reports.php:12 +msgid "Reports" +msgstr "Rapports" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:952 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:110 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:112 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:123 +#: vendor/wp-pay/core/views/pointer-forms.php:12 +msgid "Payment Forms" +msgstr "Formulaire de paiement" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:953 +msgid "Forms" +msgstr "Formulaires" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:958 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:959 +#: vendor/wp-pay/core/src/GatewayPostType.php:68 +#: vendor/wp-pay/core/views/pointer-gateways.php:12 +msgid "Configurations" +msgstr "Configurations" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:964 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:965 +#: vendor/wp-pay/core/views/pointer-settings.php:12 +msgid "Settings" +msgstr "Réglages" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:976 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:977 +msgid "Tools" +msgstr "Outils" + +#. translators: 1: Pronamic Pay settings page URL, 2: Pronamic.eu plugin page URL +#: vendor/wp-pay/core/src/Admin/AdminNotices.php:72 +#, fuzzy +msgid "" +"Pronamic Pay — You have not entered a valid support license key, please get " +"your key at pronamic.eu." +msgstr "" +"Rémunération pronamic - Vous n'avez pas entré une clé de " +"licence de supportvalide , s'il vous plaît obtenir votre clé à pronamic.eu." + +#. translators: 1: Pronamic Pay settings page URL, 2: Pronamic.eu plugin page URL, 3: Pronamic.eu account page URL +#: vendor/wp-pay/core/src/Admin/AdminNotices.php:79 +#, fuzzy +msgid "" +"Pronamic Pay — You have not entered a valid support license key. Please get " +"your key at pronamic.eu or login to check your license status." +msgstr "" +"Rémunération pronamic — Vous n'avez pas saisi la clé de " +"licence de supportvalide . S'il vous plaît obtenir votre clé à pronamic.eu ou de " +"connexion pour vérifier votre statut de licence." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:76 +msgid "Check Payment Status" +msgstr "Vérifier l'état des paiement" + +#. translators: %s: number updated payments +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:162 +msgid "%s payment updated." +msgid_plural "%s payments updated." +msgstr[0] "%s paiement mis à jour." +msgstr[1] "%s paiements mis à jour." + +#. translators: %s: number skipped payments +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:177 +msgid "" +"%s payment is not updated because it already has a final payment status." +msgid_plural "" +"%s payments are not updated because they already have a final payment status." +msgstr[0] "" +"%s paiement n'est pas mis à jour parce qu'il a déjà un statut de paiement " +"final." +msgstr[1] "" +"%s paiements ne sont pas mis à jour parce qu'ils ont déjà un statut de " +"paiement final." + +#. translators: %s: gateways lists +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:215 +msgid "Requesting the current payment status is unsupported by %s." +msgstr "" +"La demande de l'état de paiement actuel n'est pas prise en charge par %s." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:157 +msgid "Payment status updated." +msgstr "Status du paiement mis à jour." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:169 +msgid "Invoice created." +msgstr "Facture créée." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:174 +msgid "Invoice could not be created." +msgstr "La facture n'a pas pu être créée." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:187 +msgid "Reservation cancelled." +msgstr "Réservation annulée." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:192 +msgid "Reservation could not be cancelled." +msgstr "La réservation n'a pas pu être annulée." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:204 +msgid "" +"Payment details or an invalid tracking ID prevent payment from being tracked " +"by Google Analytics." +msgstr "" +"Les détails de paiement ou un ID de suivi non valide empêchent le paiement " +"d'être suivi par Google Analytics." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:212 +msgid "Payment sent to Google Analytics." +msgstr "Paiement envoyé à Google Analytics." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:217 +msgid "Payment could not be sent to Google Analytics." +msgstr "Le paiement n'a pas pu être envoyé à Google Analytics." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:255 +msgid "" +"This payment has been anonymized. Personal details are not available anymore." +msgstr "" +"Ce paiement a été anonymisé. Les données personnelles ne sont plus " +"disponibles." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:336 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:30 +msgid "Transaction" +msgstr "Transaction" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:337 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:168 +#: vendor/wp-pay/core/views/meta-box-form-options.php:20 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:102 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:69 +#: vendor/wp-pay/core/views/tab-gateways.php:26 +msgid "Gateway" +msgstr "Passerelle" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:339 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:289 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:265 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:240 +msgid "Customer" +msgstr "Client" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:418 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:351 +#: vendor/wp-pay/core/src/Plugin.php:1073 +msgid "Unknown" +msgstr "Inconnu" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:449 +msgid "First of recurring payment" +msgstr "Premier paiement récurrent" + +#. translators: 1: edit post link with post ID, 2: source description, 3: source ID text +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:508 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:405 +msgid "%1$s for %2$s %3$s" +msgstr "%1$s (%2$s / %3$s)" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:602 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:517 +msgid "Payment Lines" +msgstr "Paiement lines" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:620 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:544 +msgid "Notes" +msgstr "Notes" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:629 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:553 +#: vendor/wp-pay/core/views/meta-box-payment-update.php:176 +#: vendor/wp-pay/core/views/meta-box-subscription-update.php:50 +msgid "Update" +msgstr "Mettre à jour" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:740 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:746 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:76 +msgid "Payment updated." +msgstr "Paiement mis à jour." + +#. translators: %s: date and time of the revision +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:750 +msgid "Payment restored to revision from %s." +msgstr "Paiement rétabli à la révision à partir de %s." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:753 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:72 +msgid "Payment published." +msgstr "Paiement publié." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:755 +msgid "Payment saved." +msgstr "Paiement enregistré." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:757 +msgid "Payment submitted." +msgstr "Paiement soumis." + +#. translators: %s: scheduled date +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:760 +msgid "Payment scheduled for: %s." +msgstr "Paiement prévu pour: %s." + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:762 +msgid "Payment draft updated." +msgstr "Paiement brouillon mis à jour." + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:157 +msgid "Number successful payments" +msgstr "Nombre de paiements réussis" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:173 +msgid "Open payments" +msgstr "Paiements ouverts" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:194 +msgid "Successful payments" +msgstr "Paiements réussis" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:216 +msgid "Cancelled payments" +msgstr "Paiements annulés" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:238 +msgid "Expired payments" +msgstr "Paiements expirés" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:260 +msgid "Failed payments" +msgstr "Paiements échoués" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:59 +msgid "Support License Key" +msgstr "Clé de licence de support" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:72 +msgid "Default Gateway" +msgstr "Passerelle par Défaut" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:78 +msgid "— Select a gateway —" +msgstr "— Sélectionnez une passerelle —" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:86 +msgid "Google Analytics tracking ID" +msgstr "ID de suivi Google Analytics" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:91 +msgid "Set a Google Analytics tracking UA code to track ecommerce revenue." +msgstr "" +"Définir un code UA de suivi Google Analytics pour suivre les revenus du " +"commerce électronique." + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:100 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:105 +msgid "Remove Data" +msgstr "Supprimer Données" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:106 +msgid "Remove all plugin data on uninstall" +msgstr "Supprimer toutes les données de plugin sur désinstaller" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:115 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:128 +msgid "Debug Mode" +msgstr "Mode débogage" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:116 +msgid "Enable debug mode" +msgstr "Activer le mode de débogage" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:171 +msgid "" +"The page an user will get redirected to after payment, based on the payment " +"status." +msgstr "" +"La page vers laquelle un utilisateur sera redirigé après le paiement, en " +"fonction du statut du paiement." + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:188 +msgid "Set default pages" +msgstr "Définir les pages par défaut" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:318 +msgid "— Select a page —" +msgstr "— Sélectionnez une page —" + +#. translators: %d: payment ID +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:204 +msgid "Payment #%d" +msgstr "Paiement #%d" + +#. translators: %s: payment post edit link +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:225 +msgid "%s has been created." +msgstr "%s a été créé." + +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:291 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:101 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:30 +msgid "Recurrence" +msgstr "Récurrence" + +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:526 +msgid "Phases" +msgstr "Phases" + +#: vendor/wp-pay/core/src/Admin/Install.php:247 +msgid "Payer" +msgstr "Payeur" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:87 +msgctxt "Block" +msgid "Payment Form" +msgstr "Formulaire de paiement" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:88 +msgid "Add form" +msgstr "Ajouter un formulaire" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:166 +msgid "Unable to process payments with default gateway." +msgstr "Impossible de traiter les paiements avec la passerelle par défaut." + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:194 +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:226 +msgid "Payment Form Block" +msgstr "Bloc de formulaire de paiement" + +#: vendor/wp-pay/core/src/Cards.php:46 +msgid "American Express" +msgstr "American Express" + +#: vendor/wp-pay/core/src/Cards.php:51 +msgid "Carta Si" +msgstr "Carta Si" + +#: vendor/wp-pay/core/src/Cards.php:56 +msgid "Carte Bleue" +msgstr "Carte Bleue" + +#: vendor/wp-pay/core/src/Cards.php:61 +msgid "Dankort" +msgstr "Dankort" + +#: vendor/wp-pay/core/src/Cards.php:66 +msgid "Diners Club" +msgstr "Diners Club" + +#: vendor/wp-pay/core/src/Cards.php:71 +msgid "Discover" +msgstr "Discover" + +#: vendor/wp-pay/core/src/Cards.php:76 +msgid "JCB" +msgstr "JCB" + +#: vendor/wp-pay/core/src/Cards.php:86 +msgid "Mastercard" +msgstr "Mastercard" + +#: vendor/wp-pay/core/src/Cards.php:91 +msgid "UnionPay" +msgstr "UnionPay" + +#: vendor/wp-pay/core/src/Cards.php:96 +msgid "Visa" +msgstr "Visa" + +#: vendor/wp-pay/core/src/Cards.php:113 +msgid "bunq" +msgstr "bunq" + +#: vendor/wp-pay/core/src/Cards.php:123 +msgid "ING Bank" +msgstr "ING Bank" + +#: vendor/wp-pay/core/src/Cards.php:158 +msgid "Van Lanschot" +msgstr "Van Lanschot" + +#: vendor/wp-pay/core/src/Core/Gateway.php:398 +msgctxt "Payment method field" +msgid "Other" +msgstr "Autre" + +#: vendor/wp-pay/core/src/Core/Gateway.php:530 +msgid "Choose your bank" +msgstr "Choisissez votre banque" + +#: vendor/wp-pay/core/src/Core/Gateway.php:544 +msgid "Choose your credit card issuer" +msgstr "Choisissez votre émetteur de carte de crédit" + +#: vendor/wp-pay/core/src/Core/Gateway.php:645 +msgid "Account holder name" +msgstr "Nom du titulaire du compte" + +#: vendor/wp-pay/core/src/Core/Gateway.php:671 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:598 +msgid "IBAN" +msgstr "IBAN" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:286 +msgid "Alipay" +msgstr "Alipay" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:287 +msgid "Apple Pay" +msgstr "Apple Pay" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:290 +msgid "Belfius Direct Net" +msgstr "Belfius Direct Net" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:291 +msgid "Billink" +msgstr "Billink" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:294 +msgid "Capayable" +msgstr "Capayable" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:295 +msgid "In3" +msgstr "In3" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:313 +msgid "EPS" +msgstr "EPS" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:316 +msgid "Google Pay" +msgstr "Google Pay" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:317 +msgid "Gulden" +msgstr "Gulden" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:319 +msgid "iDEAL QR" +msgstr "iDEAL QR" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:320 +msgid "KBC/CBC Payment Button" +msgstr "Bouton de paiement KBC/CBC" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:321 +msgid "Klarna Pay Later" +msgstr "Klarna Pay Later" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:323 +msgid "Payconiq" +msgstr "Payconiq" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:325 +msgid "Przelewy24" +msgstr "Przelewy24" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:326 +msgid "Santander" +msgstr "Santander" + +#. translators: 1: received response code, 2: required response code +#: vendor/wp-pay/core/src/Core/Util.php:61 +msgid "" +"The response code (%1$s) was incorrect, required response code " +"%2$s." +msgstr "" +"Le code de réponse (%1$s) était incorrect, le code de réponse " +"requis %2$s." + +#: vendor/wp-pay/core/src/Core/Util.php:96 +msgid "Could not load the XML string." +msgstr "Impossible de charger la chaîne XML." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:113 +#: vendor/wp-pay/core/src/Forms/FormShortcode.php:79 +#: vendor/wp-pay/core/src/Forms/FormsModule.php:196 +#: vendor/wp-pay/core/src/Forms/FormsModule.php:227 +msgid "Payment Form" +msgstr "Formulaire de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:115 +msgid "Add New Payment Form" +msgstr "Ajouter un nouveau formulaire de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:116 +msgid "Edit Payment Form" +msgstr "Modifier le formulaire de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:117 +msgid "New Payment Form" +msgstr "Nouveau formulaire de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:118 +msgid "All Payment Forms" +msgstr "Tous les formulaires de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:119 +msgid "View Payment Form" +msgstr "Afficher le formulaire de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:120 +msgid "Search Payment Forms" +msgstr "Rechercher des formulaires de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:121 +msgid "No payment forms found." +msgstr "Aucun formulaire de paiement n'a été trouvé." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:122 +msgid "No payment forms found in Trash." +msgstr "Aucun formulaire de paiement trouvé dans la poubelle." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:124 +msgid "Filter payment forms list" +msgstr "Liste des formulaires de paiement de filtre" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:125 +msgid "Payment forms list navigation" +msgstr "Navigation de liste de formulaires de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:126 +msgid "Payment forms list" +msgstr "Liste des formulaires de paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:132 +msgid "Payment form published." +msgstr "Formulaire de paiement publié." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:133 +msgid "Payment form published privately." +msgstr "Formulaire de paiement publié en privé." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:134 +msgid "Payment form reverted to draft." +msgstr "Formulaire de paiement retourné à la draft." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:135 +msgid "Payment form scheduled." +msgstr "Formulaire de paiement prévu." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:136 +msgid "Payment form updated." +msgstr "Formulaire de paiement mis à jour." + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:149 +msgctxt "slug" +msgid "payment-forms" +msgstr "formulaires-paiement" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:170 +msgid "Earnings" +msgstr "Gains" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:296 +msgid "Form Options" +msgstr "Options Formulaire" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:410 +msgid "Shortcode:" +msgstr "Shortcode :" + +#. translators: %s: order id +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:112 +msgid "Payment Form %s" +msgstr "Formulaire de paiement %s" + +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:249 +msgid "Please enter your first name" +msgstr "Veuillez saisir votre prénom" + +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:256 +msgid "Please enter a valid email address" +msgstr "S'il vous plaît, mettez une adresse email valide" + +#: vendor/wp-pay/core/src/Forms/FormShortcode.php:90 +msgid "Select Payment Form" +msgstr "Sélectionner le formulaire de paiement" + +#: vendor/wp-pay/core/src/Forms/FormsModule.php:163 +#: vendor/wp-pay/core/views/meta-box-form-options.php:47 +msgid "Pay Now" +msgstr "Payer maintenant" + +#: vendor/wp-pay/core/src/GatewayPostType.php:55 +#: vendor/wp-pay/core/src/GatewayPostType.php:57 +msgid "Payment Gateway Configurations" +msgstr "Configurations de passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:60 +msgid "Add New Payment Gateway Configuration" +msgstr "Ajouter la nouvelle configuration de la passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:61 +msgid "Edit Payment Gateway Configuration" +msgstr "Modifier la configuration de la passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:62 +msgid "New Payment Gateway Configuration" +msgstr "Nouvelle configuration de la passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:63 +msgid "All Payment Gateway Configurations" +msgstr "Toutes les configurations de passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:64 +msgid "View Payment Gateway Configuration" +msgstr "Afficher la configuration de la passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:65 +msgid "Search Payment Gateway Configurations" +msgstr "Rechercher configurations de passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:66 +msgid "No payment gateway configurations found." +msgstr "Aucune configuration de passerelle de paiement n'a été trouvée." + +#: vendor/wp-pay/core/src/GatewayPostType.php:67 +msgid "No payment gateway configurations found in Trash." +msgstr "" +"Aucune configuration de passerelle de paiement trouvée dans la poubelle." + +#: vendor/wp-pay/core/src/GatewayPostType.php:69 +msgid "Filter payment gateway configurations list" +msgstr "Liste des configurations de passerelle de paiement de filtre" + +#: vendor/wp-pay/core/src/GatewayPostType.php:70 +msgid "Payment gateway configurations list navigation" +msgstr "Configurations de passerelle de paiement liste de navigation" + +#: vendor/wp-pay/core/src/GatewayPostType.php:71 +msgid "Payment gateway configurations list" +msgstr "Liste des configurations de passerelle de paiement" + +#: vendor/wp-pay/core/src/GatewayPostType.php:77 +msgid "Payment gateway configuration published." +msgstr "Configuration de la passerelle de paiement publiée." + +#: vendor/wp-pay/core/src/GatewayPostType.php:78 +msgid "Payment gateway configuration published privately." +msgstr "Configuration de la passerelle de paiement publiée en privé." + +#: vendor/wp-pay/core/src/GatewayPostType.php:79 +msgid "Payment gateway configuration reverted to draft." +msgstr "Configuration de la passerelle de paiement revenue à ébauche." + +#: vendor/wp-pay/core/src/GatewayPostType.php:80 +msgid "Payment gateway configuration scheduled." +msgstr "Configuration de la passerelle de paiement prévue." + +#: vendor/wp-pay/core/src/GatewayPostType.php:81 +msgid "Payment gateway configuration updated." +msgstr "Configuration de la passerelle de paiement mise à jour." + +#: vendor/wp-pay/core/src/LicenseManager.php:248 +#: vendor/wp-pay/core/views/tab-system_status.php:40 +msgid "Invalid" +msgstr "Invalide" + +#: vendor/wp-pay/core/src/LicenseManager.php:251 +#: vendor/wp-pay/core/views/tab-system_status.php:44 +msgid "Site Inactive" +msgstr "Site inactif" + +#: vendor/wp-pay/core/src/LicenseManager.php:263 +#: vendor/wp-pay/core/views/tab-system_status.php:70 +msgid "Not scheduled" +msgstr "Non planifié" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:55 +msgid "Add New Payment" +msgstr "Ajouter un nouveau paiement" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:56 +msgid "Edit Payment" +msgstr "Modifier le paiement" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:57 +msgid "New Payment" +msgstr "Nouveau paiement" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:58 +msgid "All Payments" +msgstr "Tous les paiements" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:59 +msgid "View Payment" +msgstr "Afficher le paiement" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:60 +msgid "Search Payments" +msgstr "Recherche de paiements" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:61 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:18 +msgid "No payments found." +msgstr "Aucun paiement trouvé." + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:62 +msgid "No payments found in Trash." +msgstr "Aucun paiement trouvé dans la poubelle." + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:64 +msgid "Filter payments list" +msgstr "Liste des paiements de filtre" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:65 +msgid "Payments list navigation" +msgstr "Navigation de liste de paiements" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:66 +msgid "Payments list" +msgstr "Liste des paiements" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:73 +msgid "Payment published privately." +msgstr "Paiement publié en privé." + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:74 +msgid "Payment reverted to draft." +msgstr "Le paiement est revenu à ébauche." + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:75 +msgid "Payment scheduled." +msgstr "Paiement prévu." + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:102 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:125 +msgctxt "Payment status" +msgid "Pending" +msgstr "En attente" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:103 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:138 +msgctxt "Payment status" +msgid "Reserved" +msgstr "Réservé" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:104 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:151 +msgctxt "Payment status" +msgid "On Hold" +msgstr "En attente" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:105 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:164 +msgctxt "Payment status" +msgid "Completed" +msgstr "Terminé" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:106 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:177 +msgctxt "Payment status" +msgid "Cancelled" +msgstr "Annulé" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:107 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:190 +msgctxt "Payment status" +msgid "Refunded" +msgstr "Remboursé" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:108 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:203 +msgctxt "Payment status" +msgid "Failed" +msgstr "Echec" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:109 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:216 +msgctxt "Payment status" +msgid "Expired" +msgstr "Expiré" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:131 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:129 +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "En attente (%s)" +msgstr[1] "En attente (%s)" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:144 +msgid "Reserved (%s)" +msgid_plural "Reserved (%s)" +msgstr[0] "Réservé (%s)" +msgstr[1] "Réservé (%s)" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:157 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:181 +msgid "On Hold (%s)" +msgid_plural "On Hold (%s)" +msgstr[0] "En attente (%s)" +msgstr[1] "En attente (%s)" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:170 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:207 +msgid "Completed (%s)" +msgid_plural "Completed (%s)" +msgstr[0] "Terminé (%s)" +msgstr[1] "Terminé (%s)" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:196 +msgid "Refunded (%s)" +msgid_plural "Refunded (%s)" +msgstr[0] "Remboursé (%s)" +msgstr[1] "Remboursé (%s)" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:209 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:168 +msgid "Failed (%s)" +msgid_plural "Failed (%s)" +msgstr[0] "Échec (%s)" +msgstr[1] "Échec (%s)" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:222 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:155 +msgid "Expired (%s)" +msgid_plural "Expired (%s)" +msgstr[0] "Expirés (%s)" +msgstr[1] "Expirés (%s)" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:260 +#, fuzzy +msgctxt "Payment title date format parsed by `date_i18n`." +msgid "M d, Y @ h:i A" +msgstr "M d, Y et h:i A" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:417 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:453 +msgid "Config ID" +msgstr "ID de configuration" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:424 +msgid "Key" +msgstr "Clé" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:473 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:509 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:80 +msgid "Transaction ID" +msgstr "ID de transaction" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:480 +msgid "Entrance Code" +msgstr "Code d'entrée" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:488 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:162 +msgid "Action URL" +msgstr "URL d'action" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:496 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:460 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:682 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:114 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:285 +msgid "Source" +msgstr "Source" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:503 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:467 +msgid "Source ID" +msgstr "ID source" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:519 +msgid "Language" +msgstr "Langue" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:571 +msgid "Postal Code" +msgstr "Code postal" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:616 +msgid "Consumer Account Number" +msgstr "Numéro de compte du consommateur" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:625 +msgid "Consumer IBAN" +msgstr "Consommateur IBAN" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:643 +msgid "Consumer City" +msgstr "Ville de consommateur" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:652 +msgid "Analytics Client ID" +msgstr "ID Client Analytics" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:660 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:781 +msgid "Subscription ID" +msgstr "ID de l'Adhésion" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:668 +msgid "Recurring Type" +msgstr "Type de réccurence" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:676 +#: vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php:21 +msgid "Recurring" +msgstr "Récurrent" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:683 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:129 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:31 +msgid "Start Date" +msgstr "Date de début" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:699 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:815 +msgid "User Agent" +msgstr "Agent utilisateur" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:708 +msgid "User IP" +msgstr "IP utilisateur" + +#. translators: 1: new status +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:155 +msgid "Payment created with status \"%1$s\"." +msgstr "Paiement créé avec le statut \"%1$s\"." + +#. translators: 1: old status, 2: new status +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:162 +msgid "Payment status changed from \"%1$s\" to \"%2$s\"." +msgstr "Le statut de paiement est passé de \"%1$s\" à \"%2$s\"." + +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:226 +msgid "Gateway ID." +msgstr "ID de passerelle." + +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:230 +msgid "Gateway mode." +msgstr "Mode passerelle." + +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:228 +msgid "Payment anonymized for personal data erasure request." +msgstr "Paiement anonymisé pour demande d'effacement de données personnelles." + +#. translators: %s: Payment ID +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:232 +msgid "Payment ID %s anonymized." +msgstr "Paiement ID %s anonymized." + +#. translators: %s: Pronamic Pay +#: vendor/wp-pay/core/src/Payments/StatusChecker.php:168 +msgid "Payment status check at gateway by %s." +msgstr "Vérification de l'état des paiements à la passerelle par %s." + +#: vendor/wp-pay/core/src/Plugin.php:649 +#, fuzzy +msgctxt "default datetime format" +msgid "D j M Y \\a\\t H:i" +msgstr "D j M Y \\a\\t H:i" + +#: vendor/wp-pay/core/src/Plugin.php:660 +msgid "" +"Something went wrong with the payment. Please try again later or pay another " +"way." +msgstr "" +"Quelque chose s’est mal passé avec le paiement. Veuillez réessayer plus tard " +"ou payer d’une autre manière." + +#: vendor/wp-pay/core/src/Plugin.php:703 +msgid "— Select Configuration —" +msgstr "— Sélectionner la configuration —" + +#: vendor/wp-pay/core/src/Plugin.php:1069 +msgid "Completed" +msgstr "Terminé" + +#: vendor/wp-pay/core/src/Plugin.php:1070 +msgid "Canceled" +msgstr "Annulé" + +#. translators: %s: payment title +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionHelper.php:61 +msgid "Subscription for %s" +msgstr "Abonnement pour %s" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php:247 +#, fuzzy +msgid "D j M Y" +msgstr "D j M Y \\a\\t H:i" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php:251 +msgid "D j M" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php:255 +msgid "D j" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:54 +msgid "Add New Subscription" +msgstr "Ajouter un nouvel abonnement" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:55 +msgid "Edit Subscription" +msgstr "Modifier l'abonnement" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:56 +msgid "New Subscription" +msgstr "Nouvel abonnement" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:57 +msgid "All Subscriptions" +msgstr "Tous les abonnements" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:58 +msgid "View Subscription" +msgstr "Voir l'abonnement" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:59 +msgid "Search Subscriptions" +msgstr "Recherche d'abonnements" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:60 +msgid "No subscriptions found." +msgstr "Aucun abonnement trouvé." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:61 +msgid "No subscriptions found in Trash." +msgstr "Aucun abonnement trouvé dans la poubelle." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:63 +msgid "Filter subscriptions list" +msgstr "Liste des abonnements au filtre" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:64 +msgid "Subscriptions list navigation" +msgstr "Navigation de liste d'abonnements" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:65 +msgid "Subscriptions list" +msgstr "Liste des abonnements" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:71 +msgid "Subscription published." +msgstr "Abonnement publié." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:72 +msgid "Subscription published privately." +msgstr "Abonnement publié en privé." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:73 +msgid "Subscription reverted to draft." +msgstr "L'abonnement est revenu au projet." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:74 +msgid "Subscription scheduled." +msgstr "Abonnement prévu." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:75 +msgid "Subscription updated." +msgstr "Abonnement mis à jour." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:101 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:123 +msgctxt "Subscription status" +msgid "Pending" +msgstr "En attente" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:102 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:136 +msgctxt "Subscription status" +msgid "Cancelled" +msgstr "Annulé" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:103 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:149 +msgctxt "Subscription status" +msgid "Expired" +msgstr "Expiré" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:104 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:162 +msgctxt "Subscription status" +msgid "Failed" +msgstr "Echec" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:105 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:175 +msgctxt "Subscription status" +msgid "On Hold" +msgstr "En attente" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:106 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:188 +msgctxt "Subscription status" +msgid "Active" +msgstr "Actif" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:107 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:201 +msgctxt "Subscription status" +msgid "Completed" +msgstr "Terminé" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:194 +msgid "Active (%s)" +msgid_plural "Active (%s)" +msgstr[0] "Actif (%s)" +msgstr[1] "Actif (%s)" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:265 +msgctxt "Subscription title date format parsed by `date_i18n`." +msgid "M d, Y @ h:i A" +msgstr "M d, Y @ h:i A" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:488 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:175 +msgid "Frequency" +msgstr "Fréquence" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:502 +msgid "Interval Period" +msgstr "Période d'intervalle" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:262 +#, fuzzy +msgid "Gateway does not support subscription mandate updates." +msgstr "Cette passerelle ne prend pas en charge l'enregistrement webhook." + +#. translators: 1: new status +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:876 +msgid "Subscription created with status \"%1$s\"." +msgstr "Abonnement créé avec le statut \"%1$s\"." + +#. translators: 1: old status, 2: new status +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:883 +msgid "Subscription status changed from \"%1$s\" to \"%2$s\"." +msgstr "Le statut d'abonnement est passé de \"%1$s\" à \"%2$s\"." + +#. translators: %s: expiry date +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:966 +msgid "Subscription renewal due on %s." +msgstr "Renouvellement d'abonnement dû sur %s." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1196 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1214 +msgid "Subscription ID." +msgstr "ID d'abonnement." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1218 +msgid "Subscription phase sequence number." +msgstr "Numéro de séquence de phase d’abonnement." + +#. translators: %s: Subscription ID +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1242 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1268 +#, fuzzy +msgid "Could not find subscription with ID `%s`." +msgstr "Impossible de trouver l'abonnement avec ID `%s`." + +#. translators: %s: Subscription ID +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1284 +#, fuzzy +msgid "Could not find subscription phase with sequence number `%s`." +msgstr "Impossible de trouver l'abonnement avec ID `%s`." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:196 +msgid "Subscription anonymized for personal data erasure request." +msgstr "" +"Abonnement anonymisé pour la demande d'effacement des données personnelles." + +#. translators: %s = subscription id +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:198 +msgid "Subscription ID %s anonymized." +msgstr "Abonnement ID %s anonymisé." + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:217 +msgid "" +"Subscription not anonymized for personal data erasure request because of " +"active status." +msgstr "" +"Abonnement non anonymisé pour la demande d'effacement de données " +"personnelles en raison de son statut actif." + +#. translators: %s: Subscription ID +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:220 +msgid "Subscription ID %s not anonymized because of active status." +msgstr "Abonnement ID %s pas anonymisé en raison de son statut actif." + +#. translators: %s: formatted next payment date +#: vendor/wp-pay/core/src/Upgrades/Upgrade620.php:122 +msgid "Missing subscription next payment date restored to %s." +msgstr "Date de paiement suivante de l’abonnement manquante restaurée %s." + +#. translators: %s: number of years +#: vendor/wp-pay/core/src/Util.php:152 +msgid "%s year" +msgid_plural "%s years" +msgstr[0] "%s année" +msgstr[1] "%s années" + +#. translators: %s: number of months +#: vendor/wp-pay/core/src/Util.php:157 +msgid "%s month" +msgid_plural "%s months" +msgstr[0] "%s mois" +msgstr[1] "%s mois" + +#. translators: %s: number of days +#: vendor/wp-pay/core/src/Util.php:162 +msgid "%s day" +msgid_plural "%s days" +msgstr[0] "%s jour" +msgstr[1] "%s jours" + +#. translators: %s: number of hours +#: vendor/wp-pay/core/src/Util.php:167 +msgid "%s hour" +msgid_plural "%s hours" +msgstr[0] "%s heure" +msgstr[1] "" + +#. translators: %s: number of minutes +#: vendor/wp-pay/core/src/Util.php:172 +msgid "%s minute" +msgid_plural "%s minutes" +msgstr[0] "%s minute" +msgstr[1] "%s mois" + +#. translators: %s: number of seconds +#: vendor/wp-pay/core/src/Util.php:177 +msgid "%s second" +msgid_plural "%s seconds" +msgstr[0] "%s seconde" +msgstr[1] "" + +#. translators: 1: formatted periods, 2: last formatted period +#: vendor/wp-pay/core/src/Util.php:194 +msgid "%1$s and %2$s" +msgstr "%1$s et %2$s" + +#. translators: %s: formatted date interval periods +#: vendor/wp-pay/core/src/Util.php:223 +msgid "Every %s" +msgstr "Chaque %s" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:242 +msgid "Every %s day" +msgid_plural "Every %s days" +msgstr[0] "Chaque %s jour" +msgstr[1] "Tous les %s jours" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:247 +msgid "Every %s week" +msgid_plural "Every %s weeks" +msgstr[0] "Tous les %s semaine" +msgstr[1] "Toutes les %s semaines" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:252 +msgid "Every %s month" +msgid_plural "Every %s months" +msgstr[0] "Tous les %s mois" +msgstr[1] "Tous les %s mois" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:257 +msgid "Every %s year" +msgid_plural "Every %s years" +msgstr[0] "Tous les %s ans" +msgstr[1] "Tous les %s ans" + +#. translators: %s: frequency +#: vendor/wp-pay/core/src/Util.php:298 +msgid "%s period" +msgid_plural "%s periods" +msgstr[0] "%s période" +msgstr[1] "Période" + +#: vendor/wp-pay/core/views/form.php:105 +msgid "Personal Info" +msgstr "Informations personnelles" + +#: vendor/wp-pay/core/views/form.php:125 vendor/wp-pay/core/views/form.php:129 +msgid "Email Address" +msgstr "Adresse e-mail" + +#: vendor/wp-pay/core/views/form.php:148 +msgid "Payment Info" +msgstr "Information de paiement" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:41 +msgid "Button Text" +msgstr "Texte du bouton" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:63 +msgid "Show as input field" +msgstr "Afficher comme champ d'entrée" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:64 +msgid "Show as choices" +msgstr "Afficher comme choix" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:65 +msgid "Show as choices with input field" +msgstr "Afficher comme choix avec le champ d'entrée" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:33 +#: vendor/wp-pay/core/views/tab-gateways.php:25 +msgid "Payment provider" +msgstr "Prestataire pour le paiement" + +#. translators: %s: Integration name +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:53 +#: vendor/wp-pay/core/views/tab-gateways.php:69 +msgid "%s (obsoleted)" +msgstr "%s (obsolète)" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:82 +msgid "Dashboards" +msgstr "Tableaux de bord" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:92 +msgid "Product information" +msgstr "Informations du produit" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:103 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:104 +msgid "Manual" +msgstr "Manuel" + +#: vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php:15 +msgid "Active" +msgstr "Actif" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:34 +msgid "Feedback" +msgstr "Avis" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:42 +msgid "Supported Payment Methods" +msgstr "Méthodes de paiement prises en charge" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:56 +msgid "Webhook Status" +msgstr "Statut Webhook" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:89 +msgid "Transaction feedback" +msgstr "Retour de transaction" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:93 +#, fuzzy +msgid "" +"Processing gateway transaction feedback in the background requires " +"additional configuration." +msgstr "" +"Le traitement de la rétroaction des transactions de passerelle en arrière-" +"plan nécessite une configuration supplémentaire." + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:23 +#, fuzzy +msgid "" +"Please save the entered account details of your payment provider, to make a " +"test payment." +msgstr "" +"S'il vous plaît enregistrer les détails de compte entrés de votre " +"fournisseur de paiement, pour effectuer un paiement de test." + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:121 +msgid "Phone Number" +msgstr "Numéro de téléphone" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:133 +msgid "— Select Repeat —" +msgstr "— Sélectionnez Répéter —" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:134 +msgid "Daily" +msgstr "Quotidien" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:135 +msgid "Weekly" +msgstr "Hebdomadaire" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:136 +msgid "Monthly" +msgstr "Mensuel" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:137 +msgid "Annually" +msgstr "Annuelle" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:142 +msgid "weeks" +msgstr "semaines" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:143 +msgid "months" +msgstr "mois" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:144 +msgid "year" +msgstr "année" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:156 +msgid "Test Subscription" +msgstr "Abonnement de test" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:160 +msgid "Start a subscription for this payment." +msgstr "Commencez un abonnement pour ce paiement." + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:202 +msgid "Repeat every" +msgstr "Répéter chaque" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:219 +msgid "days/weeks/months/year" +msgstr "jours/semaines/mois/année" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:224 +msgid "Ends On" +msgstr "Se termine le" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:231 +msgid "Never" +msgstr "Jamais" + +#. translators: %s: Input field for number times +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:254 +msgid "After %s times" +msgstr "Après %s fois" + +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:17 +msgid "This gateway does not support webhook logging." +msgstr "Cette passerelle ne prend pas en charge l'enregistrement webhook." + +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:27 +msgid "No webhook request processed yet." +msgstr "Aucune demande webhook traitées pour le moment." + +#. translators: 1: formatted date, 2: payment edit url, 3: payment id +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:49 +msgid "" +"Last webhook request processed on %1$s for payment #%3$s." +msgstr "" +"Dernière demande webhook traitées sur %1$s pour le paiement #%3$s." + +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:53 +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:64 +#, fuzzy +msgctxt "full datetime format" +msgid "l j F Y \\a\\t H:i" +msgstr "l j F Y 'a't H:i" + +#. translators: 1: formatted date, 2: payment edit url, 3: payment id +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:60 +msgid "Last webhook request processed on %1$s." +msgstr "Dernière demande webhook traitées sur %1$s." + +#: vendor/wp-pay/core/views/meta-box-notes.php:26 +msgid "No notes found." +msgstr "Pas d'histoire trouvées." + +#: vendor/wp-pay/core/views/meta-box-notes.php:34 +msgid "Note" +msgstr "Note" + +#: vendor/wp-pay/core/views/meta-box-notes.php:35 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:477 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:255 +msgid "User" +msgstr "Utilisateur" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:141 +msgid "Bank Transfer Recipient" +msgstr "Bénéficiaire du virement bancaire" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:180 +msgid "Return URL" +msgstr "URL de retour" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:198 +msgid "Redirect URL" +msgstr "URL de redirection" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:282 +msgid "Company" +msgstr "Entreprise" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:312 +#, fuzzy +msgid "VAT Number Validity" +msgstr "Nombre jours valides" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:333 +#, fuzzy +msgid "Request Date" +msgstr "Nécessite au moins" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:382 +msgid "Validation Service" +msgstr "Service de validation" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:389 +msgid "VIES" +msgstr "VIES" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:521 +msgid "Account Holder" +msgstr "Titulaire de l’account" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:539 +msgid "Account Holder City" +msgstr "Titulaire du compte Ville" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:557 +msgid "Account Holder Country" +msgstr "Pays titulaire d’un compte" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:575 +msgid "Account Number" +msgstr "Numéro de compte" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:597 +msgctxt "IBAN abbreviation title" +msgid "International Bank Account Number" +msgstr "Numéro de compte bancaire international" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:623 +msgctxt "BIC abbreviation title" +msgid "Bank Identifier Code" +msgstr "Code d'identification bancaire" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:624 +msgid "BIC" +msgstr "BIC" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:646 +msgid "Billing Address" +msgstr "Adresse de facturation" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:665 +msgid "Shipping Address" +msgstr "Adresse de livraison" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:706 +msgid "Google Analytics" +msgstr "Google Analytics" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:713 +msgid "Ecommerce conversion tracked" +msgstr "Conversion ecommerce suivi" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:717 +msgid "Ecommerce conversion not tracked" +msgstr "Conversion ecommerce non suivie" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:731 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:301 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:28 +msgid "Period" +msgstr "Période" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:739 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:309 +msgid "Level" +msgstr "Niveau" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:760 +msgid "Session ID" +msgstr "ID de session" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:773 +msgid "User ID" +msgstr "ID de l’utilisateur" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:800 +msgid "Ingenico Alias" +msgstr "Ingenico Alias" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:826 +msgid "IP Address" +msgstr "Adresse IP" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:837 +msgid "Version" +msgstr "Version" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:878 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:377 +msgid "REST API URL" +msgstr "URL D’API REST" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:19 +msgid "No payment lines found." +msgstr "Aucune ligne de paiement n'a été trouvée." + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:29 +msgid "SKU" +msgstr "SKU" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:30 +msgid "Image" +msgstr "Image" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:37 +msgid "Unit price with discount including tax." +msgstr "Prix unitaire avec remise y compris taxe." + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:38 +msgid "Unit Price" +msgstr "Prix unitaire" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:43 +msgid "Quantity" +msgstr "Quantité" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:49 +msgid "Total discount." +msgstr "Réduction totale." + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:50 +msgid "Discount" +msgstr "Remise" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:60 +msgid "Total amount with discount including tax." +msgstr "Montant total avec remise y compris taxes." + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:61 +msgid "Total Amount" +msgstr "Montant total" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:66 +msgid "Total Tax" +msgstr "Total TVA" + +#. translators: %s: price excluding tax +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:124 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:241 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:280 +msgid "Exclusive tax: %s" +msgstr "Taxe exclusive: %s" + +#. translators: %s: price including tax +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:141 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:249 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:288 +msgid "Inclusive tax: %s" +msgstr "Taxe inclusive: %s" + +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:86 +msgctxt "Recurring payment" +msgid "Recurrence" +msgstr "Récurrence" + +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:130 +msgid "This payment is not related to a subscription." +msgstr "Ce paiement n'est pas lié à un abonnement." + +#: vendor/wp-pay/core/views/meta-box-payment-update.php:76 +msgid "Check status" +msgstr "Vérifier l'état" + +#. translators: %s: payment method name +#: vendor/wp-pay/core/views/meta-box-payment-update.php:99 +msgid "Create %1$s invoice" +msgstr "Créer une facture de %1$" + +#. translators: %s: payment method name +#: vendor/wp-pay/core/views/meta-box-payment-update.php:129 +msgid "Cancel %1$s reservation" +msgstr "Annuler la réservation de %1$s" + +#: vendor/wp-pay/core/views/meta-box-payment-update.php:162 +msgid "Send to Google Analytics" +msgstr "Envoyer à Google Analytics" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:30 +msgid "l jS \\o\\f F Y, h:ia" +msgstr "l jS \\o\\f F Y, h:ia" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:168 +msgid "Paid up to" +msgstr "Payé jusqu’à" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:190 +msgid "Next Payment Date" +msgstr "Date du prochain paiement" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:205 +msgid "Next Payment Delivery Date" +msgstr "Prochaine date de livraison du paiement" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:320 +msgid "Cancel URL" +msgstr "Annuler l'URL" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:338 +msgid "Renewal URL" +msgstr "URL de renouvellement" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:356 +msgid "Mandate Selection URL" +msgstr "URL de sélection du mandat" + +#. translators: %s: next payment date +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:66 +msgid "Will be created on %s" +msgstr "Sera créé sur %s" + +#. translators: 1: next payment delivery date, 2: create next period payment anchor +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:76 +msgid "Will be created on %1$s or %2$s" +msgstr "Sera créé sur %1$s ou %2$s" + +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:81 +msgid "create now" +msgstr "créer maintenant" + +#. translators: %d: payment ID +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:173 +#, fuzzy +msgid "Retry payment #%d" +msgstr "paiement #%s" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:18 +msgid "No phases found." +msgstr "Aucune phase trouvée." + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:33 +msgid "Next Date" +msgstr "Date Suivante" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:34 +msgid "Periods created" +msgstr "Périodes créées" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:35 +msgid "Trial" +msgstr "Essai" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:36 +msgid "Aligned" +msgstr "Aligné" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:37 +msgid "Prorated" +msgstr "Au prorata" + +#. translators: %s: Pronamic Pay +#: vendor/wp-pay/core/views/notice-license.php:27 +msgid "Thank you for activating your license and using the %s plugin." +msgstr "Merci d’activer votre licence et d’utiliser le %s plugin." + +#: vendor/wp-pay/core/views/notice-license.php:33 +#, fuzzy +msgid "" +"This license does not have any activations left. Maybe you have to " +"deactivate your license on a local/staging server. This can be done on your " +"Pronamic.eu account." +msgstr "" +"Cette licence n'a plus d'activations. Peut-être que vous devez désactiver " +"votre licence sur un serveur local / mise en scène. Cela peut être fait sur " +"votre compte Pronamic." +"eu." + +#: vendor/wp-pay/core/views/notice-license.php:42 +#, fuzzy +msgid "" +"There was a problem activating your license key, please try again or contact " +"support." +msgstr "" +"Il y avait un problème d'activation de votre clé de licence, s'il vous plaît " +"essayer à nouveau ou de soutien de contact." + +#: vendor/wp-pay/core/views/notice-upgrade.php:28 +#, fuzzy +msgid "Pronamic Pay Upgrade Required" +msgstr "Mise à jour des données de Pronamic Pay requise" + +#: vendor/wp-pay/core/views/notice-upgrade.php:29 +#, fuzzy +msgid "We just need to update your install to the latest version." +msgstr "" +"Nous avons juste besoin de mettre à jour votre installation à la dernière " +"version" + +#: vendor/wp-pay/core/views/notice-upgrade.php:33 +#, fuzzy +msgid "Run the upgrader" +msgstr "Lancer l'actualisation" + +#: vendor/wp-pay/core/views/notice-upgrade.php:39 +#, fuzzy +msgid "" +"It is strongly recommended that you backup your database before proceeding. " +"Are you sure you wish to run the upgrader now?" +msgstr "" +"Il est fortement recommandé que vous sauvegardiez votre base de données " +"avant de procéder. Etes-vous certain de vouloir lancer la mise à jour " +"maintenant ?" + +#: vendor/wp-pay/core/views/notice-upgraded.php:16 +#, fuzzy +msgid "Pronamic Pay Upgraded" +msgstr "Pronamic Pay Add-On" + +#: vendor/wp-pay/core/views/notice-upgraded.php:17 +msgid "Successfully upgraded to the latest version." +msgstr "Mise à niveau réussie vers la dernière version." + +#. translators: 1: configuration link(s) +#: vendor/wp-pay/core/views/notice-webhook-url.php:56 +#, fuzzy +msgid "" +"The webhook URL to receive automatic payment status updates seems to have " +"changed for the %1$s configuration. Please check your settings." +msgid_plural "" +"The webhook URL to receive automatic payment status updates seems to have " +"changed for the %1$s configurations. Please check your settings." +msgstr[0] "" +"L'URL webhook pour recevoir des mises à jour automatiques de statut de " +"paiement semble avoir changé pour la configuration %1$s. Veuillez vérifier " +"vos paramètres." +msgstr[1] "" +"L'URL webhook pour recevoir des mises à jour automatiques de statut de " +"paiement semble avoir changé pour les configurations %1$s. Veuillez vérifier " +"vos paramètres." + +#: vendor/wp-pay/core/views/page-dashboard.php:44 +msgid "Latest Payments" +msgstr "Derniers paiements" + +#: vendor/wp-pay/core/views/page-dashboard.php:148 +#: vendor/wp-pay/core/views/page-dashboard.php:287 +msgid "Show more details" +msgstr "Afficher plus de détails" + +#: vendor/wp-pay/core/views/page-dashboard.php:170 +msgid "No pending payments found." +msgstr "Aucun paiement en attente n'a été trouvé." + +#: vendor/wp-pay/core/views/page-dashboard.php:196 +msgid "Latest Subscriptions" +msgstr "Derniers abonnements" + +#: vendor/wp-pay/core/views/page-dashboard.php:323 +msgid "Getting Started" +msgstr "Commencer" + +#: vendor/wp-pay/core/views/page-dashboard.php:328 +#, fuzzy +msgid "" +"Please follow the tour, read the 'What is new' and 'Getting Started' pages " +"before contacting us. Also, check the Site Health page for any issues." +msgstr "" +"S'il vous plaît suivre la visite, lire les pages «Qu'est-ce qui est nouveau» " +"et «Getting Started» pages avant de nous contacter. En outre, vérifiez la " +"page d'état du système pour tous les problèmes." + +#: vendor/wp-pay/core/views/page-dashboard.php:347 +#: vendor/wp-pay/core/views/pointer-start.php:20 +msgid "Start tour" +msgstr "Commencer tour" + +#: vendor/wp-pay/core/views/page-dashboard.php:362 +msgid "What is new" +msgstr "Ce qui est nouveau" + +#: vendor/wp-pay/core/views/page-dashboard.php:389 +msgid "Site Health" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:406 +#: vendor/wp-pay/core/views/page-tools.php:14 +msgid "System Status" +msgstr "État du système" + +#: vendor/wp-pay/core/views/page-dashboard.php:419 +#: vendor/wp-pay/core/views/page-dashboard.php:430 +msgid "Pronamic News" +msgstr "Nouvelles de Pronamic" + +#: vendor/wp-pay/core/views/page-dashboard.php:428 +msgid "http://www.pronamic.eu/" +msgstr "http://www.pronamic.eu/" + +#: vendor/wp-pay/core/views/page-settings.php:18 +msgid "The default payment status pages are created." +msgstr "Les pages d'état de paiement par défaut sont créées." + +#: vendor/wp-pay/core/views/page-settings.php:25 +msgid "The default payment status pages could not be created." +msgstr "Les pages d'état de paiement par défaut n'ont pas pu être créées." + +#: vendor/wp-pay/core/views/page-tools.php:15 +msgid "Payment Gateways" +msgstr "Passerelles de paiement" + +#: vendor/wp-pay/core/views/page-tools.php:16 +msgid "Extensions" +msgstr "Extensions" + +#: vendor/wp-pay/core/views/page-tools.php:25 +msgid "Secondary menu" +msgstr "Menu secondaire" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:15 +#, fuzzy +msgid "" +"On the Pronamic Pay dashboard you can restart this tour and see an overview " +"of the latest pending payments." +msgstr "" +"Sur le tableau de bord De Pronamic Pay, vous pouvez redémarrer cette visite " +"et voir un aperçu des derniers paiements en attente." + +#: vendor/wp-pay/core/views/pointer-dashboard.php:16 +#, fuzzy +msgid "" +"It also gives you access to the “Getting Started” and “Site Health” pages in " +"case you have issues." +msgstr "" +"Il vous donne également accès aux pages « Démarrer » et « État du système » " +"au cas où vous auriez des problèmes." + +#: vendor/wp-pay/core/views/pointer-dashboard.php:17 +msgid "And you can follow the latest news from the Pronamic.eu weblog." +msgstr "Et vous pouvez suivre les dernières nouvelles de la Pronamic.eu blog." + +#: vendor/wp-pay/core/views/pointer-dashboard.php:22 +#: vendor/wp-pay/core/views/pointer-forms.php:41 +#: vendor/wp-pay/core/views/pointer-gateways.php:24 +#: vendor/wp-pay/core/views/pointer-payments.php:24 +#: vendor/wp-pay/core/views/pointer-settings.php:23 +msgid "Next" +msgstr "Suivant" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:24 +#: vendor/wp-pay/core/views/pointer-forms.php:43 +#: vendor/wp-pay/core/views/pointer-gateways.php:26 +#: vendor/wp-pay/core/views/pointer-payments.php:26 +#: vendor/wp-pay/core/views/pointer-reports.php:23 +#: vendor/wp-pay/core/views/pointer-settings.php:25 +#: vendor/wp-pay/core/views/pointer-start.php:22 +msgid "Close" +msgstr "Fermer" + +#: vendor/wp-pay/core/views/pointer-forms.php:15 +#, fuzzy +msgid "" +"On the payment forms page you can add, edit or delete simple payment forms." +msgstr "" +"Sur la page des formulaires de paiement, vous pouvez ajouter, modifier ou " +"supprimer des formulaires de paiement simples." + +#: vendor/wp-pay/core/views/pointer-forms.php:16 +msgid "" +"Currently it’s not possible to adjust the form fields or styling of these " +"forms." +msgstr "" +"Actuellement, il n’est pas possible d’ajuster les champs de forme ou le " +"style de ces formes." + +#. translators: 1: Gravity Forms link, 2: _blank +#: vendor/wp-pay/core/views/pointer-forms.php:22 +msgid "" +"For more advanced payment forms we advice you to use the “Gravity Forms” plugin." +msgstr "" +"Pour les formulaires de paiement plus avancés, nous vous conseillons " +"d'utiliser le plugin \"Gravity Forms\"." + +#: vendor/wp-pay/core/views/pointer-forms.php:38 +#: vendor/wp-pay/core/views/pointer-gateways.php:21 +#: vendor/wp-pay/core/views/pointer-payments.php:21 +#: vendor/wp-pay/core/views/pointer-reports.php:20 +#: vendor/wp-pay/core/views/pointer-settings.php:20 +msgid "Previous" +msgstr "Précédent" + +#: vendor/wp-pay/core/views/pointer-gateways.php:15 +#, fuzzy +msgid "" +"Here you can find an overview of all the gateway configurations on your " +"WordPress site." +msgstr "" +"Ici, vous pouvez trouver un aperçu de toutes les configurations de " +"passerelle sur votre site WordPress." + +#: vendor/wp-pay/core/views/pointer-gateways.php:16 +#, fuzzy +msgid "" +"To use the Pronamic Pay plugin you have to add an payment gateway " +"configuration." +msgstr "" +"Pour utiliser le plugin De paiement Pronamic, vous devez ajouter une " +"configuration de passerelle de paiement." + +#: vendor/wp-pay/core/views/pointer-gateways.php:17 +msgid "" +"Normally you get the required configuration information from your payment " +"provider." +msgstr "" +"Normalement, vous obtenez les informations de configuration requises auprès " +"de votre fournisseur de paiement." + +#: vendor/wp-pay/core/views/pointer-payments.php:15 +#, fuzzy +msgid "" +"On the payments page you can find an overview off all the payments initiated " +"on your WordPress site." +msgstr "" +"Sur la page des paiements, vous pouvez trouver un aperçu de tous les " +"paiements initiés sur votre site WordPress." + +#: vendor/wp-pay/core/views/pointer-payments.php:16 +msgid "" +"You can easily filter the payments by status or use the search field to " +"search for specific payments." +msgstr "" +"Vous pouvez filtrer les paiements par statut ou utiliser le champ de " +"recherche pour rechercher des paiements spécifiques." + +#: vendor/wp-pay/core/views/pointer-payments.php:17 +msgid "" +"We advice you to regular check the pending payments on this overview and " +"adjust the status of these payments manual if needed." +msgstr "" +"Nous vous conseillons de vérifier régulièrement les paiements en attente sur " +"cette vue d’ensemble et d’ajuster le statut de ce manuel de paiements si " +"nécessaire." + +#: vendor/wp-pay/core/views/pointer-reports.php:15 +msgid "" +"The Pronamic Pay reports page shows you an graph of all the payments of this " +"year." +msgstr "" +"La page des rapports de Pronamic Pay vous montre un graphique de tous les " +"paiements de cette année." + +#: vendor/wp-pay/core/views/pointer-reports.php:16 +msgid "" +"You can see the number of succesfull payments and the total amount of " +"pending, succesfull, cancelled and failed payments." +msgstr "" +"Vous pouvez voir le nombre de paiements réussis et le montant total des " +"paiements en attente, réussisfull, annulés et échoués." + +#: vendor/wp-pay/core/views/pointer-settings.php:15 +msgid "These are the General settings for the Pronamic Pay plugin." +msgstr "Ce sont les paramètres généraux pour le plugin Pronamic Pay." + +#: vendor/wp-pay/core/views/pointer-settings.php:16 +#, fuzzy +msgid "" +"Here you can enter your license key and configure some default settings." +msgstr "" +"Ici, vous pouvez entrer votre clé de licence et configurer certains " +"paramètres par défaut." + +#: vendor/wp-pay/core/views/pointer-start.php:12 +msgid "Congratulations" +msgstr "Félicitations" + +#: vendor/wp-pay/core/views/pointer-start.php:15 +msgid "" +"You’ve just installed the Pronamic Pay plugin. Click “Start Tour” to view a " +"quick introduction of this plugin’s core functionality." +msgstr "" +"Vous venez d'installer le plugin Pronamic Pay. Cliquez sur \"Start Tour\" " +"pour voir une introduction rapide de la fonctionnalité de base de ce plugin." + +#: vendor/wp-pay/core/views/pronamic.php:12 +msgid "Follow Pronamic" +msgstr "Suivre Pronamic" + +#: vendor/wp-pay/core/views/subscription-cancel.php:25 +#: vendor/wp-pay/core/views/subscription-cancel.php:34 +msgid "Subscription Cancellation" +msgstr "Annulation d’abonnement" + +#. translators: %s: expiry date +#: vendor/wp-pay/core/views/subscription-cancel.php:44 +#: vendor/wp-pay/core/views/subscription-renew.php:43 +msgid "The subscription expires at %s." +msgstr "L’abonnement expire à %s." + +#: vendor/wp-pay/core/views/subscription-cancel.php:60 +#: vendor/wp-pay/core/views/subscription-renew.php:59 +msgid "Subscription Length:" +msgstr "Durée d'Abonnement:" + +#: vendor/wp-pay/core/views/subscription-cancel.php:67 +#: vendor/wp-pay/core/views/subscription-renew.php:66 +msgid "Amount:" +msgstr "Montant:" + +#: vendor/wp-pay/core/views/subscription-cancel.php:79 +msgid "The subscription has already been canceled." +msgstr "L’abonnement a déjà été annulé." + +#: vendor/wp-pay/core/views/subscription-cancel.php:85 +msgid "Are you sure you want to cancel the subscription?" +msgstr "Es-tu sûr(e) de vouloir résilier cet abonnement ?" + +#: vendor/wp-pay/core/views/subscription-cancel.php:88 +msgid "Cancel" +msgstr "Annuler" + +#: vendor/wp-pay/core/views/subscription-mandate-failed.php:18 +#: vendor/wp-pay/core/views/subscription-mandate-updated.php:18 +msgid "Subscription Mandate" +msgstr "Mandat d’abonnement" + +#: vendor/wp-pay/core/views/subscription-mandate-failed.php:27 +msgid "The mandate for this subscription can not be updated." +msgstr "Le mandat de cet abonnement ne peut pas être mis à jour." + +#: vendor/wp-pay/core/views/subscription-mandate-updated.php:27 +msgid "The subscription has been updated." +msgstr "L’abonnement a été mis à jour." + +#: vendor/wp-pay/core/views/subscription-mandate.php:55 +#: vendor/wp-pay/core/views/subscription-mandate.php:65 +#, fuzzy +msgid "Change subscription payment method" +msgstr "Paiement d'abonnement ajouté" + +#: vendor/wp-pay/core/views/subscription-mandate.php:69 +msgid "Select an existing payment method or add a new one." +msgstr "Sélectionnez un mode de paiement existant ou ajoutez-en un nouveau." + +#: vendor/wp-pay/core/views/subscription-mandate.php:76 +#, fuzzy +msgid "Select existing payment method" +msgstr "Sélectionner une méthode de paiement" + +#: vendor/wp-pay/core/views/subscription-mandate.php:99 +msgctxt "Card selector" +msgid "Card Number" +msgstr "Numéro de la carte" + +#: vendor/wp-pay/core/views/subscription-mandate.php:107 +msgctxt "Card selector" +msgid "Account Number" +msgstr "Numéro de compte" + +#: vendor/wp-pay/core/views/subscription-mandate.php:152 +msgctxt "Card selector" +msgid "Name" +msgstr "Nom" + +#: vendor/wp-pay/core/views/subscription-mandate.php:171 +msgid "Use selected payment method" +msgstr "Utiliser le mode de paiement sélectionné" + +#: vendor/wp-pay/core/views/subscription-mandate.php:181 +msgid "Add new payment method" +msgstr "Ajouter un nouveau mode de paiement" + +#: vendor/wp-pay/core/views/subscription-mandate.php:186 +#, fuzzy +msgid "Select payment method for verification payment." +msgstr "Sélectionner une méthode de paiement" + +#: vendor/wp-pay/core/views/subscription-renew-failed.php:18 +#: vendor/wp-pay/core/views/subscription-renew.php:24 +#: vendor/wp-pay/core/views/subscription-renew.php:33 +msgid "Subscription Renewal" +msgstr "Renouvellement d'abonnement" + +#: vendor/wp-pay/core/views/subscription-renew-failed.php:27 +msgid "The subscription can not be renewed." +msgstr "L'abonnement ne peut pas être renouvelé." + +#: vendor/wp-pay/core/views/tab-extensions.php:13 +msgid "Supported extensions" +msgstr "Extensions prises en charge" + +#: vendor/wp-pay/core/views/tab-extensions.php:35 +msgid "Author" +msgstr "Auteur" + +#: vendor/wp-pay/core/views/tab-extensions.php:38 +msgid "WordPress.org" +msgstr "WordPress.org" + +#: vendor/wp-pay/core/views/tab-extensions.php:41 +msgid "Requires at least" +msgstr "Nécessite au moins" + +#: vendor/wp-pay/core/views/tab-gateways.php:12 +msgid "Supported Payment Gateways" +msgstr "Passerelles de paiement prises en charge" + +#: vendor/wp-pay/core/views/tab-gateways.php:27 +#: vendor/wp-pay/core/views/tab-gateways.php:79 +msgid "Site" +msgstr "Site" + +#: vendor/wp-pay/core/views/tab-system_status.php:20 +msgid "License" +msgstr "Licence" + +#: vendor/wp-pay/core/views/tab-system_status.php:27 +msgid "License Status" +msgstr "Statut de la licence" + +#: vendor/wp-pay/core/views/tab-system_status.php:58 +msgid "Next License Check" +msgstr "Prochaine vérification de licence" + +#: vendor/wp-pay/core/views/tab-system_status.php:82 +msgid "WordPress Environment" +msgstr "Environnement WordPress" + +#: vendor/wp-pay/core/views/tab-system_status.php:89 +msgid "Site URL" +msgstr "URL du site" + +#: vendor/wp-pay/core/views/tab-system_status.php:100 +msgid "Home URL" +msgstr "URL accueil" + +#: vendor/wp-pay/core/views/tab-system_status.php:111 +msgid "PHP Version" +msgstr "Version PHP" + +#: vendor/wp-pay/core/views/tab-system_status.php:122 +msgid "Pronamic Pay requires PHP 5.2 or above." +msgstr "Pronamic Pay nécessite PHP 5.2 ou plus." + +#: vendor/wp-pay/core/views/tab-system_status.php:130 +msgid "MySQL Version" +msgstr "Version MySQL" + +#: vendor/wp-pay/core/views/tab-system_status.php:147 +msgid "Pronamic Pay requires MySQL 5 or above." +msgstr "Pronamic Pay nécessite MySQL 5 ou plus." + +#: vendor/wp-pay/core/views/tab-system_status.php:155 +msgid "WordPress Version" +msgstr "Version de WordPress" + +#: vendor/wp-pay/core/views/tab-system_status.php:166 +msgid "Pronamic Pay requires WordPress 3.2 or above." +msgstr "Pronamic Pay nécessite WordPress 3.2 ou plus." + +#: vendor/wp-pay/core/views/tab-system_status.php:174 +msgid "WP Memory Limit" +msgstr "Limite de mémoire WP" + +#. translators: %s: WordPress Codex link +#: vendor/wp-pay/core/views/tab-system_status.php:194 +msgid "" +"We recommend setting memory to at least 64MB. See: Increasing memory allocated to PHP" +msgstr "" +"Nous recommandons de régler la mémoire à au moins 64 Mo. Voir : Augmentation de la mémoire allouée au PHP" + +#: vendor/wp-pay/core/views/tab-system_status.php:211 +msgid "Character Set" +msgstr "Jeu de caractères" + +#: vendor/wp-pay/core/views/tab-system_status.php:223 +msgid "Pronamic Pay advices to set the character encoding to UTF-8." +msgstr "Pronamic Pay conseils pour définir le code de caractère à UTF-8." + +#: vendor/wp-pay/core/views/tab-system_status.php:242 +msgid "cURL" +msgstr "cURL" + +#: vendor/wp-pay/core/views/tab-system_status.php:267 +msgid "OpenSSL" +msgstr "OpenSSL" + +#: vendor/wp-pay/core/views/tab-system_status.php:287 +msgid "Pronamic Pay requires OpenSSL 0.9.8 or above." +msgstr "Pronamic Pay exige OpenSSL 0.9.8 ou plus." + +#: vendor/wp-pay/core/views/tab-system_status.php:295 +msgid "Registered Hashing Algorithms" +msgstr "Algorithmes enregistrés de hachage" + +#: vendor/wp-pay/core/views/tab-system_status.php:312 +msgid "Pronamic Pay requires the \"sha1\" hashing algorithm." +msgstr "Pronamic Pay nécessite l'algorithme de hachage \"sha1\"." + +#: vendor/wp-pay/core/views/tab-system_status.php:320 +msgid "Travis CI build status" +msgstr "Travis CI build status" + +#: vendor/wp-pay/core/views/tab-system_status.php:370 +msgid "iDEAL issuers status" +msgstr "Statut des émetteurs iDEAL" + +#. translators: %s: iDEAL-status.nl link +#: vendor/wp-pay/core/views/tab-system_status.php:379 +msgid "monitored by iDEAL-status.nl" +msgstr "surveillé par iDEAL-status.nl" + +#: vendor/wp-pay/core/views/tab-system_status.php:401 +msgid "Failure" +msgstr "Échec" + +#. translators: %s: Number payments +#: vendor/wp-pay/core/views/widget-payments-status-list.php:28 +msgid "%s payment" +msgid_plural "%s payments" +msgstr[0] "%s paiement" +msgstr[1] "%s paiements" + +#: views/error.php:19 views/error.php:36 views/exception.php:20 +msgid "Code" +msgstr "Code" + +#: views/error.php:22 views/error.php:39 views/exception.php:15 +msgid "Message" +msgstr "Message" + +#: views/error.php:42 +msgid "Detail" +msgstr "Détail" + +#: views/error.php:45 +msgid "Suggested Action" +msgstr "Action suggérée" + +#: views/error.php:48 +msgid "Consumer Message" +msgstr "Message du consommateur" + +#: views/eshop/settings-meta-box.php:21 +msgid "Accept payment by iDEAL" +msgstr "Accepter le paiement par iDEAL" + +#: views/exception.php:27 +msgid "Trace" +msgstr "Trace" + +#: views/ideal-test-cases.php:18 +msgid "Order" +msgstr "Commande" + +#: views/ideal-test-cases.php:21 +msgid "Expected result if integration is correct" +msgstr "Résultat attendu si l'intégration est correcte" + +#. translators: %s: formatted amount +#: views/ideal-test-cases.php:68 +msgid "Transaction with amount = %s:" +msgstr "Transaction avec amount = %s:" + +#: views/redirect-message.php:18 +msgid "Payment notice" +msgstr "Avis de paiement" + +#: views/redirect-via-html.php:18 views/redirect-via-html.php:45 +msgid "Redirecting…" +msgstr "Redirection…" + +#: views/redirect-via-html.php:48 +msgid "You will be automatically redirected to the online payment environment." +msgstr "" +"Vous serez automatiquement redirigé vers l'environnement de paiement en " +"ligne." + +#: views/redirect-via-html.php:52 +msgid "Please click the button below if you are not automatically redirected." +msgstr "" +"S’il vous plaît cliquez sur le bouton ci-dessous si vous n’êtes pas " +"automatiquement redirigé." + +#, fuzzy +#~ msgid "Pronamic Pay Status Pages" +#~ msgstr "Statut de Pronamic Pay" + +#~ msgid "You succesfully activated your website." +#~ msgstr "Vous avez activé avec succès votre site web." + +#~ msgid "Partner ID" +#~ msgstr "ID Partenaire" + +#, fuzzy +#~ msgid "" +#~ "Mollie.nl accountnummer. Op het gespecificeerde account wordt na " +#~ "succesvolle betaling tegoed bijgeschreven." +#~ msgstr "" +#~ "Mollie.nl comptenummer. Op het gespecificeerde compte wordt na " +#~ "succesvolle betaling tegoed bijgeschreven." + +#~ msgid "Profile Key" +#~ msgstr "Clé de profil" + +#, fuzzy +#~ msgid "" +#~ "Hiermee kunt u een ander websiteprofielen selecteren om uw betaling aan " +#~ "te linken. Gebruik de waarde uit het veld Key uit het profiel overzicht. " +#~ "[bekijk overzicht van uw profielen]." +#~ msgstr "" +#~ "Hiermee kunt u een ander websiteprofielen selecteren om uw betaling aan " +#~ "te linken. Gebruik de waarde uit het veld Key uit het profiel overzicht. " +#~ "[bekijk overzicht van uw profielen]." + +#~ msgctxt "nocks" +#~ msgid "Access Token" +#~ msgstr "Jeton d’accès" + +#~ msgctxt "nocks" +#~ msgid "Merchant Profile" +#~ msgstr "Profil du marchand" + +#, fuzzy +#~ msgid "" +#~ "First enter an API Key and save the configuration, to be able to choose " +#~ "from your Nocks merchant profiles." +#~ msgstr "" +#~ "Entrez d'abord une clé API et enregistrez la configuration, pour pouvoir " +#~ "choisir parmi vos profils de marchands Nocks." + +#~ msgid "— Select Merchant Profile —" +#~ msgstr "— Sélectionnez profil de marchand —" + +#~ msgid "Nocks" +#~ msgstr "Nocks" + +#~ msgctxt "creditcard" +#~ msgid "Capture Day" +#~ msgstr "Journée de capture" + +#~ msgctxt "creditcard" +#~ msgid "Capture Mode" +#~ msgstr "Mode de capture" + +#~ msgid "Currency Code" +#~ msgstr "Devise" + +#~ msgid "Transaction Date Time" +#~ msgstr "Date de transaction" + +#~ msgid "Transaction Reference" +#~ msgstr "Référence de transaction" + +#~ msgid "Key Version" +#~ msgstr "Version clé" + +#~ msgid "Authorisation ID" +#~ msgstr "ID d'autorisation" + +#~ msgid "Payment Mean Brand" +#~ msgstr "Marque moyenne de paiement" + +#~ msgid "Payment Mean Type" +#~ msgstr "Type moyen de paiement" + +#~ msgid "Response Code" +#~ msgstr "Code de réponse" + +#, fuzzy +#~ msgid "OmniKassa transaction data in response message:" +#~ msgstr "Données de transaction OmniKassa dans le message de réponse:" + +#~ msgid "admin" +#~ msgstr "admin" + +#~ msgid "download" +#~ msgstr "téléchargement" + +#, fuzzy +#~ msgid "" +#~ "You can find the key version in the OmniKassa Download Dashboard." +#~ msgstr "" +#~ "Vous pouvez trouver la version clé dans le tableau de bord omnikassa Télécharger." + +#~ msgid "The OmniKassa %s parameter." +#~ msgstr "Le paramètre OmniKassa %s." + +#~ msgid "OmniKassa" +#~ msgstr "OmniKassa" + +#, fuzzy +#~ msgid "Triodos" +#~ msgstr "Triodos Bank" + +#, fuzzy +#~ msgid "https://www.payvision.com/pricing" +#~ msgstr "https://www.adyen.com/fr_FR/pricing" + +#~ msgid "Synchronized payment date" +#~ msgstr "Date de paiement synchronisée" + +#~ msgid "" +#~ "Synchronized payment date allows recurring payments on a pre-defined day " +#~ "or date, instead of on expiration of the first period." +#~ msgstr "" +#~ "La date de paiement synchronisée permet des paiements récurrents sur un " +#~ "jour ou une date prédéfinis, au lieu de l’expiration de la première " +#~ "période." + +#, fuzzy +#~ msgid "Follow interval starting from first payment date" +#~ msgstr "Suivre l'intervalle à partir de la première date de paiement" + +#~ msgid "last" +#~ msgstr "dernier" + +#~ msgid "Prorate first payment amount" +#~ msgstr "Prorate premier montant de paiement" + +#~ msgid "Subscription expired by %s." +#~ msgstr "Abonnement expiré par %s." + +#~ msgid "Default: %s." +#~ msgstr "Par défaut: %s." + +#~ msgctxt "Recurring payment" +#~ msgid "Interval" +#~ msgstr "Intervalle" + +#~ msgctxt "Recurring payment" +#~ msgid "Frequency" +#~ msgstr "Fréquence" + +#~ msgid "%s week" +#~ msgid_plural "%s weeks" +#~ msgstr[0] "%s semaine" +#~ msgstr[1] "%s semaines" + +#, fuzzy +#~ msgid "" +#~ "On the tools page you can find some additional features and information." +#~ msgstr "" +#~ "Sur la page outils, vous pouvez trouver des fonctionnalités et des " +#~ "informations supplémentaires." + +#, fuzzy +#~ msgid "" +#~ "The system status page gives you some basic information about your " +#~ "WordPress installation which come in handy if you are having issues." +#~ msgstr "" +#~ "La page d'état du système vous donne quelques informations de base sur " +#~ "votre installation WordPress qui sont utiles si vous avez des problèmes." + +#~ msgid "iDEAL Status" +#~ msgstr "État iDEAL" + +#, fuzzy +#~ msgid "" +#~ "The iDEAL status page gives you information about the iDEAL status of the " +#~ "various banks who offer iDEAL." +#~ msgstr "" +#~ "La page de statut iDEAL vous donne des informations sur le statut iDEAL " +#~ "des différentes banques qui offrent iDEAL." + +#~ msgid "Pages Generator" +#~ msgstr "Générateur de pages" + +#, fuzzy +#~ msgid "" +#~ "With the pages generator tool you can easily generate some optional " +#~ "payment status pages." +#~ msgstr "" +#~ "Avec l'outil générateur de pages, vous pouvez facilement générer des " +#~ "pages d'état de paiement facultatives." + +#~ msgid "Gateways" +#~ msgstr "Passerelles" + +#, fuzzy +#~ msgid "" +#~ "The gateways page gives you an overview of all the gateways that er " +#~ "supported by the Pronamic Pay plugin." +#~ msgstr "" +#~ "La page des passerelles vous donne un aperçu de toutes les passerelles " +#~ "qui er pris en charge par le plugin De paiement pronamic." + +#, fuzzy +#~ msgid "" +#~ "The extensions page gives you an overview of all the extensions that er " +#~ "supported by the Pronamic Pay plugin." +#~ msgstr "" +#~ "La page extensions vous donne un aperçu de toutes les extensions que er " +#~ "pris en charge par le plugin De paiement pronamic." + +#~ msgid "Methods" +#~ msgstr "Méthodes" + +#, fuzzy +#~ msgid "" +#~ "The methods page gives you an overview of all the methods that er " +#~ "supported by the Pronamic Pay plugin." +#~ msgstr "" +#~ "La page méthodes vous donne un aperçu de toutes les méthodes qui er pris " +#~ "en charge par le plugin De paiement pronamic." + +#~ msgid "Documentation" +#~ msgstr "Documentation" + +#, fuzzy +#~ msgid "" +#~ "The documentation page has an overview of all kind of documentation files " +#~ "from different payment providers." +#~ msgstr "" +#~ "La page de documentation a un aperçu de toutes sortes de fichiers de " +#~ "documentation de différents fournisseurs de paiement." + +#, fuzzy +#~ msgid "" +#~ "The brand page has some additional images and banners which you could add " +#~ "to your WordPress website." +#~ msgstr "" +#~ "La page de la marque contient des images et des bannières supplémentaires " +#~ "que vous pourriez ajouter à votre site Web WordPress." + +#~ msgid "" +#~ "The license page gives you additional information about your license and " +#~ "license key." +#~ msgstr "" +#~ "La page de licence fournit des informations supplémentaires sur votre " +#~ "licence et votre clé de licence." + +#~ msgid "Telephone Nnumber" +#~ msgstr "Numéro de téléphone" + +#~ msgid "Hold email notifications until payment is received." +#~ msgstr "" +#~ "Conservez les notifications par courrier électronique jusqu’à la " +#~ "réception du paiement." + +#~ msgid "is" +#~ msgstr "est" + +#~ msgid "is not" +#~ msgstr "n'est pas" + +#, fuzzy +#~ msgid "" +#~ "To create a condition, your form must contain a drop down, checkbox or " +#~ "multiple choice field." +#~ msgstr "" +#~ "Pour créer une condition, votre formulaire doit contenir une chute vers " +#~ "le bas, une case à cocher ou un champ à choix multiples." + +#~ msgid "AppThemes" +#~ msgstr "AppThemes" + +#~ msgid "Order #%s" +#~ msgstr "Commande #%s" + +#~ msgid "AppThemes Order" +#~ msgstr "Ordre AppThemes" + +#~ msgid "General Information" +#~ msgstr "Informations générales" + +#~ msgid "iDEAL Options" +#~ msgstr "Options iDEAL" + +#~ msgid "Enable iDEAL" +#~ msgstr "Activer iDEAL" + +#~ msgid "iDEAL Configuration" +#~ msgstr "Configuration iDEAL" + +#~ msgid "ClassiPress" +#~ msgstr "ClassiPress" + +#~ msgid "ClassiPress Order" +#~ msgstr "Ordre ClassiPress" + +#~ msgid "Advertisement %s" +#~ msgstr "Publicité %s" + +#~ msgid "Adds the ability for users to checkout with iDEAL." +#~ msgstr "" +#~ "Ajoute la possibilité pour les utilisateurs de passer à la caisse avec " +#~ "iDEAL." + +#~ msgctxt "Payment method field" +#~ msgid "All" +#~ msgstr "Tout" + +#~ msgid "iThemes Exchange" +#~ msgstr "iThemes Exchange" + +#~ msgid "iThemes Exchange Order" +#~ msgstr "Ordre iThemes Exchange" + +#~ msgid "iThemes Exchange order %s" +#~ msgstr "Ordre iThemes Exchange %s" + +#~ msgid "Back to Add-ons" +#~ msgstr "Revenir à Add-ons" + +#~ msgid "iDEAL payment cancelled." +#~ msgstr "Paiement iDEAL annulé." + +#~ msgid "iDEAL payment expired." +#~ msgstr "Paiement iDEAL expiré." + +#~ msgid "iDEAL payment failed." +#~ msgstr "Paiement iDEAL échoué." + +#~ msgid "iDEAL payment completed." +#~ msgstr "Paiement iDEAL terminé." + +#~ msgid "iDEAL payment open." +#~ msgstr "Paiement iDEAL ouvert." + +#~ msgid "iDEAL payment unknown." +#~ msgstr "Paiement iDEAL inconnu." + +#~ msgid "Jigoshop" +#~ msgstr "Jigoshop" + +#~ msgid "Jigoshop Order" +#~ msgstr "Ordre Jigoshop" + +#~ msgid "Allow iDEAL payments." +#~ msgstr "Autoriser les paiements iDEAL." + +#~ msgid "This controls the description which the user sees during checkout." +#~ msgstr "" +#~ "Ceci détermine la description que les utilisateurs verront durant le " +#~ "réglement." + +#~ msgid "Pending iDEAL payment." +#~ msgstr "Paiement iDEAL en attente." + +#~ msgid "Membership" +#~ msgstr "Membership" + +#~ msgid "Transaction #%s" +#~ msgstr "Transaction #%s" + +#~ msgid "Membership Transaction" +#~ msgstr "Transaction Membership" + +#~ msgid "iDEAL - Online payment through your own bank" +#~ msgstr "iDEAL - Paiement en ligne via votre propre banque." + +#~ msgid "Button image URL" +#~ msgstr "URL d'image de bouton" + +#~ msgid "Button description" +#~ msgstr "Description du bouton" + +#~ msgid "Shopp" +#~ msgstr "Shopp" + +#~ msgid "Shopp Order" +#~ msgstr "Ordre Shopp" + +#~ msgid "Select configuration" +#~ msgstr "Sélectionner la configuration" + +#, fuzzy +#~ msgid "" +#~ "You have chosen the payment method \"Bank transfer\". To complete your " +#~ "payment, please transfer the amount to the payment service provider " +#~ "(%1$s).\n" +#~ "\n" +#~ "Account holder: %2$s\n" +#~ "Account IBAN: %3$s\n" +#~ "Account BIC: %4$s\n" +#~ "Amount: %5$s\n" +#~ "Transaction reference: %6$s\n" +#~ "\n" +#~ "Please note: only payments with the mentioned transaction reference " +#~ "can be processed." +#~ msgstr "" +#~ "Vous avez choisi le mode de paiement \"Transfert bancaire\". Pour " +#~ "compléter votre paiement, veuillez transférer le montant au fournisseur " +#~ "de services de paiement (%1$s).\n" +#~ "\n" +#~ "Titulaire du compte : %2$s\n" +#~ "Compte IBAN: %3$s\n" +#~ "Compte BIC: %4$s\n" +#~ "Montant: %5$s\n" +#~ "Référence de transaction : %6$s\n" +#~ "\n" +#~ "Veuillez noter que seuls les paiements avec la référence de " +#~ "transaction mentionnée peuvent être traités." + +#~ msgid "Customer live ID" +#~ msgstr "ID en direct du client" + +#~ msgid "Customer test ID" +#~ msgstr "ID de test du client" + +#, fuzzy +#~ msgid "" +#~ "Payment status updates will be processed without any additional " +#~ "configuration." +#~ msgstr "" +#~ "Les mises à jour de l'état des paiements seront traitées sans " +#~ "configuration supplémentaire." + +#~ msgid "Time" +#~ msgstr "Heure" + +#~ msgid "Subscription changed" +#~ msgstr "Abonnement modifié" + +#~ msgid "%s time" +#~ msgid_plural "%s times" +#~ msgstr[0] "%s fois" +#~ msgstr[1] "%s fois" + +#~ msgid "Data" +#~ msgstr "Données" diff --git a/wp-content/plugins/pronamic-ideal/languages/pronamic_ideal-nl_NL.mo b/wp-content/plugins/pronamic-ideal/languages/pronamic_ideal-nl_NL.mo new file mode 100644 index 00000000..3f17647d Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/languages/pronamic_ideal-nl_NL.mo differ diff --git a/wp-content/plugins/pronamic-ideal/languages/pronamic_ideal-nl_NL.po b/wp-content/plugins/pronamic-ideal/languages/pronamic_ideal-nl_NL.po new file mode 100644 index 00000000..6da81d90 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/languages/pronamic_ideal-nl_NL.po @@ -0,0 +1,8099 @@ +msgid "" +msgstr "" +"Project-Id-Version: Pronamic Pay\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pronamic-ideal\n" +"POT-Creation-Date: 2021-01-21T15:41:59+00:00\n" +"PO-Revision-Date: 2021-01-21 16:44+0100\n" +"Last-Translator: Reüel van der Steege \n" +"Language-Team: Pronamic \n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.1\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#. Plugin Name of the plugin +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:26 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:29 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:278 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentAction.php:35 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:78 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:121 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:52 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:153 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:100 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:1003 +#: vendor/wp-pay/core/src/Payments/StatusChecker.php:169 +#: vendor/wp-pay/core/views/notice-license.php:20 +#: vendor/wp-pay/core/views/notice-license.php:28 +#: vendor/wp-pay/core/views/notice-webhook-url.php:51 +msgid "Pronamic Pay" +msgstr "Pronamic Pay" + +#. Plugin URI of the plugin +#: admin/tab-getting-started.php:169 +msgid "https://www.pronamic.eu/plugins/pronamic-ideal/" +msgstr "https://www.pronamic.eu/plugins/pronamic-ideal/" + +#. Description of the plugin +msgid "" +"The Pronamic Pay plugin adds payment methods like iDEAL, Bancontact, credit " +"card and more to your WordPress site for a variety of payment providers." +msgstr "" +"De Pronamic Pay plugin voegt betaalmethoden zoals iDEAL, Bancontact, " +"creditcard en meer toe aan je WordPress website voor diverse " +"betalingsproviders." + +#. Author of the plugin +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:41 +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:44 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:60 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:84 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:53 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:66 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:194 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:61 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:101 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:162 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:103 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:104 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:121 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:217 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:98 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:99 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:49 +msgid "Pronamic" +msgstr "Pronamic" + +#. Author URI of the plugin +msgid "https://www.pronamic.eu/" +msgstr "https://www.pronamic.nl/" + +#: admin/methods-wp-admin.php:17 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:230 +msgid "Icon" +msgstr "Icoon" + +#: admin/methods-wp-admin.php:18 +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:55 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:58 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:403 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:128 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:54 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:349 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:31 +#: vendor/wp-pay/core/views/tab-extensions.php:32 +msgid "Name" +msgstr "Naam" + +#: admin/methods-wp-admin.php:19 +msgid "Website" +msgstr "Website" + +#: admin/page-about.php:26 vendor/wp-pay/core/src/Admin/AdminAboutPage.php:70 +msgid "Welcome to Pronamic Pay" +msgstr "Welkom bij Pronamic Pay" + +#. translators: %s: Plugin version number +#: admin/page-about.php:33 +msgid "" +"Thanks for installing Pronamic Pay. Version %s is more powerful, stable and " +"secure than ever before. We hope you enjoy using it." +msgstr "" +"Bedankt voor het installeren van Pronamic Pay. Versie %s is krachtiger, " +"stabieler en veiliger dan ooit tevoren. We hopen dat je het met plezier " +"gebruikt." + +#. translators: %s: Plugin version number +#: admin/page-about.php:45 +msgid "Version: %s" +msgstr "Versie: %s" + +#: admin/page-about.php:56 +msgid "What is new?" +msgstr "Wat is nieuw?" + +#: admin/page-about.php:57 vendor/wp-pay/core/views/page-dashboard.php:377 +msgid "Getting started" +msgstr "Om te beginnen" + +#: admin/tab-getting-started.php:19 +msgid "Step 1: open an account with a payment provider" +msgstr "Stap 1: open een account bij een betalingsprovider" + +#: admin/tab-getting-started.php:24 +msgid "" +"To start accepting online payments, you'll first need to register with a " +"payment provider. Payment\n" +"providers are responsible for the actual processing of transactions. We " +"support most popular Dutch payment\n" +"providers and banks, but are not a payment provider ourselves. The Pronamic " +"Pay plugin is the glue between\n" +"the chosen payment provider and a wide variety of supported e-commerce " +"plugins." +msgstr "" +"Om te beginnen met het ontvangen van online betalingen, dien je je eerst bij " +"een betalingsprovider te registreren. Betalingsproviders verzorgen de " +"daadwerkelijke verwerking van betalingstransacties. We ondersteunen de " +"meeste populaire betalingsproviders en banken, maar zijn zelf geen " +"betalingsprovider. De Pronamic Pay plugin maakt de koppeling tussen de " +"gekozen betalingsprovider en een uitgebreid aanbod aan ondersteunde e-" +"commerce plugins." + +#: admin/tab-getting-started.php:41 +msgid "https://www.pronamic.eu/payment-providers/" +msgstr "https://www.pronamic.nl/betaalproviders/" + +#: admin/tab-getting-started.php:42 +msgid "View supported payment providers" +msgstr "Bekijk ondersteunde betalingsproviders" + +#: admin/tab-getting-started.php:60 +msgid "Step 2: add payment provider configuration" +msgstr "Stap 2: betalingsprovider configuratie toevoegen" + +#: admin/tab-getting-started.php:65 +msgid "" +"Create a new configuration via Pay » Configurations » Add new. The account " +"details to use\n" +"are provided by the payment provider via e-mail or through a dashboard." +msgstr "" +"Maak een nieuwe configuratie aan via Betalingen » Configuraties » Nieuwe " +"toevoegen. De te gebruiken account gegevens ontvang je van de " +"betalingsprovider via e-mail of via het dashboard van de betalingsprovider." + +#: admin/tab-getting-started.php:77 +msgid "" +"Some payment providers need additional setup to receive automatic payment " +"status updates in WordPress. Please\n" +"see the \"Transaction Feedback\" tab of the configuration for details." +msgstr "" +"Sommige betalingsproviders hebben extra configuratie nodig om de " +"betalingsstatus automatisch in WordPress te ontvangen. Zie het tabblad\n" +"\"Transactie feedback\" bij het bewerken van de configuratie." + +#: admin/tab-getting-started.php:99 +msgid "Add new payment provider configuration" +msgstr "Nieuwe betalingsprovider configuratie toevoegen" + +#: admin/tab-getting-started.php:109 +msgid "Step 3: test configuration" +msgstr "Stap 3: test configuratie" + +#: admin/tab-getting-started.php:114 +msgid "" +"After the payment provider configuration has been added, the \"Test\" " +"section below the\n" +"settings box can be used to test the configuration. You can choose from " +"various payment methods (depending on the\n" +"payment provider) and enter an amount for the payment. The configuration is " +"working properly if you are redirected to a\n" +"screen that mentions the same amount." +msgstr "" +"Nadat de betalingsprovider configuratie is toegevoegd, kan de \"Test\" " +"sectie onder de instellingen gebruikt worden om de configuratie te testen. " +"Je kunt (afhankelijk van de betalingsrprovider) kiezen uit diverse " +"betaalmethoden en een bedrag invullen voor de testbetalingen. De " +"configuratie is correct aangemaakt indien je wordt doorgestuurd naar een " +"betaalscherm waarop hetzelfde bedrag vermeld is." + +#: admin/tab-getting-started.php:128 +msgid "" +"Testing different amounts might be mandatory for your payment provider. If " +"so, an additional box with\n" +"amounts will be shown. You need to test all these amounts before your live " +"account will be activated by the payment provider." +msgstr "" +"Het testen van diverse bedragen kan verplicht zijn voor jouw " +"betalingsprovider. Indien dat het geval is, zal een extra tabel met bedragen " +"getoond worden. Je dient testbetalingen voor al deze bedragen uit te voeren, " +"alvorens de live account door de betalingsprovider geactiveerd zal worden." + +#: admin/tab-getting-started.php:149 +msgid "Step 4: configure e-commerce plugin" +msgstr "Stap 4: e-commerce plugin instellen" + +#: admin/tab-getting-started.php:154 +msgid "" +"To actually use the configuration to receive payments, you need to configure " +"your e-commerce\n" +"plugin. Many popular e-commerce plugins are supported. These plugins usually " +"have their own payment settings\n" +"page, where you choose which configuration to use in the payment methods " +"that are provided by the Pronamic Pay plugin." +msgstr "" +"Om de configuratie daadwerkelijk te gebruiken voor het ontvangen van " +"betalingen, dien je een e-commerce plugin in te stellen. Veel populaire e-" +"commerce plugins worden ondersteund. Deze plugins hebben over het algemeen " +"een eigen instellingen pagina voor het afrekenen, waar je de configuratie " +"kunt instellen in de betaalmethoden die door Pronamic Pay zijn toegevoegd." + +#: admin/tab-getting-started.php:170 +msgid "View supported e-commerce plugins" +msgstr "Bekijk ondersteunde e-commerce plugins" + +#: admin/tab-new.php:18 +msgid "New Logo" +msgstr "Nieuw logo" + +#: admin/tab-new.php:23 +msgid "" +"With the newest 5.8 version of Pronamic Pay we’re introducing a totally new " +"brand identity. Just as our Pronamic logo we’re using the letter ‘P’, from " +"Pay, as a recognition point. Our new colors yellow and blue are supporting " +"the sector. Yellow stands for prosperity and gold. Blue stands for safety " +"and our Dutch roots." +msgstr "" +"In de Pronamic Pay 5.8 release voeren we een rebranding door aan onze Pay " +"plugin. Een eigen logo en huisstijl. Net als het beeldmerk van Pronamic " +"hanteren we de letter ‘P’, afgeleid van Pay, als logo." + +#: admin/tab-new.php:34 +msgid "" +"With this new identity we are trying to create a uniform and recognizable " +"brand for the future. Our new brand logo and identity is visible when you " +"visit our WordPress plugin page. Also, after updating to version 5.8, a new " +"WordPress admin icon is shown." +msgstr "" +"Het kleurgebruik sluit aan bij het gedachtegoed van de plugin. Goudgeel " +"staat uiteraard voor goud, muntgeld en welvaart. Blauw is een sterke " +"tegenhanger en staat voor betrouwbaarheid en de link met Nederland." + +#: admin/tab-new.php:44 +msgid "" +"https://www.wp-pay.org/wp-content/uploads/2019/10/pronamic-pay-5.8-update-" +"banner-en.png" +msgstr "" +"https://www.wp-pay.org/wp-content/uploads/2019/10/pronamic-pay-5.8-update-" +"banner-nl.png" + +#: admin/tab-new.php:54 +msgid "WordPress Health Status" +msgstr "WordPress sitediagnose" + +#: admin/tab-new.php:59 +msgid "" +"WordPress version 5.2 introduced the WordPress Health Status page. We’ve " +"migrated our Pronamic Pay status page and combined it with the new WordPress " +"Health Status page. You can find the new page in your dashboard under " +"‘Tools’ » ‘Site Health’." +msgstr "" +"De Pronamic Pay plugin was altijd uitgerust met een eigen statuspagina. Op " +"deze pagina stond technisch informatie over de betreffende WordPress " +"omgeving. Bij het oplossen van problemen konden gebruikers deze pagina " +"raadplegen voor aanvullende informatie. In WordPress 5.2+ zit een " +"vergelijkbare sitediagnose pagina. We hebben onze eigen statuspagina daarom " +"samengevoegd in de nieuwe WordPress sitediagnose pagina. In de komende " +"releases willen we hier extra functionaliteiten aan toevoegen. Zo willen we " +"Pronamic Pay gebruikers beter informeren over de extensies die we " +"ondersteunen. De extensies die we ondersteunen vereisen namelijk een " +"minimale versie en zijn getest op een bepaalde versie. Mocht dit afwijken " +"met de geïnstalleerde plugins dan kunnen we gebruikers hier wanneer nodig " +"over waarschuwen. Je kunt de sitediagnose vanaf nu vinden onder " +"‘Gereedschap’ » ‘Sitediagnose’." + +#: admin/tab-new.php:71 +msgid "Rabobank - OmniKassa 2.0" +msgstr "Rabobank - OmniKassa 2.0" + +#: admin/tab-new.php:76 +msgid "" +"We’ve enhanced the ‘Order ID’ reference that our plugin communicates and " +"gives back to OmniKassa 2.0. The length of the payment reference is " +"increased from 10 to 24 characters. Our plugin monitor reads the given " +"‘Order ID’ and checks if it answers the OmniKassa 2.0 demands. The reference " +"field may only contain alphanumeric characters (a-z, A-Z, 0-9). Other " +"characters, for example ‘.’, ‘@’, ‘_’, are not allowed." +msgstr "" +"In versie 5.8 hebben we verbeteringen doorgevoerd in de ‘Order ID’ (ook wel " +"‘Referentie’) die de Pronamic Pay plugin doorgeeft van je WordPress website " +"naar OmniKassa 2.0. Zo hebben we de maximale lengte gewijzigd van 10 naar 24 " +"tekens. Daarnaast controleert de Pronamic Pay plugin beter of de ‘Order ID’ " +"voldoet aan de vereisten van OmniKassa 2.0. Het ‘Order ID’ veld mag namelijk " +"alleen strikt alfanumerieke tekens (a-z, A-Z, 0-9) bevatten. Andere tekens " +"zoals ‘.’, ‘@‘, ‘_’, etc. zijn niet toegestaan." + +#: admin/tab-new.php:96 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:63 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:267 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:325 +msgid "Gravity Forms" +msgstr "Gravity Forms" + +#: admin/tab-new.php:101 +msgid "" +"Support for the Gravity Forms plugin within a WordPress multisite is " +"enhanced. Our Gravity Forms extension is not loaded if Gravity Forms is not " +"activated in one of the network sites. We’ve also updated the Gravity Forms " +"internationalisation. The text strings in our extension are now better " +"translatable, even if your WordPress site uses a Right-to-Left text " +"direction." +msgstr "" +"De ondersteuning voor Gravity Forms binnen de Pronamic Pay plugin in een " +"multisite WordPress website is verbeterd. De extensie wordt niet langer " +"ingeladen als de Gravity Forms plugin op een website binnen de multisite " +"niet actief is. Daarnaast hebben we verbeteringen doorgevoerd in de " +"internationalisering van de Gravity Forms extensie. Een aantal teksten en " +"instelingen zijn nu beter te vertalen. We hebben hier zelfs rekening " +"gehouden met talen waarbij de schrijfrichting van rechts naar links is." + +#: admin/tab-new.php:113 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:37 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:420 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:428 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:436 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:535 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:627 +msgid "Restrict Content Pro" +msgstr "Restrict Content Pro" + +#: admin/tab-new.php:118 +msgid "" +"The team of Sandhills Development, the developers behind Restrict Content " +"Pro are very active. Version 3.0 of their plugin is released in february " +"2019. With this 3.0 release we needed to update our support for the plugin. " +"Sadly some new features in Restrict Content Pro 3.0 weren’t backwards " +"compatible. Therefor we needed to rewrite some elements of our extension. " +"The biggest improvement within Restrict Content Pro 3.0 regards the " +"membership renewal process. After a recurring payment is created a " +"membership is instantly extended. Previously this would only happen after a " +"payment was successful, this process could take up to 5 days. Now if a " +"payment fails or expires the membership will temporarily stop and will get " +"the ‘pending’ status." +msgstr "" +"De Restrict Content Pro plugin wordt zeer actief doorontwikkeld door het " +"Sandhills Development team. Sinds versie 3.0 is gelanceerd op 27 februari " +"2019 hebben wij daardoor ook de nodige aanpassingen moeten doorvoeren. " +"Versie 3 van de Restrict Content Pro plugin functioneerde namelijk niet goed " +"met de Pronamic Pay plugin. De Restrict Content Pro plugin was namelijk niet " +"helemaal achterwaarts compatibel. In deze release hebben we opnieuw de " +"nodige verbeteringen doorgevoerd. De grootste en belangrijkste wijziging in " +"deze release is dat de Restrict Content Pro memberships direct worden " +"vernieuwd zodra er een vervolgbetaling wordt aangemaakt/opgestart. Voorheen " +"werd de membership pas vernieuwd als de vervolgbetaling succesvol was. Dit " +"was niet handig omdat de status van een vervolgbetaling soms pas na 5 " +"werkdagen bekend is. Zodra een vervolgbetaling mislukt verloopt het Restrict " +"Content Pro membership en krijgt deze de ‘in afwachting’ (pending) status." + +#. translators: %d: configuration ID +#: includes/updates/update-2.0.0.php:104 +msgid "Configuration %d" +msgstr "Configuratie %d" + +#. translators: %d: payment feed ID +#: includes/updates/update-2.0.0.php:280 +msgid "Payment Form %d" +msgstr "Betalingsformulier %d" + +#. translators: %d: payment ID +#: includes/updates/update-2.0.0.php:401 +msgid "Payment %d" +msgstr "Betaling %d" + +#: pronamic-ideal.php:240 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-" +"wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.nl/support/pronamic-ideal-koppelen-aan-ing-ideal-basic/" + +#: pronamic-ideal.php:257 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-ing-ideal-advanced-v3-with-" +"wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.nl/support/pronamic-ideal-koppelen-met-ing-bank-ideal-" +"advanced-v3/" + +#: pronamic-ideal.php:275 vendor/wp-pay-gateways/mollie/tests/bootstrap.php:24 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-mollie-with-wordpress-via-" +"pronamic-pay/" +msgstr "https://www.pronamic.nl/support/pronamic-ideal-koppelen-aan-mollie/" + +#: pronamic-ideal.php:316 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-rabobank-ideal-professional-" +"v3-with-wordpress-via-pronamic-pay/" +msgstr "" +"https://www.pronamic.nl/support/pronamic-ideal-koppelen-met-rabobank-ideal-" +"professional-v3/" + +#: vendor/wp-pay-extensions/charitable/src/BancontactGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/BancontactGateway.php:35 +#: vendor/wp-pay-extensions/give/src/BancontactGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:209 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:218 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:231 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:109 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:288 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:301 +msgid "Bancontact" +msgstr "Bancontact" + +#: vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php:35 +#: vendor/wp-pay-extensions/give/src/BankTransferGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:210 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:114 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:289 +msgid "Bank Transfer" +msgstr "Bankoverschrijving" + +#. translators: %s: Charitable donation ID +#: vendor/wp-pay-extensions/charitable/src/CharitableHelper.php:39 +msgid "Charitable donation %s" +msgstr "Charitable donatie %s" + +#: vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php:35 +#: vendor/wp-pay-extensions/give/src/CreditCardGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:212 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:119 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:271 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:296 +msgid "Credit Card" +msgstr "Creditcard" + +#: vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php:35 +#: vendor/wp-pay-extensions/give/src/DirectDebitGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:213 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:275 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:297 +msgid "Direct Debit" +msgstr "Incasso" + +#: vendor/wp-pay-extensions/charitable/src/Extension.php:36 +#: vendor/wp-pay-extensions/charitable/src/Extension.php:252 +msgid "Charitable" +msgstr "Charitable" + +#. translators: %s: source id +#: vendor/wp-pay-extensions/charitable/src/Extension.php:258 +#: vendor/wp-pay-extensions/give/src/Extension.php:225 +msgid "Donation %s" +msgstr "Donatie %s" + +#: vendor/wp-pay-extensions/charitable/src/Extension.php:273 +msgid "Charitable Donation" +msgstr "Charitable donatie" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:64 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:299 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:118 +#: vendor/wp-pay-extensions/give/src/Gateway.php:121 +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:65 +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:126 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:405 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:109 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:887 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:152 +#: vendor/wp-pay-extensions/s2member/src/Settings.php:41 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:240 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:251 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:265 +#: views/eshop/settings-meta-box.php:26 +msgid "Configuration" +msgstr "Configuratie" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:72 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:124 +#: vendor/wp-pay-extensions/give/src/Gateway.php:130 +msgid "Transaction description" +msgstr "Transactiebeschrijving" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:74 +msgid "Charitable donation {donation_id}" +msgstr "Charitable donatie {donation_id}" + +#. translators: %s: {tag} +#. translators: %s: {order_id} {payment_id} +#. translators: %s: {site_url} {home_url} +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:76 +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:126 +#: vendor/wp-pay-extensions/give/src/Gateway.php:133 +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:108 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:173 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:199 +msgid "Available tags: %s" +msgstr "Beschikbare tags: %s" + +#: vendor/wp-pay-extensions/charitable/src/Gateway.php:84 +#: vendor/wp-pay-extensions/give/src/Gateway.php:111 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:163 +msgid "" +"This payment method does not use a predefined payment method for the " +"payment. Some payment providers list all activated payment methods for your " +"account to choose from. Use payment method specific gateways (such as " +"'iDEAL') to let customers choose their desired payment method at checkout." +msgstr "" +"Deze betaalmethode gebruikt geen vooraf ingestelde betaalmethode voor de " +"betaling. Sommige betalingsproviders tonen alle voor jouw account " +"geactiveerde betaalmethoden om uit te kiezen. Gebruik de gateways voor " +"specifieke betaalmethoden (zoals 'iDEAL') om klanten de gewenste " +"betaalmethode bij het afrekenen te laten kiezen." + +#: vendor/wp-pay-extensions/charitable/src/IDealGateway.php:34 +#: vendor/wp-pay-extensions/charitable/src/IDealGateway.php:37 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:61 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:186 +#: vendor/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php:43 +#: vendor/wp-pay-extensions/give/src/IDealGateway.php:32 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:226 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:238 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:246 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:135 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:306 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:318 +msgid "iDEAL" +msgstr "iDEAL" + +#: vendor/wp-pay-extensions/charitable/src/SofortGateway.php:32 +#: vendor/wp-pay-extensions/charitable/src/SofortGateway.php:35 +#: vendor/wp-pay-extensions/give/src/SofortGateway.php:32 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:327 +msgid "SOFORT Banking" +msgstr "SOFORT Banking" + +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:52 +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:229 +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:253 +msgid "Contact Form 7" +msgstr "Contact Form 7" + +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:149 +msgid "Please wait while redirecting for payment" +msgstr "Een ogenblik geduld tijdens het doorsturen voor de betaling" + +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:241 +#: vendor/wp-pay-extensions/contact-form-7/src/Extension.php:265 +msgid "Contact Form 7 Entry" +msgstr "Contact Form 7 inzending" + +#. translators: %s: payment data title +#: vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php:158 +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:385 +#: vendor/wp-pay-extensions/gravityforms/src/Processor.php:244 +#: vendor/wp-pay-extensions/memberpress/src/Pronamic.php:63 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:95 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:349 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:178 +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:120 +msgid "Payment for %s" +msgstr "Betaling voor %s" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php:161 +msgid "Contact Form 7 Entry @ %s" +msgstr "Contact Form 7 inzending @ %s" + +#. translators: %s: payment number +#: vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php:172 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:403 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:550 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:47 +msgid "Payment %s" +msgstr "Betaling %s" + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php:151 +msgid "Input amount is invalid." +msgstr "Ingevuld bedrag is ongeldig." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php:152 +msgid "The input amount is invalid." +msgstr "Het ingevulde bedrag is ongeldig." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php:166 +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:528 +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:540 +#: vendor/wp-pay-extensions/ninjaforms/src/IssuersField.php:94 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:456 +#: vendor/wp-pay/core/views/tab-system_status.php:395 +msgid "Issuer" +msgstr "Bankenlijst" + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php:194 +msgid "Payment method required." +msgstr "Betaalmethode vereist." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php:195 +msgid "The payment method is invalid." +msgstr "De betaalmethode is ongeldig." + +#: vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php:209 +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:58 +#: vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php:14 +msgid "Payment method" +msgstr "Betaalmethode" + +#. translators: 1: Pronamic Pay plugin name, 2: documentation URL anchor +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:14 +msgid "" +"Generate a tag for an issuer field. %1$s requires a field with the " +"`pronamic_pay_amount` option, but payment method and issuer fields are " +"optional in most cases. For step-by-step instructions on receiving payments " +"with Contact Form 7, please see %2$s." +msgstr "" +"Een formulier-tag genereren voor een bankenlijst. %1$s vereist een veld met " +"de optie `pronamic_pay_amount`, maar de betalingsmethode en bankenlijst " +"velden zijn in de meeste gevallen optioneel. Zie %2$s voor instructies over " +"het ontvangen van betalingen met Contact Form 7." + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:16 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:19 +msgid "" +"https://www.pronamic.eu/support/how-to-connect-contact-form-7-to-pronamic-" +"pay/" +msgstr "" +"https://www.pronamic.nl/support/pronamic-pay-koppelen-aan-contact-form-7/" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:16 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:19 +msgid "How to connect Contact Form 7 to Pronamic Pay" +msgstr "Pronamic Pay koppelen aan Contact Form 7" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:37 +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:42 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:40 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:45 +msgid "Field type" +msgstr "Veldtype" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:46 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:49 +msgid "Required field" +msgstr "Verplicht veld" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:66 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:108 +msgid "Id attribute" +msgstr "ID-attribuut" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:76 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:118 +msgid "Class attribute" +msgstr "Class-attribuut" + +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:91 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:133 +msgid "Insert Tag" +msgstr "Tag invoeren" + +#. translators: %s: mail-tag placeholder HTML +#: vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php:102 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:145 +msgid "" +"To use the value input through this field in a mail field, you need to " +"insert the corresponding mail-tag (%s) into the field on the Mail tab." +msgstr "" +"Om de ingevoerde waarde van dit veld te kunnen gebruiken in een e-mailveld, " +"moet de corresponderende e-mail-tag (%s) in het veld op het mail-tabblad " +"ingevoegd worden." + +#. translators: 1: Pronamic Pay plugin name, 2: documentation URL anchor +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:17 +msgid "" +"Generate a tag for a payment method field. %1$s requires a field with the " +"`pronamic_pay_amount` option, but payment method and issuer fields are " +"optional in most cases. For step-by-step instructions on receiving payments " +"with Contact Form 7, please see %2$s." +msgstr "" +"Een formulier-tag genereren voor een betaalmethode-veld. %1$s vereist een " +"veld met de optie `pronamic_pay_amount`, maar de betalingsmethode en " +"bankenlijst velden zijn in de meeste gevallen optioneel. Zie %2$s voor " +"instructies over het ontvangen van betalingen met Contact Form 7." + +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:68 +#: vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php:73 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:83 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:172 +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:313 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php:88 +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:38 +msgid "Payment Methods" +msgstr "Betaalmethoden" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:29 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:397 +msgid "Easy Digital Downloads" +msgstr "Easy Digital Downloads" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:240 +msgid "payment reserved at gateway" +msgstr "betaling gereserveerd bij betalingsprovider" + +#. translators: %s: payment id +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:260 +msgid "payment #%s" +msgstr "betaling #%s" + +#. translators: %s: payment edit link +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:267 +msgid "" +"Create an invoice at payment gateway for %1$s after processing the order." +msgstr "" +"Maak een factuur bij de betalingsprovider voor %1$s na het verwerken van de " +"bestelling." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:278 +msgid "Payment completed." +msgstr "Betaling voltooid." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:290 +msgid "Payment open." +msgstr "Betaling open." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:294 +msgid "Payment unknown." +msgstr "Betaling onbekend." + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:418 +msgid "Easy Digital Downloads Order" +msgstr "Easy Digital Downloads bestelling" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:484 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:406 +msgid "Cancelled" +msgstr "Geannuleerd" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:498 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:528 +msgctxt "Easy Digital Downloads cancelled payment status" +msgid "Cancelled" +msgstr "Geannuleerd" + +#. translators: %s: count value +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php:504 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:183 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:142 +msgid "Cancelled (%s)" +msgid_plural "Cancelled (%s)" +msgstr[0] "Geannuleerd (%s)" +msgstr[1] "Geannuleerd (%s)" + +#. translators: 1: Gateway admin label prefix, 2: Gateway admin label +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:83 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:102 +msgid "%1$s - %2$s" +msgstr "%1$s - %2$s" + +#. translators: %s: admin label +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:168 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:141 +msgid "%s Settings" +msgstr "%s instellingen" + +#. translators: %s: gateway admin label +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:170 +msgid "Configure the %s settings" +msgstr "Configureer de %s instellingen" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:175 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:174 +msgid "Gateway Configuration" +msgstr "Betalingsgateway configuratie" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:182 +msgid "Checkout Label" +msgstr "Afrekenen label" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:190 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:220 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:338 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:510 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:525 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:60 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:62 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:61 +msgid "Description" +msgstr "Beschrijving" + +#. translators: %s: {edd_cart_details_name} +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:196 +msgid "Default: %s" +msgstr "Standaard: %s" + +#. translators: %s: {edd_cart_details_name} +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:198 +msgid "Available Tags: %s" +msgstr "Beschikbare tags: %s" + +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:311 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:561 +#: vendor/wp-pay-extensions/give/src/Gateway.php:263 +#: vendor/wp-pay-extensions/give/src/Gateway.php:341 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:251 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:274 +msgid "Payment Error" +msgstr "Betalingsfout" + +#. translators: %s: payment data JSON +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:314 +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:564 +msgid "" +"Payment creation failed before sending buyer to the payment provider. " +"Payment data: %s" +msgstr "" +"Het aanmaken van een betaling mislukte voordat de koper doorgestuurd werd " +"naar de betaalprovider. Betalingsinformatie: %s" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:370 +msgid "Easy Digital Downloads order %s" +msgstr "Easy Digital Downloads bestelling %s" + +#. translators: %s: payment id +#: vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php:596 +msgid "Payment %s pending." +msgstr "Betaling %s in afwachting." + +#. translators: %s: attendee ID +#: vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php:37 +msgid "Attendee %s" +msgstr "Deelnemer %s" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:45 +msgid "Event Espresso (legacy)" +msgstr "Event Espresso (verouderd)" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:177 +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:203 +msgid "Pay with iDEAL" +msgstr "Betaal met iDEAL" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:213 +msgid "Choose a different payment option" +msgstr "Kies een andere betaalmethode" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:275 +msgid "Click to toggle" +msgstr "Klik om te wisselen" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:289 +msgid "Deactivate Pronamic Pay?" +msgstr "Deactiveer Pronamic Pay?" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:322 +msgid "Update Settings" +msgstr "Instellingen bijwerken" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:330 +msgid "Activate Pronamic Pay?" +msgstr "Activeer Pronamic Pay?" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:421 +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:46 +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:164 +msgid "Event Espresso" +msgstr "Event Espresso" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:427 +msgid "Attendee #%s" +msgstr "Deelnemer #%s" + +#: vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php:442 +msgid "Event Espresso Attendee" +msgstr "Event Espresso deelnemer" + +#: vendor/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php:34 +msgid "Event Espresso transaction %s" +msgstr "Event Espresso transactie %s" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:170 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:379 +msgid "Transaction %s" +msgstr "Transactie %s" + +#: vendor/wp-pay-extensions/event-espresso/src/Extension.php:185 +msgid "Event Espresso Transaction" +msgstr "Event Espresso transactie" + +#. translators: %s: error message +#: vendor/wp-pay-extensions/event-espresso/src/Gateway.php:190 +msgid "Errors communicating with gateway: %s" +msgstr "Fouten communiceren met gateway: %s" + +#: vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php:127 +msgid "Event Espresso transaction {transaction_id}" +msgstr "Event Espresso transactie {transaction_id}" + +#: vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php:57 +msgid "Banks" +msgstr "Banken" + +#: vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php:74 +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:567 +msgid "Choose a bank for iDEAL payment" +msgstr "Kies een bank voor iDEAL-betaling" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:54 +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:244 +msgid "Formidable Forms" +msgstr "Formidable Forms" + +#. translators: %s: source id +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:258 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:275 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:333 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:241 +msgid "Entry #%s" +msgstr "Inzending #%s" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:275 +msgid "Formidable Forms Entry" +msgstr "Formidable Forms inzending" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:378 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:88 +msgid "Submission" +msgstr "Inzending" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:387 +msgid "Formidable entry %s" +msgstr "Formidable inzending %s" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:525 +msgid "Pronamic payment pending" +msgstr "Pronamic betaling in afwachting" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:526 +msgid "Pronamic payment success" +msgstr "Pronamic betaling voltooid" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:527 +msgid "Pronamic payment cancelled" +msgstr "Pronamic betaling geannuleerd" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:528 +msgid "Pronamic payment expired" +msgstr "Pronamic betaling verlopen" + +#: vendor/wp-pay-extensions/formidable-forms/src/Extension.php:529 +msgid "Pronamic payment failed" +msgstr "Pronamic betaling mislukt" + +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:94 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:722 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:735 +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:140 +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:218 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:265 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:552 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:69 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:110 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:77 +msgid "Payment Method" +msgstr "Betaalmethode" + +#: vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php:114 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:795 +msgid "Choose a payment method" +msgstr "Kies een betaalmethode" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:22 +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:223 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:264 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:340 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:290 +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:89 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:448 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:481 +#: vendor/wp-pay/core/views/form.php:50 +#: vendor/wp-pay/core/views/meta-box-form-options.php:53 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:110 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:68 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:70 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:85 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:31 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:29 +msgid "Amount" +msgstr "Bedrag" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:35 +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:71 +msgid "— Select Field —" +msgstr "— Selecteer veld —" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:98 +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:66 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:404 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:196 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:172 +msgid "Transaction Description" +msgstr "Transactiebeschrijving" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:107 +msgid "" +"Enter a transactaction description, you can use Formidable Forms shortcodes." +msgstr "" +"Vul een transactiebeschrijving in, je kunt Formidable Forms shortcodes " +"gebruiken." + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:116 +msgid "Notifications" +msgstr "Meldingen" + +#: vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php:125 +msgid "Delay email notifications until payment has been received." +msgstr "" +"Stel het versturen van e-mail meldingen uit totdat de betaling ontvangen is." + +#: vendor/wp-pay-extensions/give/src/Extension.php:51 +#: vendor/wp-pay-extensions/give/src/Extension.php:219 +msgid "Give" +msgstr "Give" + +#: vendor/wp-pay-extensions/give/src/Extension.php:240 +msgid "Give Donation" +msgstr "Give donatie" + +#: vendor/wp-pay-extensions/give/src/Gateway.php:138 +msgid "Give donation {donation_id}" +msgstr "Give donatie {donation_id}" + +#: vendor/wp-pay-extensions/give/src/Gateway.php:234 +msgid "Nonce verification has failed" +msgstr "Nonce verificatie is mislukt" + +#: vendor/wp-pay-extensions/give/src/Gateway.php:234 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:408 +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:527 +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:123 +#: vendor/wp-pay/core/src/Plugin.php:1072 vendor/wp-pay/core/views/form.php:185 +msgid "Error" +msgstr "Fout" + +#. translators: %s: payment data as JSON +#: vendor/wp-pay-extensions/give/src/Gateway.php:266 +msgid "" +"Payment creation failed before sending buyer to payment provider. Payment " +"data: %s" +msgstr "" +"Het aanmaken van een betaling mislukte voordat de klant doorgestuurd werd " +"naar de betalingsprovider. Betalingsinformatie: %s" + +#. translators: %s: Give donation ID +#: vendor/wp-pay-extensions/give/src/GiveHelper.php:36 +msgid "Give donation %s" +msgstr "Give donatie %s" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:65 +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:79 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:56 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:58 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:69 +msgid "Payment Feeds" +msgstr "Betalingsfeeds" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:115 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:102 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:836 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:208 +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:96 +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:134 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:1004 +#: vendor/wp-pay/core/src/Core/Gateway.php:769 +#: vendor/wp-pay/core/views/subscription-mandate.php:224 +#: vendor/wp-pay/core/views/subscription-renew.php:82 +msgid "Pay" +msgstr "Betalen" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:151 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:415 +msgid "Payment Status" +msgstr "Betalingsstatus" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:156 +msgid "Payment Date" +msgstr "Betalingsdatum" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:161 +msgid "Transaction Id" +msgstr "Transactie ID" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:166 +msgid "Payment Amount" +msgstr "Te betalen bedrag" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:171 +msgid "Pronamic Payment ID" +msgstr "Pronamic betaling ID" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:176 +msgid "Pronamic Pay Again URL" +msgstr "Pronamic Opnieuw Betalen URL" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:182 +msgid "Pronamic bank transfer recipient reference" +msgstr "Pronamic bankoverschrijving ontvanger referentie" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:187 +msgid "Pronamic bank transfer recipient bank name" +msgstr "Pronamic bankoverschrijving ontvanger banknaam" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:192 +msgid "Pronamic bank transfer recipient name" +msgstr "Pronamic bankoverschrijving ontvanger naam" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:197 +msgid "Pronamic bank transfer recipient IBAN" +msgstr "Pronamic bankoverschrijving ontvanger IBAN" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:202 +msgid "Pronamic bank transfer recipient BIC" +msgstr "Pronamic bankoverschrijving ontvanger BIC" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:207 +msgid "Pronamic bank transfer recipient city" +msgstr "Pronamic bankoverschrijving ontvanger plaats" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:212 +msgid "Pronamic bank transfer recipient country" +msgstr "Pronamic bankoverschrijving ontvanger land" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:217 +msgid "Pronamic bank transfer recipient account number" +msgstr "Pronamic bankoverschrijving ontvanger rekeningnummer" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:223 +msgid "Pronamic Subscription Payment ID" +msgstr "Pronamic abonnement betaling ID" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:228 +msgid "Pronamic Subscription Amount" +msgstr "Pronamic abonnement bedrag" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:233 +msgid "Pronamic Subscription Cancel URL" +msgstr "Pronamic abonnement annuleren URL" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:238 +msgid "Pronamic Subscription Renew URL" +msgstr "Pronamic abonnement vernieuwen URL" + +#: vendor/wp-pay-extensions/gravityforms/src/Admin.php:243 +msgid "Pronamic Subscription Renewal Date" +msgstr "Pronamic abonnement vernieuwingsdatum" + +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:63 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:214 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:82 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:167 +msgid "Title" +msgstr "Titel" + +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:64 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:84 +msgid "Form" +msgstr "Formulier" + +#: vendor/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php:67 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:86 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:341 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:292 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:172 +#: vendor/wp-pay/core/views/meta-box-notes.php:33 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:36 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:27 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:32 +#: vendor/wp-pay/core/views/tab-system_status.php:404 +msgid "Date" +msgstr "Datum" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:290 +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:348 +msgid "Gravity Forms Entry" +msgstr "Gravity Forms inzending" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:694 +msgid "Subscription manually activated." +msgstr "Abonnement handmatig geactiveerd." + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:849 +msgid "Subscription manually canceled." +msgstr "Abonnement handmatig geannuleerd." + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1219 +msgid "Subscribing the user to ActiveCampaign" +msgstr "De gebruiker inschrijven bij ActiveCampaign" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1225 +msgid "Subscribing the user to AWeber" +msgstr "De gebruiker inschrijven bij AWeber" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1240 +msgid "Subscribing the user to Campaign Monitor" +msgstr "De gebruiker inschrijven bij Campaign Monitor" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1256 +msgid "Subscribing the user to MailChimp" +msgstr "De gebruiker inschrijven bij MailChimp" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1272 +msgid "Creating quotes and invoices with Sliced Invoices" +msgstr "Offertes en facturen aanmaken met Sliced Invoices" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1278 +msgid "Sending estimates and invoices with Moneybird" +msgstr "Offertes en facturen versturen met Moneybird" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1284 +msgid "Sending data to Twilio" +msgstr "Gegevens versturen naar Twilio" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1290 +msgid "Sending a trigger to Webhooks" +msgstr "Een trigger naar Webhooks sturen" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1296 +msgid "Uploading files to Dropbox" +msgstr "Bestanden uploaden naar Dropbox" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1302 +msgid "Sending data to Zapier" +msgstr "Gegevens versturen naar Zapier" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1318 +msgid "Registering the user" +msgstr "De gebruiker registreren" + +#: vendor/wp-pay-extensions/gravityforms/src/Extension.php:1324 +msgid "Start the Workflow once payment has been received." +msgstr "Start de workflow zodra betaling is ontvangen." + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:72 +msgid "Payment Fields" +msgstr "Betaalvelden" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:102 +#: vendor/wp-pay/core/src/GatewayPostType.php:58 +msgid "Payment Gateway Configuration" +msgstr "Betalingsgateway configuratie" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:109 +msgid "— Use Payment Feed Setting —" +msgstr "— Gebruik betalingsfeed instelling —" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:126 +msgid "Display Mode" +msgstr "Weergavemodus" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:132 +msgid "— Use field default —" +msgstr "— Gebruik veld standaard —" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:133 +msgctxt "Field display mode" +msgid "Select" +msgstr "Uitschuifkeuzelijst" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:134 +msgctxt "Field display mode" +msgid "List with icons" +msgstr "Lijst met iconen" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:135 +msgctxt "Field display mode" +msgid "Small icons" +msgstr "Kleine iconen" + +#: vendor/wp-pay-extensions/gravityforms/src/Fields.php:136 +msgctxt "Field display mode" +msgid "Large icons" +msgstr "Grote iconen" + +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:495 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:63 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php:602 +msgid "New Payment Feed" +msgstr "Nieuwe betalingsfeed" + +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:505 +msgid "This field is not supported by your payment gateway." +msgstr "Dit veld wordt niet ondersteund door je betalingsgateway." + +#. translators: %s: new feed URL +#: vendor/wp-pay-extensions/gravityforms/src/IssuersField.php:508 +msgid "" +"Please remove it from this form or add a " +"supported payment gateway." +msgstr "" +"Verwijder het van dit formulier of voeg een " +"ondersteunde betalingsgateway toe." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:94 +msgid "Pronamic Pay Add-On" +msgstr "Pronamic Pay add-on" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:147 +msgid "Payment feed" +msgstr "Betalingsfeed" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:244 +msgid "Pay Feeds" +msgstr "Betalen feeds" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:256 +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:60 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:114 +#: vendor/wp-pay/core/src/GatewayPostType.php:59 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:54 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:53 +msgid "Add New" +msgstr "Nieuwe toevoegen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:420 +msgid "Default pay feed" +msgstr "Standaard betalingsfeed" + +#. translators: 1: , 2: +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:471 +msgid "This form doesn't have any pay feeds. Let's go %1$screate one%2$s." +msgstr "Dit formulier heeft nog geen betalingsfeeds. %1$sMaak er één aan%2$s." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:497 +msgid "Payment Completed" +msgstr "Betaling voltooid" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:498 +msgid "Payment Failed" +msgstr "Betaling mislukt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:499 +msgid "Payment Pending" +msgstr "Betaling in afwachting" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:502 +msgid "Subscription Created" +msgstr "Abonnement aangemaakt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:503 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:485 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:145 +#: vendor/wp-pay/core/src/Settings.php:99 +msgid "Subscription Canceled" +msgstr "Abonnement geannuleerd" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:504 +msgid "Subscription Expired" +msgstr "Abonnement verlopen" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:505 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:119 +msgid "Subscription Renewal Notice" +msgstr "Abonnement vernieuwingsmelding" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:506 +msgid "Subscription Payment Added" +msgstr "Abonnement betaling aangemaakt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php:507 +msgid "Subscription Payment Failed" +msgstr "Abonnement betaling mislukt" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:59 +msgid "Payment Feed" +msgstr "Betalingsfeed" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:61 +msgid "Add New Payment Feed" +msgstr "Nieuwe betalingsfeed" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:62 +msgid "Edit Payment Feed" +msgstr "Betalingsfeed bewerken" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:64 +msgid "All Payment Feeds" +msgstr "Alle betalingsfeeds" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:65 +msgid "View Payment Feed" +msgstr "Betalingsfeed bekijken" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:66 +msgid "Search Payment Feeds" +msgstr "Betalingsfeeds zoeken" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:67 +msgid "No payment feeds found." +msgstr "Geen betalingsfeeds gevonden." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:68 +msgid "No payment feeds found in Trash." +msgstr "Geen betalingsfeeds gevonden in prullenbak." + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:70 +msgid "Filter payment feeds list" +msgstr "Filter betalingsfeeds lijst" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:71 +msgid "Payment feeds list navigation" +msgstr "Betalingsfeeds lijst navigatie" + +#: vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php:72 +msgid "Payment feeds list" +msgstr "Betalingsfeeds lijst" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php:19 +msgid "There was an error updating this payment feed." +msgstr "Er ging iets fout tijdens het bijwerken van deze betalingsfeed." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php:24 +msgid "Payment feed updated successfully." +msgstr "Betalingsfeed succesvol bijgewerkt." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php:40 +msgid "Enter title here" +msgstr "Titel hier invoeren" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:65 +#: vendor/wp-pay-extensions/s2member/src/Settings.php:31 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:52 +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:26 +msgid "General" +msgstr "Algemeen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:66 +msgid "Status pages" +msgstr "Statuspagina's" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:67 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:332 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:333 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:611 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:288 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:508 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:52 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:151 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:36 +msgid "Subscription" +msgstr "Abonnement" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:68 +msgid "Fields" +msgstr "Velden" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:69 +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:30 +msgid "Advanced" +msgstr "Geavanceerd" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:87 +msgid "The Gravity Forms form to process payments for." +msgstr "Het Gravity Forms formulier om betalingen voor te verwerken." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:91 +msgid "— Select a form —" +msgstr "— Selecteer een formulier —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:112 +msgid "" +"Gateway configuration, created via Pay » Configurations." +msgstr "" +"Configuratie voor de betalingsprovider, aangemaakt via Betalen » " +"Configuraties." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:136 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:180 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:85 +#: vendor/wp-pay-gateways/icepay/src/Integration.php:83 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:262 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:161 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:210 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:465 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:52 +msgid "Order ID" +msgstr "Bestelling ID" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:139 +msgid "Order ID." +msgstr "Bestelling ID." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:152 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:215 +msgid "Default:" +msgstr "Standaard:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:172 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:235 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:299 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:95 +#: vendor/wp-pay-gateways/icepay/src/Integration.php:93 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:74 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:228 +msgid "Available tags:" +msgstr "Beschikbare tags:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:189 +msgid "" +"An order ID makes it easier to match payments from transaction overviews to " +"a form and is required by some payment providers." +msgstr "" +"Een bestelling ID maakt het eenvoudiger om betalingen vanuit " +"transactieoverzichten naar een formulier te kunnen herleiden en is vereist " +"voor sommige betalingsproviders." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:199 +msgid "" +"Transaction description that will be send with the payment. Use tags to " +"customize the description." +msgstr "" +"Transactiebeschrijving die met de betaling zal worden meegestuurd. Gebruik " +"tags voor aangepaste beschrijvingen." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:252 +msgid "" +"A description which uses tags and results in more than 32 characters will be " +"truncated." +msgstr "" +"Een beschrijving met tags die resulteert in meer dan 32 tekens wordt " +"afgekapt." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:258 +msgid "Send Notifications Delay" +msgstr "Uitgestelde meldingen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:260 +msgid "" +"Notifications for which sending will be delayed until the payment has been " +"received." +msgstr "" +"Meldingen waarvoor het versturen zal worden uitgesteld totdat de betaling " +"ontvangen is." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:264 +msgid "Delay sending notifications until payment has been received." +msgstr "Stel het versturen van meldingen uit totdat de betaling ontvangen is." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:321 +msgid "Admin notification" +msgstr "Beheerder melding" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:328 +msgid "User notification" +msgstr "Gebruiker melding" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:342 +msgid "Delay actions" +msgstr "Uitgestelde acties" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:344 +msgid "" +"Actions for which execution will be delayed until the payment has been " +"received." +msgstr "" +"Acties waarvoor de uitvoering zal worden uitgesteld totdat de betaling " +"ontvangen is." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:348 +msgid "Delay actions until payment has been received." +msgstr "Stel acties uit totdat de betaling ontvangen is." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:374 +msgid "Creating a post" +msgstr "Een bericht aanmaken" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:398 +msgid "" +"Set Gravity Forms confirmations, pages or URLs to redirect to after a " +"payment with the mentioned status." +msgstr "" +"Stel Gravity Forms bevestigingen, pagina's of URL's in om naar door te " +"sturen na een betaling met de genoemde status." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:405 +#: vendor/wp-pay/core/views/tab-system_status.php:398 +msgid "Success" +msgstr "Succes" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:407 +#: vendor/wp-pay/core/src/Plugin.php:1071 +msgid "Expired" +msgstr "Verlopen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:409 +msgid "Open" +msgstr "Open" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:446 +msgid "Confirmation:" +msgstr "Bevestiging:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:462 +msgid "Page:" +msgstr "Pagina:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:471 +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:197 +msgid "— Select —" +msgstr "— Selecteer —" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:481 +msgid "URL:" +msgstr "URL:" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:493 +msgid "Set the subscription details for recurring payments." +msgstr "Stel de abonnementsgegevens in voor terugkerende betalingen." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:500 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:506 +msgid "Recurring amount" +msgstr "Terugkerend bedrag" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:511 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:126 +msgid "None" +msgstr "Geen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:518 +msgid "Form total" +msgstr "Formulier totaal" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:525 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:570 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:624 +msgid "Form field" +msgstr "Formulierveld" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:539 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:545 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:495 +msgid "Interval" +msgstr "Interval" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:550 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:612 +msgid "Fixed" +msgstr "Vast" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:554 +msgctxt "Recurring payment" +msgid "Every" +msgstr "Elke" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:559 +msgid "day(s)" +msgstr "dag(en)" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:560 +msgid "week(s)" +msgstr "week/weken" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:561 +msgid "month(s)" +msgstr "maand(en)" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:562 +msgid "year(s)" +msgstr "jaar/jaren" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:576 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:141 +msgid "days" +msgstr "dagen" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:583 +msgid "Use a field value of 0 days for one-time payments." +msgstr "Gebruik een veld waarde van 0 dagen voor eenmalige betalingen." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:596 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:602 +msgid "Number of Periods" +msgstr "Aantal perioden" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:606 +#: vendor/wp-pay/core/src/Util.php:294 +msgctxt "Recurring payment" +msgid "Unlimited" +msgstr "Ongelimiteerd" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:618 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:630 +msgctxt "Recurring payment" +msgid "times" +msgstr "keer" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:640 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:646 +msgid "Fixed Subscription Period" +msgstr "Vaste abonnementsperiode" + +#. translators: nl: Een vaste abonnementsperiode zorgt ervoor dat de periodes van alle verkochte abonnementen op één lijn liggen. +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:653 +msgid "" +"A fixed subscription period ensures that periods of all sold subscriptions " +"are aligned." +msgstr "" +"Een vaste abonnementsperiode zorgt ervoor dat perioden van alle verkochte " +"abonnementen op elkaar zijn uitgelijnd." + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:662 +msgid "Entry Date" +msgstr "Inzendingsdatum" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:744 +msgid "Not Available" +msgstr "Niet beschikbaar" + +#. translators: %s: input HTML +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:760 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:273 +msgid "On %s" +msgstr "Op %s" + +#. translators: %s: Monthday (1-27), 2: Monthday (1-27). +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:783 +msgid "On the %s th day of the month" +msgstr "" + +#. translators: 1: Month (Jan-Dec). +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:813 +msgid "On %1$s %2$s" +msgstr "" + +#. translators: nl: Bereken bedrag uitlijingsperiode pro rata. +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:831 +msgid "Prorate the amount of the alignment period." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:844 +msgid "Set corresponding form fields to include user data in the payment data with some payment providers." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:850 +msgid "Prefix Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:851 +#: vendor/wp-pay/core/views/form.php:109 +#: vendor/wp-pay/core/views/form.php:112 +msgid "First Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:852 +msgid "Middle Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:853 +#: vendor/wp-pay/core/views/form.php:117 +#: vendor/wp-pay/core/views/form.php:120 +msgid "Last Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:854 +msgid "Suffix Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:855 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:562 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:357 +msgid "Address" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:856 +msgid "Address 2" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:857 +msgid "Zip" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:858 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:110 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:580 +msgid "City" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:859 +msgid "State" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:860 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:136 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:589 +msgid "Country" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:861 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:598 +msgid "Telephone Number" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:862 +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:167 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:134 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:433 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:55 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:536 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:534 +msgid "Email" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:863 +msgid "Account Holder Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:864 +msgid "Account IBAN" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:865 +msgid "Company Name" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:866 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:301 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:325 +msgid "VAT Number" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:887 +msgid "— From first name field —" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:889 +msgid "— From first address field —" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:891 +msgid "— First phone field —" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:893 +msgid "— First email address field —" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:915 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:140 +msgid "Optional settings for advanced usage only." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:922 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:954 +msgid "Conditional Logic" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:967 +msgid "Set conditional logic to only use this gateway if the entry matches the condition(s)." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php:974 +msgid "Update user role" +msgstr "" + +#. translators: %s: Pronamic Pay version number, i.e. 4.7.0 +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:36 +msgid "Pronamic Pay v%s" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:45 +msgid "Thank you for updating! This new version of Pronamic Pay changes how you manage your payment feeds." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:51 +msgid "Manage pay feeds contextually" +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:53 +msgid "Pay feeds are now accessed via the Pay sub-menu within the Form Settings." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:62 +msgid "I understand this change, hide this message." +msgstr "" + +#: vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php:65 +msgid "Please wait…" +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php:50 +#: vendor/wp-pay-extensions/memberpress/views/subscription-form.php:14 +msgid "Pronamic Subscription" +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:47 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:344 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:366 +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:394 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:472 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:547 +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:598 +msgid "MemberPress" +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:155 +msgid "Payment failed. Please try again." +msgstr "" + +#. translators: %s: MemberPress +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:343 +msgid "%s subscription deleted." +msgstr "" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:406 +msgid "Subscription %s" +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:421 +msgid "MemberPress Transaction" +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/src/Extension.php:433 +msgid "MemberPress Subscription" +msgstr "" + +#. translators: %s: payment method name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:71 +msgid "Pronamic - %s" +msgstr "" + +#. translators: %s: extension name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:471 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:593 +msgid "%s subscription on hold." +msgstr "" + +#. translators: %s: extension name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:546 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:622 +msgid "%s subscription reactivated." +msgstr "" + +#. translators: %s: extension name +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:597 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:657 +msgid "%s subscription cancelled." +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php:842 +msgid "JavaScript is disabled in your browser. You will not be able to complete your purchase until you either enable JavaScript in your browser, or switch to a browser that supports it." +msgstr "" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/memberpress/src/Pronamic.php:66 +msgid "MemberPress transaction %s" +msgstr "" + +#: vendor/wp-pay-extensions/memberpress/views/transaction-form.php:14 +msgid "Pronamic Payment" +msgstr "" + +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:37 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:220 +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:260 +msgid "Ninja Forms" +msgstr "" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:245 +msgid "#%s" +msgstr "" + +#: vendor/wp-pay-extensions/ninjaforms/src/Extension.php:271 +msgid "Ninja Forms Entry" +msgstr "" + +#: vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php:189 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:138 +msgid "Payment Status Pages" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:211 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:292 +msgid "Bitcoin" +msgstr "" + +#. translators: %s: payment method +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:217 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:225 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:233 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:300 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:305 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:310 +msgid "Direct Debit (mandate via %s)" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:234 +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:240 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:261 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:150 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:311 +msgid "SOFORT" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:239 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:145 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:324 +msgid "PayPal" +msgstr "" + +#. translators: %s: Restrict Content Pro +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:419 +msgid "Subscription activated by %s." +msgstr "" + +#. translators: %s: Restrict Content Pro +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:427 +msgid "Subscription canceled by %s." +msgstr "" + +#. translators: %s: Restrict Content Pro +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:435 +msgid "Subscription pending by %s." +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:569 +msgid "Restrict Content Pro Payment" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:612 +msgid "Restrict Content Pro Membership" +msgstr "" + +#. translators: %s: source id +#: vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php:642 +msgid "Membership %s" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:153 +msgid "Checkout label" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:168 +msgid "Enter a label to display at checkout." +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:189 +msgid "Choose your configuration." +msgstr "" + +#. translators: %s: JSON encoded payment data +#: vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php:270 +msgid "Payment creation failed before sending buyer to the payment provider. Error: %s" +msgstr "" + +#. translators: %s: Potential WordPress user ID. +#: vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php:327 +msgid "Since Restrict Content Pro 3 a subscription must be linked to a Restrict Content Pro membership. Unfortunately, this subscription could not be linked to a Restrict Content Pro membership based on the source ID %s. That is why this subscription has been put on hold so that it can be corrected manually." +msgstr "" + +#. translators: 1: Old source, 2: Old source ID, 3: New source, 4: New source ID. +#: vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php:354 +msgid "Since Restrict Content Pro 3 a subscription must be linked to a Restrict Content Pro membership. That's why source \"%1$s\" with ID \"%2$s\" was updated to source \"%3$s\" with ID \"%4$s\"." +msgstr "" + +#. translators: 1: Old source, 2: Old source ID, 3: New source, 4: New source ID. +#: vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php:437 +msgid "Since Restrict Content Pro 3 a payment must be linked to a Restrict Content Pro payment. That's why source \"%1$s\" with ID \"%2$s\" was updated to source \"%3$s\" with ID %4$s\"." +msgstr "" + +#. translators: %s: Restrict Content Pro payment ID +#: vendor/wp-pay-extensions/restrict-content-pro/src/Util.php:49 +msgid "Restrict Content Pro payment %s" +msgstr "" + +#. translators: %s: Restrict Content Pro discount code +#: vendor/wp-pay-extensions/restrict-content-pro/src/Util.php:173 +msgid "Discount code `%s`" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/src/Util.php:192 +msgid "Fees" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/views/edit-membership.php:16 +msgid "Pronamic Pay Subscription:" +msgstr "" + +#: vendor/wp-pay-extensions/restrict-content-pro/views/edit-payment.php:16 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:118 +msgid "Pronamic Pay Payment" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Extension.php:39 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:424 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:435 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:446 +#: vendor/wp-pay-extensions/s2member/src/Extension.php:457 +msgid "s2Member" +msgstr "" + +#. translators: 1: %%email%%, 2: %%password%%, 3: blog name +#: vendor/wp-pay-extensions/s2member/src/Extension.php:93 +msgid "" +"Thanks %1$s! Your membership has been approved.\n" +"\n" +"Your password is %2$s. Please change your password when you login.\n" +"\n" +"If you have any trouble, please feel free to contact us.\n" +"\n" +"Best Regards,\n" +"%3$s" +msgstr "" + +#. translators: 1: %%email%%, 2: %%subscription_renewal_date%%, 3: %%subscription_cancel_url%%, 4: blog name +#: vendor/wp-pay-extensions/s2member/src/Extension.php:131 +msgid "" +"Dear %1$s,\n" +"\n" +"Your membership is due for renewal on %2$s.\n" +"\n" +"To cancel your subscription, visit %3$s\n" +"\n" +"Best Regards,\n" +"%4$s" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Extension.php:200 +msgid "Account Confirmation" +msgstr "" + +#. translators: 1: email, 2: role, 3: capability +#: vendor/wp-pay-extensions/s2member/src/Extension.php:273 +msgid "Update user \"%1$s\" to role \"%2$s\" and added custom capability \"%3$s\"." +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:26 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:47 +msgid "1 day" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:27 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:48 +msgid "2 day" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:28 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:49 +msgid "3 day" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:29 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:50 +msgid "4 day" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:30 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:51 +msgid "5 day" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:31 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:52 +msgid "6 day" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:32 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:53 +msgid "1 week" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:33 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:54 +msgid "2 week" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:34 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:55 +msgid "3 week" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:35 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:56 +msgid "1 month" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:36 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:57 +msgid "2 month" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:37 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:58 +msgid "3 month" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:38 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:59 +msgid "4 month" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:39 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:60 +msgid "5 month" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:40 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:61 +msgid "6 month" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:41 +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:62 +msgid "1 year" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:42 +msgid "2 years" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:43 +msgid "3 years" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:44 +msgid "4 years" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:45 +msgid "5 years" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/S2Member.php:46 +msgid "lifetime" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:56 +msgid "Signup Confirmation Email Message" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:71 +msgid "Subscription Renewal Notice Email Subject" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:86 +msgid "Subscription Renewal Notice Email Message" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:135 +msgid "Pronamic Pay Options" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:136 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:246 +msgid "Payment Options" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:144 +msgid "Pronamic Pay Buttons Generator" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Settings.php:145 +msgid "Payment Buttons" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:95 +msgid "iDEAL s2Member Payment || {{order_id}}" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/src/Shortcodes.php:254 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:303 +msgid "The payment gateway could not be found." +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:60 +msgid "Generator" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:80 +msgid "Single payment" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:83 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:443 +msgid "Recurring payment" +msgstr "" + +#. translators: 1: amount input, 2: period select +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:99 +msgid "I want to charge %1$s for %2$s" +msgstr "" + +#. translators: %s: level select +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:112 +msgid "access to level %s content." +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:120 +msgid "Description:" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:124 +msgid "Button text:" +msgstr "" + +#. translators: %s: default code +#. translators: %s: {payment_id} +#. translators: %s: {payment_id} +#. translators: %s: 0 +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:129 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:258 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:274 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:307 +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:110 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:103 +#: vendor/wp-pay-gateways/icepay/src/Integration.php:101 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:49 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:82 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:178 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:236 +#: vendor/wp-pay-gateways/sisow/src/Integration.php:141 +msgid "Default: %s" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:142 +#: vendor/wp-pay/core/src/Core/Gateway.php:396 +msgctxt "Payment method field" +msgid "All available methods" +msgstr "" + +#: vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php:162 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:171 +msgid "Shortcode" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:48 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:594 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:623 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:658 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:829 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1166 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1220 +msgid "WooCommerce" +msgstr "" + +#. translators: %s: payment method +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:230 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:245 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:260 +msgid "By using this payment method you authorize us via %s to debit payments from your bank account." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:297 +msgid "With iDEAL you can easily pay online in the secure environment of your own bank." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:382 +msgid "We process your order as soon as we have processed your payment." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:443 +msgid "reserved payment cancelled" +msgstr "" + +#. translators: 1: payment URL, 2: payment ID, 3: WooCommerce payment method title, 4: Pronamic payment status +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:489 +msgid "Payment #%2$s via \"%3$s\" updated to \"%4$s\"." +msgstr "" + +#. translators: 1: payment URL, 2: payment ID +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:511 +msgid "Create an invoice at payment gateway for payment #%2$s after processing the order." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:837 +msgid "Date of birth checkout field" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:848 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:853 +msgid "Add date of birth field" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:854 +msgid "Add date of birth field to billing checkout fields" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:863 +msgid "Gender checkout field" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:874 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:879 +msgid "Add gender field" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:880 +msgid "Add gender field to billing checkout fields" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:898 +msgid "Extra fields are used for post-pay payment methods such as AfterPay and Klarna." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1012 +msgid "— Select a checkout field —" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1058 +#: vendor/wp-pay/core/src/Core/Gateway.php:618 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:420 +msgid "Date of birth" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1069 +#: vendor/wp-pay/core/src/Core/Gateway.php:580 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:442 +msgid "Gender" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1072 +#: vendor/wp-pay/core/src/Core/Gateway.php:585 +msgid "— Select gender —" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1073 +#: vendor/wp-pay/core/src/Core/Gateway.php:586 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:449 +msgid "Female" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1074 +#: vendor/wp-pay/core/src/Core/Gateway.php:587 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:453 +msgid "Male" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1075 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:457 +msgid "Other" +msgstr "" + +#. translators: %s: order number +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1181 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1237 +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:190 +msgid "Order %s" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1196 +#: vendor/wp-pay-extensions/woocommerce/src/Extension.php:1252 +msgid "WooCommerce Order" +msgstr "" + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:120 +msgid "Proceed to %s" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:204 +msgid "Enable/Disable" +msgstr "" + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:208 +msgid "Enable %s" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:216 +msgid "This controls the title which the user sees during checkout." +msgstr "" + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:224 +msgid "Give the customer instructions for paying via %s, and let them know that their order won't be shipping until the money is received." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:235 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:272 +msgid "This controls the icon which the user sees during checkout." +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:251 +msgid "Payment Description" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:256 +msgid "This controls the payment description." +msgstr "" + +#. translators: %s: default code +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:258 +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:262 +msgid "Order {order_number}" +msgstr "" + +#. translators: %s: tags +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:260 +msgid "Tags: %s" +msgstr "" + +#. translators: %s: WooCommerce checkout settings URL +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:309 +msgid "You have to select an gateway configuration on the WooCommerce checkout settings page." +msgstr "" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:352 +msgid "WooCommerce order %s" +msgstr "" + +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:715 +msgid "Awaiting payment." +msgstr "" + +#. translators: %s: payment method title +#: vendor/wp-pay-extensions/woocommerce/src/Gateway.php:1091 +msgid "A required field for the %s payment method is empty." +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:50 +msgid "WP eCommerce" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:103 +msgid "Pronamic - AfterPay" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:104 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:285 +msgid "AfterPay" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:108 +msgid "Pronamic - Bancontact" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:113 +msgid "Pronamic - Bank Transfer" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:118 +msgid "Pronamic - Credit Card" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:123 +msgid "Pronamic - Focum" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:124 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:314 +msgid "Focum" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:128 +msgid "Pronamic - Giropay" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:129 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:315 +msgid "Giropay" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:133 +msgid "Pronamic - iDEAL" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:139 +msgid "Pronamic - Maestro" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:140 +#: vendor/wp-pay/core/src/Cards.php:81 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:322 +msgid "Maestro" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:144 +msgid "Pronamic - PayPal" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:149 +msgid "Pronamic - SOFORT" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:302 +msgid "WP e-Commerce" +msgstr "" + +#. translators: %s: payment source id +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:314 +msgid "Purchase #%s" +msgstr "" + +#: vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php:329 +msgid "WP e-Commerce Purchase" +msgstr "" + +#. translators: %s: order id +#: vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php:181 +msgid "WP eCommerce order %s" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:286 +msgid "Payment completed successfully." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:287 +msgid "The order has been received and we are waiting for the payment to clear." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:288 +msgid "The payment has been refused. Please try again using a different method or card." +msgstr "" + +#. translators: %s: exception message +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:337 +#: vendor/wp-pay-gateways/adyen/src/WebSdkGateway.php:328 +msgid "Error getting payment result: %s" +msgstr "" + +#. translators: %s: exception message +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:400 +msgid "Error getting payment details: %s" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/DropInGateway.php:571 +msgid "Credit or debit card" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:44 +msgid "https://www.adyen.com/" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:45 +msgid "https://www.adyen.com/pricing" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:47 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:32 +msgid "test" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:48 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:33 +msgid "live" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:50 +msgid "https://www.pronamic.eu/manuals/using-adyen-pronamic-pay/" +msgstr "" + +#. translators: Translate 'notification' the same as in the Adyen dashboard. +#: vendor/wp-pay-gateways/adyen/src/Integration.php:147 +msgctxt "Adyen" +msgid "Adyen Notification Authentication" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:154 +msgid "User Name" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:165 +msgid "Password" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:183 +msgid "Set the user name and password below and in the webhook authentication settings in the Adyen dashboard for increased security (recommended)." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:223 +msgctxt "adyen" +msgid "Merchant Account" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:226 +msgid "The merchant account identifier, with which you want to process the transaction." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:234 +msgctxt "adyen" +msgid "API Key" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:237 +msgid "API key as mentioned in the payment provider dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:241 +msgid "Adyen documentation: \"How to get the API key\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:250 +msgctxt "adyen" +msgid "API Live URL Prefix" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:253 +msgid "The unique prefix for the live API URL, as mentioned at Account » API URLs in the Adyen dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:257 +msgid "Adyen documentation: \"Live URL prefix\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:266 +msgctxt "adyen" +msgid "Origin Key" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:273 +msgid "An origin key is a client-side key that is used to validate Adyen's JavaScript component library. It is required for the Drop-in and Component integrations." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:277 +msgid "Adyen documentation: \"How to get an origin key\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:289 +msgid "Merchant Order Reference" +msgstr "" + +#. translators: %s: parameterName +#: vendor/wp-pay-gateways/adyen/src/Integration.php:294 +msgid "The Adyen %s parameter." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:318 +msgctxt "adyen" +msgid "Apple Pay Merchant ID" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:321 +msgid "Your Apple Pay Merchant ID. Required for accepting live payments." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:325 +msgid "Adyen documentation: \"Apple Pay Drop-in - Before you begin\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:327 +msgid "Apple documentation: \"Configuring your environment\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:336 +msgid "Apple Pay Merchant Identity Certificate" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:340 +msgid "The Apple Pay Merchant Identity certificate required for secure communication with Apple." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:344 +msgid "Adyen documentation: \"Enable Apple Pay - Create a merchant identity certificate\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:353 +msgid "Apple Pay Merchant Identity Private Key" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:357 +msgid "The private key of the Apple Pay Merchant Identity certificate for secure communication with Apple." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:365 +msgctxt "adyen" +msgid "Apple Pay Merchant Identity Private Key Password" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:368 +msgid "Your Apple Pay Merchant Identity Certificate private key password." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:376 +msgctxt "adyen" +msgid "Google Pay Merchant ID" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:379 +msgid "Your Google Merchant ID. Required for accepting live payments." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:383 +msgid "Adyen documentation: \"Google Pay Drop-in - Test and go live\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:385 +msgid "Google documentation: \"Deploy production environment\"." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:392 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:89 +#: vendor/wp-pay-gateways/mollie/src/Integration.php:187 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:245 +msgid "Webhook URL" +msgstr "" + +#. translators: %s: payment provider name +#. translators: %s: ING Kassa Compleet +#: vendor/wp-pay-gateways/adyen/src/Integration.php:399 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:96 +msgid "Copy the Webhook URL to the %s dashboard to receive automatic transaction status updates." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:400 +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:142 +#: vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php:39 +#: vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php:37 +msgid "Adyen" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:412 +msgid "SSL Version" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:414 +msgid "Choose the SSL Version of your server on the Adyen Customer Area." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:425 +msgctxt "adyen notification" +msgid "Method" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:427 +msgid "JSON" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:433 +msgid "Authentication" +msgstr "" + +#. translators: %s: Pronamic Pay settings page URL. +#: vendor/wp-pay-gateways/adyen/src/Integration.php:437 +msgid "Go to the Pronamic Pay settings page for webhook authentication settings." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:481 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:397 +msgid "SHA Fingerprint" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:488 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:403 +msgid "M j, Y @ G:i" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:491 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:406 +msgid "Valid From" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:496 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:411 +msgid "Valid To" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:505 +msgid "Upload an Apple Pay Merchant Identity certificate, which can be exported from Keychain Access on Mac as a PKCS#12 (*.p12) file." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:515 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:560 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:309 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:425 +msgid "Download" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:526 +#: vendor/wp-pay-gateways/adyen/src/Integration.php:578 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:320 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:436 +msgid "Upload" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/Integration.php:572 +msgid "Leave empty to auto fill when uploading an Apple Pay Merchant Identity PKCS#12 certificate file." +msgstr "" + +#. translators: %s: Help URL. +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:87 +msgid "HTTP Authorization header is missing, read %s for more information." +msgstr "" + +#. translators: Translate 'notification' the same as in the Adyen dashboard. +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:102 +msgctxt "Adyen" +msgid "Sorry, you are not allowed to post Adyen notifications." +msgstr "" + +#. translators: Translate 'notification' the same as in the Adyen dashboard. +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:124 +msgctxt "Adyen" +msgid "Cannot parse JSON notification." +msgstr "" + +#. translators: %s: payment provider name +#. translators: %s: Buckaroo +#. translators: %s: EMS +#. translators: %s: ICEPAY +#. translators: %s: ING +#: vendor/wp-pay-gateways/adyen/src/NotificationsController.php:141 +#: vendor/wp-pay-gateways/buckaroo/src/Listener.php:71 +#: vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php:34 +#: vendor/wp-pay-gateways/icepay/src/Listener.php:48 +#: vendor/wp-pay-gateways/ideal-basic/src/Listener.php:36 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php:46 +#: vendor/wp-pay-gateways/mollie/src/WebhookController.php:108 +msgid "Webhook requested by %s." +msgstr "" + +#. translators: %s: item index +#: vendor/wp-pay-gateways/adyen/src/PaymentRequestHelper.php:104 +#: vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php:165 +msgid "Item %s" +msgstr "" + +#. translators: %s: payment provider name +#: vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php:38 +#: vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php:36 +msgid "Verified payment result." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:56 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:73 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:90 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:204 +msgid "Payment ID." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:112 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:263 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:426 +msgid "No payment ID given in `payment_id` parameter." +msgstr "" + +#. translators: %s: payment ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:123 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:274 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:437 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:254 +msgid "Could not find payment with ID `%s`." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:136 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:287 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:450 +msgid "No data given in request body." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:146 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:297 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:460 +msgid "No gateway configuration ID given in payment." +msgstr "" + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:157 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:308 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:471 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:288 +msgid "Could not find gateway with ID `%s`." +msgstr "" + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:169 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:320 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:483 +msgid "Could not find client in gateway with ID `%s`." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:181 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:331 +msgid "No payment method given." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:191 +msgid "Gateway does not support method to create payment." +msgstr "" + +#. translators: 1: error message, 2: error code +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:205 +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:368 +msgid "%1$s (error %2$s)" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:354 +msgid "Gateway does not support sending additional payment details." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:500 +msgid "Apple Pay merchant identifier not configured in gateway settings." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:507 +msgid "No Apple Pay merchant validation URL given." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:532 +msgid "Invalid Apple Pay Merchant Identity configuration." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:540 +msgid "Error creating merchant identity files." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsController.php:610 +msgid "Error reading merchant identity files." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:55 +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:222 +msgid "Gateway configuration ID." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:59 +msgid "Payload." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:63 +msgid "Result code." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:67 +msgid "Result text." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:87 +msgid "No gateway configuration ID given in `config_id` parameter." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:96 +msgid "No payload given in `payload` parameter." +msgstr "" + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:108 +msgid "Could not found gateway with ID `%s`." +msgstr "" + +#. translators: %s: Gateway configuration ID +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:120 +msgid "Could not found client in gateway with ID `%s`." +msgstr "" + +#. translators: %s: Adyen merchant reference +#: vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php:142 +msgid "Could not found payment with ID `%s`." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:63 +msgid "HTTP Authorization header test" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:87 +msgid "HTTP Basic authentication is working" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:90 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:171 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:252 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:288 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:321 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:350 +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:497 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:931 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:932 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:535 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:169 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:50 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:52 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:63 +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:46 +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:62 +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:127 +#: vendor/wp-pay/core/views/pointer-payments.php:12 +msgid "Payments" +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:95 +msgid "HTTP Basic authentication is required to securely receive Adyen notifications." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/src/SiteHealthController.php:117 +msgid "Could not reach HTTP Authorization header test endpoint." +msgstr "" + +#: vendor/wp-pay-gateways/adyen/views/checkout-drop-in.php:19 +#: vendor/wp-pay-gateways/adyen/views/checkout-web-sdk.php:19 +msgid "Checkout" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Client.php:459 +msgid "Unable to retrieve issuers from Buckaroo." +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:217 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:335 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:593 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:53 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:29 +msgid "Payment" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:219 +msgid "Status Code" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:220 +msgid "Status Code Detail" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:221 +msgid "Status Message" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:222 +msgid "Invoice Number" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:224 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:263 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:440 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:474 +msgid "Currency" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:225 +msgid "Timestamp" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:226 +msgid "Service iDEAL Consumer Issuer" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:227 +msgid "Service iDEAL Consumer Name" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:228 +msgid "Service iDEAL Consumer IBAN" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:229 +msgid "Service iDEAL Consumer BIC" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:230 +msgid "Transactions" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Gateway.php:236 +msgid "Buckaroo data:" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:30 +msgid "http://www.buckaroo-payments.com" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:38 +msgid "https://www.pronamic.eu/support/how-to-connect-buckaroo-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:60 +msgid "Website Key" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:63 +msgid "Website key as mentioned in the Buckaroo dashboard on the page \"Profile » Website\"." +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:71 +msgid "Secret Key" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:74 +msgid "Secret key as mentioned in the Buckaroo dashboardb on the page \"Configuration » Secret Key for Digital Signature\"." +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:82 +msgid "Excluded services" +msgstr "" + +#. translators: %s: brq_exludedservices +#. translators: %s: brq_invoicenumber +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:87 +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:102 +msgid "This controls the Buckaroo %s parameter." +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:97 +msgid "Invoice number" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:117 +msgid "Push URL" +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Integration.php:122 +msgid "The Push URL as sent with each transaction to receive automatic payment status updates on." +msgstr "" + +#: vendor/wp-pay-gateways/buckaroo/src/Listener.php:72 +msgid "Buckaroo" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:179 +msgid "Approval code" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:181 +msgctxt "creditcard" +msgid "Reference number" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:182 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:201 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:261 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:327 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:328 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:285 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:286 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:545 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:518 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:216 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:44 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:43 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:26 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:27 +msgid "Status" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:183 +msgid "Time of transaction processing" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:184 +msgid "Identification for transaction" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:185 +msgid "Fail reason" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:186 +msgid "Response hash" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:187 +msgid "Processor response code" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:188 +msgid "Fail code" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:189 +msgid "Terminal ID" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:190 +msgid "Creditcard issuing bank" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:191 +msgid "Creditcard country" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:192 +msgid "Creditcard brand" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Gateway.php:198 +msgid "EMS e-Commerce transaction data in response message:" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:40 +msgid "https://www.pronamic.eu/support/how-to-connect-ems-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:62 +msgctxt "ems" +msgid "Storename" +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:72 +msgctxt "ems" +msgid "Shared Secret" +msgstr "" + +#. translators: %s: {orderId} +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:90 +msgid "The EMS e-Commerce %s parameter." +msgstr "" + +#. translators: Translate 'notification' the same as in the EMS e-Commerce dashboard. +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:113 +msgctxt "EMS e-Commerce" +msgid "Notification URL" +msgstr "" + +#. translators: Translate 'notification' the same as in the EMS e-Commerce dashboard. +#: vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php:119 +msgctxt "EMS e-Commerce" +msgid "The Notification URL as sent with each transaction to receive automatic payment status updates on." +msgstr "" + +#: vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php:35 +msgid "EMS" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Gateway.php:126 +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:94 +msgctxt "Payment method name" +msgid "AMEX" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Gateway.php:130 +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:96 +msgctxt "Payment method name" +msgid "MASTER" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Gateway.php:134 +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:97 +msgctxt "Payment method name" +msgid "VISA" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:30 +msgid "https://icepay.com/nl/en/pricing-and-accounts/" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:31 +msgid "https://www.pronamic.eu/support/how-to-connect-icepay-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:59 +msgctxt "icepay" +msgid "Merchant ID" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:61 +msgid "Merchant ID as mentioned in the ICEPAY dashboard at the \"My websites\" page." +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:69 +msgctxt "icepay" +msgid "Secret Code" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:72 +msgid "Secret Code as mentioned in the ICEPAY dashboard at the \"My websites\" page." +msgstr "" + +#. translators: %s: OrderID +#: vendor/wp-pay-gateways/icepay/src/Integration.php:88 +msgid "The Icepay %s parameter." +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:110 +msgid "Thank you page URL" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:120 +msgid "Error page URL" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Integration.php:130 +msgid "Postback URL" +msgstr "" + +#: vendor/wp-pay-gateways/icepay/src/Listener.php:49 +msgid "ICEPAY" +msgstr "" + +#. translators: %s: response code +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php:163 +msgid "The response code (%s) from the iDEAL provider was incorrect." +msgstr "" + +#. translators: %s: XML document element name +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php:208 +msgid "Unknwon iDEAL message (%s)" +msgstr "" + +#. translators: %s: exception message +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php:189 +msgid "Error getting payment status: %s" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:38 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:39 +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:29 +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:30 +msgid "https://www.ideal.nl/en/" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:77 +msgid "Private key and certificate" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:88 +msgid "Organization" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:90 +msgid "Organization name, e.g. Pronamic" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:99 +msgid "Organization Unit" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:101 +msgid "Organization unit, e.g. Administration" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:112 +msgid "City, e.g. Amsterdam" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:121 +msgid "State / province" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:123 +msgid "State or province, e.g. Friesland" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:140 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:146 +msgid "2 letter country code, e.g." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:157 +msgid "E-mail address" +msgstr "" + +#. translators: %s: admin email +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:160 +msgid "E-mail address, e.g. %s" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:172 +msgid "Number Days Valid" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:175 +msgid "Number of days the generated certificate will be valid for, e.g. 1825 days for the maximum duration of 5 years." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:184 +msgid "Private Key Password" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:188 +msgid "A random password which will be used for the generation of the private key and certificate." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:197 +msgid "Private Key" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:201 +msgid "The private key is used for secure communication with the payment provider. If left empty, the private key will be generated using the given private key password." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:210 +msgid "Private Certificate" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:214 +msgid "The certificate is used for secure communication with the payment provider. If left empty, the certificate will be generated using the private key and given organization details." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:237 +msgid "The private key and certificate have not yet been configured." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:242 +msgid "A private key and certificate are required for communication with the payment provider. Enter the organization details from the iDEAL account below to generate these required files." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:247 +msgid "A private key and certificate have been configured. The certificate must be uploaded to the payment provider dashboard to complete configuration." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:255 +msgid "Download certificate" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:281 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:343 +msgid "ideal.key" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:292 +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:379 +msgid "OpenSSL command" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:299 +msgid "Leave empty and save the configuration to generate the private key or view the OpenSSL command." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:344 +msgid "ideal.cer" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php:386 +msgid "Leave empty and save the configuration to generate the certificate or view the OpenSSL command." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:66 +msgid "Hash Key" +msgstr "" + +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:69 +msgid "Hash key (also known as: key or secret key) as mentioned in the payment provider dashboard." +msgstr "" + +#. translators: Translate 'XML notification URL' the same as in the iDEAL Basic dashboard. +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:77 +msgctxt "iDEAL Basic dashboard" +msgid "XML Notification URL" +msgstr "" + +#. translators: Translate 'XML notification URL' the same as in the iDEAL Basic dashboard. +#: vendor/wp-pay-gateways/ideal-basic/src/Integration.php:91 +msgctxt "iDEAL Basic dashboard" +msgid "Copy the XML notification URL to the payment provider dashboard to receive automatic transaction status updates." +msgstr "" + +#: vendor/wp-pay-gateways/ideal-basic/src/Listener.php:37 +msgid "iDEAL Basic" +msgstr "" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:26 +msgid "Merchant ID" +msgstr "" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:31 +msgid "Merchant ID (or Acceptant ID)" +msgstr "" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:32 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:55 +msgid "as mentioned in the payment provider dashboard" +msgstr "" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:43 +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:54 +msgid "Sub ID" +msgstr "" + +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:64 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:91 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:752 +msgid "Purchase ID" +msgstr "" + +#. translators: %s: purchaseID +#: vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php:69 +msgid "The iDEAL %s parameter." +msgstr "" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:45 +msgid "https://www.pronamic.eu/support/how-to-connect-ing-kassa-compleet-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:72 +msgctxt "ing_kassa_compleet" +msgid "API Key" +msgstr "" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:77 +msgid "API key" +msgstr "" + +#. translators: %s: ING Kassa Compleet +#. translators: %s: payment provider name +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:80 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:68 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:84 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:100 +msgid "as mentioned in the %s dashboard" +msgstr "" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:81 +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php:97 +msgid "ING Kassa Compleet" +msgstr "" + +#: vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php:47 +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:64 +msgid "ING" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:142 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:143 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:275 +#: vendor/wp-pay-gateways/mollie/src/Admin.php:306 +#: vendor/wp-pay-gateways/mollie/src/WebhookController.php:109 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:33 +msgid "Mollie" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:152 +msgid "Mollie Profiles" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:153 +msgid "Profiles" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:161 +msgid "Mollie Customers" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:162 +msgid "Customers" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Admin.php:170 +msgid "Mollie Payments" +msgstr "" + +#. translators: 1: Mollie chargeback ID, 2: Mollie payment ID +#: vendor/wp-pay-gateways/mollie/src/Gateway.php:743 +msgid "Subscription put on hold due to chargeback `%1$s` of payment `%2$s`." +msgstr "" + +#. translators: 1: old mandate ID, 2: new mandate ID +#: vendor/wp-pay-gateways/mollie/src/Gateway.php:782 +msgid "Mandate for subscription changed from \"%1$s\" to \"%2$s\"." +msgstr "" + +#. translators: 1: old payment method, 2: new payment method +#: vendor/wp-pay-gateways/mollie/src/Gateway.php:810 +msgid "Payment method for subscription changed from \"%1$s\" to \"%2$s\"." +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:57 +msgid "https://www.mollie.com/en/pricing" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:158 +msgctxt "mollie" +msgid "API Key" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:161 +msgid "API key as mentioned in the payment provider dashboard" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:169 +msgctxt "mollie" +msgid "Due date days" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:174 +msgid "Number of days after which a bank transfer payment expires." +msgstr "" + +#. translators: 1: 1, 2: 100, 3: 12 +#: vendor/wp-pay-gateways/mollie/src/Integration.php:177 +msgid "Minimum %1$s and maximum %2$s days. Default: %3$s days." +msgstr "" + +#: vendor/wp-pay-gateways/mollie/src/Integration.php:192 +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:250 +msgid "The Webhook URL as sent with each transaction to receive automatic payment status updates on." +msgstr "" + +#. translators: %s: Mollie payment ID anchor. +#: vendor/wp-pay-gateways/mollie/views/meta-box-payment.php:39 +msgid "Payment: %s" +msgstr "" + +#. translators: %s: Mollie customer ID anchor. +#: vendor/wp-pay-gateways/mollie/views/meta-box-payment.php:67 +#: vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php:37 +msgid "Customer: %s" +msgstr "" + +#. translators: %s: Mollie mandate ID +#: vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php:68 +msgid "Mandate: %s" +msgstr "" + +#. translators: %s: Mollie customer ID. +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:99 +msgid "Customer %s" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:116 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:199 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:432 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:64 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:52 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:84 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:44 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:28 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:35 +msgid "ID" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:122 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:200 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:850 +msgid "Mode" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:124 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:231 +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:53 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:274 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:746 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:145 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:292 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:861 +msgid "Test" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:124 +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:235 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:146 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:857 +msgid "Live" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:153 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:527 +msgid "Locale" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:171 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:70 +msgid "Link" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:194 +msgid "Mandates" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:202 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:431 +msgid "Method" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:203 +msgid "Details" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:204 +msgid "Mandate Reference" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:205 +msgid "Signature Date" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:206 +msgid "Created On" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:215 +msgid "No mandates found." +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:251 +msgid "Pending" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:255 +#: vendor/wp-pay/core/src/LicenseManager.php:245 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:341 +#: vendor/wp-pay/core/views/tab-system_status.php:36 +msgid "Valid" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:296 +msgid "Card Holder" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:305 +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:267 +msgid "Card Number" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:314 +msgid "Card Label" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:323 +msgid "Card Fingerprint" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:332 +msgid "Card Expiry Date" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:348 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:607 +msgid "Consumer Name" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:357 +msgid "Consumer Account" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:366 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:634 +msgid "Consumer BIC" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:427 +msgid "WordPress Users" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-customer.php:434 +msgid "Display Name" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:100 +#: vendor/wp-pay-gateways/mollie/views/page-payment.php:107 +msgid "Change Payment State" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:46 +msgctxt "mollie" +msgid "Customers" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:84 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:344 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:119 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:126 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:133 +msgid "Yes" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:84 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:344 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:119 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:126 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:133 +msgid "No" +msgstr "" + +#: vendor/wp-pay-gateways/mollie/views/user-profile.php:110 +msgid "Mollie offers the possibility to register payers as a customer within the Mollie payment platform. This functionality remembers payment preferences to make future payments easier. The Mollie customers can be linked to WordPress users. This is a list of Mollie customers associated with this WordPress user. For subscriptions, a Mollie customer mandate can be used for recurring payments." +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Gateway.php:95 +msgctxt "Payment method name" +msgid "Maestro" +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:30 +msgid "http://www.multisafepay.com/" +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:38 +msgid "https://www.pronamic.eu/support/how-to-connect-multisafepay-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:61 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:66 +msgid "Account ID" +msgstr "" + +#. translators: %s: payment provider name +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:68 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:84 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:100 +msgid "MultiSafepay" +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:77 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:82 +msgid "Site ID" +msgstr "" + +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:93 +#: vendor/wp-pay-gateways/multisafepay/src/Integration.php:98 +msgid "Site Security Code" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php:15 +msgid "https://payment-services.ingenico.com/nl/en" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php:16 +msgid "https://www.pronamic.eu/support/how-to-connect-ingenico-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Listener.php:42 +msgid "Webhook requested." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:266 +msgid "Acceptance" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:268 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:691 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:153 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:32 +msgid "End Date" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:269 +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:553 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:543 +msgid "Customer Name" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:270 +msgid "Transaction Date" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:271 +msgid "Pay ID" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:272 +msgid "NC Error" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:273 +msgid "Brand" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:274 +msgid "IP" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:275 +msgid "SHA Signature" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php:281 +msgid "Ogone transaction data in response message:" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:32 +msgid "Account details are provided by the payment provider after registration. These settings need to match with the payment provider dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:40 +msgid "PSPID" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:43 +msgid "PSPID as mentioned in the payment provider dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:51 +msgid "API user ID" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:54 +msgid "User ID of the API user in the payment provider dashboard: Configuration » Users" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:62 +msgid "API user password" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:65 +msgid "Password of the API user in the payment provider dashboard: Configuration » Users" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:74 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:87 +msgid "SHA-IN Pass phrase" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:77 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:90 +msgid "SHA-IN pass phrase as mentioned in the payment provider dashboard: Configuration » Technical information » Data and origin verification." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:99 +msgid "SHA-OUT Pass phrase" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:102 +msgid "SHA-OUT pass phrase as mentioned in the payment provider dashboard: Configuration » Technical information » Transaction feedback." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:110 +msgid "Hash algorithm" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:114 +msgid "SHA-1" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:115 +msgid "SHA-256" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:116 +msgid "SHA-512" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:127 +msgid "3-D Secure" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:129 +msgid "Enable 3-D Secure protocol" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:149 +msgid "Form Action URL" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:152 +msgid "With this setting you can override the default Ingenico e-Commerce form action URL to the payment processing page." +msgstr "" + +#. translators: %s: ORDERID +#. translators: %s: PARAMVAR +#. translators: %s: ALIASUSAGE +#. translators: %s: TP +#: vendor/wp-pay-gateways/ogone/src/Settings.php:166 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:194 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:225 +#: vendor/wp-pay-gateways/ogone/src/Settings.php:241 +msgid "The Ingenico %s parameter." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:189 +msgid "Parameter Variable" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:209 +msgid "Alias" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:211 +msgid "Enable alias registration" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:212 +msgid "Enable alias creation as reference for batch payments. Requires the Alias Manager option (`REQ1`) to be enabled for the Ingenico account." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:220 +msgid "Alias Usage" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:228 +msgid "Description on payment page of how aliases are used." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:236 +msgid "Template Page" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:252 +msgid "The URLs below need to be copied to the payment provider dashboard to receive automatic transaction status updates." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:258 +msgid "URL accepted, on hold or uncertain" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:262 +msgid "Direct HTTP server-to-server request URL for payment statuses accepted, on hold or uncertain\"." +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:269 +msgid "URL cancel or deny" +msgstr "" + +#: vendor/wp-pay-gateways/ogone/src/Settings.php:273 +msgid "Direct HTTP server-to-server request URL for payment statuses \"cancelled by the client\" or \"too many rejections by the acquirer\"." +msgstr "" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php:255 +msgid "OmniKassa 2.0 return URL requested:" +msgstr "" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php:337 +msgid "OmniKassa 2.0 webhook URL requested:" +msgstr "" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:48 +msgid "https://www.pronamic.eu/support/how-to-connect-rabo-omnikassa-2-0-with-wordpress-via-pronamic-pay/" +msgstr "" + +#. translators: 1: Pronamic Pay, 2: Documentation link, 3: .test +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:147 +msgid "%1$s — OmniKassa 2 does not accept payments from %3$s environments." +msgstr "" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:188 +msgctxt "omnikassa" +msgid "Refresh Token" +msgstr "" + +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:198 +msgctxt "omnikassa" +msgid "Signing Key" +msgstr "" + +#. translators: %s: merchantOrderId +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:215 +msgid "This setting defines the OmniKassa 2.0 %s field." +msgstr "" + +#. translators: %s: merchantOrderId +#: vendor/wp-pay-gateways/omnikassa-2/src/Integration.php:222 +msgid "The OmniKassa 2.0 %s field must consist strictly of 24 alphanumeric characters, other characters, such as \".\", \"@\", \" \" (space), etc. are not allowed." +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:93 +msgid "Unknown response from Pay.nl." +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:109 +msgid "Unknown response from Pay.nl error." +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:126 +#: vendor/wp-pay-gateways/pay-nl/src/Client.php:219 +msgid "Unknown Pay.nl error." +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:34 +msgid "https://www.pronamic.eu/support/how-to-connect-pay-nl-with-wordpress-via-pronamic-pay/" +msgstr "" + +#. translators: 1: payment provider name +#. translators: %s: Sisow +#. translators: 1: TargetPay +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:55 +#: vendor/wp-pay-gateways/sisow/src/Integration.php:101 +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:53 +msgid "Account details are provided by %1$s after registration. These settings need to match with the %1$s dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:56 +msgid "Pay.nl" +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:65 +msgid "Token" +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:68 +msgid "Token as mentioned at Merchant » Company data (Connection) in the payment provider dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:76 +msgid "Service ID" +msgstr "" + +#: vendor/wp-pay-gateways/pay-nl/src/Integration.php:79 +msgid "Service ID as mentioned at Manage » Services in the payment provider dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:42 +#: vendor/wp-pay-gateways/paypal/src/Integration.php:43 +msgid "https://www.paypal.com/" +msgstr "" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:45 +msgid "https://www.pronamic.eu/manuals/using-paypal-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:94 +msgctxt "paypal" +msgid "Email" +msgstr "" + +#: vendor/wp-pay-gateways/paypal/src/Integration.php:97 +msgid "Enter your PayPal account's email." +msgstr "" + +#: vendor/wp-pay-gateways/paypal/src/NotificationsController.php:49 +msgid "PayPal gateway configuration ID." +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:62 +#: vendor/wp-pay/core/src/Cards.php:103 +msgid "ABN Amro" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:63 +#: vendor/wp-pay/core/src/Cards.php:138 +msgid "Rabobank" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:65 +#: vendor/wp-pay/core/src/Cards.php:148 +msgid "SNS Bank" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:66 +#: vendor/wp-pay/core/src/Cards.php:108 +msgid "ASN Bank" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:67 +#: vendor/wp-pay/core/src/Cards.php:143 +msgid "RegioBank" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:68 +#: vendor/wp-pay/core/src/Cards.php:153 +msgid "Triodos Bank" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:69 +#: vendor/wp-pay/core/src/Cards.php:128 +msgid "Knab" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:70 +msgid "Van Lanschot Bankiers" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:71 +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:293 +msgid "Bunq" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:72 +#: vendor/wp-pay/core/src/Cards.php:133 +msgid "Moneyou" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Gateway.php:73 +#: vendor/wp-pay/core/src/Cards.php:118 +msgid "Handelsbanken" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:42 +#: vendor/wp-pay-gateways/payvision/src/Integration.php:43 +msgid "https://www.payvision.com/" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:45 +msgid "https://www.pronamic.eu/manuals/using-payvision-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:89 +msgctxt "payvision" +msgid "Business Id" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:92 +msgid "A Merchant connecting to the platform is identified by its Business ID (“businessId”)." +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:103 +msgctxt "payvision" +msgid "User" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:113 +msgctxt "payvision" +msgid "Password" +msgstr "" + +#: vendor/wp-pay-gateways/payvision/src/Integration.php:123 +msgctxt "payvision" +msgid "Store ID" +msgstr "" + +#. translators: %s: XML document element name +#: vendor/wp-pay-gateways/sisow/src/Client.php:152 +msgid "Unknwon Sisow message (%s)" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Client.php:165 +msgid "Sisow Bank (test)" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:48 +msgid "https://www.pronamic.eu/support/how-to-connect-sisow-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:102 +msgid "Sisow" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:112 +msgctxt "sisow" +msgid "Merchant ID" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:115 +msgid "Merchant ID as mentioned at My Profile in the Sisow dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:124 +msgctxt "sisow" +msgid "Merchant Key" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:127 +msgid "Merchant Key as mentioned at My Profile in the Sisow dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:136 +msgctxt "sisow" +msgid "Shop ID" +msgstr "" + +#: vendor/wp-pay-gateways/sisow/src/Integration.php:139 +msgid "Shop ID as mentioned at My Profile in the Sisow dashboard." +msgstr "" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:29 +msgid "https://www.targetpay.com/info/ideal?setlang=en" +msgstr "" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:32 +msgid "https://www.pronamic.eu/support/how-to-connect-targetpay-with-wordpress-via-pronamic-pay/" +msgstr "" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:54 +msgid "TargetPay" +msgstr "" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:63 +msgid "Layout Code" +msgstr "" + +#: vendor/wp-pay-gateways/targetpay/src/Integration.php:65 +msgid "Layout code as mentioned at Sub accounts in the TargetPay dashboard." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminAboutPage.php:69 +msgid "About Pronamic Pay" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:75 +#: vendor/wp-pay/core/views/page-dashboard.php:27 +msgid "Pronamic Pay Status" +msgstr "" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:90 +msgid "%s completed" +msgstr "" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:92 +msgid "%s pending" +msgstr "" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:94 +msgid "%s cancelled" +msgstr "" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:96 +msgid "%s failed" +msgstr "" + +#. translators: %s: posts count value +#: vendor/wp-pay/core/src/Admin/AdminDashboard.php:98 +msgid "%s expired" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:83 +msgid "Variant" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:85 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:187 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:1048 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:67 +#: vendor/wp-pay/core/views/pointer-dashboard.php:12 +msgid "Dashboard" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:229 +msgid "Default" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:506 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:736 +msgid "M j, Y @ H:i" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:510 +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:516 +msgid "Configuration updated." +msgstr "" + +#. translators: %s: date and time of the revision +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:520 +msgid "Configuration restored to revision from %s." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:523 +msgid "Configuration published." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:525 +msgid "Configuration saved." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:527 +msgid "Configuration submitted." +msgstr "" + +#. translators: %s: scheduled date +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:530 +msgid "Configuration scheduled for: %s." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php:532 +msgid "Configuration draft updated." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:57 +msgid "Support license key" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:58 +msgid "No license key found" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:64 +msgid "License status" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:70 +msgid "Next scheduled license check" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:76 +#: vendor/wp-pay/core/views/tab-system_status.php:231 +msgid "Time (UTC)" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:77 +#: vendor/wp-pay/core/views/tab-system_status.php:234 +msgid "Y/m/d g:i:s A" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:81 +msgid "Not available" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:88 +msgid "OpenSSL version" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:94 +msgid "Active plugin integrations" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:190 +msgid "Pronamic Pay license key is valid" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:193 +msgid "A valid license is required for technical support and continued plugin updates." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:206 +msgid "No valid license key for Pronamic Pay" +msgstr "" + +#. translators: %s: WordPress version number +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:247 +msgid "WordPress version is supported by Pronamic Pay (%s)" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:250 +msgid "Pronamic Pay requires at least WordPress 4.7." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:262 +msgid "Pronamic Pay requires at least WordPress 4.7" +msgstr "" + +#. translators: %s: WordPress memory limit +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:283 +msgid "WordPress memory limit is sufficient (%s)" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:286 +msgid "Pronamic Pay recommends setting the WordPress memory limit to at least 64 MB." +msgstr "" + +#. translators: %s: WordPress memory limit +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:301 +msgid "Increase WordPress memory limit (%s) to at least 64 MB" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:318 +msgid "Character encoding is set to UTF-8" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:319 +msgid "Pronamic Pay recommends to use the UTF-8 character encoding for payments." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:332 +msgid "Character encoding is not set to UTF-8" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:347 +msgid "SHA1 hashing algorithm is available" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:348 +msgid "Payment gateways often use the SHA1 hashing algorithm, therefore Pronamic Pay advises to enable this hashing algorithm." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:363 +msgid "SHA1 hashing algorithm is not available for Pronamic Pay" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:457 +msgid "Untested plugin versions (issues with payments might occur):" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:467 +msgid "Outdated unsupported plugin versions for which payments can not be processed:" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:476 +msgid "Supported plugin versions:" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:482 +msgid "Pronamic Pay extensions are compatible" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:484 +msgid "Pronamic Pay uses extensions to integrate with form, booking and other e-commerce plugins. All extensions support the currently activated plugin version." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:487 +msgid "Pronamic Pay extensions are incompatible" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminHealth.php:489 +msgid "Pronamic Pay uses extensions to integrate with form, booking and other e-commerce plugins. Not all extensions support the version of the currently activated plugin." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:416 +msgid "payment" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:423 +msgid "Payment completed" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:424 +msgid "completed" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:427 +msgid "The payment has been successfully completed." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:435 +msgid "Payment cancelled" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:436 +msgid "cancelled" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:439 +msgid "You have cancelled the payment." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:447 +msgid "Payment expired" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:448 +msgid "expired" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:451 +msgid "Your payment session has expired." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:459 +msgid "Payment error" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:460 +msgid "error" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:463 +msgid "An error has occurred during payment." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:471 +msgid "Payment status unknown" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:472 +msgid "unknown" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:475 +msgid "The payment status is unknown." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:486 +msgid "subscription" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:489 +msgid "The subscription has been canceled." +msgstr "" + +#. translators: %s: order ID +#: vendor/wp-pay/core/src/Admin/AdminModule.php:671 +msgid "Test %s" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:937 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:938 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:49 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:51 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:62 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:45 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:61 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:126 +msgid "Subscriptions" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:943 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:944 +#: vendor/wp-pay/core/views/pointer-reports.php:12 +msgid "Reports" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:952 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:110 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:112 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:123 +#: vendor/wp-pay/core/views/pointer-forms.php:12 +msgid "Payment Forms" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:953 +msgid "Forms" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:958 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:959 +#: vendor/wp-pay/core/src/GatewayPostType.php:68 +#: vendor/wp-pay/core/views/pointer-gateways.php:12 +msgid "Configurations" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:964 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:965 +#: vendor/wp-pay/core/views/pointer-settings.php:12 +msgid "Settings" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminModule.php:976 +#: vendor/wp-pay/core/src/Admin/AdminModule.php:977 +msgid "Tools" +msgstr "" + +#. translators: 1: Pronamic Pay settings page URL, 2: Pronamic.eu plugin page URL +#: vendor/wp-pay/core/src/Admin/AdminNotices.php:72 +msgid "Pronamic Pay — You have not entered a valid support license key, please get your key at pronamic.eu." +msgstr "" + +#. translators: 1: Pronamic Pay settings page URL, 2: Pronamic.eu plugin page URL, 3: Pronamic.eu account page URL +#: vendor/wp-pay/core/src/Admin/AdminNotices.php:79 +msgid "Pronamic Pay — You have not entered a valid support license key. Please get your key at pronamic.eu or login to check your license status." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:76 +msgid "Check Payment Status" +msgstr "" + +#. translators: %s: number updated payments +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:162 +msgid "%s payment updated." +msgid_plural "%s payments updated." +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: number skipped payments +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:177 +msgid "%s payment is not updated because it already has a final payment status." +msgid_plural "%s payments are not updated because they already have a final payment status." +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: gateways lists +#: vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php:215 +msgid "Requesting the current payment status is unsupported by %s." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:157 +msgid "Payment status updated." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:169 +msgid "Invoice created." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:174 +msgid "Invoice could not be created." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:187 +msgid "Reservation cancelled." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:192 +msgid "Reservation could not be cancelled." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:204 +msgid "Payment details or an invalid tracking ID prevent payment from being tracked by Google Analytics." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:212 +msgid "Payment sent to Google Analytics." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:217 +msgid "Payment could not be sent to Google Analytics." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:255 +msgid "This payment has been anonymized. Personal details are not available anymore." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:336 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:30 +msgid "Transaction" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:337 +#: vendor/wp-pay/core/src/Forms/FormPostType.php:168 +#: vendor/wp-pay/core/views/meta-box-form-options.php:20 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:102 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:69 +#: vendor/wp-pay/core/views/tab-gateways.php:26 +msgid "Gateway" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:339 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:289 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:265 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:240 +msgid "Customer" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:418 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:351 +#: vendor/wp-pay/core/src/Plugin.php:1073 +msgid "Unknown" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:449 +msgid "First of recurring payment" +msgstr "" + +#. translators: 1: edit post link with post ID, 2: source description, 3: source ID text +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:508 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:405 +msgid "%1$s for %2$s %3$s" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:602 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:517 +msgid "Payment Lines" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:620 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:544 +msgid "Notes" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:629 +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:553 +#: vendor/wp-pay/core/views/meta-box-payment-update.php:176 +#: vendor/wp-pay/core/views/meta-box-subscription-update.php:50 +msgid "Update" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:740 +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:746 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:76 +msgid "Payment updated." +msgstr "" + +#. translators: %s: date and time of the revision +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:750 +msgid "Payment restored to revision from %s." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:753 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:72 +msgid "Payment published." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:755 +msgid "Payment saved." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:757 +msgid "Payment submitted." +msgstr "" + +#. translators: %s: scheduled date +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:760 +msgid "Payment scheduled for: %s." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php:762 +msgid "Payment draft updated." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:157 +msgid "Number successful payments" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:173 +msgid "Open payments" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:194 +msgid "Successful payments" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:216 +msgid "Cancelled payments" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:238 +msgid "Expired payments" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminReports.php:260 +msgid "Failed payments" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:59 +msgid "Support License Key" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:72 +msgid "Default Gateway" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:78 +msgid "— Select a gateway —" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:86 +msgid "Google Analytics tracking ID" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:91 +msgid "Set a Google Analytics tracking UA code to track ecommerce revenue." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:100 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:105 +msgid "Remove Data" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:106 +msgid "Remove all plugin data on uninstall" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:115 +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:128 +msgid "Debug Mode" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:116 +msgid "Enable debug mode" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:171 +msgid "The page an user will get redirected to after payment, based on the payment status." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:188 +msgid "Set default pages" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSettings.php:318 +msgid "— Select a page —" +msgstr "" + +#. translators: %d: payment ID +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:204 +msgid "Payment #%d" +msgstr "" + +#. translators: %s: payment post edit link +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:225 +msgid "%s has been created." +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:291 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:101 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:30 +msgid "Recurrence" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php:526 +msgid "Phases" +msgstr "" + +#: vendor/wp-pay/core/src/Admin/Install.php:247 +msgid "Payer" +msgstr "" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:87 +msgctxt "Block" +msgid "Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:88 +msgid "Add form" +msgstr "" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:166 +msgid "Unable to process payments with default gateway." +msgstr "" + +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:194 +#: vendor/wp-pay/core/src/Blocks/BlocksModule.php:226 +msgid "Payment Form Block" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:46 +msgid "American Express" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:51 +msgid "Carta Si" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:56 +msgid "Carte Bleue" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:61 +msgid "Dankort" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:66 +msgid "Diners Club" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:71 +msgid "Discover" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:76 +msgid "JCB" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:86 +msgid "Mastercard" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:91 +msgid "UnionPay" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:96 +msgid "Visa" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:113 +msgid "bunq" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:123 +msgid "ING Bank" +msgstr "" + +#: vendor/wp-pay/core/src/Cards.php:158 +msgid "Van Lanschot" +msgstr "" + +#: vendor/wp-pay/core/src/Core/Gateway.php:398 +msgctxt "Payment method field" +msgid "Other" +msgstr "" + +#: vendor/wp-pay/core/src/Core/Gateway.php:530 +msgid "Choose your bank" +msgstr "" + +#: vendor/wp-pay/core/src/Core/Gateway.php:544 +msgid "Choose your credit card issuer" +msgstr "" + +#: vendor/wp-pay/core/src/Core/Gateway.php:645 +msgid "Account holder name" +msgstr "" + +#: vendor/wp-pay/core/src/Core/Gateway.php:671 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:598 +msgid "IBAN" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:286 +msgid "Alipay" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:287 +msgid "Apple Pay" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:290 +msgid "Belfius Direct Net" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:291 +msgid "Billink" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:294 +msgid "Capayable" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:295 +msgid "In3" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:313 +msgid "EPS" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:316 +msgid "Google Pay" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:317 +msgid "Gulden" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:319 +msgid "iDEAL QR" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:320 +msgid "KBC/CBC Payment Button" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:321 +msgid "Klarna Pay Later" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:323 +msgid "Payconiq" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:325 +msgid "Przelewy24" +msgstr "" + +#: vendor/wp-pay/core/src/Core/PaymentMethods.php:326 +msgid "Santander" +msgstr "" + +#. translators: 1: received response code, 2: required response code +#: vendor/wp-pay/core/src/Core/Util.php:61 +msgid "The response code (%1$s) was incorrect, required response code %2$s." +msgstr "" + +#: vendor/wp-pay/core/src/Core/Util.php:96 +msgid "Could not load the XML string." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:113 +#: vendor/wp-pay/core/src/Forms/FormShortcode.php:79 +#: vendor/wp-pay/core/src/Forms/FormsModule.php:196 +#: vendor/wp-pay/core/src/Forms/FormsModule.php:227 +msgid "Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:115 +msgid "Add New Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:116 +msgid "Edit Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:117 +msgid "New Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:118 +msgid "All Payment Forms" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:119 +msgid "View Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:120 +msgid "Search Payment Forms" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:121 +msgid "No payment forms found." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:122 +msgid "No payment forms found in Trash." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:124 +msgid "Filter payment forms list" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:125 +msgid "Payment forms list navigation" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:126 +msgid "Payment forms list" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:132 +msgid "Payment form published." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:133 +msgid "Payment form published privately." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:134 +msgid "Payment form reverted to draft." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:135 +msgid "Payment form scheduled." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:136 +msgid "Payment form updated." +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:149 +msgctxt "slug" +msgid "payment-forms" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:170 +msgid "Earnings" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:296 +msgid "Form Options" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormPostType.php:410 +msgid "Shortcode:" +msgstr "" + +#. translators: %s: order id +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:112 +msgid "Payment Form %s" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:249 +msgid "Please enter your first name" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormProcessor.php:256 +msgid "Please enter a valid email address" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormShortcode.php:90 +msgid "Select Payment Form" +msgstr "" + +#: vendor/wp-pay/core/src/Forms/FormsModule.php:163 +#: vendor/wp-pay/core/views/meta-box-form-options.php:47 +msgid "Pay Now" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:55 +#: vendor/wp-pay/core/src/GatewayPostType.php:57 +msgid "Payment Gateway Configurations" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:60 +msgid "Add New Payment Gateway Configuration" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:61 +msgid "Edit Payment Gateway Configuration" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:62 +msgid "New Payment Gateway Configuration" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:63 +msgid "All Payment Gateway Configurations" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:64 +msgid "View Payment Gateway Configuration" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:65 +msgid "Search Payment Gateway Configurations" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:66 +msgid "No payment gateway configurations found." +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:67 +msgid "No payment gateway configurations found in Trash." +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:69 +msgid "Filter payment gateway configurations list" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:70 +msgid "Payment gateway configurations list navigation" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:71 +msgid "Payment gateway configurations list" +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:77 +msgid "Payment gateway configuration published." +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:78 +msgid "Payment gateway configuration published privately." +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:79 +msgid "Payment gateway configuration reverted to draft." +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:80 +msgid "Payment gateway configuration scheduled." +msgstr "" + +#: vendor/wp-pay/core/src/GatewayPostType.php:81 +msgid "Payment gateway configuration updated." +msgstr "" + +#: vendor/wp-pay/core/src/LicenseManager.php:248 +#: vendor/wp-pay/core/views/tab-system_status.php:40 +msgid "Invalid" +msgstr "" + +#: vendor/wp-pay/core/src/LicenseManager.php:251 +#: vendor/wp-pay/core/views/tab-system_status.php:44 +msgid "Site Inactive" +msgstr "" + +#: vendor/wp-pay/core/src/LicenseManager.php:263 +#: vendor/wp-pay/core/views/tab-system_status.php:70 +msgid "Not scheduled" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:55 +msgid "Add New Payment" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:56 +msgid "Edit Payment" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:57 +msgid "New Payment" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:58 +msgid "All Payments" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:59 +msgid "View Payment" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:60 +msgid "Search Payments" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:61 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:18 +msgid "No payments found." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:62 +msgid "No payments found in Trash." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:64 +msgid "Filter payments list" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:65 +msgid "Payments list navigation" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:66 +msgid "Payments list" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:73 +msgid "Payment published privately." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:74 +msgid "Payment reverted to draft." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:75 +msgid "Payment scheduled." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:102 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:125 +msgctxt "Payment status" +msgid "Pending" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:103 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:138 +msgctxt "Payment status" +msgid "Reserved" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:104 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:151 +msgctxt "Payment status" +msgid "On Hold" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:105 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:164 +msgctxt "Payment status" +msgid "Completed" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:106 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:177 +msgctxt "Payment status" +msgid "Cancelled" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:107 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:190 +msgctxt "Payment status" +msgid "Refunded" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:108 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:203 +msgctxt "Payment status" +msgid "Failed" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:109 +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:216 +msgctxt "Payment status" +msgid "Expired" +msgstr "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:131 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:129 +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:144 +msgid "Reserved (%s)" +msgid_plural "Reserved (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:157 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:181 +msgid "On Hold (%s)" +msgid_plural "On Hold (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:170 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:207 +msgid "Completed (%s)" +msgid_plural "Completed (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:196 +msgid "Refunded (%s)" +msgid_plural "Refunded (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:209 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:168 +msgid "Failed (%s)" +msgid_plural "Failed (%s)" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Payments/PaymentPostType.php:222 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:155 +msgid "Expired (%s)" +msgid_plural "Expired (%s)" +msgstr[0] "" +msgstr[1] "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:260 +msgctxt "Payment title date format parsed by `date_i18n`." +msgid "M d, Y @ h:i A" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:417 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:453 +msgid "Config ID" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:424 +msgid "Key" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:473 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:509 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:80 +msgid "Transaction ID" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:480 +msgid "Entrance Code" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:488 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:162 +msgid "Action URL" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:496 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:460 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:682 +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:114 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:285 +msgid "Source" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:503 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:467 +msgid "Source ID" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:519 +msgid "Language" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:571 +msgid "Postal Code" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:616 +msgid "Consumer Account Number" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:625 +msgid "Consumer IBAN" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:643 +msgid "Consumer City" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:652 +msgid "Analytics Client ID" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:660 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:781 +msgid "Subscription ID" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:668 +msgid "Recurring Type" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:676 +#: vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php:21 +msgid "Recurring" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:683 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:129 +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:31 +msgid "Start Date" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:699 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:815 +msgid "User Agent" +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php:708 +msgid "User IP" +msgstr "" + +#. translators: 1: new status +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:155 +msgid "Payment created with status \"%1$s\"." +msgstr "" + +#. translators: 1: old status, 2: new status +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:162 +msgid "Payment status changed from \"%1$s\" to \"%2$s\"." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:226 +msgid "Gateway ID." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsModule.php:230 +msgid "Gateway mode." +msgstr "" + +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:228 +msgid "Payment anonymized for personal data erasure request." +msgstr "" + +#. translators: %s: Payment ID +#: vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php:232 +msgid "Payment ID %s anonymized." +msgstr "" + +#. translators: %s: Pronamic Pay +#: vendor/wp-pay/core/src/Payments/StatusChecker.php:168 +msgid "Payment status check at gateway by %s." +msgstr "" + +#: vendor/wp-pay/core/src/Plugin.php:649 +msgctxt "default datetime format" +msgid "D j M Y \\a\\t H:i" +msgstr "" + +#: vendor/wp-pay/core/src/Plugin.php:660 +msgid "Something went wrong with the payment. Please try again later or pay another way." +msgstr "" + +#: vendor/wp-pay/core/src/Plugin.php:703 +msgid "— Select Configuration —" +msgstr "" + +#: vendor/wp-pay/core/src/Plugin.php:1069 +msgid "Completed" +msgstr "" + +#: vendor/wp-pay/core/src/Plugin.php:1070 +msgid "Canceled" +msgstr "" + +#. translators: %s: payment title +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionHelper.php:61 +msgid "Subscription for %s" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php:247 +msgid "D j M Y" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php:251 +msgid "D j M" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php:255 +msgid "D j" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:54 +msgid "Add New Subscription" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:55 +msgid "Edit Subscription" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:56 +msgid "New Subscription" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:57 +msgid "All Subscriptions" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:58 +msgid "View Subscription" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:59 +msgid "Search Subscriptions" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:60 +msgid "No subscriptions found." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:61 +msgid "No subscriptions found in Trash." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:63 +msgid "Filter subscriptions list" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:64 +msgid "Subscriptions list navigation" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:65 +msgid "Subscriptions list" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:71 +msgid "Subscription published." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:72 +msgid "Subscription published privately." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:73 +msgid "Subscription reverted to draft." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:74 +msgid "Subscription scheduled." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:75 +msgid "Subscription updated." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:101 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:123 +msgctxt "Subscription status" +msgid "Pending" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:102 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:136 +msgctxt "Subscription status" +msgid "Cancelled" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:103 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:149 +msgctxt "Subscription status" +msgid "Expired" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:104 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:162 +msgctxt "Subscription status" +msgid "Failed" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:105 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:175 +msgctxt "Subscription status" +msgid "On Hold" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:106 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:188 +msgctxt "Subscription status" +msgid "Active" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:107 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:201 +msgctxt "Subscription status" +msgid "Completed" +msgstr "" + +#. translators: %s: count value +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php:194 +msgid "Active (%s)" +msgid_plural "Active (%s)" +msgstr[0] "" +msgstr[1] "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:265 +msgctxt "Subscription title date format parsed by `date_i18n`." +msgid "M d, Y @ h:i A" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:488 +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:175 +msgid "Frequency" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php:502 +msgid "Interval Period" +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:262 +msgid "Gateway does not support subscription mandate updates." +msgstr "" + +#. translators: 1: new status +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:876 +msgid "Subscription created with status \"%1$s\"." +msgstr "" + +#. translators: 1: old status, 2: new status +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:883 +msgid "Subscription status changed from \"%1$s\" to \"%2$s\"." +msgstr "" + +#. translators: %s: expiry date +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:966 +msgid "Subscription renewal due on %s." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1196 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1214 +msgid "Subscription ID." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1218 +msgid "Subscription phase sequence number." +msgstr "" + +#. translators: %s: Subscription ID +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1242 +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1268 +msgid "Could not find subscription with ID `%s`." +msgstr "" + +#. translators: %s: Subscription ID +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php:1284 +msgid "Could not find subscription phase with sequence number `%s`." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:196 +msgid "Subscription anonymized for personal data erasure request." +msgstr "" + +#. translators: %s = subscription id +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:198 +msgid "Subscription ID %s anonymized." +msgstr "" + +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:217 +msgid "Subscription not anonymized for personal data erasure request because of active status." +msgstr "" + +#. translators: %s: Subscription ID +#: vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php:220 +msgid "Subscription ID %s not anonymized because of active status." +msgstr "" + +#. translators: %s: formatted next payment date +#: vendor/wp-pay/core/src/Upgrades/Upgrade620.php:122 +msgid "Missing subscription next payment date restored to %s." +msgstr "" + +#. translators: %s: number of years +#: vendor/wp-pay/core/src/Util.php:152 +msgid "%s year" +msgid_plural "%s years" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: number of months +#: vendor/wp-pay/core/src/Util.php:157 +msgid "%s month" +msgid_plural "%s months" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: number of days +#: vendor/wp-pay/core/src/Util.php:162 +msgid "%s day" +msgid_plural "%s days" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: number of hours +#: vendor/wp-pay/core/src/Util.php:167 +msgid "%s hour" +msgid_plural "%s hours" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: number of minutes +#: vendor/wp-pay/core/src/Util.php:172 +msgid "%s minute" +msgid_plural "%s minutes" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: number of seconds +#: vendor/wp-pay/core/src/Util.php:177 +msgid "%s second" +msgid_plural "%s seconds" +msgstr[0] "" +msgstr[1] "" + +#. translators: 1: formatted periods, 2: last formatted period +#: vendor/wp-pay/core/src/Util.php:194 +msgid "%1$s and %2$s" +msgstr "" + +#. translators: %s: formatted date interval periods +#: vendor/wp-pay/core/src/Util.php:223 +msgid "Every %s" +msgstr "" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:242 +msgid "Every %s day" +msgid_plural "Every %s days" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:247 +msgid "Every %s week" +msgid_plural "Every %s weeks" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:252 +msgid "Every %s month" +msgid_plural "Every %s months" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: interval +#: vendor/wp-pay/core/src/Util.php:257 +msgid "Every %s year" +msgid_plural "Every %s years" +msgstr[0] "" +msgstr[1] "" + +#. translators: %s: frequency +#: vendor/wp-pay/core/src/Util.php:298 +msgid "%s period" +msgid_plural "%s periods" +msgstr[0] "" +msgstr[1] "" + +#: vendor/wp-pay/core/views/form.php:105 +msgid "Personal Info" +msgstr "" + +#: vendor/wp-pay/core/views/form.php:125 +#: vendor/wp-pay/core/views/form.php:129 +msgid "Email Address" +msgstr "" + +#: vendor/wp-pay/core/views/form.php:148 +msgid "Payment Info" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:41 +msgid "Button Text" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:63 +msgid "Show as input field" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:64 +msgid "Show as choices" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-form-options.php:65 +msgid "Show as choices with input field" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:33 +#: vendor/wp-pay/core/views/tab-gateways.php:25 +msgid "Payment provider" +msgstr "" + +#. translators: %s: Integration name +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:53 +#: vendor/wp-pay/core/views/tab-gateways.php:69 +msgid "%s (obsoleted)" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:82 +msgid "Dashboards" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:92 +msgid "Product information" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:103 +#: vendor/wp-pay/core/views/meta-box-gateway-config.php:104 +msgid "Manual" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php:15 +msgid "Active" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:34 +msgid "Feedback" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:42 +msgid "Supported Payment Methods" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:56 +msgid "Webhook Status" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:89 +msgid "Transaction feedback" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-settings.php:93 +msgid "Processing gateway transaction feedback in the background requires additional configuration." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:23 +msgid "Please save the entered account details of your payment provider, to make a test payment." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:121 +msgid "Phone Number" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:133 +msgid "— Select Repeat —" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:134 +msgid "Daily" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:135 +msgid "Weekly" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:136 +msgid "Monthly" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:137 +msgid "Annually" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:142 +msgid "weeks" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:143 +msgid "months" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:144 +msgid "year" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:156 +msgid "Test Subscription" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:160 +msgid "Start a subscription for this payment." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:202 +msgid "Repeat every" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:219 +msgid "days/weeks/months/year" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:224 +msgid "Ends On" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:231 +msgid "Never" +msgstr "" + +#. translators: %s: Input field for number times +#: vendor/wp-pay/core/views/meta-box-gateway-test.php:254 +msgid "After %s times" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:17 +msgid "This gateway does not support webhook logging." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:27 +msgid "No webhook request processed yet." +msgstr "" + +#. translators: 1: formatted date, 2: payment edit url, 3: payment id +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:49 +msgid "Last webhook request processed on %1$s for payment #%3$s." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:53 +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:64 +msgctxt "full datetime format" +msgid "l j F Y \\a\\t H:i" +msgstr "" + +#. translators: 1: formatted date, 2: payment edit url, 3: payment id +#: vendor/wp-pay/core/views/meta-box-gateway-webhook-log.php:60 +msgid "Last webhook request processed on %1$s." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-notes.php:26 +msgid "No notes found." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-notes.php:34 +msgid "Note" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-notes.php:35 +#: vendor/wp-pay/core/views/meta-box-payment-info.php:477 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:255 +msgid "User" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:141 +msgid "Bank Transfer Recipient" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:180 +msgid "Return URL" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:198 +msgid "Redirect URL" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:282 +msgid "Company" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:312 +msgid "VAT Number Validity" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:333 +msgid "Request Date" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:382 +msgid "Validation Service" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:389 +msgid "VIES" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:521 +msgid "Account Holder" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:539 +msgid "Account Holder City" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:557 +msgid "Account Holder Country" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:575 +msgid "Account Number" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:597 +msgctxt "IBAN abbreviation title" +msgid "International Bank Account Number" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:623 +msgctxt "BIC abbreviation title" +msgid "Bank Identifier Code" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:624 +msgid "BIC" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:646 +msgid "Billing Address" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:665 +msgid "Shipping Address" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:706 +msgid "Google Analytics" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:713 +msgid "Ecommerce conversion tracked" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:717 +msgid "Ecommerce conversion not tracked" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:731 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:301 +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:28 +msgid "Period" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:739 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:309 +msgid "Level" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:760 +msgid "Session ID" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:773 +msgid "User ID" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:800 +msgid "Ingenico Alias" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:826 +msgid "IP Address" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:837 +msgid "Version" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-info.php:878 +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:377 +msgid "REST API URL" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:19 +msgid "No payment lines found." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:29 +msgid "SKU" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:30 +msgid "Image" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:37 +msgid "Unit price with discount including tax." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:38 +msgid "Unit Price" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:43 +msgid "Quantity" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:49 +msgid "Total discount." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:50 +msgid "Discount" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:60 +msgid "Total amount with discount including tax." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:61 +msgid "Total Amount" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:66 +msgid "Total Tax" +msgstr "" + +#. translators: %s: price excluding tax +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:124 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:241 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:280 +msgid "Exclusive tax: %s" +msgstr "" + +#. translators: %s: price including tax +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:141 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:249 +#: vendor/wp-pay/core/views/meta-box-payment-lines.php:288 +msgid "Inclusive tax: %s" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:86 +msgctxt "Recurring payment" +msgid "Recurrence" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-subscription.php:130 +msgid "This payment is not related to a subscription." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-update.php:76 +msgid "Check status" +msgstr "" + +#. translators: %s: payment method name +#: vendor/wp-pay/core/views/meta-box-payment-update.php:99 +msgid "Create %1$s invoice" +msgstr "" + +#. translators: %s: payment method name +#: vendor/wp-pay/core/views/meta-box-payment-update.php:129 +msgid "Cancel %1$s reservation" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-payment-update.php:162 +msgid "Send to Google Analytics" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:30 +msgid "l jS \\o\\f F Y, h:ia" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:168 +msgid "Paid up to" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:190 +msgid "Next Payment Date" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:205 +msgid "Next Payment Delivery Date" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:320 +msgid "Cancel URL" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:338 +msgid "Renewal URL" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-info.php:356 +msgid "Mandate Selection URL" +msgstr "" + +#. translators: %s: next payment date +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:66 +msgid "Will be created on %s" +msgstr "" + +#. translators: 1: next payment delivery date, 2: create next period payment anchor +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:76 +msgid "Will be created on %1$s or %2$s" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:81 +msgid "create now" +msgstr "" + +#. translators: %d: payment ID +#: vendor/wp-pay/core/views/meta-box-subscription-payments.php:173 +msgid "Retry payment #%d" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:18 +msgid "No phases found." +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:33 +msgid "Next Date" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:34 +msgid "Periods created" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:35 +msgid "Trial" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:36 +msgid "Aligned" +msgstr "" + +#: vendor/wp-pay/core/views/meta-box-subscription-phases.php:37 +msgid "Prorated" +msgstr "" + +#. translators: %s: Pronamic Pay +#: vendor/wp-pay/core/views/notice-license.php:27 +msgid "Thank you for activating your license and using the %s plugin." +msgstr "" + +#: vendor/wp-pay/core/views/notice-license.php:33 +msgid "This license does not have any activations left. Maybe you have to deactivate your license on a local/staging server. This can be done on your Pronamic.eu account." +msgstr "" + +#: vendor/wp-pay/core/views/notice-license.php:42 +msgid "There was a problem activating your license key, please try again or contact support." +msgstr "" + +#: vendor/wp-pay/core/views/notice-upgrade.php:28 +msgid "Pronamic Pay Upgrade Required" +msgstr "" + +#: vendor/wp-pay/core/views/notice-upgrade.php:29 +msgid "We just need to update your install to the latest version." +msgstr "" + +#: vendor/wp-pay/core/views/notice-upgrade.php:33 +msgid "Run the upgrader" +msgstr "" + +#: vendor/wp-pay/core/views/notice-upgrade.php:39 +msgid "It is strongly recommended that you backup your database before proceeding. Are you sure you wish to run the upgrader now?" +msgstr "" + +#: vendor/wp-pay/core/views/notice-upgraded.php:16 +msgid "Pronamic Pay Upgraded" +msgstr "" + +#: vendor/wp-pay/core/views/notice-upgraded.php:17 +msgid "Successfully upgraded to the latest version." +msgstr "" + +#. translators: 1: configuration link(s) +#: vendor/wp-pay/core/views/notice-webhook-url.php:56 +msgid "The webhook URL to receive automatic payment status updates seems to have changed for the %1$s configuration. Please check your settings." +msgid_plural "The webhook URL to receive automatic payment status updates seems to have changed for the %1$s configurations. Please check your settings." +msgstr[0] "" +msgstr[1] "" + +#: vendor/wp-pay/core/views/page-dashboard.php:44 +msgid "Latest Payments" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:148 +#: vendor/wp-pay/core/views/page-dashboard.php:287 +msgid "Show more details" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:170 +msgid "No pending payments found." +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:196 +msgid "Latest Subscriptions" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:323 +msgid "Getting Started" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:328 +msgid "Please follow the tour, read the 'What is new' and 'Getting Started' pages before contacting us. Also, check the Site Health page for any issues." +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:347 +#: vendor/wp-pay/core/views/pointer-start.php:20 +msgid "Start tour" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:362 +msgid "What is new" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:389 +msgid "Site Health" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:406 +#: vendor/wp-pay/core/views/page-tools.php:14 +msgid "System Status" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:419 +#: vendor/wp-pay/core/views/page-dashboard.php:430 +msgid "Pronamic News" +msgstr "" + +#: vendor/wp-pay/core/views/page-dashboard.php:428 +msgid "http://www.pronamic.eu/" +msgstr "" + +#: vendor/wp-pay/core/views/page-settings.php:18 +msgid "The default payment status pages are created." +msgstr "" + +#: vendor/wp-pay/core/views/page-settings.php:25 +msgid "The default payment status pages could not be created." +msgstr "" + +#: vendor/wp-pay/core/views/page-tools.php:15 +msgid "Payment Gateways" +msgstr "" + +#: vendor/wp-pay/core/views/page-tools.php:16 +msgid "Extensions" +msgstr "" + +#: vendor/wp-pay/core/views/page-tools.php:25 +msgid "Secondary menu" +msgstr "" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:15 +msgid "On the Pronamic Pay dashboard you can restart this tour and see an overview of the latest pending payments." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:16 +msgid "It also gives you access to the “Getting Started” and “Site Health” pages in case you have issues." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:17 +msgid "And you can follow the latest news from the Pronamic.eu weblog." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:22 +#: vendor/wp-pay/core/views/pointer-forms.php:41 +#: vendor/wp-pay/core/views/pointer-gateways.php:24 +#: vendor/wp-pay/core/views/pointer-payments.php:24 +#: vendor/wp-pay/core/views/pointer-settings.php:23 +msgid "Next" +msgstr "" + +#: vendor/wp-pay/core/views/pointer-dashboard.php:24 +#: vendor/wp-pay/core/views/pointer-forms.php:43 +#: vendor/wp-pay/core/views/pointer-gateways.php:26 +#: vendor/wp-pay/core/views/pointer-payments.php:26 +#: vendor/wp-pay/core/views/pointer-reports.php:23 +#: vendor/wp-pay/core/views/pointer-settings.php:25 +#: vendor/wp-pay/core/views/pointer-start.php:22 +msgid "Close" +msgstr "" + +#: vendor/wp-pay/core/views/pointer-forms.php:15 +msgid "On the payment forms page you can add, edit or delete simple payment forms." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-forms.php:16 +msgid "Currently it’s not possible to adjust the form fields or styling of these forms." +msgstr "" + +#. translators: 1: Gravity Forms link, 2: _blank +#: vendor/wp-pay/core/views/pointer-forms.php:22 +msgid "For more advanced payment forms we advice you to use the “Gravity Forms” plugin." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-forms.php:38 +#: vendor/wp-pay/core/views/pointer-gateways.php:21 +#: vendor/wp-pay/core/views/pointer-payments.php:21 +#: vendor/wp-pay/core/views/pointer-reports.php:20 +#: vendor/wp-pay/core/views/pointer-settings.php:20 +msgid "Previous" +msgstr "" + +#: vendor/wp-pay/core/views/pointer-gateways.php:15 +msgid "Here you can find an overview of all the gateway configurations on your WordPress site." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-gateways.php:16 +msgid "To use the Pronamic Pay plugin you have to add an payment gateway configuration." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-gateways.php:17 +msgid "Normally you get the required configuration information from your payment provider." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-payments.php:15 +msgid "On the payments page you can find an overview off all the payments initiated on your WordPress site." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-payments.php:16 +msgid "You can easily filter the payments by status or use the search field to search for specific payments." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-payments.php:17 +msgid "We advice you to regular check the pending payments on this overview and adjust the status of these payments manual if needed." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-reports.php:15 +msgid "The Pronamic Pay reports page shows you an graph of all the payments of this year." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-reports.php:16 +msgid "You can see the number of succesfull payments and the total amount of pending, succesfull, cancelled and failed payments." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-settings.php:15 +msgid "These are the General settings for the Pronamic Pay plugin." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-settings.php:16 +msgid "Here you can enter your license key and configure some default settings." +msgstr "" + +#: vendor/wp-pay/core/views/pointer-start.php:12 +msgid "Congratulations" +msgstr "" + +#: vendor/wp-pay/core/views/pointer-start.php:15 +msgid "You’ve just installed the Pronamic Pay plugin. Click “Start Tour” to view a quick introduction of this plugin’s core functionality." +msgstr "" + +#: vendor/wp-pay/core/views/pronamic.php:12 +msgid "Follow Pronamic" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-cancel.php:25 +#: vendor/wp-pay/core/views/subscription-cancel.php:34 +msgid "Subscription Cancellation" +msgstr "" + +#. translators: %s: expiry date +#: vendor/wp-pay/core/views/subscription-cancel.php:44 +#: vendor/wp-pay/core/views/subscription-renew.php:43 +msgid "The subscription expires at %s." +msgstr "" + +#: vendor/wp-pay/core/views/subscription-cancel.php:60 +#: vendor/wp-pay/core/views/subscription-renew.php:59 +msgid "Subscription Length:" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-cancel.php:67 +#: vendor/wp-pay/core/views/subscription-renew.php:66 +msgid "Amount:" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-cancel.php:79 +msgid "The subscription has already been canceled." +msgstr "" + +#: vendor/wp-pay/core/views/subscription-cancel.php:85 +msgid "Are you sure you want to cancel the subscription?" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-cancel.php:88 +msgid "Cancel" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate-failed.php:18 +#: vendor/wp-pay/core/views/subscription-mandate-updated.php:18 +msgid "Subscription Mandate" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate-failed.php:27 +msgid "The mandate for this subscription can not be updated." +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate-updated.php:27 +msgid "The subscription has been updated." +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:55 +#: vendor/wp-pay/core/views/subscription-mandate.php:65 +msgid "Change subscription payment method" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:69 +msgid "Select an existing payment method or add a new one." +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:76 +msgid "Select existing payment method" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:99 +msgctxt "Card selector" +msgid "Card Number" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:107 +msgctxt "Card selector" +msgid "Account Number" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:152 +msgctxt "Card selector" +msgid "Name" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:171 +msgid "Use selected payment method" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:181 +msgid "Add new payment method" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-mandate.php:186 +msgid "Select payment method for verification payment." +msgstr "" + +#: vendor/wp-pay/core/views/subscription-renew-failed.php:18 +#: vendor/wp-pay/core/views/subscription-renew.php:24 +#: vendor/wp-pay/core/views/subscription-renew.php:33 +msgid "Subscription Renewal" +msgstr "" + +#: vendor/wp-pay/core/views/subscription-renew-failed.php:27 +msgid "The subscription can not be renewed." +msgstr "" + +#: vendor/wp-pay/core/views/tab-extensions.php:13 +msgid "Supported extensions" +msgstr "" + +#: vendor/wp-pay/core/views/tab-extensions.php:35 +msgid "Author" +msgstr "" + +#: vendor/wp-pay/core/views/tab-extensions.php:38 +msgid "WordPress.org" +msgstr "" + +#: vendor/wp-pay/core/views/tab-extensions.php:41 +msgid "Requires at least" +msgstr "" + +#: vendor/wp-pay/core/views/tab-gateways.php:12 +msgid "Supported Payment Gateways" +msgstr "" + +#: vendor/wp-pay/core/views/tab-gateways.php:27 +#: vendor/wp-pay/core/views/tab-gateways.php:79 +msgid "Site" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:20 +msgid "License" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:27 +msgid "License Status" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:58 +msgid "Next License Check" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:82 +msgid "WordPress Environment" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:89 +msgid "Site URL" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:100 +msgid "Home URL" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:111 +msgid "PHP Version" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:122 +msgid "Pronamic Pay requires PHP 5.2 or above." +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:130 +msgid "MySQL Version" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:147 +msgid "Pronamic Pay requires MySQL 5 or above." +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:155 +msgid "WordPress Version" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:166 +msgid "Pronamic Pay requires WordPress 3.2 or above." +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:174 +msgid "WP Memory Limit" +msgstr "" + +#. translators: %s: WordPress Codex link +#: vendor/wp-pay/core/views/tab-system_status.php:194 +msgid "We recommend setting memory to at least 64MB. See: Increasing memory allocated to PHP" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:211 +msgid "Character Set" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:223 +msgid "Pronamic Pay advices to set the character encoding to UTF-8." +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:242 +msgid "cURL" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:267 +msgid "OpenSSL" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:287 +msgid "Pronamic Pay requires OpenSSL 0.9.8 or above." +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:295 +msgid "Registered Hashing Algorithms" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:312 +msgid "Pronamic Pay requires the \"sha1\" hashing algorithm." +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:320 +msgid "Travis CI build status" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:370 +msgid "iDEAL issuers status" +msgstr "" + +#. translators: %s: iDEAL-status.nl link +#: vendor/wp-pay/core/views/tab-system_status.php:379 +msgid "monitored by iDEAL-status.nl" +msgstr "" + +#: vendor/wp-pay/core/views/tab-system_status.php:401 +msgid "Failure" +msgstr "" + +#. translators: %s: Number payments +#: vendor/wp-pay/core/views/widget-payments-status-list.php:28 +msgid "%s payment" +msgid_plural "%s payments" +msgstr[0] "" +msgstr[1] "" + +#: views/error.php:19 +#: views/error.php:36 +#: views/exception.php:20 +msgid "Code" +msgstr "" + +#: views/error.php:22 +#: views/error.php:39 +#: views/exception.php:15 +msgid "Message" +msgstr "" + +#: views/error.php:42 +msgid "Detail" +msgstr "" + +#: views/error.php:45 +msgid "Suggested Action" +msgstr "" + +#: views/error.php:48 +msgid "Consumer Message" +msgstr "" + +#: views/eshop/settings-meta-box.php:21 +msgid "Accept payment by iDEAL" +msgstr "" + +#: views/exception.php:27 +msgid "Trace" +msgstr "" + +#: views/ideal-test-cases.php:18 +msgid "Order" +msgstr "" + +#: views/ideal-test-cases.php:21 +msgid "Expected result if integration is correct" +msgstr "" + +#. translators: %s: formatted amount +#: views/ideal-test-cases.php:68 +msgid "Transaction with amount = %s:" +msgstr "" + +#: views/redirect-message.php:18 +msgid "Payment notice" +msgstr "" + +#: views/redirect-via-html.php:18 +#: views/redirect-via-html.php:45 +msgid "Redirecting…" +msgstr "" + +#: views/redirect-via-html.php:48 +msgid "You will be automatically redirected to the online payment environment." +msgstr "" + +#: views/redirect-via-html.php:52 +msgid "Please click the button below if you are not automatically redirected." +msgstr "" diff --git a/wp-content/plugins/pronamic-ideal/other/dl_iso_table_a1.xml b/wp-content/plugins/pronamic-ideal/other/dl_iso_table_a1.xml new file mode 100644 index 00000000..41871b51 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/other/dl_iso_table_a1.xml @@ -0,0 +1,1970 @@ + + + + AFGHANISTAN + Afghani + AFN + 971 + 2 + + + ÅLAND ISLANDS + Euro + EUR + 978 + 2 + + + ALBANIA + Lek + ALL + 008 + 2 + + + ALGERIA + Algerian Dinar + DZD + 012 + 2 + + + AMERICAN SAMOA + US Dollar + USD + 840 + 2 + + + ANDORRA + Euro + EUR + 978 + 2 + + + ANGOLA + Kwanza + AOA + 973 + 2 + + + ANGUILLA + East Caribbean Dollar + XCD + 951 + 2 + + + ANTARCTICA + No universal currency + + + + + + ANTIGUA AND BARBUDA + East Caribbean Dollar + XCD + 951 + 2 + + + ARGENTINA + Argentine Peso + ARS + 032 + 2 + + + ARMENIA + Armenian Dram + AMD + 051 + 2 + + + ARUBA + Aruban Florin + AWG + 533 + 2 + + + AUSTRALIA + Australian Dollar + AUD + 036 + 2 + + + AUSTRIA + Euro + EUR + 978 + 2 + + + AZERBAIJAN + Azerbaijanian Manat + AZN + 944 + 2 + + + BAHAMAS + Bahamian Dollar + BSD + 044 + 2 + + + BAHRAIN + Bahraini Dinar + BHD + 048 + 3 + + + BANGLADESH + Taka + BDT + 050 + 2 + + + BARBADOS + Barbados Dollar + BBD + 052 + 2 + + + BELARUS + Belarussian Ruble + BYR + 974 + 0 + + + BELGIUM + Euro + EUR + 978 + 2 + + + BELIZE + Belize Dollar + BZD + 084 + 2 + + + BENIN + CFA Franc BCEAO + XOF + 952 + 0 + + + BERMUDA + Bermudian Dollar + BMD + 060 + 2 + + + BHUTAN + Ngultrum + BTN + 064 + 2 + + + BHUTAN + Indian Rupee + INR + 356 + 2 + + + BOLIVIA, PLURINATIONAL STATE OF + Boliviano + BOB + 068 + 2 + + + BOLIVIA, PLURINATIONAL STATE OF + Mvdol + BOV + 984 + 2 + + + BONAIRE, SINT EUSTATIUS AND SABA + US Dollar + USD + 840 + 2 + + + BOSNIA AND HERZEGOVINA + Convertible Mark + BAM + 977 + 2 + + + BOTSWANA + Pula + BWP + 072 + 2 + + + BOUVET ISLAND + Norwegian Krone + NOK + 578 + 2 + + + BRAZIL + Brazilian Real + BRL + 986 + 2 + + + BRITISH INDIAN OCEAN TERRITORY + US Dollar + USD + 840 + 2 + + + BRUNEI DARUSSALAM + Brunei Dollar + BND + 096 + 2 + + + BULGARIA + Bulgarian Lev + BGN + 975 + 2 + + + BURKINA FASO + CFA Franc BCEAO + XOF + 952 + 0 + + + BURUNDI + Burundi Franc + BIF + 108 + 0 + + + CAMBODIA + Riel + KHR + 116 + 2 + + + CAMEROON + CFA Franc BEAC + XAF + 950 + 0 + + + CANADA + Canadian Dollar + CAD + 124 + 2 + + + CAPE VERDE + Cape Verde Escudo + CVE + 132 + 2 + + + CAYMAN ISLANDS + Cayman Islands Dollar + KYD + 136 + 2 + + + CENTRAL AFRICAN REPUBLIC + CFA Franc BEAC + XAF + 950 + 0 + + + CHAD + CFA Franc BEAC + XAF + 950 + 0 + + + CHILE + Unidades de fomento + CLF + 990 + 0 + + + CHILE + Chilean Peso + CLP + 152 + 0 + + + CHINA + Yuan Renminbi + CNY + 156 + 2 + + + CHRISTMAS ISLAND + Australian Dollar + AUD + 036 + 2 + + + COCOS (KEELING) ISLANDS + Australian Dollar + AUD + 036 + 2 + + + COLOMBIA + Colombian Peso + COP + 170 + 2 + + + COLOMBIA + Unidad de Valor Real + COU + 970 + 2 + + + COMOROS + Comoro Franc + KMF + 174 + 0 + + + CONGO + CFA Franc BEAC + XAF + 950 + 0 + + + CONGO, THE DEMOCRATIC REPUBLIC OF + Congolese Franc + CDF + 976 + 2 + + + COOK ISLANDS + New Zealand Dollar + NZD + 554 + 2 + + + COSTA RICA + Costa Rican Colon + CRC + 188 + 2 + + + CÔTE D'IVOIRE + CFA Franc BCEAO + XOF + 952 + 0 + + + CROATIA + Croatian Kuna + HRK + 191 + 2 + + + CUBA + Peso Convertible + CUC + 931 + 2 + + + CUBA + Cuban Peso + CUP + 192 + 2 + + + CURAÇAO + Netherlands Antillean Guilder + ANG + 532 + 2 + + + CYPRUS + Euro + EUR + 978 + 2 + + + CZECH REPUBLIC + Czech Koruna + CZK + 203 + 2 + + + DENMARK + Danish Krone + DKK + 208 + 2 + + + DJIBOUTI + Djibouti Franc + DJF + 262 + 0 + + + DOMINICA + East Caribbean Dollar + XCD + 951 + 2 + + + DOMINICAN REPUBLIC + Dominican Peso + DOP + 214 + 2 + + + ECUADOR + US Dollar + USD + 840 + 2 + + + EGYPT + Egyptian Pound + EGP + 818 + 2 + + + EL SALVADOR + El Salvador Colon + SVC + 222 + 2 + + + EL SALVADOR + US Dollar + USD + 840 + 2 + + + EQUATORIAL GUINEA + CFA Franc BEAC + XAF + 950 + 0 + + + ERITREA + Nakfa + ERN + 232 + 2 + + + ESTONIA + Euro + EUR + 978 + 2 + + + ETHIOPIA + Ethiopian Birr + ETB + 230 + 2 + + + EUROPEAN UNION + Euro + EUR + 978 + 2 + + + FALKLAND ISLANDS (MALVINAS) + Falkland Islands Pound + FKP + 238 + 2 + + + FAROE ISLANDS + Danish Krone + DKK + 208 + 2 + + + FIJI + Fiji Dollar + FJD + 242 + 2 + + + FINLAND + Euro + EUR + 978 + 2 + + + FRANCE + Euro + EUR + 978 + 2 + + + FRENCH GUIANA + Euro + EUR + 978 + 2 + + + FRENCH POLYNESIA + CFP Franc + XPF + 953 + 0 + + + FRENCH SOUTHERN TERRITORIES + Euro + EUR + 978 + 2 + + + GABON + CFA Franc BEAC + XAF + 950 + 0 + + + GAMBIA + Dalasi + GMD + 270 + 2 + + + GEORGIA + Lari + GEL + 981 + 2 + + + GERMANY + Euro + EUR + 978 + 2 + + + GHANA + Ghana Cedi + GHS + 936 + 2 + + + GIBRALTAR + Gibraltar Pound + GIP + 292 + 2 + + + GREECE + Euro + EUR + 978 + 2 + + + GREENLAND + Danish Krone + DKK + 208 + 2 + + + GRENADA + East Caribbean Dollar + XCD + 951 + 2 + + + GUADELOUPE + Euro + EUR + 978 + 2 + + + GUAM + US Dollar + USD + 840 + 2 + + + GUATEMALA + Quetzal + GTQ + 320 + 2 + + + GUERNSEY + Pound Sterling + GBP + 826 + 2 + + + GUINEA + Guinea Franc + GNF + 324 + 0 + + + GUINEA-BISSAU + CFA Franc BCEAO + XOF + 952 + 0 + + + GUYANA + Guyana Dollar + GYD + 328 + 2 + + + HAITI + Gourde + HTG + 332 + 2 + + + HAITI + US Dollar + USD + 840 + 2 + + + HEARD ISLAND AND McDONALD ISLANDS + Australian Dollar + AUD + 036 + 2 + + + HOLY SEE (VATICAN CITY STATE) + Euro + EUR + 978 + 2 + + + HONDURAS + Lempira + HNL + 340 + 2 + + + HONG KONG + Hong Kong Dollar + HKD + 344 + 2 + + + HUNGARY + Forint + HUF + 348 + 2 + + + ICELAND + Iceland Krona + ISK + 352 + 0 + + + INDIA + Indian Rupee + INR + 356 + 2 + + + INDONESIA + Rupiah + IDR + 360 + 2 + + + INTERNATIONAL MONETARY FUND (IMF)  + SDR (Special Drawing Right) + XDR + 960 + N.A. + + + IRAN, ISLAMIC REPUBLIC OF + Iranian Rial + IRR + 364 + 2 + + + IRAQ + Iraqi Dinar + IQD + 368 + 3 + + + IRELAND + Euro + EUR + 978 + 2 + + + ISLE OF MAN + Pound Sterling + GBP + 826 + 2 + + + ISRAEL + New Israeli Sheqel + ILS + 376 + 2 + + + ITALY + Euro + EUR + 978 + 2 + + + JAMAICA + Jamaican Dollar + JMD + 388 + 2 + + + JAPAN + Yen + JPY + 392 + 0 + + + JERSEY + Pound Sterling + GBP + 826 + 2 + + + JORDAN + Jordanian Dinar + JOD + 400 + 3 + + + KAZAKHSTAN + Tenge + KZT + 398 + 2 + + + KENYA + Kenyan Shilling + KES + 404 + 2 + + + KIRIBATI + Australian Dollar + AUD + 036 + 2 + + + KOREA, DEMOCRATIC PEOPLE’S REPUBLIC OF + North Korean Won + KPW + 408 + 2 + + + KOREA, REPUBLIC OF + Won + KRW + 410 + 0 + + + KUWAIT + Kuwaiti Dinar + KWD + 414 + 3 + + + KYRGYZSTAN + Som + KGS + 417 + 2 + + + LAO PEOPLE’S DEMOCRATIC REPUBLIC + Kip + LAK + 418 + 2 + + + LATVIA + Latvian Lats + LVL + 428 + 2 + + + LEBANON + Lebanese Pound + LBP + 422 + 2 + + + LESOTHO + Loti + LSL + 426 + 2 + + + LESOTHO + Rand + ZAR + 710 + 2 + + + LIBERIA + Liberian Dollar + LRD + 430 + 2 + + + LIBYA + Libyan Dinar + LYD + 434 + 3 + + + LIECHTENSTEIN + Swiss Franc + CHF + 756 + 2 + + + LITHUANIA + Lithuanian Litas + LTL + 440 + 2 + + + LUXEMBOURG + Euro + EUR + 978 + 2 + + + MACAO + Pataca + MOP + 446 + 2 + + + MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF + Denar + MKD + 807 + 2 + + + MADAGASCAR + Malagasy Ariary + MGA + 969 + 2 + + + MALAWI + Kwacha + MWK + 454 + 2 + + + MALAYSIA + Malaysian Ringgit + MYR + 458 + 2 + + + MALDIVES + Rufiyaa + MVR + 462 + 2 + + + MALI + CFA Franc BCEAO + XOF + 952 + 0 + + + MALTA + Euro + EUR + 978 + 2 + + + MARSHALL ISLANDS + US Dollar + USD + 840 + 2 + + + MARTINIQUE + Euro + EUR + 978 + 2 + + + MAURITANIA + Ouguiya + MRO + 478 + 2 + + + MAURITIUS + Mauritius Rupee + MUR + 480 + 2 + + + MAYOTTE + Euro + EUR + 978 + 2 + + + MEMBER COUNTRIES OF THE AFRICAN DEVELOPMENT BANK GROUP + ADB Unit of Account + XUA + 965 + N.A. + + + MEXICO + Mexican Peso + MXN + 484 + 2 + + + MEXICO + Mexican Unidad de Inversion (UDI) + MXV + 979 + 2 + + + MICRONESIA, FEDERATED STATES OF + US Dollar + USD + 840 + 2 + + + MOLDOVA, REPUBLIC OF + Moldovan Leu + MDL + 498 + 2 + + + MONACO + Euro + EUR + 978 + 2 + + + MONGOLIA + Tugrik + MNT + 496 + 2 + + + MONTENEGRO + Euro + EUR + 978 + 2 + + + MONTSERRAT + East Caribbean Dollar + XCD + 951 + 2 + + + MOROCCO + Moroccan Dirham + MAD + 504 + 2 + + + MOZAMBIQUE + Mozambique Metical + MZN + 943 + 2 + + + MYANMAR + Kyat + MMK + 104 + 2 + + + NAMIBIA + Namibia Dollar + NAD + 516 + 2 + + + NAMIBIA + Rand + ZAR + 710 + 2 + + + NAURU + Australian Dollar + AUD + 036 + 2 + + + NEPAL + Nepalese Rupee + NPR + 524 + 2 + + + NETHERLANDS + Euro + EUR + 978 + 2 + + + NEW CALEDONIA + CFP Franc + XPF + 953 + 0 + + + NEW ZEALAND + New Zealand Dollar + NZD + 554 + 2 + + + NICARAGUA + Cordoba Oro + NIO + 558 + 2 + + + NIGER + CFA Franc BCEAO + XOF + 952 + 0 + + + NIGERIA + Naira + NGN + 566 + 2 + + + NIUE + New Zealand Dollar + NZD + 554 + 2 + + + NORFOLK ISLAND + Australian Dollar + AUD + 036 + 2 + + + NORTHERN MARIANA ISLANDS + US Dollar + USD + 840 + 2 + + + NORWAY + Norwegian Krone + NOK + 578 + 2 + + + OMAN + Rial Omani + OMR + 512 + 3 + + + PAKISTAN + Pakistan Rupee + PKR + 586 + 2 + + + PALAU + US Dollar + USD + 840 + 2 + + + PALESTINIAN TERRITORY, OCCUPIED + No universal currency + + + + + + PANAMA + Balboa + PAB + 590 + 2 + + + PANAMA + US Dollar + USD + 840 + 2 + + + PAPUA NEW GUINEA + Kina + PGK + 598 + 2 + + + PARAGUAY + Guarani + PYG + 600 + 0 + + + PERU + Nuevo Sol + PEN + 604 + 2 + + + PHILIPPINES + Philippine Peso + PHP + 608 + 2 + + + PITCAIRN + New Zealand Dollar + NZD + 554 + 2 + + + POLAND + Zloty + PLN + 985 + 2 + + + PORTUGAL + Euro + EUR + 978 + 2 + + + PUERTO RICO + US Dollar + USD + 840 + 2 + + + QATAR + Qatari Rial + QAR + 634 + 2 + + + RÉUNION + Euro + EUR + 978 + 2 + + + ROMANIA + New Romanian Leu + RON + 946 + 2 + + + RUSSIAN FEDERATION + Russian Ruble + RUB + 643 + 2 + + + RWANDA + Rwanda Franc + RWF + 646 + 0 + + + SAINT BARTHÉLEMY + Euro + EUR + 978 + 2 + + + SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA + Saint Helena Pound + SHP + 654 + 2 + + + SAINT KITTS AND NEVIS + East Caribbean Dollar + XCD + 951 + 2 + + + SAINT LUCIA + East Caribbean Dollar + XCD + 951 + 2 + + + SAINT MARTIN (FRENCH PART) + Euro + EUR + 978 + 2 + + + SAINT PIERRE AND MIQUELON + Euro + EUR + 978 + 2 + + + SAINT VINCENT AND THE GRENADINES + East Caribbean Dollar + XCD + 951 + 2 + + + SAMOA + Tala + WST + 882 + 2 + + + SAN MARINO + Euro + EUR + 978 + 2 + + + SAO TOME AND PRINCIPE + Dobra + STD + 678 + 2 + + + SAUDI ARABIA + Saudi Riyal + SAR + 682 + 2 + + + SENEGAL + CFA Franc BCEAO + XOF + 952 + 0 + + + SERBIA + Serbian Dinar + RSD + 941 + 2 + + + SEYCHELLES + Seychelles Rupee + SCR + 690 + 2 + + + SIERRA LEONE + Leone + SLL + 694 + 2 + + + SINGAPORE + Singapore Dollar + SGD + 702 + 2 + + + SINT MAARTEN (DUTCH PART) + Netherlands Antillean Guilder + ANG + 532 + 2 + + + SISTEMA UNITARIO DE COMPENSACION REGIONAL DE PAGOS "SUCRE" + Sucre + XSU + 994 + N.A. + + + SLOVAKIA + Euro + EUR + 978 + 2 + + + SLOVENIA + Euro + EUR + 978 + 2 + + + SOLOMON ISLANDS + Solomon Islands Dollar + SBD + 090 + 2 + + + SOMALIA + Somali Shilling + SOS + 706 + 2 + + + SOUTH AFRICA + Rand + ZAR + 710 + 2 + + + SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS + No universal currency + + + + + + SOUTH SUDAN + South Sudanese Pound + SSP + 728 + 2 + + + SPAIN + Euro + EUR + 978 + 2 + + + SRI LANKA + Sri Lanka Rupee + LKR + 144 + 2 + + + SUDAN + Sudanese Pound + SDG + 938 + 2 + + + SURINAME + Surinam Dollar + SRD + 968 + 2 + + + SVALBARD AND JAN MAYEN + Norwegian Krone + NOK + 578 + 2 + + + SWAZILAND + Lilangeni + SZL + 748 + 2 + + + SWEDEN + Swedish Krona + SEK + 752 + 2 + + + SWITZERLAND + WIR Euro + CHE + 947 + 2 + + + SWITZERLAND + Swiss Franc + CHF + 756 + 2 + + + SWITZERLAND + WIR Franc + CHW + 948 + 2 + + + SYRIAN ARAB REPUBLIC + Syrian Pound + SYP + 760 + 2 + + + TAIWAN, PROVINCE OF CHINA + New Taiwan Dollar + TWD + 901 + 2 + + + TAJIKISTAN + Somoni + TJS + 972 + 2 + + + TANZANIA, UNITED REPUBLIC OF + Tanzanian Shilling + TZS + 834 + 2 + + + THAILAND + Baht + THB + 764 + 2 + + + TIMOR-LESTE + US Dollar + USD + 840 + 2 + + + TOGO + CFA Franc BCEAO + XOF + 952 + 0 + + + TOKELAU + New Zealand Dollar + NZD + 554 + 2 + + + TONGA + Pa’anga + TOP + 776 + 2 + + + TRINIDAD AND TOBAGO + Trinidad and Tobago Dollar + TTD + 780 + 2 + + + TUNISIA + Tunisian Dinar + TND + 788 + 3 + + + TURKEY + Turkish Lira + TRY + 949 + 2 + + + TURKMENISTAN + Turkmenistan New Manat + TMT + 934 + 2 + + + TURKS AND CAICOS ISLANDS + US Dollar + USD + 840 + 2 + + + TUVALU + Australian Dollar + AUD + 036 + 2 + + + UGANDA + Uganda Shilling + UGX + 800 + 2 + + + UKRAINE + Hryvnia + UAH + 980 + 2 + + + UNITED ARAB EMIRATES + UAE Dirham + AED + 784 + 2 + + + UNITED KINGDOM + Pound Sterling + GBP + 826 + 2 + + + UNITED STATES + US Dollar + USD + 840 + 2 + + + UNITED STATES + US Dollar (Next day) + USN + 997 + 2 + + + UNITED STATES + US Dollar (Same day) + USS + 998 + 2 + + + UNITED STATES MINOR OUTLYING ISLANDS + US Dollar + USD + 840 + 2 + + + URUGUAY + Uruguay Peso en Unidades Indexadas (URUIURUI) + UYI + 940 + 0 + + + URUGUAY + Peso Uruguayo + UYU + 858 + 2 + + + UZBEKISTAN + Uzbekistan Sum + UZS + 860 + 2 + + + VANUATU + Vatu + VUV + 548 + 0 + + + Vatican City State (HOLY SEE) + Euro + EUR + 978 + 2 + + + VENEZUELA, BOLIVARIAN REPUBLIC OF + Bolivar Fuerte + VEF + 937 + 2 + + + VIET NAM + Dong + VND + 704 + 0 + + + VIRGIN ISLANDS (BRITISH) + US Dollar + USD + 840 + 2 + + + VIRGIN ISLANDS (US) + US Dollar + USD + 840 + 2 + + + WALLIS AND FUTUNA + CFP Franc + XPF + 953 + 0 + + + WESTERN SAHARA + Moroccan Dirham + MAD + 504 + 2 + + + YEMEN + Yemeni Rial + YER + 886 + 2 + + + ZAMBIA + Zambian Kwacha + ZMK + 894 + 2 + + + ZIMBABWE + Zimbabwe Dollar + ZWL + 932 + 2 + + + ZZ01_Bond Markets Unit European_EURCO + Bond Markets Unit European Composite Unit (EURCO) + XBA + 955 + N.A. + + + ZZ02_Bond Markets Unit European_EMU-6 + Bond Markets Unit European Monetary Unit (E.M.U.-6) + XBB + 956 + N.A. + + + ZZ03_Bond Markets Unit European_EUA-9 + Bond Markets Unit European Unit of Account 9 (E.U.A.-9) + XBC + 957 + N.A. + + + ZZ04_Bond Markets Unit European_EUA-17 + Bond Markets Unit European Unit of Account 17 (E.U.A.-17) + XBD + 958 + N.A. + + + ZZ05_UIC-Franc + UIC-Franc + XFU + Nil + N.A. + + + ZZ06_Testing_Code + Codes specifically reserved for testing purposes + XTS + 963 + N.A. + + + ZZ07_No_Currency + The codes assigned for transactions where no currency is involved + XXX + 999 + N.A. + + + ZZ08_Gold + Gold + XAU + 959 + N.A. + + + ZZ09_Palladium + Palladium + XPD + 964 + N.A. + + + ZZ10_Platinum + Platinum + XPT + 962 + N.A. + + + ZZ11_Silver + Silver + XAG + 961 + N.A. + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/other/extensions.json b/wp-content/plugins/pronamic-ideal/other/extensions.json new file mode 100644 index 00000000..df387d0f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/other/extensions.json @@ -0,0 +1,206 @@ +[ + { + "slug" : "charitable", + "name" : "Charitable", + "url" : "https://www.wpcharitable.com/", + "wp_org_url" : "https://wordpress.org/plugins/charitable/", + "github_url" : "https://github.com/Charitable/Charitable", + "requires_at_least" : "1.3", + "tested_up_to" : "1.6.45", + "author" : "Studio 164a", + "author_url" : "https://www.164a.com/" + }, + { + "slug" : "contact-form-7", + "name" : "Contact Form 7", + "url" : "https://contactform7.com/", + "wp_org_url" : "https://nl.wordpress.org/plugins/contact-form-7/", + "github_url" : "https://github.com/takayukister/contact-form-7", + "requires_at_least" : "5.1.9", + "tested_up_to" : "5.3.0", + "author" : "Takayuki Miyoshi", + "author_url" : "https://ideasilo.wordpress.com/", + "license" : "Basic" + }, + { + "slug" : "easy-digital-downloads", + "name" : "Easy Digital Downloads", + "url" : "https://easydigitaldownloads.com/", + "wp_org_url" : "https://wordpress.org/plugins/easy-digital-downloads/", + "github_url" : "https://github.com/easydigitaldownloads/Easy-Digital-Downloads", + "requires_at_least" : "1.8.6", + "tested_up_to" : "2.9.26", + "author" : "Pippin Williamson", + "author_url" : "https://pippinsplugins.com/" + }, + { + "slug" : "event-espresso-3", + "name" : "Event Espresso 3", + "url" : "https://eventespresso.com/", + "github_url" : "https://github.com/eventespresso/event-espresso-legacy", + "requires_at_least" : "3.1.24", + "tested_up_to" : "3.1.37.14.p" + }, + { + "slug" : "event-espresso-free", + "name" : "Event Espresso 3 Lite", + "url" : "https://eventespresso.com/", + "github_url" : "https://github.com/eventespresso/event-espresso-legacy", + "wp_org_url" : "https://wordpress.org/plugins/event-espresso-free/", + "requires_at_least" : "3.1.29.1.L", + "tested_up_to" : "3.1.37.15.L" + }, + { + "slug" : "event-espresso-4", + "name" : "Event Espresso 4", + "url" : "https://eventespresso.com/", + "github_url" : "https://github.com/eventespresso/event-espresso-core", + "requires_at_least" : "4.4.7.p", + "tested_up_to" : "4.10.8.p" + }, + { + "slug" : "event-espresso-decaf", + "name" : "Event Espresso 4 Decaf", + "url" : "https://eventespresso.com/", + "github_url" : "https://github.com/eventespresso/event-espresso-core", + "wp_org_url" : "https://wordpress.org/plugins/event-espresso-decaf/", + "requires_at_least" : "4.4.4.decaf", + "tested_up_to" : "4.10.8.decaf" + }, + { + "slug" : "formidable", + "name" : "Formidable Forms", + "url" : "https://formidableforms.com/", + "github_url" : "https://github.com/Strategy11/formidable-forms", + "wp_org_url" : "https://wordpress.org/plugins/formidable/", + "requires_at_least" : "2.0.22", + "tested_up_to" : "4.09", + "author" : "Strategy11", + "author_url" : "https://strategy11.com/" + }, + { + "slug" : "give", + "name" : "Give", + "url" : "https://givewp.com/", + "github_url" : "https://github.com/WordImpress/Give", + "wp_org_url" : "https://wordpress.org/plugins/give/", + "requires_at_least" : "1.8.0", + "tested_up_to" : "2.9.1" + }, + { + "slug" : "gravityforms", + "name" : "Gravity Forms", + "url" : "https://www.gravityforms.com/", + "requires_at_least" : "1.9", + "tested_up_to" : "2.4.21", + "author" : "Rocketgenius", + "author_url" : "https://www.rocketgenius.com/" + }, + { + "slug" : "gravityformsaweber", + "name" : "Gravity Forms AWeber Add-On", + "url" : "https://www.gravityforms.com/add-ons/aweber/", + "requires_at_least" : "1.4.2", + "tested_up_to" : "2.9", + "author" : "Rocketgenius", + "author_url" : "https://www.rocketgenius.com/" + }, + { + "slug" : "gravityformscampaignmonitor", + "name" : "Gravity Forms Campaign Monitor Add-On", + "url" : "https://www.gravityforms.com/add-ons/campaign-monitor/", + "requires_at_least" : "2.5.1", + "tested_up_to" : "3.7", + "author" : "Rocketgenius", + "author_url" : "https://www.rocketgenius.com/" + }, + { + "slug" : "gravityformsmailchimp", + "name" : "Gravity Forms MailChimp Add-On", + "url" : "https://www.gravityforms.com/add-ons/mailchimp/", + "requires_at_least" : "2.4.1", + "tested_up_to" : "4.6.3", + "author" : "Rocketgenius", + "author_url" : "https://www.rocketgenius.com/" + }, + { + "slug" : "gravityformsuserregistration", + "name" : "Gravity Forms User Registration Add-On", + "url" : "https://www.gravityforms.com/add-ons/user-registration/", + "requires_at_least" : "1.8", + "tested_up_to" : "4.4", + "author" : "Rocketgenius", + "author_url" : "https://www.rocketgenius.com/" + }, + { + "slug" : "gravityformszapier", + "name" : "Gravity Forms Zapier Add-On", + "url" : "https://www.gravityforms.com/add-ons/zapier/", + "requires_at_least" : "1.4.2", + "tested_up_to" : "3.2", + "author" : "Rocketgenius", + "author_url" : "https://www.rocketgenius.com/" + }, + { + "slug" : "memberpress", + "name" : "MemberPress", + "url" : "https://www.memberpress.com/", + "requires_at_least" : "1.2.4", + "tested_up_to" : "1.9.4", + "author" : "Caseproof, LLC", + "author_url" : "https://caseproof.com/" + }, + { + "slug" : "ninja-forms", + "name" : "Ninja Forms", + "url" : "https://ninjaforms.com/", + "wp_org_url" : "https://wordpress.org/plugins/ninja-forms/", + "github_url" : "https://github.com/wpninjas/ninja-forms", + "requires_at_least" : "3.3.15", + "tested_up_to" : "3.4.30", + "author" : "The WP Ninjas", + "author_url" : "https://ninjaforms.com/" + }, + { + "slug" : "restrict-content-pro", + "name" : "Restrict Content Pro", + "url" : "https://restrictcontentpro.com/", + "requires_at_least" : "3.0.0", + "tested_up_to" : "3.4.4", + "author" : "Sandhills Development, LLC", + "author_url" : "https://sandhillsdev.com/" + }, + { + "slug" : "s2member", + "name" : "s2Member®", + "url" : "https://s2member.com/", + "wp_org_url" : "https://wordpress.org/plugins/s2member/", + "github_url" : "https://github.com/WebSharks/s2Member", + "requires_at_least" : "130816", + "tested_up_to" : "200301", + "author" : "WebSharks, Inc.", + "author_url" : "http://www.websharks-inc.com/" + }, + { + "slug" : "woocommerce", + "name" : "WooCommerce", + "url" : "https://woocommerce.com/", + "github_url" : "https://github.com/woocommerce/woocommerce", + "wp_org_url" : "https://wordpress.org/plugins/woocommerce/", + "requires_at_least" : "2.3.0", + "tested_up_to" : "4.6.2", + "author" : "Automattic", + "author_url" : "https://automattic.com/" + }, + { + "slug" : "wp-e-commerce", + "name" : "WP e-Commerce", + "url" : "https://wpecommerce.org/", + "wp_org_url" : "https://wordpress.org/plugins/wp-e-commerce/", + "github_url" : "https://github.com/wp-e-commerce/WP-e-Commerce", + "requires_at_least" : "3.8.12.1", + "tested_up_to" : "3.15.1", + "author" : "Instinct Entertainment", + "author_url" : "http://instinct.co.nz/" + } +] diff --git a/wp-content/plugins/pronamic-ideal/pronamic-ideal.php b/wp-content/plugins/pronamic-ideal/pronamic-ideal.php new file mode 100644 index 00000000..a1e252a3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/pronamic-ideal.php @@ -0,0 +1,357 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Autoload. + */ +if ( ! defined( 'PRONAMIC_PAY_DEBUG' ) ) { + define( 'PRONAMIC_PAY_DEBUG', false ); +} + +$autoload_before = __DIR__ . '/src/autoload-before.php'; + +if ( is_readable( $autoload_before ) ) { + require $autoload_before; +} + +$loader = require __DIR__ . '/vendor/autoload.php'; + +$autoload_after = __DIR__ . '/src/autoload-after.php'; + +if ( is_readable( $autoload_after ) ) { + require $autoload_after; +} + +/** + * Bootstrap. + */ +\Pronamic\WordPress\Pay\Plugin::instance( + array( + 'file' => __FILE__, + 'options' => array( + 'about_page_file' => __DIR__ . '/admin/page-about.php', + ), + ) +); + +add_filter( + 'pronamic_pay_plugin_integrations', + function( $integrations ) { + // Charitable. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\Charitable\Extension(); + + // Easy Digital Downloads. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\EasyDigitalDownloads\Extension(); + + // Event Espresso. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\EventEspressoLegacy\Extension(); + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\EventEspresso\Extension(); + + // Give. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\Give\Extension(); + + // WooCommerce. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\WooCommerce\Extension(); + + // Gravity Forms. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\GravityForms\Extension(); + + // FormidableForms. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\FormidableForms\Extension(); + + // MemberPress. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\MemberPress\Extension(); + + // NinjaForms. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\NinjaForms\Extension(); + + // Restrict Content Pro. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\RestrictContentPro\Extension( + array( + 'slug' => 'restrict-content-pro', + 'db_version_option_name' => 'pronamic_pay_restrictcontentpro_db_version', + 'name' => 'Restrict Content Pro', + 'manual_url' => null, + /** + * Affiliate link. + * + * @link https://restrictcontentpro.com/affiliates/ + * @link https://restrictcontentpro.com/affiliate-agreement/ + * @todo Request a Restrict Content Pro affiliate link. + */ + 'affiliate_url' => null, + /** + * Requirements. + * + * @link https://github.com/dsawardekar/wp-requirements + * @link https://github.com/afragen/wp-dependency-installer + * @link https://github.com/wearerequired/wp-requirements-check + * @link https://github.com/ultraleettech/wp-requirements-checker + * @link https://waclawjacek.com/check-wordpress-plugin-dependencies/ + * @link https://github.com/xwp/wp-plugin-dependencies + * @link https://wordpress.org/plugins/plugin-dependencies/ + * @link https://github.com/joshbetz/wp-plugin-dependencies + * @link https://github.com/jrfnl/wp-known-plugin-dependencies + * @link https://github.com/xwp/wp-plugin-dependencies/issues/34 + * @link https://github.com/WordPress/WordPress/blob/master/wp-includes/class.wp-dependencies.php + * @link https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-dependency.php + * @link https://github.com/Yoast/yoast-acf-analysis/blob/2.3.0/inc/ac-yoast-seo-acf-content-analysis.php#L30-L32 + * @link https://github.com/Yoast/yoast-acf-analysis/blob/2.3.0/inc/requirements.php + */ + 'requirements' => array( + array( + 'type' => 'php', + 'requires_at_least' => '5.6.20', + ), + array( + 'type' => 'php-ext', + 'name' => 'Internationalization', + 'slug' => 'intl', + 'is_active' => function() { + return \extension_loaded( 'intl' ); + }, + ), + array( + 'type' => 'wp', + 'requires_at_least' => '4.7', + ), + array( + 'type' => 'wp-plugin', + 'name' => 'Restrict Content Pro', + 'slug' => 'restrict-content-pro', + 'uri' => 'https://restrictcontentpro.com/', + 'requires_at_least' => '3.0.0', + 'tested_up_to' => '3.1.2', + 'is_active' => function() { + return \defined( 'RCP_PLUGIN_VERSION' ); + }, + 'get_version' => function() { + if ( \defined( 'RCP_PLUGIN_VERSION' ) ) { + return RCP_PLUGIN_VERSION; + } + }, + ), + ), + ) + ); + + // s2Member. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\S2Member\Extension(); + + // WP e-Commerce. + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\WPeCommerce\Extension(); + + // Return integrations. + return $integrations; + } +); + +add_filter( + 'pronamic_pay_gateways', + function( $gateways ) { + // ABN AMRO - iDEAL Zelfbouw (v3). + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Integration( + array( + 'id' => 'abnamro-ideal-zelfbouw-v3', + 'name' => 'ABN AMRO - iDEAL Zelfbouw (v3)', + 'provider' => 'abnamro', + 'url' => 'https://abnamro.ideal-payment.de/', + 'product_url' => 'https://www.abnamro.nl/nl/zakelijk/betalen/online-betalen/betaaloplossing/', + 'dashboard_url' => array( + 'test' => 'https://abnamro-test.ideal-payment.de/', + 'live' => 'https://abnamro.ideal-payment.de/', + ), + 'acquirer_url' => 'https://abnamro.ideal-payment.de/ideal/iDEALv3', + 'acquirer_test_url' => 'https://abnamro-test.ideal-payment.de/ideal/iDEALv3', + 'certificates' => array(), + ) + ); + + // Buckaroo. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Buckaroo\Integration(); + + // Deutsche Bank - iDEAL Expert (v3). + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Integration( + array( + 'id' => 'deutschebank-ideal-expert-v3', + 'name' => 'Deutsche Bank - iDEAL Expert (v3)', + 'provider' => 'deutschebank', + 'product_url' => 'https://www.deutschebank.nl/nl/content/producten_en_services_commercial_banking_cash_management_betalen_ideal.html', + 'dashboard_url' => array( + 'test' => 'https://myideal.test.db.com/', + 'live' => 'https://myideal.db.com/', + ), + 'acquirer_url' => 'https://myideal.db.com/ideal/iDealv3', + 'acquirer_test_url' => null, + 'certificates' => array(), + ) + ); + + // EMS - eCommerce. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\EMS\ECommerce\Integration(); + + // ICEPAY. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Icepay\Integration(); + + // iDEAL Simulator - iDEAL Professional / Advanced / Zelfbouw (v3). + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Integration( + array( + 'id' => 'ideal-simulator-ideal-advanced-v3', + 'name' => 'iDEAL Simulator - iDEAL Professional / Advanced', + 'provider' => 'ideal-simulator', + 'product_url' => 'https://www.ideal-checkout.nl/support/ideal-simulator', + 'acquirer_url' => 'https://www.ideal-checkout.nl/simulator/', + 'acquirer_test_url' => null, + 'certificates' => array(), + ) + ); + + // ING - iDEAL Basic. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealBasic\Integration( + array( + 'id' => 'ing-ideal-basic', + 'name' => 'ING - iDEAL Basic', + 'provider' => 'ing', + 'product_url' => 'https://www.ing.nl/zakelijk/betalen/geld-ontvangen/ideal/', + 'manual_url' => __( 'https://www.pronamic.eu/support/how-to-connect-ing-ideal-basic-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + 'dashboard_url' => array( + 'test' => 'https://idealtest.secure-ing.com/', + 'live' => 'https://ideal.secure-ing.com/', + ), + 'acquirer_url' => 'https://ideal.secure-ing.com/ideal/mpiPayInitIng.do', + 'acquirer_test_url' => 'https://idealtest.secure-ing.com/ideal/mpiPayInitIng.do', + ) + ); + + // ING - iDEAL Advanced (v3). + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Integration( + array( + 'id' => 'ing-ideal-advanced-v3', + 'name' => 'ING - iDEAL Advanced (v3)', + 'provider' => 'ing', + 'product_url' => 'https://www.ing.nl/zakelijk/betalen/geld-ontvangen/ideal/', + 'manual_url' => __( 'https://www.pronamic.eu/support/how-to-connect-ing-ideal-advanced-v3-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + 'dashboard_url' => array( + 'test' => 'https://idealtest.secure-ing.com/', + 'live' => 'https://ideal.secure-ing.com/', + ), + 'acquirer_url' => 'https://ideal.secure-ing.com/ideal/iDEALv3', + 'acquirer_test_url' => 'https://idealtest.secure-ing.com/ideal/iDEALv3', + 'certificates' => array(), + ) + ); + + // ING - Kassa Compleet. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet\Integration(); + + // Mollie. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Mollie\Integration( + array( + 'register_url' => 'https://www.mollie.com/nl/signup/665327', + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-mollie-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + 'version_option_name' => 'pronamic_pay_mollie_version', + 'db_version_option_name' => 'pronamic_pay_mollie_db_version', + ) + ); + + // Mollie - iDEAL Basic. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealBasic\Integration( + array( + 'id' => 'mollie-ideal-basic', + 'name' => 'Mollie - iDEAL Basic', + 'provider' => 'mollie', + 'dashboard_url' => 'http://www.mollie.nl/beheer/', + 'deprecated' => true, + 'acquirer_url' => 'https://secure.mollie.nl/xml/idealAcquirer/lite/', + 'acquirer_test_url' => 'https://secure.mollie.nl/xml/idealAcquirer/testmode/lite/', + ) + ); + + // MultiSafePay - Connect. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\MultiSafepay\Integration(); + + // Ingenico - DirectLink. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Ingenico\DirectLink\Integration(); + + // Ingenico - OrderStandard. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Ingenico\OrderStandard\Integration(); + + // Rabobank - OmniKassa 2.0. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\OmniKassa2\Integration(); + + // Pay.nl. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\PayNL\Integration(); + + // Rabobank - iDEAL Professional (v3). + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Integration( + array( + 'id' => 'rabobank-ideal-professional-v3', + 'name' => 'Rabobank - iDEAL Professional (v3)', + 'provider' => 'rabobank', + 'product_url' => 'https://www.rabobank.nl/bedrijven/betalen/geld-ontvangen/ideal-professional/', + 'manual_url' => __( 'https://www.pronamic.eu/support/how-to-connect-rabobank-ideal-professional-v3-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + 'dashboard_url' => array( + 'test' => 'https://idealtest.rabobank.nl/', + 'live' => 'https://ideal.rabobank.nl/', + ), + 'acquirer_url' => 'https://ideal.rabobank.nl/ideal/iDEALv3', + 'acquirer_test_url' => 'https://idealtest.rabobank.nl/ideal/iDEALv3', + 'certificates' => array(), + ) + ); + + // Sisow. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Sisow\Integration(); + + // Sisow - iDEAL Basic. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\IDealBasic\Integration( + array( + 'id' => 'sisow-ideal-basic', + 'name' => 'Sisow - iDEAL Basic', + 'provider' => 'sisow', + 'url' => 'https://www.sisow.nl/', + 'dashboard_url' => 'https://www.sisow.nl/Sisow/iDeal/Login.aspx', + 'deprecated' => true, + 'acquirer_url' => 'https://www.sisow.nl/Sisow/iDeal/IssuerHandler.ashx', + 'acquirer_test_url' => 'https://www.sisow.nl/Sisow/iDeal/IssuerHandler.ashx/test', + ) + ); + + // TargetPay. + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\TargetPay\Integration(); + + // Return gateways. + return $gateways; + } +); + +/** + * Backward compatibility. + */ +global $pronamic_ideal; + +$pronamic_ideal = pronamic_pay_plugin(); diff --git a/wp-content/plugins/pronamic-ideal/readme.txt b/wp-content/plugins/pronamic-ideal/readme.txt new file mode 100644 index 00000000..503cbeb4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/readme.txt @@ -0,0 +1,221 @@ +=== Pronamic Pay === +Contributors: pronamic, remcotolsma +Tags: ideal, bank, payment, gravity forms, forms, payment, woocommerce, recurring-payments, shopp, rabobank, friesland bank, ing, mollie, omnikassa, wpsc, wpecommerce, commerce, e-commerce, cart +Donate link: https://www.pronamic.eu/donate/?for=wp-plugin-pronamic-pay&source=wp-plugin-readme-txt +Requires at least: 4.7 +Tested up to: 5.6 +Requires PHP: 5.6 +Stable tag: 6.6.3 + +The Pronamic Pay plugin adds payment methods like iDEAL, Bancontact, credit card and more to your WordPress site for a variety of payment providers. + + +== Description == + +Pronamic Pay is the best plugin available to accept payments on your site with support for payment methods like iDEAL (Netherlands), Bancontact (Belgium), Sofort (Europe) and credit card, among others. Easily add the configuration details of your payment service provider account and enable the payment method in one of the supported e-commerce plugins. With over 200,000 downloads, the plugin has proven itself as a reliable WordPress solution to use for your payments. + += Key Benefits = + +* Supports a wide variety of payment providers. +* Seamless integration with popular e-commerce and form builder plugins. +* Automatically updates payment status of orders in WordPress. +* Easily manage (multiple) payment provider configurations. +* Continually updated to support the latest e-commerce plugins. +* Built-in generation of required security certificates. +* Works with all popular WordPress e-commerce plugins. +* Recurring payments support for Mollie. +* Reliable payment solution, with over 200,000 downloads. + += Supported WordPress e-commerce plugins = + +* [Charitable](https://www.wpcharitable.com/) +* [Contact Form 7](https://contactform7.com/) (requires [Basic license](https://www.pronamic.eu/plugins/pronamic-pay/)) +* [Easy Digital Downloads](https://easydigitaldownloads.com/) +* [Event Espresso 3](https://eventespresso.com/) +* [Event Espresso 3 Lite](https://eventespresso.com/) +* [Event Espresso 4](https://eventespresso.com/) +* [Event Espresso 4 Decaf](https://eventespresso.com/) +* [Formidable Forms](https://formidableforms.com/) +* [Give](https://givewp.com/) +* [Gravity Forms](https://www.gravityforms.com/) +* [Gravity Forms AWeber Add-On](https://www.gravityforms.com/add-ons/aweber/) +* [Gravity Forms Campaign Monitor Add-On](https://www.gravityforms.com/add-ons/campaign-monitor/) +* [Gravity Forms MailChimp Add-On](https://www.gravityforms.com/add-ons/mailchimp/) +* [Gravity Forms User Registration Add-On](https://www.gravityforms.com/add-ons/user-registration/) +* [Gravity Forms Zapier Add-On](https://www.gravityforms.com/add-ons/zapier/) +* [MemberPress](https://www.memberpress.com/) +* [Ninja Forms](https://ninjaforms.com/) +* [Restrict Content Pro](https://restrictcontentpro.com/) +* [s2Member®](https://s2member.com/) +* [WooCommerce](https://woocommerce.com/) +* [WP e-Commerce](https://wpecommerce.org/) + += Supported payment providers = + +* ABN AMRO - iDEAL Zelfbouw (v3) +* Adyen (requires [Pro license](https://www.pronamic.eu/plugins/pronamic-pay/)) +* Buckaroo - HTML +* Deutsche Bank - iDEAL Expert (v3) +* EMS - e-Commerce +* ICEPAY +* iDEAL Simulator - iDEAL Professional / Advanced / Zelfbouw (v3) +* ING - iDEAL Basic +* ING - iDEAL Advanced (v3) +* ING - Kassa Compleet +* Mollie +* MultiSafepay - Connect +* Ingenico/Ogone - DirectLink +* Ingenico/Ogone - OrderStandard +* Pay.nl +* Payvision (requires [Basic license](https://www.pronamic.eu/plugins/pronamic-pay/)) +* Rabobank - OmniKassa 2.0 +* Rabobank - iDEAL Professional (v3) +* Sisow +* TargetPay - iDEAL + + +== Installation == + += Requirements = + +The Pronamic Pay plugin extends WordPress extensions with payment methods such as iDEAL, Bancontact, Sofort and credit cards. To offer the payment methods to the vistors of your WordPress website you also require one of these e-commerce or form builder extensions. + += Automatic installation = + +Automatic installation is the easiest option as WordPress handles the file transfers itself and you don’t need to leave your web browser. To do an automatic install of Pronamic Pay, log in to your WordPress dashboard, navigate to the Plugins menu and click Add New. + +In the search field type “Pronamic Pay” and click Search Plugins. Once you’ve found the plugin you can view details about it such as the the point release, rating and description. Most importantly of course, you can install it by simply clicking “Install Now”. + += Manual installation = + +The manual installation method involves downloading the plugin and uploading it to your webserver via your favourite FTP application. The WordPress codex contains [instructions on how to do this](http://codex.wordpress.org/Managing_Plugins#Manual_Plugin_Installation). + += Updating = + +Automatic updates should work like a charm; as always though, ensure you backup your site just in case. + + +== Screenshots == + +1. Payment provider configurations +2. Edit configuration +3. Built-in payment forms +4. Edit payment form +5. Payment form sample +6. Payments +7. Subscriptions +8. Reports +9. Settings +10. Gravity Forms - Form editor +11. Gravity Forms - Feed editor +12. Gravity Forms - Sample payment form +13. WooCommerce - Checkout settings +14. WooCommerce - Checkout form +15. WooCommerce - Checkout with credit card and valid mandate (mandates work with payment provider Mollie, subscriptions require WooCommerce Subscriptions) +16. s2Member - Button generator +17. Getting started + + +== Are there any known plugin conflicts? == + +Unfortunately WordPress is notorious for conflicts between themes and plugins. It is unavoidable as you have no control over what other plugins and themes do. While we do take steps to avoid conflicts as best we can, we have no control over other plugins or themes. + +As conflicts are found we will update this list. If you discover a conflict with a another plugin, please notify us. + +Here is a list of known plugin conflicts: + +=== WPML === + +The [WPML](https://wpml.org/) plugin(s) can conflict with multiple gateways. A lot of the gateways use `home_url( '/' )` to retrieve the WordPress home URL. The WPML plugins hooks in to this function to change the home URL to the correct language URL. This can result in incorrect checksums, signatures and hashes. + +=== WordPress HTTPS === + +The [WordPress HTTPS](https://wordpress.org/plugins/wordpress-https/) can conflict with the OmniKassa payment method. It can cause invalid signature errors. The WordPress HTTPS plugin parses the complete output of an WordPress website and changes 'http' URLs to 'https' URLs, this results in OmniKassa data that no longer matches the signature. + + +== Changelog == + += 6.6.3 - 2021-01-21 = +* Updated WordPress pay core library to version 2.6.2. + * Happy 2021. + * Added debug mode setting. + * Improved setting `utm_nooverride` parameter in redirect URL. +* Updated WordPress pay OmniKassa 2.0 library to version 2.3.1. + * Updated check for response object in client request. +* Updated WordPress pay Formidable Forms library to version 2.2.1. + * Fixed using undefined variable. + * Removed debug code. +* Updated WordPress pay Ninja Forms library to version 1.4.0. + * Added gateway configuration setting to form action. + += 6.6.2 - 2021-01-19 = +* Updated WordPress pay Event Espresso (legacy) library to version 2.3.2. + * Fixed using unknown classes. + += 6.6.1 - 2021-01-18 = +* Updated WordPress pay core library to version 2.6.1. + * Added support for recurring payments with Apple Pay. +* Updated WordPress pay Mollie library to version 2.2.1. + * Added support for first payment with regular iDEAL/Bancontact/Sofort payment methods. + * Added support for recurring payments with Apple Pay. + * Added 'Change Payment State' URL to Mollie payment admin page. + * Chargebacks now update subscriptions status to 'On hold' (needs manual review). +* Updated WordPress pay MultiSafepay library to version 2.1.2. + * Added support for In3 payment method. + * Added partial support for Santander 'Betaal per maand' payment method. +* Updated WordPress pay Payvision library to version 1.0.1. + * Added business ID to gateway ID column in payments overview. +* Updated WordPress pay Event Espresso (legacy) library to version 2.3.1. + * Fixed syntax errors. +* Updated WordPress pay MemberPress library to version 2.2.2. + * Added support for recurring payments with Apple Pay. + * Updated payment method icons to use wp-pay/logos library. + += 6.6.0 - 2021-01-14 = +* Updated WordPress pay core library to version 2.6.0. + * Payment Gateway Referral Exclusions in Google Analytics. + * Added Santander payment method. + * Ask for confirmation before manually cancelling a subscription. + * Redirect to new 'Subscription Canceled' status page after cancelling subscriptions. + * Fixed updating subscription dates on next period payment creation. + * Only add user agent in payment info meta box if not empty. + * Added feature to manually start the next subscription payment. +* Updated WordPress pay Charitable library to version 2.2.1. + * Improved donation total amount value retrieval. + * Improved user data support, set adress line 2 and country code. +* Updated WordPress pay Contact Form 7 to version 1.0.3. + * Fix redirecting when scripts are disabled through `wpcf7_load_js` filter. +* Updated WordPress pay Formidable Forms to version 2.2.0. + * Simplified icon hover style. + * Updated form action icon. + * Added support for form settings redirect success URL. +* Updated WordPress pay Ninja Forms to version 1.3.0. + * Fixed notice payment redirect URL. +* Updated WordPress pay Restrict Content Pro to version 2.3.1. + * Renew inactive membership on successful (retry) payment. + * Fix not using checkout label setting. +* Updated WordPress pay s2Member to version 2.2.1. + * Prevent updating eot if (retry) payment period end date is (before) current eot time. + * Fix using removed payment data class and multiple status update actions. + * Fix setting subscription next payment date for new subscriptions (removes payment data class). +* Updated WordPress pay WooCommerce to version 2.2.1. + * Updated logo library to version 1.6.3 for new iDEAL logo. + * Start subscription payment through subscription module instead of plugin. + * Move info message up on thank you page. + * Add Santander payment method. + += 6.5.1 - 2020-11-19 = +* Updated WordPress pay core library to version 2.5.1. + * Fixed always setting payment customer details. + * Fixed setting currency in payment lines amount. +* Updated WordPress pay Gravity Forms library to version 2.5.1. + * Updated getting subscription from payment period. +* Updated WordPress pay Adyen library to version 1.2.1. + * Removed unused configuration to store card details. + +[See changelog for all versions.](https://www.pronamic.eu/plugins/pronamic-pay/changelog/) + +== Links == + +* [Pronamic](https://www.pronamic.eu/) +* [Remco Tolsma](https://www.remcotolsma.nl/) diff --git a/wp-content/plugins/pronamic-ideal/uninstall.php b/wp-content/plugins/pronamic-ideal/uninstall.php new file mode 100644 index 00000000..580596db --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/uninstall.php @@ -0,0 +1,107 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { + exit; +} + +global $wpdb; + +if ( '1' !== get_option( 'pronamic_pay_uninstall_clear_data', false ) ) { + return; +} + +// Delete tables. +$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}pronamic_ideal_configurations" ); +$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}pronamic_ideal_payments" ); +$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}rg_ideal_feeds" ); + +// Delete posts. +$wpdb->query( "DELETE FROM wp_posts WHERE post_type = 'pronamic_gateway';" ); +$wpdb->query( "DELETE FROM wp_posts WHERE post_type = 'pronamic_payment';" ); +$wpdb->query( "DELETE FROM wp_posts WHERE post_type = 'pronamic_pay_gf';" ); + +$wpdb->query( 'DELETE FROM wp_postmeta WHERE post_id NOT IN ( SELECT ID FROM wp_posts );' ); + +// Delete general options. +delete_option( 'pronamic_pay_version' ); +delete_option( 'pronamic_pay_db_version' ); + +/** + * Delete extension options. + */ + +// Event Espresso. +delete_option( 'pronamic_pay_ideal_event_espreso_config_id' ); + +// Gravity Forms. +// There are options for Gravity Forms. +delete_option( '' ); + +// Jigoshop. +// Set default Jigoshop variables, load them form the WordPress options. +delete_option( 'pronamic_pay_ideal_jigoshop_enabled' ); +delete_option( 'pronamic_pay_ideal_jigoshop_title' ); +delete_option( 'pronamic_pay_ideal_jigoshop_description' ); +delete_option( 'pronamic_pay_ideal_jigoshop_config_id' ); + +// Membership. +delete_option( 'pronamic_pay_ideal_membership_config_id' ); + +// s2Member®. +delete_option( 'pronamic_pay_ideal_s2member_config_id' ); + +// Shopp. +// Shopp options are stored in the Shopp meta table, we don't touch this. +delete_option( '' ); + +// WooCommerce. +delete_option( 'woocommerce_pronamic_pay_ideal_settings' ); + +// WP e-Commerce. +delete_option( 'pronamic_pay_ideal_wpsc_config_id' ); + +// ClassiPress. +delete_option( '' ); + +// JobRoller. +delete_option( '' ); + +/** + * Delete legacy options. + */ + +// General. +delete_option( 'pronamic_ideal_version' ); +delete_option( 'pronamic_ideal_key' ); +delete_option( 'gf_ideal_version' ); + +// Event Espresso. +delete_option( 'pronamic_ideal_event_espresso_configuration_id' ); + +// Jigoshop. +delete_option( 'jigoshop_pronamic_ideal_enabled' ); +delete_option( 'jigoshop_pronamic_ideal_title' ); +delete_option( 'jigoshop_pronamic_ideal_description' ); +delete_option( 'jigoshop_pronamic_ideal_configuration_id' ); + +// Membership. +delete_option( 'pronamic_ideal_membership_enabled' ); +delete_option( 'pronamic_ideal_membership_chosen_configuration' ); + +// s2Member®. +delete_option( 'pronamic_ideal_s2member_enabled' ); +delete_option( 'pronamic_ideal_s2member_chosen_configuration' ); + +// WooCommerce. +delete_option( 'woocommerce_pronamic_ideal_settings' ); + +// WP e-Commerce. +delete_option( 'pronamic_ideal_wpsc_configuration_id' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/autoload.php b/wp-content/plugins/pronamic-ideal/vendor/autoload.php new file mode 100644 index 00000000..ebb9d1f0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_classmap.php b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..0a38df88 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_classmap.php @@ -0,0 +1,808 @@ + $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php', + 'Composer\\Installers\\AimeosInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AimeosInstaller.php', + 'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php', + 'Composer\\Installers\\AsgardInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AsgardInstaller.php', + 'Composer\\Installers\\AttogramInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AttogramInstaller.php', + 'Composer\\Installers\\BaseInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BaseInstaller.php', + 'Composer\\Installers\\BitrixInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BitrixInstaller.php', + 'Composer\\Installers\\BonefishInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BonefishInstaller.php', + 'Composer\\Installers\\CakePHPInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php', + 'Composer\\Installers\\ChefInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ChefInstaller.php', + 'Composer\\Installers\\CiviCrmInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CiviCrmInstaller.php', + 'Composer\\Installers\\ClanCatsFrameworkInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php', + 'Composer\\Installers\\CockpitInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CockpitInstaller.php', + 'Composer\\Installers\\CodeIgniterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php', + 'Composer\\Installers\\Concrete5Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Concrete5Installer.php', + 'Composer\\Installers\\CraftInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CraftInstaller.php', + 'Composer\\Installers\\CroogoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CroogoInstaller.php', + 'Composer\\Installers\\DecibelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DecibelInstaller.php', + 'Composer\\Installers\\DframeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DframeInstaller.php', + 'Composer\\Installers\\DokuWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php', + 'Composer\\Installers\\DolibarrInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php', + 'Composer\\Installers\\DrupalInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DrupalInstaller.php', + 'Composer\\Installers\\ElggInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ElggInstaller.php', + 'Composer\\Installers\\EliasisInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EliasisInstaller.php', + 'Composer\\Installers\\ExpressionEngineInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php', + 'Composer\\Installers\\EzPlatformInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php', + 'Composer\\Installers\\FuelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelInstaller.php', + 'Composer\\Installers\\FuelphpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php', + 'Composer\\Installers\\GravInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/GravInstaller.php', + 'Composer\\Installers\\HuradInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/HuradInstaller.php', + 'Composer\\Installers\\ImageCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php', + 'Composer\\Installers\\Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Installer.php', + 'Composer\\Installers\\ItopInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ItopInstaller.php', + 'Composer\\Installers\\JoomlaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/JoomlaInstaller.php', + 'Composer\\Installers\\KanboardInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KanboardInstaller.php', + 'Composer\\Installers\\KirbyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KirbyInstaller.php', + 'Composer\\Installers\\KnownInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KnownInstaller.php', + 'Composer\\Installers\\KodiCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php', + 'Composer\\Installers\\KohanaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KohanaInstaller.php', + 'Composer\\Installers\\LanManagementSystemInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php', + 'Composer\\Installers\\LaravelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LaravelInstaller.php', + 'Composer\\Installers\\LavaLiteInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php', + 'Composer\\Installers\\LithiumInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LithiumInstaller.php', + 'Composer\\Installers\\MODULEWorkInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php', + 'Composer\\Installers\\MODXEvoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php', + 'Composer\\Installers\\MagentoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MagentoInstaller.php', + 'Composer\\Installers\\MajimaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MajimaInstaller.php', + 'Composer\\Installers\\MakoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MakoInstaller.php', + 'Composer\\Installers\\MantisBTInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MantisBTInstaller.php', + 'Composer\\Installers\\MauticInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MauticInstaller.php', + 'Composer\\Installers\\MayaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MayaInstaller.php', + 'Composer\\Installers\\MediaWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php', + 'Composer\\Installers\\MicroweberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php', + 'Composer\\Installers\\ModxInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ModxInstaller.php', + 'Composer\\Installers\\MoodleInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MoodleInstaller.php', + 'Composer\\Installers\\OctoberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OctoberInstaller.php', + 'Composer\\Installers\\OntoWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php', + 'Composer\\Installers\\OsclassInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OsclassInstaller.php', + 'Composer\\Installers\\OxidInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OxidInstaller.php', + 'Composer\\Installers\\PPIInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PPIInstaller.php', + 'Composer\\Installers\\PhiftyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php', + 'Composer\\Installers\\PhpBBInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php', + 'Composer\\Installers\\PimcoreInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PimcoreInstaller.php', + 'Composer\\Installers\\PiwikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PiwikInstaller.php', + 'Composer\\Installers\\PlentymarketsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php', + 'Composer\\Installers\\Plugin' => $vendorDir . '/composer/installers/src/Composer/Installers/Plugin.php', + 'Composer\\Installers\\PortoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PortoInstaller.php', + 'Composer\\Installers\\PrestashopInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php', + 'Composer\\Installers\\ProcessWireInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ProcessWireInstaller.php', + 'Composer\\Installers\\PuppetInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PuppetInstaller.php', + 'Composer\\Installers\\PxcmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PxcmsInstaller.php', + 'Composer\\Installers\\RadPHPInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php', + 'Composer\\Installers\\ReIndexInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php', + 'Composer\\Installers\\Redaxo5Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Redaxo5Installer.php', + 'Composer\\Installers\\RedaxoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php', + 'Composer\\Installers\\RoundcubeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php', + 'Composer\\Installers\\SMFInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SMFInstaller.php', + 'Composer\\Installers\\ShopwareInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php', + 'Composer\\Installers\\SilverStripeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php', + 'Composer\\Installers\\SiteDirectInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SiteDirectInstaller.php', + 'Composer\\Installers\\StarbugInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/StarbugInstaller.php', + 'Composer\\Installers\\SyDESInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SyDESInstaller.php', + 'Composer\\Installers\\SyliusInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SyliusInstaller.php', + 'Composer\\Installers\\Symfony1Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Symfony1Installer.php', + 'Composer\\Installers\\TYPO3CmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php', + 'Composer\\Installers\\TYPO3FlowInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php', + 'Composer\\Installers\\TaoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TaoInstaller.php', + 'Composer\\Installers\\TheliaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TheliaInstaller.php', + 'Composer\\Installers\\TuskInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TuskInstaller.php', + 'Composer\\Installers\\UserFrostingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php', + 'Composer\\Installers\\VanillaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VanillaInstaller.php', + 'Composer\\Installers\\VgmcpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php', + 'Composer\\Installers\\WHMCSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php', + 'Composer\\Installers\\WolfCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php', + 'Composer\\Installers\\WordPressInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WordPressInstaller.php', + 'Composer\\Installers\\YawikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/YawikInstaller.php', + 'Composer\\Installers\\ZendInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZendInstaller.php', + 'Composer\\Installers\\ZikulaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php', + 'Icepay_Api_Base' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Api_Basic' => $vendorDir . '/icepay/icepay/src/icepay_api_basic.php', + 'Icepay_Api_Logger' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Api_Pbm' => $vendorDir . '/icepay/icepay/src/icepay_api_pbm.php', + 'Icepay_Api_Webservice' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Basic_Paymentmethod_Interface_Abstract' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Basicmode' => $vendorDir . '/icepay/icepay/src/icepay_api_basic.php', + 'Icepay_Order' => $vendorDir . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Address' => $vendorDir . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Consumer' => $vendorDir . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Helper' => $vendorDir . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Product' => $vendorDir . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_VAT' => $vendorDir . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Parameter_Validation' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_PaymentObject' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_PaymentObject_Interface_Abstract' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Paymentmethod' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Paymentmethod_Creditcard' => $vendorDir . '/icepay/icepay/src/paymentmethods/creditcard.php', + 'Icepay_Paymentmethod_Ddebit' => $vendorDir . '/icepay/icepay/src/paymentmethods/ddebit.php', + 'Icepay_Paymentmethod_Directebank' => $vendorDir . '/icepay/icepay/src/paymentmethods/directebank.php', + 'Icepay_Paymentmethod_Giropay' => $vendorDir . '/icepay/icepay/src/paymentmethods/giropay.php', + 'Icepay_Paymentmethod_Ideal' => $vendorDir . '/icepay/icepay/src/paymentmethods/ideal.php', + 'Icepay_Paymentmethod_Mistercash' => $vendorDir . '/icepay/icepay/src/paymentmethods/mistercash.php', + 'Icepay_Paymentmethod_Paypal' => $vendorDir . '/icepay/icepay/src/paymentmethods/paypal.php', + 'Icepay_Paymentmethod_Paysafecard' => $vendorDir . '/icepay/icepay/src/paymentmethods/paysafecard.php', + 'Icepay_Paymentmethod_Phone' => $vendorDir . '/icepay/icepay/src/paymentmethods/phone.php', + 'Icepay_Paymentmethod_Sms' => $vendorDir . '/icepay/icepay/src/paymentmethods/sms.php', + 'Icepay_Paymentmethod_Wire' => $vendorDir . '/icepay/icepay/src/paymentmethods/wire.php', + 'Icepay_PbmObject_Interface_Abstract' => $vendorDir . '/icepay/icepay/src/icepay_api_pbm.php', + 'Icepay_Pbm_Object' => $vendorDir . '/icepay/icepay/src/icepay_api_pbm.php', + 'Icepay_Postback' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Project_Helper' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Result' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_StatusCode' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_TransactionObject' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_WebserviceTransaction_Interface_Abstract' => $vendorDir . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Webservice_AutoCapture' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Base' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Filtering' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Pay' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Paymentmethod' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Paymentmethods' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Refunds' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Reporting' => $vendorDir . '/icepay/icepay/src/icepay_api_webservice.php', + 'JsonSchema\\Constraints\\BaseConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php', + 'JsonSchema\\Constraints\\CollectionConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php', + 'JsonSchema\\Constraints\\Constraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php', + 'JsonSchema\\Constraints\\ConstraintInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php', + 'JsonSchema\\Constraints\\EnumConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php', + 'JsonSchema\\Constraints\\Factory' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php', + 'JsonSchema\\Constraints\\FormatConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php', + 'JsonSchema\\Constraints\\NumberConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php', + 'JsonSchema\\Constraints\\ObjectConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php', + 'JsonSchema\\Constraints\\SchemaConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php', + 'JsonSchema\\Constraints\\StringConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php', + 'JsonSchema\\Constraints\\TypeCheck\\LooseTypeCheck' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php', + 'JsonSchema\\Constraints\\TypeCheck\\StrictTypeCheck' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php', + 'JsonSchema\\Constraints\\TypeCheck\\TypeCheckInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php', + 'JsonSchema\\Constraints\\TypeConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php', + 'JsonSchema\\Constraints\\UndefinedConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php', + 'JsonSchema\\Entity\\JsonPointer' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php', + 'JsonSchema\\Exception\\ExceptionInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php', + 'JsonSchema\\Exception\\InvalidArgumentException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php', + 'JsonSchema\\Exception\\InvalidConfigException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidConfigException.php', + 'JsonSchema\\Exception\\InvalidSchemaException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaException.php', + 'JsonSchema\\Exception\\InvalidSchemaMediaTypeException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaMediaTypeException.php', + 'JsonSchema\\Exception\\InvalidSourceUriException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSourceUriException.php', + 'JsonSchema\\Exception\\JsonDecodingException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/JsonDecodingException.php', + 'JsonSchema\\Exception\\ResourceNotFoundException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/ResourceNotFoundException.php', + 'JsonSchema\\Exception\\RuntimeException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/RuntimeException.php', + 'JsonSchema\\Exception\\UnresolvableJsonPointerException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/UnresolvableJsonPointerException.php', + 'JsonSchema\\Exception\\UriResolverException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php', + 'JsonSchema\\Exception\\ValidationException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/ValidationException.php', + 'JsonSchema\\Iterator\\ObjectIterator' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Iterator/ObjectIterator.php', + 'JsonSchema\\Rfc3339' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php', + 'JsonSchema\\SchemaStorage' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorage.php', + 'JsonSchema\\SchemaStorageInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php', + 'JsonSchema\\UriResolverInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php', + 'JsonSchema\\UriRetrieverInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/UriRetrieverInterface.php', + 'JsonSchema\\Uri\\Retrievers\\AbstractRetriever' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php', + 'JsonSchema\\Uri\\Retrievers\\Curl' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php', + 'JsonSchema\\Uri\\Retrievers\\FileGetContents' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php', + 'JsonSchema\\Uri\\Retrievers\\PredefinedArray' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php', + 'JsonSchema\\Uri\\Retrievers\\UriRetrieverInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php', + 'JsonSchema\\Uri\\UriResolver' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php', + 'JsonSchema\\Uri\\UriRetriever' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php', + 'JsonSchema\\Validator' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Validator.php', + 'Pronamic\\WordPress\\DateTime\\DateTime' => $vendorDir . '/pronamic/wp-datetime/src/DateTime.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeImmutable' => $vendorDir . '/pronamic/wp-datetime/src/DateTimeImmutable.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeInterface' => $vendorDir . '/pronamic/wp-datetime/src/DateTimeInterface.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeTrait' => $vendorDir . '/pronamic/wp-datetime/src/DateTimeTrait.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeZone' => $vendorDir . '/pronamic/wp-datetime/src/DateTimeZone.php', + 'Pronamic\\WordPress\\GravityFormsNL\\Plugin' => $vendorDir . '/pronamic/wp-gravityforms-nl/src/Plugin.php', + 'Pronamic\\WordPress\\Money\\Calculator' => $vendorDir . '/pronamic/wp-money/src/Calculator.php', + 'Pronamic\\WordPress\\Money\\Calculator\\BcMathCalculator' => $vendorDir . '/pronamic/wp-money/src/Calculator/BcMathCalculator.php', + 'Pronamic\\WordPress\\Money\\Calculator\\PhpCalculator' => $vendorDir . '/pronamic/wp-money/src/Calculator/PhpCalculator.php', + 'Pronamic\\WordPress\\Money\\Currencies' => $vendorDir . '/pronamic/wp-money/src/Currencies.php', + 'Pronamic\\WordPress\\Money\\Currency' => $vendorDir . '/pronamic/wp-money/src/Currency.php', + 'Pronamic\\WordPress\\Money\\Money' => $vendorDir . '/pronamic/wp-money/src/Money.php', + 'Pronamic\\WordPress\\Money\\Parser' => $vendorDir . '/pronamic/wp-money/src/Parser.php', + 'Pronamic\\WordPress\\Money\\TaxedMoney' => $vendorDir . '/pronamic/wp-money/src/TaxedMoney.php', + 'Pronamic\\WordPress\\Pay\\AbstractDataStoreCPT' => $vendorDir . '/wp-pay/core/src/AbstractDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\AbstractGatewayIntegration' => $vendorDir . '/wp-pay/core/src/AbstractGatewayIntegration.php', + 'Pronamic\\WordPress\\Pay\\AbstractIntegration' => $vendorDir . '/wp-pay/core/src/AbstractIntegration.php', + 'Pronamic\\WordPress\\Pay\\AbstractPluginIntegration' => $vendorDir . '/wp-pay/core/src/AbstractPluginIntegration.php', + 'Pronamic\\WordPress\\Pay\\Address' => $vendorDir . '/wp-pay/core/src/Address.php', + 'Pronamic\\WordPress\\Pay\\AddressHelper' => $vendorDir . '/wp-pay/core/src/AddressHelper.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminAboutPage' => $vendorDir . '/wp-pay/core/src/Admin/AdminAboutPage.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminDashboard' => $vendorDir . '/wp-pay/core/src/Admin/AdminDashboard.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminGatewayPostType' => $vendorDir . '/wp-pay/core/src/Admin/AdminGatewayPostType.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminHealth' => $vendorDir . '/wp-pay/core/src/Admin/AdminHealth.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminModule' => $vendorDir . '/wp-pay/core/src/Admin/AdminModule.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminNotices' => $vendorDir . '/wp-pay/core/src/Admin/AdminNotices.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminPaymentBulkActions' => $vendorDir . '/wp-pay/core/src/Admin/AdminPaymentBulkActions.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminPaymentPostType' => $vendorDir . '/wp-pay/core/src/Admin/AdminPaymentPostType.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminReports' => $vendorDir . '/wp-pay/core/src/Admin/AdminReports.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminSettings' => $vendorDir . '/wp-pay/core/src/Admin/AdminSettings.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminSubscriptionPostType' => $vendorDir . '/wp-pay/core/src/Admin/AdminSubscriptionPostType.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminTour' => $vendorDir . '/wp-pay/core/src/Admin/AdminTour.php', + 'Pronamic\\WordPress\\Pay\\Admin\\Install' => $vendorDir . '/wp-pay/core/src/Admin/Install.php', + 'Pronamic\\WordPress\\Pay\\Banks\\BankAccountDetails' => $vendorDir . '/wp-pay/core/src/Banks/BankAccountDetails.php', + 'Pronamic\\WordPress\\Pay\\Banks\\BankTransferDetails' => $vendorDir . '/wp-pay/core/src/Banks/BankTransferDetails.php', + 'Pronamic\\WordPress\\Pay\\Blocks\\BlocksModule' => $vendorDir . '/wp-pay/core/src/Blocks/BlocksModule.php', + 'Pronamic\\WordPress\\Pay\\Cards' => $vendorDir . '/wp-pay/core/src/Cards.php', + 'Pronamic\\WordPress\\Pay\\ContactName' => $vendorDir . '/wp-pay/core/src/ContactName.php', + 'Pronamic\\WordPress\\Pay\\ContactNameHelper' => $vendorDir . '/wp-pay/core/src/ContactNameHelper.php', + 'Pronamic\\WordPress\\Pay\\Core\\Gateway' => $vendorDir . '/wp-pay/core/src/Core/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Core\\GatewayConfig' => $vendorDir . '/wp-pay/core/src/Core/GatewayConfig.php', + 'Pronamic\\WordPress\\Pay\\Core\\IdTrait' => $vendorDir . '/wp-pay/core/src/Core/IdTrait.php', + 'Pronamic\\WordPress\\Pay\\Core\\PaymentMethods' => $vendorDir . '/wp-pay/core/src/Core/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Core\\Recurring' => $vendorDir . '/wp-pay/core/src/Core/Recurring.php', + 'Pronamic\\WordPress\\Pay\\Core\\Server' => $vendorDir . '/wp-pay/core/src/Core/Server.php', + 'Pronamic\\WordPress\\Pay\\Core\\Statuses' => $vendorDir . '/wp-pay/core/src/Core/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Core\\TimestampsTrait' => $vendorDir . '/wp-pay/core/src/Core/TimestampsTrait.php', + 'Pronamic\\WordPress\\Pay\\Core\\Util' => $vendorDir . '/wp-pay/core/src/Core/Util.php', + 'Pronamic\\WordPress\\Pay\\Core\\VersionTrait' => $vendorDir . '/wp-pay/core/src/Core/VersionTrait.php', + 'Pronamic\\WordPress\\Pay\\Core\\XML\\Security' => $vendorDir . '/wp-pay/core/src/Core/XML/Security.php', + 'Pronamic\\WordPress\\Pay\\Core\\XML\\Util' => $vendorDir . '/wp-pay/core/src/Core/XML/Util.php', + 'Pronamic\\WordPress\\Pay\\Country' => $vendorDir . '/wp-pay/core/src/Country.php', + 'Pronamic\\WordPress\\Pay\\CreditCard' => $vendorDir . '/wp-pay/core/src/CreditCard.php', + 'Pronamic\\WordPress\\Pay\\Customer' => $vendorDir . '/wp-pay/core/src/Customer.php', + 'Pronamic\\WordPress\\Pay\\CustomerHelper' => $vendorDir . '/wp-pay/core/src/CustomerHelper.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\Dependencies' => $vendorDir . '/wp-pay/core/src/Dependencies/Dependencies.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\Dependency' => $vendorDir . '/wp-pay/core/src/Dependencies/Dependency.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\PhpDependency' => $vendorDir . '/wp-pay/core/src/Dependencies/PhpDependency.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\PhpExtensionDependency' => $vendorDir . '/wp-pay/core/src/Dependencies/PhpExtensionDependency.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\WordPressDependency' => $vendorDir . '/wp-pay/core/src/Dependencies/WordPressDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\BancontactGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\BankTransferGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\Charitable' => $vendorDir . '/wp-pay-extensions/charitable/src/Charitable.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\CharitableDependency' => $vendorDir . '/wp-pay-extensions/charitable/src/CharitableDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\CharitableHelper' => $vendorDir . '/wp-pay-extensions/charitable/src/CharitableHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\DirectDebitGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\Extension' => $vendorDir . '/wp-pay-extensions/charitable/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\Gateway' => $vendorDir . '/wp-pay-extensions/charitable/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\GuldenGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/GuldenGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\IDealGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\SofortGateway' => $vendorDir . '/wp-pay-extensions/charitable/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\ContactForm7Dependency' => $vendorDir . '/wp-pay-extensions/contact-form-7/src/ContactForm7Dependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Extension' => $vendorDir . '/wp-pay-extensions/contact-form-7/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Pronamic' => $vendorDir . '/wp-pay-extensions/contact-form-7/src/Pronamic.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Tags\\AmountTag' => $vendorDir . '/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Tags\\IssuerTag' => $vendorDir . '/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Tags\\PaymentMethodTag' => $vendorDir . '/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\EasyDigitalDownloads' => $vendorDir . '/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloads.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\EasyDigitalDownloadsDependency' => $vendorDir . '/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloadsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\Extension' => $vendorDir . '/wp-pay-extensions/easy-digital-downloads/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\Gateway' => $vendorDir . '/wp-pay-extensions/easy-digital-downloads/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\PurchaseDataHelper' => $vendorDir . '/wp-pay-extensions/easy-digital-downloads/src/PurchaseDataHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\EventEspresso' => $vendorDir . '/wp-pay-extensions/event-espresso-legacy/src/EventEspresso.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\EventEspressoDependency' => $vendorDir . '/wp-pay-extensions/event-espresso-legacy/src/EventEspressoDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\EventEspressoHelper' => $vendorDir . '/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\Extension' => $vendorDir . '/wp-pay-extensions/event-espresso-legacy/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\AddOn' => $vendorDir . '/wp-pay-extensions/event-espresso/src/AddOn.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\AlipayGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/AlipayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\AlipayPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/AlipayPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BancontactGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BancontactPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BancontactPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BankTransferGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BankTransferPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BankTransferPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BelfiusGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BelfiusGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BelfiusPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BelfiusPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BitcoinGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BitcoinGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BitcoinPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/BitcoinPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\CreditCardPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/CreditCardPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\DirectDebitGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\DirectDebitPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/DirectDebitPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\EventEspressoDependency' => $vendorDir . '/wp-pay-extensions/event-espresso/src/EventEspressoDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\EventEspressoHelper' => $vendorDir . '/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\Extension' => $vendorDir . '/wp-pay-extensions/event-espresso/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\Gateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\GiropayGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/GiropayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\GiropayPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/GiropayPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealQRGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/IDealQRGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealQRPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/IDealQRPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\KBCGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/KBCGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\KBCPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/KBCPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayPalGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayPalPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/PayPalPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayconiqGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/PayconiqGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayconiqPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/PayconiqPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/PaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PaymentStatuses' => $vendorDir . '/wp-pay-extensions/event-espresso/src/PaymentStatuses.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\SofortGateway' => $vendorDir . '/wp-pay-extensions/event-espresso/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\SofortPaymentMethod' => $vendorDir . '/wp-pay-extensions/event-espresso/src/SofortPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\BankSelectFieldType' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\Extension' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\FormidableForms' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/FormidableForms.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\FormidableFormsDependency' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/FormidableFormsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\FormidableFormsHelper' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/FormidableFormsHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\PaymentAction' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/PaymentAction.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\PaymentMethodSelectFieldType' => $vendorDir . '/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\BancontactGateway' => $vendorDir . '/wp-pay-extensions/give/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\BankTransferGateway' => $vendorDir . '/wp-pay-extensions/give/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/give/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\DirectDebitGateway' => $vendorDir . '/wp-pay-extensions/give/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\Extension' => $vendorDir . '/wp-pay-extensions/give/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\Gateway' => $vendorDir . '/wp-pay-extensions/give/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\GiveDependency' => $vendorDir . '/wp-pay-extensions/give/src/GiveDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\GiveHelper' => $vendorDir . '/wp-pay-extensions/give/src/GiveHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\GuldenGateway' => $vendorDir . '/wp-pay-extensions/give/src/GuldenGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\IDealGateway' => $vendorDir . '/wp-pay-extensions/give/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\SofortGateway' => $vendorDir . '/wp-pay-extensions/give/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Admin' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Admin.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\AdminPaymentFormPostType' => $vendorDir . '/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Entry' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Entry.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Extension' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\FeedsDB' => $vendorDir . '/wp-pay-extensions/gravityforms/src/FeedsDB.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Fields' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Fields.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\GravityForms' => $vendorDir . '/wp-pay-extensions/gravityforms/src/GravityForms.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\GravityFormsDependency' => $vendorDir . '/wp-pay-extensions/gravityforms/src/GravityFormsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\IssuersField' => $vendorDir . '/wp-pay-extensions/gravityforms/src/IssuersField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\LeadProperties' => $vendorDir . '/wp-pay-extensions/gravityforms/src/LeadProperties.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Links' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Links.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PayFeed' => $vendorDir . '/wp-pay-extensions/gravityforms/src/PayFeed.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentAddOn' => $vendorDir . '/wp-pay-extensions/gravityforms/src/PaymentAddOn.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentData' => $vendorDir . '/wp-pay-extensions/gravityforms/src/PaymentData.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentFormPostType' => $vendorDir . '/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentMethodsField' => $vendorDir . '/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentStatuses' => $vendorDir . '/wp-pay-extensions/gravityforms/src/PaymentStatuses.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Processor' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Processor.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Util' => $vendorDir . '/wp-pay-extensions/gravityforms/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Admin\\AdminSubscriptions' => $vendorDir . '/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Admin\\AdminTransactions' => $vendorDir . '/wp-pay-extensions/memberpress/src/Admin/AdminTransactions.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Extension' => $vendorDir . '/wp-pay-extensions/memberpress/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\ApplePayGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/ApplePayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\BancontactGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\BankTransferGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\BitcoinGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/BitcoinGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitBancontactGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitBancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitIDealGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitIDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitSofortGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitSofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\Gateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\IDealGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\PayPalGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\Przelewy24Gateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/Przelewy24Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\SofortGateway' => $vendorDir . '/wp-pay-extensions/memberpress/src/Gateways/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\MemberPress' => $vendorDir . '/wp-pay-extensions/memberpress/src/MemberPress.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\MemberPressDependency' => $vendorDir . '/wp-pay-extensions/memberpress/src/MemberPressDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Pronamic' => $vendorDir . '/wp-pay-extensions/memberpress/src/Pronamic.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\SubscriptionStatuses' => $vendorDir . '/wp-pay-extensions/memberpress/src/SubscriptionStatuses.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\Extension' => $vendorDir . '/wp-pay-extensions/ninjaforms/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\IssuersField' => $vendorDir . '/wp-pay-extensions/ninjaforms/src/IssuersField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\NinjaFormsDependency' => $vendorDir . '/wp-pay-extensions/ninjaforms/src/NinjaFormsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\NinjaFormsHelper' => $vendorDir . '/wp-pay-extensions/ninjaforms/src/NinjaFormsHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\PaymentGateway' => $vendorDir . '/wp-pay-extensions/ninjaforms/src/PaymentGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\PaymentMethodsField' => $vendorDir . '/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\BancontactGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\BankTransferGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\BitcoinGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/BitcoinGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitBancontactGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitBancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitIDealGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitIDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitSofortGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitSofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Extension' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Gateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\IDealGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\LengthUnit' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/LengthUnit.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\MembershipStatus' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/MembershipStatus.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\PayPalGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\PaymentStatus' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/PaymentStatus.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\RestrictContentProDependency' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/RestrictContentProDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\SofortGateway' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Upgrade216' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Util' => $vendorDir . '/wp-pay-extensions/restrict-content-pro/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Extension' => $vendorDir . '/wp-pay-extensions/s2member/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\S2Member' => $vendorDir . '/wp-pay-extensions/s2member/src/S2Member.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\S2MemberDependency' => $vendorDir . '/wp-pay-extensions/s2member/src/S2MemberDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Settings' => $vendorDir . '/wp-pay-extensions/s2member/src/Settings.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Shortcodes' => $vendorDir . '/wp-pay-extensions/s2member/src/Shortcodes.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Util' => $vendorDir . '/wp-pay-extensions/s2member/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Extension' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\AfterPayGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/AfterPayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\BancontactGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\BankTransferGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\FocumGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/FocumGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\Gateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\GiropayGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/GiropayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\IDealGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\MaestroGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/MaestroGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\PayPalGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\SofortGateway' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/Gateways/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\WPeCommerce' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/WPeCommerce.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\WPeCommerceDependency' => $vendorDir . '/wp-pay-extensions/wp-e-commerce/src/WPeCommerceDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\CreditCardGateway' => $vendorDir . '/wp-pay-extensions/woocommerce/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\DirectDebitBancontactGateway' => $vendorDir . '/wp-pay-extensions/woocommerce/src/DirectDebitBancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\DirectDebitIDealGateway' => $vendorDir . '/wp-pay-extensions/woocommerce/src/DirectDebitIDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\DirectDebitSofortGateway' => $vendorDir . '/wp-pay-extensions/woocommerce/src/DirectDebitSofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\Extension' => $vendorDir . '/wp-pay-extensions/woocommerce/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\Gateway' => $vendorDir . '/wp-pay-extensions/woocommerce/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\OrderItemType' => $vendorDir . '/wp-pay-extensions/woocommerce/src/OrderItemType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\WooCommerce' => $vendorDir . '/wp-pay-extensions/woocommerce/src/WooCommerce.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\WooCommerceDependency' => $vendorDir . '/wp-pay-extensions/woocommerce/src/WooCommerceDependency.php', + 'Pronamic\\WordPress\\Pay\\Facades\\Http' => $vendorDir . '/wp-pay/core/src/Facades/Http.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormPostType' => $vendorDir . '/wp-pay/core/src/Forms/FormPostType.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormProcessor' => $vendorDir . '/wp-pay/core/src/Forms/FormProcessor.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormScripts' => $vendorDir . '/wp-pay/core/src/Forms/FormScripts.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormShortcode' => $vendorDir . '/wp-pay/core/src/Forms/FormShortcode.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormsModule' => $vendorDir . '/wp-pay/core/src/Forms/FormsModule.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormsSource' => $vendorDir . '/wp-pay/core/src/Forms/FormsSource.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\Addon' => $vendorDir . '/wp-pay/fundraising/src/Addon.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\BlockUpdater' => $vendorDir . '/wp-pay/fundraising/src/BlockUpdater.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\Blocks' => $vendorDir . '/wp-pay/fundraising/src/Blocks.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\MakePotCommand' => $vendorDir . '/wp-pay/fundraising/src/i18n-make-pot.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\Util' => $vendorDir . '/wp-pay/fundraising/src/Util.php', + 'Pronamic\\WordPress\\Pay\\GatewayIntegrations' => $vendorDir . '/wp-pay/core/src/GatewayIntegrations.php', + 'Pronamic\\WordPress\\Pay\\GatewayPostType' => $vendorDir . '/wp-pay/core/src/GatewayPostType.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AbstractGateway' => $vendorDir . '/wp-pay-gateways/adyen/src/AbstractGateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AbstractPaymentRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/AbstractPaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ActionInformation' => $vendorDir . '/wp-pay-gateways/adyen/src/ActionInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Address' => $vendorDir . '/wp-pay-gateways/adyen/src/Address.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AddressTransformer' => $vendorDir . '/wp-pay-gateways/adyen/src/AddressTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Amount' => $vendorDir . '/wp-pay-gateways/adyen/src/Amount.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AmountTransformer' => $vendorDir . '/wp-pay-gateways/adyen/src/AmountTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ApplicationInfo' => $vendorDir . '/wp-pay-gateways/adyen/src/ApplicationInfo.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\BrowserInformation' => $vendorDir . '/wp-pay-gateways/adyen/src/BrowserInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Channel' => $vendorDir . '/wp-pay-gateways/adyen/src/Channel.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Client' => $vendorDir . '/wp-pay-gateways/adyen/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Config' => $vendorDir . '/wp-pay-gateways/adyen/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\DetailsInformation' => $vendorDir . '/wp-pay-gateways/adyen/src/DetailsInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\DropInGateway' => $vendorDir . '/wp-pay-gateways/adyen/src/DropInGateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Endpoint' => $vendorDir . '/wp-pay-gateways/adyen/src/Endpoint.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Error' => $vendorDir . '/wp-pay-gateways/adyen/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ErrorType' => $vendorDir . '/wp-pay-gateways/adyen/src/ErrorType.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\EventCode' => $vendorDir . '/wp-pay-gateways/adyen/src/EventCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Gender' => $vendorDir . '/wp-pay-gateways/adyen/src/Gender.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\GenderTransformer' => $vendorDir . '/wp-pay-gateways/adyen/src/GenderTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Integration' => $vendorDir . '/wp-pay-gateways/adyen/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\LineItem' => $vendorDir . '/wp-pay-gateways/adyen/src/LineItem.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\LineItems' => $vendorDir . '/wp-pay-gateways/adyen/src/LineItems.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Name' => $vendorDir . '/wp-pay-gateways/adyen/src/Name.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\NotificationRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/NotificationRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\NotificationRequestItem' => $vendorDir . '/wp-pay-gateways/adyen/src/NotificationRequestItem.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\NotificationsController' => $vendorDir . '/wp-pay-gateways/adyen/src/NotificationsController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentDetailsRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentDetailsRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethod' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethodType' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentMethodType.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethodsRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentMethodsRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethodsResponse' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentMethodsResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentRequestHelper' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentRequestHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResponse' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResponseHelper' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentResponseHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResultHelper' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentResultHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResultRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentResultRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResultResponse' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentResultResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentSessionRequest' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentSessionRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentSessionResponse' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentSessionResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentsController' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentsController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentsResultController' => $vendorDir . '/wp-pay-gateways/adyen/src/PaymentsResultController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\RedirectInformation' => $vendorDir . '/wp-pay-gateways/adyen/src/RedirectInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Request' => $vendorDir . '/wp-pay-gateways/adyen/src/Request.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ResponseObject' => $vendorDir . '/wp-pay-gateways/adyen/src/ResponseObject.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ResultCode' => $vendorDir . '/wp-pay-gateways/adyen/src/ResultCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Security' => $vendorDir . '/wp-pay-gateways/adyen/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ServiceException' => $vendorDir . '/wp-pay-gateways/adyen/src/ServiceException.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\SiteHealthController' => $vendorDir . '/wp-pay-gateways/adyen/src/SiteHealthController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\TaxCategory' => $vendorDir . '/wp-pay-gateways/adyen/src/TaxCategory.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Util' => $vendorDir . '/wp-pay-gateways/adyen/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\WebSdkGateway' => $vendorDir . '/wp-pay-gateways/adyen/src/WebSdkGateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Client' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Config' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Gateway' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Integration' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Listener' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Parameters' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Parameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\PaymentMethods' => $vendorDir . '/wp-pay-gateways/buckaroo/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Security' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Statuses' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Util' => $vendorDir . '/wp-pay-gateways/buckaroo/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Client' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Config' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Gateway' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Integration' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Listener' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\PaymentMethods' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Statuses' => $vendorDir . '/wp-pay-gateways/ems-e-commerce/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Client' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Config' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Country' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Country.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Directory' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Directory.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Error' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Gateway' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\IDeal' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/IDeal.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Integration' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Issuer' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Issuer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Merchant' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Merchant.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Security' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Status' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Status.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Transaction' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\AcquirerErrorResMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerErrorResMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\AcquirerStatusReqMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusReqMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\AcquirerStatusResMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusResMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\CountryParser' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/CountryParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\DirectoryParser' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\DirectoryRequestMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\DirectoryResponseMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\ErrorParser' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/ErrorParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\IssuerParser' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/IssuerParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\Message' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/Message.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\Parser' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/Parser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\RequestMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/RequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\ResponseMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/ResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\TransactionParser' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\TransactionRequestMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\TransactionResponseMessage' => $vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Client' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Config' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\DataHelper' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Gateway' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Integration' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Item' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Item.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Items' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Items.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Listener' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Notification' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Notification.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Util' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\XML\\NotificationParser' => $vendorDir . '/wp-pay-gateways/ideal-basic/src/XML/NotificationParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\AbstractIntegration' => $vendorDir . '/wp-pay-gateways/ideal/src/AbstractIntegration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\Statuses' => $vendorDir . '/wp-pay-gateways/ideal/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Client' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Config' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Gateway' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Integration' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Listener' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\OrderRequest' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/OrderRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\PaymentMethods' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Statuses' => $vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Config' => $vendorDir . '/wp-pay-gateways/icepay/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\DirectebankIssuers' => $vendorDir . '/wp-pay-gateways/icepay/src/DirectebankIssuers.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Gateway' => $vendorDir . '/wp-pay-gateways/icepay/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Integration' => $vendorDir . '/wp-pay-gateways/icepay/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Listener' => $vendorDir . '/wp-pay-gateways/icepay/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\AbstractIntegration' => $vendorDir . '/wp-pay-gateways/ogone/src/AbstractIntegration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Brands' => $vendorDir . '/wp-pay-gateways/ogone/src/Brands.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Config' => $vendorDir . '/wp-pay-gateways/ogone/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Data' => $vendorDir . '/wp-pay-gateways/ogone/src/Data.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataCreditCardHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/DataCreditCardHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataCustomerHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/DataCustomerHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataGeneralHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/DataGeneralHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataUrlHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/DataUrlHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Client' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Config' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\DataHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Gateway' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Integration' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\OrderResponse' => $vendorDir . '/wp-pay-gateways/ogone/src/DirectLink/OrderResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Error' => $vendorDir . '/wp-pay-gateways/ogone/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Ingenico' => $vendorDir . '/wp-pay-gateways/ogone/src/Ingenico.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Listener' => $vendorDir . '/wp-pay-gateways/ogone/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Client' => $vendorDir . '/wp-pay-gateways/ogone/src/OrderStandard/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Config' => $vendorDir . '/wp-pay-gateways/ogone/src/OrderStandard/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Gateway' => $vendorDir . '/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Integration' => $vendorDir . '/wp-pay-gateways/ogone/src/OrderStandard/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\TestConfig' => $vendorDir . '/wp-pay-gateways/ogone/src/OrderStandard/TestConfig.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Parameters' => $vendorDir . '/wp-pay-gateways/ogone/src/Parameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\PaymentMethods' => $vendorDir . '/wp-pay-gateways/ogone/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\PaymentMethodsList' => $vendorDir . '/wp-pay-gateways/ogone/src/PaymentMethodsList.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\SecureDataHelper' => $vendorDir . '/wp-pay-gateways/ogone/src/SecureDataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Security' => $vendorDir . '/wp-pay-gateways/ogone/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Settings' => $vendorDir . '/wp-pay-gateways/ogone/src/Settings.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Statuses' => $vendorDir . '/wp-pay-gateways/ogone/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Util' => $vendorDir . '/wp-pay-gateways/ogone/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\XML\\OrderResponseParser' => $vendorDir . '/wp-pay-gateways/ogone/src/XML/OrderResponseParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Admin' => $vendorDir . '/wp-pay-gateways/mollie/src/Admin.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Amount' => $vendorDir . '/wp-pay-gateways/mollie/src/Amount.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\AmountTransformer' => $vendorDir . '/wp-pay-gateways/mollie/src/AmountTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\BaseResource' => $vendorDir . '/wp-pay-gateways/mollie/src/BaseResource.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\CLI' => $vendorDir . '/wp-pay-gateways/mollie/src/CLI.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Chargeback' => $vendorDir . '/wp-pay-gateways/mollie/src/Chargeback.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Client' => $vendorDir . '/wp-pay-gateways/mollie/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Config' => $vendorDir . '/wp-pay-gateways/mollie/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Customer' => $vendorDir . '/wp-pay-gateways/mollie/src/Customer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\CustomerDataStore' => $vendorDir . '/wp-pay-gateways/mollie/src/CustomerDataStore.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\CustomerQuery' => $vendorDir . '/wp-pay-gateways/mollie/src/CustomerQuery.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Error' => $vendorDir . '/wp-pay-gateways/mollie/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Gateway' => $vendorDir . '/wp-pay-gateways/mollie/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Install' => $vendorDir . '/wp-pay-gateways/mollie/src/Install.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Integration' => $vendorDir . '/wp-pay-gateways/mollie/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\LocaleHelper' => $vendorDir . '/wp-pay-gateways/mollie/src/LocaleHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Locales' => $vendorDir . '/wp-pay-gateways/mollie/src/Locales.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Methods' => $vendorDir . '/wp-pay-gateways/mollie/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Payment' => $vendorDir . '/wp-pay-gateways/mollie/src/Payment.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\PaymentDetails' => $vendorDir . '/wp-pay-gateways/mollie/src/PaymentDetails.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\PaymentRequest' => $vendorDir . '/wp-pay-gateways/mollie/src/PaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Profile' => $vendorDir . '/wp-pay-gateways/mollie/src/Profile.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\ProfileDataStore' => $vendorDir . '/wp-pay-gateways/mollie/src/ProfileDataStore.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Sequence' => $vendorDir . '/wp-pay-gateways/mollie/src/Sequence.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Statuses' => $vendorDir . '/wp-pay-gateways/mollie/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\WebhookController' => $vendorDir . '/wp-pay-gateways/mollie/src/WebhookController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Client' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Config' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Customer' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Customer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Gateway' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\GatewayInfo' => $vendorDir . '/wp-pay-gateways/multisafepay/src/GatewayInfo.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Integration' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Merchant' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Merchant.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Methods' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\MultiSafepay' => $vendorDir . '/wp-pay-gateways/multisafepay/src/MultiSafepay.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Signature' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Signature.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Statuses' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Transaction' => $vendorDir . '/wp-pay-gateways/multisafepay/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\WooCommerce' => $vendorDir . '/wp-pay-gateways/multisafepay/src/WooCommerce.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\DirectTransactionRequestMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/DirectTransactionRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\DirectTransactionResponseMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/DirectTransactionResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\GatewaysRequestMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/GatewaysRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\GatewaysResponseMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/GatewaysResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\IDealIssuersRequestMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/IDealIssuersRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\IDealIssuersResponseMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/IDealIssuersResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\Message' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/Message.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\RedirectTransactionRequestMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\RedirectTransactionResponseMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\RequestMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/RequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\ResponseMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/ResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\StatusRequestMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/StatusRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\StatusResponseMessage' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/StatusResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\TransactionParser' => $vendorDir . '/wp-pay-gateways/multisafepay/src/XML/TransactionParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Address' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Address.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\AddressTransformer' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/AddressTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Client' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Config' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\CustomerInformation' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/CustomerInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\DataHelper' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Error' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Gateway' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Gender' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Gender.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Integration' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Message' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Message.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Money' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Money.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\MoneyTransformer' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/MoneyTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Notification' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Notification.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Order' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Order.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderAnnounceResponse' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/OrderAnnounceResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderItem' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/OrderItem.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderItems' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/OrderItems.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderResult' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/OrderResult.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderResults' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/OrderResults.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\PaymentBrandForce' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/PaymentBrandForce.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\PaymentBrands' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/PaymentBrands.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\ProductCategories' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/ProductCategories.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\ResponseMessage' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/ResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\ReturnParameters' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/ReturnParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Security' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Signable' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Signable.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Statuses' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\VatCategories' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/VatCategories.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\WebhookController' => $vendorDir . '/wp-pay-gateways/omnikassa-2/src/WebhookController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Client' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Config' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Error' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Gateway' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Integration' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Methods' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\OutputOptions' => $vendorDir . '/wp-pay-gateways/pay-nl/src/OutputOptions.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\ProductTypes' => $vendorDir . '/wp-pay-gateways/pay-nl/src/ProductTypes.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Statuses' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Util' => $vendorDir . '/wp-pay-gateways/pay-nl/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\BankDetails' => $vendorDir . '/wp-pay-gateways/payvision/src/BankDetails.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\BrandId' => $vendorDir . '/wp-pay-gateways/payvision/src/BrandId.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Client' => $vendorDir . '/wp-pay-gateways/payvision/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Config' => $vendorDir . '/wp-pay-gateways/payvision/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Error' => $vendorDir . '/wp-pay-gateways/payvision/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Gateway' => $vendorDir . '/wp-pay-gateways/payvision/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Integration' => $vendorDir . '/wp-pay-gateways/payvision/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\IssuerIdIDeal' => $vendorDir . '/wp-pay-gateways/payvision/src/IssuerIdIDeal.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\PaymentRequest' => $vendorDir . '/wp-pay-gateways/payvision/src/PaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\PaymentResponse' => $vendorDir . '/wp-pay-gateways/payvision/src/PaymentResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\RedirectDetails' => $vendorDir . '/wp-pay-gateways/payvision/src/RedirectDetails.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\RequestHeader' => $vendorDir . '/wp-pay-gateways/payvision/src/RequestHeader.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\ResponseHeader' => $vendorDir . '/wp-pay-gateways/payvision/src/ResponseHeader.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\ResultCode' => $vendorDir . '/wp-pay-gateways/payvision/src/ResultCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\SystemAddress' => $vendorDir . '/wp-pay-gateways/payvision/src/SystemAddress.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\TrackingCode' => $vendorDir . '/wp-pay-gateways/payvision/src/TrackingCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Transaction' => $vendorDir . '/wp-pay-gateways/payvision/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\TransactionResponse' => $vendorDir . '/wp-pay-gateways/payvision/src/TransactionResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\CancelReservationRequest' => $vendorDir . '/wp-pay-gateways/sisow/src/CancelReservationRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Client' => $vendorDir . '/wp-pay-gateways/sisow/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Config' => $vendorDir . '/wp-pay-gateways/sisow/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Error' => $vendorDir . '/wp-pay-gateways/sisow/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Gateway' => $vendorDir . '/wp-pay-gateways/sisow/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Integration' => $vendorDir . '/wp-pay-gateways/sisow/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Invoice' => $vendorDir . '/wp-pay-gateways/sisow/src/Invoice.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\InvoiceRequest' => $vendorDir . '/wp-pay-gateways/sisow/src/InvoiceRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Merchant' => $vendorDir . '/wp-pay-gateways/sisow/src/Merchant.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\MerchantRequest' => $vendorDir . '/wp-pay-gateways/sisow/src/MerchantRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Methods' => $vendorDir . '/wp-pay-gateways/sisow/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\NotifyRequest' => $vendorDir . '/wp-pay-gateways/sisow/src/NotifyRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Request' => $vendorDir . '/wp-pay-gateways/sisow/src/Request.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\RequestMethods' => $vendorDir . '/wp-pay-gateways/sisow/src/RequestMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Reservation' => $vendorDir . '/wp-pay-gateways/sisow/src/Reservation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\StatusRequest' => $vendorDir . '/wp-pay-gateways/sisow/src/StatusRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Statuses' => $vendorDir . '/wp-pay-gateways/sisow/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Transaction' => $vendorDir . '/wp-pay-gateways/sisow/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\TransactionRequest' => $vendorDir . '/wp-pay-gateways/sisow/src/TransactionRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Util' => $vendorDir . '/wp-pay-gateways/sisow/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\ErrorParser' => $vendorDir . '/wp-pay-gateways/sisow/src/XML/ErrorParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\InvoiceParser' => $vendorDir . '/wp-pay-gateways/sisow/src/XML/InvoiceParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\MerchantParser' => $vendorDir . '/wp-pay-gateways/sisow/src/XML/MerchantParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\Parser' => $vendorDir . '/wp-pay-gateways/sisow/src/XML/Parser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\ReservationParser' => $vendorDir . '/wp-pay-gateways/sisow/src/XML/ReservationParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\TransactionParser' => $vendorDir . '/wp-pay-gateways/sisow/src/XML/TransactionParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Client' => $vendorDir . '/wp-pay-gateways/targetpay/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Config' => $vendorDir . '/wp-pay-gateways/targetpay/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Error' => $vendorDir . '/wp-pay-gateways/targetpay/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Gateway' => $vendorDir . '/wp-pay-gateways/targetpay/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\IDealStartParameters' => $vendorDir . '/wp-pay-gateways/targetpay/src/IDealStartParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Integration' => $vendorDir . '/wp-pay-gateways/targetpay/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\SofortClient' => $vendorDir . '/wp-pay-gateways/targetpay/src/SofortClient.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\SofortStartParameters' => $vendorDir . '/wp-pay-gateways/targetpay/src/SofortStartParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\StartParameters' => $vendorDir . '/wp-pay-gateways/targetpay/src/StartParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Status' => $vendorDir . '/wp-pay-gateways/targetpay/src/Status.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\StatusStringParser' => $vendorDir . '/wp-pay-gateways/targetpay/src/StatusStringParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Statuses' => $vendorDir . '/wp-pay-gateways/targetpay/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gender' => $vendorDir . '/wp-pay/core/src/Gender.php', + 'Pronamic\\WordPress\\Pay\\GoogleAnalyticsEcommerce' => $vendorDir . '/wp-pay/core/src/GoogleAnalyticsEcommerce.php', + 'Pronamic\\WordPress\\Pay\\HouseNumber' => $vendorDir . '/wp-pay/core/src/HouseNumber.php', + 'Pronamic\\WordPress\\Pay\\Http\\Response' => $vendorDir . '/wp-pay/core/src/Http/Response.php', + 'Pronamic\\WordPress\\Pay\\LicenseManager' => $vendorDir . '/wp-pay/core/src/LicenseManager.php', + 'Pronamic\\WordPress\\Pay\\MoneyJsonTransformer' => $vendorDir . '/wp-pay/core/src/MoneyJsonTransformer.php', + 'Pronamic\\WordPress\\Pay\\Payments\\FailureReason' => $vendorDir . '/wp-pay/core/src/Payments/FailureReason.php', + 'Pronamic\\WordPress\\Pay\\Payments\\Item' => $vendorDir . '/wp-pay/core/src/Payments/Item.php', + 'Pronamic\\WordPress\\Pay\\Payments\\Items' => $vendorDir . '/wp-pay/core/src/Payments/Items.php', + 'Pronamic\\WordPress\\Pay\\Payments\\LegacyPayment' => $vendorDir . '/wp-pay/core/src/Payments/LegacyPayment.php', + 'Pronamic\\WordPress\\Pay\\Payments\\LegacyPaymentInfo' => $vendorDir . '/wp-pay/core/src/Payments/LegacyPaymentInfo.php', + 'Pronamic\\WordPress\\Pay\\Payments\\LegacyPaymentsDataStoreCPT' => $vendorDir . '/wp-pay/core/src/Payments/LegacyPaymentsDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\Payments\\Payment' => $vendorDir . '/wp-pay/core/src/Payments/Payment.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentInfo' => $vendorDir . '/wp-pay/core/src/Payments/PaymentInfo.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentInfoHelper' => $vendorDir . '/wp-pay/core/src/Payments/PaymentInfoHelper.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentInfoTrait' => $vendorDir . '/wp-pay/core/src/Payments/PaymentInfoTrait.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentLine' => $vendorDir . '/wp-pay/core/src/Payments/PaymentLine.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentLineType' => $vendorDir . '/wp-pay/core/src/Payments/PaymentLineType.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentLines' => $vendorDir . '/wp-pay/core/src/Payments/PaymentLines.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentPostType' => $vendorDir . '/wp-pay/core/src/Payments/PaymentPostType.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentStatus' => $vendorDir . '/wp-pay/core/src/Payments/PaymentStatus.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentsDataStoreCPT' => $vendorDir . '/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentsModule' => $vendorDir . '/wp-pay/core/src/Payments/PaymentsModule.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentsPrivacy' => $vendorDir . '/wp-pay/core/src/Payments/PaymentsPrivacy.php', + 'Pronamic\\WordPress\\Pay\\Payments\\SourceTrait' => $vendorDir . '/wp-pay/core/src/Payments/SourceTrait.php', + 'Pronamic\\WordPress\\Pay\\Payments\\StatusChecker' => $vendorDir . '/wp-pay/core/src/Payments/StatusChecker.php', + 'Pronamic\\WordPress\\Pay\\Plugin' => $vendorDir . '/wp-pay/core/src/Plugin.php', + 'Pronamic\\WordPress\\Pay\\PrivacyManager' => $vendorDir . '/wp-pay/core/src/PrivacyManager.php', + 'Pronamic\\WordPress\\Pay\\Privacy\\AnonymizedTrait' => $vendorDir . '/wp-pay/core/src/Privacy/AnonymizedTrait.php', + 'Pronamic\\WordPress\\Pay\\Region' => $vendorDir . '/wp-pay/core/src/Region.php', + 'Pronamic\\WordPress\\Pay\\Settings' => $vendorDir . '/wp-pay/core/src/Settings.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\AlignmentRule' => $vendorDir . '/wp-pay/core/src/Subscriptions/AlignmentRule.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\Subscription' => $vendorDir . '/wp-pay/core/src/Subscriptions/Subscription.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionHelper' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionHelper.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionInterval' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionInterval.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPeriod' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPhase' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionPhase.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPhasesTrait' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionPhasesTrait.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPostType' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionPostType.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionStatus' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionStatus.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionsDataStoreCPT' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionsModule' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionsModule.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionsPrivacy' => $vendorDir . '/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php', + 'Pronamic\\WordPress\\Pay\\TaxedMoneyJsonTransformer' => $vendorDir . '/wp-pay/core/src/TaxedMoneyJsonTransformer.php', + 'Pronamic\\WordPress\\Pay\\TrackingModule' => $vendorDir . '/wp-pay/core/src/TrackingModule.php', + 'Pronamic\\WordPress\\Pay\\Upgrades\\Upgrade' => $vendorDir . '/wp-pay/core/src/Upgrades/Upgrade.php', + 'Pronamic\\WordPress\\Pay\\Upgrades\\Upgrade620' => $vendorDir . '/wp-pay/core/src/Upgrades/Upgrade620.php', + 'Pronamic\\WordPress\\Pay\\Upgrades\\Upgrades' => $vendorDir . '/wp-pay/core/src/Upgrades/Upgrades.php', + 'Pronamic\\WordPress\\Pay\\Util' => $vendorDir . '/wp-pay/core/src/Util.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumber' => $vendorDir . '/wp-pay/core/src/VatNumbers/VatNumber.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumberValidationService' => $vendorDir . '/wp-pay/core/src/VatNumbers/VatNumberValidationService.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumberValidity' => $vendorDir . '/wp-pay/core/src/VatNumbers/VatNumberValidity.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumberViesValidator' => $vendorDir . '/wp-pay/core/src/VatNumbers/VatNumberViesValidator.php', + 'Pronamic\\WordPress\\Pay\\VatRates' => $vendorDir . '/wp-pay/core/src/VatRates.php', + 'Pronamic\\WordPress\\Pay\\Webhooks\\WebhookLogger' => $vendorDir . '/wp-pay/core/src/Webhooks/WebhookLogger.php', + 'Pronamic\\WordPress\\Pay\\Webhooks\\WebhookManager' => $vendorDir . '/wp-pay/core/src/Webhooks/WebhookManager.php', + 'Pronamic\\WordPress\\Pay\\Webhooks\\WebhookRequestInfo' => $vendorDir . '/wp-pay/core/src/Webhooks/WebhookRequestInfo.php', + 'VIISON\\AddressSplitter\\AddressSplitter' => $vendorDir . '/viison/address-splitter/src/AddressSplitter.php', + 'VIISON\\AddressSplitter\\Exceptions\\SplittingException' => $vendorDir . '/viison/address-splitter/src/Exceptions/SplittingException.php', +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_files.php b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_files.php new file mode 100644 index 00000000..294ecd58 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_files.php @@ -0,0 +1,11 @@ + $vendorDir . '/wp-pay/core/includes/functions.php', + 'd868cbb0c7c5bea8d17ade7c881e4000' => $vendorDir . '/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.php', +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_namespaces.php b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_namespaces.php new file mode 100644 index 00000000..b7fc0125 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/viison/address-splitter/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\' => array($vendorDir . '/wp-pay-gateways/targetpay/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\' => array($vendorDir . '/wp-pay-gateways/sisow/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\' => array($vendorDir . '/wp-pay-gateways/payvision/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\' => array($vendorDir . '/wp-pay-gateways/pay-nl/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\' => array($vendorDir . '/wp-pay-gateways/omnikassa-2/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\' => array($vendorDir . '/wp-pay-gateways/multisafepay/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\' => array($vendorDir . '/wp-pay-gateways/mollie/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\' => array($vendorDir . '/wp-pay-gateways/ogone/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\' => array($vendorDir . '/wp-pay-gateways/icepay/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\' => array($vendorDir . '/wp-pay-gateways/ing-kassa-compleet/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\' => array($vendorDir . '/wp-pay-gateways/ideal/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\' => array($vendorDir . '/wp-pay-gateways/ideal-basic/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\' => array($vendorDir . '/wp-pay-gateways/ideal-advanced-v3/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\' => array($vendorDir . '/wp-pay-gateways/ems-e-commerce/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\' => array($vendorDir . '/wp-pay-gateways/buckaroo/src'), + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\' => array($vendorDir . '/wp-pay-gateways/adyen/src'), + 'Pronamic\\WordPress\\Pay\\Fundraising\\' => array($vendorDir . '/wp-pay/fundraising/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\' => array($vendorDir . '/wp-pay-extensions/woocommerce/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\' => array($vendorDir . '/wp-pay-extensions/wp-e-commerce/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\' => array($vendorDir . '/wp-pay-extensions/s2member/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\' => array($vendorDir . '/wp-pay-extensions/restrict-content-pro/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\' => array($vendorDir . '/wp-pay-extensions/ninjaforms/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\' => array($vendorDir . '/wp-pay-extensions/memberpress/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\' => array($vendorDir . '/wp-pay-extensions/gravityforms/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\' => array($vendorDir . '/wp-pay-extensions/give/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\' => array($vendorDir . '/wp-pay-extensions/formidable-forms/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\' => array($vendorDir . '/wp-pay-extensions/event-espresso/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\' => array($vendorDir . '/wp-pay-extensions/event-espresso-legacy/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\' => array($vendorDir . '/wp-pay-extensions/easy-digital-downloads/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\' => array($vendorDir . '/wp-pay-extensions/contact-form-7/src'), + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\' => array($vendorDir . '/wp-pay-extensions/charitable/src'), + 'Pronamic\\WordPress\\Pay\\' => array($vendorDir . '/wp-pay/core/src'), + 'Pronamic\\WordPress\\Money\\' => array($vendorDir . '/pronamic/wp-money/src'), + 'Pronamic\\WordPress\\GravityFormsNL\\' => array($vendorDir . '/pronamic/wp-gravityforms-nl/src'), + 'Pronamic\\WordPress\\DateTime\\' => array($vendorDir . '/pronamic/wp-datetime/src'), + 'JsonSchema\\' => array($vendorDir . '/justinrainbow/json-schema/src/JsonSchema'), + 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'), +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_real.php b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_real.php new file mode 100644 index 00000000..73266efe --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_real.php @@ -0,0 +1,73 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit2ffcb5ea3934c50c6bbe0730ce541b37::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit2ffcb5ea3934c50c6bbe0730ce541b37::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire2ffcb5ea3934c50c6bbe0730ce541b37($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequire2ffcb5ea3934c50c6bbe0730ce541b37($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_static.php b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_static.php new file mode 100644 index 00000000..e27094a5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/autoload_static.php @@ -0,0 +1,1033 @@ + __DIR__ . '/..' . '/wp-pay/core/includes/functions.php', + 'd868cbb0c7c5bea8d17ade7c881e4000' => __DIR__ . '/..' . '/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'V' => + array ( + 'VIISON\\AddressSplitter\\' => 23, + ), + 'P' => + array ( + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\' => 42, + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\' => 38, + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\' => 42, + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\' => 38, + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\' => 43, + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\' => 45, + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\' => 39, + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\' => 41, + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\' => 39, + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\' => 50, + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\' => 38, + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\' => 43, + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\' => 48, + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\' => 46, + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\' => 41, + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\' => 38, + 'Pronamic\\WordPress\\Pay\\Fundraising\\' => 35, + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\' => 46, + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\' => 46, + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\' => 43, + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\' => 53, + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\' => 45, + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\' => 46, + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\' => 47, + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\' => 39, + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\' => 50, + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\' => 48, + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\' => 54, + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\' => 55, + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\' => 47, + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\' => 45, + 'Pronamic\\WordPress\\Pay\\' => 23, + 'Pronamic\\WordPress\\Money\\' => 25, + 'Pronamic\\WordPress\\GravityFormsNL\\' => 34, + 'Pronamic\\WordPress\\DateTime\\' => 28, + ), + 'J' => + array ( + 'JsonSchema\\' => 11, + ), + 'C' => + array ( + 'Composer\\Installers\\' => 20, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'VIISON\\AddressSplitter\\' => + array ( + 0 => __DIR__ . '/..' . '/viison/address-splitter/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/icepay/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/ideal/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src', + ), + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src', + ), + 'Pronamic\\WordPress\\Pay\\Fundraising\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay/fundraising/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/give/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso-legacy/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/easy-digital-downloads/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src', + ), + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src', + ), + 'Pronamic\\WordPress\\Pay\\' => + array ( + 0 => __DIR__ . '/..' . '/wp-pay/core/src', + ), + 'Pronamic\\WordPress\\Money\\' => + array ( + 0 => __DIR__ . '/..' . '/pronamic/wp-money/src', + ), + 'Pronamic\\WordPress\\GravityFormsNL\\' => + array ( + 0 => __DIR__ . '/..' . '/pronamic/wp-gravityforms-nl/src', + ), + 'Pronamic\\WordPress\\DateTime\\' => + array ( + 0 => __DIR__ . '/..' . '/pronamic/wp-datetime/src', + ), + 'JsonSchema\\' => + array ( + 0 => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema', + ), + 'Composer\\Installers\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', + ), + ); + + public static $classMap = array ( + 'Composer\\Installers\\AglInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AglInstaller.php', + 'Composer\\Installers\\AimeosInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AimeosInstaller.php', + 'Composer\\Installers\\AnnotateCmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php', + 'Composer\\Installers\\AsgardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AsgardInstaller.php', + 'Composer\\Installers\\AttogramInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AttogramInstaller.php', + 'Composer\\Installers\\BaseInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BaseInstaller.php', + 'Composer\\Installers\\BitrixInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BitrixInstaller.php', + 'Composer\\Installers\\BonefishInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BonefishInstaller.php', + 'Composer\\Installers\\CakePHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php', + 'Composer\\Installers\\ChefInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ChefInstaller.php', + 'Composer\\Installers\\CiviCrmInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CiviCrmInstaller.php', + 'Composer\\Installers\\ClanCatsFrameworkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php', + 'Composer\\Installers\\CockpitInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CockpitInstaller.php', + 'Composer\\Installers\\CodeIgniterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php', + 'Composer\\Installers\\Concrete5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Concrete5Installer.php', + 'Composer\\Installers\\CraftInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CraftInstaller.php', + 'Composer\\Installers\\CroogoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CroogoInstaller.php', + 'Composer\\Installers\\DecibelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DecibelInstaller.php', + 'Composer\\Installers\\DframeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DframeInstaller.php', + 'Composer\\Installers\\DokuWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php', + 'Composer\\Installers\\DolibarrInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php', + 'Composer\\Installers\\DrupalInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DrupalInstaller.php', + 'Composer\\Installers\\ElggInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ElggInstaller.php', + 'Composer\\Installers\\EliasisInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EliasisInstaller.php', + 'Composer\\Installers\\ExpressionEngineInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php', + 'Composer\\Installers\\EzPlatformInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php', + 'Composer\\Installers\\FuelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelInstaller.php', + 'Composer\\Installers\\FuelphpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php', + 'Composer\\Installers\\GravInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/GravInstaller.php', + 'Composer\\Installers\\HuradInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/HuradInstaller.php', + 'Composer\\Installers\\ImageCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php', + 'Composer\\Installers\\Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Installer.php', + 'Composer\\Installers\\ItopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ItopInstaller.php', + 'Composer\\Installers\\JoomlaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/JoomlaInstaller.php', + 'Composer\\Installers\\KanboardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KanboardInstaller.php', + 'Composer\\Installers\\KirbyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KirbyInstaller.php', + 'Composer\\Installers\\KnownInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KnownInstaller.php', + 'Composer\\Installers\\KodiCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php', + 'Composer\\Installers\\KohanaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KohanaInstaller.php', + 'Composer\\Installers\\LanManagementSystemInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php', + 'Composer\\Installers\\LaravelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LaravelInstaller.php', + 'Composer\\Installers\\LavaLiteInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php', + 'Composer\\Installers\\LithiumInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LithiumInstaller.php', + 'Composer\\Installers\\MODULEWorkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php', + 'Composer\\Installers\\MODXEvoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php', + 'Composer\\Installers\\MagentoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MagentoInstaller.php', + 'Composer\\Installers\\MajimaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MajimaInstaller.php', + 'Composer\\Installers\\MakoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MakoInstaller.php', + 'Composer\\Installers\\MantisBTInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MantisBTInstaller.php', + 'Composer\\Installers\\MauticInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MauticInstaller.php', + 'Composer\\Installers\\MayaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MayaInstaller.php', + 'Composer\\Installers\\MediaWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php', + 'Composer\\Installers\\MicroweberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php', + 'Composer\\Installers\\ModxInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ModxInstaller.php', + 'Composer\\Installers\\MoodleInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MoodleInstaller.php', + 'Composer\\Installers\\OctoberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OctoberInstaller.php', + 'Composer\\Installers\\OntoWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php', + 'Composer\\Installers\\OsclassInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OsclassInstaller.php', + 'Composer\\Installers\\OxidInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OxidInstaller.php', + 'Composer\\Installers\\PPIInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PPIInstaller.php', + 'Composer\\Installers\\PhiftyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php', + 'Composer\\Installers\\PhpBBInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php', + 'Composer\\Installers\\PimcoreInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PimcoreInstaller.php', + 'Composer\\Installers\\PiwikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PiwikInstaller.php', + 'Composer\\Installers\\PlentymarketsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php', + 'Composer\\Installers\\Plugin' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Plugin.php', + 'Composer\\Installers\\PortoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PortoInstaller.php', + 'Composer\\Installers\\PrestashopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php', + 'Composer\\Installers\\ProcessWireInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ProcessWireInstaller.php', + 'Composer\\Installers\\PuppetInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PuppetInstaller.php', + 'Composer\\Installers\\PxcmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PxcmsInstaller.php', + 'Composer\\Installers\\RadPHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php', + 'Composer\\Installers\\ReIndexInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php', + 'Composer\\Installers\\Redaxo5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Redaxo5Installer.php', + 'Composer\\Installers\\RedaxoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php', + 'Composer\\Installers\\RoundcubeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php', + 'Composer\\Installers\\SMFInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SMFInstaller.php', + 'Composer\\Installers\\ShopwareInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php', + 'Composer\\Installers\\SilverStripeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php', + 'Composer\\Installers\\SiteDirectInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SiteDirectInstaller.php', + 'Composer\\Installers\\StarbugInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/StarbugInstaller.php', + 'Composer\\Installers\\SyDESInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyDESInstaller.php', + 'Composer\\Installers\\SyliusInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyliusInstaller.php', + 'Composer\\Installers\\Symfony1Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Symfony1Installer.php', + 'Composer\\Installers\\TYPO3CmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php', + 'Composer\\Installers\\TYPO3FlowInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php', + 'Composer\\Installers\\TaoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TaoInstaller.php', + 'Composer\\Installers\\TheliaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TheliaInstaller.php', + 'Composer\\Installers\\TuskInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TuskInstaller.php', + 'Composer\\Installers\\UserFrostingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php', + 'Composer\\Installers\\VanillaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VanillaInstaller.php', + 'Composer\\Installers\\VgmcpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php', + 'Composer\\Installers\\WHMCSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php', + 'Composer\\Installers\\WolfCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php', + 'Composer\\Installers\\WordPressInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WordPressInstaller.php', + 'Composer\\Installers\\YawikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/YawikInstaller.php', + 'Composer\\Installers\\ZendInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZendInstaller.php', + 'Composer\\Installers\\ZikulaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php', + 'Icepay_Api_Base' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Api_Basic' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_basic.php', + 'Icepay_Api_Logger' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Api_Pbm' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_pbm.php', + 'Icepay_Api_Webservice' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Basic_Paymentmethod_Interface_Abstract' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Basicmode' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_basic.php', + 'Icepay_Order' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Address' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Consumer' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Helper' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_Product' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Order_VAT' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_order.php', + 'Icepay_Parameter_Validation' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_PaymentObject' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_PaymentObject_Interface_Abstract' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Paymentmethod' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Paymentmethod_Creditcard' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/creditcard.php', + 'Icepay_Paymentmethod_Ddebit' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/ddebit.php', + 'Icepay_Paymentmethod_Directebank' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/directebank.php', + 'Icepay_Paymentmethod_Giropay' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/giropay.php', + 'Icepay_Paymentmethod_Ideal' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/ideal.php', + 'Icepay_Paymentmethod_Mistercash' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/mistercash.php', + 'Icepay_Paymentmethod_Paypal' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/paypal.php', + 'Icepay_Paymentmethod_Paysafecard' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/paysafecard.php', + 'Icepay_Paymentmethod_Phone' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/phone.php', + 'Icepay_Paymentmethod_Sms' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/sms.php', + 'Icepay_Paymentmethod_Wire' => __DIR__ . '/..' . '/icepay/icepay/src/paymentmethods/wire.php', + 'Icepay_PbmObject_Interface_Abstract' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_pbm.php', + 'Icepay_Pbm_Object' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_pbm.php', + 'Icepay_Postback' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Project_Helper' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Result' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_StatusCode' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_TransactionObject' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_WebserviceTransaction_Interface_Abstract' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_base.php', + 'Icepay_Webservice_AutoCapture' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Base' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Filtering' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Pay' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Paymentmethod' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Paymentmethods' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Refunds' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'Icepay_Webservice_Reporting' => __DIR__ . '/..' . '/icepay/icepay/src/icepay_api_webservice.php', + 'JsonSchema\\Constraints\\BaseConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php', + 'JsonSchema\\Constraints\\CollectionConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php', + 'JsonSchema\\Constraints\\Constraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php', + 'JsonSchema\\Constraints\\ConstraintInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php', + 'JsonSchema\\Constraints\\EnumConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php', + 'JsonSchema\\Constraints\\Factory' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php', + 'JsonSchema\\Constraints\\FormatConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php', + 'JsonSchema\\Constraints\\NumberConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php', + 'JsonSchema\\Constraints\\ObjectConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php', + 'JsonSchema\\Constraints\\SchemaConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php', + 'JsonSchema\\Constraints\\StringConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php', + 'JsonSchema\\Constraints\\TypeCheck\\LooseTypeCheck' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php', + 'JsonSchema\\Constraints\\TypeCheck\\StrictTypeCheck' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php', + 'JsonSchema\\Constraints\\TypeCheck\\TypeCheckInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php', + 'JsonSchema\\Constraints\\TypeConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php', + 'JsonSchema\\Constraints\\UndefinedConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php', + 'JsonSchema\\Entity\\JsonPointer' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php', + 'JsonSchema\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php', + 'JsonSchema\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php', + 'JsonSchema\\Exception\\InvalidConfigException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidConfigException.php', + 'JsonSchema\\Exception\\InvalidSchemaException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaException.php', + 'JsonSchema\\Exception\\InvalidSchemaMediaTypeException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaMediaTypeException.php', + 'JsonSchema\\Exception\\InvalidSourceUriException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSourceUriException.php', + 'JsonSchema\\Exception\\JsonDecodingException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/JsonDecodingException.php', + 'JsonSchema\\Exception\\ResourceNotFoundException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/ResourceNotFoundException.php', + 'JsonSchema\\Exception\\RuntimeException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/RuntimeException.php', + 'JsonSchema\\Exception\\UnresolvableJsonPointerException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/UnresolvableJsonPointerException.php', + 'JsonSchema\\Exception\\UriResolverException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php', + 'JsonSchema\\Exception\\ValidationException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/ValidationException.php', + 'JsonSchema\\Iterator\\ObjectIterator' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Iterator/ObjectIterator.php', + 'JsonSchema\\Rfc3339' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php', + 'JsonSchema\\SchemaStorage' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorage.php', + 'JsonSchema\\SchemaStorageInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php', + 'JsonSchema\\UriResolverInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php', + 'JsonSchema\\UriRetrieverInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/UriRetrieverInterface.php', + 'JsonSchema\\Uri\\Retrievers\\AbstractRetriever' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php', + 'JsonSchema\\Uri\\Retrievers\\Curl' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php', + 'JsonSchema\\Uri\\Retrievers\\FileGetContents' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php', + 'JsonSchema\\Uri\\Retrievers\\PredefinedArray' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php', + 'JsonSchema\\Uri\\Retrievers\\UriRetrieverInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php', + 'JsonSchema\\Uri\\UriResolver' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php', + 'JsonSchema\\Uri\\UriRetriever' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php', + 'JsonSchema\\Validator' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Validator.php', + 'Pronamic\\WordPress\\DateTime\\DateTime' => __DIR__ . '/..' . '/pronamic/wp-datetime/src/DateTime.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeImmutable' => __DIR__ . '/..' . '/pronamic/wp-datetime/src/DateTimeImmutable.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeInterface' => __DIR__ . '/..' . '/pronamic/wp-datetime/src/DateTimeInterface.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeTrait' => __DIR__ . '/..' . '/pronamic/wp-datetime/src/DateTimeTrait.php', + 'Pronamic\\WordPress\\DateTime\\DateTimeZone' => __DIR__ . '/..' . '/pronamic/wp-datetime/src/DateTimeZone.php', + 'Pronamic\\WordPress\\GravityFormsNL\\Plugin' => __DIR__ . '/..' . '/pronamic/wp-gravityforms-nl/src/Plugin.php', + 'Pronamic\\WordPress\\Money\\Calculator' => __DIR__ . '/..' . '/pronamic/wp-money/src/Calculator.php', + 'Pronamic\\WordPress\\Money\\Calculator\\BcMathCalculator' => __DIR__ . '/..' . '/pronamic/wp-money/src/Calculator/BcMathCalculator.php', + 'Pronamic\\WordPress\\Money\\Calculator\\PhpCalculator' => __DIR__ . '/..' . '/pronamic/wp-money/src/Calculator/PhpCalculator.php', + 'Pronamic\\WordPress\\Money\\Currencies' => __DIR__ . '/..' . '/pronamic/wp-money/src/Currencies.php', + 'Pronamic\\WordPress\\Money\\Currency' => __DIR__ . '/..' . '/pronamic/wp-money/src/Currency.php', + 'Pronamic\\WordPress\\Money\\Money' => __DIR__ . '/..' . '/pronamic/wp-money/src/Money.php', + 'Pronamic\\WordPress\\Money\\Parser' => __DIR__ . '/..' . '/pronamic/wp-money/src/Parser.php', + 'Pronamic\\WordPress\\Money\\TaxedMoney' => __DIR__ . '/..' . '/pronamic/wp-money/src/TaxedMoney.php', + 'Pronamic\\WordPress\\Pay\\AbstractDataStoreCPT' => __DIR__ . '/..' . '/wp-pay/core/src/AbstractDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\AbstractGatewayIntegration' => __DIR__ . '/..' . '/wp-pay/core/src/AbstractGatewayIntegration.php', + 'Pronamic\\WordPress\\Pay\\AbstractIntegration' => __DIR__ . '/..' . '/wp-pay/core/src/AbstractIntegration.php', + 'Pronamic\\WordPress\\Pay\\AbstractPluginIntegration' => __DIR__ . '/..' . '/wp-pay/core/src/AbstractPluginIntegration.php', + 'Pronamic\\WordPress\\Pay\\Address' => __DIR__ . '/..' . '/wp-pay/core/src/Address.php', + 'Pronamic\\WordPress\\Pay\\AddressHelper' => __DIR__ . '/..' . '/wp-pay/core/src/AddressHelper.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminAboutPage' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminAboutPage.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminDashboard' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminDashboard.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminGatewayPostType' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminGatewayPostType.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminHealth' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminHealth.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminModule' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminModule.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminNotices' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminNotices.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminPaymentBulkActions' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminPaymentBulkActions.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminPaymentPostType' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminPaymentPostType.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminReports' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminReports.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminSettings' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminSettings.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminSubscriptionPostType' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminSubscriptionPostType.php', + 'Pronamic\\WordPress\\Pay\\Admin\\AdminTour' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/AdminTour.php', + 'Pronamic\\WordPress\\Pay\\Admin\\Install' => __DIR__ . '/..' . '/wp-pay/core/src/Admin/Install.php', + 'Pronamic\\WordPress\\Pay\\Banks\\BankAccountDetails' => __DIR__ . '/..' . '/wp-pay/core/src/Banks/BankAccountDetails.php', + 'Pronamic\\WordPress\\Pay\\Banks\\BankTransferDetails' => __DIR__ . '/..' . '/wp-pay/core/src/Banks/BankTransferDetails.php', + 'Pronamic\\WordPress\\Pay\\Blocks\\BlocksModule' => __DIR__ . '/..' . '/wp-pay/core/src/Blocks/BlocksModule.php', + 'Pronamic\\WordPress\\Pay\\Cards' => __DIR__ . '/..' . '/wp-pay/core/src/Cards.php', + 'Pronamic\\WordPress\\Pay\\ContactName' => __DIR__ . '/..' . '/wp-pay/core/src/ContactName.php', + 'Pronamic\\WordPress\\Pay\\ContactNameHelper' => __DIR__ . '/..' . '/wp-pay/core/src/ContactNameHelper.php', + 'Pronamic\\WordPress\\Pay\\Core\\Gateway' => __DIR__ . '/..' . '/wp-pay/core/src/Core/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Core\\GatewayConfig' => __DIR__ . '/..' . '/wp-pay/core/src/Core/GatewayConfig.php', + 'Pronamic\\WordPress\\Pay\\Core\\IdTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Core/IdTrait.php', + 'Pronamic\\WordPress\\Pay\\Core\\PaymentMethods' => __DIR__ . '/..' . '/wp-pay/core/src/Core/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Core\\Recurring' => __DIR__ . '/..' . '/wp-pay/core/src/Core/Recurring.php', + 'Pronamic\\WordPress\\Pay\\Core\\Server' => __DIR__ . '/..' . '/wp-pay/core/src/Core/Server.php', + 'Pronamic\\WordPress\\Pay\\Core\\Statuses' => __DIR__ . '/..' . '/wp-pay/core/src/Core/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Core\\TimestampsTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Core/TimestampsTrait.php', + 'Pronamic\\WordPress\\Pay\\Core\\Util' => __DIR__ . '/..' . '/wp-pay/core/src/Core/Util.php', + 'Pronamic\\WordPress\\Pay\\Core\\VersionTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Core/VersionTrait.php', + 'Pronamic\\WordPress\\Pay\\Core\\XML\\Security' => __DIR__ . '/..' . '/wp-pay/core/src/Core/XML/Security.php', + 'Pronamic\\WordPress\\Pay\\Core\\XML\\Util' => __DIR__ . '/..' . '/wp-pay/core/src/Core/XML/Util.php', + 'Pronamic\\WordPress\\Pay\\Country' => __DIR__ . '/..' . '/wp-pay/core/src/Country.php', + 'Pronamic\\WordPress\\Pay\\CreditCard' => __DIR__ . '/..' . '/wp-pay/core/src/CreditCard.php', + 'Pronamic\\WordPress\\Pay\\Customer' => __DIR__ . '/..' . '/wp-pay/core/src/Customer.php', + 'Pronamic\\WordPress\\Pay\\CustomerHelper' => __DIR__ . '/..' . '/wp-pay/core/src/CustomerHelper.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\Dependencies' => __DIR__ . '/..' . '/wp-pay/core/src/Dependencies/Dependencies.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\Dependency' => __DIR__ . '/..' . '/wp-pay/core/src/Dependencies/Dependency.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\PhpDependency' => __DIR__ . '/..' . '/wp-pay/core/src/Dependencies/PhpDependency.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\PhpExtensionDependency' => __DIR__ . '/..' . '/wp-pay/core/src/Dependencies/PhpExtensionDependency.php', + 'Pronamic\\WordPress\\Pay\\Dependencies\\WordPressDependency' => __DIR__ . '/..' . '/wp-pay/core/src/Dependencies/WordPressDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\BancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\BankTransferGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\Charitable' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/Charitable.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\CharitableDependency' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/CharitableDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\CharitableHelper' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/CharitableHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\DirectDebitGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\GuldenGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/GuldenGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\IDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\SofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/charitable/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\ContactForm7Dependency' => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src/ContactForm7Dependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Pronamic' => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src/Pronamic.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Tags\\AmountTag' => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Tags\\IssuerTag' => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\Tags\\PaymentMethodTag' => __DIR__ . '/..' . '/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\EasyDigitalDownloads' => __DIR__ . '/..' . '/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloads.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\EasyDigitalDownloadsDependency' => __DIR__ . '/..' . '/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloadsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/easy-digital-downloads/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/easy-digital-downloads/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\PurchaseDataHelper' => __DIR__ . '/..' . '/wp-pay-extensions/easy-digital-downloads/src/PurchaseDataHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\EventEspresso' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso-legacy/src/EventEspresso.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\EventEspressoDependency' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso-legacy/src/EventEspressoDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\EventEspressoHelper' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso-legacy/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\AddOn' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/AddOn.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\AlipayGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/AlipayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\AlipayPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/AlipayPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BancontactPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BancontactPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BankTransferGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BankTransferPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BankTransferPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BelfiusGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BelfiusGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BelfiusPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BelfiusPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BitcoinGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BitcoinGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\BitcoinPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/BitcoinPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\CreditCardPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/CreditCardPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\DirectDebitGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\DirectDebitPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/DirectDebitPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\EventEspressoDependency' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/EventEspressoDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\EventEspressoHelper' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\GiropayGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/GiropayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\GiropayPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/GiropayPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealQRGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/IDealQRGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\IDealQRPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/IDealQRPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\KBCGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/KBCGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\KBCPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/KBCPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayPalGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayPalPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/PayPalPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayconiqGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/PayconiqGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PayconiqPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/PayconiqPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/PaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\PaymentStatuses' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/PaymentStatuses.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\SofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\SofortPaymentMethod' => __DIR__ . '/..' . '/wp-pay-extensions/event-espresso/src/SofortPaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\BankSelectFieldType' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\FormidableForms' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/FormidableForms.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\FormidableFormsDependency' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/FormidableFormsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\FormidableFormsHelper' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/FormidableFormsHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\PaymentAction' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/PaymentAction.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\PaymentMethodSelectFieldType' => __DIR__ . '/..' . '/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\BancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\BankTransferGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\DirectDebitGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\GiveDependency' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/GiveDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\GiveHelper' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/GiveHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\GuldenGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/GuldenGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\IDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\Give\\SofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/give/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Admin' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Admin.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\AdminPaymentFormPostType' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/AdminPaymentFormPostType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Entry' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Entry.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\FeedsDB' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/FeedsDB.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Fields' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Fields.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\GravityForms' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/GravityForms.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\GravityFormsDependency' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/GravityFormsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\IssuersField' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/IssuersField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\LeadProperties' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/LeadProperties.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Links' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Links.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PayFeed' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/PayFeed.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentAddOn' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/PaymentAddOn.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentData' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/PaymentData.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentFormPostType' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentMethodsField' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\PaymentStatuses' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/PaymentStatuses.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Processor' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Processor.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\Util' => __DIR__ . '/..' . '/wp-pay-extensions/gravityforms/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Admin\\AdminSubscriptions' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Admin\\AdminTransactions' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Admin/AdminTransactions.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\ApplePayGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/ApplePayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\BancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\BankTransferGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\BitcoinGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/BitcoinGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitBancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitBancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitIDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitIDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\DirectDebitSofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/DirectDebitSofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\IDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\PayPalGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\Przelewy24Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/Przelewy24Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Gateways\\SofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Gateways/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\MemberPress' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/MemberPress.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\MemberPressDependency' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/MemberPressDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\Pronamic' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/Pronamic.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\SubscriptionStatuses' => __DIR__ . '/..' . '/wp-pay-extensions/memberpress/src/SubscriptionStatuses.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\IssuersField' => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src/IssuersField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\NinjaFormsDependency' => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src/NinjaFormsDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\NinjaFormsHelper' => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src/NinjaFormsHelper.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\PaymentGateway' => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src/PaymentGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\PaymentMethodsField' => __DIR__ . '/..' . '/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\BancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\BankTransferGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\BitcoinGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/BitcoinGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitBancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitBancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitIDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitIDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\DirectDebitSofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/DirectDebitSofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\IDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\LengthUnit' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/LengthUnit.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\MembershipStatus' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/MembershipStatus.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\PayPalGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\PaymentStatus' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/PaymentStatus.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\RestrictContentProDependency' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/RestrictContentProDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\SofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Upgrade216' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\Util' => __DIR__ . '/..' . '/wp-pay-extensions/restrict-content-pro/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\S2Member' => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src/S2Member.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\S2MemberDependency' => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src/S2MemberDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Settings' => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src/Settings.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Shortcodes' => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src/Shortcodes.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\Util' => __DIR__ . '/..' . '/wp-pay-extensions/s2member/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\AfterPayGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/AfterPayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\BancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/BancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\BankTransferGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/BankTransferGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\FocumGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/FocumGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\GiropayGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/GiropayGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\IDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/IDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\MaestroGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/MaestroGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\PayPalGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/PayPalGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\Gateways\\SofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/Gateways/SofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\WPeCommerce' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/WPeCommerce.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\WPeCommerceDependency' => __DIR__ . '/..' . '/wp-pay-extensions/wp-e-commerce/src/WPeCommerceDependency.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\CreditCardGateway' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/CreditCardGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\DirectDebitBancontactGateway' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/DirectDebitBancontactGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\DirectDebitIDealGateway' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/DirectDebitIDealGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\DirectDebitSofortGateway' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/DirectDebitSofortGateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\Extension' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/Extension.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\Gateway' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\OrderItemType' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/OrderItemType.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\WooCommerce' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/WooCommerce.php', + 'Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\WooCommerceDependency' => __DIR__ . '/..' . '/wp-pay-extensions/woocommerce/src/WooCommerceDependency.php', + 'Pronamic\\WordPress\\Pay\\Facades\\Http' => __DIR__ . '/..' . '/wp-pay/core/src/Facades/Http.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormPostType' => __DIR__ . '/..' . '/wp-pay/core/src/Forms/FormPostType.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormProcessor' => __DIR__ . '/..' . '/wp-pay/core/src/Forms/FormProcessor.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormScripts' => __DIR__ . '/..' . '/wp-pay/core/src/Forms/FormScripts.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormShortcode' => __DIR__ . '/..' . '/wp-pay/core/src/Forms/FormShortcode.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormsModule' => __DIR__ . '/..' . '/wp-pay/core/src/Forms/FormsModule.php', + 'Pronamic\\WordPress\\Pay\\Forms\\FormsSource' => __DIR__ . '/..' . '/wp-pay/core/src/Forms/FormsSource.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\Addon' => __DIR__ . '/..' . '/wp-pay/fundraising/src/Addon.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\BlockUpdater' => __DIR__ . '/..' . '/wp-pay/fundraising/src/BlockUpdater.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\Blocks' => __DIR__ . '/..' . '/wp-pay/fundraising/src/Blocks.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\MakePotCommand' => __DIR__ . '/..' . '/wp-pay/fundraising/src/i18n-make-pot.php', + 'Pronamic\\WordPress\\Pay\\Fundraising\\Util' => __DIR__ . '/..' . '/wp-pay/fundraising/src/Util.php', + 'Pronamic\\WordPress\\Pay\\GatewayIntegrations' => __DIR__ . '/..' . '/wp-pay/core/src/GatewayIntegrations.php', + 'Pronamic\\WordPress\\Pay\\GatewayPostType' => __DIR__ . '/..' . '/wp-pay/core/src/GatewayPostType.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AbstractGateway' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/AbstractGateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AbstractPaymentRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/AbstractPaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ActionInformation' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/ActionInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Address' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Address.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AddressTransformer' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/AddressTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Amount' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Amount.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\AmountTransformer' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/AmountTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ApplicationInfo' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/ApplicationInfo.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\BrowserInformation' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/BrowserInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Channel' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Channel.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\DetailsInformation' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/DetailsInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\DropInGateway' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/DropInGateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Endpoint' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Endpoint.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ErrorType' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/ErrorType.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\EventCode' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/EventCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Gender' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Gender.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\GenderTransformer' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/GenderTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\LineItem' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/LineItem.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\LineItems' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/LineItems.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Name' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Name.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\NotificationRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/NotificationRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\NotificationRequestItem' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/NotificationRequestItem.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\NotificationsController' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/NotificationsController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentDetailsRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentDetailsRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethod' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentMethod.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethodType' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentMethodType.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethodsRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentMethodsRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentMethodsResponse' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentMethodsResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentRequestHelper' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentRequestHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResponse' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResponseHelper' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentResponseHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResultHelper' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentResultHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResultRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentResultRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentResultResponse' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentResultResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentSessionRequest' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentSessionRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentSessionResponse' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentSessionResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentsController' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentsController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\PaymentsResultController' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/PaymentsResultController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\RedirectInformation' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/RedirectInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Request' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Request.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ResponseObject' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/ResponseObject.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ResultCode' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/ResultCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Security' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\ServiceException' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/ServiceException.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\SiteHealthController' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/SiteHealthController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\TaxCategory' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/TaxCategory.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\Util' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\WebSdkGateway' => __DIR__ . '/..' . '/wp-pay-gateways/adyen/src/WebSdkGateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Listener' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Parameters' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Parameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\PaymentMethods' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Security' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\Util' => __DIR__ . '/..' . '/wp-pay-gateways/buckaroo/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Listener' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\PaymentMethods' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/ems-e-commerce/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Country' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Country.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Directory' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Directory.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\IDeal' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/IDeal.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Issuer' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Issuer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Merchant' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Merchant.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Security' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Status' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Status.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\Transaction' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\AcquirerErrorResMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerErrorResMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\AcquirerStatusReqMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusReqMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\AcquirerStatusResMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusResMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\CountryParser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/CountryParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\DirectoryParser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\DirectoryRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\DirectoryResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\ErrorParser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/ErrorParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\IssuerParser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/IssuerParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\Message' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/Message.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\Parser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/Parser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\RequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/RequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\ResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/ResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\TransactionParser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\TransactionRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\XML\\TransactionResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\DataHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Item' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Item.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Items' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Items.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Listener' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Notification' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Notification.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\Util' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\XML\\NotificationParser' => __DIR__ . '/..' . '/wp-pay-gateways/ideal-basic/src/XML/NotificationParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\AbstractIntegration' => __DIR__ . '/..' . '/wp-pay-gateways/ideal/src/AbstractIntegration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/ideal/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Listener' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\OrderRequest' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/OrderRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\PaymentMethods' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/ing-kassa-compleet/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/icepay/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\DirectebankIssuers' => __DIR__ . '/..' . '/wp-pay-gateways/icepay/src/DirectebankIssuers.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/icepay/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/icepay/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\Listener' => __DIR__ . '/..' . '/wp-pay-gateways/icepay/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\AbstractIntegration' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/AbstractIntegration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Brands' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Brands.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Data' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Data.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataCreditCardHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DataCreditCardHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataCustomerHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DataCustomerHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataGeneralHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DataGeneralHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DataUrlHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DataUrlHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\DataHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\DirectLink\\OrderResponse' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/DirectLink/OrderResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Ingenico' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Ingenico.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Listener' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Listener.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/OrderStandard/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/OrderStandard/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/OrderStandard/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/OrderStandard/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\OrderStandard\\TestConfig' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/OrderStandard/TestConfig.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Parameters' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Parameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\PaymentMethods' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/PaymentMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\PaymentMethodsList' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/PaymentMethodsList.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\SecureDataHelper' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/SecureDataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Security' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Settings' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Settings.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\Util' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\XML\\OrderResponseParser' => __DIR__ . '/..' . '/wp-pay-gateways/ogone/src/XML/OrderResponseParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Admin' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Admin.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Amount' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Amount.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\AmountTransformer' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/AmountTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\BaseResource' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/BaseResource.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\CLI' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/CLI.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Chargeback' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Chargeback.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Customer' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Customer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\CustomerDataStore' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/CustomerDataStore.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\CustomerQuery' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/CustomerQuery.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Install' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Install.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\LocaleHelper' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/LocaleHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Locales' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Locales.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Methods' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Payment' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Payment.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\PaymentDetails' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/PaymentDetails.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\PaymentRequest' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/PaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Profile' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Profile.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\ProfileDataStore' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/ProfileDataStore.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Sequence' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Sequence.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\WebhookController' => __DIR__ . '/..' . '/wp-pay-gateways/mollie/src/WebhookController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Customer' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Customer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\GatewayInfo' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/GatewayInfo.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Merchant' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Merchant.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Methods' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\MultiSafepay' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/MultiSafepay.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Signature' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Signature.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\Transaction' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\WooCommerce' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/WooCommerce.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\DirectTransactionRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/DirectTransactionRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\DirectTransactionResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/DirectTransactionResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\GatewaysRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/GatewaysRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\GatewaysResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/GatewaysResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\IDealIssuersRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/IDealIssuersRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\IDealIssuersResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/IDealIssuersResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\Message' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/Message.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\RedirectTransactionRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\RedirectTransactionResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\RequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/RequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\ResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/ResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\StatusRequestMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/StatusRequestMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\StatusResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/StatusResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\XML\\TransactionParser' => __DIR__ . '/..' . '/wp-pay-gateways/multisafepay/src/XML/TransactionParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Address' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Address.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\AddressTransformer' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/AddressTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\CustomerInformation' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/CustomerInformation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\DataHelper' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/DataHelper.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Gender' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Gender.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Message' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Message.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Money' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Money.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\MoneyTransformer' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/MoneyTransformer.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Notification' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Notification.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Order' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Order.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderAnnounceResponse' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/OrderAnnounceResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderItem' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/OrderItem.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderItems' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/OrderItems.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderResult' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/OrderResult.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\OrderResults' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/OrderResults.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\PaymentBrandForce' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/PaymentBrandForce.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\PaymentBrands' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/PaymentBrands.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\ProductCategories' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/ProductCategories.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\ResponseMessage' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/ResponseMessage.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\ReturnParameters' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/ReturnParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Security' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Security.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Signable' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Signable.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\VatCategories' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/VatCategories.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\WebhookController' => __DIR__ . '/..' . '/wp-pay-gateways/omnikassa-2/src/WebhookController.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Methods' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\OutputOptions' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/OutputOptions.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\ProductTypes' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/ProductTypes.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\Util' => __DIR__ . '/..' . '/wp-pay-gateways/pay-nl/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\BankDetails' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/BankDetails.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\BrandId' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/BrandId.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\IssuerIdIDeal' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/IssuerIdIDeal.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\PaymentRequest' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/PaymentRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\PaymentResponse' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/PaymentResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\RedirectDetails' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/RedirectDetails.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\RequestHeader' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/RequestHeader.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\ResponseHeader' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/ResponseHeader.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\ResultCode' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/ResultCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\SystemAddress' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/SystemAddress.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\TrackingCode' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/TrackingCode.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\Transaction' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\TransactionResponse' => __DIR__ . '/..' . '/wp-pay-gateways/payvision/src/TransactionResponse.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\CancelReservationRequest' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/CancelReservationRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Invoice' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Invoice.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\InvoiceRequest' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/InvoiceRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Merchant' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Merchant.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\MerchantRequest' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/MerchantRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Methods' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Methods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\NotifyRequest' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/NotifyRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Request' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Request.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\RequestMethods' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/RequestMethods.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Reservation' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Reservation.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\StatusRequest' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/StatusRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Transaction' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Transaction.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\TransactionRequest' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/TransactionRequest.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\Util' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/Util.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\ErrorParser' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/XML/ErrorParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\InvoiceParser' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/XML/InvoiceParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\MerchantParser' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/XML/MerchantParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\Parser' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/XML/Parser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\ReservationParser' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/XML/ReservationParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\XML\\TransactionParser' => __DIR__ . '/..' . '/wp-pay-gateways/sisow/src/XML/TransactionParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Client' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Client.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Config' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Config.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Error' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Error.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Gateway' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Gateway.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\IDealStartParameters' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/IDealStartParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Integration' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Integration.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\SofortClient' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/SofortClient.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\SofortStartParameters' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/SofortStartParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\StartParameters' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/StartParameters.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Status' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Status.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\StatusStringParser' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/StatusStringParser.php', + 'Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\Statuses' => __DIR__ . '/..' . '/wp-pay-gateways/targetpay/src/Statuses.php', + 'Pronamic\\WordPress\\Pay\\Gender' => __DIR__ . '/..' . '/wp-pay/core/src/Gender.php', + 'Pronamic\\WordPress\\Pay\\GoogleAnalyticsEcommerce' => __DIR__ . '/..' . '/wp-pay/core/src/GoogleAnalyticsEcommerce.php', + 'Pronamic\\WordPress\\Pay\\HouseNumber' => __DIR__ . '/..' . '/wp-pay/core/src/HouseNumber.php', + 'Pronamic\\WordPress\\Pay\\Http\\Response' => __DIR__ . '/..' . '/wp-pay/core/src/Http/Response.php', + 'Pronamic\\WordPress\\Pay\\LicenseManager' => __DIR__ . '/..' . '/wp-pay/core/src/LicenseManager.php', + 'Pronamic\\WordPress\\Pay\\MoneyJsonTransformer' => __DIR__ . '/..' . '/wp-pay/core/src/MoneyJsonTransformer.php', + 'Pronamic\\WordPress\\Pay\\Payments\\FailureReason' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/FailureReason.php', + 'Pronamic\\WordPress\\Pay\\Payments\\Item' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/Item.php', + 'Pronamic\\WordPress\\Pay\\Payments\\Items' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/Items.php', + 'Pronamic\\WordPress\\Pay\\Payments\\LegacyPayment' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/LegacyPayment.php', + 'Pronamic\\WordPress\\Pay\\Payments\\LegacyPaymentInfo' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/LegacyPaymentInfo.php', + 'Pronamic\\WordPress\\Pay\\Payments\\LegacyPaymentsDataStoreCPT' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/LegacyPaymentsDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\Payments\\Payment' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/Payment.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentInfo' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentInfo.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentInfoHelper' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentInfoHelper.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentInfoTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentInfoTrait.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentLine' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentLine.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentLineType' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentLineType.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentLines' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentLines.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentPostType' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentPostType.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentStatus' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentStatus.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentsDataStoreCPT' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentsModule' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentsModule.php', + 'Pronamic\\WordPress\\Pay\\Payments\\PaymentsPrivacy' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/PaymentsPrivacy.php', + 'Pronamic\\WordPress\\Pay\\Payments\\SourceTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/SourceTrait.php', + 'Pronamic\\WordPress\\Pay\\Payments\\StatusChecker' => __DIR__ . '/..' . '/wp-pay/core/src/Payments/StatusChecker.php', + 'Pronamic\\WordPress\\Pay\\Plugin' => __DIR__ . '/..' . '/wp-pay/core/src/Plugin.php', + 'Pronamic\\WordPress\\Pay\\PrivacyManager' => __DIR__ . '/..' . '/wp-pay/core/src/PrivacyManager.php', + 'Pronamic\\WordPress\\Pay\\Privacy\\AnonymizedTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Privacy/AnonymizedTrait.php', + 'Pronamic\\WordPress\\Pay\\Region' => __DIR__ . '/..' . '/wp-pay/core/src/Region.php', + 'Pronamic\\WordPress\\Pay\\Settings' => __DIR__ . '/..' . '/wp-pay/core/src/Settings.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\AlignmentRule' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/AlignmentRule.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\Subscription' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/Subscription.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionHelper' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionHelper.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionInterval' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionInterval.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPeriod' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPhase' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionPhase.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPhasesTrait' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionPhasesTrait.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionPostType' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionPostType.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionStatus' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionStatus.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionsDataStoreCPT' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionsModule' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionsModule.php', + 'Pronamic\\WordPress\\Pay\\Subscriptions\\SubscriptionsPrivacy' => __DIR__ . '/..' . '/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php', + 'Pronamic\\WordPress\\Pay\\TaxedMoneyJsonTransformer' => __DIR__ . '/..' . '/wp-pay/core/src/TaxedMoneyJsonTransformer.php', + 'Pronamic\\WordPress\\Pay\\TrackingModule' => __DIR__ . '/..' . '/wp-pay/core/src/TrackingModule.php', + 'Pronamic\\WordPress\\Pay\\Upgrades\\Upgrade' => __DIR__ . '/..' . '/wp-pay/core/src/Upgrades/Upgrade.php', + 'Pronamic\\WordPress\\Pay\\Upgrades\\Upgrade620' => __DIR__ . '/..' . '/wp-pay/core/src/Upgrades/Upgrade620.php', + 'Pronamic\\WordPress\\Pay\\Upgrades\\Upgrades' => __DIR__ . '/..' . '/wp-pay/core/src/Upgrades/Upgrades.php', + 'Pronamic\\WordPress\\Pay\\Util' => __DIR__ . '/..' . '/wp-pay/core/src/Util.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumber' => __DIR__ . '/..' . '/wp-pay/core/src/VatNumbers/VatNumber.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumberValidationService' => __DIR__ . '/..' . '/wp-pay/core/src/VatNumbers/VatNumberValidationService.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumberValidity' => __DIR__ . '/..' . '/wp-pay/core/src/VatNumbers/VatNumberValidity.php', + 'Pronamic\\WordPress\\Pay\\VatNumbers\\VatNumberViesValidator' => __DIR__ . '/..' . '/wp-pay/core/src/VatNumbers/VatNumberViesValidator.php', + 'Pronamic\\WordPress\\Pay\\VatRates' => __DIR__ . '/..' . '/wp-pay/core/src/VatRates.php', + 'Pronamic\\WordPress\\Pay\\Webhooks\\WebhookLogger' => __DIR__ . '/..' . '/wp-pay/core/src/Webhooks/WebhookLogger.php', + 'Pronamic\\WordPress\\Pay\\Webhooks\\WebhookManager' => __DIR__ . '/..' . '/wp-pay/core/src/Webhooks/WebhookManager.php', + 'Pronamic\\WordPress\\Pay\\Webhooks\\WebhookRequestInfo' => __DIR__ . '/..' . '/wp-pay/core/src/Webhooks/WebhookRequestInfo.php', + 'VIISON\\AddressSplitter\\AddressSplitter' => __DIR__ . '/..' . '/viison/address-splitter/src/AddressSplitter.php', + 'VIISON\\AddressSplitter\\Exceptions\\SplittingException' => __DIR__ . '/..' . '/viison/address-splitter/src/Exceptions/SplittingException.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit2ffcb5ea3934c50c6bbe0730ce541b37::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit2ffcb5ea3934c50c6bbe0730ce541b37::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit2ffcb5ea3934c50c6bbe0730ce541b37::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installed.json b/wp-content/plugins/pronamic-ideal/vendor/composer/installed.json new file mode 100644 index 00000000..a67e79fe --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installed.json @@ -0,0 +1,2898 @@ +[ + { + "name": "composer/installers", + "version": "v1.10.0", + "version_normalized": "1.10.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d", + "reference": "1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.6.* || ^2.0", + "composer/semver": "^1 || ^3", + "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan-phpunit": "^0.12.16", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.3" + }, + "time": "2021-01-14T11:07:16+00:00", + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Starbug", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "modulework", + "modx", + "moodle", + "osclass", + "phpbb", + "piwik", + "ppi", + "processwire", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "symfony", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v1.10.0" + }, + "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" + } + ] + }, + { + "name": "icepay/icepay", + "version": "2.5.3", + "version_normalized": "2.5.3.0", + "source": { + "type": "git", + "url": "https://github.com/ICEPAYdev/icepay.git", + "reference": "0c517325a6fd55edf64fadfd50eacf044fb6055e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ICEPAYdev/icepay/zipball/0c517325a6fd55edf64fadfd50eacf044fb6055e", + "reference": "0c517325a6fd55edf64fadfd50eacf044fb6055e", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "time": "2015-09-17T08:32:44+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "description": "ICEPAY library to integrate ICEPAY in your projects.", + "homepage": "https://icepay.com/", + "keywords": [ + "afterpay", + "api", + "bancontact", + "banktransfer", + "creditcard", + "gateway", + "icepay", + "ideal", + "mistercash", + "payment", + "payments", + "paypal", + "paysafecard", + "phone", + "refund", + "service", + "sofort", + "sofortbanking", + "yourgift" + ], + "support": { + "issues": "https://github.com/icepay/icepay/issues", + "source": "https://github.com/icepay/icepay" + } + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.10", + "version_normalized": "5.2.10.0", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "time": "2020-05-27T16:41:55+00:00", + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + } + }, + { + "name": "pronamic/wp-datetime", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/pronamic/wp-datetime.git", + "reference": "cf16fe56ab819535e33760115d60bc8fdbb31c44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pronamic/wp-datetime/zipball/cf16fe56ab819535e33760115d60bc8fdbb31c44", + "reference": "cf16fe56ab819535e33760115d60bc8fdbb31c44", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "koodimonni-language/de_de": "*", + "koodimonni-language/fr_fr": "*", + "koodimonni-language/ja": "*", + "koodimonni-language/nl_nl": "*", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.5", + "squizlabs/php_codesniffer": "^3.5", + "vlucas/phpdotenv": "^2.0", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "time": "2020-10-08T12:58:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\DateTime\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "WordPress DateTime library.", + "support": { + "issues": "https://github.com/pronamic/wp-datetime/issues", + "source": "https://github.com/pronamic/wp-datetime/tree/1.2.0" + } + }, + { + "name": "pronamic/wp-gravityforms-nl", + "version": "3.0.1", + "version_normalized": "3.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/pronamic/wp-gravityforms-nl.git", + "reference": "3b561651e2e0e68912d1d777a45928724cdecb6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pronamic/wp-gravityforms-nl/zipball/3b561651e2e0e68912d1d777a45928724cdecb6e", + "reference": "3b561651e2e0e68912d1d777a45928724cdecb6e", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "koodimonni-language/nl_nl": "*", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.4", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.5", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "time": "2020-11-09T10:39:56+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\GravityFormsNL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "WordPress Gravity Forms (nl) library.", + "support": { + "issues": "https://github.com/pronamic/wp-gravityforms-nl/issues", + "source": "https://github.com/pronamic/wp-gravityforms-nl/tree/3.0.1" + } + }, + { + "name": "pronamic/wp-money", + "version": "1.2.5", + "version_normalized": "1.2.5.0", + "source": { + "type": "git", + "url": "https://github.com/pronamic/wp-money.git", + "reference": "d40e63265ac954e8c40d29ed09e65989a091f024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pronamic/wp-money/zipball/d40e63265ac954e8c40d29ed09e65989a091f024", + "reference": "d40e63265ac954e8c40d29ed09e65989a091f024", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "koodimonni-language/de_de": "*", + "koodimonni-language/fr_fr": "*", + "koodimonni-language/nl_nl": "*", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.4", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "vlucas/phpdotenv": "^2.0", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.1" + }, + "time": "2020-07-08T11:43:27+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Money\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "WordPress Money library.", + "support": { + "issues": "https://github.com/pronamic/wp-money/issues", + "source": "https://github.com/pronamic/wp-money/tree/1.2.5" + } + }, + { + "name": "viison/address-splitter", + "version": "0.3.4", + "version_normalized": "0.3.4.0", + "source": { + "type": "git", + "url": "https://github.com/pickware/address-splitter.git", + "reference": "ebad709276aaadce94a3a1fe2507aa38a467a94a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pickware/address-splitter/zipball/ebad709276aaadce94a3a1fe2507aa38a467a94a", + "reference": "ebad709276aaadce94a3a1fe2507aa38a467a94a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2019-10-24T09:23:47+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "VIISON\\AddressSplitter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "VIISON GmbH", + "email": "contact@viison.com" + } + ], + "description": "Tries to split an address line into street name, house number and other additional information like building, apartment information etc.", + "support": { + "issues": "https://github.com/pickware/address-splitter/issues", + "source": "https://github.com/pickware/address-splitter/tree/0.3.4" + } + }, + { + "name": "wp-pay-extensions/charitable", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/charitable.git", + "reference": "79cf6d9f912354e5c7eddc681cbb4ec106c9dc5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/charitable/zipball/79cf6d9f912354e5c7eddc681cbb4ec106c9dc5a", + "reference": "79cf6d9f912354e5c7eddc681cbb4ec106c9dc5a", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "charitable/charitable": "^1.6", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T16:29:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\Charitable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Charitable driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/charitable/", + "keywords": [ + "charitable", + "extension", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/charitable/issues", + "source": "https://github.com/wp-pay-extensions/charitable" + } + }, + { + "name": "wp-pay-extensions/contact-form-7", + "version": "1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/contact-form-7.git", + "reference": "6a15910f5530c48024785e1692b76aafa1cdd1b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/contact-form-7/zipball/6a15910f5530c48024785e1692b76aafa1cdd1b5", + "reference": "6a15910f5530c48024785e1692b76aafa1cdd1b5", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2021-01-14T13:40:04+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\ContactForm7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Contact Form 7 driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/contact-form-7/", + "keywords": [ + "contact-form-7", + "extension", + "gateway", + "pay", + "payments", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/contact-form-7/issues", + "source": "https://github.com/wp-pay-extensions/contact-form-7/" + } + }, + { + "name": "wp-pay-extensions/easy-digital-downloads", + "version": "2.1.3", + "version_normalized": "2.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/easy-digital-downloads.git", + "reference": "3b83aa12470864e49c4a83a571ab1b608ef066df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/easy-digital-downloads/zipball/3b83aa12470864e49c4a83a571ab1b608ef066df", + "reference": "3b83aa12470864e49c4a83a571ab1b608ef066df", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "easydigitaldownloads/easy-digital-downloads": "^2.9", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T13:44:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\EasyDigitalDownloads\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Easy Digital Downloads driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/easy-digital-downloads/", + "keywords": [ + "digital", + "downlaods", + "easy", + "edd", + "extension", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/easy-digital-downloads/issues", + "source": "https://github.com/wp-pay-extensions/easy-digital-downloads" + } + }, + { + "name": "wp-pay-extensions/event-espresso", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/event-espresso.git", + "reference": "e88d597d2078db30c3ac33200128ff9c02628dab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/event-espresso/zipball/e88d597d2078db30c3ac33200128ff9c02628dab", + "reference": "e88d597d2078db30c3ac33200128ff9c02628dab", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T13:50:49+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\EventEspresso\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Event Espresso driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/event-espresso/", + "keywords": [ + "espresso", + "event", + "event-espresso", + "events", + "extension", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/event-espresso/issues", + "source": "https://github.com/wp-pay-extensions/event-espresso" + } + }, + { + "name": "wp-pay-extensions/event-espresso-legacy", + "version": "2.3.2", + "version_normalized": "2.3.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/event-espresso-legacy.git", + "reference": "0e54c1e7b4513230963981dbe1a007474e2428a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/event-espresso-legacy/zipball/0e54c1e7b4513230963981dbe1a007474e2428a8", + "reference": "0e54c1e7b4513230963981dbe1a007474e2428a8", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-19T22:00:41+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\EventEspressoLegacy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Event Espresso (legacy 3.1) driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/event-espresso-legacy/", + "keywords": [ + "espresso", + "event", + "event-espresso", + "events", + "extension", + "legacy", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/event-espresso-legacy/issues", + "source": "https://github.com/wp-pay-extensions/event-espresso-legacy" + } + }, + { + "name": "wp-pay-extensions/formidable-forms", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/formidable-forms.git", + "reference": "d6cd255494a78de71e6dac79f398943d595f0419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/formidable-forms/zipball/d6cd255494a78de71e6dac79f398943d595f0419", + "reference": "d6cd255494a78de71e6dac79f398943d595f0419", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-21T15:14:46+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\FormidableForms\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Formidable Forms driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/formidable-forms/", + "keywords": [ + "Forms", + "extension", + "formidable", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/formidable-forms/issues", + "source": "https://github.com/wp-pay-extensions/formidable-forms" + } + }, + { + "name": "wp-pay-extensions/give", + "version": "2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/give.git", + "reference": "b289c35ad66ff49fa3b958d5442886da9ab69c11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/give/zipball/b289c35ad66ff49fa3b958d5442886da9ab69c11", + "reference": "b289c35ad66ff49fa3b958d5442886da9ab69c11", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "impress-org/givewp": "^2.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.1", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T14:39:06+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\Give\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Give driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/give/", + "keywords": [ + "extension", + "give", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/give/issues", + "source": "https://github.com/wp-pay-extensions/give" + } + }, + { + "name": "wp-pay-extensions/gravityforms", + "version": "2.5.2", + "version_normalized": "2.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/gravityforms.git", + "reference": "f24264e26c90af504e92cad42b8f6a1b12586897" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/gravityforms/zipball/f24264e26c90af504e92cad42b8f6a1b12586897", + "reference": "f24264e26c90af504e92cad42b8f6a1b12586897", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "pronamic/wp-gravityforms-nl": "^3.0", + "wp-pay/core": "^2.5" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.3", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6", + "wp-premium/gravityforms": "^2.3" + }, + "time": "2021-01-14T14:42:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\GravityForms\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Gravity Forms driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/gravityforms/", + "keywords": [ + "extension", + "gravityforms", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/gravityforms/issues", + "source": "https://github.com/wp-pay-extensions/gravityforms" + } + }, + { + "name": "wp-pay-extensions/memberpress", + "version": "2.2.2", + "version_normalized": "2.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/memberpress.git", + "reference": "be09a5b47657accbb92f6ffe394ea3809b6eb597" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/memberpress/zipball/be09a5b47657accbb92f6ffe394ea3809b6eb597", + "reference": "be09a5b47657accbb92f6ffe394ea3809b6eb597", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6", + "wp-premium/memberpress-basic": "^1.3" + }, + "time": "2021-01-18T12:02:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\MemberPress\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "MemberPress driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/memberpress/", + "keywords": [ + "extension", + "memberpress", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/memberpress/issues", + "source": "https://github.com/wp-pay-extensions/memberpress" + } + }, + { + "name": "wp-pay-extensions/ninjaforms", + "version": "1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/ninjaforms.git", + "reference": "a2a66cdc390060a04e4e52d684fd63edad90c6f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/ninjaforms/zipball/a2a66cdc390060a04e4e52d684fd63edad90c6f4", + "reference": "a2a66cdc390060a04e4e52d684fd63edad90c6f4", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6", + "wpackagist-plugin/ninja-forms": "3.4.33" + }, + "time": "2021-01-21T15:31:59+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\NinjaForms\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Ruben Droogh", + "homepage": "http://www.rubendroogh.nl/", + "role": "Developer" + } + ], + "description": "Ninja Forms driver for the WordPress payment processing library.", + "keywords": [ + "Forms", + "extension", + "ninja", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/ninjaforms/issues", + "source": "https://github.com/wp-pay-extensions/ninjaforms" + } + }, + { + "name": "wp-pay-extensions/restrict-content-pro", + "version": "2.3.1", + "version_normalized": "2.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/restrict-content-pro.git", + "reference": "089b41b1766d28c1758db38b43637b2fa5c092d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/restrict-content-pro/zipball/089b41b1766d28c1758db38b43637b2fa5c092d5", + "reference": "089b41b1766d28c1758db38b43637b2fa5c092d5", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "restrictcontentpro/restrict-content": "2.2.3", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.2", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T15:04:22+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\RestrictContentPro\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Restrict Content Pro driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/restrict-content-pro/", + "keywords": [ + "content", + "extension", + "pay", + "pro", + "pronamic", + "restrict", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/restrict-content-pro/issues", + "source": "https://github.com/wp-pay-extensions/restrict-content-pro" + } + }, + { + "name": "wp-pay-extensions/s2member", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/s2member.git", + "reference": "3f5953a9539c339f8e8e435484d280d1b7b0c399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/s2member/zipball/3f5953a9539c339f8e8e435484d280d1b7b0c399", + "reference": "3f5953a9539c339f8e8e435484d280d1b7b0c399", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6", + "wpsharks/s2member": "190822" + }, + "time": "2021-01-14T15:10:31+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\S2Member\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "s2Member driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/s2member/", + "keywords": [ + "extension", + "pay", + "pronamic", + "s2member", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/s2member/issues", + "source": "https://github.com/wp-pay-extensions/s2member" + } + }, + { + "name": "wp-pay-extensions/woocommerce", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/woocommerce.git", + "reference": "840135da3344b7be8f461598f378952ebe1db865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/woocommerce/zipball/840135da3344b7be8f461598f378952ebe1db865", + "reference": "840135da3344b7be8f461598f378952ebe1db865", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "woocommerce/woocommerce": "^4.9", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.6", + "wp-premium/woocommerce-subscriptions": "2.4.7" + }, + "time": "2021-01-14T15:18:04+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\WooCommerce\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "WooCommerce driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/woocommerce/", + "keywords": [ + "extension", + "pay", + "pronamic", + "woocommerce", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/woocommerce/issues", + "source": "https://github.com/wp-pay-extensions/woocommerce" + } + }, + { + "name": "wp-pay-extensions/wp-e-commerce", + "version": "2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-extensions/wp-e-commerce.git", + "reference": "e0564854b8973bae6c0845085ddfc7e0d31bbb8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-extensions/wp-e-commerce/zipball/e0564854b8973bae6c0845085ddfc7e0d31bbb8f", + "reference": "e0564854b8973bae6c0845085ddfc7e0d31bbb8f", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-e-commerce/wp-e-commerce": "^3.14", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T15:22:42+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Extensions\\WPeCommerce\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "WP eCommerce driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/extensions/wp-e-commerce/", + "keywords": [ + "extension", + "pay", + "pronamic", + "wordpress", + "wp", + "wp-e-commerce" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-extensions/wp-e-commerce/issues", + "source": "https://github.com/wp-pay-extensions/wp-e-commerce" + } + }, + { + "name": "wp-pay-gateways/adyen", + "version": "1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/adyen.git", + "reference": "21c8880af3d474a6cbf610c17837a87a5a0fa8b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/adyen/zipball/21c8880af3d474a6cbf610c17837a87a5a0fa8b7", + "reference": "21c8880af3d474a6cbf610c17837a87a5a0fa8b7", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.2", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.8", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-14T11:00:29+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Adyen\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Adyen driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/adyen/", + "keywords": [ + "adyen", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/adyen/issues", + "source": "https://github.com/wp-pay-gateways/adyen" + } + }, + { + "name": "wp-pay-gateways/buckaroo", + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/buckaroo.git", + "reference": "e05dafc6f6447679d7dd2d1ebd311e647d83002d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/buckaroo/zipball/e05dafc6f6447679d7dd2d1ebd311e647d83002d", + "reference": "e05dafc6f6447679d7dd2d1ebd311e647d83002d", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-04-20T07:17:06+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Buckaroo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Buckaroo driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/buckaroo/", + "keywords": [ + "buckaroo", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/buckaroo/issues", + "source": "https://github.com/wp-pay-gateways/buckaroo" + } + }, + { + "name": "wp-pay-gateways/ems-e-commerce", + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ems-e-commerce.git", + "reference": "dc9d102177b96ced30aef0d1c13ac5d10ced6983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ems-e-commerce/zipball/dc9d102177b96ced30aef0d1c13ac5d10ced6983", + "reference": "dc9d102177b96ced30aef0d1c13ac5d10ced6983", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-04-20T07:17:20+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\EMS\\ECommerce\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "EMS e-Commerce Gateway driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ems-e-commerce/", + "keywords": [ + "EMS", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ems-e-commerce/issues", + "source": "https://github.com/wp-pay-gateways/ems-e-commerce" + } + }, + { + "name": "wp-pay-gateways/icepay", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/icepay.git", + "reference": "95d3414ce34fff945ba672aec039dbd9932c5890" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/icepay/zipball/95d3414ce34fff945ba672aec039dbd9932c5890", + "reference": "95d3414ce34fff945ba672aec039dbd9932c5890", + "shasum": "" + }, + "require": { + "icepay/icepay": "^2.5.0", + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-03-19T09:38:50+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Icepay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "ICEPAY driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/icepay/", + "keywords": [ + "gateway", + "icepay", + "ideal", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/icepay/issues", + "source": "https://github.com/wp-pay-gateways/icepay" + } + }, + { + "name": "wp-pay-gateways/ideal", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ideal.git", + "reference": "722eb55059fa34cc194ae501770a135ac5092973" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ideal/zipball/722eb55059fa34cc194ae501770a135ac5092973", + "reference": "722eb55059fa34cc194ae501770a135ac5092973", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-03-19T09:41:04+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\IDeal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "description": "iDEAL driver for the WordPress payment processing library.", + "homepage": "https://github.com/wp-pay-gateways/ideal", + "keywords": [ + "gateway", + "ideal", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "issues": "https://github.com/wp-pay-gateways/ideal/issues", + "source": "https://github.com/wp-pay-gateways/ideal/tree/2.1.0" + } + }, + { + "name": "wp-pay-gateways/ideal-advanced-v3", + "version": "2.1.3", + "version_normalized": "2.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ideal-advanced-v3.git", + "reference": "b8eb3a46e0ce14340f3893f79bcf62216576e1ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ideal-advanced-v3/zipball/b8eb3a46e0ce14340f3893f79bcf62216576e1ce", + "reference": "b8eb3a46e0ce14340f3893f79bcf62216576e1ce", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-openssl": "*", + "php": ">=5.6.20", + "wp-pay-gateways/ideal": "^2.1", + "wp-pay/core": "^2.5" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.2", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.5", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "time": "2020-11-17T22:09:54+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\IDealAdvancedV3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "iDEAL Advanced v3 driver for the WordPress payment processing library.", + "homepage": "https://github.com/wp-pay-gateways/ideal-advanced-v3", + "keywords": [ + "advanced", + "gateway", + "ideal", + "pay", + "pronamic", + "v3", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ideal-advanced-v3/issues", + "source": "https://github.com/wp-pay-gateways/ideal-advanced-v3" + } + }, + { + "name": "wp-pay-gateways/ideal-basic", + "version": "2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ideal-basic.git", + "reference": "9dbde9b582819a966d9ef5f548a46113ad567784" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ideal-basic/zipball/9dbde9b582819a966d9ef5f548a46113ad567784", + "reference": "9dbde9b582819a966d9ef5f548a46113ad567784", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay-gateways/ideal": "^2.1", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-11-10T22:22:33+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\IDealBasic\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "iDEAL Basic driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ideal-basic/", + "keywords": [ + "basic", + "gateway", + "ideal", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ideal-basic/issues", + "source": "https://github.com/wp-pay-gateways/ideal-basic" + } + }, + { + "name": "wp-pay-gateways/ing-kassa-compleet", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ing-kassa-compleet.git", + "reference": "12c5a13384e80dc2c0cf415380ec7d40d37e13ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ing-kassa-compleet/zipball/12c5a13384e80dc2c0cf415380ec7d40d37e13ed", + "reference": "12c5a13384e80dc2c0cf415380ec7d40d37e13ed", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-03-19T09:49:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\ING\\KassaCompleet\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "ING Kassa Compleet driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ing-kassa-compleet/", + "keywords": [ + "compleet", + "gateway", + "ing", + "kassa", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ing-kassa-compleet/issues", + "source": "https://github.com/wp-pay-gateways/ing-kassa-compleet" + } + }, + { + "name": "wp-pay-gateways/mollie", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/mollie.git", + "reference": "fe5ded7431eed0eb9f4bcd931adba3f97566a81d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/mollie/zipball/fe5ded7431eed0eb9f4bcd931adba3f97566a81d", + "reference": "fe5ded7431eed0eb9f4bcd931adba3f97566a81d", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.3", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-cli/wp-cli": "^2.3", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-18T13:24:32+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Mollie\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Mollie driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/mollie/", + "keywords": [ + "gateway", + "mollie", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/mollie/issues", + "source": "https://github.com/wp-pay-gateways/mollie" + } + }, + { + "name": "wp-pay-gateways/multisafepay", + "version": "2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/multisafepay.git", + "reference": "9b6efe8dd9db71055e2f4ef2943d7d88efa252ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/multisafepay/zipball/9b6efe8dd9db71055e2f4ef2943d7d88efa252ae", + "reference": "9b6efe8dd9db71055e2f4ef2943d7d88efa252ae", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2021-01-18T12:01:44+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\MultiSafepay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "MultiSafepay driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/multisafepay/", + "keywords": [ + "gateway", + "ideal", + "multisafepay", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/multisafepay/issues", + "source": "https://github.com/wp-pay-gateways/multisafepay" + } + }, + { + "name": "wp-pay-gateways/ogone", + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/ogone.git", + "reference": "05a79e308e12b6ec97975bdac419b3474de03185" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/ogone/zipball/05a79e308e12b6ec97975bdac419b3474de03185", + "reference": "05a79e308e12b6ec97975bdac419b3474de03185", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-07-08T11:46:23+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Ingenico\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Ingenico/Ogone driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/ogone/", + "keywords": [ + "gateway", + "ingenico", + "ogone", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/ogone/issues", + "source": "https://github.com/wp-pay-gateways/ogone" + } + }, + { + "name": "wp-pay-gateways/omnikassa-2", + "version": "2.3.1", + "version_normalized": "2.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/omnikassa-2.git", + "reference": "0f20c1b49c54c722f35b5387410389af43cc1726" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/omnikassa-2/zipball/0f20c1b49c54c722f35b5387410389af43cc1726", + "reference": "0f20c1b49c54c722f35b5387410389af43cc1726", + "shasum": "" + }, + "require": { + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "wp-pay/core": "^2.6" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.2", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-variable-analysis": "^2.9", + "slevomat/coding-standard": "^6.4", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2021-01-21T15:15:01+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\OmniKassa2\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "OmniKassa 2.0 driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/omnikassa-2/", + "keywords": [ + "gateway", + "omnikassa", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/omnikassa-2/issues", + "source": "https://github.com/wp-pay-gateways/omnikassa-2" + } + }, + { + "name": "wp-pay-gateways/pay-nl", + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/pay-nl.git", + "reference": "cd7a59ca00617a8fc9ea78d0486082ef6c429ef7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/pay-nl/zipball/cd7a59ca00617a8fc9ea78d0486082ef6c429ef7", + "reference": "cd7a59ca00617a8fc9ea78d0486082ef6c429ef7", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-11-09T16:07:45+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\PayNL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Pay.nl driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/pay-nl/", + "keywords": [ + "gateway", + "ideal", + "pay", + "pay-nl", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/pay-nl/issues", + "source": "https://github.com/wp-pay-gateways/pay-nl" + } + }, + { + "name": "wp-pay-gateways/payvision", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/payvision.git", + "reference": "6f9e063d326f9284655bc10f0abd315126d6b565" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/payvision/zipball/6f9e063d326f9284655bc10f0abd315126d6b565", + "reference": "6f9e063d326f9284655bc10f0abd315126d6b565", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2", + "php": ">=5.6.20", + "pronamic/wp-money": "^1.2", + "wp-pay/core": "^2.5" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^1.2", + "php-coveralls/php-coveralls": "^2.2", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.8", + "phpunit/phpunit": "^5.7", + "roots/wordpress": "^5.5", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.9", + "slevomat/coding-standard": "^6.4", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.5" + }, + "time": "2021-01-18T12:01:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Payvision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Payvision driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/payvision/", + "keywords": [ + "gateway", + "pay", + "payvision", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/payvision/issues", + "source": "https://github.com/wp-pay-gateways/payvision" + } + }, + { + "name": "wp-pay-gateways/sisow", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/sisow.git", + "reference": "08fe7391bf5e141aaf135f6d1e3bb1e0fb124d0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/sisow/zipball/08fe7391bf5e141aaf135f6d1e3bb1e0fb124d0b", + "reference": "08fe7391bf5e141aaf135f6d1e3bb1e0fb124d0b", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-03-19T10:15:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\Sisow\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Sisow driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/sisow/", + "keywords": [ + "gateway", + "pay", + "pronamic", + "sisow", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/sisow/issues", + "source": "https://github.com/wp-pay-gateways/sisow" + } + }, + { + "name": "wp-pay-gateways/targetpay", + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay-gateways/targetpay.git", + "reference": "0121adfe450fcb037792d382756798fa2b8877c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay-gateways/targetpay/zipball/0121adfe450fcb037792d382756798fa2b8877c8", + "reference": "0121adfe450fcb037792d382756798fa2b8877c8", + "shasum": "" + }, + "require": { + "php": ">=5.6.20", + "wp-pay/core": "^2.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "php-coveralls/php-coveralls": "^2.1", + "phpcompatibility/php-compatibility": "^9.2", + "phpcompatibility/phpcompatibility-wp": "^2.0", + "phpmd/phpmd": "^2.7", + "phpunit/phpunit": "^5.7 || ^6.0", + "roots/wordpress": "^5.2", + "squizlabs/php_codesniffer": "^3.4", + "wp-coding-standards/wpcs": "^2.1", + "wp-phpunit/wp-phpunit": "^5.2" + }, + "time": "2020-03-19T10:20:47+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Gateways\\TargetPay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "TargetPay driver for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/gateways/targetpay/", + "keywords": [ + "gateway", + "pay", + "pronamic", + "targetpay", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay-gateways/targetpay/issues", + "source": "https://github.com/wp-pay-gateways/targetpay" + } + }, + { + "name": "wp-pay/core", + "version": "2.6.2", + "version_normalized": "2.6.2.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay/core.git", + "reference": "b1ce9c7ccffd5dd0337a7b15116d8b4902e96a40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay/core/zipball/b1ce9c7ccffd5dd0337a7b15116d8b4902e96a40", + "reference": "b1ce9c7ccffd5dd0337a7b15116d8b4902e96a40", + "shasum": "" + }, + "require": { + "composer/installers": "^1.7", + "ext-dom": "*", + "ext-libxml": "*", + "ext-simplexml": "*", + "php": ">=5.6.20", + "pronamic/wp-datetime": "^1.2", + "pronamic/wp-money": "^1.2", + "viison/address-splitter": "^0.3.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.2", + "php-coveralls/php-coveralls": "^2.4", + "php-stubs/wp-cli-stubs": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "roots/wordpress": "^5.6", + "squizlabs/php_codesniffer": "^3.5", + "wp-cli/wp-cli": "^2.3", + "wp-coding-standards/wpcs": "^2.3", + "wp-phpunit/wp-phpunit": "^5.6", + "wpackagist-plugin/shortcode-ui": "^0.7" + }, + "time": "2021-01-21T15:15:38+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\": "src/" + }, + "files": [ + "includes/functions.php", + "includes/xmlseclibs/xmlseclibs-ing.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "https://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "https://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Core components for the WordPress payment processing library.", + "homepage": "https://www.wp-pay.org/", + "keywords": [ + "core", + "gateway", + "pay", + "pronamic", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay/core/issues", + "source": "https://github.com/wp-pay/core" + } + }, + { + "name": "wp-pay/fundraising", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/wp-pay/fundraising.git", + "reference": "75ea3bbdaa90e223ff5dcbe54bb3309e9a51ccff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-pay/fundraising/zipball/75ea3bbdaa90e223ff5dcbe54bb3309e9a51ccff", + "reference": "75ea3bbdaa90e223ff5dcbe54bb3309e9a51ccff", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "overtrue/phplint": "^2.1", + "php-coveralls/php-coveralls": "^2.4", + "phpcompatibility/php-compatibility": "^9.3", + "phpcompatibility/phpcompatibility-wp": "^2.1", + "phpmd/phpmd": "^2.9", + "phpunit/phpunit": "^5.7", + "pronamic/wp-money": "^1.2", + "roots/wordpress": "^5.6", + "sirbrillig/phpcs-import-detection": "^1.2", + "sirbrillig/phpcs-variable-analysis": "^2.8", + "squizlabs/php_codesniffer": "^3.5", + "wp-coding-standards/wpcs": "^2.3", + "wp-pay/core": "^2.5", + "wp-phpunit/wp-phpunit": "^5.6" + }, + "time": "2020-12-17T12:12:19+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pronamic\\WordPress\\Pay\\Fundraising\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Pronamic", + "email": "info@pronamic.eu", + "homepage": "http://www.pronamic.eu/", + "role": "Company" + }, + { + "name": "Remco Tolsma", + "email": "info@remcotolsma.nl", + "homepage": "http://www.remcotolsma.nl/", + "role": "Developer" + } + ], + "description": "Fundraising add-on for the WordPress payment processing library.", + "homepage": "http://www.wp-pay.org/addons/fundraising/", + "keywords": [ + "addon", + "crowdfunding", + "donations", + "fundraising", + "pay", + "progress", + "pronamic", + "target", + "wordpress", + "wp" + ], + "support": { + "email": "support@wp-pay.org", + "issues": "https://github.com/wp-pay/fundraising/issues", + "source": "https://github.com/wp-pay/fundraising" + } + } +] diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AglInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AglInstaller.php new file mode 100644 index 00000000..01b8a416 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AglInstaller.php @@ -0,0 +1,21 @@ + 'More/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = preg_replace_callback('/(?:^|_|-)(.?)/', function ($matches) { + return strtoupper($matches[1]); + }, $vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php new file mode 100644 index 00000000..79a0e958 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php @@ -0,0 +1,9 @@ + 'ext/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php new file mode 100644 index 00000000..89d7ad90 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php @@ -0,0 +1,11 @@ + 'addons/modules/{$name}/', + 'component' => 'addons/components/{$name}/', + 'service' => 'addons/services/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php new file mode 100644 index 00000000..22dad1b9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php @@ -0,0 +1,49 @@ + 'Modules/{$name}/', + 'theme' => 'Themes/{$name}/' + ); + + /** + * Format package name. + * + * For package type asgard-module, cut off a trailing '-plugin' if present. + * + * For package type asgard-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'asgard-module') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'asgard-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-module$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php new file mode 100644 index 00000000..d62fd8fd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php new file mode 100644 index 00000000..70dde907 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php @@ -0,0 +1,137 @@ +composer = $composer; + $this->package = $package; + $this->io = $io; + } + + /** + * Return the install path based on package type. + * + * @param PackageInterface $package + * @param string $frameworkType + * @return string + */ + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + $type = $this->package->getType(); + + $prettyName = $this->package->getPrettyName(); + if (strpos($prettyName, '/') !== false) { + list($vendor, $name) = explode('/', $prettyName); + } else { + $vendor = ''; + $name = $prettyName; + } + + $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type')); + + $extra = $package->getExtra(); + if (!empty($extra['installer-name'])) { + $availableVars['name'] = $extra['installer-name']; + } + + if ($this->composer->getPackage()) { + $extra = $this->composer->getPackage()->getExtra(); + if (!empty($extra['installer-paths'])) { + $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor); + if ($customPath !== false) { + return $this->templatePath($customPath, $availableVars); + } + } + } + + $packageType = substr($type, strlen($frameworkType) + 1); + $locations = $this->getLocations(); + if (!isset($locations[$packageType])) { + throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type)); + } + + return $this->templatePath($locations[$packageType], $availableVars); + } + + /** + * For an installer to override to modify the vars per installer. + * + * @param array $vars This will normally receive array{name: string, vendor: string, type: string} + * @return array + */ + public function inflectPackageVars($vars) + { + return $vars; + } + + /** + * Gets the installer's locations + * + * @return array map of package types => install path + */ + public function getLocations() + { + return $this->locations; + } + + /** + * Replace vars in a path + * + * @param string $path + * @param array $vars + * @return string + */ + protected function templatePath($path, array $vars = array()) + { + if (strpos($path, '{') !== false) { + extract($vars); + preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches); + if (!empty($matches[1])) { + foreach ($matches[1] as $var) { + $path = str_replace('{$' . $var . '}', $$var, $path); + } + } + } + + return $path; + } + + /** + * Search through a passed paths array for a custom install path. + * + * @param array $paths + * @param string $name + * @param string $type + * @param string $vendor = NULL + * @return string|false + */ + protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL) + { + foreach ($paths as $path => $names) { + $names = (array) $names; + if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) { + return $path; + } + } + + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php new file mode 100644 index 00000000..e80cd1e1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php @@ -0,0 +1,126 @@ +.`. + * - `bitrix-d7-component` — copy the component to directory `bitrix/components//`. + * - `bitrix-d7-template` — copy the template to directory `bitrix/templates/_`. + * + * You can set custom path to directory with Bitrix kernel in `composer.json`: + * + * ```json + * { + * "extra": { + * "bitrix-dir": "s1/bitrix" + * } + * } + * ``` + * + * @author Nik Samokhvalov + * @author Denis Kulichkin + */ +class BitrixInstaller extends BaseInstaller +{ + protected $locations = array( + 'module' => '{$bitrix_dir}/modules/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) + 'component' => '{$bitrix_dir}/components/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) + 'theme' => '{$bitrix_dir}/templates/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) + 'd7-module' => '{$bitrix_dir}/modules/{$vendor}.{$name}/', + 'd7-component' => '{$bitrix_dir}/components/{$vendor}/{$name}/', + 'd7-template' => '{$bitrix_dir}/templates/{$vendor}_{$name}/', + ); + + /** + * @var array Storage for informations about duplicates at all the time of installation packages. + */ + private static $checkedDuplicates = array(); + + /** + * {@inheritdoc} + */ + public function inflectPackageVars($vars) + { + if ($this->composer->getPackage()) { + $extra = $this->composer->getPackage()->getExtra(); + + if (isset($extra['bitrix-dir'])) { + $vars['bitrix_dir'] = $extra['bitrix-dir']; + } + } + + if (!isset($vars['bitrix_dir'])) { + $vars['bitrix_dir'] = 'bitrix'; + } + + return parent::inflectPackageVars($vars); + } + + /** + * {@inheritdoc} + */ + protected function templatePath($path, array $vars = array()) + { + $templatePath = parent::templatePath($path, $vars); + $this->checkDuplicates($templatePath, $vars); + + return $templatePath; + } + + /** + * Duplicates search packages. + * + * @param string $path + * @param array $vars + */ + protected function checkDuplicates($path, array $vars = array()) + { + $packageType = substr($vars['type'], strlen('bitrix') + 1); + $localDir = explode('/', $vars['bitrix_dir']); + array_pop($localDir); + $localDir[] = 'local'; + $localDir = implode('/', $localDir); + + $oldPath = str_replace( + array('{$bitrix_dir}', '{$name}'), + array($localDir, $vars['name']), + $this->locations[$packageType] + ); + + if (in_array($oldPath, static::$checkedDuplicates)) { + return; + } + + if ($oldPath !== $path && file_exists($oldPath) && $this->io && $this->io->isInteractive()) { + + $this->io->writeError(' Duplication of packages:'); + $this->io->writeError(' Package ' . $oldPath . ' will be called instead package ' . $path . ''); + + while (true) { + switch ($this->io->ask(' Delete ' . $oldPath . ' [y,n,?]? ', '?')) { + case 'y': + $fs = new Filesystem(); + $fs->removeDirectory($oldPath); + break 2; + + case 'n': + break 2; + + case '?': + default: + $this->io->writeError(array( + ' y - delete package ' . $oldPath . ' and to continue with the installation', + ' n - don\'t delete and to continue with the installation', + )); + $this->io->writeError(' ? - print help'); + break; + } + } + } + + static::$checkedDuplicates[] = $oldPath; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php new file mode 100644 index 00000000..da3aad2a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php @@ -0,0 +1,9 @@ + 'Packages/{$vendor}/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php new file mode 100644 index 00000000..dda90a4e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php @@ -0,0 +1,65 @@ + 'Plugin/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + if ($this->matchesCakeVersion('>=', '3.0.0')) { + return $vars; + } + + $nameParts = explode('/', $vars['name']); + foreach ($nameParts as &$value) { + $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = str_replace(array('-', '_'), ' ', $value); + $value = str_replace(' ', '', ucwords($value)); + } + $vars['name'] = implode('/', $nameParts); + + return $vars; + } + + /** + * Change the default plugin location when cakephp >= 3.0 + */ + public function getLocations() + { + if ($this->matchesCakeVersion('>=', '3.0.0')) { + $this->locations['plugin'] = $this->composer->getConfig()->get('vendor-dir') . '/{$vendor}/{$name}/'; + } + return $this->locations; + } + + /** + * Check if CakePHP version matches against a version + * + * @param string $matcher + * @param string $version + * @return bool + */ + protected function matchesCakeVersion($matcher, $version) + { + $repositoryManager = $this->composer->getRepositoryManager(); + if (! $repositoryManager) { + return false; + } + + $repos = $repositoryManager->getLocalRepository(); + if (!$repos) { + return false; + } + + return $repos->findPackage('cakephp/cakephp', new Constraint($matcher, $version)) !== null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php new file mode 100644 index 00000000..ab2f9aad --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php @@ -0,0 +1,11 @@ + 'Chef/{$vendor}/{$name}/', + 'role' => 'Chef/roles/{$name}/', + ); +} + diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php new file mode 100644 index 00000000..6673aea9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php @@ -0,0 +1,9 @@ + 'ext/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php new file mode 100644 index 00000000..c887815c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php @@ -0,0 +1,10 @@ + 'CCF/orbit/{$name}/', + 'theme' => 'CCF/app/themes/{$name}/', + ); +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php new file mode 100644 index 00000000..053f3ffd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php @@ -0,0 +1,32 @@ + 'cockpit/modules/addons/{$name}/', + ); + + /** + * Format module name. + * + * Strip `module-` prefix from package name. + * + * {@inheritDoc} + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] == 'cockpit-module') { + return $this->inflectModuleVars($vars); + } + + return $vars; + } + + public function inflectModuleVars($vars) + { + $vars['name'] = ucfirst(preg_replace('/cockpit-/i', '', $vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php new file mode 100644 index 00000000..3b4a4ece --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php @@ -0,0 +1,11 @@ + 'application/libraries/{$name}/', + 'third-party' => 'application/third_party/{$name}/', + 'module' => 'application/modules/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php new file mode 100644 index 00000000..5c01bafd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php @@ -0,0 +1,13 @@ + 'concrete/', + 'block' => 'application/blocks/{$name}/', + 'package' => 'packages/{$name}/', + 'theme' => 'application/themes/{$name}/', + 'update' => 'updates/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php new file mode 100644 index 00000000..d37a77ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php @@ -0,0 +1,35 @@ + 'craft/plugins/{$name}/', + ); + + /** + * Strip `craft-` prefix and/or `-plugin` suffix from package names + * + * @param array $vars + * + * @return array + */ + final public function inflectPackageVars($vars) + { + return $this->inflectPluginVars($vars); + } + + private function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-' . self::NAME_SUFFIX . '$/i', '', $vars['name']); + $vars['name'] = preg_replace('/^' . self::NAME_PREFIX . '-/i', '', $vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php new file mode 100644 index 00000000..d94219d3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php @@ -0,0 +1,21 @@ + 'Plugin/{$name}/', + 'theme' => 'View/Themed/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(str_replace(array('-', '_'), ' ', $vars['name'])); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php new file mode 100644 index 00000000..f4837a6c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php @@ -0,0 +1,10 @@ + 'app/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php new file mode 100644 index 00000000..70788163 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php @@ -0,0 +1,10 @@ + 'modules/{$vendor}/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php new file mode 100644 index 00000000..cfd638d5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php @@ -0,0 +1,50 @@ + 'lib/plugins/{$name}/', + 'template' => 'lib/tpl/{$name}/', + ); + + /** + * Format package name. + * + * For package type dokuwiki-plugin, cut off a trailing '-plugin', + * or leading dokuwiki_ if present. + * + * For package type dokuwiki-template, cut off a trailing '-template' if present. + * + */ + public function inflectPackageVars($vars) + { + + if ($vars['type'] === 'dokuwiki-plugin') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'dokuwiki-template') { + return $this->inflectTemplateVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']); + $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']); + + return $vars; + } + + protected function inflectTemplateVars($vars) + { + $vars['name'] = preg_replace('/-template$/', '', $vars['name']); + $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']); + + return $vars; + } + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php new file mode 100644 index 00000000..21f7e8e8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php @@ -0,0 +1,16 @@ + + */ +class DolibarrInstaller extends BaseInstaller +{ + //TODO: Add support for scripts and themes + protected $locations = array( + 'module' => 'htdocs/custom/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php new file mode 100644 index 00000000..73282392 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php @@ -0,0 +1,22 @@ + 'core/', + 'module' => 'modules/{$name}/', + 'theme' => 'themes/{$name}/', + 'library' => 'libraries/{$name}/', + 'profile' => 'profiles/{$name}/', + 'database-driver' => 'drivers/lib/Drupal/Driver/Database/{$name}/', + 'drush' => 'drush/{$name}/', + 'custom-theme' => 'themes/custom/{$name}/', + 'custom-module' => 'modules/custom/{$name}/', + 'custom-profile' => 'profiles/custom/{$name}/', + 'drupal-multisite' => 'sites/{$name}/', + 'console' => 'console/{$name}/', + 'console-language' => 'console/language/{$name}/', + 'config' => 'config/sync/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php new file mode 100644 index 00000000..c0bb609f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php @@ -0,0 +1,9 @@ + 'mod/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php new file mode 100644 index 00000000..6f3dc97b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php @@ -0,0 +1,12 @@ + 'components/{$name}/', + 'module' => 'modules/{$name}/', + 'plugin' => 'plugins/{$name}/', + 'template' => 'templates/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php new file mode 100644 index 00000000..d5321a8c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php @@ -0,0 +1,29 @@ + 'system/expressionengine/third_party/{$name}/', + 'theme' => 'themes/third_party/{$name}/', + ); + + private $ee3Locations = array( + 'addon' => 'system/user/addons/{$name}/', + 'theme' => 'themes/user/{$name}/', + ); + + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + + $version = "{$frameworkType}Locations"; + $this->locations = $this->$version; + + return parent::getInstallPath($package, $frameworkType); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php new file mode 100644 index 00000000..f30ebcc7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php @@ -0,0 +1,10 @@ + 'web/assets/ezplatform/', + 'assets' => 'web/assets/ezplatform/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php new file mode 100644 index 00000000..6eba2e34 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php @@ -0,0 +1,11 @@ + 'fuel/app/modules/{$name}/', + 'package' => 'fuel/packages/{$name}/', + 'theme' => 'fuel/app/themes/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php new file mode 100644 index 00000000..29d980b3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php @@ -0,0 +1,9 @@ + 'components/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/GravInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/GravInstaller.php new file mode 100644 index 00000000..dbe63e07 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/GravInstaller.php @@ -0,0 +1,30 @@ + 'user/plugins/{$name}/', + 'theme' => 'user/themes/{$name}/', + ); + + /** + * Format package name + * + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $restrictedWords = implode('|', array_keys($this->locations)); + + $vars['name'] = strtolower($vars['name']); + $vars['name'] = preg_replace('/^(?:grav-)?(?:(?:'.$restrictedWords.')-)?(.*?)(?:-(?:'.$restrictedWords.'))?$/ui', + '$1', + $vars['name'] + ); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php new file mode 100644 index 00000000..8fe017f0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php @@ -0,0 +1,25 @@ + 'plugins/{$name}/', + 'theme' => 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $nameParts = explode('/', $vars['name']); + foreach ($nameParts as &$value) { + $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = str_replace(array('-', '_'), ' ', $value); + $value = str_replace(' ', '', ucwords($value)); + } + $vars['name'] = implode('/', $nameParts); + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php new file mode 100644 index 00000000..5e2142ea --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php @@ -0,0 +1,11 @@ + 'templates/{$name}/', + 'module' => 'application/modules/{$name}/', + 'library' => 'application/libraries/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Installer.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Installer.php new file mode 100644 index 00000000..5869c177 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Installer.php @@ -0,0 +1,294 @@ + 'AimeosInstaller', + 'asgard' => 'AsgardInstaller', + 'attogram' => 'AttogramInstaller', + 'agl' => 'AglInstaller', + 'annotatecms' => 'AnnotateCmsInstaller', + 'bitrix' => 'BitrixInstaller', + 'bonefish' => 'BonefishInstaller', + 'cakephp' => 'CakePHPInstaller', + 'chef' => 'ChefInstaller', + 'civicrm' => 'CiviCrmInstaller', + 'ccframework' => 'ClanCatsFrameworkInstaller', + 'cockpit' => 'CockpitInstaller', + 'codeigniter' => 'CodeIgniterInstaller', + 'concrete5' => 'Concrete5Installer', + 'craft' => 'CraftInstaller', + 'croogo' => 'CroogoInstaller', + 'dframe' => 'DframeInstaller', + 'dokuwiki' => 'DokuWikiInstaller', + 'dolibarr' => 'DolibarrInstaller', + 'decibel' => 'DecibelInstaller', + 'drupal' => 'DrupalInstaller', + 'elgg' => 'ElggInstaller', + 'eliasis' => 'EliasisInstaller', + 'ee3' => 'ExpressionEngineInstaller', + 'ee2' => 'ExpressionEngineInstaller', + 'ezplatform' => 'EzPlatformInstaller', + 'fuel' => 'FuelInstaller', + 'fuelphp' => 'FuelphpInstaller', + 'grav' => 'GravInstaller', + 'hurad' => 'HuradInstaller', + 'imagecms' => 'ImageCMSInstaller', + 'itop' => 'ItopInstaller', + 'joomla' => 'JoomlaInstaller', + 'kanboard' => 'KanboardInstaller', + 'kirby' => 'KirbyInstaller', + 'known' => 'KnownInstaller', + 'kodicms' => 'KodiCMSInstaller', + 'kohana' => 'KohanaInstaller', + 'lms' => 'LanManagementSystemInstaller', + 'laravel' => 'LaravelInstaller', + 'lavalite' => 'LavaLiteInstaller', + 'lithium' => 'LithiumInstaller', + 'magento' => 'MagentoInstaller', + 'majima' => 'MajimaInstaller', + 'mantisbt' => 'MantisBTInstaller', + 'mako' => 'MakoInstaller', + 'maya' => 'MayaInstaller', + 'mautic' => 'MauticInstaller', + 'mediawiki' => 'MediaWikiInstaller', + 'microweber' => 'MicroweberInstaller', + 'modulework' => 'MODULEWorkInstaller', + 'modx' => 'ModxInstaller', + 'modxevo' => 'MODXEvoInstaller', + 'moodle' => 'MoodleInstaller', + 'october' => 'OctoberInstaller', + 'ontowiki' => 'OntoWikiInstaller', + 'oxid' => 'OxidInstaller', + 'osclass' => 'OsclassInstaller', + 'pxcms' => 'PxcmsInstaller', + 'phpbb' => 'PhpBBInstaller', + 'pimcore' => 'PimcoreInstaller', + 'piwik' => 'PiwikInstaller', + 'plentymarkets'=> 'PlentymarketsInstaller', + 'ppi' => 'PPIInstaller', + 'puppet' => 'PuppetInstaller', + 'radphp' => 'RadPHPInstaller', + 'phifty' => 'PhiftyInstaller', + 'porto' => 'PortoInstaller', + 'processwire' => 'ProcessWireInstaller', + 'redaxo' => 'RedaxoInstaller', + 'redaxo5' => 'Redaxo5Installer', + 'reindex' => 'ReIndexInstaller', + 'roundcube' => 'RoundcubeInstaller', + 'shopware' => 'ShopwareInstaller', + 'sitedirect' => 'SiteDirectInstaller', + 'silverstripe' => 'SilverStripeInstaller', + 'smf' => 'SMFInstaller', + 'starbug' => 'StarbugInstaller', + 'sydes' => 'SyDESInstaller', + 'sylius' => 'SyliusInstaller', + 'symfony1' => 'Symfony1Installer', + 'tao' => 'TaoInstaller', + 'thelia' => 'TheliaInstaller', + 'tusk' => 'TuskInstaller', + 'typo3-cms' => 'TYPO3CmsInstaller', + 'typo3-flow' => 'TYPO3FlowInstaller', + 'userfrosting' => 'UserFrostingInstaller', + 'vanilla' => 'VanillaInstaller', + 'whmcs' => 'WHMCSInstaller', + 'wolfcms' => 'WolfCMSInstaller', + 'wordpress' => 'WordPressInstaller', + 'yawik' => 'YawikInstaller', + 'zend' => 'ZendInstaller', + 'zikula' => 'ZikulaInstaller', + 'prestashop' => 'PrestashopInstaller' + ); + + /** + * Installer constructor. + * + * Disables installers specified in main composer extra installer-disable + * list + * + * @param IOInterface $io + * @param Composer $composer + * @param string $type + * @param Filesystem|null $filesystem + * @param BinaryInstaller|null $binaryInstaller + */ + public function __construct( + IOInterface $io, + Composer $composer, + $type = 'library', + Filesystem $filesystem = null, + BinaryInstaller $binaryInstaller = null + ) { + parent::__construct($io, $composer, $type, $filesystem, + $binaryInstaller); + $this->removeDisabledInstallers(); + } + + /** + * {@inheritDoc} + */ + public function getInstallPath(PackageInterface $package) + { + $type = $package->getType(); + $frameworkType = $this->findFrameworkType($type); + + if ($frameworkType === false) { + throw new \InvalidArgumentException( + 'Sorry the package type of this package is not yet supported.' + ); + } + + $class = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType]; + $installer = new $class($package, $this->composer, $this->getIO()); + + return $installer->getInstallPath($package, $frameworkType); + } + + public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) + { + $installPath = $this->getPackageBasePath($package); + $io = $this->io; + $outputStatus = function () use ($io, $installPath) { + $io->write(sprintf('Deleting %s - %s', $installPath, !file_exists($installPath) ? 'deleted' : 'not deleted')); + }; + + $promise = parent::uninstall($repo, $package); + + // Composer v2 might return a promise here + if ($promise instanceof PromiseInterface) { + return $promise->then($outputStatus); + } + + // If not, execute the code right away as parent::uninstall executed synchronously (composer v1, or v2 without async) + $outputStatus(); + + return null; + } + + /** + * {@inheritDoc} + */ + public function supports($packageType) + { + $frameworkType = $this->findFrameworkType($packageType); + + if ($frameworkType === false) { + return false; + } + + $locationPattern = $this->getLocationPattern($frameworkType); + + return preg_match('#' . $frameworkType . '-' . $locationPattern . '#', $packageType, $matches) === 1; + } + + /** + * Finds a supported framework type if it exists and returns it + * + * @param string $type + * @return string|false + */ + protected function findFrameworkType($type) + { + krsort($this->supportedTypes); + + foreach ($this->supportedTypes as $key => $val) { + if ($key === substr($type, 0, strlen($key))) { + return substr($type, 0, strlen($key)); + } + } + + return false; + } + + /** + * Get the second part of the regular expression to check for support of a + * package type + * + * @param string $frameworkType + * @return string + */ + protected function getLocationPattern($frameworkType) + { + $pattern = false; + if (!empty($this->supportedTypes[$frameworkType])) { + $frameworkClass = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType]; + /** @var BaseInstaller $framework */ + $framework = new $frameworkClass(null, $this->composer, $this->getIO()); + $locations = array_keys($framework->getLocations()); + $pattern = $locations ? '(' . implode('|', $locations) . ')' : false; + } + + return $pattern ? : '(\w+)'; + } + + /** + * Get I/O object + * + * @return IOInterface + */ + private function getIO() + { + return $this->io; + } + + /** + * Look for installers set to be disabled in composer's extra config and + * remove them from the list of supported installers. + * + * Globals: + * - true, "all", and "*" - disable all installers. + * - false - enable all installers (useful with + * wikimedia/composer-merge-plugin or similar) + * + * @return void + */ + protected function removeDisabledInstallers() + { + $extra = $this->composer->getPackage()->getExtra(); + + if (!isset($extra['installer-disable']) || $extra['installer-disable'] === false) { + // No installers are disabled + return; + } + + // Get installers to disable + $disable = $extra['installer-disable']; + + // Ensure $disabled is an array + if (!is_array($disable)) { + $disable = array($disable); + } + + // Check which installers should be disabled + $all = array(true, "all", "*"); + $intersect = array_intersect($all, $disable); + if (!empty($intersect)) { + // Disable all installers + $this->supportedTypes = array(); + } else { + // Disable specified installers + foreach ($disable as $key => $installer) { + if (is_string($installer) && key_exists($installer, $this->supportedTypes)) { + unset($this->supportedTypes[$installer]); + } + } + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php new file mode 100644 index 00000000..c6c1b337 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php @@ -0,0 +1,9 @@ + 'extensions/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php new file mode 100644 index 00000000..9ee77596 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php @@ -0,0 +1,15 @@ + 'components/{$name}/', + 'module' => 'modules/{$name}/', + 'template' => 'templates/{$name}/', + 'plugin' => 'plugins/{$name}/', + 'library' => 'libraries/{$name}/', + ); + + // TODO: Add inflector for mod_ and com_ names +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php new file mode 100644 index 00000000..9cb7b8cd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php @@ -0,0 +1,18 @@ + 'plugins/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php new file mode 100644 index 00000000..36b2f84a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php @@ -0,0 +1,11 @@ + 'site/plugins/{$name}/', + 'field' => 'site/fields/{$name}/', + 'tag' => 'site/tags/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php new file mode 100644 index 00000000..c5d08c5f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php @@ -0,0 +1,11 @@ + 'IdnoPlugins/{$name}/', + 'theme' => 'Themes/{$name}/', + 'console' => 'ConsolePlugins/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php new file mode 100644 index 00000000..7143e232 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php @@ -0,0 +1,10 @@ + 'cms/plugins/{$name}/', + 'media' => 'cms/media/vendor/{$name}/' + ); +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php new file mode 100644 index 00000000..dcd6d263 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php new file mode 100644 index 00000000..903143a5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php @@ -0,0 +1,27 @@ + 'plugins/{$name}/', + 'template' => 'templates/{$name}/', + 'document-template' => 'documents/templates/{$name}/', + 'userpanel-module' => 'userpanel/modules/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php new file mode 100644 index 00000000..be4d53a7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php @@ -0,0 +1,9 @@ + 'libraries/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php new file mode 100644 index 00000000..412c0b5c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php @@ -0,0 +1,10 @@ + 'packages/{$vendor}/{$name}/', + 'theme' => 'public/themes/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php new file mode 100644 index 00000000..47bbd4ca --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php @@ -0,0 +1,10 @@ + 'libraries/{$name}/', + 'source' => 'libraries/_source/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php new file mode 100644 index 00000000..9c2e9fb4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php new file mode 100644 index 00000000..5a664608 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php @@ -0,0 +1,16 @@ + 'assets/snippets/{$name}/', + 'plugin' => 'assets/plugins/{$name}/', + 'module' => 'assets/modules/{$name}/', + 'template' => 'assets/templates/{$name}/', + 'lib' => 'assets/lib/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php new file mode 100644 index 00000000..cf18e947 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php @@ -0,0 +1,11 @@ + 'app/design/frontend/{$name}/', + 'skin' => 'skin/frontend/default/{$name}/', + 'library' => 'lib/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php new file mode 100644 index 00000000..e463756f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php @@ -0,0 +1,37 @@ + 'plugins/{$name}/', + ); + + /** + * Transforms the names + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + return $this->correctPluginName($vars); + } + + /** + * Change hyphenated names to camelcase + * @param array $vars + * @return array + */ + private function correctPluginName($vars) + { + $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, $vars['name']); + $vars['name'] = ucfirst($camelCasedName); + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php new file mode 100644 index 00000000..ca3cfacb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php @@ -0,0 +1,9 @@ + 'app/packages/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php new file mode 100644 index 00000000..dadb1dbb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php @@ -0,0 +1,23 @@ + 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php new file mode 100644 index 00000000..3e1ce2b2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php @@ -0,0 +1,25 @@ + 'plugins/{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Format package name of mautic-plugins to CamelCase + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] == 'mautic-plugin') { + $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, ucfirst($vars['name'])); + } + + return $vars; + } + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php new file mode 100644 index 00000000..30a91676 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php @@ -0,0 +1,33 @@ + 'modules/{$name}/', + ); + + /** + * Format package name. + * + * For package type maya-module, cut off a trailing '-module' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'maya-module') { + return $this->inflectModuleVars($vars); + } + + return $vars; + } + + protected function inflectModuleVars($vars) + { + $vars['name'] = preg_replace('/-module$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php new file mode 100644 index 00000000..f5a8957e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php @@ -0,0 +1,51 @@ + 'core/', + 'extension' => 'extensions/{$name}/', + 'skin' => 'skins/{$name}/', + ); + + /** + * Format package name. + * + * For package type mediawiki-extension, cut off a trailing '-extension' if present and transform + * to CamelCase keeping existing uppercase chars. + * + * For package type mediawiki-skin, cut off a trailing '-skin' if present. + * + */ + public function inflectPackageVars($vars) + { + + if ($vars['type'] === 'mediawiki-extension') { + return $this->inflectExtensionVars($vars); + } + + if ($vars['type'] === 'mediawiki-skin') { + return $this->inflectSkinVars($vars); + } + + return $vars; + } + + protected function inflectExtensionVars($vars) + { + $vars['name'] = preg_replace('/-extension$/', '', $vars['name']); + $vars['name'] = str_replace('-', ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectSkinVars($vars) + { + $vars['name'] = preg_replace('/-skin$/', '', $vars['name']); + + return $vars; + } + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php new file mode 100644 index 00000000..b7d97039 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php @@ -0,0 +1,119 @@ + 'userfiles/modules/{$install_item_dir}/', + 'module-skin' => 'userfiles/modules/{$install_item_dir}/templates/', + 'template' => 'userfiles/templates/{$install_item_dir}/', + 'element' => 'userfiles/elements/{$install_item_dir}/', + 'vendor' => 'vendor/{$install_item_dir}/', + 'components' => 'components/{$install_item_dir}/' + ); + + /** + * Format package name. + * + * For package type microweber-module, cut off a trailing '-module' if present + * + * For package type microweber-template, cut off a trailing '-template' if present. + * + */ + public function inflectPackageVars($vars) + { + + + if ($this->package->getTargetDir()) { + $vars['install_item_dir'] = $this->package->getTargetDir(); + } else { + $vars['install_item_dir'] = $vars['name']; + if ($vars['type'] === 'microweber-template') { + return $this->inflectTemplateVars($vars); + } + if ($vars['type'] === 'microweber-templates') { + return $this->inflectTemplatesVars($vars); + } + if ($vars['type'] === 'microweber-core') { + return $this->inflectCoreVars($vars); + } + if ($vars['type'] === 'microweber-adapter') { + return $this->inflectCoreVars($vars); + } + if ($vars['type'] === 'microweber-module') { + return $this->inflectModuleVars($vars); + } + if ($vars['type'] === 'microweber-modules') { + return $this->inflectModulesVars($vars); + } + if ($vars['type'] === 'microweber-skin') { + return $this->inflectSkinVars($vars); + } + if ($vars['type'] === 'microweber-element' or $vars['type'] === 'microweber-elements') { + return $this->inflectElementVars($vars); + } + } + + + return $vars; + } + + protected function inflectTemplateVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-template$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/template-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectTemplatesVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-templates$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/templates-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectCoreVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-providers$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/-provider$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/-adapter$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectModuleVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-module$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/module-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectModulesVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-modules$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/modules-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectSkinVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-skin$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/skin-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectElementVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-elements$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/elements-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/-element$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/element-$/', '', $vars['install_item_dir']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php new file mode 100644 index 00000000..0ee140ab --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php @@ -0,0 +1,12 @@ + 'core/packages/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php new file mode 100644 index 00000000..05317995 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php @@ -0,0 +1,59 @@ + 'mod/{$name}/', + 'admin_report' => 'admin/report/{$name}/', + 'atto' => 'lib/editor/atto/plugins/{$name}/', + 'tool' => 'admin/tool/{$name}/', + 'assignment' => 'mod/assignment/type/{$name}/', + 'assignsubmission' => 'mod/assign/submission/{$name}/', + 'assignfeedback' => 'mod/assign/feedback/{$name}/', + 'auth' => 'auth/{$name}/', + 'availability' => 'availability/condition/{$name}/', + 'block' => 'blocks/{$name}/', + 'booktool' => 'mod/book/tool/{$name}/', + 'cachestore' => 'cache/stores/{$name}/', + 'cachelock' => 'cache/locks/{$name}/', + 'calendartype' => 'calendar/type/{$name}/', + 'fileconverter' => 'files/converter/{$name}/', + 'format' => 'course/format/{$name}/', + 'coursereport' => 'course/report/{$name}/', + 'customcertelement' => 'mod/customcert/element/{$name}/', + 'datafield' => 'mod/data/field/{$name}/', + 'datapreset' => 'mod/data/preset/{$name}/', + 'editor' => 'lib/editor/{$name}/', + 'enrol' => 'enrol/{$name}/', + 'filter' => 'filter/{$name}/', + 'gradeexport' => 'grade/export/{$name}/', + 'gradeimport' => 'grade/import/{$name}/', + 'gradereport' => 'grade/report/{$name}/', + 'gradingform' => 'grade/grading/form/{$name}/', + 'local' => 'local/{$name}/', + 'logstore' => 'admin/tool/log/store/{$name}/', + 'ltisource' => 'mod/lti/source/{$name}/', + 'ltiservice' => 'mod/lti/service/{$name}/', + 'message' => 'message/output/{$name}/', + 'mnetservice' => 'mnet/service/{$name}/', + 'plagiarism' => 'plagiarism/{$name}/', + 'portfolio' => 'portfolio/{$name}/', + 'qbehaviour' => 'question/behaviour/{$name}/', + 'qformat' => 'question/format/{$name}/', + 'qtype' => 'question/type/{$name}/', + 'quizaccess' => 'mod/quiz/accessrule/{$name}/', + 'quiz' => 'mod/quiz/report/{$name}/', + 'report' => 'report/{$name}/', + 'repository' => 'repository/{$name}/', + 'scormreport' => 'mod/scorm/report/{$name}/', + 'search' => 'search/engine/{$name}/', + 'theme' => 'theme/{$name}/', + 'tinymce' => 'lib/editor/tinymce/plugins/{$name}/', + 'profilefield' => 'user/profile/field/{$name}/', + 'webservice' => 'webservice/{$name}/', + 'workshopallocation' => 'mod/workshop/allocation/{$name}/', + 'workshopeval' => 'mod/workshop/eval/{$name}/', + 'workshopform' => 'mod/workshop/form/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php new file mode 100644 index 00000000..08d5dc4e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php @@ -0,0 +1,47 @@ + 'modules/{$name}/', + 'plugin' => 'plugins/{$vendor}/{$name}/', + 'theme' => 'themes/{$name}/' + ); + + /** + * Format package name. + * + * For package type october-plugin, cut off a trailing '-plugin' if present. + * + * For package type october-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'october-plugin') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'october-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/^oc-|-plugin$/', '', $vars['name']); + $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/^oc-|-theme$/', '', $vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php new file mode 100644 index 00000000..5dd3438d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php @@ -0,0 +1,24 @@ + 'extensions/{$name}/', + 'theme' => 'extensions/themes/{$name}/', + 'translation' => 'extensions/translations/{$name}/', + ); + + /** + * Format package name to lower case and remove ".ontowiki" suffix + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower($vars['name']); + $vars['name'] = preg_replace('/.ontowiki$/', '', $vars['name']); + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = preg_replace('/-translation$/', '', $vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php new file mode 100644 index 00000000..3ca7954c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php @@ -0,0 +1,14 @@ + 'oc-content/plugins/{$name}/', + 'theme' => 'oc-content/themes/{$name}/', + 'language' => 'oc-content/languages/{$name}/', + ); + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php new file mode 100644 index 00000000..1797a22c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php @@ -0,0 +1,59 @@ +.+)\/.+/'; + + protected $locations = array( + 'module' => 'modules/{$name}/', + 'theme' => 'application/views/{$name}/', + 'out' => 'out/{$name}/', + ); + + /** + * getInstallPath + * + * @param PackageInterface $package + * @param string $frameworkType + * @return string + */ + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + $installPath = parent::getInstallPath($package, $frameworkType); + $type = $this->package->getType(); + if ($type === 'oxid-module') { + $this->prepareVendorDirectory($installPath); + } + return $installPath; + } + + /** + * prepareVendorDirectory + * + * Makes sure there is a vendormetadata.php file inside + * the vendor folder if there is a vendor folder. + * + * @param string $installPath + * @return void + */ + protected function prepareVendorDirectory($installPath) + { + $matches = ''; + $hasVendorDirectory = preg_match(self::VENDOR_PATTERN, $installPath, $matches); + if (!$hasVendorDirectory) { + return; + } + + $vendorDirectory = $matches['vendor']; + $vendorPath = getcwd() . '/modules/' . $vendorDirectory; + if (!file_exists($vendorPath)) { + mkdir($vendorPath, 0755, true); + } + + $vendorMetaDataPath = $vendorPath . '/vendormetadata.php'; + touch($vendorMetaDataPath); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php new file mode 100644 index 00000000..170136f9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php new file mode 100644 index 00000000..4e59a8a7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php @@ -0,0 +1,11 @@ + 'bundles/{$name}/', + 'library' => 'libraries/{$name}/', + 'framework' => 'frameworks/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php new file mode 100644 index 00000000..deb2b77a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php @@ -0,0 +1,11 @@ + 'ext/{$vendor}/{$name}/', + 'language' => 'language/{$name}/', + 'style' => 'styles/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php new file mode 100644 index 00000000..4781fa6d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php @@ -0,0 +1,21 @@ + 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php new file mode 100644 index 00000000..c17f4572 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php @@ -0,0 +1,32 @@ + 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php new file mode 100644 index 00000000..903e55f6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php @@ -0,0 +1,29 @@ + '{$name}/' + ); + + /** + * Remove hyphen, "plugin" and format to camelcase + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = explode("-", $vars['name']); + foreach ($vars['name'] as $key => $name) { + $vars['name'][$key] = ucfirst($vars['name'][$key]); + if (strcasecmp($name, "Plugin") == 0) { + unset($vars['name'][$key]); + } + } + $vars['name'] = implode("",$vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Plugin.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Plugin.php new file mode 100644 index 00000000..e60da0e7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Plugin.php @@ -0,0 +1,27 @@ +installer = new Installer($io, $composer); + $composer->getInstallationManager()->addInstaller($this->installer); + } + + public function deactivate(Composer $composer, IOInterface $io) + { + $composer->getInstallationManager()->removeInstaller($this->installer); + } + + public function uninstall(Composer $composer, IOInterface $io) + { + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php new file mode 100644 index 00000000..dbf85e63 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php @@ -0,0 +1,9 @@ + 'app/Containers/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php new file mode 100644 index 00000000..4c8421e3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php @@ -0,0 +1,10 @@ + 'modules/{$name}/', + 'theme' => 'themes/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php new file mode 100644 index 00000000..e6834a0c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php @@ -0,0 +1,22 @@ + 'site/modules/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php new file mode 100644 index 00000000..77cc3dd8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php @@ -0,0 +1,11 @@ + 'modules/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php new file mode 100644 index 00000000..65510580 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php @@ -0,0 +1,63 @@ + 'app/Modules/{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Format package name. + * + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'pxcms-module') { + return $this->inflectModuleVars($vars); + } + + if ($vars['type'] === 'pxcms-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + /** + * For package type pxcms-module, cut off a trailing '-plugin' if present. + * + * return string + */ + protected function inflectModuleVars($vars) + { + $vars['name'] = str_replace('pxcms-', '', $vars['name']); // strip out pxcms- just incase (legacy) + $vars['name'] = str_replace('module-', '', $vars['name']); // strip out module- + $vars['name'] = preg_replace('/-module$/', '', $vars['name']); // strip out -module + $vars['name'] = str_replace('-', '_', $vars['name']); // make -'s be _'s + $vars['name'] = ucwords($vars['name']); // make module name camelcased + + return $vars; + } + + + /** + * For package type pxcms-module, cut off a trailing '-plugin' if present. + * + * return string + */ + protected function inflectThemeVars($vars) + { + $vars['name'] = str_replace('pxcms-', '', $vars['name']); // strip out pxcms- just incase (legacy) + $vars['name'] = str_replace('theme-', '', $vars['name']); // strip out theme- + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); // strip out -theme + $vars['name'] = str_replace('-', '_', $vars['name']); // make -'s be _'s + $vars['name'] = ucwords($vars['name']); // make module name camelcased + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php new file mode 100644 index 00000000..0f78b5ca --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php @@ -0,0 +1,24 @@ + 'src/{$name}/' + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $nameParts = explode('/', $vars['name']); + foreach ($nameParts as &$value) { + $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = str_replace(array('-', '_'), ' ', $value); + $value = str_replace(' ', '', ucwords($value)); + } + $vars['name'] = implode('/', $nameParts); + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php new file mode 100644 index 00000000..252c7339 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php @@ -0,0 +1,10 @@ + 'themes/{$name}/', + 'plugin' => 'plugins/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php new file mode 100644 index 00000000..23a20347 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php @@ -0,0 +1,10 @@ + 'redaxo/src/addons/{$name}/', + 'bestyle-plugin' => 'redaxo/src/addons/be_style/plugins/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php new file mode 100644 index 00000000..09544576 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php @@ -0,0 +1,10 @@ + 'redaxo/include/addons/{$name}/', + 'bestyle-plugin' => 'redaxo/include/addons/be_style/plugins/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php new file mode 100644 index 00000000..d8d795be --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php @@ -0,0 +1,22 @@ + 'plugins/{$name}/', + ); + + /** + * Lowercase name and changes the name to a underscores + * + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(str_replace('-', '_', $vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php new file mode 100644 index 00000000..1acd3b14 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php @@ -0,0 +1,10 @@ + 'Sources/{$name}/', + 'theme' => 'Themes/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php new file mode 100644 index 00000000..7d20d27a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php @@ -0,0 +1,60 @@ + 'engine/Shopware/Plugins/Local/Backend/{$name}/', + 'core-plugin' => 'engine/Shopware/Plugins/Local/Core/{$name}/', + 'frontend-plugin' => 'engine/Shopware/Plugins/Local/Frontend/{$name}/', + 'theme' => 'templates/{$name}/', + 'plugin' => 'custom/plugins/{$name}/', + 'frontend-theme' => 'themes/Frontend/{$name}/', + ); + + /** + * Transforms the names + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'shopware-theme') { + return $this->correctThemeName($vars); + } + + return $this->correctPluginName($vars); + } + + /** + * Changes the name to a camelcased combination of vendor and name + * @param array $vars + * @return array + */ + private function correctPluginName($vars) + { + $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, $vars['name']); + + $vars['name'] = ucfirst($vars['vendor']) . ucfirst($camelCasedName); + + return $vars; + } + + /** + * Changes the name to a underscore separated name + * @param array $vars + * @return array + */ + private function correctThemeName($vars) + { + $vars['name'] = str_replace('-', '_', $vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php new file mode 100644 index 00000000..81910e9f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php @@ -0,0 +1,35 @@ + '{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Return the install path based on package type. + * + * Relies on built-in BaseInstaller behaviour with one exception: silverstripe/framework + * must be installed to 'sapphire' and not 'framework' if the version is <3.0.0 + * + * @param PackageInterface $package + * @param string $frameworkType + * @return string + */ + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + if ( + $package->getName() == 'silverstripe/framework' + && preg_match('/^\d+\.\d+\.\d+/', $package->getVersion()) + && version_compare($package->getVersion(), '2.999.999') < 0 + ) { + return $this->templatePath($this->locations['module'], array('name' => 'sapphire')); + } + + return parent::getInstallPath($package, $frameworkType); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php new file mode 100644 index 00000000..762d94c6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php @@ -0,0 +1,25 @@ + 'modules/{$vendor}/{$name}/', + 'plugin' => 'plugins/{$vendor}/{$name}/' + ); + + public function inflectPackageVars($vars) + { + return $this->parseVars($vars); + } + + protected function parseVars($vars) + { + $vars['vendor'] = strtolower($vars['vendor']) == 'sitedirect' ? 'SiteDirect' : $vars['vendor']; + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php new file mode 100644 index 00000000..a31c9fda --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php @@ -0,0 +1,12 @@ + 'modules/{$name}/', + 'theme' => 'themes/{$name}/', + 'custom-module' => 'app/modules/{$name}/', + 'custom-theme' => 'app/themes/{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php new file mode 100644 index 00000000..8626a9bc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php @@ -0,0 +1,47 @@ + 'app/modules/{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Format module name. + * + * Strip `sydes-` prefix and a trailing '-theme' or '-module' from package name if present. + * + * {@inerhitDoc} + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] == 'sydes-module') { + return $this->inflectModuleVars($vars); + } + + if ($vars['type'] === 'sydes-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + public function inflectModuleVars($vars) + { + $vars['name'] = preg_replace('/(^sydes-|-module$)/i', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/(^sydes-|-theme$)/', '', $vars['name']); + $vars['name'] = strtolower($vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php new file mode 100644 index 00000000..4357a35b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php @@ -0,0 +1,9 @@ + 'themes/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php new file mode 100644 index 00000000..1675c4f2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php @@ -0,0 +1,26 @@ + + */ +class Symfony1Installer extends BaseInstaller +{ + protected $locations = array( + 'plugin' => 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, $vars['name']); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php new file mode 100644 index 00000000..b1663e84 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php @@ -0,0 +1,16 @@ + + */ +class TYPO3CmsInstaller extends BaseInstaller +{ + protected $locations = array( + 'extension' => 'typo3conf/ext/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php new file mode 100644 index 00000000..42572f44 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php @@ -0,0 +1,38 @@ + 'Packages/Application/{$name}/', + 'framework' => 'Packages/Framework/{$name}/', + 'plugin' => 'Packages/Plugins/{$name}/', + 'site' => 'Packages/Sites/{$name}/', + 'boilerplate' => 'Packages/Boilerplates/{$name}/', + 'build' => 'Build/{$name}/', + ); + + /** + * Modify the package name to be a TYPO3 Flow style key. + * + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + $autoload = $this->package->getAutoload(); + if (isset($autoload['psr-0']) && is_array($autoload['psr-0'])) { + $namespace = key($autoload['psr-0']); + $vars['name'] = str_replace('\\', '.', $namespace); + } + if (isset($autoload['psr-4']) && is_array($autoload['psr-4'])) { + $namespace = key($autoload['psr-4']); + $vars['name'] = rtrim(str_replace('\\', '.', $namespace), '.'); + } + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php new file mode 100644 index 00000000..4f79a45f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php @@ -0,0 +1,30 @@ + '{$name}' + ); + + public function inflectPackageVars($vars) + { + $extra = $this->package->getExtra(); + + if (array_key_exists(self::EXTRA_TAO_EXTENSION_NAME, $extra)) { + $vars['name'] = $extra[self::EXTRA_TAO_EXTENSION_NAME]; + return $vars; + } + + $vars['name'] = str_replace('extension-', '', $vars['name']); + $vars['name'] = str_replace('-', ' ', $vars['name']); + $vars['name'] = lcfirst(str_replace(' ', '', ucwords($vars['name']))); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php new file mode 100644 index 00000000..158af526 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php @@ -0,0 +1,12 @@ + 'local/modules/{$name}/', + 'frontoffice-template' => 'templates/frontOffice/{$name}/', + 'backoffice-template' => 'templates/backOffice/{$name}/', + 'email-template' => 'templates/email/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php new file mode 100644 index 00000000..7c0113b8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php @@ -0,0 +1,14 @@ + + */ + class TuskInstaller extends BaseInstaller + { + protected $locations = array( + 'task' => '.tusk/tasks/{$name}/', + 'command' => '.tusk/commands/{$name}/', + 'asset' => 'assets/tusk/{$name}/', + ); + } diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php new file mode 100644 index 00000000..fcb414ab --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php @@ -0,0 +1,9 @@ + 'app/sprinkles/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php new file mode 100644 index 00000000..24ca6451 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php @@ -0,0 +1,10 @@ + 'plugins/{$name}/', + 'theme' => 'themes/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php new file mode 100644 index 00000000..7d90c5e6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php @@ -0,0 +1,49 @@ + 'src/{$vendor}/{$name}/', + 'theme' => 'themes/{$name}/' + ); + + /** + * Format package name. + * + * For package type vgmcp-bundle, cut off a trailing '-bundle' if present. + * + * For package type vgmcp-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'vgmcp-bundle') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'vgmcp-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-bundle$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php new file mode 100644 index 00000000..b65dbbaf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php @@ -0,0 +1,21 @@ + 'modules/addons/{$vendor}_{$name}/', + 'fraud' => 'modules/fraud/{$vendor}_{$name}/', + 'gateways' => 'modules/gateways/{$vendor}_{$name}/', + 'notifications' => 'modules/notifications/{$vendor}_{$name}/', + 'registrars' => 'modules/registrars/{$vendor}_{$name}/', + 'reports' => 'modules/reports/{$vendor}_{$name}/', + 'security' => 'modules/security/{$vendor}_{$name}/', + 'servers' => 'modules/servers/{$vendor}_{$name}/', + 'social' => 'modules/social/{$vendor}_{$name}/', + 'support' => 'modules/support/{$vendor}_{$name}/', + 'templates' => 'templates/{$vendor}_{$name}/', + 'includes' => 'includes/{$vendor}_{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php new file mode 100644 index 00000000..cb387881 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php @@ -0,0 +1,9 @@ + 'wolf/plugins/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php new file mode 100644 index 00000000..91c46ad9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php @@ -0,0 +1,12 @@ + 'wp-content/plugins/{$name}/', + 'theme' => 'wp-content/themes/{$name}/', + 'muplugin' => 'wp-content/mu-plugins/{$name}/', + 'dropin' => 'wp-content/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php new file mode 100644 index 00000000..27f429ff --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php @@ -0,0 +1,32 @@ + 'module/{$name}/', + ); + + /** + * Format package name to CamelCase + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php new file mode 100644 index 00000000..bde9bc8c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php @@ -0,0 +1,11 @@ + 'library/{$name}/', + 'extra' => 'extras/library/{$name}/', + 'module' => 'module/{$name}/', + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php new file mode 100644 index 00000000..56cdf5da --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php @@ -0,0 +1,10 @@ + 'modules/{$vendor}-{$name}/', + 'theme' => 'themes/{$vendor}-{$name}/' + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/bootstrap.php b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/bootstrap.php new file mode 100644 index 00000000..0de276ee --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/composer/installers/src/bootstrap.php @@ -0,0 +1,13 @@ +enableLogging() + ->setLoggingLevel(Icepay_Api_Logger::LEVEL_ALL) + ->logToFile() + ->setLoggingDirectory(realpath("../logs")) + ->setLoggingFile("basicmode.txt") + ->logToScreen(); + + +/* Set the paymentObject */ +$paymentObj = new Icepay_PaymentObject(); +$paymentObj->setAmount(1000) + ->setCountry("NL") + ->setLanguage("NL") + ->setReference("My Sample Website") + ->setDescription("My Sample Payment") + ->setCurrency("EUR") + ->setOrderID(1); + + +try { + // Merchant Settings + $basicmode = Icepay_Basicmode::getInstance(); + $basicmode->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE) + ->validatePayment($paymentObj); + + echo(sprintf("%s",$basicmode->getURL(),$basicmode->getURL())); + +} catch (Exception $e){ + echo($e->getMessage()); +} + + + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_filter.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_filter.php new file mode 100644 index 00000000..82cb5433 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_filter.php @@ -0,0 +1,128 @@ +enableLogging() + ->setLoggingLevel(Icepay_Api_Logger::LEVEL_ALL) + ->logToFile() + ->setLoggingDirectory(realpath("../logs")) + ->setLoggingFile("filter.txt") + ->logToScreen(); + + +// Read paymentmethods from folder, load the classes and filter the data +$api = Icepay_Api_Basic::getInstance() + ->readFolder(realpath('../src/paymentmethods')) + ->prepareFiltering() + ->filterByCurrency("EUR") + ->filterByCountry("NL") + ->filterByAmount(1000) + ->filterByLanguage("EN"); + +// Store the filtered data in an array; +$paymentmethods = $api->getArray(); + +// Checking if the user selected a paymentmethod +if (isset($_POST["paymentmethod"]) && $_POST["paymentmethod"] != ""){ + $postData = $_POST["paymentmethod"]; + //load the paymentmethod class + $paymentmethod = new $postData(); + //Store the issuers for this paymentmethod into an array + $issuers = $paymentmethod->getSupportedIssuers(); +} + +if (isset($_POST["issuer"]) && $_POST["issuer"] != ""){ + try { + + + /* Set the paymentObject */ + $paymentObj = new Icepay_PaymentObject(); + $paymentObj->useBasicPaymentmethodClass($paymentmethod) + ->setAmount(1000) + ->setCountry("NL") + ->setLanguage("NL") + ->setReference("My Sample Website") + ->setDescription("My Sample Payment") + ->setCurrency("EUR") + ->setIssuer($_POST["issuer"]) //Ofcourse you should NEVER use POST values directly in your script like this. + ->setOrderID(); // You should always set the order ID, however, this is ommitted here for testing purposes + + // Merchant Settings + $basicmode = Icepay_Basicmode::getInstance(); + $basicmode->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE) + ->validatePayment($paymentObj) + ->setProtocol("http");// <--- Remove this if you're not on a local machine + + // In this testscript we're printing the url on screen. + echo(sprintf("%s",$basicmode->getURL(),$basicmode->getURL())); + + } catch (Exception $e){ + echo($e->getMessage()); + } + +}; + +/* The following script displays selectboxes. + * Once a valid paymentmethod and issuer have been selected, + * the URL will be generated. + * Note that no OrderID is being used for testing purposes. + */ +?> +
    + +

    Select an Payment method: + +

    + + + +

    Select an Issuer: + +

    +

    + + +
    \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_ideal.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_ideal.php new file mode 100644 index 00000000..699b914f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_ideal.php @@ -0,0 +1,83 @@ +enableLogging() + ->setLoggingLevel(Icepay_Api_Logger::LEVEL_ALL) + ->logToFile() + ->setLoggingDirectory(realpath("../logs")) + ->setLoggingFile("idealsample.txt") + ->logToScreen(); + +// Read paymentmethods from folder and ensures the classes are included +$api = Icepay_Api_Basic::getInstance()->readFolder(realpath('../src/paymentmethods')); + +// Store all paymentmethods in an array, as an example for loading programmatically +$paymentmethods = $api->getArray(); + +// Start a new paymentmethod class +$ideal = new $paymentmethods["ideal"](); //The same as: $ideal = new Icepay_Paymentmethod_Ideal(); + +// Retrieve the paymentmethod issuers for this example +$issuers = $ideal->getSupportedIssuers(); + +try { + + /* Set the payment */ + $paymentObj = new Icepay_PaymentObject(); + $paymentObj->setPaymentMethod($ideal->getCode()) + ->setAmount(1000) + ->setCountry("NL") + ->setLanguage("NL") + ->setReference("My Sample Website") + ->setDescription("My Sample Payment") + ->setCurrency("EUR") + ->setIssuer($issuers[0]) + ->setOrderID(1); + + // Merchant Settings + $basicmode = Icepay_Basicmode::getInstance(); + $basicmode->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE) + ->setProtocol('http') + //->useWebservice() // <--- Want to make a call using the webservices? You can using by using this method + ->validatePayment($paymentObj); // <--- Required! + + // In this testscript we're printing the url on screen. + echo(sprintf("%s",$basicmode->getURL(),$basicmode->getURL())); + +} catch (Exception $e){ + echo($e->getMessage()); +} + + + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_pbm_createlink.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_pbm_createlink.php new file mode 100644 index 00000000..1d33fd0f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_pbm_createlink.php @@ -0,0 +1,59 @@ +setCurrency('EUR') // Default EUR + ->setAmount(200) + ->setCountry('NL') // Default NL + ->setLanguage('NL') // Default NL + ->setDescription('Test API') + ->setReference('API REFERENCE') // By setting a unique reference, you could catch our postback. + ->setOrderID('pbm1000001'); // Order ID does not work yet. + + $pbm = Icepay_Api_Pbm::getInstance(); + + $pbm->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + + $result = $pbm->createLink($pbmObj); + + if (true === $result->success) { + echo $result->url; + } else { + echo $result->errorCode . '
    '; + echo $result->errorMessage; + } +} catch (Exception $e) { + echo $e->getCode() . '
    '; + echo $e->getMessage(); +} + diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_postback.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_postback.php new file mode 100644 index 00000000..93f6b9bd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_postback.php @@ -0,0 +1,83 @@ +enableLogging() + ->setLoggingLevel(Icepay_Api_Logger::LEVEL_ALL) + ->logToFile() + ->setLoggingDirectory(realpath("../logs")) + ->setLoggingFile("postback.txt") + ->logToScreen(); + +/* Start the postback class */ +$icepay = new Icepay_Postback(); +$icepay->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + +$order = new Example_Order(); // This is a dummy class to depict a sample usage. + +try { + if($icepay->validate()){ + // In this example the ICEPAY OrderID is identical to the Order ID used in our project + $order->loadByOrderID($icepay->getOrderID()); + + /* Only update the status if it's a new order (NEW) + * or update the status if the statuscode allowes it. + * In this example the project order status is an ICEPAY statuscode. + */ + if ($order->getStatus() == "NEW" || $icepay->canUpdateStatus($order->getStatus())){ + $order->saveStatus($icepay->getStatus()); //Update the status of your order + $order->sendMail(sprintf("icepay_status_update_to_%s",$order->getStatus())); + } + $order->updateStatusHistory($icepay->getTransactionString()); + echo "Validated!"; + } else die ("Unable to validate postback data"); + + +} catch (Exception $e){ + echo($e->getMessage()); +} + + +/* Example Classes */ + +class Example_Order { + protected $status = "OPEN"; + public function loadByOrderID($id) {} + public function getStatus() {return $this->status;} + public function saveStatus($status) {$this->status = $status;} + public function updateStatusHistory($string) {$this->sendMail($string);} + public function sendMail($string){mail(EMAIL, "api test: ".$this->status, $string);} +} + + + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_result.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_result.php new file mode 100644 index 00000000..3062edb3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_result.php @@ -0,0 +1,84 @@ +enableLogging() + ->setLoggingLevel(Icepay_Api_Logger::LEVEL_ALL) + ->logToFile() + ->setLoggingDirectory(realpath("../logs")) + ->setLoggingFile("result.txt") + ->logToScreen(); + +$icepay = new Icepay_Result(); +$icepay->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + +$order = new Example_Order(); // This is a dummy class to depict a sample usage. + +try { + if($icepay->validate()){ + + switch ($icepay->getStatus()){ + case Icepay_StatusCode::OPEN: + // Close the cart + echo("Thank you, awaiting payment verification."); + break; + case Icepay_StatusCode::SUCCESS: + // Close the cart + echo("Thank you for your purchase. The payment has been received."); + break; + case Icepay_StatusCode::ERROR: + //Redirect to cart + echo(sprintf("An error occurred: %s",$icepay->getStatus(true))); + break; + } + + $order->updateStatusHistory(sprintf("Customer returned with statuscode %s",$icepay->getStatus(true))); + + } else die ("Unable to validate data"); +} catch (Exception $e){ + echo($e->getMessage()); +} + + +/* Example Classes */ + +class Example_Order { + protected $status = "OPEN"; + public function getStatus() {return $this->status;} + public function saveStatus($status) {$this->status = $status;} + public function updateStatusHistory($string) {} + public function sendMail(){} +} + + + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_filteringpaymentmethods.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_filteringpaymentmethods.php new file mode 100644 index 00000000..d782a855 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_filteringpaymentmethods.php @@ -0,0 +1,134 @@ +filtering(); + +try { + /* Filter the paymentmethods stored by using the paymentmethod retrieval service. Sample: sample_webservice_getpaymentmethods.php */ + $filter->loadFromFile("data",realpath("../wsdata")); +} catch (Exception $e){ + echo("Something went wrong, did you use the sample_webservice_getpaymentmethods.php to collect data and store it first?\n
    This is the error messsage: ".$e->getMessage()); + exit(); +} + +if (isset($_POST["currency"]) && $_POST["currency"] != "") $filter->filterByCurrency($_POST["currency"]); +if (isset($_POST["country"]) && $_POST["country"] != "") $filter->filterByCountry($_POST["country"]); +if (isset($_POST["amount"]) && $_POST["amount"] != "") $filter->filterByAmount($_POST["amount"]); + +$sample_currencies = array("EUR","USD","GBP"); +$sample_countries = array("NL","DE","GB"); +$sample_amount = array(300,500,1000); + +?> + +ICEPAY webservice sample: Filter stored paymentmethods + +
    +

    Select currency: + +

    + +

    Select country: + +

    + +

    Select amount: + +

    +

    +

    Select payment method (getFilteredPaymentmethods()) ?> available): + +

    + + + + singleMethod()->importFromString($filter->exportAsString()); + $method->selectPaymentMethodByCode($_POST["paymentmethod"])->selectCountry($_POST["country"]); + ?> +

    Select issuer (getIssuers()) ?> available): + +

    + + +

    + + + +
    +
    +getFilteredPaymentmethods());
    +    exit();
    +}
    +
    +?>
    +
    + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_getpaymentmethods.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_getpaymentmethods.php new file mode 100644 index 00000000..78b585bb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_getpaymentmethods.php @@ -0,0 +1,54 @@ +paymentMethodService(); + +// Configure the service +$service->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE) + ->retrieveAllPaymentmethods() + ->saveToFile("data",realpath("../wsdata")); /* Saves the Paymentmethod array to a file. */ + +/* Alternatively you can also fetch the paymentmethods object and/or array. */ +$paymentMethods = $service->retrieveAllPaymentMethods()->asArray(); + + + +?> + + +Paymentmethods succesfully retrieved from webservice...
    +Use the sample_webservice_filtering.php for an example how to use the stored date and filter it.
    +
    +
    +
    + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_gettransactiondata.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_gettransactiondata.php new file mode 100644 index 00000000..3a1cf80a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_gettransactiondata.php @@ -0,0 +1,62 @@ +paymentService(); +$logger = Icepay_Api_Logger::getInstance(); + +try { + // Merchant Settings + $payment->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + + /* Apply logging rules */ + $logger->enableLogging() + ->setLoggingLevel(Icepay_Api_Logger::LEVEL_ALL) + ->logToFile() + ->setLoggingDirectory(realpath("../logs")) + ->setLoggingFile("getpayment.txt") + ->logToScreen() + ->log('Sample log entry for sample_webservice_getpayment.php', Icepay_Api_Logger::NOTICE); + +} catch (Exception $e) { + echo($e->getMessage()); +} +?> + +
    +getPayment(PAYMENTID));
    +} catch (Exception $e) {
    +    echo($e->getMessage());
    +}
    +?>
    +
    \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_refund.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_refund.php new file mode 100644 index 00000000..70c1708b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_refund.php @@ -0,0 +1,201 @@ +refundService(); +$refund->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); +?> + + + + Icepay - Webservice Samples + + + + +
    +

    Sample Webservice Refund

    +
    + + + + + +
    + Get Payment Refunds + [ Hide this Section ] + + +
    + getPaymentRefunds($_POST['paymentID']); + + if (!empty($refunds)) { ?> + + + + + + + + + + + + + + + +
    Refund IDStatusAmountRequest Date
    RefundID; ?>Status; ?>RefundAmount; ?>DateCreated; ?>
    + +
    +

    The GetPaymentRefunds web method allows you to query refund request information that belongs to the payment.

    + +
    + +
    +
    + + + + + + + + +
    + Request Refund + [ Hide this Section ] + + +
    + requestRefund($paymentID, $paymentAmount, $paymentCurrency); + ?> + + + + + + + + + + + + + +
    Refund IDRefund AmountRefund Remaining AmountTimestamp
    + +
    +

    The RequestRefund web method allows you to initiate a refund request for a payment. You can request + the entire amount to be refunded or just a part of it. If you request only a partial amount to be refunded + then you are allowed to perform refund requests for the same payment until you have reached its full + amount. After that you cannot request refunds anymore for that payment.

    + + + + +
    + +
    +
    + + + + + + + + +
    + Cancel Refund + [ Hide this Section ] + + +
    + cancelRefund($refundID, $paymentID); + + $message = $refund['Success'] ? "Refund was completed" : "Error occured"; + echo $message; + } else { ?> +
    +

    The CancelRefund web method allows you to cancel a refund request if it has not already been processed.

    + + + +
    + +
    +
    + +
    + + + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_reporting.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_reporting.php new file mode 100644 index 00000000..958e6202 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_reporting.php @@ -0,0 +1,277 @@ + New case "Request pincode" +define('REPORTINGUSER', "xxxxxxx"); +define('REPORTINGUSERAGENT', "xxxxxxxxxxxxxxxxxxx"); + +// Include the API into your project +require_once '../src/icepay_api_webservice.php'; + +// Initiate the Refund instance +$reporting = Icepay_Api_Webservice::getInstance()->reportingService(); + +$reporting->setUserName(REPORTINGUSER) + ->setPinCode(REPORTINGPINCODE) + ->setUserAgent(REPORTINGUSERAGENT) + ->setMerchantID(MERCHANTID) + ->useCookie() + ->usePHPSession() + ->initSession(); /* creates session if not loaded from cookie or PHP session */ + + +// To kill your session simply call the killSession() function +// +//$reporting->killSession(); +//exit; +?> + + + + Icepay - Webservice Samples + + + + + +
    +

    Sample Webservice Reporting

    +
    + + + + + + + + +
    + Get Merchants + [ Hide this Section ] + + +
    + getMerchants(); + ?> + + + + + + + + + + + + + +
    Merchant IDDescriptionTestmode
    MerchantID; ?>Description; ?>TestMode) ? 'True' : 'False'; ?>
    + +
    +

    This method allows you to retrieve a list of merchants that belong to your ICEPAY account

    + +
    + +
    +
    + + + + + + + + +
    + Get Payment Methods + [ Hide this Section ] + + +
    + getPaymentMethods(); + ?> + + + + + + + + + + + +
    DescriptionPayment Method Code
    Description; ?>PaymentMethodCode; ?>
    + +
    +

    This method allows you to retrieve a list of all supported payment methods by ICEPAY

    + +
    + +
    +
    + + + + + + + + +
    + Monthly Turnover Totals + [ Hide this Section ] + +
    + MonthlyTurnoverTotals($month, $year); + ?> + + + + + + + + + + + + + + + + + +
    DayMonthYearTransaction CountTurnover
    Day; ?>Month; ?>Year; ?>TransactionsCount; ?>Turnover; ?>
    + +

    + The MonthlyTurnoverTotals web method returns the sum of the turnover of all the transactions according to the provided criteria: month, year and currency.

    + + + + + +
    + +
    +
    + + + + + + + + +
    + Search Payments + [ Hide this Section ] + +
    + searchPayments(array("MerchantID" => $_POST['merchantID'])); + ?> + + + + + + + + + + + + + + + + + +
    Payment IDConsumer IP AddressAmountStatusStatus Code
    PaymentID; ?>ConsumerIPAddress; ?>CurrencyCode} {$payment->Amount}"; ?>Status; ?>StatusCode; ?>
    + +

    Use the SearchPayments web method to search for payments linked to your ICEPAY account. There are + several filters which you can employ for a more detailed search.

    +
    + + +
    +

    Note: For more searchfilters, check the webservice manual under section 6.8 SEARCHPAYMENTS

    + +
    +
    + + +
    + + + + + + + + + +killSession(); + +?> + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_extended_payment.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_extended_payment.php new file mode 100644 index 00000000..c65d0476 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_extended_payment.php @@ -0,0 +1,84 @@ +setInitials('Dhr.') + ->setPrefix('') + ->setLastName('Kwek') + ->setStreet('Zandstraat') + ->setHouseNumber('22') + ->setHouseNumberAddition('') + ->setZipCode('1058EA') + ->setCity('Amsterdam') + ->setCountry('NL'); + +Icepay_Order::getInstance() + ->setConsumer(Icepay_Order_Consumer::create() + ->setConsumerID('1') + ->setEmail('consumer@email.com') + ->setPhone('0611223344') + ) + ->setShippingAddress($address) + ->setBillingAddress($address) + ->addProduct(Icepay_Order_Product::create() + ->setProductID('1') + ->setProductName('iPhone') + ->setDescription('Test Description') + ->setQuantity('1') + ->setUnitPrice('200') + ->setVATCategory(Icepay_Order_VAT::getCategoryForPercentage(21)) + ) + ->setShippingCosts(200); + +$paymentObj = new Icepay_PaymentObject(); +$paymentObj->setAmount(400) + ->setCountry("NL") + ->setLanguage("NL") + ->setIssuer('ACCEPTGIRO') + ->setPaymentMethod('AFTERPAY') + ->setReference("My Sample Website") + ->setDescription("My Sample Payment") + ->setCurrency("EUR") + ->setOrderID('test01'); + + +try { + $webservice = Icepay_Api_Webservice::getInstance()->paymentService(); + $webservice->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + + $transactionObj = $webservice->extendedCheckout($paymentObj); + + printf('%s', $transactionObj->getPaymentScreenURL(), $transactionObj->getPaymentScreenURL()); +} catch (Exception $e) { + echo "
    ";
    +    var_dump($e);
    +    echo "
    "; +} + diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_payment.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_payment.php new file mode 100644 index 00000000..f8b110ce --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_payment.php @@ -0,0 +1,60 @@ +setCountry('NL') + ->setLanguage("EN") + ->setCurrency("EUR") + ->setAmount(300) + ->setPaymentMethod("IDEAL") + ->setIssuer("ING") + ->setOrderID($orderid); + +try { + // Set the service + $service = Icepay_Api_Webservice::getInstance()->paymentService(); + + // Merchant Settings + $service->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + + /* Start the transaction */ + $transactionObj = $service->checkOut($paymentObj); + + /* Display the PaymentScreen URL */ + echo("".$transactionObj->getPaymentScreenURL().""); + +} catch (Exception $e){ + echo($e->getMessage()); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_sms.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_sms.php new file mode 100644 index 00000000..d134eb90 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_start_sms.php @@ -0,0 +1,61 @@ +setCountry('NL') + ->setLanguage("EN") + ->setCurrency("EUR") + ->setAmount(300) + ->setPaymentMethod("SMS") + ->setIssuer("DEFAULT") + ->setOrderID(1); + +try { + + // Set the service + $service = Icepay_Api_Webservice::getInstance()->paymentService(); + + // Merchant Settings + $service->setMerchantID(MERCHANTID) + ->setSecretCode(SECRETCODE); + + /* Start the transaction */ + $data = $service->SmsCheckout($paymentObj); + + var_dump($data); +} catch (Exception $e){ + echo($e->getMessage()); +} + +?> + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_track_user_step.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_track_user_step.php new file mode 100644 index 00000000..afc74d61 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/samples/sample_webservice_track_user_step.php @@ -0,0 +1,40 @@ +setAmount(400) + ->setCountry("NL") + ->setLanguage("NL") + ->setIssuer('ACCEPTGIRO') + ->setPaymentMethod('AFTERPAY') + ->setReference("My Sample Website") + ->setDescription("My Sample Payment") + ->setCurrency("EUR") + ->setOrderID('test01'); + + +try { + $webservice = Icepay_Api_Webservice::getInstance()->paymentService(); + $webservice->setMerchantID(MERCHANTID)->setSecretCode(SECRETCODE); + + $transactionObj = $webservice->extendedCheckout($paymentObj); + $orderID = $transactionObj->getOrderID(); + + $order = new Order(); + // We update the user order so we know he was redirect to icepay + $order->update($orderID, array( + 'status' => 'USER_REDIRECTED' + )); + + printf('%s', $transactionObj->getPaymentScreenURL(), 'Pay via icepay'); +} catch (Exception $e) { + var_dump($e); +} + +/** + * Example Order Class + */ +class Order +{ + public function update($id, $attributes = array()) { + // Store this data somewhere + } +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_base.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_base.php new file mode 100644 index 00000000..d332907c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_base.php @@ -0,0 +1,1557 @@ +data = $data; + } + + public function getPaymentScreenURL() + { + return $this->data->PaymentScreenURL; + } + + public function getPaymentID() + { + return $this->data->PaymentID; + } + + public function getProviderTransactionID() + { + return $this->data->ProviderTransactionID; + } + + public function getTestMode() + { + return $this->data->TestMode; + } + + public function getTimestamp() + { + return $this->data->Timestamp; + } + + public function getEndUserIP() + { + return $this->data->EndUserIP; + } + + public function getOrderID() + { + return $this->data->OrderID; + } +} + +/** + * The Payment Object is the class for a payment. Can be instanced if desired, although the instance isnt used within the API. + * + * @author Olaf Abbenhuis + * @since 2.1.1 + */ +class Icepay_PaymentObject implements Icepay_PaymentObject_Interface_Abstract { + + protected $data; + protected $api_type = "webservice"; + protected $pm_class; + private static $instance; + + /** + * Construct of Icepay_PaymentObject + * @since version 2.1.1 + * @access public + */ + public function __construct() + { + // Instantiate $this->data explicitely for PHP Strict error reporting + $this->data = new stdClass(); + } + + public static function getInstance() + { + if (!self::$instance) + self::$instance = new self(); + return self::$instance; + } + + /** + * Set all fields in one method + * @since version 2.1.0 + * @access public + * @param object $data + */ + public function setData($data) + { + $this->data = $data; + } + + /** + * Get all data as an object + * @since version 2.1.0 + * @access public + * @return object + */ + public function getData() + { + return $this->data; + } + + /** + * Load a paymentmethod class for Basic + * @since version 2.1.0 + * @access protected + */ + protected function loadBasicPaymentMethodClass() + { + + if (!class_exists("Icepay_Api_Basic")) + return $this; + + $this->pm_class = Icepay_Api_Basic::getInstance() + ->readFolder() + ->getClassByPaymentMethodCode($this->data->ic_paymentmethod); + + if (count($this->pm_class->getSupportedIssuers()) == 1) { + $this->setIssuer(current($this->pm_class->getSupportedIssuers())); + } + return $this; + } + + /** + * Get all data as an object + * @since version 2.1.0 + * @access public + * @return Icepay_Basic_Paymentmethod_Interface_Abstract + */ + public function getBasicPaymentmethodClass() + { + return $this->pm_class; + } + + /** + * Set the country field + * @since version 1.0.0 + * @access public + * @param string $currency Country ISO 3166-1-alpha-2 code !Required + * @example setCountry("NL") // Netherlands + */ + public function setCountry($country) + { + $country = strtoupper($country); + if (!Icepay_Parameter_Validation::country($country)) + throw new Exception('Country not valid'); + $this->data->ic_country = $country; + return $this; + } + + /** + * Set the currency field + * @since version 1.0.0 + * @access public + * @param string $currency Language ISO 4217 code !Required + * @example setCurrency("EUR") // Euro + */ + public function setCurrency($currency) + { + $this->data->ic_currency = $currency; + return $this; + } + + /** + * Set the language field + * @since version 1.0.0 + * @access public + * @param string $lang Language ISO 639-1 code !Required + * @example setLanguage("EN") // English + */ + public function setLanguage($lang) + { + if (!Icepay_Parameter_Validation::language($lang)) + throw new Exception('Language not valid'); + $this->data->ic_language = $lang; + return $this; + } + + /** + * Set the amount field + * @since version 1.0.0 + * @access public + * @param int $amount !Required + */ + public function setAmount($amount) + { + $amount = (int) (string) $amount; + + if (!Icepay_Parameter_Validation::amount($amount)) + throw new Exception('Amount not valid'); + $this->data->ic_amount = $amount; + return $this; + } + + /** + * Set the order ID field (optional) + * @since version 1.0.0 + * @access public + * @param string $id + */ + public function setOrderID($id = "") + { + $this->data->ic_orderid = $id; + return $this; + } + + /** + * Set the reference field (optional) + * @since version 1.0.0 + * @access public + * @param string $reference + */ + public function setReference($reference = "") + { + $this->data->ic_reference = $reference; + return $this; + } + + /** + * Set the description field (optional) + * @since version 1.0.0 + * @access public + * @param string $info + */ + public function setDescription($info = "") + { + $this->data->ic_description = $info; + return $this; + } + + /** + * Sets the issuer and checks if the issuer exists within the paymentmethod + * @since version 1.0.0 + * @access public + * @param string $issuer ICEPAY Issuer code + */ + public function setIssuer($issuer) + { + $this->data->ic_issuer = $issuer; + return $this; + } + + public function setXML($xml) + { + $this->data->ic_xml = $xml; + return $this; + } + + /** + * Sets the payment method and checks if the method exists within the class + * @since version 1.0.0 + * @access public + * @param string $paymentMethod ICEPAY Payment method code + */ + public function setPaymentMethod($paymentMethod) + { + $this->data->ic_paymentmethod = $paymentMethod; + $this->loadBasicPaymentMethodClass(); + return $this; + } + + public function getCountry() + { + return $this->data->ic_country; + } + + public function getCurrency() + { + return $this->data->ic_currency; + } + + public function getLanguage() + { + return $this->data->ic_language; + } + + public function getAmount() + { + return $this->data->ic_amount; + } + + public function getOrderID() + { + return $this->data->ic_orderid; + } + + public function getReference() + { + return (isset($this->data->ic_reference) ? $this->data->ic_reference : null); + } + + public function getDescription() + { + return (isset($this->data->ic_description) ? $this->data->ic_description : null); + } + + public function getIssuer() + { + return (isset($this->data->ic_issuer) ? $this->data->ic_issuer : null); + } + + public function getPaymentMethod() + { + return (isset($this->data->ic_paymentmethod) ? $this->data->ic_paymentmethod : null); + } + + public function getXML() + { + return $this->data->ic_xml; + } + +} + +/** + * The Icepay_Paymentmethod is the base class for all payment method subclasses + * + * @author Olaf Abbenhuis + * @since 2.1.0 + */ +class Icepay_Paymentmethod implements Icepay_Basic_Paymentmethod_Interface_Abstract { + + public $_version = null; + public $_method = null; + public $_readable_name = null; + public $_issuer = null; + public $_country = null; + public $_language = null; + public $_currency = null; + public $_amount = null; + + /** + * Get the version of the API or the loaded payment method class + * @since version 1.0.1 + * @access public + * @return string + */ + public function getCode() + { + return $this->_method; + } + + /** + * Get the version of the API or the loaded payment method class + * @since version 1.0.1 + * @access public + * @return string + */ + public function getReadableName() + { + return $this->_readable_name; + } + + /** + * Get the supported issuers of the loaded paymentmethod + * @since version 1.0.0 + * @access public + * @return array The issuer codes of the paymentmethod + */ + public function getSupportedIssuers() + { + return $this->_issuer; + } + + /** + * Get the supported countries of the loaded paymentmethod + * @since version 1.0.0 + * @access public + * @return array The country codes of the paymentmethod + */ + public function getSupportedCountries() + { + return $this->_country; + } + + /** + * Get the supported currencies of the loaded paymentmethod + * @since version 1.0.0 + * @access public + * @return array The currency codes of the paymentmethod + */ + public function getSupportedCurrency() + { + return $this->_currency; + } + + /** + * Get the supported languages of the loaded paymentmethod + * @since version 1.0.0 + * @access public + * @return array The Language codes of the paymentmethod + */ + public function getSupportedLanguages() + { + return $this->_language; + } + + /** + * Get the general amount range of the loaded paymentmethod + * @since version 1.0.0 + * @access public + * @return array [minimum(uint), maximum(uint)] + */ + public function getSupportedAmountRange() + { + return $this->_amount; + } + +} + +/** + * Icepay_StatusCode static class + * Contains the payment statuscode constants + * + * @author Olaf Abbenhuis + * @since 1.0.0 + */ +class Icepay_StatusCode { + + const OPEN = "OPEN"; + const AUTHORIZED = "AUTHORIZED"; + const ERROR = "ERR"; + const SUCCESS = "OK"; + const REFUND = "REFUND"; + const CHARGEBACK = "CBACK"; + +} + +/** + * Icepay_Project_Helper class + * A helper for all-in-one solutions + * + * @author Olaf Abbenhuis + * @since 1.0.0 + * + */ +class Icepay_Project_Helper { + + private static $instance; + private $_release = "2.5.3"; + private $_basic; + private $_result; + private $_postback; + private $_validate; + + /** + * Returns the Icepay_Basicmode class or creates it + * + * @since 1.0.0 + * @access public + * @return \Icepay_Basicmode + */ + public function basic() + { + if (!isset($this->_basic)) + $this->_basic = new Icepay_Basicmode(); + return $this->_basic; + } + + /** + * Returns the Icepay_Result class or creates it + * + * @since 1.0.0 + * @access public + * @return \Icepay_Result + */ + public function result() + { + if (!isset($this->_result)) + $this->_result = new Icepay_Result(); + return $this->_result; + } + + /** + * Returns the Icepay_Postback class or creates it + * + * @since 1.0.0 + * @access public + * @return \Icepay_Postback + */ + public function postback() + { + if (!isset($this->_postback)) + $this->_postback = new Icepay_Postback(); + return $this->_postback; + } + + /** + * Returns the Icepay_Paramater_Validation class or creates it + * + * @since 1.1.0 + * @access public + * @return \Icepay_Parameter_Validation + */ + public function validate() + { + if (!isset($this->_validate)) + $this->_postback = new Icepay_Parameter_Validation(); + return $this->_validate; + } + + /** + * Returns the current release version + * + * @since 1.1.0 + * @access public + * @return string + */ + public function getReleaseVersion() + { + return $this->_release; + } + + /** + * Create an instance + * @since version 1.0.2 + * @access public + * @return instance of self + */ + public static function getInstance() + { + if (!self::$instance) + self::$instance = new self(); + return self::$instance; + } + +} + +/** + * Icepay_Api_Base class + * Basic Setters and Getters required in most API + * + * @author Olaf Abbenhuis + * @author Wouter van Tilburg + * @package API_Base + * @since 1.0.0 + * @version 1.0.2 + * + */ +class Icepay_Api_Base { + + private $_pinCode; + protected $_merchantID; + protected $_secretCode; + protected $_method = null; + protected $_issuer = null; + protected $_country = null; + protected $_language = null; + protected $_currency = null; + protected $_version = "1.0.2"; + protected $_doIPCheck = array(); + protected $_whiteList = array(); + protected $data; + protected $_logger; + + public function __construct() + { + $this->_logger = Icepay_Api_Logger::getInstance(); + $this->data = new stdClass(); + } + + /** + * Validate data + * @since version 1.0.0 + * @access public + * @param string $needle + * @param array $haystack + * @return boolean + */ + public function exists($needle, $haystack = null) + { + $result = true; + if ($haystack && $result && $haystack[0] != "00") + $result = in_array($needle, $haystack); + return $result; + } + + /** + * Get the version of the API or the loaded payment method class + * @since 1.0.0 + * @access public + * @return string Version + */ + public function getVersion() + { + return $this->version; + } + + /** + * Set the Merchant ID field + * @since 1.0.0 + * @access public + * @param (int) $merchantID + */ + public function setMerchantID($merchantID) + { + if (!Icepay_Parameter_Validation::merchantID($merchantID)) + throw new Exception('MerchantID not valid'); + + $this->_merchantID = (int) $merchantID; + + return $this; + } + + /** + * Get the Merchant ID field + * @since 1.0.0 + * @access public + * @return (int) MerchantID + */ + public function getMerchantID() + { + return $this->_merchantID; + } + + /** + * Set the Secret Code field + * @since 1.0.0 + * @access public + * @param (string) $secretCode + */ + public function setSecretCode($secretCode) + { + if (!Icepay_Parameter_Validation::secretCode($secretCode)) + throw new Exception('Secretcode not valid'); + + $this->_secretCode = (string) $secretCode; + return $this; + } + + /** + * Get the Secret Code field + * @since 1.0.0 + * @access protected + * @return (string) Secret Code + */ + protected function getSecretCode() + { + return $this->_secretCode; + } + + /** + * Set the Pin Code field + * @since 1.0.1 + * @access public + * @param (int) $pinCode + */ + public function setPinCode($pinCode) + { + if (!Icepay_Parameter_Validation::pinCode($pinCode)) + throw new Exception('Pincode not valid'); + + $this->_pinCode = (string) $pinCode; + + return $this; + } + + /** + * Get the Pin Code field + * @since 1.0.0 + * @access protected + * @return (int) PinCode + */ + protected function getPinCode() + { + return $this->_pinCode; + } + + /** + * Set the success url field (optional) + * @since version 1.0.1 + * @access public + * @param string $url + */ + public function setSuccessURL($url = "") + { + if (!isset($this->data)) + $this->data = new stdClass(); + + $this->data->ic_urlcompleted = $url; + + return $this; + } + + /** + * Set the error url field (optional) + * @since version 1.0.1 + * @access public + * @param string $url + */ + public function setErrorURL($url = "") + { + if (!isset($this->data)) + $this->data = new stdClass(); + + $this->data->ic_urlerror = $url; + return $this; + } + + /** + * Get the success URL + * @since version 2.1.0 + * @access public + * @return string $url + */ + public function getSuccessURL() + { + return (isset($this->data->ic_urlcompleted)) ? $this->data->ic_urlcompleted : ""; + } + + /** + * Get the error URL + * @since version 2.1.0 + * @access public + * @return string $url + */ + public function getErrorURL() + { + return (isset($this->data->ic_urlerror)) ? $this->data->ic_urlerror : ""; + } + + public function getTimestamp() + { + return gmdate("Y-m-d\TH:i:s\Z"); + } + +} + +/** + * Icepay_Parameter_Validation class + * Validates parameters + * + * @author Olaf Abbenhuis + * @since 2.1.0 + */ +class Icepay_Parameter_Validation { + + protected $_version = "1.0.0"; + + /** + * Check if Merchant ID is valid + * + * @since 2.1.0 + * @access public + * @param string $string + * @return bool + */ + public static function merchantID($string) + { + return (strlen($string) == 5 && is_numeric($string)); + } + + /** + * Check if Secret Code is valid + * + * @since 2.1.0 + * @access public + * @param sring $string + * @return bool + */ + public static function secretCode($string) + { + return (strlen($string) == 40 && !is_numeric($string)); + } + + /** + * Check if Pin Code is valid + * + * @since 2.1.0 + * @access public + * @param string $string + * @return bool + */ + public static function pinCode($string) + { + return (strlen($string) == 8 && is_numeric($string)); + } + + /** + * Check if Country is valid + * + * @since 2.1.0 + * @access public + * @param string $string + * @return bool + */ + public static function country($string) + { + return (strlen($string) == 2); + } + + /** + * Check if Language is valid + * + * @since 2.1.0 + * @access public + * @param string $string + * @return bool + */ + public static function language($string) + { + return (strlen($string) == 2 && !is_numeric($string)); + } + + /** + * Check if Currency is valid + * + * @since 2.1.0 + * @access public + * @param string $string + * @return bool + */ + public static function currency($string) + { + return (strlen($string) == 3 && !is_numeric($string)); + } + + /** + * Check if Amount is valid + * + * @since 2.1.0 + * @access public + * @param int $number + * @return bool + */ + public static function amount($number) + { + return (is_numeric($number)); + } + + public static function orderID($orderID) + { + return (strlen($orderID) < 11); + } + +} + +/** + * Icepay_Api_Logger + * Handles all the logging + * + * @author Olaf Abbenhuis + * @author Wouter van Tilburg + * @since 2.1.0 + */ +class Icepay_Api_Logger { + + private static $instance; + + const NOTICE = 1; + const TRANSACTION = 2; + const ERROR = 4; + const LEVEL_ALL = 1; + const LEVEL_TRANSACTION = 2; + const LEVEL_ERRORS = 4; + const LEVEL_ERRORS_AND_TRANSACTION = 8; + + private $version = '1.0.0'; + protected $_loggingDirectory = 'logs'; + protected $_loggingFile = 'log.txt'; + protected $_loggingEnabled = false; + protected $_logToFile = false; + protected $_logToScreen = false; + protected $_logToHook = false; + protected $_logHookClass = null; + protected $_logHookFunc = null; + protected $_logLevel = 14; // Log errors and transactions + + /** + * Enables logging + * + * @since 2.1.0 + * @access public + * @return \Icepay_Basicmode + */ + + public function enableLogging($bool = true) + { + $this->_loggingEnabled = $bool; + + return $this; + } + + /** + * Enables logging to file + * + * @since 2.1.0 + * @access public + * @param bool $bool + * @return \Icepay_Basicmode + */ + public function logToFile($bool = true) + { + $this->_logToFile = $bool; + + return $this; + } + + /** + * Enables logging to screen + * + * @since 2.1.0 + * @access public + * @param bool $bool + * @return \Icepay_Basicmode + */ + public function logToScreen($bool = true) + { + $this->_logToScreen = $bool; + + return $this; + } + + /** + * Enable or disable logging to a hooked class + * + * @since 2.1.0 + * @access public + * @param string $className + * @param string $logFunction + * @param bool $bool + * @return \Icepay_Basicmode + */ + public function logToFunction($className = null, $logFunction = null, $bool = true) + { + $this->_logToHook = $bool; + + if (class_exists($className)) + $this->_logHookClass = new $className; + + if (is_callable($logFunction)) + $this->_logHookFunc = $logFunction; + + return $this; + } + + /** + * Set the directory of the logging file + * + * @since 2.1.0 + * @access public + * @param type $dirName + * @return \Icepay_Basicmode + */ + public function setLoggingDirectory($dirName = null) + { + if ($dirName) + $this->_loggingDirectory = $dirName; + + return $this; + } + + /** + * Set the logging file + * + * @since 2.1.0 + * @access public + * @param string $fileName + * @return \Icepay_Basicmode + */ + public function setLoggingFile($fileName = null) + { + if ($fileName) + $this->_loggingFile = $fileName; + + return $this; + } + + /** + * Set the logging level + * + * @since 2.1.0 + * @access public + * @param int $level + */ + public function setLoggingLevel($level) + { + switch ($level) { + case Icepay_Api_Logger::LEVEL_ALL: + $this->_setLoggingFlag(Icepay_Api_Logger::NOTICE); + $this->_setLoggingFlag(Icepay_Api_Logger::TRANSACTION); + $this->_setLoggingFlag(Icepay_Api_Logger::ERROR); + break; + case Icepay_Api_Logger::LEVEL_ERRORS: + $this->_setLoggingFlag(Icepay_Api_Logger::NOTICE, false); + $this->_setLoggingFlag(Icepay_Api_Logger::TRANSACTION, false); + $this->_setLoggingFlag(Icepay_Api_Logger::ERROR); + break; + case Icepay_Api_Logger::LEVEL_TRANSACTION: + $this->_setLoggingFlag(Icepay_Api_Logger::NOTICE, false); + $this->_setLoggingFlag(Icepay_Api_Logger::TRANSACTION); + $this->_setLoggingFlag(Icepay_Api_Logger::ERROR, false); + break; + case Icepay_Api_Logger::LEVEL_ERRORS_AND_TRANSACTION: + $this->_setLoggingFlag(Icepay_Api_Logger::NOTICE, false); + $this->_setLoggingFlag(Icepay_Api_Logger::TRANSACTION); + $this->_setLoggingFlag(Icepay_Api_Logger::ERROR); + break; + } + + return $this; + } + + /* + * Set the logging flag + * + * @since 2.1.0 + * @access private + * @param int $flag + * @param bool $boolean + */ + + private function _setLoggingFlag($flag, $boolean = true) + { + if ($boolean) { + $this->_logLevel |= $flag; + } else { + $this->_logLevel &= ~$flag; + } + } + + /* + * Check if type is exists + * + * @since 2.1.0 + * @access private + * @param int $type + * @return bool + */ + + private function _isLoggingSet($type) + { + return (($this->_logLevel & $type) == $type); + } + + /** + * Log given line + * + * @since 2.1.0 + * @access public + * @param string $line + * @param int $level + * @return boolean + * @throws Exception + */ + public function log($line, $level = 1) + { + // Check if logging is enabled + if (!$this->_loggingEnabled) + return false; + + // Check if the level is within the required level + if (!$this->_isLoggingSet($level)) + return false; + + $dateTime = date("H:i:s", time()); + $line = "{$dateTime} [ICEPAY]: {$line}" . PHP_EOL; + + // Log to Screen + if ($this->_logToScreen) + echo "{$line}
    "; + + // Log to Hooked Class + if ($this->_logToHook && $this->_logHookClass && $this->_logHookFunc) { + $function = $this->_logHookFunc; + $this->_logHookClass->$function($line); + } + + + // Log to Default File + if ($this->_logToFile) { + $file = $this->_loggingDirectory . DS . $this->_loggingFile; + + try { + $fp = fopen($file, "a"); + fwrite($fp, $line); + fclose($fp); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + }; + } + } + + /** + * Get version of API Logger + * + * @since 2.1.0 + * @access public + * @return version + */ + public function getVersion() + { + return $this->version; + } + + /** + * Create an instance + * + * @since 2.1.0 + * @access public + * @return instance of self + */ + public static function getInstance() + { + if (!self::$instance) + self::$instance = new self(); + return self::$instance; + } + +} + +/** + * Icepay_Postback class + * To handle the postback + * + * @author Olaf Abbenhuis + * @author Wouter van Tilburg + * + * @since 1.0.0 + */ +class Icepay_Postback extends Icepay_Api_Base { + + public function __construct() + { + parent::__construct(); + $this->data = new stdClass(); + } + + /** + * Return minimized transactional data + * @since version 1.0.0 + * @access public + * @return string + */ + public function getTransactionString() + { + return sprintf( + "Paymentmethod: %s \n| OrderID: %s \n| Status: %s \n| StatusCode: %s \n| PaymentID: %s \n| TransactionID: %s \n| Amount: %s", isset($this->data->paymentMethod) ? $this->data->paymentMethod : "", isset($this->data->orderID) ? $this->data->orderID : "", isset($this->data->status) ? $this->data->status : "", isset($this->data->statusCode) ? $this->data->statusCode : "", isset($this->data->paymentID) ? $this->data->paymentID : "", isset($this->data->transactionID) ? $this->data->transactionID : "", isset($this->data->amount) ? $this->data->amount : "" + ); + } + + /** + * Return the statuscode field + * @since version 1.0.0 + * @access public + * @return string + */ + public function getStatus() + { + return (isset($this->data->status)) ? $this->data->status : null; + } + + /** + * Return the orderID field + * @since version 1.0.0 + * @access public + * @return string + */ + public function getOrderID() + { + return (isset($this->data->orderID)) ? $this->data->orderID : null; + } + + /** + * Return the postback checksum + * @since version 1.0.0 + * @access protected + * @return string SHA1 encoded + */ + protected function generateChecksumForPostback() + { + return sha1( + sprintf("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s", $this->_secretCode, $this->_merchantID, $this->data->status, $this->data->statusCode, $this->data->orderID, $this->data->paymentID, $this->data->reference, $this->data->transactionID, $this->data->amount, $this->data->currency, $this->data->duration, $this->data->consumerIPAddress + ) + ); + } + + /** + * Return the version checksum + * @since version 1.0.2 + * @access protected + * @return string SHA1 encoded + */ + protected function generateChecksumForVersion() + { + return sha1( + sprintf("%s|%s|%s|%s", $this->_secretCode, $this->_merchantID, $this->data->status, substr(strval(time()), 0, 8) + ) + ); + } + + /** + * Returns the postback response parameter names, useful for a database install script + * @since version 1.0.1 + * @access public + * @return array + */ + public function getPostbackResponseFields() + { + return array( + //object reference name => post param name + "status" => "Status", + "statusCode" => "StatusCode", + "merchant" => "Merchant", + "orderID" => "OrderID", + "paymentID" => "PaymentID", + "reference" => "Reference", + "transactionID" => "TransactionID", + "consumerName" => "ConsumerName", + "consumerAccountNumber" => "ConsumerAccountNumber", + "consumerBIC" => "ConsumerBIC", + "consumerAddress" => "ConsumerAddress", + "consumerHouseNumber" => "ConsumerHouseNumber", + "consumerCity" => "ConsumerCity", + "consumerCountry" => "ConsumerCountry", + "consumerEmail" => "ConsumerEmail", + "consumerPhoneNumber" => "ConsumerPhoneNumber", + "consumerIPAddress" => "ConsumerIPAddress", + "amount" => "Amount", + "currency" => "Currency", + "duration" => "Duration", + "paymentMethod" => "PaymentMethod", + "checksum" => "Checksum"); + } + + /** + * Validate for version check + * @since version 1.0.2 + * @access public + * @return boolean + */ + public function validateVersion() + { + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->_logger->log('Invalid request method', Icepay_Api_Logger::ERROR); + return false; + } + + if ($this->generateChecksumForVersion() != $this->data->checksum) { + $this->_logger->log('Checksum does not match', Icepay_Api_Logger::ERROR); + return false; + } + + return true; + } + + /** + * Has Version Check status + * @since version 1.0.2 + * @access public + * @return boolean + */ + public function isVersionCheck() + { + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->_logger->log('Invalid request method', Icepay_Api_Logger::ERROR); + return false; + } + + if ($this->data->status != "VCHECK") + return false; + + return true; + } + + /** + * Validate the postback data + * @since version 1.0.0 + * @access public + * @return boolean + */ + public function validate() + { + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->_logger->log("Invalid request method", Icepay_Api_Logger::ERROR); + return false; + }; + + $this->_logger->log(sprintf("Postback: %s", serialize($_POST)), Icepay_Api_Logger::TRANSACTION); + + /* @since version 1.0.2 */ + foreach ($this->getPostbackResponseFields() as $obj => $param) { + $this->data->$obj = (isset($_POST[$param])) ? $_POST[$param] : ""; + } + + if ($this->isVersionCheck()) + return false; + + if (!Icepay_Parameter_Validation::merchantID($this->data->merchant)) { + $this->_logger->log("Merchant ID is not numeric: {$this->data->merchant}", Icepay_Api_Logger::ERROR); + return false; + } + + if (!Icepay_Parameter_Validation::amount($this->data->amount)) { + $this->_logger->log("Amount is not numeric: {$this->data->amount}", Icepay_Api_Logger::ERROR); + return false; + } + + if ($this->_merchantID != $this->data->merchant) { + $this->_logger->log("Invalid Merchant ID: {$this->data->merchant}", Icepay_Api_Logger::ERROR); + return false; + } + + if (!in_array(strtoupper($this->data->status), array( + Icepay_StatusCode::OPEN, + Icepay_StatusCode::AUTHORIZED, + Icepay_StatusCode::SUCCESS, + Icepay_StatusCode::ERROR, + Icepay_StatusCode::REFUND, + Icepay_StatusCode::CHARGEBACK + ))) { + $this->_logger->log("Unknown status: {$this->data->status}", Icepay_Api_Logger::ERROR); + return false; + } + + if ($this->generateChecksumForPostback() != $this->data->checksum) { + $this->_logger->log("Checksum does not match", Icepay_Api_Logger::ERROR); + return false; + } + return true; + } + + /** + * Return the postback data + * @since version 1.0.0 + * @access public + * @return object + */ + public function getPostback() + { + return $this->data; + } + + /** + * Check between ICEPAY statuscodes whether the status can be updated. + * @since version 1.0.0 + * @access public + * @param string $currentStatus The ICEPAY statuscode of the order before a statuschange + * @return boolean + */ + public function canUpdateStatus($currentStatus) + { + if (!isset($this->data->status)) { + $this->_logger->log("Status not set", Icepay_Api_Logger::ERROR); + return false; + } + + switch ($this->data->status) { + case Icepay_StatusCode::SUCCESS: return ($currentStatus == Icepay_StatusCode::ERROR || $currentStatus == Icepay_StatusCode::AUTHORIZED || $currentStatus == Icepay_StatusCode::OPEN); + case Icepay_StatusCode::OPEN: return ($currentStatus == Icepay_StatusCode::OPEN); + case Icepay_StatusCode::AUTHORIZED: return ($currentStatus == Icepay_StatusCode::OPEN); + case Icepay_StatusCode::ERROR: return ($currentStatus == Icepay_StatusCode::OPEN || $currentStatus == Icepay_StatusCode::AUTHORIZED); + case Icepay_StatusCode::CHARGEBACK: return ($currentStatus == Icepay_StatusCode::SUCCESS); + case Icepay_StatusCode::REFUND: return ($currentStatus == Icepay_StatusCode::SUCCESS); + default: + return false; + }; + } + +} + +/** + * Icepay_Result class + * To handle the success and error page + * + * @author Olaf Abbenhuis + * @since 1.0.0 + */ +class Icepay_Result extends Icepay_Api_Base { + + public function __construct() + { + parent::__construct(); + $this->data = new stdClass(); + } + + /** + * Validate the ICEPAY GET data + * @since version 1.0.0 + * @access public + * @return boolean + */ + public function validate() + { + if ($_SERVER['REQUEST_METHOD'] != 'GET') { + $this->_logger->log("Invalid request method", Icepay_Api_Logger::ERROR); + return false; + } + + $this->_logger->log(sprintf("Page data: %s", serialize($_GET)), Icepay_Api_Logger::NOTICE); + + $this->data->status = (isset($_GET['Status'])) ? $_GET['Status'] : ""; + $this->data->statusCode = (isset($_GET['StatusCode'])) ? $_GET['StatusCode'] : ""; + $this->data->merchant = (isset($_GET['Merchant'])) ? $_GET['Merchant'] : ""; + $this->data->orderID = (isset($_GET['OrderID'])) ? $_GET['OrderID'] : ""; + $this->data->paymentID = (isset($_GET['PaymentID'])) ? $_GET['PaymentID'] : ""; + $this->data->reference = (isset($_GET['Reference'])) ? $_GET['Reference'] : ""; + $this->data->transactionID = (isset($_GET['TransactionID'])) ? $_GET['TransactionID'] : ""; + $this->data->checksum = (isset($_GET['Checksum'])) ? $_GET['Checksum'] : ""; + + if ($this->generateChecksumForPage() != $this->data->checksum) { + $this->_logger->log("Checksum does not match", Icepay_Api_Logger::ERROR); + return false; + } + + return true; + } + + /** + * Get the ICEPAY status + * @since version 1.0.0 + * @access public + * @param boolean $includeStatusCode Add the statuscode message to the returned string for display purposes + * @return string ICEPAY statuscode (and statuscode message) + */ + public function getStatus($includeStatusCode = false) + { + if (!isset($this->data->status)) + return null; + return ($includeStatusCode) ? sprintf("%s: %s", $this->data->status, $this->data->statusCode) : $this->data->status; + } + + /** + * Return the orderID field + * @since version 1.0.2 + * @access public + * @return string + */ + public function getOrderID() + { + return (isset($this->data->orderID)) ? $this->data->orderID : null; + } + + /** + * Return the result page checksum + * @since version 1.0.0 + * @access protected + * @return string SHA1 hash + */ + protected function generateChecksumForPage() + { + return sha1( + sprintf("%s|%s|%s|%s|%s|%s|%s|%s", $this->_secretCode, $this->data->merchant, $this->data->status, $this->data->statusCode, $this->data->orderID, $this->data->paymentID, $this->data->reference, $this->data->transactionID + ) + ); + } + + /** + * Return the get data + * @since version 1.0.1 + * @access public + * @return object + */ + public function getResultData() + { + return $this->data; + } + +} + +?> \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_basic.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_basic.php new file mode 100644 index 00000000..ab79c4fa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_basic.php @@ -0,0 +1,554 @@ +_folderPaymentMethods = $dir; + return $this; + } + + /** + * Store the paymentmethod class names in the paymentmethods array. + * @since version 1.0.0 + * @access public + * @param string $dir Folder of the paymentmethod classes + */ + public function readFolder($dir = null) { + $this->setPaymentMethodsFolder(DIR . DS . 'paymentmethods'); + + if ($dir) + $this->setPaymentMethodsFolder($dir); + + $this->paymentMethods = array(); + try { + $folder = $this->_folderPaymentMethods; + $handle = is_dir($folder) ? opendir($folder) : false; + + if ($handle) { + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && $file != ".svn") { + require_once (sprintf("%s/%s", $this->_folderPaymentMethods, $file)); + $name = strtolower(substr($file, 0, strlen($file) - 4)); + $className = "Icepay_Paymentmethod_" . ucfirst($name); + $this->paymentMethods[$name] = $className; + } + } + } + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + return $this; + } + + /** + * Returns a single class based on payment method code + * @since version 2.1.0 + * @access public + * @param string pmcode + */ + public function getClassByPaymentMethodCode($pmcode) { + return new $this->paymentMethods[strtolower($pmcode)](); + } + + /** + * Load all the paymentmethod classes and store these in the filterable paymentmethods array. + * @since version 1.0.0 + * @access public + */ + public function prepareFiltering() { + foreach ($this->paymentMethods as $name => $class) { + $this->_paymentMethod[$name] = new $class(); + } + return $this; + } + + /** + * Filter the paymentmethods array by currency + * @since version 1.0.0 + * @access public + * @param string $currency Language ISO 4217 code + */ + public function filterByCurrency($currency) { + foreach ($this->_paymentMethod as $name => $class) { + if (!in_array($currency, $class->getSupportedCurrency()) && !in_array('00', $class->getSupportedCurrency())) + unset($this->paymentMethods[$name]); + } + return $this; + } + + /** + * Filter the paymentmethods array by country + * @since version 1.0.0 + * @access public + * @param string $country Country ISO 3166-1-alpha-2 code + */ + public function filterByCountry($country) { + foreach ($this->_paymentMethod as $name => $class) { + if (!in_array(strtoupper($country), $class->getSupportedCountries()) && !in_array('00', $class->getSupportedCountries())) + unset($this->paymentMethods[$name]); + } + return $this; + } + + /** + * Filter the paymentmethods array by language + * @since version 1.0.0 + * @access public + * @param string $language Language ISO 639-1 code + */ + public function filterByLanguage($language) { + foreach ($this->_paymentMethod as $name => $class) { + if (!in_array(strtoupper($language), $class->getSupportedLanguages()) && !in_array('00', $class->getSupportedLanguages())) + unset($this->paymentMethods[$name]); + } + return $this; + } + + /** + * Filter the paymentmethods array by amount + * @since version 1.0.0 + * @access public + * @param int $amount Amount in cents + */ + public function filterByAmount($amount) { + foreach ($this->_paymentMethod as $name => $class) { + $amountRange = $class->getSupportedAmountRange(); + if (intval($amount) >= $amountRange["minimum"] && + intval($amount) <= $amountRange["maximum"]) { + + } else + unset($this->paymentMethods[$name]); + } + return $this; + } + + /** + * Return the filtered paymentmethods array + * @since version 1.0.0 + * @access public + * @return array Paymentmethods + */ + public function getArray() { + return $this->paymentMethods; + } + + public function loadArray() { + if ($this->_paymentMethodsObject != null) + return $this->_paymentMethodsObject; + + $this->_paymentMethodsObject = new stdClass(); + + foreach ($this->getArray() as $key => $value) { + $this->_paymentMethodsObject->$key = new $value(); + } + + return $this->_paymentMethodsObject; + } + + public function getObject() { + return $this->loadArray(); + } + +} + +/** + * Icepay_Basicmode + * + * The Basicmode class allows you to start a basicmode payment. + * + * An example of how to start a basicmode payment + * + *
    + * $paymentObj = new Icepay_PaymentObject();
    + * $paymentObj->setPaymentMethod('IDEAL')
    + *            ->setAmount(1000)
    + *            ->setCountry("NL")
    + *            ->setLanguage("NL")
    + *            ->setReference("ICEPAY Test Payment")
    + *            ->setDescription("ICEPAY Test Payment")
    + *            ->setCurrency("EUR")
    + *            ->setIssuer('ING')
    + *            ->setOrderID('icetest01');
    + * 
    + * $basicmode = Icepay_Basicmode::getInstance();
    + * $basicmode->setMerchantID(MERCHANTID) // Int
    + *           ->setSecretCode(SECRETCODE) // String
    + *           ->setProtocol('https')
    + *           ->validatePayment($paymentObj); // Required
    + * 
    + * $url = $basicmode->getURL(); // This is the payment URL you must redirect your customers to.
    + * 
    + * + * @version 1.0.1 + * + * @package API_Basicmode_Basicmode + * @author Wouter van Tilburg + * @author Olaf Abbenhuis + * @copyright Copyright (c) 2011-2012, ICEPAY + */ +class Icepay_Basicmode extends Icepay_Api_Base { + + private static $instance; + protected $_basicmodeURL = "pay.icepay.eu/basic/"; + protected $_postProtocol = "https"; + protected $_basicMode = false; + protected $_fingerPrint = null; + private $_checkout_version = 2; + protected $_webservice = false; + protected $data = null; + protected $version = "1.0.1"; + protected $_readable_name = "Basicmode"; + protected $_api_type = "basicmode"; + private $_defaultCountryCode = "00"; + private $_generatedURL = ""; + protected $paymentObj; + + /** + * Create an instance + * @since version 1.0.0 + * @access public + * @return instance of self + */ + public static function getInstance() { + if (!self::$instance) + self::$instance = new self(); + return self::$instance; + } + + /** + * Ensure the class data is set + * @since version 1.0.0 + * @access public + */ + public function __construct() { + $this->data = new stdClass(); + //$this->setPaymentMethodsFolder(DIR . '/paymentmethods/'); + } + + /** + * Required for using the basicmode + * @since version 2.1.0 + * @access public + * @param Icepay_PaymentObject_Interface_Abstract $payment + */ + public function validatePayment(Icepay_PaymentObject_Interface_Abstract $payment) { + /* Clear the generated URL */ + $this->resetURL(); + + $this->data = (object) array_merge((array) $this->data, (array) $payment->getData()); + + if (!$payment->getPaymentMethod()) + return $this; + + $paymentmethod = $payment->getBasicPaymentmethodClass(); + + if (!$this->exists($payment->getCountry(), $paymentmethod->getSupportedCountries())) + throw new Exception('Country not supported'); + + if (!$this->exists($payment->getCurrency(), $paymentmethod->getSupportedCurrency())) + throw new Exception('Currency not supported'); + + if (!$this->exists($payment->getLanguage(), $paymentmethod->getSupportedLanguages())) + throw new Exception('Language not supported'); + + if (!$this->exists($payment->getIssuer(), $paymentmethod->getSupportedIssuers()) && $payment->getPaymentMethod() != null) + throw new Exception('Issuer not supported'); + + /* used for webservice call */ + $this->paymentObj = $payment; + + return $this; + } + + public function resetURL() { + $this->_generatedURL = ''; + + return $this; + } + + /** + * Post the fields and return the URL generated by ICEPAY + * @since version 1.0.0 + * @access public + * @return string URL or Error message + */ + public function getURL() { + + if ($this->_generatedURL != "") + return $this->_generatedURL; + + if (!isset($this->_merchantID)) + throw new Exception('Merchant ID not set, use the setMerchantID() method'); + if (!isset($this->_secretCode)) + throw new Exception('Secretcode ID not set, use the setSecretCode() method'); + + if (!isset($this->data->ic_country)) { + if (count($this->_country) == 1) { + $this->data->ic_country = current($this->_country); + } else + $this->data->ic_country = $this->_defaultCountryCode; + } + + if (!isset($this->data->ic_issuer) && isset($this->data->ic_paymentmethod)) { + if (count($this->_issuer) == 1) { + $this->data->ic_issuer = current($this->_issuer); + } else + throw new Exception('Issuer not set, use the setIssuer() method'); + } + + if (!isset($this->data->ic_language)) { + if (count($this->_language) == 1) { + $this->data->ic_language = current($this->_language); + } else + throw new Exception('Language not set, use the setLanguage() method'); + } + + if (!isset($this->data->ic_currency)) { + if (count($this->_currency) == 1) { + $this->data->ic_currency = current($this->_currency); + } else + throw new Exception('Currency not set, use the setCurrency() method'); + } + + if (!isset($this->data->ic_amount)) + throw new Exception('Amount not set, use the setAmount() method'); + + if (!isset($this->data->ic_orderid)) + throw new Exception('OrderID not set, use the setOrderID() method'); + + if (!isset($this->data->ic_reference)) + $this->data->ic_reference = ""; + if (!isset($this->data->ic_description)) + $this->data->ic_description = ""; + + /* + * Dynamic URLs + * @since 1.0.1 + */ + if (!isset($this->data->ic_urlcompleted)) + $this->data->ic_urlcompleted = ""; + if (!isset($this->data->ic_urlerror)) + $this->data->ic_urlerror = ""; + + $this->data->ic_version = $this->_checkout_version; + $this->data->ic_merchantid = $this->_merchantID; + $this->data->chk = $this->generateCheckSumDynamic(); + + /* @since version 1.0.2 */ + if ($this->_webservice) { + require_once(DIR . DS . "icepay_api_webservice.php"); + + if (!isset($this->data->ic_issuer) || $this->data->ic_issuer == "") + throw new Exception("Issuer not set"); + + //$ws = Icepay_Api_Webservice::getInstance()->paymentService(); + $ws = Icepay_Api_Webservice::getInstance()->paymentService(); + $ws->setMerchantID($this->_merchantID) + ->setSecretCode($this->_secretCode) + ->setSuccessURL($this->data->ic_urlcompleted) + ->setErrorURL($this->data->ic_urlerror); + try { + $this->_generatedURL = $ws->checkOut($this->paymentObj, true); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + return $this->_generatedURL; + } + + if (isset($this->data->ic_paymentmethod)) { + $this->_generatedURL = $this->postRequest($this->basicMode(), $this->prepareParameters()); + } else { + $this->_generatedURL = sprintf("%s&%s", $this->basicMode(), $this->prepareParameters()); + } + + return $this->_generatedURL; + } + + /** + * Calls the API to generate a Fingerprint + * @since version 1.0.0 + * @access protected + * @return string SHA1 hash + */ + public function generateFingerPrint() { + if ($this->_fingerPrint != null) + return $this->fingerPrint; + $this->fingerPrint = sha1($this->getVersion()); + return $this->fingerPrint; + } + + /** + * Generates a URL to the ICEPAY basic API service + * @since version 1.0.0 + * @access protected + * @return string URL + */ + protected function basicMode() { + if (isset($this->data->ic_paymentmethod)) { + $querystring = http_build_query(array( + 'type' => $this->data->ic_paymentmethod, + 'checkout' => 'yes', + 'ic_redirect' => 'no', + 'ic_country' => $this->data->ic_country, + 'ic_language' => $this->data->ic_language, + 'ic_fp' => $this->generateFingerPrint() + ), '', '&'); + } else { + $querystring = http_build_query(array( + 'ic_country' => $this->data->ic_country, + 'ic_language' => $this->data->ic_language, + 'ic_fp' => $this->generateFingerPrint() + ), '', '&'); + } + + return sprintf("%s://%s?%s", $this->_postProtocol, $this->_basicmodeURL, $querystring); + } + + /** + * Used to connect to the ICEPAY servers + * @since version 1.0.0 + * @access protected + * @param string $url + * @param array $data + * @return string Returns a response from the specified URL + */ + protected function postRequest($url, $data) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + $response = curl_exec($ch); + curl_close($ch); + + if (!$response) + throw new Exception("Error reading $url"); + + if (( substr(strtolower($response), 0, 7) == "http://" ) || ( substr(strtolower($response), 0, 8) == "https://" )) { + return $response; + } + else + throw new Exception("Server response: " . strip_tags($response)); + } + + /** + * Generate checksum for basicmode checkout + * @since version 1.0.0 + * @access protected + * @return string SHA1 encoded + */ + protected function generateCheckSum() { + return sha1( + sprintf("%s|%s|%s|%s|%s|%s|%s", $this->_merchantID, $this->_secretCode, $this->data->ic_amount, $this->data->ic_orderid, $this->data->ic_reference, $this->data->ic_currency, $this->data->ic_country + ) + ); + } + + /** + * Generate checksum for basicmode checkout using dynamic urls + * @since version 1.0.1 + * @access protected + * @return string SHA1 encoded + */ + protected function generateCheckSumDynamic() { + return sha1( + sprintf("%s|%s|%s|%s|%s|%s|%s|%s|%s", $this->_merchantID, $this->_secretCode, $this->data->ic_amount, $this->data->ic_orderid, $this->data->ic_reference, $this->data->ic_currency, $this->data->ic_country, $this->data->ic_urlcompleted, $this->data->ic_urlerror + ) + ); + } + + /** + * Create the query string + * @since version 1.0.0 + * @access protected + * @return string + */ + protected function prepareParameters() { + return http_build_query($this->data, '', '&'); + } + + /** + * Set the protocol for local testing + * @since version 1.0.0 + * @access public + * @param string $protocol [http|https] + */ + public function setProtocol($protocol = "https") { + $this->_postProtocol = $protocol; + return $this; + } + + /** + * Use the webservice for the Call + * @since version 1.0.2 + * @access public + */ + public function useWebservice() { + $this->_webservice = true; + return $this; + } + +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_order.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_order.php new file mode 100644 index 00000000..4273c6b1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_order.php @@ -0,0 +1,785 @@ +productID = trim($productID); + + return $this; + } + + /** + * Sets the product name + * + * @since 1.0.0 + * @param string Contains the product name + * @return \Icepay_Order_Product + * @throws Exception when empty + */ + public function setProductName($productName) { + if (empty($productName)) + throw new Exception('Product name must be set and cannot be empty.'); + + $this->productName = trim($productName); + + return $this; + } + + /** + * Sets the product description + * + * @since 1.0.0 + * @param string Contains the product discription + * @return \Icepay_Order_Product + * @throws Exception when empty + */ + public function setDescription($description) { + $this->description = trim($description); + + return $this; + } + + /** + * Sets the product quantity + * + * @since 1.0.0 + * @param string Contains the quantity of the product + * @return \Icepay_Order_Product + * @throws Exception when empty + */ + public function setQuantity($quantity) { + if (empty($quantity)) + throw new Exception('Quantity must be set and cannot be empty.'); + + $this->quantity = trim($quantity); + + return $this; + } + + /** + * Sets the product unit price + * + * @since 1.0.0 + * @param string Contains the unitprice in cents + * @return \Icepay_Order_Product + * @throws Exception when empty + */ + public function setUnitPrice($unitPrice) { + $this->unitPrice = trim($unitPrice); + + return $this; + } + + /** + * Sets the product's VAT Category + * + * @since 1.0.0 + * @param string Contains the VAT Category (Choices are: zero, reduced-low, reduced-middle, standard) + * @return \Icepay_Order_Product + * @throws Exception when empty + */ + public function setVATCategory($vatCategory) { + if (empty($vatCategory)) + throw new Exception('VAT Category must be set and cannot be empty.'); + + $this->VATCategory = $vatCategory; + + return $this; + } + +} + +/** + * Icepay_Order_Address + * + * The address class contains all information about the consumer's address + * + * @version 1.0.0 + * + * @author Wouter van Tilburg + * @author Olaf Abbenhuis + * @copyright Copyright (c) 2011-2012, ICEPAY + */ +class Icepay_Order_Address { + + public $initials = ''; + public $prefix = ''; + public $lastName = ''; + public $street = ''; + public $houseNumber = ''; + public $houseNumberAddition = ''; + public $zipCode = ''; + public $city = ''; + public $country = ''; + + /** + * Creates and returns a new Icepay_Order_Address + * + * @since 1.0.0 + * @return \Icepay_Order_Address + */ + public static function create() { + return new self(); + } + + /** + * Sets the initials + * + * @since 1.0.0 + * @param string A string containing the initials + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setInitials($initials) { + if (empty($initials)) + throw new Exception('Initials must be set and cannot be empty.'); + + $this->initials = trim($initials); + + return $this; + } + + /** + * Sets the prefix + * + * @since 1.0.0 + * @param string A string containing the prefix + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setPrefix($prefix) { + $this->prefix = trim($prefix); + + return $this; + } + + /** + * Sets the last name + * + * @since 1.0.0 + * @param string A string containing the family name + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setLastName($lastName) { + if (empty($lastName)) + throw new Exception('Lastname must be set and cannot be empty.'); + + $this->lastName = trim($lastName); + + return $this; + } + + /** + * Sets the streetname + * + * @since 1.0.0 + * @param string A string containing the streetname + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setStreet($street) { + if (empty($street)) + throw new Exception('Streetname must be set and cannot be empty.'); + + $this->street = trim($street); + + return $this; + } + + /** + * Sets the housenumber + * + * @since 1.0.0 + * @param string A string containing the housenumber + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setHouseNumber($houseNumber) { + if (empty($houseNumber)) + throw new Exception('Housenumber must be set and cannot be empty.'); + + $this->houseNumber = trim($houseNumber); + + return $this; + } + + /** + * Sets the housenumberaddition + * + * @since 1.0.0 + * @param string A string containing the housenumber addition + * @return \Icepay_Order_Address + */ + public function setHouseNumberAddition($houseNumberAddition) { + $this->houseNumberAddition = trim($houseNumberAddition); + + return $this; + } + + /** + * Sets the address zipcode + * + * @since 1.0.0 + * @param string A string containing the zipcode + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setZipCode($zipCode) { + if (empty($zipCode)) + throw new Exception('Zipcode must be set and cannot be empty.'); + + $zipCode = str_replace(' ', '', $zipCode); + + $this->zipCode = trim($zipCode); + + return $this; + } + + /** + * Sets the address city + * + * @since 1.0.0 + * @param string A string containing the cityname + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setCity($city) { + if (empty($city)) + throw new Exception('City must be set and cannot be empty.'); + + $this->city = trim($city); + + return $this; + } + + /** + * Sets the country + * + * @since 1.0.0 + * @param string A string containing the countryname + * @return \Icepay_Order_Address + * @throws Exception when empty + */ + public function setCountry($country) { + if (empty($country)) + throw new Exception('Country must be set and cannot be empty.'); + + $this->country = trim($country); + + return $this; + } + +} + +/** + * Icepay_Order_Consumer + * + * The consumer class contains all information about the consumer + * + * @version 1.0.0 + * + * @author Wouter van Tilburg + * @author Olaf Abbenhuis + * @copyright Copyright (c) 2011-2012, ICEPAY + */ +class Icepay_Order_Consumer { + + public $consumerID = ''; + public $email = ''; + public $phone = ''; + + /** + * Creates and returns a new Icepay_Order_Product + * + * @since 1.0.0 + * @return \Icepay_Order_Consumer + */ + public static function create() { + return new self(); + } + + /** + * Sets the consumer ID + * + * @since 1.0.0 + * @param string A string containing the consumerID + * @return \Icepay_Order_Consumer + * @throws Exception when empty + */ + public function setConsumerID($consumerID) { + if (empty($consumerID)) + throw new Exception('Consumer ID must be set and cannot be empty.'); + + $this->consumerID = $consumerID; + + return $this; + } + + /** + * Sets the consumer's email + * + * @since 1.0.0 + * @param string A string containing the consumer's email address. + * @return \Icepay_Order_Consumer + * @throws Exception when empty + */ + public function setEmail($email) { + if (empty($email)) + throw new Exception('Email must be set and cannot be empty.'); + + $this->email = $email; + + return $this; + } + + /** + * Sets the consumer's phonenumber + * + * @since 1.0.0 + * @param string A string containing the consumer's phonenumber + * @return \Icepay_Order_Consumer + * @throws Exception when empty + */ + public function setPhone($phone) { + $phone = trim(str_replace('-', '', $phone)); + + if (empty($phone)) + throw new Exception('Phone must be set and cannot be empty.'); + + $this->phone = $phone; + + return $this; + } + +} + +/** + * Icepay_Order + * + * Contains all the order information and can generate it into XML for the extended checkout. + * + * @version 1.0.0 + * + * @author Wouter van Tilburg + * @author Olaf Abbenhuis + * @copyright Copyright (c) 2011-2012, ICEPAY + */ +class Icepay_Order { + + private $_orderData; + private $_consumerNode; + private $_addressesNode; + private $_productsNode; + private static $instance; + private $_debug = false; + public $_data = Array(); + + public function setData($id, $obj) { + $this->_data[$id] = $obj; + } + + /** + * Sets the consumer information for the order + * + * @since 1.0.0 + * @param obj Object containing the Icepay_Order_Consumer class + * @return \Icepay_Order + */ + public function setConsumer(Icepay_Order_Consumer $obj) { + $this->setData("consumer", $obj); + return $this; + } + + /** + * Sets the shipping address for the order + * + * @since 1.0.0 + * @param obj Object containing the Icepay_Order_Address class + * @return \Icepay_Order + */ + public function setShippingAddress(Icepay_Order_Address $obj) { + $this->setData("shippingAddress", $obj); + return $this; + } + + /** + * Sets the billing address for the order + * + * @since 1.0.0 + * @param obj Object containing the Icepay_Order_Address class + * @return \Icepay_Order + */ + public function setBillingAddress(Icepay_Order_Address $obj) { + $this->setData("billingAddress", $obj); + return $this; + } + + /** + * Adds a product to the order + * + * @since 1.0.0 + * @param obj object containing the Icepay_Order_Product class + * @return \Icepay_Order + */ + public function addProduct(Icepay_Order_Product $obj) { + if (!isset($this->_data["products"])) + $this->_data["products"] = Array(); + array_push($this->_data["products"], $obj); + return $this; + } + + /** + * Sets the order discount + * + * @since 1.0.0 + * @param string $amount Contains the discount amount in cents + * @param string $name Contains the name of the discount + * @param string $description Contains description of the discount + * @return \Icepay_Order + */ + public function setOrderDiscountAmount($amount, $name = 'Discount', $description = 'Order Discount') { + $obj = Icepay_Order_Product::create() + ->setProductID('02') + ->setProductName($name) + ->setDescription($description) + ->setQuantity('1') + ->setUnitPrice(-$amount) + ->setVATCategory(Icepay_Order_VAT::getCategoryForPercentage(-1)); + + $this->addProduct($obj); + + return $this; + } + + /** + * Sets the order shipping costs + * + * @since 1.0.0 + * @param string $amount Contains the shipping costs in cents + * @param int $vat Contains the VAT category in percentages + * @param string $name Contains the shipping name + * @return \Icepay_Order + */ + public function setShippingCosts($amount, $vat = -1, $name = 'Shipping Costs') { + $obj = Icepay_Order_Product::create() + ->setProductID('01') + ->setProductName($name) + ->setDescription('') + ->setQuantity('1') + ->setUnitPrice($amount) + ->setVATCategory(Icepay_Order_VAT::getCategoryForPercentage($vat)); + + $this->addProduct($obj); + + return $this; + } + + /** + * Validates the Order + * + *

    Validates the order information based on the paymentmethod and country used

    + *

    For example Afterpay, it will check the zipcodes and it makes sure that the billing and shipping address are in the same country

    + * + * @param obj $paymentObj + * @throws Exception + */ + public function validateOrder($paymentObj) { + switch (strtoupper($paymentObj->getPaymentMethod())) { + case 'AFTERPAY': + if ($this->_data['shippingAddress']->country !== $this->_data['billingAddress']->country) + throw new Exception('Billing and Shipping country must be equal in order to use Afterpay.'); + + if (!Icepay_Order_Helper::validateZipCode($this->_data['shippingAddress']->zipCode, $this->_data['shippingAddress']->country)) + throw new Exception('Zipcode format for shipping address is incorrect.'); + + if (!Icepay_Order_Helper::validateZipCode($this->_data['billingAddress']->zipCode, $this->_data['billingAddress']->country)) + throw new Exception('Zipcode format for billing address is incorrect.'); + + if (!Icepay_Order_Helper::validatePhonenumber($this->_data['consumer']->phone)) + throw new Exception('Phonenumber is incorrect.'); + + break; + } + } + + private function array_to_xml($childs, $node = 'Order') { + $childs = (array) $childs; + + foreach ($childs as $key => $value) { + $node->addChild(ucfirst($key), $value); + } + + return $node; + } + + /** + * Generates the XML for the webservice + * + * @since 1.0.0 + * @return XML + */ + public function createXML() { + + $this->_orderData = new SimpleXMLElement(""); + $this->_consumerNode = $this->_orderData->addChild('Consumer'); + $this->_addressesNode = $this->_orderData->addChild('Addresses'); + $this->_productsNode = $this->_orderData->addChild('Products'); + + // Set Consumer + $this->array_to_xml($this->_data['consumer'], $this->_consumerNode); + + // Set Addresses + $shippingNode = $this->_addressesNode->addChild('Address'); + $shippingNode->addAttribute('id', 'shipping'); + + $this->array_to_xml($this->_data['shippingAddress'], $shippingNode); + + $billingNode = $this->_addressesNode->addChild('Address'); + $billingNode->addAttribute('id', 'billing'); + + $this->array_to_xml($this->_data['billingAddress'], $billingNode); + + // Set Products + foreach ($this->_data['products'] as $product) { + $productNode = $this->_productsNode->addChild('Product'); + $this->array_to_xml($product, $productNode); + } + + if ($this->_debug == true) { + header("Content-type: text/xml"); + echo $this->_orderData->asXML(); + exit; + } + + return $this->_orderData->asXML(); + } + + public static function getInstance() { + if (!self::$instance) + self::$instance = new self(); + return self::$instance; + } + +} + +class Icepay_Order_VAT { + + private static $categories = array(); + + public static function setDefaultCategories() { + $ranges = array( + 'zero' => 0, + 'reduced-low' => array('1', '6'), + 'reduced-middle' => array('7', '12'), + 'standard' => array('13', '100') + ); + + self::setCategories($ranges); + } + + public static function setCategories($array) { + self::$categories = $array; + } + + public static function getCategories() { + return self::$categories; + } + + public static function getCategory($name) { + return self::$categories[$name]; + } + + public static function getCategoryForPercentage($number = null, $default = "exempt") { + if (!self::$categories) + self::setDefaultCategories(); + + foreach (self::getCategories() as $category => $value) { + if (!is_array($value)) { + if ($value == $number) + return $category; + } + + if ($number >= $value[0] && $number <= $value[1]) + return $category; + } + + return $default; + } + +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_pbm.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_pbm.php new file mode 100644 index 00000000..94a71446 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_pbm.php @@ -0,0 +1,359 @@ +validateSettings(); + + $linkObj = new StdClass(); + $linkObj->merchantid = $this->getMerchantID(); + $linkObj->timestamp = $this->getTimestamp(); + $linkObj->amount = $pbmObject->getAmount(); + $linkObj->currency = $pbmObject->getCurrency(); + $linkObj->language = $pbmObject->getLanguage(); + $linkObj->orderid = $pbmObject->getOrderID(); + $linkObj->country = $pbmObject->getCountry(); + $linkObj->description = $pbmObject->getDescription(); + $linkObj->reference = $pbmObject->getReference(); + $linkObj->checksum = $this->generateChecksum($linkObj); + + $result = $this->generateURL($linkObj); + + return json_decode($result); + } + + /** + * Calls PBM platform and returns generated PBM link + * + * @since 1.0.0 + * @param object $parameters + * @return string + */ + private function generateURL($parameters) + { + $ch = curl_init(); + + $parameters = http_build_query($parameters); + + curl_setopt($ch, CURLOPT_URL, $this->url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters); + + $result = curl_exec($ch); + + curl_close($ch); + + return $result; + } + + /** + * Generates PBM checksum + * + * @since 1.0.0 + * @param obj $linkObj + * @return string + */ + private function generateChecksum($linkObj) + { + $arr = (array)$linkObj; + $arr[] = $this->getSecretCode(); + + return sha1(implode("|", $arr)); + } + + /** + * Validate the merchant settings + * + * @since 1.0.0 + * @throws Exception + */ + private function validateSettings() + { + // Validate Merchant ID + if (!Icepay_Parameter_Validation::merchantID($this->getMerchantID())) + throw new Exception('Merchant ID not set, use the setMerchantID() method', 1001); + + // Validate SecretCode + if (!Icepay_Parameter_Validation::secretCode($this->getSecretCode())) + throw new Exception('Secretcode ID not set, use the setSecretCode() method', 1002); + } + +} + +/** + * ICEPAY API - Pay By Mail Object + * + * @version 1.0.0 + * @author Wouter van Tilburg + * @copyright Copyright (c) 2013, ICEPAY + * + */ +class Icepay_Pbm_Object implements Icepay_PbmObject_Interface_Abstract { + + private $amount; + private $currency = 'EUR'; + private $country = 'NL'; + private $language = 'NL'; + private $orderID; + private $description = ''; + private $reference = ''; + + /** + * Set Amount + * + * @since 1.0.0 + * @param int $amount + * @return \Icepay_Pbm_Object + * @throws Exception + */ + public function setAmount($amount) + { + if (!Icepay_Parameter_Validation::amount($amount)) + throw new Exception('Please enter a valid amount (in cents)', 1003); + + $this->amount = $amount; + return $this; + } + + /** + * Get Amount + * + * @since 1.0.0 + * @return int + */ + public function getAmount() + { + return $this->amount; + } + + /** + * Set Currency + * + * @since 1.0.0 + * @param string $currency + * @return \Icepay_Pbm_Object + * @throws Exception + */ + public function setCurrency($currency) + { + if (!Icepay_Parameter_Validation::currency($currency)) + throw new Exception('Please enter a valid currency format (ISO 4217)', 1004); + + $this->currency = $currency; + return $this; + } + + /** + * Get Currency + * + * @since 1.0.0 + * @return string + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * Set Country + * + * @since 1.0.0 + * @param string $countryCode + * @return \Icepay_Pbm_Object + * @throws Exception + */ + public function setCountry($countryCode) + { + if (!Icepay_Parameter_Validation::country($countryCode)) + throw new Exception('Please enter a valid country format (ISO 3166-1)', 1005); + + $this->country = $countryCode; + return $this; + } + + /** + * Get Country + * + * @since 1.0.0 + * @return string + */ + public function getCountry() + { + return $this->country; + } + + /** + * Set Language + * + * @since 1.0.0 + * @param string $language + * @return \Icepay_Pbm_Object + * @throws Exception + */ + public function setLanguage($language) + { + if (!Icepay_Parameter_Validation::language($language)) + throw new Exception('Please enter a valid language (ISO 639-1)', 1006); + + $this->language = $language; + return $this; + } + + /** + * Get Language + * + * @since 1.0.0 + * @return string + */ + public function getLanguage() + { + return $this->language; + } + + /** + * Set OrderID + * + * @param string $orderID + * @return \Icepay_Pbm_Object + * @throws Exception + */ + public function setOrderID($orderID) + { + if (!Icepay_Parameter_Validation::orderID($orderID)) + throw new Exception('The Order ID cannot be longer than 10 characters', 1007); + + $this->orderID = $orderID; + return $this; + } + + /** + * Get Order ID + * + * @since 1.0.0 + * @return string + */ + public function getOrderID() + { + return $this->orderID; + } + + /** + * Set Description + * + * @since 1.0.0 + * @param string $description + * @return \Icepay_Pbm_Object + */ + public function setDescription($description) { + $this->description = $description; + return $this; + } + + /** + * Get Description + * + * @since 1.0.0 + * @return string + */ + public function getDescription() { + return $this->description; + } + + /** + * Set Reference + * + * @since 1.0.0 + * @param string $reference + * @return \Icepay_Pbm_Object + */ + public function setReference($reference) { + $this->reference = $reference; + return $this; + } + + /** + * Get Reference + * + * @since 1.0.0 + * @return string + */ + public function getReference() { + return $this->reference; + } + +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_webservice.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_webservice.php new file mode 100644 index 00000000..9aa0fda7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/icepay_api_webservice.php @@ -0,0 +1,2399 @@ +_service_autoCapture) + $this->_service_autoCapture = new Icepay_Webservice_AutoCapture(); + return $this->_service_autoCapture; + } + + /** + * Returns class or creates the Payment Methods class + * + * @since 2.1.0 + * @access public + * @return object + */ + public function paymentMethodService() + { + if (!$this->_service_paymentMethods) + $this->_service_paymentMethods = new Icepay_Webservice_Paymentmethods(); + return $this->_service_paymentMethods; + } + + /** + * Returns class or creates the Filtering class + * + * @since 2.1.0 + * @access public + * @return object + */ + public function filtering() + { + if (!$this->_filtering) + $this->_filtering = new Icepay_Webservice_Filtering(); + return $this->_filtering; + } + + /** + * Returns class or creates the Paymentmethod class + * + * @since 2.1.0 + * @access public + * @return object + */ + public function singleMethod() + { + if (!$this->_single) + $this->_single = new Icepay_Webservice_Paymentmethod(); + return $this->_single; + } + + /** + * Returns class or creates the Pay class + * + * @since 2.1.0 + * @access public + * @return object + */ + public function paymentService() + { + if (!$this->_service_pay) + $this->_service_pay = new Icepay_Webservice_Pay(); + return $this->_service_pay; + } + + /** + * Returns class or creates the Reporting class + * + * @since 2.1.0 + * @access public + * @return object + */ + public function reportingService() + { + if (!$this->_service_reporting) + $this->_service_reporting = new Icepay_Webservice_Reporting(); + return $this->_service_reporting; + } + + /** + * Returns class or creates the Refund class + * + * @since 2.1.0 + * @access public + * @return object + */ + public function refundService() + { + if (!$this->_service_refunds) + $this->_service_refunds = new Icepay_Webservice_Refunds(); + return $this->_service_refunds; + } + +} + +/** + * @package API_Webservice + */ +class Icepay_Webservice_Base extends Icepay_Api_Base { + + protected $service = 'https://connect.icepay.com/webservice/icepay.svc?wsdl'; + protected $client; + + /** + * Make connection with the soap client + * + * @since 2.1.0 + * @access public + * @return \Icepay_Webservice_Base + */ + public function setupClient() + { + /* Return if already set */ + if ($this->client) + return $this; + + /* Set the options for the SOAP request */ + $sslContext = array( + 'ssl' => array( + 'allow_self_signed' => false, + 'verify_peer' => true + ) + ); + + $soapArguments = array( + 'location' => $this->service, + 'encoding' => 'UTF-8', + 'cache_wsdl' => 'WSDL_CACHE_NONE', + 'stream_context' => stream_context_create($sslContext) + ); + + /* Start a new client */ + $this->client = new SoapClient($this->service, $soapArguments); + + /* Client configuration */ + $this->client->soap_defencoding = "utf-8"; + + return $this; + } + + /** + * Return current timestamp in gmdate format + * + * @since 2.1.0 + * @access protected + * @return string + */ + public function getTimeStamp() + { + return gmdate("Y-m-d\TH:i:s\Z"); + } + + /** + * Return IP Address + * + * @since 2.1.0 + * @access protected + * @return string + */ + protected function getIP() + { + return $_SERVER['REMOTE_ADDR']; + } + + /** + * Arrange the object in given order + * + * @since 1.0.2 + * @access public + * @param object $object !required + * @param array $order !required + * @return object $obj + */ + public function arrangeObject($object, $order = array()) + { + + if (!is_object($object)) + throw new Exception("Please provide a valid Object for the arrangeObject method"); + if (!is_array($order) || empty($order)) + throw new Exception("Please provide a valid orderArray for the arrangeObject method"); + + $obj = new stdClass(); + + foreach ($order as $key) { + $obj->$key = $object->$key; + } + return $obj; + } + + /** + * Inserts properties of sub object into mainobject as property + * + * @since version 1.0.2 + * @access public + * @param object $mainObject !required + * @param object $subObject !required + * @param bool $arrange + * @param array $order !required if $arrange == true + * @return object $obj + */ + public function parseForChecksum($mainObject, $subObject, $arrange = false, $order = array()) + { + + if (!is_object($mainObject)) + throw new Exception("Please provide a valid Object"); + + $mainObject = $mainObject; + + $i = 1; + + $subObject = $this->forceArray($subObject); + + foreach ($subObject as $sub) { + // $sub is always an object, just a double-check + if (is_object($sub)) { + if ($arrange) { + // Arrange object in right order + $sub = $this->arrangeObject($sub, $order); + } + + // Inject each value of subObject into $obj as property for checksum + foreach ($sub as $value) { + $mainObject->$i = $value; + $i++; + } + } + } + + return $mainObject; + } + + /** + * Generates the checksum + * + * @since 2.1.0 + * @access public + * @param object $obj + * @param string $secretCode + * @param bool $isautocheckout + * @return string + */ + public function generateChecksum($obj = null, $secretCode = null,$isautocheckout = false) + { + $arr = array(); + if ($secretCode) + array_push($arr, $secretCode); + + foreach ($obj as $val) { + $insert = $val; + + if (is_bool($val)) { + if ($isautocheckout) { + $insert = ($val) ? 'True' : 'False'; // autocheckout function computes boolean checksum differently (first character uppercase) + } else { + $insert = ($val) ? 'true' : 'false'; + } + } + + array_push($arr, $insert); + } + + return sha1(implode("|", $arr)); + } + + /** + * Force object into array + * + * @since 2.1.0 + * @access protected + * @param object $obj + * @return array + */ + protected function forceArray($obj) + { + if (is_array($obj)) + return $obj; + + $arr = array(); + array_push($arr, $obj); + return $arr; + } + +} + +/** + * @package API_Webservice_Paymentmethods + */ +class Icepay_Webservice_Paymentmethods extends Icepay_Webservice_Base { + + protected $_paymentMethod = null; + protected $_paymentMethods = null; + protected $_paymentMethodsArray; + protected $_savedData = array(); + + public function __construct() + { + $this->setupClient(); + } + + /** + * Retrieve all payment methods + * + * @since 2.1.0 + * @access public + * + * @return \Icepay_Webservice_Paymentmethods + */ + public function retrieveAllPaymentmethods() + { + if (isset($this->_paymentMethodsArray)) + return $this; + + $obj = new stdClass(); + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->_merchantID; + $obj->SecretCode = $this->_secretCode; + $obj->Timestamp = $this->getTimeStamp(); + // ------------------------------------------------ + $obj->Checksum = $this->generateChecksum($obj); + $obj->SecretCode = null; + + $this->_paymentMethods = $this->client->GetMyPaymentMethods(array('request' => $obj)); + + if (isset($this->_paymentMethods->GetMyPaymentMethodsResult->PaymentMethods->PaymentMethod)) { + $this->_paymentMethodsArray = $this->clean($this->_paymentMethods); + } + + return $this; + } + + /** + * Return clean array + * + * @since 2.1.0 + * @access protected + * @param object $obj + * @return array + */ + protected function clean($obj) + { + $methods = array(); + + foreach ($this->forceArray($obj->GetMyPaymentMethodsResult->PaymentMethods->PaymentMethod) as $value) { + array_push($methods, array( + 'PaymentMethodCode' => $value->PaymentMethodCode, + 'Description' => $value->Description, + 'Issuers' => $this->convertIssuers($this->forceArray($value->Issuers->Issuer)) + ) + ); + }; + return $methods; + } + + /** + * Convert Issuers + * + * @since 2.1.0 + * @access private + * @param array $array + * @return array + */ + private function convertIssuers($array) + { + $return = array(); + foreach ($array as $value) { + array_push($return, array( + 'IssuerKeyword' => $value->IssuerKeyword, + 'Description' => $value->Description, + 'Countries' => $this->convertCountries($this->forceArray($value->Countries->Country)) + ) + ); + } + return $return; + } + + /** + * Convert Countries + * + * @since 2.1.0 + * @access private + * @param array $array + * @return array + */ + private function convertCountries($array) + { + $return = array(); + foreach ($array as $value) { + array_push($return, array( + 'CountryCode' => $value->CountryCode, + 'MinimumAmount' => $value->MinimumAmount, + 'MaximumAmount' => $value->MaximumAmount, + 'Currencies' => $this->convertCurrencies($value->Currency) + )); + } + return $return; + } + + /** + * Convert Currencies + * + * @since 2.1.0 + * @access private * + * @param string $string + * @return string + */ + private function convertCurrencies($string) + { + $return = explode(", ", $string); + return $return; + } + + /** + * Returns paymentmethods as array + * + * @since 2.1.0 + * @access public + * @return array + */ + public function asArray() + { + return $this->_paymentMethodsArray; + } + + /** + * Returns paymentmethods as object + * + * @since 2.1.0 + * @access public + * @return object + */ + public function asObject() + { + return $this->_paymentMethods; + } + + /** + * get Webservice Data + * + * @since 2.1.0 + * @access public + * @return string + */ + public function exportAsString() + { + return urlencode(serialize($this->_paymentMethodsArray)); + } + + /** + * Save ws to File + * + * @since 2.1.0 + * @access public + * @param string $fileName + * @param directory $directory + * @return boolean + * @throws Exception + */ + public function saveToFile($fileName = "wsdata", $directory = "") + { + if ($directory == "") + $directory = dirname(__FILE__); + + date_default_timezone_set("Europe/Paris"); + $line = sprintf("Paymentmethods %s,%s\r\n", date("H:i:s", time()), $this->exportAsString()); + + $filename = sprintf("%s/%s.csv", $directory, $fileName); + try { + $fp = @fopen($filename, "w"); + @fwrite($fp, $line); + @fclose($fp); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + }; + + return true; + } + +} + +/** + * @package API_Webservice_Filtering + */ +class Icepay_Webservice_Filtering { + + protected $_paymentMethodsArray; + protected $_paymentMethodsArrayFiltered; + + /** + * From String + * + * @since 2.1.0 + * @access public + * @param string $string + * @return \Icepay_Webservice_Filtering + */ + public function importFromString($string) + { + $this->_paymentMethodsArray = unserialize(urldecode($string)); + $this->_paymentMethodsArrayFiltered = $this->_paymentMethodsArray; + return $this; + } + + /** + * Export String + * + * @since 2.1.0 + * @access public + * @return string + */ + public function exportAsString() + { + return urlencode(serialize($this->_paymentMethodsArrayFiltered)); + } + + /** + * From Array + * + * @since 2.1.0 + * @access public + * @param array $array + * @return \Icepay_Webservice_Filtering + */ + public function loadFromArray($array) + { + $this->_paymentMethodsArray = $array; + $this->_paymentMethodsArrayFiltered = $this->_paymentMethodsArray; + return $this; + } + + /** + * Read data from stored file + * + * @since 2.1.0 + * @access public + * @param string $fileName + * @param string $directory + * @return \Icepay_Webservice_Filtering + * @throws Exception + */ + public function loadFromFile($fileName = "wsdata", $directory = "") + { + if ($directory == "") + $directory = dirname(__FILE__); + + $filename = sprintf("%s/%s.csv", $directory, $fileName); + try { + $fp = @fopen($filename, "r"); + $line = @fgets($fp); + @fclose($fp); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + }; + + if (!$line) { + throw new Exception("No data stored"); + } + + $arr = explode(",", $line); + $this->importFromString($arr[1]); + + return $this; + } + + /** + * Get payment methods + * + * @since 2.1.0 + * @access public + * @return array + */ + public function getPaymentmethods() + { + return $this->_paymentMethodsArray; + } + + /** + * Get filtered payment methods + * + * @since 2.1.0 + * @access public + * @return array + */ + public function getFilteredPaymentmethods() + { + return $this->_paymentMethodsArrayFiltered; + } + + /** + * Filter the paymentmethods array by currency + * @since 2.1.0 + * @access public + * @param string $currency Language ISO 4217 code + */ + public function filterByCurrency($currency) + { + $filteredArr = array(); + foreach ($this->_paymentMethodsArrayFiltered as $paymentMethod) { + $continue = true; + foreach ($paymentMethod["Issuers"] as $issuer) { + foreach ($issuer["Countries"] as $country) { + if (in_array(strtoupper($currency), $country["Currencies"])) { + array_push($filteredArr, $paymentMethod); //return//return + $continue = false; + } + if (!$continue) + break; + } + if (!$continue) + break; + } + } + $this->_paymentMethodsArrayFiltered = $filteredArr; + return $this; + } + + /** + * Filter the paymentmethods array by country + * @since 2.1.0 + * @access public + * @param string $country Country ISO 3166-1-alpha-2 code + */ + public function filterByCountry($countryCode) + { + $filteredArr = array(); + foreach ($this->_paymentMethodsArrayFiltered as $paymentMethod) { + $continue = true; + foreach ($paymentMethod["Issuers"] as $issuer) { + foreach ($issuer["Countries"] as $country) { + if (strtoupper($country["CountryCode"]) == strtoupper($countryCode) || $country["CountryCode"] == "00") { + array_push($filteredArr, $paymentMethod); + $continue = false; + } + if (!$continue) + break; + } + if (!$continue) + break; + } + } + $this->_paymentMethodsArrayFiltered = $filteredArr; + return $this; + } + + /** + * Filter the paymentmethods array by amount + * @since 2.1.0 + * @access public + * @param int $amount Amount in cents + */ + public function filterByAmount($amount) + { + $amount = intval($amount); + $filteredArr = array(); + foreach ($this->_paymentMethodsArrayFiltered as $paymentMethod) { + $continue = true; + foreach ($paymentMethod["Issuers"] as $issuer) { + foreach ($issuer["Countries"] as $country) { + if ($amount >= intval($country["MinimumAmount"]) && + $amount <= intval($country["MaximumAmount"])) { + array_push($filteredArr, $paymentMethod); + $continue = false; + } + if (!$continue) + break; + } + if (!$continue) + break; + } + } + $this->_paymentMethodsArrayFiltered = $filteredArr; + return $this; + } + +} + +/** + * @package API_Webservice_Paymentmethod + */ +class Icepay_Webservice_Paymentmethod extends Icepay_Webservice_Filtering { + + protected $_methodData; + protected $_issuerData; + protected $_country; + + /** + * Select the payment method by code + * + * @since 2.1.0 + * @access public + * @param string $name + * @return \Icepay_Webservice_Paymentmethod + * @throws Exception + */ + public function selectPaymentMethodByCode($name) + { + if (!isset($this->_paymentMethodsArray)) + throw new Exception("No data loaded"); + foreach ($this->_paymentMethodsArray as $paymentMethod) { + if ($paymentMethod["PaymentMethodCode"] == strtoupper($name)) { + $this->_methodData = $paymentMethod; + break; + } + } + return $this; + } + + /** + * Select an issuer by keyword + * + * @since 2.1.0 + * @access public + * @param string $name + * @return \Icepay_Webservice_Paymentmethod + * @throws Exception + */ + public function selectIssuerByKeyword($name) + { + if (!isset($this->_paymentMethodsArray)) + throw new Exception("No data loaded"); + foreach ($this->_paymentMethodsArray as $paymentMethod) { + foreach ($paymentMethod["Issuers"] as $issuer) { + if ($issuer["IssuerKeyword"] == strtoupper($name)) { + $this->_methodData = $paymentMethod; + $this->_issuerData = $issuer; + break; + } + } + } + return $this; + } + + /** + * Selects the country out of the issuer data + * + * @since 2.1.0 + * @access Public + * @param string $country + * @return \Icepay_Webservice_Paymentmethod + */ + public function selectCountry($country) + { + if (!isset($this->_issuerData)) { + $this->_country = $this->validateCountry($country); + return $this; + } + + if (in_array($country, $this->getCountries())) { + $this->_country = $this->validateCountry($country); + return $this; + }; + + if (in_array("00", $this->getCountries())) { + $this->_country = "00"; + }; + + return $this; + } + + /** + * Get payment method data + * + * @since 2.1.0 + * @access public + * @return array + */ + public function getPaymentmethodData() + { + return $this->_methodData; + } + + /** + * Get issuer data + * + * @since 2.1.0 + * @access public + * @return array + */ + public function getIssuerData() + { + return $this->_issuerData; + } + + /** + * Get issuer list + * + * @since 2.1.0 + * @access public + * @return array + * @throws Exception + */ + public function getIssuers() + { + if (!isset($this->_methodData)) + throw new Exception("Paymentmethod must be selected first"); + return $this->_methodData["Issuers"]; + } + + /** + * Get currencies + * + * @since 2.1.0 + * @access public + * @return array + * @throws Exception + */ + public function getCurrencies() + { + if (!isset($this->_issuerData)) + throw new Exception("Issuer must be selected first"); + if (!isset($this->_country)) + throw new Exception("Country must be selected first"); + foreach ($this->_issuerData["Countries"] as $country) { + if ($this->_country == $country["CountryCode"]) { + return $country["Currencies"]; + } + } + return array(); + } + + /** + * Get countries + * + * @since 2.1.0 + * @access public + * @return array + * @throws Exception + */ + public function getCountries() + { + if (!isset($this->_issuerData)) + throw new Exception("Issuer must be selected first"); + $countries = array(); + foreach ($this->_issuerData["Countries"] as $country) { + array_push($countries, $country["CountryCode"]); + } + return $countries; + } + + /** + * Get minimum amount + * + * @since 2.1.0 + * @access public + * @return int + * @throws Exception + */ + public function getMinimumAmount() + { + if (!isset($this->_issuerData)) + throw new Exception("Issuer must be selected first"); + if (!isset($this->_country)) + throw new Exception("Country must be selected first"); + foreach ($this->_issuerData["Countries"] as $country) { + if ($this->_country == $country["CountryCode"]) { + return intval($country["MinimumAmount"]); + } + } + } + + /** + * Get maximum amount + * + * @since 2.1.0 + * @access public + * @return int + * @throws Exception + */ + public function getMaximumAmount() + { + if (!isset($this->_issuerData)) + throw new Exception("Issuer must be selected first"); + if (!isset($this->_country)) + throw new Exception("Country must be selected first"); + foreach ($this->_issuerData["Countries"] as $country) { + if ($this->_country == $country["CountryCode"]) { + return intval($country["MaximumAmount"]); + } + } + } + + /** + * Validate given country + * + * @since 2.1.0 + * @access protected + * @param string $country + * @return string + * @throws Exception + */ + protected function validateCountry($country) + { + if (strlen($country) != 2) + throw new Exception("Country must be ISO 3166-1 alpha-2"); + return strtoupper($country); + } + +} + +/** + * @package API_Webservice_Checkout + */ +class Icepay_Webservice_Pay extends Icepay_Webservice_Base { + + private $extendedCheckoutList = array('AFTERPAY'); + private $autoCheckoutList = array( + 'CREDITCARD' => array('CCAUTOCHECKOUT'), + 'DDEBIT' => array('IDEALINCASSO')); + + public function __construct() + { + $this->setupClient(); + } + + public function addToExtendedCheckoutList($paymentMethods) + { + $this->extendedCheckoutList = array_merge($this->extendedCheckoutList, $paymentMethods); + + return $this; + } + + public function isExtendedCheckoutRequiredByPaymentMethod($paymentMethod) + { + if (in_array($paymentMethod, $this->extendedCheckoutList)) + return true; + + return false; + } + + public function extendedCheckout(Icepay_PaymentObject_Interface_Abstract $paymentObj, $getUrlOnly = false) + { + $obj = new stdClass(); + + Icepay_Order::getInstance()->validateOrder($paymentObj); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + $obj->XML = Icepay_Order::getInstance()->createXML(); + + // ------------------------------------------------ + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->CheckoutExtended(array('request' => $obj)); + + /* store the checksum momentarily */ + $checksum = $result->CheckoutExtendedResult->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->CheckoutExtendedResult->Checksum = $this->getSecretCode(); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result->CheckoutExtendedResult)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->CheckoutExtendedResult->Checksum = $checksum; + + /* Return just the payment URL if required */ + if ($getUrlOnly) + return $result->CheckoutExtendedResult->PaymentScreenURL; + + $transactionObj = new Icepay_TransactionObject(); + $transactionObj->setData($result->CheckoutExtendedResult); + + + /* Default return all data */ + return $transactionObj; + } + + private function validateAutoCheckout($paymentObj) + { + // Check if PaymentMethod is allowed + if (!array_key_exists($paymentObj->PaymentMethod, $this->autoCheckoutList)) + throw new Exception("Error: Paymentmethod {$paymentObj->PaymentMethod} is not allowed to use autoCheckout"); + + // Check if Issuer is allowed + if (!in_array($paymentObj->Issuer, $this->autoCheckoutList[$paymentObj->PaymentMethod])) + throw new Exception("Error: Issuer {$paymentObj->Issuer} is not allowed to use autoCheckout"); + + return true; + } + + public function autoCheckout(Icepay_PaymentObject_Interface_Abstract $paymentObj, $consumerID) + { + $obj = new StdClass(); + + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + + $this->validateAutoCheckout($obj); + + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode(), true); + + // Checksum is generated without the consumer ID + $obj->ConsumerID = $consumerID; + + // Call the webservice + $result = $this->client->automaticCheckout(array('request' => $obj)); + + /* store the checksum momentarily */ + $checksum = $result->AutomaticCheckoutResult->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->AutomaticCheckoutResult->Checksum = $this->getSecretCode(); + + $checksumObject = $this->arrangeObject($result->AutomaticCheckoutResult, array( + 'Checksum', 'MerchantID', 'Timestamp', 'PaymentID', 'Success', 'ErrorDescription' + )); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($checksumObject, null, true)) + throw new Exception("Data could not be verified"); + + // Return checksum + $result->AutomaticCheckoutResult->Checksum = $checksum; + + return $result->AutomaticCheckoutResult; + } + + public function vaultCheckout(Icepay_PaymentObject_Interface_Abstract $paymentObj, $consumerID, $getUrlOnly = false) + { + $obj = new StdClass(); + + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + // Checksum is generated without the consumer ID + $obj->ConsumerID = $consumerID; + + // Call the webservice + $result = $this->client->VaultCheckout(array('request' => $obj)); + + /* store the checksum momentarily */ + $checksum = $result->VaultCheckoutResult->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->VaultCheckoutResult->Checksum = $this->getSecretCode(); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result->VaultCheckoutResult)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->VaultCheckoutResult->Checksum = $checksum; + + /* Return just the payment URL if required */ + if ($getUrlOnly) + return $result->VaultCheckoutResult->PaymentScreenURL; + + $transactionObj = new Icepay_TransactionObject(); + $transactionObj->setData($result->VaultCheckoutResult); + + /* Default return all data */ + return $transactionObj; + } + + /** + * The Checkout web method allows you to initialize a new payment in the ICEPAY system for ALL the + * payment methods that you have access to + * + * @since version 2.1.0 + * @access public + * @param Icepay_PaymentObject_Interface_Abstract $paymentObj + * @param bool $geturlOnly + * @return array result + */ + public function checkOut(Icepay_PaymentObject_Interface_Abstract $paymentObj, $getUrlOnly = false) + { + $obj = new stdClass(); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + + // ------------------------------------------------ + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->Checkout(array('request' => $obj)); + + /* store the checksum momentarily */ + $checksum = $result->CheckoutResult->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->CheckoutResult->Checksum = $this->getSecretCode(); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result->CheckoutResult)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->CheckoutResult->Checksum = $checksum; + + /* Return just the payment URL if required */ + if ($getUrlOnly) + return $result->CheckoutResult->PaymentScreenURL; + + $transactionObj = new Icepay_TransactionObject(); + $transactionObj->setData($result->CheckoutResult); + + + /* Default return all data */ + return $transactionObj; + } + + /** + * The PhoneCheckout web method allows you to create a phone payment in the ICEPAY system. The + * main difference with the Checkout web method is the response. The response is a + * PhoneCheckoutResponse object, which contains extra members such as the phone number etc., making + * seamless integration possible. + * + * @since 2.1.0 + * @access public + * @param array $data + * @param bool $geturlOnly + * @return array result + */ + public function phoneCheckout(Icepay_PaymentObject_Interface_Abstract $paymentObj, $getUrlOnly = false) + { + $obj = new StdClass(); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->PhoneCheckout(array('request' => $obj)); + + /* store the checksum momentarily */ + $checksum = $result->PhoneCheckoutResult->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->PhoneCheckoutResult->Checksum = $this->getSecretCode(); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result->PhoneCheckoutResult)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->PhoneCheckoutResult->Checksum = $checksum; + + /* Return only the payment URL if required */ + if ($getUrlOnly) + return $result->PhoneCheckoutResult->PaymentScreenURL; + + /* Default return all data */ + return (array) $result->PhoneCheckoutResult; + } + + /** + * The SmsCheckout web method allows you to create an SMS payment in the ICEPAY system. The main + * difference with the Checkout web method is the response. The response will contain extra members such + * as the premium-rate number, making seamless integration possible. + * + * @since 2.1.0 + * @access public + * @param array $data + * @param bool $geturlOnly + * @return array + */ + public function smsCheckout(Icepay_PaymentObject_Interface_Abstract $paymentObj, $getUrlOnly = false) + { + $obj = new StdClass(); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->SmsCheckout(array('request' => $obj)); + $result = $result->SMSCheckoutResult; + + /* store the checksum momentarily */ + $checksum = $result->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->Checksum = $this->getSecretCode(); + + // Order object in correct order for Checksum + $checksumObject = $this->arrangeObject($result, array( + 'Checksum', 'MerchantID', 'Timestamp', 'Amount', 'Country', + 'Currency', 'Description', 'EndUserIP', 'Issuer', 'Language', + 'OrderID', 'PaymentID', 'PaymentMethod', 'PaymentScreenURL', + 'ProviderTransactionID', 'Reference', 'TestMode', 'URLCompleted', + 'URLError', 'ActivationCode', 'Keyword', 'PremiumNumber', 'Disclaimer' + )); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($checksumObject)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->Checksum = $checksum; + + /* Return only the payment URL if required */ + if ($getUrlOnly) + return $result->PaymentScreenURL; + + /* Default return all data */ + return (array) $result; + } + + /** + * The ValidatePhoneCode web method verifies the code that the end-user must provide in + * order to start a phone payment. + * + * @since 2.1.0 + * @access public + * @param int $paymentID + * @param int $phoneCode + * @return bool success + */ + public function validatePhoneCode($paymentID, $phoneCode) + { + $obj = new StdClass(); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->PaymentID = $paymentID; + $obj->PhoneCode = $phoneCode; + + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->ValidatePhoneCode(array('request' => $obj)); + $result = $result->ValidatePhoneCodeResult; + + /* store the checksum momentarily */ + $checksum = $result->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->Checksum = $this->getSecretCode(); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result)) + throw new Exception("Data could not be verified"); + + return $result->Success; + } + + /** + * The ValidateSmsCode web method validates the code that the end-user must provide. + * + * @since 2.1.0 + * @access public + * @param int $paymentID + * @param int $smsCode + * @return bool success + */ + public function validateSmsCode($paymentID, $smsCode) + { + $obj = new StdClass(); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->PaymentID = $paymentID; + $obj->SmsCode = $smsCode; + + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->ValidateSmsCode(array('request' => $obj)); + $result = $result->ValidateSmsCodeResult; + + /* store the checksum momentarily */ + $checksum = $result->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->Checksum = $this->getSecretCode(); + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result)) + throw new Exception("Data could not be verified"); + + return $result->Success; + } + + /** + * The phoneDirectCheckout web method allows you to initialize a new payment in the ICEPAY system + * with paymentmethod Phone with Pincode + * + * @since version 2.1.0 + * @access public + * @param object $data + * @return array result + */ + public function phoneDirectCheckout(Icepay_PaymentObject_Interface_Abstract $paymentObj) + { + $obj = new StdClass(); + + // Must be in specific order for checksum --------- + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->Amount = $paymentObj->getAmount(); + $obj->Country = $paymentObj->getCountry(); + $obj->Currency = $paymentObj->getCurrency(); + $obj->Description = $paymentObj->getDescription(); + $obj->EndUserIP = $this->getIP(); + $obj->Issuer = $paymentObj->getIssuer(); + $obj->Language = $paymentObj->getLanguage(); + $obj->OrderID = $paymentObj->getOrderID(); + $obj->PaymentMethod = $paymentObj->getPaymentMethod(); + $obj->Reference = $paymentObj->getReference(); + $obj->URLCompleted = $this->getSuccessURL(); + $obj->URLError = $this->getErrorURL(); + $obj->PINCode = $this->getPinCode(); + + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + $result = $this->client->phoneDirectCheckout(array('request' => $obj)); + $result = $result->PhoneDirectCheckoutResult; + + /* store the checksum momentarily */ + $checksum = $result->Checksum; + + /* Replace the checksum in the data with secretCode to generate a new checksum */ + $result->Checksum = $this->getSecretCode(); + + // Reverse Success and Error Description, since order must be specific for Checksum + $success = $result->Success; + $errorDescription = $result->ErrorDescription; + + unset($result->Success, $result->ErrorDescription); + + $result->Success = $success; + $result->ErrorDescription = $errorDescription; + + /* Verify response data */ + if ($checksum != $this->generateChecksum($result)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->Checksum = $checksum; + + /* Default return all data */ + return (array) $result; + } + + /** + * The GetPremiumRateNumbers web method is supplementary to the PhoneDirectCheckout web method. + * The idea is that you query the latest premium-rate number information (such as rate per minute, etc.) + * and cache it on your own system so that you can display the + * premium-rate number information to the enduser without having to start a new transaction. + * + * @since version 2.1.0 + * @access public + * @return array result + */ + public function getPremiumRateNumbers() + { + $obj = new StdClass(); + + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + + $obj->Checksum = $this->generateChecksum($obj); + + $result = $this->client->GetPremiumRateNumbers(array('request' => $obj)); + $result = $result->GetPremiumRateNumbersResult; + $premiumRateNumbers = isset($result->PremiumRateNumbers->PremiumRateNumberInformation) ? $result->PremiumRateNumbers->PremiumRateNumberInformation : null; + + // Checksum + $obj = new StdClass(); + + $obj->SecretCode = $this->getSecretCode(); + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $result->Timestamp; + + if (!is_null($premiumRateNumbers)) { + $obj = $this->parseForChecksum($obj, $premiumRateNumbers, true, array("PhoneNumber", "RatePerCall", "RatePerMinute")); + } + + $Checksum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $Checksum) + throw new Exception('Data could not be verified'); + + return (array) $result; + } + + /** + * The GetPremiumRateNumbers web method is supplementary to the PhoneDirectCheckout web method. + * The idea is that you query the latest premium-rate number information (such as rate per minute, etc.) + * and cache it on your own system so that you can display the + * premium-rate number information to the enduser without having to start a new transaction. + * + * @since version 2.1.0 + * @access public + * @param int $paymentID + * @return array result + */ + public function getPayment($paymentID) + { + $obj = new StdClass(); + + $obj->SecretCode = $this->getSecretCode(); + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimestamp(); + $obj->PaymentID = $paymentID; + + $obj->Checksum = $this->generateChecksum($obj); + + $result = $this->client->GetPayment(array('request' => $obj)); + $result = $result->GetPaymentResult; + + $checksum = $result->Checksum; + + $result->Checksum = $this->getSecretCode(); + + // Order object in correct order for Checksum + $result = $this->arrangeObject($result, array( + "Checksum", "MerchantID", "Timestamp", "PaymentID", + "Amount", "ConsumerAccountNumber", "ConsumerBIC", "ConsumerAddress", + "ConsumerCity", "ConsumerCountry", "ConsumerEmail", + "ConsumerHouseNumber", "ConsumerIPAddress", "ConsumerName", + "ConsumerPhoneNumber", "Currency", "Description", "Duration", + "Issuer", "OrderID", "OrderTime", "PaymentMethod", "PaymentTime", + "Reference", "Status", "StatusCode", "TestMode" + )); + + /* Custom checksum for extra fields */ + $signstring = $this->arrangeObject($result, array( + "Checksum", "MerchantID", "Timestamp", "PaymentID", + "Amount", "ConsumerAccountNumber", "ConsumerAddress", + "ConsumerCity", "ConsumerCountry", "ConsumerEmail", + "ConsumerHouseNumber", "ConsumerIPAddress", "ConsumerName", + "ConsumerPhoneNumber", "Currency", "Description", "Duration", + "Issuer", "OrderID", "OrderTime", "PaymentMethod", "PaymentTime", + "Reference", "Status", "StatusCode", "TestMode" + )); + + if ($checksum != $this->generateChecksum($signstring)) + throw new Exception("Data could not be verified"); + + /* Return mister checksum */ + $result->Checksum = $checksum; + + /* Default return all data */ + return (array) $result; + } + +} + +/** + * @package API_Webservice_Refund + */ +class Icepay_Webservice_Refunds extends Icepay_Webservice_Base { + + protected $service = 'https://connect.icepay.com/webservice/refund.svc?wsdl'; + + public function __construct() + { + $this->setupClient(); + } + + /** + * The RequestRefund web method allows you to initiate a refund request for a payment. You can request + * the entire amount to be refunded or just a part of it. If you request only a partial amount to be refunded + * then you are allowed to perform refund requests for the same payment until you have reached its full + * amount. After that you cannot request refunds anymore for that payment. + * + * @since version 2.1.0 + * @access public + * @param int $paymentID + * @param int $refundAmount Amount in cents + * @param string $refundCurrency + */ + public function requestRefund($paymentID, $refundAmount, $refundCurrency) + { + $obj = new stdClass(); + + // Must be in specific order for checksum -- + $obj->Secret = $this->getSecretCode(); + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->PaymentID = $paymentID; + $obj->RefundAmount = $refundAmount; + $obj->RefundCurrency = $refundCurrency; + // ----------------------------------------- + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // Ask for getPaymentRefunds and get response + $result = $this->client->requestRefund($obj); + $result = $result->RequestRefundResult; + + $obj = new StdClass(); + + // Must be in specific order for checksum ------------------- + $obj->Secret = $this->getSecretCode(); + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $result->Timestamp; + $obj->RefundID = $result->RefundID; + $obj->PaymentID = $paymentID; + $obj->RefundAmount = $refundAmount; + $obj->RemainingRefundAmount = $result->RemainingRefundAmount; + $obj->RefundCurrency = $refundCurrency; + // ---------------------------------------------------------- + // Verify response data by making a new Checksum + $Checksum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $Checksum) + throw new Exception('Data could not be verified'); + + return (array) $result; + } + + /** + * The CancelRefund web method allows you to cancel a refund request if it has not already been processed. + * + * @since version 2.1.0 + * @access public + * @param int $refundID + * @param int $paymentID + */ + public function cancelRefund($refundID, $paymentID) + { + $obj = new stdClass(); + + // Must be in specific order for checksum -- + $obj->Secret = $this->getSecretCode(); + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->RefundID = $refundID; + $obj->PaymentID = $paymentID; + // ----------------------------------------- + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // Ask for cancelRefunt and get response + $result = $this->client->CancelRefund($obj); + $result = $result->CancelRefundResult; + + $obj->Timestamp = $result->Timestamp; + $obj->Success = $result->Success; + + // Unset properties for new Checksum + unset($obj->RefundID, $obj->PaymentID, $obj->Checksum); + + // Verify response data by making a new Checksum + $Checksum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $Checksum) + throw new Exception('Data could not be verified'); + + return (array) $result; + } + + /** + * The GetPaymentRefunds web method allows you to query refund request information that belongs to the payment. + * + * @since version 2.1.0 + * @access public + * @param int $paymentID + */ + public function getPaymentRefunds($paymentID) + { + $obj = new stdClass(); + + // Must be in specific order for checksum -- + $obj->Secret = $this->getSecretCode(); + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimeStamp(); + $obj->PaymentID = $paymentID; + // ----------------------------------------- + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // Ask for getPaymentRefunds and get response + $result = $this->client->getPaymentRefunds($obj); + + $result = $result->GetPaymentRefundsResult; + $refunds = isset($result->Refunds->Refund) ? $result->Refunds->Refund : null; + + $obj->Timestamp = $result->Timestamp; + + if (!is_null($refunds)) { + // Assign all properties of the DayStatistics object as property of mainObject + $obj = $this->parseForChecksum($obj, $refunds, true, array("RefundID", "DateCreated", "RefundAmount", "RefundCurrency", "Status")); + } + + // Unset properties for new Checksum + unset($obj->Checksum); + + // Verify response data by making a new Checksum + $Checksum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $Checksum) + throw new Exception('Data could not be verified'); + + return (!is_null($refunds)) ? $this->forceArray($refunds) : array(); + } + +} + +/** + * @package API_Webservice_Reporting + */ +class Icepay_Webservice_Reporting extends Icepay_Webservice_Base { + + protected $service = 'https://connect.icepay.com/webservice/report.svc?wsdl'; + protected $_autokill = false; + protected $_sessionName = "icepay_api_webservice_reportingsession"; + protected $_session; + protected $_username; + protected $_useragent; + protected $_cookie; + protected $_phpsession; + + public function __construct() + { + $this->setupClient(); + } + + public function __destruct() + { + if ($this->_autokill) + $this->killSession(); + } + + /** + * Set the Session ID field + * @since version 2.1.0 + * @access public + * @param string $val + */ + public function setSessionID($val) + { + $this->_session = $val; + return $this; + } + + /** + * Get the SessionID field + * @since version 2.1.0 + * @access public + * @return (string)session + */ + public function getSessionID() + { + return $this->_session; + } + + /** + * Set the Username field + * @since version 2.1.0 + * @access public + * @param string $val + */ + public function setUsername($val) + { + $this->_username = $val; + return $this; + } + + /** + * Get the Username field + * @since version 2.1.0 + * @access private + * @return (string)username + */ + private function getUsername() + { + return $this->_username; + } + + /** + * Set autokill to true or false + * @since version 2.1.0 + * @access public + * @param bool $bool + */ + public function autoKill($bool) + { + $this->_autokill = $bool; + return $this; + } + + /** + * Set the User Agent field + * @since version 2.1.0 + * @access public + * @param string $val + */ + public function setUserAgent($val) + { + $this->_useragent = $val; + return $this; + } + + /** + * Get the User Agent field + * @since version 2.1.0 + * @access public + * @return (string)useragent + */ + private function getUserAgent() + { + return $this->_useragent; + } + + /* + * Make use of Cookies + * + * @since 2.1.0 + * @access public + * @param bool $bool + */ + + public function useCookie($bool = true) + { + $this->_cookie = $bool; + return $this; + } + + /* + * Make use of PHP Sessions + * + * @since 2.1.0 + * @access public + * @param bool $bool + */ + + public function usePHPSession($bool = true) + { + if (!isset($_SESSION)) { + session_start(); + } + $this->_phpsession = $bool; + return $this; + } + + /* + * Creates the PHP Session + * + * @since 2.1.0 + * @access public + * @param bool $sessionID + */ + + public function createPHPSession($sessionID = true) + { + if ($sessionID) { + $_SESSION[$this->_sessionName] = $this->_session; + } + return $this; + } + + /* + * Read the PHP Session + * + * @since 2.1.0 + * @access private + * @param bool $sessionID + * @return bool + */ + + private function readFromPHPSession($sessionID = true) + { + if ($sessionID) { + if (isset($_SESSION[$this->_sessionName]) && $_SESSION[$this->_sessionName] != "") { + $this->_session = $_SESSION[$this->_sessionName]->SessionID; + return true; + } + } + return false; + } + + /* + * Unsets the php Session + * + * @since 2.1.0 + * @access private + */ + + private function unsetPHPSession() + { + unset($_SESSION[$this->_sessionName]); + } + + /** + * Create Cookie + * + * @since 2.1.0 + * @access public + * @return obj this + */ + public function createCookie($cookie = true) + { + if ($cookie) { + $cookietime = time() + (60 * 60 * 24 * 365); + setcookie($this->_sessionName . "_SessionID", $this->_session->SessionID, $cookietime); + setcookie($this->_sessionName . "_Timestamp", $this->_session->Timestamp, $cookietime); + } + + return $this; + } + + /** + * Read Cookie + * + * @since 2.1.0 + * @access public + * @return bool + */ + private function readFromCookie($cookie = true) + { + if ($cookie) { + if (isset($_COOKIE[$this->_sessionName . "_SessionID"])) { + $this->_session = $_COOKIE[$this->_sessionName . "_SessionID"]; + return true; + } + } + + return false; + } + + /* + * Unset cookie + * + * @since 2.1.0 + * @access public * + */ + + public function unsetCookie() + { + setcookie("icepay_api_webservice_reportingsession_SessionID", '', time() - 1000); + setcookie("icepay_api_webservice_reportingsession_Timestamp", '', time() - 1000); + } + + public function initSession() + { + if ($this->_cookie && $this->readFromCookie()) + return true; + if ($this->_phpsession && $this->readFromPHPSession()) + return true; + return $this->createSession(); + } + + /** + * Create Session + * + * @since 2.1.0 + * @access public + * @return (array)session + */ + public function createSession() + { + $obj = new stdClass(); + + $obj->Timestamp = $this->getTimeStamp(); + $obj->Username = $this->getUsername(); + $obj->PinCode = $this->getPinCode(); + $obj->UserAgent = $this->getUserAgent(); + + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // PinCode only used for the Checksum + unset($obj->PinCode); + + // Create the session and get the response + $response = $this->client->CreateSession($obj); + $result = $response->CreateSessionResult; + + // Verify response data by making a new Checksum + $res = new stdClass(); + // Must be in specific order for checksum ----- + $res->Timestamp = $result->Timestamp; + $res->SessionID = $result->SessionID; + $res->PinCode = $this->getPinCode(); + $res->Success = $result->Success; + $res->Description = $result->Description; + // -------------------------------------------- + $checkSum = $this->generateChecksum($res); + + // Compare Checksums + if ($result->Checksum != $checkSum) + throw new Exception("Data could not be verified"); + + // Assign Session + $this->_session = $result; + + $this->createCookie(true); + $this->createPHPSession(true); + + // Return Respsonse + return (array) $response; + } + + /* + * Set the session name + * + * @since 2.1.0 + * @access public + */ + + public function setSessionName($name = "icepay_api_webservice_reportingsession") + { + $this->_sessionName = $name; + } + + /* + * Get the Session Timestamp + * + * @since 2.1.0 + * @access private + * @return string $timestamp + */ + + private function getSessionTimestamp() + { + if ($this->_phpsession && isset($_SESSION[$this->_sessionName]->SessionID)) + $timestamp = $_SESSION[$this->_sessionName]->SessionID; + + + if ($this->_cookie && isset($_COOKIE[$this->_sessionName . "_Timestamp"])) + $timestamp = $_COOKIE[$this->_sessionName . "_Timestamp"]; + + return $timestamp; + } + + /* + * Kill the current session + * + * @since 2.1.0 + * @access public + * @return array $session + */ + + public function killSession() + { + $obj = new stdClass(); + + $obj->Timestamp = $this->getSessionTimestamp(); + $obj->SessionID = $this->getSessionID(); + $obj->PinCode = $this->getPinCode(); + $obj->UserAgent = $this->getUserAgent(); + + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // PinCode only used for the Checksum + unset($obj->Pincode); + + $session = $this->client->KillSession($obj); + + $this->unsetCookie(); + $this->unsetPHPSession(); + + $this->_session = null; + return (array) $session; + } + + /** + * The MonthlyTurnoverTotals web method returns the sum of the turnover of all the transactions according + * to the provided criteria: month, year and currency. + * + * @since version 2.1.0 + * @access public + * @param int $month !required + * @param int $year !required + * @param string $currency + */ + public function monthlyTurnoverTotals($month, $year, $currency = "EUR") + { + if ($month == "" || !is_numeric($month)) + throw new Exception('Please enter a valid month'); + if ($year == "" || !is_numeric($year)) + throw new Exception('Please enter a valid year'); + + $obj = new stdClass(); + + // Must be in specific order for checksum ------ + $obj->Timestamp = $this->getTimeStamp(); + $obj->SessionID = $this->getSessionID(); + $obj->ReportingPinCode = $this->getPinCode(); + $obj->UserAgent = $this->getUserAgent(); + $obj->MerchantID = $this->getMerchantID(); + $obj->CurrencyCode = $currency; + $obj->Year = $year; + $obj->Month = $month; + // --------------------------------------------- + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // PinCode only used for the Checksum + unset($obj->PinCode); + + // Ask for MonthlyTurnoverTotals and get response + $result = $this->client->MonthlyTurnoverTotals($obj); + $result = $result->MonthlyTurnoverTotalsResult; + $dayStats = $result->Days->DayStatistics; + + $obj->Timestamp = $result->Timestamp; + + // Assign all properties of the DayStatistics object as property of mainObject + $obj = $this->parseForChecksum($obj, $dayStats, true, array("Year", "Month", "Day", "Duration", "TransactionsCount", "Turnover")); + + // Unset properties for new Checksum + unset($obj->MerchantID, $obj->Checksum); + + // Verify response data by making a new Checksum + $Checksum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $Checksum) + throw new Exception('Data could not be verified'); + + return (array) $dayStats; + } + + /** + * The getMerchant web method returns a list of merchants that belong to your ICEPAY account. + * + * @since version 2.1.0 + * @access public + * @return array + */ + public function getMerchants() + { + $obj = new stdClass(); + + // Must be in specific order for checksum -- + $obj->Timestamp = $this->getTimeStamp(); + $obj->SessionID = $this->getSessionID(); + $obj->PinCode = $this->getPinCode(); + $obj->UserAgent = $this->getUserAgent(); + // ----------------------------------------- + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // Ask for getMerchants and get response + $result = $this->client->getMerChants($obj); + $result = $result->GetMerchantsResult; + $merchants = isset($result->Merchants->Merchant) ? $result->Merchants->Merchant : null; + + $obj->Timestamp = $result->Timestamp; + + if (!is_null($merchants)) { + // Assign all properties of the Merchants object as property of mainObject + $obj = $this->parseForChecksum($obj, $merchants, true, array("MerchantID", "Description", "TestMode")); + } + + // Unset properties for new Checksum + unset($obj->Checksum); + + // Verify response data by making a new Checksum + $Checksum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $Checksum) + throw new Exception('Data could not be verified'); + + return (array) $merchants; + } + + /** + * The getPaymentMethods web method returns a list of all supported payment methods by ICEPAY. + * + * @since version 2.1.0 + * @access public + */ + public function getPaymentMethods() + { + $obj = new stdClass(); + + // Must be in specific order for checksum -- + $obj->Timestamp = $this->getTimeStamp(); + $obj->SessionID = $this->getSessionID(); + $obj->PinCode = $this->getPinCode(); + $obj->UserAgent = $this->getUserAgent(); + // ----------------------------------------- + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // Ask for GetPaymentMethods and get response + $result = $this->client->GetPaymentMethods($obj); + $result = $result->GetPaymentMethodsResult; + $methods = isset($result->PaymentMethods->PaymentMethod) ? $result->PaymentMethods->PaymentMethod : null; + + $obj->Timestamp = $result->Timestamp; + + if (!is_null($methods)) { + // Assign all properties of the PaymentMethods object as property of mainObject + $obj = $this->parseForChecksum($obj, $methods); + } + + // Unset properties for new Checksum + unset($obj->Checksum); + + // Verify response data by making a new Checksum + $CheckSum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $CheckSum) + throw new Exception('Data could not be verified'); + + return (array) $methods; + } + + /** + * The searchPayments web method allows you to search for payments linked to your ICEPAY account. There are + * several filters which you can employ for a more detailed search. + * + * @since version 2.1.0 + * @access public + * @param array searchOptions + * @return array + */ + public function searchPayments($searchOptions = array()) + { + + $obj = new stdClass(); + // Must be in specific order for checksum ---------- + $obj->Timestamp = $this->getTimeStamp(); + $obj->SessionID = $this->getSessionID(); + $obj->PinCode = $this->getPinCode(); + $obj->UserAgent = $this->getUserAgent(); + $obj->MerchantID = null; + $obj->PaymentID = null; + $obj->OrderID = null; + $obj->Reference = null; + $obj->Description = null; + $obj->Status = null; + $obj->OrderTime1 = null; + $obj->OrderTime2 = null; + $obj->PaymentTime1 = null; + $obj->PaymentTime2 = null; + $obj->CountryCode = null; + $obj->CurrencyCode = null; + $obj->Amount = null; + $obj->PaymentMethod = null; + $obj->ConsumerAccountNumber = null; + $obj->ConsumerName = null; + $obj->ConsumerAddress = null; + $obj->ConsumerHouseNumber = null; + $obj->ConsumerPostCode = null; + $obj->ConsumerCity = null; + $obj->ConsumerCountry = null; + $obj->ConsumerEmail = null; + $obj->ConsumerPhoneNumber = null; + $obj->ConsumerIPAddress = null; + $obj->Page = (int) 1; + // ------------------------------------------------ + + if (!empty($searchOptions)) { + foreach ($searchOptions as $key => $filter) { + $obj->$key = $filter; + } + } + + // Generate Checksum + $obj->Checksum = $this->generateChecksum($obj); + + // Properties only used for the Checksum + unset($obj->PinCode); + + // Ask for SearchPayments and get response + $result = $this->client->SearchPayments($obj); + $result = $result->SearchPaymentsResult; + + $searchResults = isset($result->Payments->Payment) ? $result->Payments->Payment : null; + + $obj = new stdClass(); + $obj->Timestamp = $result->Timestamp; + $obj->SessionID = $this->getSessionID(); + $obj->ReportingPinCode = $this->getPinCode(); + + if (!is_null($searchResults)) { + // Assign all properties of the sub object(s) as property of mainObject + $obj = $this->parseForChecksum($obj, $searchResults, true, array( + "Amount", "ConsumerAccountNumber", "ConsumerAddress", "ConsumerHouseNumber", "ConsumerName", + "ConsumerPostCode", "CountryCode", "CurrencyCode", "Duration", "MerchantID", "OrderTime", + "PaymentID", "PaymentMethod", "PaymentTime", "Status", "StatusCode", "TestMode" + )); + } + + // Verify response data by making a new Checksum + $CheckSum = $this->generateChecksum($obj); + + // Compare Checksums + if ($result->Checksum != $CheckSum) + throw new Exception('Data could not be verified'); + + return (array) $searchResults; + } + +} + +/** + * Icepay AutoCapture Webservice class + * + * @version 1.0.0 + * @author Wouter van Tilburg + * @copyright Copyright (c) 2012, ICEPAY + */ +class Icepay_Webservice_AutoCapture extends Icepay_Webservice_Base { + + protected $service = 'https://connect.icepay.com/webservice/APCapture.svc?wsdl'; + + /** + * AutoCapture Webservice class constructer + * + * @since 1.0.0 + */ + public function __construct() + { + $this->setupClient(); + } + + /** + * Capture an authorized AfterPay payment + * + * @since 1.0.0 + * + * @param string $paymentID + * @param int $amount + * @param string $currency + * @return object + */ + public function captureFull($paymentID, $amount = 0, $currency = '') + { + $obj = new stdClass(); + + $obj->MerchantID = $this->getMerchantID(); + $obj->Timestamp = $this->getTimestamp(); + $obj->amount = $amount; + $obj->currency = $currency; + $obj->PaymentID = $paymentID; + + // Generate checksum for the request + $obj->Checksum = $this->generateChecksum($obj, $this->getSecretCode()); + + // Make the request + $request = $this->client->CaptureFull($obj); + + // Fetch the result + $result = $request->CaptureFullResult; + + // Store result checksum + $resultChecksum = $result->Checksum; + + // Remove result checksum from object + unset($result->Checksum); + + // Create result checksum + $checkSum = $this->generateChecksum($result, $this->getSecretCode()); + + // Compare generated checksum and result checksum + if ($resultChecksum !== $checkSum) + throw new Exception('Data could not be verified'); + + // Return result + return $result; + } + +} + +?> \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/creditcard.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/creditcard.php new file mode 100644 index 00000000..6507a809 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/creditcard.php @@ -0,0 +1,15 @@ + 30, 'maximum' => 1000000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/ddebit.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/ddebit.php new file mode 100644 index 00000000..ade03591 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/ddebit.php @@ -0,0 +1,15 @@ + 1, 'maximum' => 200000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/directebank.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/directebank.php new file mode 100644 index 00000000..655bd56e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/directebank.php @@ -0,0 +1,15 @@ + 30, 'maximum' => 1000000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/giropay.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/giropay.php new file mode 100644 index 00000000..220c355a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/giropay.php @@ -0,0 +1,15 @@ + 30, 'maximum' => 1000000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/ideal.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/ideal.php new file mode 100644 index 00000000..35e37b01 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/ideal.php @@ -0,0 +1,15 @@ + 30, 'maximum' => 1000000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/mistercash.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/mistercash.php new file mode 100644 index 00000000..50a62c0d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/mistercash.php @@ -0,0 +1,15 @@ + 200, 'maximum' => 200000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/paypal.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/paypal.php new file mode 100644 index 00000000..25e07143 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/paypal.php @@ -0,0 +1,15 @@ + 1, 'maximum' => 100000000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/paysafecard.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/paysafecard.php new file mode 100644 index 00000000..3842cffb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/paysafecard.php @@ -0,0 +1,15 @@ + 30, 'maximum' => 1000000); +} + +?> diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/phone.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/phone.php new file mode 100644 index 00000000..530c38a0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/phone.php @@ -0,0 +1,16 @@ + 30, 'maximum' => 1000000); +} + +?> + diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/sms.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/sms.php new file mode 100644 index 00000000..4d42962b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/sms.php @@ -0,0 +1,16 @@ + 30, 'maximum' => 1000000); +} + +?> + diff --git a/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/wire.php b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/wire.php new file mode 100644 index 00000000..20618582 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/icepay/icepay/src/paymentmethods/wire.php @@ -0,0 +1,16 @@ + 30, 'maximum' => 1000000); +} + +?> + diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/.php_cs.dist b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/.php_cs.dist new file mode 100644 index 00000000..5a7a578e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/.php_cs.dist @@ -0,0 +1,33 @@ +in(__DIR__); + +/* Based on ^2.1 of php-cs-fixer */ +$config + ->setRules(array( + // default + '@PSR2' => true, + '@Symfony' => true, + // additionally + 'array_syntax' => array('syntax' => 'long'), + 'binary_operator_spaces' => false, + 'concat_space' => array('spacing' => 'one'), + 'no_useless_else' => true, + 'no_useless_return' => true, + 'ordered_imports' => true, + 'phpdoc_no_package' => false, + 'phpdoc_order' => true, + 'phpdoc_summary' => false, + 'pre_increment' => false, + 'increment_style' => false, + 'simplified_null_return' => false, + 'trailing_comma_in_multiline_array' => false, + 'yoda_style' => false, + 'phpdoc_types_order' => array('null_adjustment' => 'none', 'sort_algorithm' => 'none'), + )) + ->setFinder($finder) +; + +return $config; diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/bin/validate-json b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/bin/validate-json new file mode 100644 index 00000000..d2102fe9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/bin/validate-json @@ -0,0 +1,251 @@ +#!/usr/bin/env php + + */ + +/** + * Dead simple autoloader + * + * @param string $className Name of class to load + * + * @return void + */ +spl_autoload_register(function ($className) +{ + $className = ltrim($className, '\\'); + $fileName = ''; + if ($lastNsPos = strrpos($className, '\\')) { + $namespace = substr($className, 0, $lastNsPos); + $className = substr($className, $lastNsPos + 1); + $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; + } + $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; + if (stream_resolve_include_path($fileName)) { + require_once $fileName; + } +}); + +// support running this tool from git checkout +if (is_dir(__DIR__ . '/../src/JsonSchema')) { + set_include_path(__DIR__ . '/../src' . PATH_SEPARATOR . get_include_path()); +} + +$arOptions = array(); +$arArgs = array(); +array_shift($argv);//script itself +foreach ($argv as $arg) { + if ($arg[0] == '-') { + $arOptions[$arg] = true; + } else { + $arArgs[] = $arg; + } +} + +if (count($arArgs) == 0 + || isset($arOptions['--help']) || isset($arOptions['-h']) +) { + echo << $value) { + if (!strncmp($name, 'JSON_ERROR_', 11)) { + $json_errors[$value] = $name; + } + } + + output('JSON parse error: ' . $json_errors[json_last_error()] . "\n"); +} + +function getUrlFromPath($path) +{ + if (parse_url($path, PHP_URL_SCHEME) !== null) { + //already an URL + return $path; + } + if ($path[0] == '/') { + //absolute path + return 'file://' . $path; + } + + //relative path: make absolute + return 'file://' . getcwd() . '/' . $path; +} + +/** + * Take a HTTP header value and split it up into parts. + * + * @param $headerValue + * @return array Key "_value" contains the main value, all others + * as given in the header value + */ +function parseHeaderValue($headerValue) +{ + if (strpos($headerValue, ';') === false) { + return array('_value' => $headerValue); + } + + $parts = explode(';', $headerValue); + $arData = array('_value' => array_shift($parts)); + foreach ($parts as $part) { + list($name, $value) = explode('=', $part); + $arData[$name] = trim($value, ' "\''); + } + return $arData; +} + +/** + * Send a string to the output stream, but only if --quiet is not enabled + * + * @param $str string A string output + */ +function output($str) { + global $arOptions; + if (!isset($arOptions['--quiet'])) { + echo $str; + } +} + +$urlData = getUrlFromPath($pathData); + +$context = stream_context_create( + array( + 'http' => array( + 'header' => array( + 'Accept: */*', + 'Connection: Close' + ), + 'max_redirects' => 5 + ) + ) +); +$dataString = file_get_contents($pathData, false, $context); +if ($dataString == '') { + output("Data file is not readable or empty.\n"); + exit(3); +} + +$data = json_decode($dataString); +unset($dataString); +if ($data === null) { + output("Error loading JSON data file\n"); + showJsonError(); + exit(5); +} + +if ($pathSchema === null) { + if (isset($http_response_header)) { + array_shift($http_response_header);//HTTP/1.0 line + foreach ($http_response_header as $headerLine) { + list($hName, $hValue) = explode(':', $headerLine, 2); + $hName = strtolower($hName); + if ($hName == 'link') { + //Link: ; rel="describedBy" + $hParts = parseHeaderValue($hValue); + if (isset($hParts['rel']) && $hParts['rel'] == 'describedBy') { + $pathSchema = trim($hParts['_value'], ' <>'); + } + } else if ($hName == 'content-type') { + //Content-Type: application/my-media-type+json; + // profile=http://example.org/schema# + $hParts = parseHeaderValue($hValue); + if (isset($hParts['profile'])) { + $pathSchema = $hParts['profile']; + } + + } + } + } + if (is_object($data) && property_exists($data, '$schema')) { + $pathSchema = $data->{'$schema'}; + } + + //autodetect schema + if ($pathSchema === null) { + output("JSON data must be an object and have a \$schema property.\n"); + output("You can pass the schema file on the command line as well.\n"); + output("Schema autodetection failed.\n"); + exit(6); + } +} +if ($pathSchema[0] == '/') { + $pathSchema = 'file://' . $pathSchema; +} + +$resolver = new JsonSchema\Uri\UriResolver(); +$retriever = new JsonSchema\Uri\UriRetriever(); +try { + $urlSchema = $resolver->resolve($pathSchema, $urlData); + + if (isset($arOptions['--dump-schema-url'])) { + echo $urlSchema . "\n"; + exit(); + } +} catch (Exception $e) { + output("Error loading JSON schema file\n"); + output($urlSchema . "\n"); + output($e->getMessage() . "\n"); + exit(2); +} +$refResolver = new JsonSchema\SchemaStorage($retriever, $resolver); +$schema = $refResolver->resolveRef($urlSchema); + +if (isset($arOptions['--dump-schema'])) { + $options = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0; + echo json_encode($schema, $options) . "\n"; + exit(); +} + +try { + $validator = new JsonSchema\Validator(); + $validator->check($data, $schema); + + if ($validator->isValid()) { + if(isset($arOptions['--verbose'])) { + output("OK. The supplied JSON validates against the schema.\n"); + } + } else { + output("JSON does not validate. Violations:\n"); + foreach ($validator->getErrors() as $error) { + output(sprintf("[%s] %s\n", $error['property'], $error['message'])); + } + exit(23); + } +} catch (Exception $e) { + output("JSON does not validate. Error:\n"); + output($e->getMessage() . "\n"); + output("Error code: " . $e->getCode() . "\n"); + exit(24); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/data.json b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/data.json new file mode 100644 index 00000000..69591b71 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/data.json @@ -0,0 +1,3 @@ +{ + "foo":"bar" +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/demo.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/demo.php new file mode 100644 index 00000000..98b518a7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/demo.php @@ -0,0 +1,18 @@ +check($data, (object) array('$ref' => 'file://' . realpath('schema.json'))); + +if ($validator->isValid()) { + echo "The supplied JSON validates against the schema.\n"; +} else { + echo "JSON does not validate. Violations:\n"; + foreach ($validator->getErrors() as $error) { + echo sprintf("[%s] %s\n", $error['property'], $error['message']); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/schema.json b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/schema.json new file mode 100644 index 00000000..e6307dc1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/demo/schema.json @@ -0,0 +1,3 @@ +{ + "type": "object" +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/dist/schema/json-schema-draft-03.json b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/dist/schema/json-schema-draft-03.json new file mode 100644 index 00000000..7a1a2d38 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/dist/schema/json-schema-draft-03.json @@ -0,0 +1,174 @@ +{ + "$schema": "http://json-schema.org/draft-03/schema#", + "id": "http://json-schema.org/draft-03/schema#", + "type": "object", + + "properties": { + "type": { + "type": [ "string", "array" ], + "items": { + "type": [ "string", { "$ref": "#" } ] + }, + "uniqueItems": true, + "default": "any" + }, + + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + + "additionalProperties": { + "type": [ { "$ref": "#" }, "boolean" ], + "default": {} + }, + + "items": { + "type": [ { "$ref": "#" }, "array" ], + "items": { "$ref": "#" }, + "default": {} + }, + + "additionalItems": { + "type": [ { "$ref": "#" }, "boolean" ], + "default": {} + }, + + "required": { + "type": "boolean", + "default": false + }, + + "dependencies": { + "type": "object", + "additionalProperties": { + "type": [ "string", "array", { "$ref": "#" } ], + "items": { + "type": "string" + } + }, + "default": {} + }, + + "minimum": { + "type": "number" + }, + + "maximum": { + "type": "number" + }, + + "exclusiveMinimum": { + "type": "boolean", + "default": false + }, + + "exclusiveMaximum": { + "type": "boolean", + "default": false + }, + + "minItems": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + + "maxItems": { + "type": "integer", + "minimum": 0 + }, + + "uniqueItems": { + "type": "boolean", + "default": false + }, + + "pattern": { + "type": "string", + "format": "regex" + }, + + "minLength": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + + "maxLength": { + "type": "integer" + }, + + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + + "default": { + "type": "any" + }, + + "title": { + "type": "string" + }, + + "description": { + "type": "string" + }, + + "format": { + "type": "string" + }, + + "divisibleBy": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true, + "default": 1 + }, + + "disallow": { + "type": [ "string", "array" ], + "items": { + "type": [ "string", { "$ref": "#" } ] + }, + "uniqueItems": true + }, + + "extends": { + "type": [ { "$ref": "#" }, "array" ], + "items": { "$ref": "#" }, + "default": {} + }, + + "id": { + "type": "string", + "format": "uri" + }, + + "$ref": { + "type": "string", + "format": "uri" + }, + + "$schema": { + "type": "string", + "format": "uri" + } + }, + + "dependencies": { + "exclusiveMinimum": "minimum", + "exclusiveMaximum": "maximum" + }, + + "default": {} +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/dist/schema/json-schema-draft-04.json b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/dist/schema/json-schema-draft-04.json new file mode 100644 index 00000000..85eb502a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/dist/schema/json-schema-draft-04.json @@ -0,0 +1,150 @@ +{ + "id": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { "$ref": "#" } + }, + "positiveInteger": { + "type": "integer", + "minimum": 0 + }, + "positiveIntegerDefault0": { + "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] + }, + "simpleTypes": { + "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] + }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "uniqueItems": true + } + }, + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uri" + }, + "$schema": { + "type": "string", + "format": "uri" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": {}, + "multipleOf": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "boolean", + "default": false + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "boolean", + "default": false + }, + "maxLength": { "$ref": "#/definitions/positiveInteger" }, + "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "items": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/schemaArray" } + ], + "default": {} + }, + "maxItems": { "$ref": "#/definitions/positiveInteger" }, + "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "maxProperties": { "$ref": "#/definitions/positiveInteger" }, + "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "definitions": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/stringArray" } + ] + } + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "type": { + "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "dependencies": { + "exclusiveMaximum": [ "maximum" ], + "exclusiveMinimum": [ "minimum" ] + }, + "default": {} +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php new file mode 100644 index 00000000..63968213 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php @@ -0,0 +1,148 @@ +factory = $factory ?: new Factory(); + } + + public function addError(JsonPointer $path = null, $message, $constraint = '', array $more = null) + { + $error = array( + 'property' => $this->convertJsonPointerIntoPropertyPath($path ?: new JsonPointer('')), + 'pointer' => ltrim(strval($path ?: new JsonPointer('')), '#'), + 'message' => $message, + 'constraint' => $constraint, + 'context' => $this->factory->getErrorContext(), + ); + + if ($this->factory->getConfig(Constraint::CHECK_MODE_EXCEPTIONS)) { + throw new ValidationException(sprintf('Error validating %s: %s', $error['pointer'], $error['message'])); + } + + if (is_array($more) && count($more) > 0) { + $error += $more; + } + + $this->errors[] = $error; + $this->errorMask |= $error['context']; + } + + public function addErrors(array $errors) + { + if ($errors) { + $this->errors = array_merge($this->errors, $errors); + $errorMask = &$this->errorMask; + array_walk($errors, function ($error) use (&$errorMask) { + if (isset($error['context'])) { + $errorMask |= $error['context']; + } + }); + } + } + + public function getErrors($errorContext = Validator::ERROR_ALL) + { + if ($errorContext === Validator::ERROR_ALL) { + return $this->errors; + } + + return array_filter($this->errors, function ($error) use ($errorContext) { + if ($errorContext & $error['context']) { + return true; + } + }); + } + + public function numErrors($errorContext = Validator::ERROR_ALL) + { + if ($errorContext === Validator::ERROR_ALL) { + return count($this->errors); + } + + return count($this->getErrors($errorContext)); + } + + public function isValid() + { + return !$this->getErrors(); + } + + /** + * Clears any reported errors. Should be used between + * multiple validation checks. + */ + public function reset() + { + $this->errors = array(); + $this->errorMask = Validator::ERROR_NONE; + } + + /** + * Get the error mask + * + * @return int + */ + public function getErrorMask() + { + return $this->errorMask; + } + + /** + * Recursively cast an associative array to an object + * + * @param array $array + * + * @return object + */ + public static function arrayToObjectRecursive($array) + { + $json = json_encode($array); + if (json_last_error() !== \JSON_ERROR_NONE) { + $message = 'Unable to encode schema array as JSON'; + if (function_exists('json_last_error_msg')) { + $message .= ': ' . json_last_error_msg(); + } + throw new InvalidArgumentException($message); + } + + return (object) json_decode($json); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php new file mode 100644 index 00000000..d1384b88 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php @@ -0,0 +1,121 @@ + + * @author Bruno Prieto Reis + */ +class CollectionConstraint extends Constraint +{ + /** + * {@inheritdoc} + */ + public function check(&$value, $schema = null, JsonPointer $path = null, $i = null) + { + // Verify minItems + if (isset($schema->minItems) && count($value) < $schema->minItems) { + $this->addError($path, 'There must be a minimum of ' . $schema->minItems . ' items in the array', 'minItems', array('minItems' => $schema->minItems)); + } + + // Verify maxItems + if (isset($schema->maxItems) && count($value) > $schema->maxItems) { + $this->addError($path, 'There must be a maximum of ' . $schema->maxItems . ' items in the array', 'maxItems', array('maxItems' => $schema->maxItems)); + } + + // Verify uniqueItems + if (isset($schema->uniqueItems) && $schema->uniqueItems) { + $unique = $value; + if (is_array($value) && count($value)) { + $unique = array_map(function ($e) { + return var_export($e, true); + }, $value); + } + if (count(array_unique($unique)) != count($value)) { + $this->addError($path, 'There are no duplicates allowed in the array', 'uniqueItems'); + } + } + + // Verify items + if (isset($schema->items)) { + $this->validateItems($value, $schema, $path, $i); + } + } + + /** + * Validates the items + * + * @param array $value + * @param \stdClass $schema + * @param JsonPointer|null $path + * @param string $i + */ + protected function validateItems(&$value, $schema = null, JsonPointer $path = null, $i = null) + { + if (is_object($schema->items)) { + // just one type definition for the whole array + foreach ($value as $k => &$v) { + $initErrors = $this->getErrors(); + + // First check if its defined in "items" + $this->checkUndefined($v, $schema->items, $path, $k); + + // Recheck with "additionalItems" if the first test fails + if (count($initErrors) < count($this->getErrors()) && (isset($schema->additionalItems) && $schema->additionalItems !== false)) { + $secondErrors = $this->getErrors(); + $this->checkUndefined($v, $schema->additionalItems, $path, $k); + } + + // Reset errors if needed + if (isset($secondErrors) && count($secondErrors) < count($this->getErrors())) { + $this->errors = $secondErrors; + } elseif (isset($secondErrors) && count($secondErrors) === count($this->getErrors())) { + $this->errors = $initErrors; + } + } + unset($v); /* remove dangling reference to prevent any future bugs + * caused by accidentally using $v elsewhere */ + } else { + // Defined item type definitions + foreach ($value as $k => &$v) { + if (array_key_exists($k, $schema->items)) { + $this->checkUndefined($v, $schema->items[$k], $path, $k); + } else { + // Additional items + if (property_exists($schema, 'additionalItems')) { + if ($schema->additionalItems !== false) { + $this->checkUndefined($v, $schema->additionalItems, $path, $k); + } else { + $this->addError( + $path, 'The item ' . $i . '[' . $k . '] is not defined and the definition does not allow additional items', 'additionalItems', array('additionalItems' => $schema->additionalItems)); + } + } else { + // Should be valid against an empty schema + $this->checkUndefined($v, new \stdClass(), $path, $k); + } + } + } + unset($v); /* remove dangling reference to prevent any future bugs + * caused by accidentally using $v elsewhere */ + + // Treat when we have more schema definitions than values, not for empty arrays + if (count($value) > 0) { + for ($k = count($value); $k < count($schema->items); $k++) { + $undefinedInstance = $this->factory->createInstanceFor('undefined'); + $this->checkUndefined($undefinedInstance, $schema->items[$k], $path, $k); + } + } + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php new file mode 100644 index 00000000..a53130df --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php @@ -0,0 +1,213 @@ + + * @author Bruno Prieto Reis + */ +abstract class Constraint extends BaseConstraint implements ConstraintInterface +{ + protected $inlineSchemaProperty = '$schema'; + + const CHECK_MODE_NONE = 0x00000000; + const CHECK_MODE_NORMAL = 0x00000001; + const CHECK_MODE_TYPE_CAST = 0x00000002; + const CHECK_MODE_COERCE_TYPES = 0x00000004; + const CHECK_MODE_APPLY_DEFAULTS = 0x00000008; + const CHECK_MODE_EXCEPTIONS = 0x00000010; + const CHECK_MODE_DISABLE_FORMAT = 0x00000020; + const CHECK_MODE_ONLY_REQUIRED_DEFAULTS = 0x00000080; + const CHECK_MODE_VALIDATE_SCHEMA = 0x00000100; + + /** + * Bubble down the path + * + * @param JsonPointer|null $path Current path + * @param mixed $i What to append to the path + * + * @return JsonPointer; + */ + protected function incrementPath(JsonPointer $path = null, $i) + { + $path = $path ?: new JsonPointer(''); + $path = $path->withPropertyPaths( + array_merge( + $path->getPropertyPaths(), + array_filter(array($i), 'strlen') + ) + ); + + return $path; + } + + /** + * Validates an array + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + */ + protected function checkArray(&$value, $schema = null, JsonPointer $path = null, $i = null) + { + $validator = $this->factory->createInstanceFor('collection'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Validates an object + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $properties + * @param mixed $additionalProperties + * @param mixed $patternProperties + */ + protected function checkObject(&$value, $schema = null, JsonPointer $path = null, $properties = null, + $additionalProperties = null, $patternProperties = null, $appliedDefaults = array()) + { + $validator = $this->factory->createInstanceFor('object'); + $validator->check($value, $schema, $path, $properties, $additionalProperties, $patternProperties, $appliedDefaults); + + $this->addErrors($validator->getErrors()); + } + + /** + * Validates the type of a property + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + */ + protected function checkType(&$value, $schema = null, JsonPointer $path = null, $i = null) + { + $validator = $this->factory->createInstanceFor('type'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a undefined element + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + */ + protected function checkUndefined(&$value, $schema = null, JsonPointer $path = null, $i = null, $fromDefault = false) + { + $validator = $this->factory->createInstanceFor('undefined'); + + $validator->check($value, $this->factory->getSchemaStorage()->resolveRefSchema($schema), $path, $i, $fromDefault); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a string element + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + */ + protected function checkString($value, $schema = null, JsonPointer $path = null, $i = null) + { + $validator = $this->factory->createInstanceFor('string'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a number element + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer $path + * @param mixed $i + */ + protected function checkNumber($value, $schema = null, JsonPointer $path = null, $i = null) + { + $validator = $this->factory->createInstanceFor('number'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a enum element + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + */ + protected function checkEnum($value, $schema = null, JsonPointer $path = null, $i = null) + { + $validator = $this->factory->createInstanceFor('enum'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks format of an element + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + */ + protected function checkFormat($value, $schema = null, JsonPointer $path = null, $i = null) + { + $validator = $this->factory->createInstanceFor('format'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Get the type check based on the set check mode. + * + * @return TypeCheck\TypeCheckInterface + */ + protected function getTypeCheck() + { + return $this->factory->getTypeCheck(); + } + + /** + * @param JsonPointer $pointer + * + * @return string property path + */ + protected function convertJsonPointerIntoPropertyPath(JsonPointer $pointer) + { + $result = array_map( + function ($path) { + return sprintf(is_numeric($path) ? '[%d]' : '.%s', $path); + }, + $pointer->getPropertyPaths() + ); + + return trim(implode('', $result), '.'); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php new file mode 100644 index 00000000..442268e6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php @@ -0,0 +1,65 @@ + + */ +interface ConstraintInterface +{ + /** + * returns all collected errors + * + * @return array + */ + public function getErrors(); + + /** + * adds errors to this validator + * + * @param array $errors + */ + public function addErrors(array $errors); + + /** + * adds an error + * + * @param JsonPointer|null $path + * @param string $message + * @param string $constraint the constraint/rule that is broken, e.g.: 'minLength' + * @param array $more more array elements to add to the error + */ + public function addError(JsonPointer $path = null, $message, $constraint='', array $more = null); + + /** + * checks if the validator has not raised errors + * + * @return bool + */ + public function isValid(); + + /** + * invokes the validation of an element + * + * @abstract + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer|null $path + * @param mixed $i + * + * @throws \JsonSchema\Exception\ExceptionInterface + */ + public function check(&$value, $schema = null, JsonPointer $path = null, $i = null); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php new file mode 100644 index 00000000..0fd2b6a0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php @@ -0,0 +1,54 @@ + + * @author Bruno Prieto Reis + */ +class EnumConstraint extends Constraint +{ + /** + * {@inheritdoc} + */ + public function check(&$element, $schema = null, JsonPointer $path = null, $i = null) + { + // Only validate enum if the attribute exists + if ($element instanceof UndefinedConstraint && (!isset($schema->required) || !$schema->required)) { + return; + } + $type = gettype($element); + + foreach ($schema->enum as $enum) { + $enumType = gettype($enum); + if ($this->factory->getConfig(self::CHECK_MODE_TYPE_CAST) && $type == 'array' && $enumType == 'object') { + if ((object) $element == $enum) { + return; + } + } + + if ($type === gettype($enum)) { + if ($type == 'object') { + if ($element == $enum) { + return; + } + } elseif ($element === $enum) { + return; + } + } + } + + $this->addError($path, 'Does not have a value in the enumeration ' . json_encode($schema->enum), 'enum', array('enum' => $schema->enum)); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php new file mode 100644 index 00000000..4e771c19 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php @@ -0,0 +1,220 @@ + 'JsonSchema\Constraints\CollectionConstraint', + 'collection' => 'JsonSchema\Constraints\CollectionConstraint', + 'object' => 'JsonSchema\Constraints\ObjectConstraint', + 'type' => 'JsonSchema\Constraints\TypeConstraint', + 'undefined' => 'JsonSchema\Constraints\UndefinedConstraint', + 'string' => 'JsonSchema\Constraints\StringConstraint', + 'number' => 'JsonSchema\Constraints\NumberConstraint', + 'enum' => 'JsonSchema\Constraints\EnumConstraint', + 'format' => 'JsonSchema\Constraints\FormatConstraint', + 'schema' => 'JsonSchema\Constraints\SchemaConstraint', + 'validator' => 'JsonSchema\Validator' + ); + + /** + * @var array + */ + private $instanceCache = array(); + + /** + * @param SchemaStorage $schemaStorage + * @param UriRetrieverInterface $uriRetriever + * @param int $checkMode + */ + public function __construct( + SchemaStorageInterface $schemaStorage = null, + UriRetrieverInterface $uriRetriever = null, + $checkMode = Constraint::CHECK_MODE_NORMAL + ) { + // set provided config options + $this->setConfig($checkMode); + + $this->uriRetriever = $uriRetriever ?: new UriRetriever(); + $this->schemaStorage = $schemaStorage ?: new SchemaStorage($this->uriRetriever); + } + + /** + * Set config values + * + * @param int $checkMode Set checkMode options - does not preserve existing flags + */ + public function setConfig($checkMode = Constraint::CHECK_MODE_NORMAL) + { + $this->checkMode = $checkMode; + } + + /** + * Enable checkMode flags + * + * @param int $options + */ + public function addConfig($options) + { + $this->checkMode |= $options; + } + + /** + * Disable checkMode flags + * + * @param int $options + */ + public function removeConfig($options) + { + $this->checkMode &= ~$options; + } + + /** + * Get checkMode option + * + * @param int $options Options to get, if null then return entire bitmask + * + * @return int + */ + public function getConfig($options = null) + { + if ($options === null) { + return $this->checkMode; + } + + return $this->checkMode & $options; + } + + /** + * @return UriRetrieverInterface + */ + public function getUriRetriever() + { + return $this->uriRetriever; + } + + public function getSchemaStorage() + { + return $this->schemaStorage; + } + + public function getTypeCheck() + { + if (!isset($this->typeCheck[$this->checkMode])) { + $this->typeCheck[$this->checkMode] = ($this->checkMode & Constraint::CHECK_MODE_TYPE_CAST) + ? new TypeCheck\LooseTypeCheck() + : new TypeCheck\StrictTypeCheck(); + } + + return $this->typeCheck[$this->checkMode]; + } + + /** + * @param string $name + * @param string $class + * + * @return Factory + */ + public function setConstraintClass($name, $class) + { + // Ensure class exists + if (!class_exists($class)) { + throw new InvalidArgumentException('Unknown constraint ' . $name); + } + // Ensure class is appropriate + if (!in_array('JsonSchema\Constraints\ConstraintInterface', class_implements($class))) { + throw new InvalidArgumentException('Invalid class ' . $name); + } + $this->constraintMap[$name] = $class; + + return $this; + } + + /** + * Create a constraint instance for the given constraint name. + * + * @param string $constraintName + * + * @throws InvalidArgumentException if is not possible create the constraint instance + * + * @return ConstraintInterface|ObjectConstraint + */ + public function createInstanceFor($constraintName) + { + if (!isset($this->constraintMap[$constraintName])) { + throw new InvalidArgumentException('Unknown constraint ' . $constraintName); + } + + if (!isset($this->instanceCache[$constraintName])) { + $this->instanceCache[$constraintName] = new $this->constraintMap[$constraintName]($this); + } + + return clone $this->instanceCache[$constraintName]; + } + + /** + * Get the error context + * + * @return string + */ + public function getErrorContext() + { + return $this->errorContext; + } + + /** + * Set the error context + * + * @param string $validationContext + */ + public function setErrorContext($errorContext) + { + $this->errorContext = $errorContext; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php new file mode 100644 index 00000000..578cdb14 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php @@ -0,0 +1,214 @@ + + * + * @see http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.23 + */ +class FormatConstraint extends Constraint +{ + /** + * {@inheritdoc} + */ + public function check(&$element, $schema = null, JsonPointer $path = null, $i = null) + { + if (!isset($schema->format) || $this->factory->getConfig(self::CHECK_MODE_DISABLE_FORMAT)) { + return; + } + + switch ($schema->format) { + case 'date': + if (!$date = $this->validateDateTime($element, 'Y-m-d')) { + $this->addError($path, sprintf('Invalid date %s, expected format YYYY-MM-DD', json_encode($element)), 'format', array('format' => $schema->format)); + } + break; + + case 'time': + if (!$this->validateDateTime($element, 'H:i:s')) { + $this->addError($path, sprintf('Invalid time %s, expected format hh:mm:ss', json_encode($element)), 'format', array('format' => $schema->format)); + } + break; + + case 'date-time': + if (null === Rfc3339::createFromString($element)) { + $this->addError($path, sprintf('Invalid date-time %s, expected format YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss+hh:mm', json_encode($element)), 'format', array('format' => $schema->format)); + } + break; + + case 'utc-millisec': + if (!$this->validateDateTime($element, 'U')) { + $this->addError($path, sprintf('Invalid time %s, expected integer of milliseconds since Epoch', json_encode($element)), 'format', array('format' => $schema->format)); + } + break; + + case 'regex': + if (!$this->validateRegex($element)) { + $this->addError($path, 'Invalid regex format ' . $element, 'format', array('format' => $schema->format)); + } + break; + + case 'color': + if (!$this->validateColor($element)) { + $this->addError($path, 'Invalid color', 'format', array('format' => $schema->format)); + } + break; + + case 'style': + if (!$this->validateStyle($element)) { + $this->addError($path, 'Invalid style', 'format', array('format' => $schema->format)); + } + break; + + case 'phone': + if (!$this->validatePhone($element)) { + $this->addError($path, 'Invalid phone number', 'format', array('format' => $schema->format)); + } + break; + + case 'uri': + if (null === filter_var($element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE)) { + $this->addError($path, 'Invalid URL format', 'format', array('format' => $schema->format)); + } + break; + + case 'uriref': + case 'uri-reference': + if (null === filter_var($element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE)) { + // FILTER_VALIDATE_URL does not conform to RFC-3986, and cannot handle relative URLs, but + // the json-schema spec uses RFC-3986, so need a bit of hackery to properly validate them. + // See https://tools.ietf.org/html/rfc3986#section-4.2 for additional information. + if (substr($element, 0, 2) === '//') { // network-path reference + $validURL = filter_var('scheme:' . $element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE); + } elseif (substr($element, 0, 1) === '/') { // absolute-path reference + $validURL = filter_var('scheme://host' . $element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE); + } elseif (strlen($element)) { // relative-path reference + $pathParts = explode('/', $element, 2); + if (strpos($pathParts[0], ':') !== false) { + $validURL = null; + } else { + $validURL = filter_var('scheme://host/' . $element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE); + } + } else { + $validURL = null; + } + if ($validURL === null) { + $this->addError($path, 'Invalid URL format', 'format', array('format' => $schema->format)); + } + } + break; + + case 'email': + $filterFlags = FILTER_NULL_ON_FAILURE; + if (defined('FILTER_FLAG_EMAIL_UNICODE')) { + // Only available from PHP >= 7.1.0, so ignore it for coverage checks + $filterFlags |= constant('FILTER_FLAG_EMAIL_UNICODE'); // @codeCoverageIgnore + } + if (null === filter_var($element, FILTER_VALIDATE_EMAIL, $filterFlags)) { + $this->addError($path, 'Invalid email', 'format', array('format' => $schema->format)); + } + break; + + case 'ip-address': + case 'ipv4': + if (null === filter_var($element, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV4)) { + $this->addError($path, 'Invalid IP address', 'format', array('format' => $schema->format)); + } + break; + + case 'ipv6': + if (null === filter_var($element, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV6)) { + $this->addError($path, 'Invalid IP address', 'format', array('format' => $schema->format)); + } + break; + + case 'host-name': + case 'hostname': + if (!$this->validateHostname($element)) { + $this->addError($path, 'Invalid hostname', 'format', array('format' => $schema->format)); + } + break; + + default: + // Empty as it should be: + // The value of this keyword is called a format attribute. It MUST be a string. + // A format attribute can generally only validate a given set of instance types. + // If the type of the instance to validate is not in this set, validation for + // this format attribute and instance SHOULD succeed. + // http://json-schema.org/latest/json-schema-validation.html#anchor105 + break; + } + } + + protected function validateDateTime($datetime, $format) + { + $dt = \DateTime::createFromFormat($format, $datetime); + + if (!$dt) { + return false; + } + + if ($datetime === $dt->format($format)) { + return true; + } + + // handles the case where a non-6 digit microsecond datetime is passed + // which will fail the above string comparison because the passed + // $datetime may be '2000-05-01T12:12:12.123Z' but format() will return + // '2000-05-01T12:12:12.123000Z' + if ((strpos('u', $format) !== -1) && (preg_match('/\.\d+Z$/', $datetime))) { + return true; + } + + return false; + } + + protected function validateRegex($regex) + { + return false !== @preg_match('/' . $regex . '/u', ''); + } + + protected function validateColor($color) + { + if (in_array(strtolower($color), array('aqua', 'black', 'blue', 'fuchsia', + 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'orange', 'purple', + 'red', 'silver', 'teal', 'white', 'yellow'))) { + return true; + } + + return preg_match('/^#([a-f0-9]{3}|[a-f0-9]{6})$/i', $color); + } + + protected function validateStyle($style) + { + $properties = explode(';', rtrim($style, ';')); + $invalidEntries = preg_grep('/^\s*[-a-z]+\s*:\s*.+$/i', $properties, PREG_GREP_INVERT); + + return empty($invalidEntries); + } + + protected function validatePhone($phone) + { + return preg_match('/^\+?(\(\d{3}\)|\d{3}) \d{3} \d{4}$/', $phone); + } + + protected function validateHostname($host) + { + $hostnameRegex = '/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/i'; + + return preg_match($hostnameRegex, $host); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php new file mode 100644 index 00000000..d4c31a46 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php @@ -0,0 +1,81 @@ + + * @author Bruno Prieto Reis + */ +class NumberConstraint extends Constraint +{ + /** + * {@inheritdoc} + */ + public function check(&$element, $schema = null, JsonPointer $path = null, $i = null) + { + // Verify minimum + if (isset($schema->exclusiveMinimum)) { + if (isset($schema->minimum)) { + if ($schema->exclusiveMinimum && $element <= $schema->minimum) { + $this->addError($path, 'Must have a minimum value of ' . $schema->minimum, 'exclusiveMinimum', array('minimum' => $schema->minimum)); + } elseif ($element < $schema->minimum) { + $this->addError($path, 'Must have a minimum value of ' . $schema->minimum, 'minimum', array('minimum' => $schema->minimum)); + } + } else { + $this->addError($path, 'Use of exclusiveMinimum requires presence of minimum', 'missingMinimum'); + } + } elseif (isset($schema->minimum) && $element < $schema->minimum) { + $this->addError($path, 'Must have a minimum value of ' . $schema->minimum, 'minimum', array('minimum' => $schema->minimum)); + } + + // Verify maximum + if (isset($schema->exclusiveMaximum)) { + if (isset($schema->maximum)) { + if ($schema->exclusiveMaximum && $element >= $schema->maximum) { + $this->addError($path, 'Must have a maximum value of ' . $schema->maximum, 'exclusiveMaximum', array('maximum' => $schema->maximum)); + } elseif ($element > $schema->maximum) { + $this->addError($path, 'Must have a maximum value of ' . $schema->maximum, 'maximum', array('maximum' => $schema->maximum)); + } + } else { + $this->addError($path, 'Use of exclusiveMaximum requires presence of maximum', 'missingMaximum'); + } + } elseif (isset($schema->maximum) && $element > $schema->maximum) { + $this->addError($path, 'Must have a maximum value of ' . $schema->maximum, 'maximum', array('maximum' => $schema->maximum)); + } + + // Verify divisibleBy - Draft v3 + if (isset($schema->divisibleBy) && $this->fmod($element, $schema->divisibleBy) != 0) { + $this->addError($path, 'Is not divisible by ' . $schema->divisibleBy, 'divisibleBy', array('divisibleBy' => $schema->divisibleBy)); + } + + // Verify multipleOf - Draft v4 + if (isset($schema->multipleOf) && $this->fmod($element, $schema->multipleOf) != 0) { + $this->addError($path, 'Must be a multiple of ' . $schema->multipleOf, 'multipleOf', array('multipleOf' => $schema->multipleOf)); + } + + $this->checkFormat($element, $schema, $path, $i); + } + + private function fmod($number1, $number2) + { + $modulus = ($number1 - round($number1 / $number2) * $number2); + $precision = 0.0000000001; + + if (-$precision < $modulus && $modulus < $precision) { + return 0.0; + } + + return $modulus; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php new file mode 100644 index 00000000..0010d294 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php @@ -0,0 +1,192 @@ + + * @author Bruno Prieto Reis + */ +class ObjectConstraint extends Constraint +{ + /** + * @var array List of properties to which a default value has been applied + */ + protected $appliedDefaults = array(); + + /** + * {@inheritdoc} + */ + public function check(&$element, $schema = null, JsonPointer $path = null, $properties = null, + $additionalProp = null, $patternProperties = null, $appliedDefaults = array()) + { + if ($element instanceof UndefinedConstraint) { + return; + } + + $this->appliedDefaults = $appliedDefaults; + + $matches = array(); + if ($patternProperties) { + // validate the element pattern properties + $matches = $this->validatePatternProperties($element, $path, $patternProperties); + } + + if ($properties) { + // validate the element properties + $this->validateProperties($element, $properties, $path); + } + + // validate additional element properties & constraints + $this->validateElement($element, $matches, $schema, $path, $properties, $additionalProp); + } + + public function validatePatternProperties($element, JsonPointer $path = null, $patternProperties) + { + $try = array('/', '#', '+', '~', '%'); + $matches = array(); + foreach ($patternProperties as $pregex => $schema) { + $delimiter = '/'; + // Choose delimiter. Necessary for patterns like ^/ , otherwise you get error + foreach ($try as $delimiter) { + if (strpos($pregex, $delimiter) === false) { // safe to use + break; + } + } + + // Validate the pattern before using it to test for matches + if (@preg_match($delimiter . $pregex . $delimiter . 'u', '') === false) { + $this->addError($path, 'The pattern "' . $pregex . '" is invalid', 'pregex', array('pregex' => $pregex)); + continue; + } + foreach ($element as $i => $value) { + if (preg_match($delimiter . $pregex . $delimiter . 'u', $i)) { + $matches[] = $i; + $this->checkUndefined($value, $schema ?: new \stdClass(), $path, $i, in_array($i, $this->appliedDefaults)); + } + } + } + + return $matches; + } + + /** + * Validates the element properties + * + * @param \StdClass $element Element to validate + * @param array $matches Matches from patternProperties (if any) + * @param \StdClass $schema ObjectConstraint definition + * @param JsonPointer|null $path Current test path + * @param \StdClass $properties Properties + * @param mixed $additionalProp Additional properties + */ + public function validateElement($element, $matches, $schema = null, JsonPointer $path = null, + $properties = null, $additionalProp = null) + { + $this->validateMinMaxConstraint($element, $schema, $path); + + foreach ($element as $i => $value) { + $definition = $this->getProperty($properties, $i); + + // no additional properties allowed + if (!in_array($i, $matches) && $additionalProp === false && $this->inlineSchemaProperty !== $i && !$definition) { + $this->addError($path, 'The property ' . $i . ' is not defined and the definition does not allow additional properties', 'additionalProp'); + } + + // additional properties defined + if (!in_array($i, $matches) && $additionalProp && !$definition) { + if ($additionalProp === true) { + $this->checkUndefined($value, null, $path, $i, in_array($i, $this->appliedDefaults)); + } else { + $this->checkUndefined($value, $additionalProp, $path, $i, in_array($i, $this->appliedDefaults)); + } + } + + // property requires presence of another + $require = $this->getProperty($definition, 'requires'); + if ($require && !$this->getProperty($element, $require)) { + $this->addError($path, 'The presence of the property ' . $i . ' requires that ' . $require . ' also be present', 'requires'); + } + + $property = $this->getProperty($element, $i, $this->factory->createInstanceFor('undefined')); + if (is_object($property)) { + $this->validateMinMaxConstraint(!($property instanceof UndefinedConstraint) ? $property : $element, $definition, $path); + } + } + } + + /** + * Validates the definition properties + * + * @param \stdClass $element Element to validate + * @param \stdClass $properties Property definitions + * @param JsonPointer|null $path Path? + */ + public function validateProperties(&$element, $properties = null, JsonPointer $path = null) + { + $undefinedConstraint = $this->factory->createInstanceFor('undefined'); + + foreach ($properties as $i => $value) { + $property = &$this->getProperty($element, $i, $undefinedConstraint); + $definition = $this->getProperty($properties, $i); + + if (is_object($definition)) { + // Undefined constraint will check for is_object() and quit if is not - so why pass it? + $this->checkUndefined($property, $definition, $path, $i, in_array($i, $this->appliedDefaults)); + } + } + } + + /** + * retrieves a property from an object or array + * + * @param mixed $element Element to validate + * @param string $property Property to retrieve + * @param mixed $fallback Default value if property is not found + * + * @return mixed + */ + protected function &getProperty(&$element, $property, $fallback = null) + { + if (is_array($element) && (isset($element[$property]) || array_key_exists($property, $element)) /*$this->checkMode == self::CHECK_MODE_TYPE_CAST*/) { + return $element[$property]; + } elseif (is_object($element) && property_exists($element, $property)) { + return $element->$property; + } + + return $fallback; + } + + /** + * validating minimum and maximum property constraints (if present) against an element + * + * @param \stdClass $element Element to validate + * @param \stdClass $objectDefinition ObjectConstraint definition + * @param JsonPointer|null $path Path to test? + */ + protected function validateMinMaxConstraint($element, $objectDefinition, JsonPointer $path = null) + { + // Verify minimum number of properties + if (isset($objectDefinition->minProperties) && !is_object($objectDefinition->minProperties)) { + if ($this->getTypeCheck()->propertyCount($element) < $objectDefinition->minProperties) { + $this->addError($path, 'Must contain a minimum of ' . $objectDefinition->minProperties . ' properties', 'minProperties', array('minProperties' => $objectDefinition->minProperties)); + } + } + // Verify maximum number of properties + if (isset($objectDefinition->maxProperties) && !is_object($objectDefinition->maxProperties)) { + if ($this->getTypeCheck()->propertyCount($element) > $objectDefinition->maxProperties) { + $this->addError($path, 'Must contain no more than ' . $objectDefinition->maxProperties . ' properties', 'maxProperties', array('maxProperties' => $objectDefinition->maxProperties)); + } + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php new file mode 100644 index 00000000..db665ad3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php @@ -0,0 +1,94 @@ + + * @author Bruno Prieto Reis + */ +class SchemaConstraint extends Constraint +{ + const DEFAULT_SCHEMA_SPEC = 'http://json-schema.org/draft-04/schema#'; + + /** + * {@inheritdoc} + */ + public function check(&$element, $schema = null, JsonPointer $path = null, $i = null) + { + if ($schema !== null) { + // passed schema + $validationSchema = $schema; + } elseif ($this->getTypeCheck()->propertyExists($element, $this->inlineSchemaProperty)) { + // inline schema + $validationSchema = $this->getTypeCheck()->propertyGet($element, $this->inlineSchemaProperty); + } else { + throw new InvalidArgumentException('no schema found to verify against'); + } + + // cast array schemas to object + if (is_array($validationSchema)) { + $validationSchema = BaseConstraint::arrayToObjectRecursive($validationSchema); + } + + // validate schema against whatever is defined in $validationSchema->$schema. If no + // schema is defined, assume self::DEFAULT_SCHEMA_SPEC (currently draft-04). + if ($this->factory->getConfig(self::CHECK_MODE_VALIDATE_SCHEMA)) { + if (!$this->getTypeCheck()->isObject($validationSchema)) { + throw new RuntimeException('Cannot validate the schema of a non-object'); + } + if ($this->getTypeCheck()->propertyExists($validationSchema, '$schema')) { + $schemaSpec = $this->getTypeCheck()->propertyGet($validationSchema, '$schema'); + } else { + $schemaSpec = self::DEFAULT_SCHEMA_SPEC; + } + + // get the spec schema + $schemaStorage = $this->factory->getSchemaStorage(); + if (!$this->getTypeCheck()->isObject($schemaSpec)) { + $schemaSpec = $schemaStorage->getSchema($schemaSpec); + } + + // save error count, config & subtract CHECK_MODE_VALIDATE_SCHEMA + $initialErrorCount = $this->numErrors(); + $initialConfig = $this->factory->getConfig(); + $initialContext = $this->factory->getErrorContext(); + $this->factory->removeConfig(self::CHECK_MODE_VALIDATE_SCHEMA | self::CHECK_MODE_APPLY_DEFAULTS); + $this->factory->addConfig(self::CHECK_MODE_TYPE_CAST); + $this->factory->setErrorContext(Validator::ERROR_SCHEMA_VALIDATION); + + // validate schema + try { + $this->check($validationSchema, $schemaSpec); + } catch (\Exception $e) { + if ($this->factory->getConfig(self::CHECK_MODE_EXCEPTIONS)) { + throw new InvalidSchemaException('Schema did not pass validation', 0, $e); + } + } + if ($this->numErrors() > $initialErrorCount) { + $this->addError($path, 'Schema is not valid', 'schema'); + } + + // restore the initial config + $this->factory->setConfig($initialConfig); + $this->factory->setErrorContext($initialContext); + } + + // validate element against $validationSchema + $this->checkUndefined($element, $validationSchema, $path, $i); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php new file mode 100644 index 00000000..c66af1ed --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php @@ -0,0 +1,60 @@ + + * @author Bruno Prieto Reis + */ +class StringConstraint extends Constraint +{ + /** + * {@inheritdoc} + */ + public function check(&$element, $schema = null, JsonPointer $path = null, $i = null) + { + // Verify maxLength + if (isset($schema->maxLength) && $this->strlen($element) > $schema->maxLength) { + $this->addError($path, 'Must be at most ' . $schema->maxLength . ' characters long', 'maxLength', array( + 'maxLength' => $schema->maxLength, + )); + } + + //verify minLength + if (isset($schema->minLength) && $this->strlen($element) < $schema->minLength) { + $this->addError($path, 'Must be at least ' . $schema->minLength . ' characters long', 'minLength', array( + 'minLength' => $schema->minLength, + )); + } + + // Verify a regex pattern + if (isset($schema->pattern) && !preg_match('#' . str_replace('#', '\\#', $schema->pattern) . '#u', $element)) { + $this->addError($path, 'Does not match the regex pattern ' . $schema->pattern, 'pattern', array( + 'pattern' => $schema->pattern, + )); + } + + $this->checkFormat($element, $schema, $path, $i); + } + + private function strlen($string) + { + if (extension_loaded('mbstring')) { + return mb_strlen($string, mb_detect_encoding($string)); + } + + // mbstring is present on all test platforms, so strlen() can be ignored for coverage + return strlen($string); // @codeCoverageIgnore + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php new file mode 100644 index 00000000..98428853 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php @@ -0,0 +1,68 @@ +{$property}; + } + + return $value[$property]; + } + + public static function propertySet(&$value, $property, $data) + { + if (is_object($value)) { + $value->{$property} = $data; + } else { + $value[$property] = $data; + } + } + + public static function propertyExists($value, $property) + { + if (is_object($value)) { + return property_exists($value, $property); + } + + return array_key_exists($property, $value); + } + + public static function propertyCount($value) + { + if (is_object($value)) { + return count(get_object_vars($value)); + } + + return count($value); + } + + /** + * Check if the provided array is associative or not + * + * @param array $arr + * + * @return bool + */ + private static function isAssociativeArray($arr) + { + return array_keys($arr) !== range(0, count($arr) - 1); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php new file mode 100644 index 00000000..59fa12be --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php @@ -0,0 +1,40 @@ +{$property}; + } + + public static function propertySet(&$value, $property, $data) + { + $value->{$property} = $data; + } + + public static function propertyExists($value, $property) + { + return property_exists($value, $property); + } + + public static function propertyCount($value) + { + if (!is_object($value)) { + return 0; + } + + return count(get_object_vars($value)); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php new file mode 100644 index 00000000..10b40ea0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php @@ -0,0 +1,18 @@ + + * @author Bruno Prieto Reis + */ +class TypeConstraint extends Constraint +{ + /** + * @var array|string[] type wordings for validation error messages + */ + public static $wording = array( + 'integer' => 'an integer', + 'number' => 'a number', + 'boolean' => 'a boolean', + 'object' => 'an object', + 'array' => 'an array', + 'string' => 'a string', + 'null' => 'a null', + 'any' => null, // validation of 'any' is always true so is not needed in message wording + 0 => null, // validation of a false-y value is always true, so not needed as well + ); + + /** + * {@inheritdoc} + */ + public function check(&$value = null, $schema = null, JsonPointer $path = null, $i = null) + { + $type = isset($schema->type) ? $schema->type : null; + $isValid = false; + $wording = array(); + + if (is_array($type)) { + $this->validateTypesArray($value, $type, $wording, $isValid, $path); + } elseif (is_object($type)) { + $this->checkUndefined($value, $type, $path); + + return; + } else { + $isValid = $this->validateType($value, $type); + } + + if ($isValid === false) { + if (!is_array($type)) { + $this->validateTypeNameWording($type); + $wording[] = self::$wording[$type]; + } + $this->addError($path, ucwords(gettype($value)) . ' value found, but ' . + $this->implodeWith($wording, ', ', 'or') . ' is required', 'type'); + } + } + + /** + * Validates the given $value against the array of types in $type. Sets the value + * of $isValid to true, if at least one $type mateches the type of $value or the value + * passed as $isValid is already true. + * + * @param mixed $value Value to validate + * @param array $type TypeConstraints to check agains + * @param array $validTypesWording An array of wordings of the valid types of the array $type + * @param bool $isValid The current validation value + * @param $path + */ + protected function validateTypesArray(&$value, array $type, &$validTypesWording, &$isValid, $path) + { + foreach ($type as $tp) { + // $tp can be an object, if it's a schema instead of a simple type, validate it + // with a new type constraint + if (is_object($tp)) { + if (!$isValid) { + $validator = $this->factory->createInstanceFor('type'); + $subSchema = new \stdClass(); + $subSchema->type = $tp; + $validator->check($value, $subSchema, $path, null); + $error = $validator->getErrors(); + $isValid = !(bool) $error; + $validTypesWording[] = self::$wording['object']; + } + } else { + $this->validateTypeNameWording($tp); + $validTypesWording[] = self::$wording[$tp]; + if (!$isValid) { + $isValid = $this->validateType($value, $tp); + } + } + } + } + + /** + * Implodes the given array like implode() with turned around parameters and with the + * difference, that, if $listEnd isn't false, the last element delimiter is $listEnd instead of + * $delimiter. + * + * @param array $elements The elements to implode + * @param string $delimiter The delimiter to use + * @param bool $listEnd The last delimiter to use (defaults to $delimiter) + * + * @return string + */ + protected function implodeWith(array $elements, $delimiter = ', ', $listEnd = false) + { + if ($listEnd === false || !isset($elements[1])) { + return implode($delimiter, $elements); + } + $lastElement = array_slice($elements, -1); + $firsElements = join($delimiter, array_slice($elements, 0, -1)); + $implodedElements = array_merge(array($firsElements), $lastElement); + + return join(" $listEnd ", $implodedElements); + } + + /** + * Validates the given $type, if there's an associated self::$wording. If not, throws an + * exception. + * + * @param string $type The type to validate + * + * @throws StandardUnexpectedValueException + */ + protected function validateTypeNameWording($type) + { + if (!isset(self::$wording[$type])) { + throw new StandardUnexpectedValueException( + sprintf( + 'No wording for %s available, expected wordings are: [%s]', + var_export($type, true), + implode(', ', array_filter(self::$wording))) + ); + } + } + + /** + * Verifies that a given value is of a certain type + * + * @param mixed $value Value to validate + * @param string $type TypeConstraint to check against + * + * @throws InvalidArgumentException + * + * @return bool + */ + protected function validateType(&$value, $type) + { + //mostly the case for inline schema + if (!$type) { + return true; + } + + if ('any' === $type) { + return true; + } + + if ('object' === $type) { + return $this->getTypeCheck()->isObject($value); + } + + if ('array' === $type) { + return $this->getTypeCheck()->isArray($value); + } + + $coerce = $this->factory->getConfig(Constraint::CHECK_MODE_COERCE_TYPES); + + if ('integer' === $type) { + if ($coerce) { + $value = $this->toInteger($value); + } + + return is_int($value); + } + + if ('number' === $type) { + if ($coerce) { + $value = $this->toNumber($value); + } + + return is_numeric($value) && !is_string($value); + } + + if ('boolean' === $type) { + if ($coerce) { + $value = $this->toBoolean($value); + } + + return is_bool($value); + } + + if ('string' === $type) { + return is_string($value); + } + + if ('email' === $type) { + return is_string($value); + } + + if ('null' === $type) { + return is_null($value); + } + + throw new InvalidArgumentException((is_object($value) ? 'object' : $value) . ' is an invalid type for ' . $type); + } + + /** + * Converts a value to boolean. For example, "true" becomes true. + * + * @param $value The value to convert to boolean + * + * @return bool|mixed + */ + protected function toBoolean($value) + { + if ($value === 'true') { + return true; + } + + if ($value === 'false') { + return false; + } + + return $value; + } + + /** + * Converts a numeric string to a number. For example, "4" becomes 4. + * + * @param mixed $value the value to convert to a number + * + * @return int|float|mixed + */ + protected function toNumber($value) + { + if (is_numeric($value)) { + return $value + 0; // cast to number + } + + return $value; + } + + protected function toInteger($value) + { + if (is_numeric($value) && (int) $value == $value) { + return (int) $value; // cast to number + } + + return $value; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php new file mode 100644 index 00000000..8effd4ba --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php @@ -0,0 +1,419 @@ + + * @author Bruno Prieto Reis + */ +class UndefinedConstraint extends Constraint +{ + /** + * @var array List of properties to which a default value has been applied + */ + protected $appliedDefaults = array(); + + /** + * {@inheritdoc} + */ + public function check(&$value, $schema = null, JsonPointer $path = null, $i = null, $fromDefault = false) + { + if (is_null($schema) || !is_object($schema)) { + return; + } + + $path = $this->incrementPath($path ?: new JsonPointer(''), $i); + if ($fromDefault) { + $path->setFromDefault(); + } + + // check special properties + $this->validateCommonProperties($value, $schema, $path, $i); + + // check allOf, anyOf, and oneOf properties + $this->validateOfProperties($value, $schema, $path, ''); + + // check known types + $this->validateTypes($value, $schema, $path, $i); + } + + /** + * Validates the value against the types + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer $path + * @param string $i + */ + public function validateTypes(&$value, $schema, JsonPointer $path, $i = null) + { + // check array + if ($this->getTypeCheck()->isArray($value)) { + $this->checkArray($value, $schema, $path, $i); + } + + // check object + if (LooseTypeCheck::isObject($value)) { // object processing should always be run on assoc arrays, + // so use LooseTypeCheck here even if CHECK_MODE_TYPE_CAST + // is not set (i.e. don't use $this->getTypeCheck() here). + $this->checkObject( + $value, + $schema, + $path, + isset($schema->properties) ? $schema->properties : null, + isset($schema->additionalProperties) ? $schema->additionalProperties : null, + isset($schema->patternProperties) ? $schema->patternProperties : null, + $this->appliedDefaults + ); + } + + // check string + if (is_string($value)) { + $this->checkString($value, $schema, $path, $i); + } + + // check numeric + if (is_numeric($value)) { + $this->checkNumber($value, $schema, $path, $i); + } + + // check enum + if (isset($schema->enum)) { + $this->checkEnum($value, $schema, $path, $i); + } + } + + /** + * Validates common properties + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer $path + * @param string $i + */ + protected function validateCommonProperties(&$value, $schema, JsonPointer $path, $i = '') + { + // if it extends another schema, it must pass that schema as well + if (isset($schema->extends)) { + if (is_string($schema->extends)) { + $schema->extends = $this->validateUri($schema, $schema->extends); + } + if (is_array($schema->extends)) { + foreach ($schema->extends as $extends) { + $this->checkUndefined($value, $extends, $path, $i); + } + } else { + $this->checkUndefined($value, $schema->extends, $path, $i); + } + } + + // Apply default values from schema + if (!$path->fromDefault()) { + $this->applyDefaultValues($value, $schema, $path); + } + + // Verify required values + if ($this->getTypeCheck()->isObject($value)) { + if (!($value instanceof self) && isset($schema->required) && is_array($schema->required)) { + // Draft 4 - Required is an array of strings - e.g. "required": ["foo", ...] + foreach ($schema->required as $required) { + if (!$this->getTypeCheck()->propertyExists($value, $required)) { + $this->addError( + $this->incrementPath($path ?: new JsonPointer(''), $required), + 'The property ' . $required . ' is required', + 'required' + ); + } + } + } elseif (isset($schema->required) && !is_array($schema->required)) { + // Draft 3 - Required attribute - e.g. "foo": {"type": "string", "required": true} + if ($schema->required && $value instanceof self) { + $propertyPaths = $path->getPropertyPaths(); + $propertyName = end($propertyPaths); + $this->addError( + $path, + 'The property ' . $propertyName . ' is required', + 'required' + ); + } + } else { + // if the value is both undefined and not required, skip remaining checks + // in this method which assume an actual, defined instance when validating. + if ($value instanceof self) { + return; + } + } + } + + // Verify type + if (!($value instanceof self)) { + $this->checkType($value, $schema, $path, $i); + } + + // Verify disallowed items + if (isset($schema->disallow)) { + $initErrors = $this->getErrors(); + + $typeSchema = new \stdClass(); + $typeSchema->type = $schema->disallow; + $this->checkType($value, $typeSchema, $path); + + // if no new errors were raised it must be a disallowed value + if (count($this->getErrors()) == count($initErrors)) { + $this->addError($path, 'Disallowed value was matched', 'disallow'); + } else { + $this->errors = $initErrors; + } + } + + if (isset($schema->not)) { + $initErrors = $this->getErrors(); + $this->checkUndefined($value, $schema->not, $path, $i); + + // if no new errors were raised then the instance validated against the "not" schema + if (count($this->getErrors()) == count($initErrors)) { + $this->addError($path, 'Matched a schema which it should not', 'not'); + } else { + $this->errors = $initErrors; + } + } + + // Verify that dependencies are met + if (isset($schema->dependencies) && $this->getTypeCheck()->isObject($value)) { + $this->validateDependencies($value, $schema->dependencies, $path); + } + } + + /** + * Check whether a default should be applied for this value + * + * @param mixed $schema + * @param mixed $parentSchema + * @param bool $requiredOnly + * + * @return bool + */ + private function shouldApplyDefaultValue($requiredOnly, $schema, $name = null, $parentSchema = null) + { + // required-only mode is off + if (!$requiredOnly) { + return true; + } + // draft-04 required is set + if ( + $name !== null + && isset($parentSchema->required) + && is_array($parentSchema->required) + && in_array($name, $parentSchema->required) + ) { + return true; + } + // draft-03 required is set + if (isset($schema->required) && !is_array($schema->required) && $schema->required) { + return true; + } + // default case + return false; + } + + /** + * Apply default values + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer $path + */ + protected function applyDefaultValues(&$value, $schema, $path) + { + // only apply defaults if feature is enabled + if (!$this->factory->getConfig(self::CHECK_MODE_APPLY_DEFAULTS)) { + return; + } + + // apply defaults if appropriate + $requiredOnly = $this->factory->getConfig(self::CHECK_MODE_ONLY_REQUIRED_DEFAULTS); + if (isset($schema->properties) && LooseTypeCheck::isObject($value)) { + // $value is an object or assoc array, and properties are defined - treat as an object + foreach ($schema->properties as $currentProperty => $propertyDefinition) { + $propertyDefinition = $this->factory->getSchemaStorage()->resolveRefSchema($propertyDefinition); + if ( + !LooseTypeCheck::propertyExists($value, $currentProperty) + && property_exists($propertyDefinition, 'default') + && $this->shouldApplyDefaultValue($requiredOnly, $propertyDefinition, $currentProperty, $schema) + ) { + // assign default value + if (is_object($propertyDefinition->default)) { + LooseTypeCheck::propertySet($value, $currentProperty, clone $propertyDefinition->default); + } else { + LooseTypeCheck::propertySet($value, $currentProperty, $propertyDefinition->default); + } + $this->appliedDefaults[] = $currentProperty; + } + } + } elseif (isset($schema->items) && LooseTypeCheck::isArray($value)) { + $items = array(); + if (LooseTypeCheck::isArray($schema->items)) { + $items = $schema->items; + } elseif (isset($schema->minItems) && count($value) < $schema->minItems) { + $items = array_fill(count($value), $schema->minItems - count($value), $schema->items); + } + // $value is an array, and items are defined - treat as plain array + foreach ($items as $currentItem => $itemDefinition) { + $itemDefinition = $this->factory->getSchemaStorage()->resolveRefSchema($itemDefinition); + if ( + !array_key_exists($currentItem, $value) + && property_exists($itemDefinition, 'default') + && $this->shouldApplyDefaultValue($requiredOnly, $itemDefinition)) { + if (is_object($itemDefinition->default)) { + $value[$currentItem] = clone $itemDefinition->default; + } else { + $value[$currentItem] = $itemDefinition->default; + } + } + $path->setFromDefault(); + } + } elseif ( + $value instanceof self + && property_exists($schema, 'default') + && $this->shouldApplyDefaultValue($requiredOnly, $schema)) { + // $value is a leaf, not a container - apply the default directly + $value = is_object($schema->default) ? clone $schema->default : $schema->default; + $path->setFromDefault(); + } + } + + /** + * Validate allOf, anyOf, and oneOf properties + * + * @param mixed $value + * @param mixed $schema + * @param JsonPointer $path + * @param string $i + */ + protected function validateOfProperties(&$value, $schema, JsonPointer $path, $i = '') + { + // Verify type + if ($value instanceof self) { + return; + } + + if (isset($schema->allOf)) { + $isValid = true; + foreach ($schema->allOf as $allOf) { + $initErrors = $this->getErrors(); + $this->checkUndefined($value, $allOf, $path, $i); + $isValid = $isValid && (count($this->getErrors()) == count($initErrors)); + } + if (!$isValid) { + $this->addError($path, 'Failed to match all schemas', 'allOf'); + } + } + + if (isset($schema->anyOf)) { + $isValid = false; + $startErrors = $this->getErrors(); + $caughtException = null; + foreach ($schema->anyOf as $anyOf) { + $initErrors = $this->getErrors(); + try { + $this->checkUndefined($value, $anyOf, $path, $i); + if ($isValid = (count($this->getErrors()) == count($initErrors))) { + break; + } + } catch (ValidationException $e) { + $isValid = false; + } + } + if (!$isValid) { + $this->addError($path, 'Failed to match at least one schema', 'anyOf'); + } else { + $this->errors = $startErrors; + } + } + + if (isset($schema->oneOf)) { + $allErrors = array(); + $matchedSchemas = 0; + $startErrors = $this->getErrors(); + foreach ($schema->oneOf as $oneOf) { + try { + $this->errors = array(); + $this->checkUndefined($value, $oneOf, $path, $i); + if (count($this->getErrors()) == 0) { + $matchedSchemas++; + } + $allErrors = array_merge($allErrors, array_values($this->getErrors())); + } catch (ValidationException $e) { + // deliberately do nothing here - validation failed, but we want to check + // other schema options in the OneOf field. + } + } + if ($matchedSchemas !== 1) { + $this->addErrors(array_merge($allErrors, $startErrors)); + $this->addError($path, 'Failed to match exactly one schema', 'oneOf'); + } else { + $this->errors = $startErrors; + } + } + } + + /** + * Validate dependencies + * + * @param mixed $value + * @param mixed $dependencies + * @param JsonPointer $path + * @param string $i + */ + protected function validateDependencies($value, $dependencies, JsonPointer $path, $i = '') + { + foreach ($dependencies as $key => $dependency) { + if ($this->getTypeCheck()->propertyExists($value, $key)) { + if (is_string($dependency)) { + // Draft 3 string is allowed - e.g. "dependencies": {"bar": "foo"} + if (!$this->getTypeCheck()->propertyExists($value, $dependency)) { + $this->addError($path, "$key depends on $dependency and $dependency is missing", 'dependencies'); + } + } elseif (is_array($dependency)) { + // Draft 4 must be an array - e.g. "dependencies": {"bar": ["foo"]} + foreach ($dependency as $d) { + if (!$this->getTypeCheck()->propertyExists($value, $d)) { + $this->addError($path, "$key depends on $d and $d is missing", 'dependencies'); + } + } + } elseif (is_object($dependency)) { + // Schema - e.g. "dependencies": {"bar": {"properties": {"foo": {...}}}} + $this->checkUndefined($value, $dependency, $path, $i); + } + } + } + } + + protected function validateUri($schema, $schemaUri = null) + { + $resolver = new UriResolver(); + $retriever = $this->factory->getUriRetriever(); + + $jsonSchema = null; + if ($resolver->isValid($schemaUri)) { + $schemaId = property_exists($schema, 'id') ? $schema->id : null; + $jsonSchema = $retriever->retrieve($schemaId, $schemaUri); + } + + return $jsonSchema; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php new file mode 100644 index 00000000..fcaf5b8d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php @@ -0,0 +1,161 @@ + + */ +class JsonPointer +{ + /** @var string */ + private $filename; + + /** @var string[] */ + private $propertyPaths = array(); + + /** + * @var bool Whether the value at this path was set from a schema default + */ + private $fromDefault = false; + + /** + * @param string $value + * + * @throws InvalidArgumentException when $value is not a string + */ + public function __construct($value) + { + if (!is_string($value)) { + throw new InvalidArgumentException('Ref value must be a string'); + } + + $splitRef = explode('#', $value, 2); + $this->filename = $splitRef[0]; + if (array_key_exists(1, $splitRef)) { + $this->propertyPaths = $this->decodePropertyPaths($splitRef[1]); + } + } + + /** + * @param string $propertyPathString + * + * @return string[] + */ + private function decodePropertyPaths($propertyPathString) + { + $paths = array(); + foreach (explode('/', trim($propertyPathString, '/')) as $path) { + $path = $this->decodePath($path); + if (is_string($path) && '' !== $path) { + $paths[] = $path; + } + } + + return $paths; + } + + /** + * @return array + */ + private function encodePropertyPaths() + { + return array_map( + array($this, 'encodePath'), + $this->getPropertyPaths() + ); + } + + /** + * @param string $path + * + * @return string + */ + private function decodePath($path) + { + return strtr($path, array('~1' => '/', '~0' => '~', '%25' => '%')); + } + + /** + * @param string $path + * + * @return string + */ + private function encodePath($path) + { + return strtr($path, array('/' => '~1', '~' => '~0', '%' => '%25')); + } + + /** + * @return string + */ + public function getFilename() + { + return $this->filename; + } + + /** + * @return string[] + */ + public function getPropertyPaths() + { + return $this->propertyPaths; + } + + /** + * @param array $propertyPaths + * + * @return JsonPointer + */ + public function withPropertyPaths(array $propertyPaths) + { + $new = clone $this; + $new->propertyPaths = $propertyPaths; + + return $new; + } + + /** + * @return string + */ + public function getPropertyPathAsString() + { + return rtrim('#/' . implode('/', $this->encodePropertyPaths()), '/'); + } + + /** + * @return string + */ + public function __toString() + { + return $this->getFilename() . $this->getPropertyPathAsString(); + } + + /** + * Mark the value at this path as being set from a schema default + */ + public function setFromDefault() + { + $this->fromDefault = true; + } + + /** + * Check whether the value at this path was set from a schema default + * + * @return bool + */ + public function fromDefault() + { + return $this->fromDefault; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php new file mode 100644 index 00000000..439bd277 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php @@ -0,0 +1,7 @@ + + */ +class UnresolvableJsonPointerException extends InvalidArgumentException +{ +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php new file mode 100644 index 00000000..13b73033 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php @@ -0,0 +1,17 @@ + + */ +class ObjectIterator implements \Iterator, \Countable +{ + /** @var object */ + private $object; + + /** @var int */ + private $position = 0; + + /** @var array */ + private $data = array(); + + /** @var bool */ + private $initialized = false; + + /** + * @param object $object + */ + public function __construct($object) + { + $this->object = $object; + } + + /** + * {@inheritdoc} + */ + public function current() + { + $this->initialize(); + + return $this->data[$this->position]; + } + + /** + * {@inheritdoc} + */ + public function next() + { + $this->initialize(); + $this->position++; + } + + /** + * {@inheritdoc} + */ + public function key() + { + $this->initialize(); + + return $this->position; + } + + /** + * {@inheritdoc} + */ + public function valid() + { + $this->initialize(); + + return isset($this->data[$this->position]); + } + + /** + * {@inheritdoc} + */ + public function rewind() + { + $this->initialize(); + $this->position = 0; + } + + /** + * {@inheritdoc} + */ + public function count() + { + $this->initialize(); + + return count($this->data); + } + + /** + * Initializer + */ + private function initialize() + { + if (!$this->initialized) { + $this->data = $this->buildDataFromObject($this->object); + $this->initialized = true; + } + } + + /** + * @param object $object + * + * @return array + */ + private function buildDataFromObject($object) + { + $result = array(); + + $stack = new \SplStack(); + $stack->push($object); + + while (!$stack->isEmpty()) { + $current = $stack->pop(); + if (is_object($current)) { + array_push($result, $current); + } + + foreach ($this->getDataFromItem($current) as $propertyName => $propertyValue) { + if (is_object($propertyValue) || is_array($propertyValue)) { + $stack->push($propertyValue); + } + } + } + + return $result; + } + + /** + * @param object|array $item + * + * @return array + */ + private function getDataFromItem($item) + { + if (!is_object($item) && !is_array($item)) { + return array(); + } + + return is_object($item) ? get_object_vars($item) : $item; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php new file mode 100644 index 00000000..adca581a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php @@ -0,0 +1,30 @@ +uriRetriever = $uriRetriever ?: new UriRetriever(); + $this->uriResolver = $uriResolver ?: new UriResolver(); + } + + /** + * @return UriRetrieverInterface + */ + public function getUriRetriever() + { + return $this->uriRetriever; + } + + /** + * @return UriResolverInterface + */ + public function getUriResolver() + { + return $this->uriResolver; + } + + /** + * {@inheritdoc} + */ + public function addSchema($id, $schema = null) + { + if (is_null($schema) && $id !== self::INTERNAL_PROVIDED_SCHEMA_URI) { + // if the schema was user-provided to Validator and is still null, then assume this is + // what the user intended, as there's no way for us to retrieve anything else. User-supplied + // schemas do not have an associated URI when passed via Validator::validate(). + $schema = $this->uriRetriever->retrieve($id); + } + + // cast array schemas to object + if (is_array($schema)) { + $schema = BaseConstraint::arrayToObjectRecursive($schema); + } + + // workaround for bug in draft-03 & draft-04 meta-schemas (id & $ref defined with incorrect format) + // see https://github.com/json-schema-org/JSON-Schema-Test-Suite/issues/177#issuecomment-293051367 + if (is_object($schema) && property_exists($schema, 'id')) { + if ($schema->id == 'http://json-schema.org/draft-04/schema#') { + $schema->properties->id->format = 'uri-reference'; + } elseif ($schema->id == 'http://json-schema.org/draft-03/schema#') { + $schema->properties->id->format = 'uri-reference'; + $schema->properties->{'$ref'}->format = 'uri-reference'; + } + } + + // resolve references + $this->expandRefs($schema, $id); + + $this->schemas[$id] = $schema; + } + + /** + * Recursively resolve all references against the provided base + * + * @param mixed $schema + * @param string $base + */ + private function expandRefs(&$schema, $base = null) + { + if (!is_object($schema)) { + if (is_array($schema)) { + foreach ($schema as &$member) { + $this->expandRefs($member, $base); + } + } + + return; + } + + if (property_exists($schema, 'id') && is_string($schema->id) && $base != $schema->id) { + $base = $this->uriResolver->resolve($schema->id, $base); + } + + if (property_exists($schema, '$ref') && is_string($schema->{'$ref'})) { + $refPointer = new JsonPointer($this->uriResolver->resolve($schema->{'$ref'}, $base)); + $schema->{'$ref'} = (string) $refPointer; + } + + foreach ($schema as &$member) { + $this->expandRefs($member, $base); + } + } + + /** + * {@inheritdoc} + */ + public function getSchema($id) + { + if (!array_key_exists($id, $this->schemas)) { + $this->addSchema($id); + } + + return $this->schemas[$id]; + } + + /** + * {@inheritdoc} + */ + public function resolveRef($ref) + { + $jsonPointer = new JsonPointer($ref); + + // resolve filename for pointer + $fileName = $jsonPointer->getFilename(); + if (!strlen($fileName)) { + throw new UnresolvableJsonPointerException(sprintf( + "Could not resolve fragment '%s': no file is defined", + $jsonPointer->getPropertyPathAsString() + )); + } + + // get & process the schema + $refSchema = $this->getSchema($fileName); + foreach ($jsonPointer->getPropertyPaths() as $path) { + if (is_object($refSchema) && property_exists($refSchema, $path)) { + $refSchema = $this->resolveRefSchema($refSchema->{$path}); + } elseif (is_array($refSchema) && array_key_exists($path, $refSchema)) { + $refSchema = $this->resolveRefSchema($refSchema[$path]); + } else { + throw new UnresolvableJsonPointerException(sprintf( + 'File: %s is found, but could not resolve fragment: %s', + $jsonPointer->getFilename(), + $jsonPointer->getPropertyPathAsString() + )); + } + } + + return $refSchema; + } + + /** + * {@inheritdoc} + */ + public function resolveRefSchema($refSchema) + { + if (is_object($refSchema) && property_exists($refSchema, '$ref') && is_string($refSchema->{'$ref'})) { + $newSchema = $this->resolveRef($refSchema->{'$ref'}); + $refSchema = (object) (get_object_vars($refSchema) + get_object_vars($newSchema)); + unset($refSchema->{'$ref'}); + } + + return $refSchema; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php new file mode 100644 index 00000000..ddaf6633 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php @@ -0,0 +1,41 @@ + + */ +abstract class AbstractRetriever implements UriRetrieverInterface +{ + /** + * Media content type + * + * @var string + */ + protected $contentType; + + /** + * {@inheritdoc} + * + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::getContentType() + */ + public function getContentType() + { + return $this->contentType; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php new file mode 100644 index 00000000..81c86037 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php @@ -0,0 +1,83 @@ + + */ +class Curl extends AbstractRetriever +{ + protected $messageBody; + + public function __construct() + { + if (!function_exists('curl_init')) { + // Cannot test this, because curl_init is present on all test platforms plus mock + throw new RuntimeException('cURL not installed'); // @codeCoverageIgnore + } + } + + /** + * {@inheritdoc} + * + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() + */ + public function retrieve($uri) + { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $uri); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: ' . Validator::SCHEMA_MEDIA_TYPE)); + + $response = curl_exec($ch); + if (false === $response) { + throw new \JsonSchema\Exception\ResourceNotFoundException('JSON schema not found'); + } + + $this->fetchMessageBody($response); + $this->fetchContentType($response); + + curl_close($ch); + + return $this->messageBody; + } + + /** + * @param string $response cURL HTTP response + */ + private function fetchMessageBody($response) + { + preg_match("/(?:\r\n){2}(.*)$/ms", $response, $match); + $this->messageBody = $match[1]; + } + + /** + * @param string $response cURL HTTP response + * + * @return bool Whether the Content-Type header was found or not + */ + protected function fetchContentType($response) + { + if (0 < preg_match("/Content-Type:(\V*)/ims", $response, $match)) { + $this->contentType = trim($match[1]); + + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php new file mode 100644 index 00000000..7019814f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php @@ -0,0 +1,93 @@ + + */ +class FileGetContents extends AbstractRetriever +{ + protected $messageBody; + + /** + * {@inheritdoc} + * + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() + */ + public function retrieve($uri) + { + $errorMessage = null; + set_error_handler(function ($errno, $errstr) use (&$errorMessage) { + $errorMessage = $errstr; + }); + $response = file_get_contents($uri); + restore_error_handler(); + + if ($errorMessage) { + throw new ResourceNotFoundException($errorMessage); + } + + if (false === $response) { + throw new ResourceNotFoundException('JSON schema not found at ' . $uri); + } + + if ($response == '' + && substr($uri, 0, 7) == 'file://' && substr($uri, -1) == '/' + ) { + throw new ResourceNotFoundException('JSON schema not found at ' . $uri); + } + + $this->messageBody = $response; + if (!empty($http_response_header)) { + // $http_response_header cannot be tested, because it's defined in the method's local scope + // See http://php.net/manual/en/reserved.variables.httpresponseheader.php for more info. + $this->fetchContentType($http_response_header); // @codeCoverageIgnore + } else { // @codeCoverageIgnore + // Could be a "file://" url or something else - fake up the response + $this->contentType = null; + } + + return $this->messageBody; + } + + /** + * @param array $headers HTTP Response Headers + * + * @return bool Whether the Content-Type header was found or not + */ + private function fetchContentType(array $headers) + { + foreach ($headers as $header) { + if ($this->contentType = self::getContentTypeMatchInHeader($header)) { + return true; + } + } + + return false; + } + + /** + * @param string $header + * + * @return string|null + */ + protected static function getContentTypeMatchInHeader($header) + { + if (0 < preg_match("/Content-Type:(\V*)/ims", $header, $match)) { + return trim($match[1]); + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php new file mode 100644 index 00000000..a663d341 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php @@ -0,0 +1,56 @@ + '{ ... }', + * 'http://acme.com/schemas/address#' => '{ ... }', + * )) + * + * $schema = $retriever->retrieve('http://acme.com/schemas/person#'); + */ +class PredefinedArray extends AbstractRetriever +{ + /** + * Contains schemas as URI => JSON + * + * @var array + */ + private $schemas; + + /** + * Constructor + * + * @param array $schemas + * @param string $contentType + */ + public function __construct(array $schemas, $contentType = Validator::SCHEMA_MEDIA_TYPE) + { + $this->schemas = $schemas; + $this->contentType = $contentType; + } + + /** + * {@inheritdoc} + * + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() + */ + public function retrieve($uri) + { + if (!array_key_exists($uri, $this->schemas)) { + throw new \JsonSchema\Exception\ResourceNotFoundException(sprintf( + 'The JSON schema "%s" was not found.', + $uri + )); + } + + return $this->schemas[$uri]; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php new file mode 100644 index 00000000..2cc40cf2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php @@ -0,0 +1,36 @@ + + */ +interface UriRetrieverInterface +{ + /** + * Retrieve a schema from the specified URI + * + * @param string $uri URI that resolves to a JSON schema + * + * @throws \JsonSchema\Exception\ResourceNotFoundException + * + * @return mixed string|null + */ + public function retrieve($uri); + + /** + * Get media content type + * + * @return string + */ + public function getContentType(); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php new file mode 100644 index 00000000..8ab6650e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php @@ -0,0 +1,175 @@ + + */ +class UriResolver implements UriResolverInterface +{ + /** + * Parses a URI into five main components + * + * @param string $uri + * + * @return array + */ + public function parse($uri) + { + preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); + + $components = array(); + if (5 < count($match)) { + $components = array( + 'scheme' => $match[2], + 'authority' => $match[4], + 'path' => $match[5] + ); + } + if (7 < count($match)) { + $components['query'] = $match[7]; + } + if (9 < count($match)) { + $components['fragment'] = $match[9]; + } + + return $components; + } + + /** + * Builds a URI based on n array with the main components + * + * @param array $components + * + * @return string + */ + public function generate(array $components) + { + $uri = $components['scheme'] . '://' + . $components['authority'] + . $components['path']; + + if (array_key_exists('query', $components) && strlen($components['query'])) { + $uri .= '?' . $components['query']; + } + if (array_key_exists('fragment', $components)) { + $uri .= '#' . $components['fragment']; + } + + return $uri; + } + + /** + * {@inheritdoc} + */ + public function resolve($uri, $baseUri = null) + { + // treat non-uri base as local file path + if ( + !is_null($baseUri) && + !filter_var($baseUri, \FILTER_VALIDATE_URL) && + !preg_match('|^[^/]+://|u', $baseUri) + ) { + if (is_file($baseUri)) { + $baseUri = 'file://' . realpath($baseUri); + } elseif (is_dir($baseUri)) { + $baseUri = 'file://' . realpath($baseUri) . '/'; + } else { + $baseUri = 'file://' . getcwd() . '/' . $baseUri; + } + } + + if ($uri == '') { + return $baseUri; + } + + $components = $this->parse($uri); + $path = $components['path']; + + if (!empty($components['scheme'])) { + return $uri; + } + $baseComponents = $this->parse($baseUri); + $basePath = $baseComponents['path']; + + $baseComponents['path'] = self::combineRelativePathWithBasePath($path, $basePath); + if (isset($components['fragment'])) { + $baseComponents['fragment'] = $components['fragment']; + } + + return $this->generate($baseComponents); + } + + /** + * Tries to glue a relative path onto an absolute one + * + * @param string $relativePath + * @param string $basePath + * + * @throws UriResolverException + * + * @return string Merged path + */ + public static function combineRelativePathWithBasePath($relativePath, $basePath) + { + $relativePath = self::normalizePath($relativePath); + if ($relativePath == '') { + return $basePath; + } + if ($relativePath[0] == '/') { + return $relativePath; + } + + $basePathSegments = explode('/', $basePath); + + preg_match('|^/?(\.\./(?:\./)*)*|', $relativePath, $match); + $numLevelUp = strlen($match[0]) /3 + 1; + if ($numLevelUp >= count($basePathSegments)) { + throw new UriResolverException(sprintf("Unable to resolve URI '%s' from base '%s'", $relativePath, $basePath)); + } + + $basePathSegments = array_slice($basePathSegments, 0, -$numLevelUp); + $path = preg_replace('|^/?(\.\./(\./)*)*|', '', $relativePath); + + return implode('/', $basePathSegments) . '/' . $path; + } + + /** + * Normalizes a URI path component by removing dot-slash and double slashes + * + * @param string $path + * + * @return string + */ + private static function normalizePath($path) + { + $path = preg_replace('|((?parse($uri); + + return !empty($components); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php new file mode 100644 index 00000000..41147a2a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php @@ -0,0 +1,349 @@ + + */ +class UriRetriever implements BaseUriRetrieverInterface +{ + /** + * @var array Map of URL translations + */ + protected $translationMap = array( + // use local copies of the spec schemas + '|^https?://json-schema.org/draft-(0[34])/schema#?|' => 'package://dist/schema/json-schema-draft-$1.json' + ); + + /** + * @var array A list of endpoints for media type check exclusion + */ + protected $allowedInvalidContentTypeEndpoints = array( + 'http://json-schema.org/', + 'https://json-schema.org/' + ); + + /** + * @var null|UriRetrieverInterface + */ + protected $uriRetriever = null; + + /** + * @var array|object[] + * + * @see loadSchema + */ + private $schemaCache = array(); + + /** + * Adds an endpoint to the media type validation exclusion list + * + * @param string $endpoint + */ + public function addInvalidContentTypeEndpoint($endpoint) + { + $this->allowedInvalidContentTypeEndpoints[] = $endpoint; + } + + /** + * Guarantee the correct media type was encountered + * + * @param UriRetrieverInterface $uriRetriever + * @param string $uri + * + * @return bool|void + */ + public function confirmMediaType($uriRetriever, $uri) + { + $contentType = $uriRetriever->getContentType(); + + if (is_null($contentType)) { + // Well, we didn't get an invalid one + return; + } + + if (in_array($contentType, array(Validator::SCHEMA_MEDIA_TYPE, 'application/json'))) { + return; + } + + foreach ($this->allowedInvalidContentTypeEndpoints as $endpoint) { + if (strpos($uri, $endpoint) === 0) { + return true; + } + } + + throw new InvalidSchemaMediaTypeException(sprintf('Media type %s expected', Validator::SCHEMA_MEDIA_TYPE)); + } + + /** + * Get a URI Retriever + * + * If none is specified, sets a default FileGetContents retriever and + * returns that object. + * + * @return UriRetrieverInterface + */ + public function getUriRetriever() + { + if (is_null($this->uriRetriever)) { + $this->setUriRetriever(new FileGetContents()); + } + + return $this->uriRetriever; + } + + /** + * Resolve a schema based on pointer + * + * URIs can have a fragment at the end in the format of + * #/path/to/object and we are to look up the 'path' property of + * the first object then the 'to' and 'object' properties. + * + * @param object $jsonSchema JSON Schema contents + * @param string $uri JSON Schema URI + * + * @throws ResourceNotFoundException + * + * @return object JSON Schema after walking down the fragment pieces + */ + public function resolvePointer($jsonSchema, $uri) + { + $resolver = new UriResolver(); + $parsed = $resolver->parse($uri); + if (empty($parsed['fragment'])) { + return $jsonSchema; + } + + $path = explode('/', $parsed['fragment']); + while ($path) { + $pathElement = array_shift($path); + if (!empty($pathElement)) { + $pathElement = str_replace('~1', '/', $pathElement); + $pathElement = str_replace('~0', '~', $pathElement); + if (!empty($jsonSchema->$pathElement)) { + $jsonSchema = $jsonSchema->$pathElement; + } else { + throw new ResourceNotFoundException( + 'Fragment "' . $parsed['fragment'] . '" not found' + . ' in ' . $uri + ); + } + + if (!is_object($jsonSchema)) { + throw new ResourceNotFoundException( + 'Fragment part "' . $pathElement . '" is no object ' + . ' in ' . $uri + ); + } + } + } + + return $jsonSchema; + } + + /** + * {@inheritdoc} + */ + public function retrieve($uri, $baseUri = null, $translate = true) + { + $resolver = new UriResolver(); + $resolvedUri = $fetchUri = $resolver->resolve($uri, $baseUri); + + //fetch URL without #fragment + $arParts = $resolver->parse($resolvedUri); + if (isset($arParts['fragment'])) { + unset($arParts['fragment']); + $fetchUri = $resolver->generate($arParts); + } + + // apply URI translations + if ($translate) { + $fetchUri = $this->translate($fetchUri); + } + + $jsonSchema = $this->loadSchema($fetchUri); + + // Use the JSON pointer if specified + $jsonSchema = $this->resolvePointer($jsonSchema, $resolvedUri); + + if ($jsonSchema instanceof \stdClass) { + $jsonSchema->id = $resolvedUri; + } + + return $jsonSchema; + } + + /** + * Fetch a schema from the given URI, json-decode it and return it. + * Caches schema objects. + * + * @param string $fetchUri Absolute URI + * + * @return object JSON schema object + */ + protected function loadSchema($fetchUri) + { + if (isset($this->schemaCache[$fetchUri])) { + return $this->schemaCache[$fetchUri]; + } + + $uriRetriever = $this->getUriRetriever(); + $contents = $this->uriRetriever->retrieve($fetchUri); + $this->confirmMediaType($uriRetriever, $fetchUri); + $jsonSchema = json_decode($contents); + + if (JSON_ERROR_NONE < $error = json_last_error()) { + throw new JsonDecodingException($error); + } + + $this->schemaCache[$fetchUri] = $jsonSchema; + + return $jsonSchema; + } + + /** + * Set the URI Retriever + * + * @param UriRetrieverInterface $uriRetriever + * + * @return $this for chaining + */ + public function setUriRetriever(UriRetrieverInterface $uriRetriever) + { + $this->uriRetriever = $uriRetriever; + + return $this; + } + + /** + * Parses a URI into five main components + * + * @param string $uri + * + * @return array + */ + public function parse($uri) + { + preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); + + $components = array(); + if (5 < count($match)) { + $components = array( + 'scheme' => $match[2], + 'authority' => $match[4], + 'path' => $match[5] + ); + } + + if (7 < count($match)) { + $components['query'] = $match[7]; + } + + if (9 < count($match)) { + $components['fragment'] = $match[9]; + } + + return $components; + } + + /** + * Builds a URI based on n array with the main components + * + * @param array $components + * + * @return string + */ + public function generate(array $components) + { + $uri = $components['scheme'] . '://' + . $components['authority'] + . $components['path']; + + if (array_key_exists('query', $components)) { + $uri .= $components['query']; + } + + if (array_key_exists('fragment', $components)) { + $uri .= $components['fragment']; + } + + return $uri; + } + + /** + * Resolves a URI + * + * @param string $uri Absolute or relative + * @param string $baseUri Optional base URI + * + * @return string + */ + public function resolve($uri, $baseUri = null) + { + $components = $this->parse($uri); + $path = $components['path']; + + if ((array_key_exists('scheme', $components)) && ('http' === $components['scheme'])) { + return $uri; + } + + $baseComponents = $this->parse($baseUri); + $basePath = $baseComponents['path']; + + $baseComponents['path'] = UriResolver::combineRelativePathWithBasePath($path, $basePath); + + return $this->generate($baseComponents); + } + + /** + * @param string $uri + * + * @return bool + */ + public function isValid($uri) + { + $components = $this->parse($uri); + + return !empty($components); + } + + /** + * Set a URL translation rule + */ + public function setTranslation($from, $to) + { + $this->translationMap[$from] = $to; + } + + /** + * Apply URI translation rules + */ + public function translate($uri) + { + foreach ($this->translationMap as $from => $to) { + $uri = preg_replace($from, $to, $uri); + } + + // translate references to local files within the json-schema package + $uri = preg_replace('|^package://|', sprintf('file://%s/', realpath(__DIR__ . '/../../..')), $uri); + + return $uri; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php new file mode 100644 index 00000000..4eb50c03 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php @@ -0,0 +1,26 @@ + + * @author Bruno Prieto Reis + * + * @see README.md + */ +class Validator extends BaseConstraint +{ + const SCHEMA_MEDIA_TYPE = 'application/schema+json'; + + const ERROR_NONE = 0x00000000; + const ERROR_ALL = 0xFFFFFFFF; + const ERROR_DOCUMENT_VALIDATION = 0x00000001; + const ERROR_SCHEMA_VALIDATION = 0x00000002; + + /** + * Validates the given data against the schema and returns an object containing the results + * Both the php object and the schema are supposed to be a result of a json_decode call. + * The validation works as defined by the schema proposal in http://json-schema.org. + * + * Note that the first argument is passed by reference, so you must pass in a variable. + */ + public function validate(&$value, $schema = null, $checkMode = null) + { + // make sure $schema is an object + if (is_array($schema)) { + $schema = self::arrayToObjectRecursive($schema); + } + + // set checkMode + $initialCheckMode = $this->factory->getConfig(); + if ($checkMode !== null) { + $this->factory->setConfig($checkMode); + } + + // add provided schema to SchemaStorage with internal URI to allow internal $ref resolution + if (is_object($schema) && property_exists($schema, 'id')) { + $schemaURI = $schema->id; + } else { + $schemaURI = SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI; + } + $this->factory->getSchemaStorage()->addSchema($schemaURI, $schema); + + $validator = $this->factory->createInstanceFor('schema'); + $validator->check( + $value, + $this->factory->getSchemaStorage()->getSchema($schemaURI) + ); + + $this->factory->setConfig($initialCheckMode); + + $this->addErrors(array_unique($validator->getErrors(), SORT_REGULAR)); + + return $validator->getErrorMask(); + } + + /** + * Alias to validate(), to maintain backwards-compatibility with the previous API + */ + public function check($value, $schema) + { + return $this->validate($value, $schema); + } + + /** + * Alias to validate(), to maintain backwards-compatibility with the previous API + */ + public function coerce(&$value, $schema) + { + return $this->validate($value, $schema, Constraint::CHECK_MODE_COERCE_TYPES); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime-nl_NL.mo b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime-nl_NL.mo new file mode 100644 index 00000000..f3c36383 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime-nl_NL.mo differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime-nl_NL.po b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime-nl_NL.po new file mode 100644 index 00000000..a6212d1a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime-nl_NL.po @@ -0,0 +1,22 @@ +# Copyright (C) 2018 +# This file is distributed under the same license as the package. +msgid "" +msgstr "" +"Project-Id-Version: Pronamic DateTime\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-datetime\n" +"POT-Creation-Date: 2019-12-17 22:34:03+00:00\n" +"PO-Revision-Date: 2018-08-16 11:53+0100\n" +"Last-Translator: Remco Tolsma \n" +"Language-Team: Pronamic \n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.7.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: src/DateTime.php:292 +msgctxt "default datetime format" +msgid "D j M Y \\a\\t H:i" +msgstr "D j M Y \\o\\m H:i" diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime.pot b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime.pot new file mode 100644 index 00000000..ef55ef38 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/languages/pronamic-datetime.pot @@ -0,0 +1,19 @@ +# Copyright (C) 2019 +# This file is distributed under the same license as the package. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-datetime\n" +"POT-Creation-Date: 2019-12-17 22:34:03+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"X-Generator: grunt-wp-i18n 1.0.3\n" + +#: src/DateTime.php:292 +msgctxt "default datetime format" +msgid "D j M Y \\a\\t H:i" +msgstr "" \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/pronamic-datetime.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/pronamic-datetime.php new file mode 100644 index 00000000..50b76fe3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/pronamic-datetime.php @@ -0,0 +1,33 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Pronamic DateTime load plugin textdomain. + */ +function pronamic_datetime_load_plugin_textdomain() { + load_plugin_textdomain( 'pronamic-datetime', false, basename( dirname( __FILE__ ) ) . '/languages' ); +} + +add_action( 'init', 'pronamic_datetime_load_plugin_textdomain' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTime.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTime.php new file mode 100644 index 00000000..4aa2997a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTime.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\DateTime + * @see https://github.com/woocommerce/woocommerce/blob/3.3.4/includes/class-wc-datetime.php + * @see https://github.com/Rarst/wpdatetime/ + */ + +namespace Pronamic\WordPress\DateTime; + +/** + * Date time + * + * @author Remco Tolsma + * @version 1.2.0 + * @since 1.0.0 + */ +class DateTime extends \DateTime implements DateTimeInterface { + use DateTimeTrait; + + /** + * Overrides upstream method to correct returned instance type to the inheriting one. + * + * {@inheritdoc} + * + * @param \DateTimeImmutable $object Object. + * @return self + */ + public static function createFromImmutable( $object ) { + return self::create_from_immutable( $object ); + } + + /** + * Create from immutable. + * + * @link https://www.php.net/manual/en/datetimeimmutable.createfrommutable.php + * @param \DateTimeImmutable $object The immutable DateTimeImmutable object that needs to be converted to a mutable version. + * @return self + */ + public static function create_from_immutable( \DateTimeImmutable $object ) { + $instance = new self( '@' . $object->getTimestamp() ); + + return $instance->setTimezone( $object->getTimezone() ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeImmutable.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeImmutable.php new file mode 100644 index 00000000..5e71aa0d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeImmutable.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\DateTime + * @see https://github.com/woocommerce/woocommerce/blob/3.3.4/includes/class-wc-datetime.php + * @see https://github.com/Rarst/wpdatetime/ + */ + +namespace Pronamic\WordPress\DateTime; + +/** + * Date time immutable + * + * @author Remco Tolsma + * @version 1.2.0 + * @since 1.2.0 + */ +class DateTimeImmutable extends \DateTimeImmutable implements DateTimeInterface { + use DateTimeTrait; + + /** + * Overrides upstream method to correct returned instance type to the inheriting one. + * + * {@inheritdoc} + * + * @param \DateTime $object Object. + * @return self + */ + public static function createFromMutable( $object ) { + return self::create_from_mutable( $object ); + } + + /** + * Create from mutable. + * + * @link https://www.php.net/manual/en/datetimeimmutable.createfrommutable.php + * @param \DateTime $object The mutable DateTime object that you want to convert to an immutable version. + * @return self + */ + public static function create_from_mutable( \DateTime $object ) { + $instance = new self( '@' . $object->getTimestamp() ); + + return $instance->setTimezone( $object->getTimezone() ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeInterface.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeInterface.php new file mode 100644 index 00000000..5afbf026 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeInterface.php @@ -0,0 +1,113 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\DateTime + * @see https://github.com/woocommerce/woocommerce/blob/3.3.4/includes/class-wc-datetime.php + * @see https://github.com/Rarst/wpdatetime/ + */ + +namespace Pronamic\WordPress\DateTime; + +/** + * Date time interface + * + * @author Remco Tolsma + * @version 1.2.0 + * @since 1.2.0 + */ +interface DateTimeInterface extends \DateTimeInterface { + /** + * MySQL datetime format. + * + * @link https://dev.mysql.com/doc/en/datetime.html + * @link https://github.com/Rarst/wpdatetime/blob/0.3/src/WpDateTime.php#L10 + * + * @var string + */ + const MYSQL = 'Y-m-d H:i:s'; + + /** + * Date format characters in PHP. + * + * @link https://www.php.net/manual/en/function.date.php + * @link https://github.com/php/php-src/blob/php-7.3.10/ext/date/php_date.c#L1128-L1288 + * @var array + */ + const DATE_FORMAT_CHARACTERS = array( + // Day. + 'd', + 'D', + 'j', + 'l', + 'S', + 'w', + 'N', + 'z', + // Week. + 'W', + 'o', + // Month. + 'F', + 'm', + 'M', + 'n', + 't', + // Year. + 'L', + 'y', + 'Y', + // Time. + 'a', + 'A', + 'B', + 'g', + 'G', + 'h', + 'H', + 'i', + 's', + 'u', + 'v', + // Timezone. + 'I', + 'P', + 'O', + 'T', + 'e', + 'Z', + // Full date/time. + 'c', + 'r', + 'U', + ); + + /** + * Format I18N. + * + * @link https://github.com/Rarst/wpdatetime/blob/0.3/src/WpDateTimeTrait.php#L79-L104 + * @link https://github.com/WordPress/WordPress/blob/4.9.4/wp-includes/functions.php#L72-L151 + * @link https://developer.wordpress.org/reference/functions/apply_filters/ + * + * @param string|null $format Format. + * + * @return string + */ + public function format_i18n( $format = null ); + + /** + * Create from format. + * + * @link https://www.php.net/manual/en/datetime.createfromformat.php + * @link https://www.php.net/manual/en/datetimeimmutable.createfromformat.php + * + * @param string $format Format accepted by date(). + * @param string $time String representing the time. + * @param \DateTimeZone $timezone A DateTimeZone object representing the desired time zone. + * @return self|false + */ + public static function create_from_format( $format, $time, \DateTimeZone $timezone = null ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeTrait.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeTrait.php new file mode 100644 index 00000000..460d8c66 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeTrait.php @@ -0,0 +1,296 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\DateTime + * @see https://github.com/woocommerce/woocommerce/blob/3.3.4/includes/class-wc-datetime.php + * @see https://github.com/Rarst/wpdatetime/ + */ + +namespace Pronamic\WordPress\DateTime; + +/** + * Date time trait + * + * @author Remco Tolsma + * @version 1.2.0 + * @since 1.2.0 + */ +trait DateTimeTrait { + /** + * Slash date format characters. + * + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-includes/formatting.php#L2615-L2628 + * @link https://www.php.net/manual/en/function.addcslashes.php + * + * @param string $value Value. + * @return string + */ + private static function slash_date_format_characters( $value ) { + $charlist = implode( '', DateTimeInterface::DATE_FORMAT_CHARACTERS ); + + // Backslash the backslash. + $charlist .= '\\'; + + $value = \addcslashes( $value, $charlist ); + + return $value; + } + + /** + * Translate. + * + * @since 1.0.1 + * + * @link https://github.com/WordPress/WordPress/blob/4.9.6/wp-includes/functions.php#L103-L119 + * @link https://github.com/WordPress/WordPress/blob/4.9.6/wp-includes/class-wp-locale.php#L116-L235 + * + * @global \WP_Locale $wp_locale WordPress date and time locale object. + * + * @param string $format Format. + * + * @return string + */ + private function format_i18n_translate( $format ) { + global $wp_locale; + + if ( ! $wp_locale instanceof \WP_Locale ) { + return $format; + } + + if ( empty( $wp_locale->month ) || empty( $wp_locale->weekday ) ) { + return $format; + } + + $month = $wp_locale->get_month( $this->format( 'm' ) ); + $weekday = $wp_locale->get_weekday( \intval( $this->format( 'w' ) ) ); + + $format_length = \strlen( $format ); + + $format_new = ''; + + for ( $i = 0; $i < $format_length; $i++ ) { + switch ( $format[ $i ] ) { + case 'D': + $format_new .= self::slash_date_format_characters( $wp_locale->get_weekday_abbrev( $weekday ) ); + + break; + case 'F': + $format_new .= self::slash_date_format_characters( $month ); + + break; + case 'l': + $format_new .= self::slash_date_format_characters( $weekday ); + + break; + case 'M': + $format_new .= self::slash_date_format_characters( $wp_locale->get_month_abbrev( $month ) ); + + break; + case 'a': + $format_new .= self::slash_date_format_characters( $wp_locale->get_meridiem( $this->format( 'a' ) ) ); + + break; + case 'A': + $format_new .= self::slash_date_format_characters( $wp_locale->get_meridiem( $this->format( 'A' ) ) ); + + break; + case '\\': + $format_new .= $format[ $i ]; + + if ( $i < $format_length ) { + $i++; + } + + // No break. + default: + $format_new .= $format[ $i ]; + + break; + } + } + + return $format_new; + } + + /** + * Format I18N timezone. + * + * @since 1.0.1 + * + * @link https://github.com/WordPress/WordPress/blob/4.9.6/wp-includes/functions.php#L120-L136 + * @link https://github.com/php/php-src/blob/php-7.2.7/ext/date/php_date.c#L1093-L1253 + * + * @param string $format Format. + * + * @return string + */ + private function format_i18n_timezone( $format ) { + $format_length = \strlen( $format ); + + $format_new = ''; + + for ( $i = 0; $i < $format_length; $i++ ) { + switch ( $format[ $i ] ) { + case 'P': + case 'I': + case 'O': + case 'T': + case 'Z': + case 'e': + $format_new .= self::slash_date_format_characters( $this->format( $format[ $i ] ) ); + + break; + case '\\': + $format_new .= $format[ $i ]; + + if ( $i < $format_length ) { + $i++; + } + + // No break. + default: + $format_new .= $format[ $i ]; + + break; + } + } + + return $format_new; + } + + /** + * Get WordPress timestamp. + * + * @since 1.0.1 + * + * @return int + */ + private function get_wp_timestamp() { + return $this->getTimestamp() + DateTimeZone::get_offset( $this ); + } + + /** + * Get local date for this date. + * + * @since 1.0.1 + * + * @return self + */ + public function get_local_date() { + $wp_timezone = DateTimeZone::get_default(); + + /** + * PHP BUG: DateTime::setTimezone(): Can only do this for zones with ID for now. + * PHP version < 5.4.26 + * PHP version > 5.5 < 5.5.10 + * + * @link https://bugs.php.net/bug.php?id=45543 + * @link https://3v4l.org/mlZX7 + */ + if ( \version_compare( PHP_VERSION, '5.4.26', '<' ) || ( \version_compare( PHP_VERSION, '5.5', '>' ) && \version_compare( PHP_VERSION, '5.5.10', '<' ) ) ) { + return new self( \gmdate( DateTimeInterface::MYSQL, $this->get_wp_timestamp() ), $wp_timezone ); + } + + $date = clone $this; + + $date = $date->setTimezone( $wp_timezone ); + + return $date; + } + + /** + * Format translate. + * + * @link https://developer.wordpress.org/reference/functions/__/ + * + * @since 1.1.0 + * @param string $format Format. + * @return string + */ + public function format_translate( $format ) { + $format = $this->format_i18n_translate( $format ); + $format = $this->format_i18n_timezone( $format ); + + return $this->format( $format ); + } + + /** + * Format I18N. + * + * @link https://github.com/Rarst/wpdatetime/blob/0.3/src/WpDateTimeTrait.php#L79-L104 + * @link https://github.com/WordPress/WordPress/blob/4.9.4/wp-includes/functions.php#L72-L151 + * @link https://developer.wordpress.org/reference/functions/apply_filters/ + * + * @param string|null $format Format. + * + * @return string + */ + public function format_i18n( $format = null ) { + if ( \is_null( $format ) ) { + $format = \_x( 'D j M Y \a\t H:i', 'default datetime format', 'pronamic-datetime' ); + + $format = \apply_filters( 'pronamic_datetime_default_format', $format ); + } + + $date = $this->get_local_date(); + + $format = $date->format_i18n_translate( $format ); + $format = $date->format_i18n_timezone( $format ); + + $result = \date_i18n( $format, $date->get_wp_timestamp() ); + + return $result; + } + + /** + * Overrides upstream method to correct returned instance type to the inheriting one. + * + * {@inheritdoc} + * + * @return self|false + */ + // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + public static function createFromFormat( $format, $time, $timezone = null ) { + return self::create_from_format( $format, $time, $timezone ); + } + + /** + * Parse a string into a new DateTime object according to the specified format. + * + * @link http://php.net/manual/en/datetime.createfromformat.php + * @link https://github.com/Rarst/wpdatetime/blob/0.3/src/WpDateTimeTrait.php#L56-L77 + * + * @since 1.0.1 + * + * @param string $format Format accepted by date(). + * @param string $time String representing the time. + * @param \DateTimeZone $timezone A DateTimeZone object representing the desired time zone. + * + * @return self|false + */ + public static function create_from_format( $format, $time, \DateTimeZone $timezone = null ) { + /* + * In PHP 5.6 or lower it's not possible to pass in an empty (null) timezone object. + * This will result in a `DateTime::createFromFormat() expects parameter 3 to be DateTimeZone, null given` error. + */ + $created = empty( $timezone ) ? + parent::createFromFormat( $format, $time ) : + parent::createFromFormat( $format, $time, $timezone ); + + if ( false === $created ) { + return false; + } + + $wp_date_time = new self( '@' . $created->getTimestamp() ); + + if ( null !== $timezone ) { + $wp_date_time = $wp_date_time->setTimezone( $timezone ); + } + + return $wp_date_time; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeZone.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeZone.php new file mode 100644 index 00000000..5fcaa0ab --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-datetime/src/DateTimeZone.php @@ -0,0 +1,75 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\DateTime + * @see https://github.com/woocommerce/woocommerce/blob/3.3.4/includes/class-wc-datetime.php + * @see https://github.com/Rarst/wpdatetime/ + */ + +namespace Pronamic\WordPress\DateTime; + +/** + * Date time zone + * + * @author Remco Tolsma + * @version 1.2.0 + * @since 1.0.0 + * @psalm-immutable + */ +class DateTimeZone extends \DateTimeZone { + /** + * Get default timezone. + * + * @link https://github.com/Rarst/wpdatetime/blob/0.3/src/WpDateTimeZone.php + * @link https://github.com/WordPress/WordPress/blob/4.9.4/wp-includes/functions.php#L72-L151 + * + * @return \DateTimeZone + */ + public static function get_default() { + $timezone_string = \get_option( 'timezone_string' ); + + if ( ! empty( $timezone_string ) ) { + return new DateTimeZone( $timezone_string ); + } + + $gmt_offset = \get_option( 'gmt_offset' ); + $hours = (int) $gmt_offset; + $minutes = \abs( ( $gmt_offset - (int) $gmt_offset ) * 60 ); + $offset = \sprintf( '%+03d:%02d', $hours, $minutes ); + + /** + * Offset values as timezone parameter are supported since PHP 5.5.10. + * + * @link http://php.net/manual/en/datetimezone.construct.php + */ + if ( \version_compare( PHP_VERSION, '5.5.10', '<' ) ) { + $date = new DateTime( $offset ); + + return $date->getTimezone(); + } + + return new \DateTimeZone( $offset ); + } + + /** + * Get offset. + * + * @param \DateTimeInterface $date DateTime object. + * @return int + */ + public static function get_offset( $date ) { + $timezone_string = \get_option( 'timezone_string' ); + + if ( empty( $timezone_string ) ) { + return \intval( \floatval( \get_option( 'gmt_offset', 0 ) ) * HOUR_IN_SECONDS ); + } + + $timezone = new DateTimeZone( $timezone_string ); + + return $timezone->getOffset( $date ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/gravityforms-nl.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/gravityforms-nl.php new file mode 100644 index 00000000..b08bc05d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/gravityforms-nl.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Bootstrap. + */ +require __DIR__ . '/vendor/autoload.php'; + +add_action( + 'plugins_loaded', + function() { + if ( ! \class_exists( '\GFCommon' ) ) { + return; + } + + // Initialize. + \Pronamic\WordPress\GravityFormsNL\Plugin::instance( + array( + 'file' => __FILE__, + ) + ); + } +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/js/jquery.ui.datepicker-nl.js b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/js/jquery.ui.datepicker-nl.js new file mode 100644 index 00000000..b0bfbe97 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/js/jquery.ui.datepicker-nl.js @@ -0,0 +1,23 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens */ +jQuery(function($){ + $.datepicker.regional.nl = { + closeText: 'Sluiten', + prevText: '←', + nextText: '→', + currentText: 'Vandaag', + monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', + 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'], + dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + weekHeader: 'Wk', + dateFormat: 'dd-mm-yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional.nl); +}); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl-nl_NL.mo b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl-nl_NL.mo new file mode 100644 index 00000000..6f03261e Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl-nl_NL.mo differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl-nl_NL.po b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl-nl_NL.po new file mode 100644 index 00000000..baf2838b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl-nl_NL.po @@ -0,0 +1,112 @@ +msgid "" +msgstr "" +"Project-Id-Version: Gravity Forms (nl)\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-gravityforms-" +"nl\n" +"POT-Creation-Date: 2020-09-01 20:54:50+00:00\n" +"PO-Revision-Date: 2020-09-01 23:03+0200\n" +"Last-Translator: Reüel van der Steege \n" +"Language-Team: Pronamic \n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 2.4\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SearchPath-0: .\n" + +#: src/Plugin.php:171 +msgid "Euro" +msgstr "Euro" + +#: src/Plugin.php:222 +msgid "Drenthe" +msgstr "Drenthe" + +#: src/Plugin.php:223 +msgid "Flevoland" +msgstr "Flevoland" + +#: src/Plugin.php:224 +msgid "Friesland" +msgstr "Friesland" + +#: src/Plugin.php:225 +msgid "Gelderland" +msgstr "Gelderland" + +#: src/Plugin.php:226 +msgid "Groningen" +msgstr "Groningen" + +#: src/Plugin.php:227 +msgid "Limburg" +msgstr "Limburg" + +#: src/Plugin.php:228 +msgid "Noord-Brabant" +msgstr "Noord-Brabant" + +#: src/Plugin.php:229 +msgid "Noord-Holland" +msgstr "Noord-Holland" + +#: src/Plugin.php:230 +msgid "Overijssel" +msgstr "Overijssel" + +#: src/Plugin.php:231 +msgid "Utrecht" +msgstr "Utrecht" + +#: src/Plugin.php:232 +msgid "Zeeland" +msgstr "Zeeland" + +#: src/Plugin.php:233 +msgid "Zuid-Holland" +msgstr "Zuid-Holland" + +#. Plugin Name of the plugin/theme +msgid "Gravity Forms (nl)" +msgstr "Gravity Forms (nl)" + +#. Plugin URI of the plugin/theme +msgid "https://www.pronamic.eu/plugins/gravityforms-nl/" +msgstr "https://www.pronamic.eu/plugins/gravityforms-nl/" + +#. Description of the plugin/theme +msgid "" +"Extend the Gravity Forms plugin with Dutch address and Euro sign notation." +msgstr "" +"Voeg Nederlandse adres en euroteken notatie toe aan de Gravity Forms plugin." + +#. Author of the plugin/theme +msgid "Pronamic" +msgstr "Pronamic" + +#. Author URI of the plugin/theme +msgid "https://www.pronamic.eu/" +msgstr "https://www.pronamic.eu/" + +#: src/Plugin.php:205 +msgctxt "Dutch address type" +msgid "Dutch" +msgstr "Nederlands" + +#: src/Plugin.php:206 +msgctxt "Dutch address type" +msgid "Netherlands" +msgstr "Nederland" + +#: src/Plugin.php:207 +msgctxt "Dutch address type" +msgid "Postal Code" +msgstr "Postcode" + +#: src/Plugin.php:208 +msgctxt "Dutch address type" +msgid "Province" +msgstr "Provincie" diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl.pot b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl.pot new file mode 100644 index 00000000..d17cac64 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/languages/gravityforms-nl.pot @@ -0,0 +1,107 @@ +# Copyright (C) 2020 Pronamic +# This file is distributed under the GPL. +msgid "" +msgstr "" +"Project-Id-Version: Gravity Forms (nl) 3.0.0\n" +"Report-Msgid-Bugs-To: " +"https://wordpress.org/support/plugin/wp-gravityforms-nl\n" +"POT-Creation-Date: 2020-09-01 20:54:50+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2020-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"X-Generator: grunt-wp-i18n 1.0.3\n" + +#: src/Plugin.php:171 +msgid "Euro" +msgstr "" + +#: src/Plugin.php:222 +msgid "Drenthe" +msgstr "" + +#: src/Plugin.php:223 +msgid "Flevoland" +msgstr "" + +#: src/Plugin.php:224 +msgid "Friesland" +msgstr "" + +#: src/Plugin.php:225 +msgid "Gelderland" +msgstr "" + +#: src/Plugin.php:226 +msgid "Groningen" +msgstr "" + +#: src/Plugin.php:227 +msgid "Limburg" +msgstr "" + +#: src/Plugin.php:228 +msgid "Noord-Brabant" +msgstr "" + +#: src/Plugin.php:229 +msgid "Noord-Holland" +msgstr "" + +#: src/Plugin.php:230 +msgid "Overijssel" +msgstr "" + +#: src/Plugin.php:231 +msgid "Utrecht" +msgstr "" + +#: src/Plugin.php:232 +msgid "Zeeland" +msgstr "" + +#: src/Plugin.php:233 +msgid "Zuid-Holland" +msgstr "" + +#. Plugin Name of the plugin/theme +msgid "Gravity Forms (nl)" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://www.pronamic.eu/plugins/gravityforms-nl/" +msgstr "" + +#. Description of the plugin/theme +msgid "Extend the Gravity Forms plugin with Dutch address and Euro sign notation." +msgstr "" + +#. Author of the plugin/theme +msgid "Pronamic" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://www.pronamic.eu/" +msgstr "" + +#: src/Plugin.php:205 +msgctxt "Dutch address type" +msgid "Dutch" +msgstr "" + +#: src/Plugin.php:206 +msgctxt "Dutch address type" +msgid "Netherlands" +msgstr "" + +#: src/Plugin.php:207 +msgctxt "Dutch address type" +msgid "Postal Code" +msgstr "" + +#: src/Plugin.php:208 +msgctxt "Dutch address type" +msgid "Province" +msgstr "" \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/readme.txt b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/readme.txt new file mode 100644 index 00000000..173a5aac --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/readme.txt @@ -0,0 +1,337 @@ +=== Gravity Forms (nl) === +Contributors: pronamic, remcotolsma +Tags: gravityforms, gravity, form, forms, gravity forms, translation, dutch, nl, nl_NL +Donate link: https://www.pronamic.eu/donate/?for=wp-plugin-gravityforms-nl&source=wp-plugin-readme-txt +Requires at least: 4.7 +Tested up to: 5.5 +Stable tag: 3.0.1 + +This WordPress plugin extends Gravity Forms with Dutch address notation and places the Euro sign to the left of input fields. + + +== Description == + +* [Gravity Forms][gravityforms glotpress] 1.9.14 + +[gravityforms glotpress]: http://glotpress.pronamic.nl/projects/gravityforms + "Gravity Forms GlotPress project" + +> This plugin requires the Gravity Forms plugin. + +> This plugin requires a Dutch WordPress installation. Make sure you have `define( 'WPLANG', 'nl_NL' );` in your WordPress `wp-config.php` file. + +The [Gravity Forms](https://www.gravityforms.com/) plugin by default only includes +US and international address types. This plugin adds an option for Dutch address notation. + + +== Installation == + +Extract the ZIP file and move the resulting `wp-gravityforms-nl` directory to the ``/wp-content/plugins/` +directory of your WordPress installation. Then activate the plugin from the Plugins page in the WordPress admin. + + +== Changelog == + += 3.0.1 = +* Set default plugin file. +* Require Composer autoload. + += 3.0.0 = +* Removed (add-on) translations, as Gravity Forms now includes its own Dutch translations. +* Added support for 'Dutch (formal)' WordPress language. +* Only update Euro currency sign position when Dutch language is active. + += 2.9.3 = +* Updated to Gravity Forms version 1.9.16. + += 2.9.2 = +* WordPress Coding Standards optimizations. +* Changed text domain from 'gravityforms_nl' to 'gravityforms-nl'. + += 2.9.1 = +* Updated to Gravity Forms version 1.9.1. + += 2.9.0 = +* Updated to Gravity Forms version 1.9 (not completely translated). +* WordPress Coding Standards optimizations. +* No longer use `WLANG` constant, instead use the `get_locale()` function. + += 2.8.4 = +* Updated to Gravity Forms version 1.8.18. + += 2.8.3 = +* Updated to Gravity Forms version 1.8.7.11. + += 2.8.2 = +* Updated to Gravity Forms version 1.8.1. + += 2.8.1 = +* Updated to Gravity Forms version 1.7.13. + += 2.8.0 = +* Updated to Gravity Forms version 1.7.11. + += 2.7.10 = +* Updated to Gravity Forms version 1.7.10. + += 2.7.9 = +* Updated to Gravity Forms version 1.7.8. + += 2.7.8 = +* Updated to Gravity Forms version 1.7.7. +* Updated to Gravity Forms MailChimp Add-On version 2.3. +* Updated to Gravity Forms Polls Add-On 1.5. +* Updated to Gravity Forms PayPal Add-On 1.8. +* Override loading MO files is now more efficient. +* Improved support for WordPress network/multisite installations. + += 2.7.7 = +* Updated to Gravity Forms version 1.7.6. +* Updated to Gravity Forms User Registration Add-On version 1.6. + += 2.7.6 = +* Improved translating of datepicker in Gravity Forms v1.7.5+. + += 2.7.5 = +* Updated to Gravity Forms version 1.7.5. + += 2.7.4 = +* Updated to Gravity Forms version 1.7.2.11. + += 2.7.3 = +* Addition of a default value to provinces. + += 2.7.2 = +* Updated to Gravity Forms version 1.7.2, not everything is translatable. + http://www.gravityhelp.com/forums/topic/translation-issues-172#post-225110. + += 2.7.1 = +* Updated all plugin translations to the latest version. + += 2.7 = +* Added Dutch address type. +* Move Zip field before City field. + += 2.6.19 = +* Improved a few translations. + += 2.6.18 = +* Updated to Gravity Forms version 1.6.12, added 3 translations and improved a few. +* Updated to Gravity Forms PayPal Add-On version 1.6, added 7 translations and improved a few. + += 2.6.17 = +* Updated to Gravity Forms version 1.6.11, one new translation and improved a few. + += 2.6.16 = +* Updated to Gravity Forms version 1.6.10.1, one new translation and improved a few. + += 2.6.15 = +* Updated to Gravity Forms version 1.6.10, one new translation and improved a few. + += 2.6.14 = +* Improved a few translations. + += 2.6.13 = +* Updated to Gravity Forms version 1.6.9, improved a few translations. +* Removed translations of different versions, saving almost 10 MB. + += 2.6.12 = +* Added translations for Gravity Forms version 1.6.8.1. +* Added translations for Gravity Forms version 1.6.8. + += 2.6.11 = +* Updated to Gravity Forms Polls Add-On version 1.0. + += 2.6.10 = +* Updated to Gravity Forms Signature Add-On version 1.2. +* Updated to Gravity Forms Signature Add-On version 1.1. + += 2.6.9 = +* Updated to Gravity Forms version 1.6.7, removed 1 translation and improved a few + += 2.6.8 = +* Updated to Gravity Forms version 1.6.6, improved a few translations + += 2.6.7 = +* Added the translations of Gravity Forms Polls Add-On version 1.0.beta1 + += 2.6.6 = +* Updated to Gravity Forms version 1.6.5, added 3 translations and improved a few + += 2.6.5 = +* Updated to Gravity Forms Signature Add-On version 1.0 +* Updated to Gravity Forms MailChimp Add-On version 1.7, 6 new translations +* Updated to Gravity Forms Campaign Monitor Add-On version 2.0, 10 new translations + += 2.6.4 = +* Updated to Gravity Forms version 1.6.4.5, improved a few translations +* Updated to Gravity Forms PayPal Add-On version 1.5, a few new translations + += 2.6.3 = +* Updated to Gravity Forms version 1.6.4.3, improved a few translations +* Updated to Gravity Forms version 1.6.4.4, improved a few translations + += 2.6.2 = +* Updated to Gravity Forms version 1.6.4.2, improved a few translations + += 2.6.1 = +* Updated to Gravity Forms version 1.6.4.1.1, improved a few translations + += 2.6 = +* Updated to Gravity Forms version 1.6.4, improved a few translations + += 2.5.15 = +* Updated to Gravity Forms User Registration Add-On version 1.4, 1 new translations + += 2.5.14 = +* Updated to Gravity Forms version 1.6.3.3.4, improved a few translations + += 2.5.13 = +* Added the translations of Gravity Forms Signature Add-On version 1.0.beta1 + += 2.5.12 = +* Updated to Gravity Forms version 1.6.3.3.2, improved a few translations +* Added currency update filter, to place the euro symbol in front of amount +* Replaced all references to class constant TEXT_DOMAIN to an string + += 2.5.11 = +* Updated to Gravity Forms version 1.6.3.3, 2 new translations and improved a few translations + += 2.5.10 = +* Updated to Gravity Forms version 1.6.3.2, improved a few translations + += 2.5.9 = +* Updated to Gravity Forms version 1.6.3.1.2, added and improved a few translations + += 2.5.8 = +* Updated to Gravity Forms User Registration Add-On version 1.3, 8 new translations +* Updated to Gravity Forms PayPal Add-On version 1.4, 7 new translations + += 2.5.7 = +* Updated to Gravity Forms version 1.6.2.1.1, no new translations, but improved a few +* Added the translations for Gravity Forms v1.6.3 Beta 1 +* Updated to Gravity Forms MailChimp version 1.6.1 + += 2.5.6 = +* Updated to Gravity Forms version 1.6.2, no new translations, but improved a few + += 2.5.5 = +* Updated to Gravity Forms version 1.6.1, no new translations, but improved a few + += 2.5.4 = +* Updated to Gravity Forms version 1.6 +* Updated to Gravity Forms User Registration Add-On version 1.2.11 +* Updated to Gravity Forms Campaign Monitor Add-On version 1.9 +* Updated to Gravity Forms PayPal Add-On version 1.3.1 + += 2.5.3 = +* Updated to Gravity Forms User Registration Add-On version 1.2.9 + += 2.5.2 = +* Added support for the WPML Multilingual CMS in request of [Anne Jan Roeleveld](http://www.freshter.com/) + += 2.5.1 = +* Added translation for Gravity Forms 1.5.3 +* Added translation for Gravity Forms 1.6.rc1 +* Improved the translation of 'please enter', removed a lot 'a.u.b.' texts +* Improved the translation of 'you' and 'your', remove a lot 'u' and 'uw' texts + += 2.5 = +* Added the translation of some JavaScript variables wich are not translatable within Gravity Forms itself +* Added the translation for Gravity Forms 1.6beta3 +* Added the translation for Gravity Forms 1.6beta2 + += 2.4.9 = +* Updated to Gravity Forms User Registration Add-On version 1.2.6.1 + += 2.4.8 = +* Updated to Gravity Forms User Registration Add-On version 1.2.6 (added 3 new translations) + += 2.4.7 = +* Updated to Gravity Forms Campaign Monitor Add-On version 1.8 +* Updated to Gravity Forms MailChimp Add-On version 1.5 +* Updated to Gravity Forms User Registration Add-On version 1.2 + += 2.4.6 = +* Updated to Gravity Forms version 1.5.2.8 (added 3 new translations) +* Updated to Gravity Forms Campaign Monitor Add-On version 1.7 +* Added the translation for Gravity Forms MailChimp Add-On version 1.4 +* Added the translation for Gravity Forms PayPal Add-On version 1.2.3 + += 2.4.5 = +* Improved the translation of "New submission from" from "Nieuw aanmeldingsformulier" to "Nieuwe inzending via" +* Replaced the use of the constant WPLANG with "self::$language = get_option('WPLANG', WPLANG);" so the plugin works correct in multisites +* Enqueue the jQuery datepicker dutch translation only if the language is dutch +* Removed two unused constants: PLUGIN_NAME and PLUGIN_URL_PAGE + += 2.4.4 = +* Updated to Gravity Forms version 1.5.2.3 +* Added the translation for "GREENLAND" and "Greenland" +* Improved the translation of "Label Placement" from "Veldlabel" to "Label positie" +* Improved the translation of "Right aligned" from "Rechtsuitgelijnd" to "Rechts uitgelijnd" +* Improved the translation of "Law Enforcement/Security" from "Rechtshandhaving / Veiligheid" to "Rechtshandhaving / veiligheid" +* Improved the translation of "Form Button Text" from "Tekst voor formulierknop" to "Formulier knop tekst" +* Improved the translation of "Form Button" from "Formulierknop" to "Formulier knop" +* Improved the tranlsations of a lot more texts + += 2.4.3 = +* Added the translation for Gravity Forms version 1.5.2.2 +* Removed the social buttons from the WordPress plugin page +* Added the translation for Gravity Forms Campaign Monitor Add-On version 1.6 + += 2.4.2 = +* Added the translation for Gravity Forms version 1.5.2 + += 2.4.1 = +* Fixed the translation of "New Zealand" from "Nieuw formulier" to "Nieuw-Zeeland" + += 2.4 = +* Added the translation for Gravity Forms version 1.5.1.1 (2 new translations) +* Improved some old translations +* Added Twitter and Facebook share buttons on plugins page + += 2.3 = +* Changed the directory structure of the translations, domains and versions +* Removed all the .PO files from the plugin (are available within the Pronamic GlotPress) +* Added the translations of Gravity Forms version 1.5 +* Added the translations of Gravity Forms User Registration Add-On version 1.0 + += 2.2 = +* Replaced PHP 5.3 __DIR__ constant with dirname(__FILE__), plugin should now work on PHP 5.2 (or higher) + += 2.1 = +* Added the Dutch translation for Gravity Forms version 1.5.RC4. +* In case of a beta Gravity Forms release load the beta translations, otherwise load the public release translations. + += 2.0 = +* Added the Dutch translation of the [jQuery UI datepicker](http://jqueryui.com/demos/datepicker/) + [This Dutch translation of jQuery UI date picker can be found in on Google Code] (http://code.google.com/p/jquery-ui/source/browse/trunk/ui/i18n/jquery.ui.datepicker-nl.js) + More information about this can be bound on [the weblog of Remco Tolsma](http://remcotolsma.nl/2010/10/gravity-forms-datepicker-in-het-nederlands/) +* Updated the Dutch translation set to Gravity Forms version 1.5.rc3.4. +* Added the Dutch translation set of the User Registration Add-On version 1.0.beta3.1. + += 1.4.5 = +* Added 370 new translations (thanks to [Pim Vellinga](http://twitter.com/brainscrewer)) + += 1.4.3.1 = +* Initial release (thanks to [Jelke Boonstra](http://twitter.com/jelkeboonstra), [Karel-Jan Tolsma](http://twitter.com/kjtolsma), + [Pim Vellinga](http://twitter.com/brainscrewer), [Remkus de Vries](http://twitter.com/DeFries) + and [Jan Egbert Krikken](http://twitter.com/janegbert)) + + +== Links == + +* [Pronamic](http://pronamic.eu/) +* [Remco Tolsma](http://remcotolsma.nl/) + + +== Pronamic plugins == + +* [Pronamic Google Maps](http://wordpress.org/extend/plugins/pronamic-google-maps/) +* [Gravity Forms (nl)](http://wordpress.org/extend/plugins/gravityforms-nl/) +* [Pronamic Page Widget](http://wordpress.org/extend/plugins/pronamic-page-widget/) +* [Pronamic Page Teasers](http://wordpress.org/extend/plugins/pronamic-page-teasers/) +* [Maildit](http://wordpress.org/extend/plugins/maildit/) +* [Pronamic Framework](http://wordpress.org/extend/plugins/pronamic-framework/) +* [Pronamic iDEAL](http://wordpress.org/extend/plugins/pronamic-ideal/) + diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/src/Plugin.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/src/Plugin.php new file mode 100644 index 00000000..85ed6b9f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-gravityforms-nl/src/Plugin.php @@ -0,0 +1,251 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\GravityFormsNL + */ + +namespace Pronamic\WordPress\GravityFormsNL; + +/** + * Plugin. + * + * @author Remco Tolsma + * @version 3.0.1 + * @since 1.0.0 + */ +class Plugin { + /** + * Plugin file. + * + * @var string + */ + private $plugin_file; + + /** + * Version. + * + * @var string + */ + private $version = ''; + + /** + * Current language. + * + * @var string|null + */ + private $language; + + /** + * Flag for the Dutch language. + * + * @var boolean + */ + private $is_dutch; + + /** + * Instance. + * + * @var Plugin|null + */ + protected static $instance; + + /** + * Instance. + * + * @param string|array|object $args The plugin arguments. + * + * @return Plugin + */ + public static function instance( $args = array() ) { + if ( is_null( self::$instance ) ) { + self::$instance = new self( $args ); + } + + return self::$instance; + } + + /** + * Construct and initialize. + * + * @param string|array|object $args Plugin arguments. + */ + public function __construct( $args ) { + $args = wp_parse_args( + $args, + array( + 'file' => __DIR__ . '/../gravityforms-nl.php', + 'options' => array(), + ) + ); + + // Version from plugin file header. + if ( null !== $args['file'] ) { + $file_data = get_file_data( $args['file'], array( 'Version' => 'Version' ) ); + + if ( \array_key_exists( 'Version', $file_data ) ) { + $this->version = (string) $file_data['Version']; + } + } + + $this->plugin_file = $args['file']; + $this->is_dutch = false; + + // Actions. + \add_action( 'init', array( $this, 'init' ) ); + \add_action( 'wp_print_scripts', array( $this, 'wp_print_scripts' ) ); + + // Filters. + \add_filter( 'gform_currencies', array( $this, 'gform_currencies' ) ); + \add_filter( 'gform_address_types', array( $this, 'gform_address_types' ) ); + \add_filter( 'gform_address_display_format', array( $this, 'gform_address_display_format' ) ); + } + + /** + * Initialize. + * + * @return void + */ + public function init() { + $rel_path = \dirname( \plugin_basename( $this->plugin_file ) ) . '/languages/'; + + // Determine language. + if ( null === $this->language ) { + $this->language = \get_locale(); + $this->is_dutch = \in_array( $this->language, array( 'nl', 'nl_NL', 'nl_NL_formal' ), true ); + } + + // The `ICL_LANGUAGE_CODE` constant is defined from a plugin. + if ( \defined( 'ICL_LANGUAGE_CODE' ) ) { + $this->is_dutch = ( 'nl' === ICL_LANGUAGE_CODE ); + } + + // Load plugin text domain. + \load_plugin_textdomain( 'gravityforms-nl', false, $rel_path ); + } + + /** + * Gravity Forms datepicker translation. + * + * @return void + */ + public function wp_print_scripts() { + if ( ! $this->is_dutch ) { + return; + } + + /** + * Filter `gforms_ui_datepicker` » @since ? + * Filter `gforms_datepicker` » @since Gravity Forms 1.7.5 + * Filter `gform_datepicker_init` » @since Gravity Forms 1.8.9 + */ + foreach ( array( 'gforms_ui_datepicker', 'gforms_datepicker', 'gform_datepicker_init' ) as $script_datepicker ) { + if ( ! \wp_script_is( $script_datepicker ) ) { + continue; + } + + // @link http://code.google.com/p/jquery-ui/source/browse/trunk/ui/i18n/jquery.ui.datepicker-nl.js + // @link https://github.com/jquery/jquery-ui/blob/master/ui/i18n/jquery.ui.datepicker-nl.js + $src = \plugins_url( 'js/jquery.ui.datepicker-nl.js', $this->plugin_file ); + + \wp_enqueue_script( 'gforms_ui_datepicker_nl', $src, array( $script_datepicker ), $this->version, true ); + } + } + + /** + * Update Euro currency. + * + * @param array> $currencies Currencies. + * @return array> + */ + public function gform_currencies( $currencies ) { + if ( ! $this->is_dutch ) { + return $currencies; + } + + // Euro currency definition. + $euro = array( + 'name' => __( 'Euro', 'gravityforms-nl' ), + 'symbol_left' => '€', + 'symbol_right' => '', + 'symbol_padding' => ' ', + 'thousand_separator' => '.', + 'decimal_separator' => ',', + 'decimals' => 2, + ); + + // Only move symbol if currency already exists. + if ( \array_key_exists( 'EUR', $currencies ) ) { + $euro = \wp_parse_args( + array( + 'symbol_left' => '€', + 'symbol_right' => '', + ), + $currencies['EUR'] + ); + } + + $currencies['EUR'] = $euro; + + return $currencies; + } + + /** + * Add Dutch address types. + * + * @param array> $address_types Address types. + * @return array> + * @link http://www.gravityhelp.com/forums/topic/add-custom-field-to-address-field-set + */ + public function gform_address_types( $address_types ) { + $address_types['dutch'] = array( + 'label' => \apply_filters( 'pronamic_gravityforms_nl_address_label', _x( 'Dutch', 'Dutch address type', 'gravityforms-nl' ) ), + 'country' => \apply_filters( 'pronamic_gravityforms_nl_address_country', _x( 'Netherlands', 'Dutch address type', 'gravityforms-nl' ) ), + 'zip_label' => \apply_filters( 'pronamic_gravityforms_nl_address_zip_label', _x( 'Postal Code', 'Dutch address type', 'gravityforms-nl' ) ), + 'state_label' => \apply_filters( 'pronamic_gravityforms_nl_address_state_label', _x( 'Province', 'Dutch address type', 'gravityforms-nl' ) ), + 'states' => \array_merge( array( '' ), \apply_filters( 'pronamic_gravityforms_nl_address_states', self::get_dutch_provinces() ) ), + ); + + return $address_types; + } + + /** + * Get Dutch provinces. + * + * @return array + */ + public static function get_dutch_provinces() { + return array( + __( 'Drenthe', 'gravityforms-nl' ), + __( 'Flevoland', 'gravityforms-nl' ), + __( 'Friesland', 'gravityforms-nl' ), + __( 'Gelderland', 'gravityforms-nl' ), + __( 'Groningen', 'gravityforms-nl' ), + __( 'Limburg', 'gravityforms-nl' ), + __( 'Noord-Brabant', 'gravityforms-nl' ), + __( 'Noord-Holland', 'gravityforms-nl' ), + __( 'Overijssel', 'gravityforms-nl' ), + __( 'Utrecht', 'gravityforms-nl' ), + __( 'Zeeland', 'gravityforms-nl' ), + __( 'Zuid-Holland', 'gravityforms-nl' ), + ); + } + + /** + * Address display format. + * + * @param string $format Address display format. + * @return string + * @link http://www.gravityhelp.com/documentation/page/Gform_address_display_format + */ + public function gform_address_display_format( $format ) { + if ( $this->is_dutch ) { + return 'zip_before_city'; + } + + return $format; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money-nl_NL.mo b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money-nl_NL.mo new file mode 100644 index 00000000..07ee6db3 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money-nl_NL.mo differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money-nl_NL.po b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money-nl_NL.po new file mode 100644 index 00000000..0045e362 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money-nl_NL.po @@ -0,0 +1,44 @@ +# Copyright (C) 2020 Pronamic +# This file is distributed under the GPL-3.0-or-later. +msgid "" +msgstr "" +"Project-Id-Version: Pronamic Money 1.2.3\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-money\n" +"POT-Creation-Date: 2019-12-18 13:40:44+00:00\n" +"PO-Revision-Date: 2019-03-27 16:35+0100\n" +"Last-Translator: Remco Tolsma \n" +"Language-Team: Pronamic \n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.7.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#. Plugin Name of the plugin/theme +msgid "Pronamic Money" +msgstr "Pronamic Money" + +#. Plugin URI of the plugin/theme +msgid "https://www.pronamic.eu/plugins/pronamic-money/" +msgstr "https://www.pronamic.eu/plugins/pronamic-money/" + +#. Description of the plugin/theme +msgid "WordPress Money library." +msgstr "WordPress Money bibliotheek." + +#. Author of the plugin/theme +msgid "Pronamic" +msgstr "Pronamic" + +#. Author URI of the plugin/theme +msgid "https://www.pronamic.eu/" +msgstr "https://www.pronamic.nl/" + +#. translators: 1: currency symbol, 2: amount value, 3: currency code, note: +#. use non-breaking space! +#: src/Money.php:73 +msgctxt "money format" +msgid "%1$s%2$s %3$s" +msgstr "%1$s %2$s" diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money.pot b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money.pot new file mode 100644 index 00000000..e4b9dcae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/languages/pronamic-money.pot @@ -0,0 +1,41 @@ +# Copyright (C) 2020 Pronamic +# This file is distributed under the GPL-3.0-or-later. +msgid "" +msgstr "" +"Project-Id-Version: Pronamic Money 1.2.3\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-money\n" +"POT-Creation-Date: 2019-12-18 13:40:44+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"X-Generator: grunt-wp-i18n 1.0.3\n" + +#. Plugin Name of the plugin/theme +msgid "Pronamic Money" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://www.pronamic.eu/plugins/pronamic-money/" +msgstr "" + +#. Description of the plugin/theme +msgid "WordPress Money library." +msgstr "" + +#. Author of the plugin/theme +msgid "Pronamic" +msgstr "" + +#. Author URI of the plugin/theme +msgid "https://www.pronamic.eu/" +msgstr "" + +#: src/Money.php:73 +#. translators: 1: currency symbol, 2: amount value, 3: currency code, note: +#. use non-breaking space! +msgctxt "money format" +msgid "%1$s%2$s %3$s" +msgstr "" \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/pronamic-money.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/pronamic-money.php new file mode 100644 index 00000000..6d4679a9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/pronamic-money.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +/** + * Pronamic Money load plugin textdomain. + */ +function pronamic_money_load_plugin_textdomain() { + load_plugin_textdomain( 'pronamic-money', false, basename( dirname( __FILE__ ) ) . '/languages' ); +} + +add_action( 'init', 'pronamic_money_load_plugin_textdomain' ); +add_action( 'change_locale', 'pronamic_money_load_plugin_textdomain' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/resources/currencies.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/resources/currencies.php new file mode 100644 index 00000000..b2e45445 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/resources/currencies.php @@ -0,0 +1,1295 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +/** + * Currencies + * + * @link https://github.com/moneyphp/money/blob/v3.1.3/src/Currencies/ISOCurrencies.php#L90-L102 + * @link https://github.com/moneyphp/money/blob/v3.1.3/resources/currency.php + * + * @author Remco Tolsma + * @version 1.2.2 + */ +return array( + array( + 'alphabetic_code' => 'AED', + 'numeric_code' => '784', + 'name' => __( 'UAE Dirham', 'pronamic-money' ), + 'symbol' => 'د.إ', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'AFN', + 'numeric_code' => '971', + 'name' => __( 'Afghan Afghani', 'pronamic-money' ), + 'symbol' => '؋', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ALL', + 'numeric_code' => '008', + 'name' => __( 'Albanian Lek', 'pronamic-money' ), + 'symbol' => 'L', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'AMD', + 'numeric_code' => '051', + 'name' => __( 'Armenian Dram', 'pronamic-money' ), + 'symbol' => '֏', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ANG', + 'numeric_code' => '532', + 'name' => __( 'Netherlands Antillean Guilder', 'pronamic-money' ), + 'symbol' => 'ƒ', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'AOA', + 'numeric_code' => '973', + 'name' => __( 'Angolan Kwanza', 'pronamic-money' ), + 'symbol' => 'Kz', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ARS', + 'numeric_code' => '032', + 'name' => __( 'Argentine Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'AUD', + 'numeric_code' => '036', + 'name' => __( 'Australian Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'AWG', + 'numeric_code' => '533', + 'name' => __( 'Aruban Florin', 'pronamic-money' ), + 'symbol' => 'ƒ', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'AZN', + 'numeric_code' => '944', + 'name' => __( 'Azerbaijan Manat', 'pronamic-money' ), + 'symbol' => '₼', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BAM', + 'numeric_code' => '977', + 'name' => __( 'Bosnia and Herzegovina Convertible Mark', 'pronamic-money' ), + 'symbol' => 'KM', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BBD', + 'numeric_code' => '052', + 'name' => __( 'Barbados Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BDT', + 'numeric_code' => '050', + 'name' => __( 'Bangladeshi Taka', 'pronamic-money' ), + 'symbol' => '৳', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BGN', + 'numeric_code' => '975', + 'name' => __( 'Bulgarian Lev', 'pronamic-money' ), + 'symbol' => 'лв.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BHD', + 'numeric_code' => '048', + 'name' => __( 'Bahraini Dinar', 'pronamic-money' ), + 'symbol' => '.د.ب', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'BIF', + 'numeric_code' => '108', + 'name' => __( 'Burundian Franc', 'pronamic-money' ), + 'symbol' => 'FBu', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'BMD', + 'numeric_code' => '060', + 'name' => __( 'Bermudian Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BND', + 'numeric_code' => '096', + 'name' => __( 'Brunei Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BOB', + 'numeric_code' => '068', + 'name' => __( 'Bolíviano', 'pronamic-money' ), + 'symbol' => '$b', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BOV', + 'numeric_code' => '984', + 'name' => __( 'Bolivian Mvdol', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BRL', + 'numeric_code' => '986', + 'name' => __( 'Brazilian Real', 'pronamic-money' ), + 'symbol' => 'R$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BSD', + 'numeric_code' => '044', + 'name' => __( 'Bahamian Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BTN', + 'numeric_code' => '064', + 'name' => __( 'Bhutanese Ngultrum', 'pronamic-money' ), + 'symbol' => 'Nu.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BWP', + 'numeric_code' => '072', + 'name' => __( 'Botswana Pula', 'pronamic-money' ), + 'symbol' => 'P', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BYN', + 'numeric_code' => '933', + 'name' => __( 'Belarusian Ruble', 'pronamic-money' ), + 'symbol' => 'Br', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'BZD', + 'numeric_code' => '084', + 'name' => __( 'Belize Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CAD', + 'numeric_code' => '124', + 'name' => __( 'Canadian Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CDF', + 'numeric_code' => '976', + 'name' => __( 'Congolese Franc', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CHE', + 'numeric_code' => '947', + 'name' => __( 'WIR Euro', 'pronamic-money' ), + 'symbol' => '€', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CHF', + 'numeric_code' => '756', + 'name' => __( 'Swiss Franc', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CHW', + 'numeric_code' => '948', + 'name' => __( 'WIR Franc', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CLF', + 'numeric_code' => '990', + 'name' => __( 'Unidad de Fomento', 'pronamic-money' ), + 'symbol' => 'UF', + 'number_decimals' => 4, + ), + array( + 'alphabetic_code' => 'CLP', + 'numeric_code' => '152', + 'name' => __( 'Chilean Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'CNY', + 'numeric_code' => '156', + 'name' => __( 'Renminbi Yuan', 'pronamic-money' ), + 'symbol' => '元', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'COP', + 'numeric_code' => '170', + 'name' => __( 'Colombian Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'COU', + 'numeric_code' => '970', + 'name' => __( 'Unidad de Valor Real', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CRC', + 'numeric_code' => '188', + 'name' => __( 'Costa Rican Colon', 'pronamic-money' ), + 'symbol' => '₡', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CUC', + 'numeric_code' => '931', + 'name' => __( 'Cuban Convertible Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CUP', + 'numeric_code' => '192', + 'name' => __( 'Cuban Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CVE', + 'numeric_code' => '132', + 'name' => __( 'Cape Verde Escudo', 'pronamic-money' ), + 'symbol' => 'Esc', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'CZK', + 'numeric_code' => '203', + 'name' => __( 'Czech Koruna', 'pronamic-money' ), + 'symbol' => 'Kč', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'DJF', + 'numeric_code' => '262', + 'name' => __( 'Djiboutian Franc', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'DKK', + 'numeric_code' => '208', + 'name' => __( 'Danish Krone', 'pronamic-money' ), + 'symbol' => 'kr', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'DOP', + 'numeric_code' => '214', + 'name' => __( 'Dominican Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'DZD', + 'numeric_code' => '012', + 'name' => __( 'Algerian Dinar', 'pronamic-money' ), + 'symbol' => 'دج', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'EGP', + 'numeric_code' => '818', + 'name' => __( 'Egyptian Pound', 'pronamic-money' ), + 'symbol' => '£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ERN', + 'numeric_code' => '232', + 'name' => __( 'Eritrean Nakfa', 'pronamic-money' ), + 'symbol' => 'Nfk', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ETB', + 'numeric_code' => '230', + 'name' => __( 'Ethiopian Birr', 'pronamic-money' ), + 'symbol' => 'Br', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'EUR', + 'numeric_code' => '978', + 'name' => __( 'Euro', 'pronamic-money' ), + 'symbol' => '€', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'FJD', + 'numeric_code' => '242', + 'name' => __( 'Fiji Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'FKP', + 'numeric_code' => '238', + 'name' => __( 'Falkland Islands Pound', 'pronamic-money' ), + 'symbol' => '£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GBP', + 'numeric_code' => '826', + 'name' => __( 'Pound Sterling', 'pronamic-money' ), + 'symbol' => '£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GEL', + 'numeric_code' => '981', + 'name' => __( 'Georgian Lari', 'pronamic-money' ), + 'symbol' => 'ლ', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GHS', + 'numeric_code' => '936', + 'name' => __( 'Ghanaian Cedi', 'pronamic-money' ), + 'symbol' => 'GH₵', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GIP', + 'numeric_code' => '292', + 'name' => __( 'Gibraltar Pound', 'pronamic-money' ), + 'symbol' => '£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GMD', + 'numeric_code' => '270', + 'name' => __( 'Gambian Dalasi', 'pronamic-money' ), + 'symbol' => 'D', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GNF', + 'numeric_code' => '324', + 'name' => __( 'Guinean Franc', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'GTQ', + 'numeric_code' => '320', + 'name' => __( 'Guatemalan Quetzal', 'pronamic-money' ), + 'symbol' => 'Q', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'GYD', + 'numeric_code' => '328', + 'name' => __( 'Guyanese Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'HKD', + 'numeric_code' => '344', + 'name' => __( 'Hong Kong Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'HNL', + 'numeric_code' => '340', + 'name' => __( 'Honduran Lempira', 'pronamic-money' ), + 'symbol' => 'L', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'HRK', + 'numeric_code' => '191', + 'name' => __( 'Croatian Kuna', 'pronamic-money' ), + 'symbol' => 'kn', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'HTG', + 'numeric_code' => '332', + 'name' => __( 'Haitian Gourde', 'pronamic-money' ), + 'symbol' => 'G', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'HUF', + 'numeric_code' => '348', + 'name' => __( 'Hungarian Forint', 'pronamic-money' ), + 'symbol' => 'Ft', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'IDR', + 'numeric_code' => '360', + 'name' => __( 'Indonesian Rupiah', 'pronamic-money' ), + 'symbol' => 'Rp', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ILS', + 'numeric_code' => '376', + 'name' => __( 'Israeli New Sheqel', 'pronamic-money' ), + 'symbol' => '₪', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'INR', + 'numeric_code' => '356', + 'name' => __( 'Indian Rupee', 'pronamic-money' ), + 'symbol' => '₹', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'IQD', + 'numeric_code' => '368', + 'name' => __( 'Iraqi Dinar', 'pronamic-money' ), + 'symbol' => 'د.ع', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'IRR', + 'numeric_code' => '364', + 'name' => __( 'Iranian Rial', 'pronamic-money' ), + 'symbol' => '﷼', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ISK', + 'numeric_code' => '352', + 'name' => __( 'Icelandic Króna', 'pronamic-money' ), + 'symbol' => 'kr', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'JMD', + 'numeric_code' => '388', + 'name' => __( 'Jamaican Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'JOD', + 'numeric_code' => '400', + 'name' => __( 'Jordanian Dinar', 'pronamic-money' ), + 'symbol' => 'JD', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'JPY', + 'numeric_code' => '392', + 'name' => __( 'Japanese Yen', 'pronamic-money' ), + 'symbol' => '¥', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'KES', + 'numeric_code' => '404', + 'name' => __( 'Kenyan Shilling', 'pronamic-money' ), + 'symbol' => 'Ksh', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'KGS', + 'numeric_code' => '417', + 'name' => __( 'Kyrgyzstani Som', 'pronamic-money' ), + 'symbol' => 'С̲', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'KHR', + 'numeric_code' => '116', + 'name' => __( 'Cambodian Riel', 'pronamic-money' ), + 'symbol' => '៛', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'KMF', + 'numeric_code' => '174', + 'name' => __( 'Comorian Franc ', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'KPW', + 'numeric_code' => '408', + 'name' => __( 'North Korean Won', 'pronamic-money' ), + 'symbol' => '₩', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'KRW', + 'numeric_code' => '410', + 'name' => __( 'South Korean Won', 'pronamic-money' ), + 'symbol' => '₩', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'KWD', + 'numeric_code' => '414', + 'name' => __( 'Kuwaiti Dinar', 'pronamic-money' ), + 'symbol' => 'د.ك', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'KYD', + 'numeric_code' => '136', + 'name' => __( 'Cayman Islands Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'KZT', + 'numeric_code' => '398', + 'name' => __( 'Kazakhstani Tenge', 'pronamic-money' ), + 'symbol' => '₸', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'LAK', + 'numeric_code' => '418', + 'name' => __( 'Lao Kip', 'pronamic-money' ), + 'symbol' => '₭', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'LBP', + 'numeric_code' => '422', + 'name' => __( 'Lebanese Pound', 'pronamic-money' ), + 'symbol' => 'LL', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'LKR', + 'numeric_code' => '144', + 'name' => __( 'Sri Lankan Rupee', 'pronamic-money' ), + 'symbol' => '₨', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'LRD', + 'numeric_code' => '430', + 'name' => __( 'Liberian Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'LSL', + 'numeric_code' => '426', + 'name' => __( 'Lesotho Loti', 'pronamic-money' ), + 'number_decimals' => 2, + + /* + * Symbol based on plural form "maloti". The one-loti note employs the symbol L. + * + * @link https://en.wikipedia.org/wiki/Currency_symbol#List_of_currency_symbols_currently_in_use + */ + 'symbol' => 'M', + ), + array( + 'alphabetic_code' => 'LYD', + 'numeric_code' => '434', + 'name' => __( 'Libyan Dinar', 'pronamic-money' ), + 'symbol' => 'ل.د', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'MAD', + 'numeric_code' => '504', + 'name' => __( 'Moroccan Dirham', 'pronamic-money' ), + 'symbol' => 'د.م.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MDL', + 'numeric_code' => '498', + 'name' => __( 'Moldovan Leu', 'pronamic-money' ), + 'symbol' => 'L', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MGA', + 'numeric_code' => '969', + 'name' => __( 'Malagasy Ariary', 'pronamic-money' ), + 'symbol' => 'Ar', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MKD', + 'numeric_code' => '807', + 'name' => __( 'Macedonian Denar', 'pronamic-money' ), + 'symbol' => 'ден', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MMK', + 'numeric_code' => '104', + 'name' => __( 'Myanmar Kyat', 'pronamic-money' ), + 'symbol' => 'K', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MNT', + 'numeric_code' => '496', + 'name' => __( 'Mongolian Tögrög', 'pronamic-money' ), + 'symbol' => '₮', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MOP', + 'numeric_code' => '446', + 'name' => __( 'Macanese Pataca', 'pronamic-money' ), + 'symbol' => 'MOP$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MRO', + 'numeric_code' => '478', + 'name' => __( 'Mauritanian Ouguiya', 'pronamic-money' ), + 'symbol' => 'UM', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MUR', + 'numeric_code' => '480', + 'name' => __( 'Mauritian Rupee', 'pronamic-money' ), + 'symbol' => '₨', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MVR', + 'numeric_code' => '462', + 'name' => __( 'Maldivian Rufiyaa', 'pronamic-money' ), + 'symbol' => 'Rf.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MWK', + 'numeric_code' => '454', + 'name' => __( 'Malawian Kwacha', 'pronamic-money' ), + 'symbol' => 'K', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MXN', + 'numeric_code' => '484', + 'name' => __( 'Mexican Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MXV', + 'numeric_code' => '979', + 'name' => __( 'Mexican Unidad de Inversion (UDI)', 'pronamic-money' ), + 'symbol' => 'UDI', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MYR', + 'numeric_code' => '458', + 'name' => __( 'Malaysian Ringgit', 'pronamic-money' ), + 'symbol' => 'RM', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'MZN', + 'numeric_code' => '943', + 'name' => __( 'Mozambican Metical', 'pronamic-money' ), + 'symbol' => 'MT', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'NAD', + 'numeric_code' => '516', + 'name' => __( 'Namibian Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'NGN', + 'numeric_code' => '566', + 'name' => __( 'Nigerian Naira', 'pronamic-money' ), + 'symbol' => '₦', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'NIO', + 'numeric_code' => '558', + 'name' => __( 'Nicaraguan Córdoba', 'pronamic-money' ), + 'symbol' => 'C$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'NLG', + 'numeric_code' => null, + 'name' => __( 'Gulden', 'pronamic-money' ), + 'symbol' => 'G', + 'number_decimals' => 4, + ), + array( + 'alphabetic_code' => 'NOK', + 'numeric_code' => '578', + 'name' => __( 'Norwegian Krone', 'pronamic-money' ), + 'symbol' => 'kr', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'NPR', + 'numeric_code' => '524', + 'name' => __( 'Nepalese Rupee', 'pronamic-money' ), + 'symbol' => '₨', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'NZD', + 'numeric_code' => '554', + 'name' => __( 'New Zealand Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'OMR', + 'numeric_code' => '512', + 'name' => __( 'Omani Rial', 'pronamic-money' ), + 'symbol' => 'ر.ع.', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'PAB', + 'numeric_code' => '590', + 'name' => __( 'Panamanian Balboa', 'pronamic-money' ), + 'symbol' => 'B/.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'PEN', + 'numeric_code' => '604', + 'name' => __( 'Peruvian Sol', 'pronamic-money' ), + 'symbol' => 'S/', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'PGK', + 'numeric_code' => '598', + 'name' => __( 'Papua New Guinean Kina', 'pronamic-money' ), + 'symbol' => 'K', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'PHP', + 'numeric_code' => '608', + 'name' => __( 'Philippine Peso', 'pronamic-money' ), + 'symbol' => '₱', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'PKR', + 'numeric_code' => '586', + 'name' => __( 'Pakistani Rupee', 'pronamic-money' ), + 'symbol' => '₨', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'PLN', + 'numeric_code' => '985', + 'name' => __( 'Polish Zloty', 'pronamic-money' ), + 'symbol' => 'zł', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'PYG', + 'numeric_code' => '600', + 'name' => __( 'Paraguayan Guaraní', 'pronamic-money' ), + 'symbol' => '₲', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'QAR', + 'numeric_code' => '634', + 'name' => __( 'Qatari Rial', 'pronamic-money' ), + 'symbol' => 'ر.ق', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'RON', + 'numeric_code' => '946', + 'name' => __( 'Romanian Leu', 'pronamic-money' ), + 'symbol' => 'L', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'RSD', + 'numeric_code' => '941', + 'name' => __( 'Serbian Dinar', 'pronamic-money' ), + 'symbol' => 'дин', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'RUB', + 'numeric_code' => '643', + 'name' => __( 'Russian Ruble', 'pronamic-money' ), + 'symbol' => '₽', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'RWF', + 'numeric_code' => '646', + 'name' => __( 'Rwandan Franc', 'pronamic-money' ), + 'symbol' => 'FRw', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'SAR', + 'numeric_code' => '682', + 'name' => __( 'Saudi Riyal', 'pronamic-money' ), + 'symbol' => 'ر.س', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SBD', + 'numeric_code' => '090', + 'name' => __( 'Solomon Islands Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SCR', + 'numeric_code' => '690', + 'name' => __( 'Seychelles Rupee', 'pronamic-money' ), + 'symbol' => 'SRe', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SDG', + 'numeric_code' => '938', + 'name' => __( 'Sudanese Pound', 'pronamic-money' ), + 'symbol' => 'ج.س', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SEK', + 'numeric_code' => '752', + 'name' => __( 'Swedish Krona', 'pronamic-money' ), + 'symbol' => 'kr', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SGD', + 'numeric_code' => '702', + 'name' => __( 'Singapore Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SHP', + 'numeric_code' => '654', + 'name' => __( 'Saint Helena Pound', 'pronamic-money' ), + 'symbol' => '£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SLL', + 'numeric_code' => '694', + 'name' => __( 'Sierra Leonean Leone', 'pronamic-money' ), + 'symbol' => 'Le', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SOS', + 'numeric_code' => '706', + 'name' => __( 'Somali Shilling', 'pronamic-money' ), + 'symbol' => 'Sh.So.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SRD', + 'numeric_code' => '968', + 'name' => __( 'Surinamese Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SSP', + 'numeric_code' => '728', + 'name' => __( 'South Sudanese Pound', 'pronamic-money' ), + 'symbol' => 'SS£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'STD', + 'numeric_code' => '678', + 'name' => __( 'São Tomé and Príncipe Dobra', 'pronamic-money' ), + 'symbol' => 'Db', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SVC', + 'numeric_code' => '222', + 'name' => __( 'Salvadoran Colon', 'pronamic-money' ), + 'symbol' => '₡', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SYP', + 'numeric_code' => '760', + 'name' => __( 'Syrian Pound', 'pronamic-money' ), + 'symbol' => '£', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'SZL', + 'numeric_code' => '748', + 'name' => __( 'Swazi Lilangeni', 'pronamic-money' ), + 'number_decimals' => 2, + + /* + * Symbol based on the plural form "emalangeni" However the one-lilageni note employs the currency symbol L. + * + * @link https://en.wikipedia.org/wiki/Currency_symbol#List_of_currency_symbols_currently_in_use + */ + 'symbol' => 'E', + ), + array( + 'alphabetic_code' => 'THB', + 'numeric_code' => '764', + 'name' => __( 'Thai Baht', 'pronamic-money' ), + 'symbol' => '฿', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TJS', + 'numeric_code' => '972', + 'name' => __( 'Tajikistani Somoni', 'pronamic-money' ), + 'symbol' => 'SM', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TMT', + 'numeric_code' => '934', + 'name' => __( 'Turkmenistan Manat', 'pronamic-money' ), + 'symbol' => 'T', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TND', + 'numeric_code' => '788', + 'name' => __( 'Tunisian Dinar', 'pronamic-money' ), + 'symbol' => 'د.ت', + 'number_decimals' => 3, + ), + array( + 'alphabetic_code' => 'TOP', + 'numeric_code' => '776', + 'name' => __( 'Tongan Pa’anga', 'pronamic-money' ), + 'symbol' => 'T$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TRY', + 'numeric_code' => '949', + 'name' => __( 'Turkish Lira', 'pronamic-money' ), + 'symbol' => '₺', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TTD', + 'numeric_code' => '780', + 'name' => __( 'Trinidad and Tobago Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TWD', + 'numeric_code' => '901', + 'name' => __( 'New Taiwan Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'TZS', + 'numeric_code' => '834', + 'name' => __( 'Tanzanian Shilling', 'pronamic-money' ), + 'symbol' => 'Tsh', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'UAH', + 'numeric_code' => '980', + 'name' => __( 'Ukrainian Hryvnia', 'pronamic-money' ), + 'symbol' => '₴', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'UGX', + 'numeric_code' => '800', + 'name' => __( 'Ugandan Shilling', 'pronamic-money' ), + 'symbol' => 'USh', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'USD', + 'numeric_code' => '840', + 'name' => __( 'US Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'USN', + 'numeric_code' => '997', + 'name' => __( 'US Dollar (Next day)', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'UYI', + 'numeric_code' => '940', + 'name' => __( 'Uruguay Peso en Unidades Indexadas (URUIURUI)', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'UYU', + 'numeric_code' => '858', + 'name' => __( 'Uruguayan Peso', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'UYW', + 'numeric_code' => '927', + 'name' => __( 'Unidad Previsional', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 4, + ), + array( + 'alphabetic_code' => 'UZS', + 'numeric_code' => '860', + 'name' => __( 'Uzbekistan Som', 'pronamic-money' ), + 'symbol' => 'лв', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'VES', + 'numeric_code' => '928', + 'name' => __( 'Venezuelan Bolívar Soberano', 'pronamic-money' ), + 'symbol' => 'Bs.S.', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'VND', + 'numeric_code' => '704', + 'name' => __( 'Vietnamese Dồng', 'pronamic-money' ), + 'symbol' => '₫', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'VUV', + 'numeric_code' => '548', + 'name' => __( 'Vanuatu Vatu', 'pronamic-money' ), + 'symbol' => 'VT', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'WST', + 'numeric_code' => '882', + 'name' => __( 'Samoan Tala', 'pronamic-money' ), + 'symbol' => 'WS$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'XAF', + 'numeric_code' => '950', + 'name' => __( 'CFA Franc BEAC', 'pronamic-money' ), + 'symbol' => 'FCFA', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XAG', + 'numeric_code' => '961', + 'name' => __( 'Silver', 'pronamic-money' ), + 'symbol' => 'Ag oz t.', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XAU', + 'numeric_code' => '959', + 'name' => __( 'Gold', 'pronamic-money' ), + 'symbol' => 'Au oz t.', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XBA', + 'numeric_code' => '955', + 'name' => __( 'Bond Markets Unit European Composite Unit (EURCO)', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XBB', + 'numeric_code' => '956', + 'name' => __( 'Bond Markets Unit European Monetary Unit (E.M.U.-6)', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XBC', + 'numeric_code' => '957', + 'name' => __( 'Bond Markets Unit European Unit of Account 9 (E.U.A.-9)', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XBD', + 'numeric_code' => '958', + 'name' => __( 'Bond Markets Unit European Unit of Account 17 (E.U.A.-17)', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XCD', + 'numeric_code' => '951', + 'name' => __( 'East Caribbean Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'XDR', + 'numeric_code' => '960', + 'name' => __( 'SDR (Special Drawing Right)', 'pronamic-money' ), + 'symbol' => 'SDR', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XOF', + 'numeric_code' => '952', + 'name' => __( 'CFA Franc BCEAO', 'pronamic-money' ), + 'symbol' => 'CFA', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XPD', + 'numeric_code' => '964', + 'name' => __( 'Palladium', 'pronamic-money' ), + 'symbol' => 'Pd oz t.', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XPF', + 'numeric_code' => '953', + 'name' => __( 'CFP Franc', 'pronamic-money' ), + 'symbol' => 'F', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XPT', + 'numeric_code' => '962', + 'name' => __( 'Platinum', 'pronamic-money' ), + 'symbol' => 'Pt oz t.', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XSU', + 'numeric_code' => '994', + 'name' => __( 'Sucre', 'pronamic-money' ), + 'symbol' => 'Sucre', + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XTS', + 'numeric_code' => '963', + 'name' => __( 'Code reserved for testing', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XUA', + 'numeric_code' => '965', + 'name' => __( 'ADB Unit of Account', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'XXX', + 'numeric_code' => '999', + 'name' => __( 'No currency', 'pronamic-money' ), + 'symbol' => null, + 'number_decimals' => 0, + ), + array( + 'alphabetic_code' => 'YER', + 'numeric_code' => '886', + 'name' => __( 'Yemeni Rial', 'pronamic-money' ), + 'symbol' => 'ر.ي', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ZAR', + 'numeric_code' => '710', + 'name' => __( 'South African Rand', 'pronamic-money' ), + 'symbol' => 'R', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ZMW', + 'numeric_code' => '967', + 'name' => __( 'Zambian Kwacha', 'pronamic-money' ), + 'symbol' => 'K', + 'number_decimals' => 2, + ), + array( + 'alphabetic_code' => 'ZWL', + 'numeric_code' => '932', + 'name' => __( 'Zimbabwean Dollar', 'pronamic-money' ), + 'symbol' => '$', + 'number_decimals' => 2, + ), +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/resources/dl_iso_table_a1.xml b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/resources/dl_iso_table_a1.xml new file mode 100644 index 00000000..41871b51 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/resources/dl_iso_table_a1.xml @@ -0,0 +1,1970 @@ + + + + AFGHANISTAN + Afghani + AFN + 971 + 2 + + + ÅLAND ISLANDS + Euro + EUR + 978 + 2 + + + ALBANIA + Lek + ALL + 008 + 2 + + + ALGERIA + Algerian Dinar + DZD + 012 + 2 + + + AMERICAN SAMOA + US Dollar + USD + 840 + 2 + + + ANDORRA + Euro + EUR + 978 + 2 + + + ANGOLA + Kwanza + AOA + 973 + 2 + + + ANGUILLA + East Caribbean Dollar + XCD + 951 + 2 + + + ANTARCTICA + No universal currency + + + + + + ANTIGUA AND BARBUDA + East Caribbean Dollar + XCD + 951 + 2 + + + ARGENTINA + Argentine Peso + ARS + 032 + 2 + + + ARMENIA + Armenian Dram + AMD + 051 + 2 + + + ARUBA + Aruban Florin + AWG + 533 + 2 + + + AUSTRALIA + Australian Dollar + AUD + 036 + 2 + + + AUSTRIA + Euro + EUR + 978 + 2 + + + AZERBAIJAN + Azerbaijanian Manat + AZN + 944 + 2 + + + BAHAMAS + Bahamian Dollar + BSD + 044 + 2 + + + BAHRAIN + Bahraini Dinar + BHD + 048 + 3 + + + BANGLADESH + Taka + BDT + 050 + 2 + + + BARBADOS + Barbados Dollar + BBD + 052 + 2 + + + BELARUS + Belarussian Ruble + BYR + 974 + 0 + + + BELGIUM + Euro + EUR + 978 + 2 + + + BELIZE + Belize Dollar + BZD + 084 + 2 + + + BENIN + CFA Franc BCEAO + XOF + 952 + 0 + + + BERMUDA + Bermudian Dollar + BMD + 060 + 2 + + + BHUTAN + Ngultrum + BTN + 064 + 2 + + + BHUTAN + Indian Rupee + INR + 356 + 2 + + + BOLIVIA, PLURINATIONAL STATE OF + Boliviano + BOB + 068 + 2 + + + BOLIVIA, PLURINATIONAL STATE OF + Mvdol + BOV + 984 + 2 + + + BONAIRE, SINT EUSTATIUS AND SABA + US Dollar + USD + 840 + 2 + + + BOSNIA AND HERZEGOVINA + Convertible Mark + BAM + 977 + 2 + + + BOTSWANA + Pula + BWP + 072 + 2 + + + BOUVET ISLAND + Norwegian Krone + NOK + 578 + 2 + + + BRAZIL + Brazilian Real + BRL + 986 + 2 + + + BRITISH INDIAN OCEAN TERRITORY + US Dollar + USD + 840 + 2 + + + BRUNEI DARUSSALAM + Brunei Dollar + BND + 096 + 2 + + + BULGARIA + Bulgarian Lev + BGN + 975 + 2 + + + BURKINA FASO + CFA Franc BCEAO + XOF + 952 + 0 + + + BURUNDI + Burundi Franc + BIF + 108 + 0 + + + CAMBODIA + Riel + KHR + 116 + 2 + + + CAMEROON + CFA Franc BEAC + XAF + 950 + 0 + + + CANADA + Canadian Dollar + CAD + 124 + 2 + + + CAPE VERDE + Cape Verde Escudo + CVE + 132 + 2 + + + CAYMAN ISLANDS + Cayman Islands Dollar + KYD + 136 + 2 + + + CENTRAL AFRICAN REPUBLIC + CFA Franc BEAC + XAF + 950 + 0 + + + CHAD + CFA Franc BEAC + XAF + 950 + 0 + + + CHILE + Unidades de fomento + CLF + 990 + 0 + + + CHILE + Chilean Peso + CLP + 152 + 0 + + + CHINA + Yuan Renminbi + CNY + 156 + 2 + + + CHRISTMAS ISLAND + Australian Dollar + AUD + 036 + 2 + + + COCOS (KEELING) ISLANDS + Australian Dollar + AUD + 036 + 2 + + + COLOMBIA + Colombian Peso + COP + 170 + 2 + + + COLOMBIA + Unidad de Valor Real + COU + 970 + 2 + + + COMOROS + Comoro Franc + KMF + 174 + 0 + + + CONGO + CFA Franc BEAC + XAF + 950 + 0 + + + CONGO, THE DEMOCRATIC REPUBLIC OF + Congolese Franc + CDF + 976 + 2 + + + COOK ISLANDS + New Zealand Dollar + NZD + 554 + 2 + + + COSTA RICA + Costa Rican Colon + CRC + 188 + 2 + + + CÔTE D'IVOIRE + CFA Franc BCEAO + XOF + 952 + 0 + + + CROATIA + Croatian Kuna + HRK + 191 + 2 + + + CUBA + Peso Convertible + CUC + 931 + 2 + + + CUBA + Cuban Peso + CUP + 192 + 2 + + + CURAÇAO + Netherlands Antillean Guilder + ANG + 532 + 2 + + + CYPRUS + Euro + EUR + 978 + 2 + + + CZECH REPUBLIC + Czech Koruna + CZK + 203 + 2 + + + DENMARK + Danish Krone + DKK + 208 + 2 + + + DJIBOUTI + Djibouti Franc + DJF + 262 + 0 + + + DOMINICA + East Caribbean Dollar + XCD + 951 + 2 + + + DOMINICAN REPUBLIC + Dominican Peso + DOP + 214 + 2 + + + ECUADOR + US Dollar + USD + 840 + 2 + + + EGYPT + Egyptian Pound + EGP + 818 + 2 + + + EL SALVADOR + El Salvador Colon + SVC + 222 + 2 + + + EL SALVADOR + US Dollar + USD + 840 + 2 + + + EQUATORIAL GUINEA + CFA Franc BEAC + XAF + 950 + 0 + + + ERITREA + Nakfa + ERN + 232 + 2 + + + ESTONIA + Euro + EUR + 978 + 2 + + + ETHIOPIA + Ethiopian Birr + ETB + 230 + 2 + + + EUROPEAN UNION + Euro + EUR + 978 + 2 + + + FALKLAND ISLANDS (MALVINAS) + Falkland Islands Pound + FKP + 238 + 2 + + + FAROE ISLANDS + Danish Krone + DKK + 208 + 2 + + + FIJI + Fiji Dollar + FJD + 242 + 2 + + + FINLAND + Euro + EUR + 978 + 2 + + + FRANCE + Euro + EUR + 978 + 2 + + + FRENCH GUIANA + Euro + EUR + 978 + 2 + + + FRENCH POLYNESIA + CFP Franc + XPF + 953 + 0 + + + FRENCH SOUTHERN TERRITORIES + Euro + EUR + 978 + 2 + + + GABON + CFA Franc BEAC + XAF + 950 + 0 + + + GAMBIA + Dalasi + GMD + 270 + 2 + + + GEORGIA + Lari + GEL + 981 + 2 + + + GERMANY + Euro + EUR + 978 + 2 + + + GHANA + Ghana Cedi + GHS + 936 + 2 + + + GIBRALTAR + Gibraltar Pound + GIP + 292 + 2 + + + GREECE + Euro + EUR + 978 + 2 + + + GREENLAND + Danish Krone + DKK + 208 + 2 + + + GRENADA + East Caribbean Dollar + XCD + 951 + 2 + + + GUADELOUPE + Euro + EUR + 978 + 2 + + + GUAM + US Dollar + USD + 840 + 2 + + + GUATEMALA + Quetzal + GTQ + 320 + 2 + + + GUERNSEY + Pound Sterling + GBP + 826 + 2 + + + GUINEA + Guinea Franc + GNF + 324 + 0 + + + GUINEA-BISSAU + CFA Franc BCEAO + XOF + 952 + 0 + + + GUYANA + Guyana Dollar + GYD + 328 + 2 + + + HAITI + Gourde + HTG + 332 + 2 + + + HAITI + US Dollar + USD + 840 + 2 + + + HEARD ISLAND AND McDONALD ISLANDS + Australian Dollar + AUD + 036 + 2 + + + HOLY SEE (VATICAN CITY STATE) + Euro + EUR + 978 + 2 + + + HONDURAS + Lempira + HNL + 340 + 2 + + + HONG KONG + Hong Kong Dollar + HKD + 344 + 2 + + + HUNGARY + Forint + HUF + 348 + 2 + + + ICELAND + Iceland Krona + ISK + 352 + 0 + + + INDIA + Indian Rupee + INR + 356 + 2 + + + INDONESIA + Rupiah + IDR + 360 + 2 + + + INTERNATIONAL MONETARY FUND (IMF)  + SDR (Special Drawing Right) + XDR + 960 + N.A. + + + IRAN, ISLAMIC REPUBLIC OF + Iranian Rial + IRR + 364 + 2 + + + IRAQ + Iraqi Dinar + IQD + 368 + 3 + + + IRELAND + Euro + EUR + 978 + 2 + + + ISLE OF MAN + Pound Sterling + GBP + 826 + 2 + + + ISRAEL + New Israeli Sheqel + ILS + 376 + 2 + + + ITALY + Euro + EUR + 978 + 2 + + + JAMAICA + Jamaican Dollar + JMD + 388 + 2 + + + JAPAN + Yen + JPY + 392 + 0 + + + JERSEY + Pound Sterling + GBP + 826 + 2 + + + JORDAN + Jordanian Dinar + JOD + 400 + 3 + + + KAZAKHSTAN + Tenge + KZT + 398 + 2 + + + KENYA + Kenyan Shilling + KES + 404 + 2 + + + KIRIBATI + Australian Dollar + AUD + 036 + 2 + + + KOREA, DEMOCRATIC PEOPLE’S REPUBLIC OF + North Korean Won + KPW + 408 + 2 + + + KOREA, REPUBLIC OF + Won + KRW + 410 + 0 + + + KUWAIT + Kuwaiti Dinar + KWD + 414 + 3 + + + KYRGYZSTAN + Som + KGS + 417 + 2 + + + LAO PEOPLE’S DEMOCRATIC REPUBLIC + Kip + LAK + 418 + 2 + + + LATVIA + Latvian Lats + LVL + 428 + 2 + + + LEBANON + Lebanese Pound + LBP + 422 + 2 + + + LESOTHO + Loti + LSL + 426 + 2 + + + LESOTHO + Rand + ZAR + 710 + 2 + + + LIBERIA + Liberian Dollar + LRD + 430 + 2 + + + LIBYA + Libyan Dinar + LYD + 434 + 3 + + + LIECHTENSTEIN + Swiss Franc + CHF + 756 + 2 + + + LITHUANIA + Lithuanian Litas + LTL + 440 + 2 + + + LUXEMBOURG + Euro + EUR + 978 + 2 + + + MACAO + Pataca + MOP + 446 + 2 + + + MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF + Denar + MKD + 807 + 2 + + + MADAGASCAR + Malagasy Ariary + MGA + 969 + 2 + + + MALAWI + Kwacha + MWK + 454 + 2 + + + MALAYSIA + Malaysian Ringgit + MYR + 458 + 2 + + + MALDIVES + Rufiyaa + MVR + 462 + 2 + + + MALI + CFA Franc BCEAO + XOF + 952 + 0 + + + MALTA + Euro + EUR + 978 + 2 + + + MARSHALL ISLANDS + US Dollar + USD + 840 + 2 + + + MARTINIQUE + Euro + EUR + 978 + 2 + + + MAURITANIA + Ouguiya + MRO + 478 + 2 + + + MAURITIUS + Mauritius Rupee + MUR + 480 + 2 + + + MAYOTTE + Euro + EUR + 978 + 2 + + + MEMBER COUNTRIES OF THE AFRICAN DEVELOPMENT BANK GROUP + ADB Unit of Account + XUA + 965 + N.A. + + + MEXICO + Mexican Peso + MXN + 484 + 2 + + + MEXICO + Mexican Unidad de Inversion (UDI) + MXV + 979 + 2 + + + MICRONESIA, FEDERATED STATES OF + US Dollar + USD + 840 + 2 + + + MOLDOVA, REPUBLIC OF + Moldovan Leu + MDL + 498 + 2 + + + MONACO + Euro + EUR + 978 + 2 + + + MONGOLIA + Tugrik + MNT + 496 + 2 + + + MONTENEGRO + Euro + EUR + 978 + 2 + + + MONTSERRAT + East Caribbean Dollar + XCD + 951 + 2 + + + MOROCCO + Moroccan Dirham + MAD + 504 + 2 + + + MOZAMBIQUE + Mozambique Metical + MZN + 943 + 2 + + + MYANMAR + Kyat + MMK + 104 + 2 + + + NAMIBIA + Namibia Dollar + NAD + 516 + 2 + + + NAMIBIA + Rand + ZAR + 710 + 2 + + + NAURU + Australian Dollar + AUD + 036 + 2 + + + NEPAL + Nepalese Rupee + NPR + 524 + 2 + + + NETHERLANDS + Euro + EUR + 978 + 2 + + + NEW CALEDONIA + CFP Franc + XPF + 953 + 0 + + + NEW ZEALAND + New Zealand Dollar + NZD + 554 + 2 + + + NICARAGUA + Cordoba Oro + NIO + 558 + 2 + + + NIGER + CFA Franc BCEAO + XOF + 952 + 0 + + + NIGERIA + Naira + NGN + 566 + 2 + + + NIUE + New Zealand Dollar + NZD + 554 + 2 + + + NORFOLK ISLAND + Australian Dollar + AUD + 036 + 2 + + + NORTHERN MARIANA ISLANDS + US Dollar + USD + 840 + 2 + + + NORWAY + Norwegian Krone + NOK + 578 + 2 + + + OMAN + Rial Omani + OMR + 512 + 3 + + + PAKISTAN + Pakistan Rupee + PKR + 586 + 2 + + + PALAU + US Dollar + USD + 840 + 2 + + + PALESTINIAN TERRITORY, OCCUPIED + No universal currency + + + + + + PANAMA + Balboa + PAB + 590 + 2 + + + PANAMA + US Dollar + USD + 840 + 2 + + + PAPUA NEW GUINEA + Kina + PGK + 598 + 2 + + + PARAGUAY + Guarani + PYG + 600 + 0 + + + PERU + Nuevo Sol + PEN + 604 + 2 + + + PHILIPPINES + Philippine Peso + PHP + 608 + 2 + + + PITCAIRN + New Zealand Dollar + NZD + 554 + 2 + + + POLAND + Zloty + PLN + 985 + 2 + + + PORTUGAL + Euro + EUR + 978 + 2 + + + PUERTO RICO + US Dollar + USD + 840 + 2 + + + QATAR + Qatari Rial + QAR + 634 + 2 + + + RÉUNION + Euro + EUR + 978 + 2 + + + ROMANIA + New Romanian Leu + RON + 946 + 2 + + + RUSSIAN FEDERATION + Russian Ruble + RUB + 643 + 2 + + + RWANDA + Rwanda Franc + RWF + 646 + 0 + + + SAINT BARTHÉLEMY + Euro + EUR + 978 + 2 + + + SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA + Saint Helena Pound + SHP + 654 + 2 + + + SAINT KITTS AND NEVIS + East Caribbean Dollar + XCD + 951 + 2 + + + SAINT LUCIA + East Caribbean Dollar + XCD + 951 + 2 + + + SAINT MARTIN (FRENCH PART) + Euro + EUR + 978 + 2 + + + SAINT PIERRE AND MIQUELON + Euro + EUR + 978 + 2 + + + SAINT VINCENT AND THE GRENADINES + East Caribbean Dollar + XCD + 951 + 2 + + + SAMOA + Tala + WST + 882 + 2 + + + SAN MARINO + Euro + EUR + 978 + 2 + + + SAO TOME AND PRINCIPE + Dobra + STD + 678 + 2 + + + SAUDI ARABIA + Saudi Riyal + SAR + 682 + 2 + + + SENEGAL + CFA Franc BCEAO + XOF + 952 + 0 + + + SERBIA + Serbian Dinar + RSD + 941 + 2 + + + SEYCHELLES + Seychelles Rupee + SCR + 690 + 2 + + + SIERRA LEONE + Leone + SLL + 694 + 2 + + + SINGAPORE + Singapore Dollar + SGD + 702 + 2 + + + SINT MAARTEN (DUTCH PART) + Netherlands Antillean Guilder + ANG + 532 + 2 + + + SISTEMA UNITARIO DE COMPENSACION REGIONAL DE PAGOS "SUCRE" + Sucre + XSU + 994 + N.A. + + + SLOVAKIA + Euro + EUR + 978 + 2 + + + SLOVENIA + Euro + EUR + 978 + 2 + + + SOLOMON ISLANDS + Solomon Islands Dollar + SBD + 090 + 2 + + + SOMALIA + Somali Shilling + SOS + 706 + 2 + + + SOUTH AFRICA + Rand + ZAR + 710 + 2 + + + SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS + No universal currency + + + + + + SOUTH SUDAN + South Sudanese Pound + SSP + 728 + 2 + + + SPAIN + Euro + EUR + 978 + 2 + + + SRI LANKA + Sri Lanka Rupee + LKR + 144 + 2 + + + SUDAN + Sudanese Pound + SDG + 938 + 2 + + + SURINAME + Surinam Dollar + SRD + 968 + 2 + + + SVALBARD AND JAN MAYEN + Norwegian Krone + NOK + 578 + 2 + + + SWAZILAND + Lilangeni + SZL + 748 + 2 + + + SWEDEN + Swedish Krona + SEK + 752 + 2 + + + SWITZERLAND + WIR Euro + CHE + 947 + 2 + + + SWITZERLAND + Swiss Franc + CHF + 756 + 2 + + + SWITZERLAND + WIR Franc + CHW + 948 + 2 + + + SYRIAN ARAB REPUBLIC + Syrian Pound + SYP + 760 + 2 + + + TAIWAN, PROVINCE OF CHINA + New Taiwan Dollar + TWD + 901 + 2 + + + TAJIKISTAN + Somoni + TJS + 972 + 2 + + + TANZANIA, UNITED REPUBLIC OF + Tanzanian Shilling + TZS + 834 + 2 + + + THAILAND + Baht + THB + 764 + 2 + + + TIMOR-LESTE + US Dollar + USD + 840 + 2 + + + TOGO + CFA Franc BCEAO + XOF + 952 + 0 + + + TOKELAU + New Zealand Dollar + NZD + 554 + 2 + + + TONGA + Pa’anga + TOP + 776 + 2 + + + TRINIDAD AND TOBAGO + Trinidad and Tobago Dollar + TTD + 780 + 2 + + + TUNISIA + Tunisian Dinar + TND + 788 + 3 + + + TURKEY + Turkish Lira + TRY + 949 + 2 + + + TURKMENISTAN + Turkmenistan New Manat + TMT + 934 + 2 + + + TURKS AND CAICOS ISLANDS + US Dollar + USD + 840 + 2 + + + TUVALU + Australian Dollar + AUD + 036 + 2 + + + UGANDA + Uganda Shilling + UGX + 800 + 2 + + + UKRAINE + Hryvnia + UAH + 980 + 2 + + + UNITED ARAB EMIRATES + UAE Dirham + AED + 784 + 2 + + + UNITED KINGDOM + Pound Sterling + GBP + 826 + 2 + + + UNITED STATES + US Dollar + USD + 840 + 2 + + + UNITED STATES + US Dollar (Next day) + USN + 997 + 2 + + + UNITED STATES + US Dollar (Same day) + USS + 998 + 2 + + + UNITED STATES MINOR OUTLYING ISLANDS + US Dollar + USD + 840 + 2 + + + URUGUAY + Uruguay Peso en Unidades Indexadas (URUIURUI) + UYI + 940 + 0 + + + URUGUAY + Peso Uruguayo + UYU + 858 + 2 + + + UZBEKISTAN + Uzbekistan Sum + UZS + 860 + 2 + + + VANUATU + Vatu + VUV + 548 + 0 + + + Vatican City State (HOLY SEE) + Euro + EUR + 978 + 2 + + + VENEZUELA, BOLIVARIAN REPUBLIC OF + Bolivar Fuerte + VEF + 937 + 2 + + + VIET NAM + Dong + VND + 704 + 0 + + + VIRGIN ISLANDS (BRITISH) + US Dollar + USD + 840 + 2 + + + VIRGIN ISLANDS (US) + US Dollar + USD + 840 + 2 + + + WALLIS AND FUTUNA + CFP Franc + XPF + 953 + 0 + + + WESTERN SAHARA + Moroccan Dirham + MAD + 504 + 2 + + + YEMEN + Yemeni Rial + YER + 886 + 2 + + + ZAMBIA + Zambian Kwacha + ZMK + 894 + 2 + + + ZIMBABWE + Zimbabwe Dollar + ZWL + 932 + 2 + + + ZZ01_Bond Markets Unit European_EURCO + Bond Markets Unit European Composite Unit (EURCO) + XBA + 955 + N.A. + + + ZZ02_Bond Markets Unit European_EMU-6 + Bond Markets Unit European Monetary Unit (E.M.U.-6) + XBB + 956 + N.A. + + + ZZ03_Bond Markets Unit European_EUA-9 + Bond Markets Unit European Unit of Account 9 (E.U.A.-9) + XBC + 957 + N.A. + + + ZZ04_Bond Markets Unit European_EUA-17 + Bond Markets Unit European Unit of Account 17 (E.U.A.-17) + XBD + 958 + N.A. + + + ZZ05_UIC-Franc + UIC-Franc + XFU + Nil + N.A. + + + ZZ06_Testing_Code + Codes specifically reserved for testing purposes + XTS + 963 + N.A. + + + ZZ07_No_Currency + The codes assigned for transactions where no currency is involved + XXX + 999 + N.A. + + + ZZ08_Gold + Gold + XAU + 959 + N.A. + + + ZZ09_Palladium + Palladium + XPD + 964 + N.A. + + + ZZ10_Platinum + Platinum + XPT + 962 + N.A. + + + ZZ11_Silver + Silver + XAG + 961 + N.A. + + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator.php new file mode 100644 index 00000000..3dd3eb7b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator.php @@ -0,0 +1,78 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +/** + * Calculator + * + * @author Remco Tolsma + * @version 1.2.2 + * @since 1.2.2 + */ +interface Calculator { + /** + * Returns whether the calculator is supported in + * the current server environment. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator.php#L12-L18 + * + * @return bool + */ + public static function supported(); + + /** + * Add added to amount. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator.php#L30-L38 + * + * @param string $value Value. + * @param string $addend Addend. + * + * @return string + */ + public function add( $value, $addend ); + + /** + * Subtract subtrahend from amount. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator.php#L40-L48 + * + * @param string $value Value. + * @param string $subtrahend Subtrahend. + * + * @return string + */ + public function subtract( $value, $subtrahend ); + + /** + * Multiply amount with multiplier. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator.php#L50-L58 + * + * @param string $value Value. + * @param int|float|string $multiplier Multiplier. + * + * @return string + */ + public function multiply( $value, $multiplier ); + + /** + * Divide amount with divisor. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator.php#L60-L68 + * + * @param string $value Value. + * @param int|float|string $divisor Divisor. + * + * @return string|null + */ + public function divide( $value, $divisor ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator/BcMathCalculator.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator/BcMathCalculator.php new file mode 100644 index 00000000..0e0ca201 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator/BcMathCalculator.php @@ -0,0 +1,122 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money\Calculator; + +use Pronamic\WordPress\Money\Calculator; + +/** + * BC Math Calculator + * + * @author Remco Tolsma + * @version 1.2.5 + * @since 1.2.2 + */ +class BcMathCalculator implements Calculator { + /** + * Scale. + * + * @var int + */ + private $scale; + + /** + * Construct BC Math Calculator. + * + * @param int $scale Scale. + */ + public function __construct( $scale = 14 ) { + $this->scale = $scale; + } + + /** + * {@inheritdoc} + */ + public static function supported() { + return extension_loaded( 'bcmath' ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/BcMathCalculator.php + * + * @param string $value Value. + * @param string $addend Addend. + * + * @return string + */ + public function add( $value, $addend ) { + if ( ! \is_numeric( $value ) || ! \is_numeric( $addend ) ) { + return $value; + } + + return bcadd( $value, $addend, $this->scale ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/BcMathCalculator.php#L51-L62 + * + * @param string $value Value. + * @param string $subtrahend Subtrahend. + * + * @return string + */ + public function subtract( $value, $subtrahend ) { + if ( ! \is_numeric( $value ) || ! \is_numeric( $subtrahend ) ) { + return $value; + } + + return bcsub( $value, $subtrahend, $this->scale ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/BcMathCalculator.php#L64-L72 + * + * @param string $value Value. + * @param int|float|string $multiplier Multiplier. + * + * @return string + */ + public function multiply( $value, $multiplier ) { + $multiplier = strval( $multiplier ); + + if ( ! \is_numeric( $value ) || ! \is_numeric( $multiplier ) ) { + return $value; + } + + return bcmul( $value, $multiplier, $this->scale ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/BcMathCalculator.php#L74-L82 + * @link https://php.net/bcdiv + * + * @param string $value Value. + * @param int|float|string $divisor Divisor. + * + * @return string|null + */ + public function divide( $value, $divisor ) { + $divisor = strval( $divisor ); + + if ( ! \is_numeric( $value ) || ! \is_numeric( $divisor ) ) { + return $value; + } + + return bcdiv( $value, $divisor, $this->scale ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator/PhpCalculator.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator/PhpCalculator.php new file mode 100644 index 00000000..cc70e1f2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Calculator/PhpCalculator.php @@ -0,0 +1,93 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money\Calculator; + +use Pronamic\WordPress\Money\Calculator; + +/** + * GMP Calculator + * + * @author Remco Tolsma + * @version 1.2.2 + * @since 1.2.2 + */ +class PhpCalculator implements Calculator { + /** + * {@inheritdoc} + */ + public static function supported() { + return true; + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/PhpCalculator.php#L30-L40 + * + * @param string $value Value. + * @param string $addend Addend. + * + * @return string + */ + public function add( $value, $addend ) { + $result = floatval( $value ) + floatval( $addend ); + + return strval( $result ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/PhpCalculator.php#L42-L52 + * + * @param string $value Value. + * @param string $subtrahend Subtrahend. + * + * @return string + */ + public function subtract( $value, $subtrahend ) { + $result = floatval( $value ) - floatval( $subtrahend ); + + return strval( $result ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/PhpCalculator.php#L54-L64 + * + * @param string $value Value. + * @param int|float|string $multiplier Multiplier. + * + * @return string + */ + public function multiply( $value, $multiplier ) { + $result = floatval( $value ) * floatval( $multiplier ); + + return strval( $result ); + } + + /** + * {@inheritdoc} + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Calculator/PhpCalculator.php#L66-L76 + * + * @param string $value Value. + * @param int|float|string $divisor Divisor. + * + * @return string|null + */ + public function divide( $value, $divisor ) { + $result = floatval( $value ) / floatval( $divisor ); + + return strval( $result ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Currencies.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Currencies.php new file mode 100644 index 00000000..dbd680aa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Currencies.php @@ -0,0 +1,102 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +/** + * Currencies + * + * @link https://github.com/moneyphp/money/blob/v3.1.3/resources/currency.php + * + * @author Remco Tolsma + * @version 1.2.2 + * @since 1.0.0 + */ +class Currencies { + /** + * Map of known currencies indexed by code. + * + * @var array|null + */ + private static $currencies; + + /** + * Get currencies. + * + * @return array + */ + public static function get_currencies() { + if ( is_null( self::$currencies ) ) { + self::$currencies = self::load_currencies(); + } + + return self::$currencies; + } + + /** + * Get currency. + * + * @param string $alphabetic_code Alphabetic currency code. + * + * @return Currency + */ + public static function get_currency( $alphabetic_code ) { + $currency = new Currency(); + + $currencies = self::get_currencies(); + + if ( isset( $currencies[ $alphabetic_code ] ) ) { + $currency = $currencies[ $alphabetic_code ]; + } + + return $currency; + } + + /** + * Load currencies. + * + * @link https://github.com/moneyphp/money/blob/v3.1.3/src/Currencies/ISOCurrencies.php#L90-L102 + * @return array + * + * @throws \RuntimeException Throws runtime exception if currencies could not be loaded from file. + */ + private static function load_currencies() { + $file = __DIR__ . '/../resources/currencies.php'; + + if ( is_readable( $file ) ) { + $currencies = array(); + + /** + * Data. + * + * @psalm-suppress UnresolvableInclude + * + * @var array> + */ + $data = require $file; + + foreach ( $data as $info ) { + $currency = new Currency(); + + $currency->set_alphabetic_code( $info['alphabetic_code'] ); + $currency->set_numeric_code( $info['numeric_code'] ); + $currency->set_name( $info['name'] ); + $currency->set_symbol( $info['symbol'] ); + $currency->set_number_decimals( $info['number_decimals'] ); + + $currencies[ $currency->get_alphabetic_code() ] = $currency; + } + + return $currencies; + } + + throw new \RuntimeException( 'Failed to load currencies.' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Currency.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Currency.php new file mode 100644 index 00000000..44118f1e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Currency.php @@ -0,0 +1,168 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +/** + * Currency + * + * @author Remco Tolsma + * @version 1.2.5 + * @since 1.0.0 + */ +class Currency { + /** + * Alphabetic code. + * + * @var string|null + */ + private $alphabetic_code; + + /** + * Numeric code. + * + * @var string|null + */ + private $numeric_code; + + /** + * Symbol. + * + * @var string|null + */ + private $symbol; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * Number decimals. + * + * @var int + */ + private $number_decimals; + + /** + * Construct and initialize currency object. + */ + public function __construct() { + $this->set_number_decimals( 2 ); + } + + /** + * Get alphabetic code. + * + * @return string|null + */ + public function get_alphabetic_code() { + return $this->alphabetic_code; + } + + /** + * Set alphabetic code. + * + * @param string|null $alphabetic_code Alphabetic code. + * @return void + */ + public function set_alphabetic_code( $alphabetic_code ) { + $this->alphabetic_code = $alphabetic_code; + } + + /** + * Get numeric code. + * + * @return string|null + */ + public function get_numeric_code() { + return $this->numeric_code; + } + + /** + * Set numeric code. + * + * @param string|null $numeric_code Numeric code. + * @return void + */ + public function set_numeric_code( $numeric_code ) { + $this->numeric_code = $numeric_code; + } + + /** + * Get symbol. + * + * @return string|null + */ + public function get_symbol() { + return $this->symbol; + } + + /** + * Set symbol. + * + * @param string|null $symbol Symbol. + * @return void + */ + public function set_symbol( $symbol ) { + $this->symbol = $symbol; + } + + /** + * Get number decimals. + * + * @return int + */ + public function get_number_decimals() { + return $this->number_decimals; + } + + /** + * Set number decimals. + * + * @param int $number_decimals Number of decimals. + * @return void + */ + final public function set_number_decimals( $number_decimals ) { + $this->number_decimals = intval( $number_decimals ); + } + + /** + * Get instance. + * + * @param string $alphabetic_code Alphabetic code. + * + * @return Currency + */ + public static function get_instance( $alphabetic_code ) { + return Currencies::get_currency( $alphabetic_code ); + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Currency name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Money.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Money.php new file mode 100644 index 00000000..148d398c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Money.php @@ -0,0 +1,424 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +use Pronamic\WordPress\Money\Calculator\BcMathCalculator; +use Pronamic\WordPress\Money\Calculator\PhpCalculator; + +/** + * Money + * + * @author Remco Tolsma + * @version 1.2.5 + * @since 1.0.0 + */ +class Money { + /** + * Amount value. + * + * @var float + */ + private $value; + + /** + * Currency. + * + * @var Currency + */ + private $currency; + + /** + * Calculator. + * + * @var Calculator|null + */ + private static $calculator; + + /** + * Calculators. + * + * @var array + */ + private static $calculators = array( + BcMathCalculator::class, + PhpCalculator::class, + ); + + /** + * Construct and initialize money object. + * + * @param string|int|float $value Amount value. + * @param Currency|string $currency Currency. + */ + public function __construct( $value = 0, $currency = 'EUR' ) { + $this->set_value( $value ); + $this->set_currency( $currency ); + } + + /** + * Get default format. + * + * @return string + */ + public static function get_default_format() { + /* translators: 1: currency symbol, 2: amount value, 3: currency code, note: use non-breaking space! */ + $format = _x( '%1$s%2$s %3$s', 'money format', 'pronamic-money' ); + // Note: ↳ Non-breaking space. + $format = apply_filters( 'pronamic_money_default_format', $format ); + + return $format; + } + + /** + * Format i18n. + * + * @param string|null $format Format. + * + * @return string + */ + public function format_i18n( $format = null ) { + if ( is_null( $format ) ) { + $format = self::get_default_format(); + } + + $alphabetic_code = $this->currency->get_alphabetic_code(); + + if ( ! empty( $alphabetic_code ) ) { + $number_decimals = $this->currency->get_number_decimals(); + + // Handle non trailing zero formatter. + if ( false !== strpos( $format, '%2$NTZ' ) ) { + $decimals = substr( $this->format(), ( - 1 * $number_decimals ), $number_decimals ); + + if ( 0 === (int) $decimals ) { + $number_decimals = 0; + } + + $format = str_replace( '%2$NTZ', '%2$s', $format ); + } + + return sprintf( + $format, + strval( $this->currency->get_symbol() ), + number_format_i18n( $this->get_value(), $number_decimals ), + strval( $this->currency->get_alphabetic_code() ) + ); + } + + return number_format_i18n( $this->get_value(), 2 ); + } + + /** + * Format i18n without trailing zeros. + * + * @param string|null $format Format. + * + * @return string + */ + public function format_i18n_non_trailing_zeros( $format = null ) { + if ( is_null( $format ) ) { + $format = self::get_default_format(); + } + + $format = str_replace( '%2$s', '%2$NTZ', $format ); + + return $this->format_i18n( $format ); + } + + /** + * Format. + * + * @param string|null $format Format. + * + * @return string + */ + public function format( $format = null ) { + if ( is_null( $format ) ) { + $format = '%2$s'; + } + + $alphabetic_code = $this->currency->get_alphabetic_code(); + + if ( ! empty( $alphabetic_code ) ) { + return sprintf( + $format, + strval( $this->currency->get_symbol() ), + number_format( $this->get_value(), $this->get_currency()->get_number_decimals(), '.', '' ), + strval( $this->currency->get_alphabetic_code() ) + ); + } + + return number_format( $this->get_value(), 2, '.', '' ); + } + + /** + * Get value. + * + * @return float Amount value. + */ + public function get_value() { + return $this->value; + } + + /** + * Get amount. + * + * @deprecated 1.2.0 + * @return float Amount value. + */ + public function get_amount() { + _deprecated_function( __METHOD__, '1.2.0', 'Money::get_value()' ); + + return $this->get_value(); + } + + /** + * Get cents. + * + * @return float + * + * @deprecated 1.2.2 Use `Money::get_minor_units()` instead. + */ + public function get_cents() { + return (float) $this->get_minor_units(); + } + + /** + * Get amount in minor units. + * + * Examples for value 10: + * JPY 0 decimals: 10 + * EUR 2 decimals: 1000 + * BHD 3 decimals: 10000 + * NLG 4 decimals: 100000 + * + * @since 1.2.1 + * + * @return int + */ + public function get_minor_units() { + $calculator = $this->get_calculator(); + + // Use non-locale aware float value. + $value = \sprintf( '%F', $this->get_value() ); + + $minor_units = $calculator->multiply( $value, pow( 10, $this->currency->get_number_decimals() ) ); + + return (int) $minor_units; + } + + /** + * Set value. + * + * @param mixed $value Amount value. + * @return void + */ + final public function set_value( $value ) { + $this->value = floatval( $value ); + } + + /** + * Set amount. + * + * @deprecated 1.2.0 + * @param mixed $value Amount value. + * @return void + */ + public function set_amount( $value ) { + _deprecated_function( __METHOD__, '1.2.0', 'Money::set_value()' ); + + $this->set_value( $value ); + } + + /** + * Get currency. + * + * @return Currency + */ + public function get_currency() { + return $this->currency; + } + + /** + * Set currency. + * + * @param string|Currency $currency Currency. + * @return void + */ + final public function set_currency( $currency ) { + if ( $currency instanceof Currency ) { + $this->currency = $currency; + + return; + } + + $this->currency = Currency::get_instance( $currency ); + } + + /** + * Create a string representation of this money object. + * + * @return string + */ + public function __toString() { + return $this->format_i18n(); + } + + /** + * Returns a new Money object that represents + * the sum of this and an other Money object. + * + * @param Money $addend Addend. + * + * @return Money + */ + public function add( Money $addend ) { + $value = $this->get_value(); + + $calculator = $this->get_calculator(); + + // Use non-locale aware float value. + $value = \sprintf( '%F', $value ); + $addend = \sprintf( '%F', $addend->get_value() ); + + $value = $calculator->add( $value, $addend ); + + $result = clone $this; + + $result->set_value( $value ); + + return $result; + } + + /** + * Returns a new Money object that represents + * the difference of this and an other Money object. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Money.php#L235-L255 + * + * @param Money $subtrahend Subtrahend. + * + * @return Money + */ + public function subtract( Money $subtrahend ) { + $value = $this->get_value(); + + $calculator = $this->get_calculator(); + + // Use non-locale aware float value. + $value = \sprintf( '%F', $value ); + $subtrahend = \sprintf( '%F', $subtrahend->get_value() ); + + $value = $calculator->subtract( $value, $subtrahend ); + + $result = clone $this; + + $result->set_value( $value ); + + return $result; + } + + /** + * Returns a new Money object that represents + * the multiplied value of this Money object. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Money.php#L299-L316 + * + * @param int|float|string $multiplier Multiplier. + * + * @return Money + */ + public function multiply( $multiplier ) { + $value = $this->get_value(); + + $calculator = $this->get_calculator(); + + // Use non-locale aware float value. + $value = \sprintf( '%F', $value ); + $multiplier = \sprintf( '%F', $multiplier ); + + $value = $calculator->multiply( $value, $multiplier ); + + $result = clone $this; + + $result->set_value( $value ); + + return $result; + } + + /** + * Returns a new Money object that represents + * the divided value of this Money object. + * + * @link https://github.com/moneyphp/money/blob/v3.2.1/src/Money.php#L318-L341 + * + * @param int|float|string $divisor Divisor. + * + * @return Money + */ + public function divide( $divisor ) { + $value = $this->get_value(); + + $calculator = $this->get_calculator(); + + // Use non-locale aware float value. + $value = \sprintf( '%F', $value ); + $divisor = \sprintf( '%F', $divisor ); + + $value = $calculator->divide( $value, $divisor ); + + if ( null === $value ) { + $value = $this->get_value(); + } + + $result = clone $this; + + $result->set_value( $value ); + + return $result; + } + + /** + * Initialize calculator. + * + * @return Calculator + * + * @throws \RuntimeException If cannot find calculator for money calculations. + */ + private static function initialize_calculator() { + $calculator_classes = self::$calculators; + + foreach ( $calculator_classes as $calculator_class ) { + if ( $calculator_class::supported() ) { + $calculator = new $calculator_class(); + + if ( $calculator instanceof Calculator ) { + return $calculator; + } + } + } + + throw new \RuntimeException( 'Cannot find calculator for money calculations' ); + } + + /** + * Get calculator. + * + * @return Calculator + */ + protected function get_calculator() { + if ( null === self::$calculator ) { + self::$calculator = self::initialize_calculator(); + } + + return self::$calculator; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Parser.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Parser.php new file mode 100644 index 00000000..5d681a88 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/Parser.php @@ -0,0 +1,116 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +use Exception; + +/** + * Parser + * + * @author Remco Tolsma + * @version 1.2.5 + * @since 1.1.0 + */ +class Parser { + /** + * Parse. + * + * @link https://github.com/wp-pay/core/blob/2.0.2/src/Core/Util.php#L128-L176 + * + * @param string $string String to parse as money. + * + * @return Money + * + * @throws Exception Throws exception when parsing string fails. + */ + public function parse( $string ) { + global $wp_locale; + + $decimal_sep = $wp_locale->number_format['decimal_point']; + + // Separators. + $separators = array( $decimal_sep, '.', ',' ); + $separators = array_unique( array_filter( $separators ) ); + + // Check. + foreach ( array( - 3, - 2 ) as $i ) { + $test = substr( $string, $i, 1 ); + + if ( in_array( $test, $separators, true ) ) { + $decimal_sep = $test; + + break; + } + } + + // Split. + $position = false; + + if ( is_string( $decimal_sep ) ) { + $position = strrpos( $string, $decimal_sep ); + } + + // Check decimal position on -4th position at end of string of negative amount (e.g. `2.500,75-`). + if ( false === $position && '-' === \substr( $string, -1, 1 ) ) { + $test = substr( $string, -4, 1 ); + + if ( is_string( $test ) && in_array( $test, $separators, true ) ) { + $position = strrpos( $string, $test ); + } + } + + if ( false !== $position ) { + $full = substr( $string, 0, $position ); + $half = substr( $string, $position + 1 ); + + /* + * Consider `-` after decimal separator as alternative notation for 'no minor units' (e.g. `€ 5,-`). + * + * @link https://taaladvies.net/taal/advies/vraag/275/euro_komma_en_streepje_in_de_notatie_van_hele_bedragen/ + */ + if ( \in_array( $half, array( '-', '–', '—' ), true ) ) { + $half = ''; + } + + $end_minus = ( '-' === \substr( $half, -1, 1 ) ); + + $full = filter_var( $full, FILTER_SANITIZE_NUMBER_INT ); + $half = filter_var( $half, FILTER_SANITIZE_NUMBER_INT ); + + // Make amount negative if half string ends with minus sign. + if ( $end_minus ) { + // Make full negative. + $full = sprintf( '-%s', $full ); + + // Remove minus from end of half. + $half = \substr( (string) $half, 0, -1 ); + } + + $string = $full . '.' . $half; + } else { + // Make amount negative if full string ends with minus sign. + if ( '-' === \substr( $string, -1, 1 ) ) { + $string = sprintf( '-%s', \substr( $string, 0, -1 ) ); + } + + $string = filter_var( $string, FILTER_SANITIZE_NUMBER_INT ); + } + + // Filter. + $value = filter_var( $string, FILTER_VALIDATE_FLOAT ); + + if ( false === $value ) { + throw new Exception( 'Could not parse value to money object.' ); + } + + return new Money( $value ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/TaxedMoney.php b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/TaxedMoney.php new file mode 100644 index 00000000..4d08e82f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/pronamic/wp-money/src/TaxedMoney.php @@ -0,0 +1,147 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Money + */ + +namespace Pronamic\WordPress\Money; + +/** + * Taxed Money + * + * @author Remco Tolsma + * @version 1.2.2 + * @since 1.2.0 + */ +class TaxedMoney extends Money { + /** + * Tax value. + * + * @var float|null + */ + private $tax_value; + + /** + * Tax percentage. + * + * @var float|null + */ + private $tax_percentage; + + /** + * Construct and initialize money object. + * + * @param string|int|float $value Amount value. + * @param Currency|string $currency Currency. + * @param string|int|float $tax_value Tax value. + * @param string|int|float $tax_percentage Tax percentage. + */ + public function __construct( $value = 0, $currency = 'EUR', $tax_value = null, $tax_percentage = null ) { + parent::__construct( $value, $currency ); + + // Calculate tax amount if tax percentage is set. + if ( null === $tax_value && null !== $tax_percentage ) { + $calculator = $this->get_calculator(); + + $one_percent_value = $calculator->divide( strval( $value ), $calculator->add( strval( 100 ), strval( $tax_percentage ) ) ); + + $tax_value = $calculator->multiply( strval( $one_percent_value ), $tax_percentage ); + } + + $this->set_tax_value( $tax_value ); + $this->set_tax_percentage( $tax_percentage ); + } + + /** + * Get tax amount. + * + * @return Money|null Tax amount. + */ + public function get_tax_amount() { + if ( null === $this->tax_value ) { + return null; + } + + return new Money( $this->tax_value, $this->get_currency() ); + } + + /** + * Get tax value. + * + * @return float|null + */ + public function get_tax_value() { + return $this->tax_value; + } + + /** + * Set tax value. + * + * @param float|int|string|null $value Tax value. + * @return void + */ + public function set_tax_value( $value ) { + $this->tax_value = ( null === $value ? null : floatval( $value ) ); + } + + /** + * Has tax? + * + * @return bool + */ + public function has_tax() { + return ( null !== $this->get_tax_value() ); + } + + /** + * Get tax percentage. + * + * @return float|null + */ + public function get_tax_percentage() { + return $this->tax_percentage; + } + + /** + * Set tax percentage. + * + * 100% = 100 + * 21% = 21 + * 6% = 6 + * 1.5% = 1.5 + * + * @param string|int|float|null $percentage Tax percentage. + * @return void + */ + public function set_tax_percentage( $percentage ) { + $this->tax_percentage = ( null === $percentage ? null : floatval( $percentage ) ); + } + + /** + * Get including tax. + * + * @return Money + */ + public function get_including_tax() { + return new Money( $this->get_value(), $this->get_currency() ); + } + + /** + * Get excluding tax. + * + * @return Money + */ + public function get_excluding_tax() { + $tax_amount = $this->get_tax_amount(); + + if ( null === $tax_amount ) { + return $this->get_including_tax(); + } + + return $this->subtract( $tax_amount ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/viison/address-splitter/src/AddressSplitter.php b/wp-content/plugins/pronamic-ideal/vendor/viison/address-splitter/src/AddressSplitter.php new file mode 100644 index 00000000..3d1e95bb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/viison/address-splitter/src/AddressSplitter.php @@ -0,0 +1,355 @@ + + */ + $addition2Introducers = '(?: + + # {{{ Additions relating to who (a natural person) is addressed + + \s+ [Cc] \s* \/ \s* [Oo] \s + | ℅ + | \s+ care \s+ of \s+ + + # German, Swiss, Austrian + | \s+ (?: p|p.\s*|per\s+ ) (?: A|A.|Adr.|(?<=\s)Adresse ) \s + | \s+ p. \s* A. \s + | \s+ (?: z | z.\s* | zu\s+ ) (?: Hd|Hd.|(?<=\s)Händen|(?<=\s)Haenden|(?<=\s)Handen) \s+ + + ## o. V. i. A. = oder Vertreter im Amt + | \s+ (?: o | o.\s* | oder\s+ ) + (?: V | V.\s* | (?<=\s)Vertreter\s+ ) + (?: i | i.\s* | (?<=\s)im\s+ ) + (?: A | A.\s* | (?<=\s)Amt\s+ ) + + # }}} + # {{{ Additions which further specify more precisely the location + + | \s+ (?: Haus ' . $numberPrefixes . '? ) \s + | \s+ (?: WG | W\.G\. | WG\. | Wohngemeinschaft ) ' . $numberPrefixes .'? ($ | \s) + | \s+ (?: [Aa]partment | APT \.? | Apt \.? ) ' . $numberPrefixes .'? \s + | \s+ (?: [Ff]lat ) ' . $numberPrefixes .'? \s + | (?: # Numeric-based location specifiers (e.g., "3. Stock"): + \s+ + (?: + [\p{N}]+ # A number, … + (?i: st | nd | rd | th)? # …, optionally followed by an English number suffix + \.? # …, followed by an optional dot, + \s* # …, followed by optional spacing + )? + (?: # Specifying category: + (?i: Stock | Stockwerk) + | App \.? | Apt \.? | (?i: Appartment | Apartment) + ) + # At the end of the string or followed by a space + (?: $ | \s) + ) + | (?: + \s+ (?: + # English language stop words wrt location from source [1] + # (extracted only those which may not be _exclusively_ part of + # street names): + | ANX \.? | (?i: ANNEX) + | APT \.? | (?i: APARTMENT) + | ARC \.? | (?i: ARCADE) + | AVE \.? | (?i: AVENUE) + | BSMT \.? | (?i: BASEMENT) + | BLDG \.? | (?i: BUILDING) + | CP \.? | (?i: CAMP) + | COR \.? | (?i: CORNER) + | CORS \.? | (?i: CORNERS) + | CT \.? | (?i: COURT) + | CTS \.? | (?i: COURTS) + | DEPT \.? | (?i: DEPARTMENT) + | DV \.? | (?i: DIVIDE) + | EST \.? | (?i: ESTATE) + | EXT \.? | (?i: EXTENSION) + | FRY \.? | (?i: FERRY) + | FLD \.? | (?i: FIELD) + | FLDS \.? | (?i: FIELDS) + | FLT \.? | (?i: FLAT) + | FL \.? | (?i: FLOOR) + | FRNT \.? | (?i: FRONT) + | GDNS \.? | (?i: GARDEN) + | GDNS \.? | (?i: GARDENS) + | GTWY \.? | (?i: GATEWAY) + | GRN \.? | (?i: GREEN) + | GRV \.? | (?i: GROVE) + | HNGR \.? | (?i: HANGER) + | HBR \.? | (?i: HARBOR) + | HVN \.? | (?i: HAVEN) + | KY \.? | (?i: KEY) + | LBBY \.? | (?i: LOBBY) + | LCKS \.? | (?i: LOCK) + | LCKS \.? | (?i: LOCKS) + | LDG \.? | (?i: LODGE) + | MNR \.? | (?i: MANOR) + | OFC \.? | (?i: OFFICE) + | PKWY \.? | (?i: PARKWAY) + | PH \.? | (?i: PENTHOUSE) + | PRT \.? | (?i: PORT) + | RADL \.? | (?i: RADIAL) + | RM \.? | (?i: ROOM) + | SPC \.? | (?i: SPACE) + | SQ \.? | (?i: SQUARE) + | STA \.? | (?i: STATION) + | STE \.? | (?i: SUITE) + | TER \.? | (?i: TERRACE) + | TRAK \.? | (?i: TRACK) + | TRL \.? | (?i: TRAIL) + | TRLR \.? | (?i: TRAILER) + | TUNL \.? | (?i: TUNNEL) + | VW \.? | (?i: VIEW) + | VIS \.? | (?i: VISTA) + + # Custom custom additions: + | (?i: Story | Storey) + | LVL \.? | (?i: Level) + ) + ' . $numberPrefixes . '? + # May optionally be followed directly by a number+letter + # combination (e.g., "LVL3C"): + (?: [\p{N}]+[\p{L}]* )? + # Occurs at the end of the string or followed by a space: + ($ | \s) + ) + + # Heuristic to match location specifiers. These must not be + # conflated with house number extensions as in "12 AB". Hence + # our heuristic is at least 3 letters with the first letter being + # spelled as a capital. E.g., it would match "Haus", "Gebäude" or + # "Arbeitspl.", but not "AAB". + | \s+ ( [\p{Lu}\p{Lt}] [\p{Ll}\p{Lo}]{2,} \.? ) ($ | \s) + + # }}} + )'; + + $regex = ' + /\A\s* + (?: ######################################################################### + # Option A: [] # + # [] # + ######################################################################### + (?:(?P.*?),\s*)? # Addition to address 1 + (?: ' . $houseNumberPrefixes . ' \s*)? + (?P + (?P + \pN+(\s+\d+\/\d+)? + ) + (?: + \s*[\-\/\.]?\s* + (?P(?:[a-zA-Z\pN]){1,2}) + \s+ + )? + ) + \s*,?\s* + (?P(?:[a-zA-Z]\s*|\pN\pL{2,}\s\pL)\S[^,#]*?(?(?!\s).*?))? # Addition to address 2 + | ######################################################################### + # Option B: [] # + # [] # + ######################################################################### + (?:(?P.*?),\s*(?=.*[,\/]))? # Addition to address 1 + (?!\s* ' . $houseNumberPrefixes . ') + (?P[^0-9# ]\s*\S(?:[^,#](?!\b\pN+\s))*?(? + (?P + \pN+ + ) + (?: + # Match house numbers that are (optionally) amended + # by a dash (e.g., 12-13) or slash (e.g., 12\/A): + (?: \s*[\-\/]\s* )* + (?P + (?: + # Do not match "care-of"-like additions as + # house numbers: + (?!' . $addition2Introducers .') + \s*[\pL\pN]+ + ) + # Match any further slash- or dash-based house + # number extensions: + (?: + # Do not match "care-of"-like additions as + # house numbers: + (?!' . $addition2Introducers .') + # Match any (optionally space-separated) + # additionals parts of house numbers after + # slashes or dashes. + \s* [\-\/] \s* + [\pL\pN]+ + )* + ) + )? + ) # House number + (?: + (?:\s*[-,\/]|(?=\#)|\s) + \s* + (?!\s* ' . $houseNumberPrefixes . ' ) + \s* + (?P(?!\s).*?) + )? + ) + \s*\Z/xu'; + + $result = preg_match($regex, $address, $matches); + if ($result === 0) { + throw new SplittingException(SplittingException::CODE_ADDRESS_SPLITTING_ERROR, $address); + } elseif ($result === false) { + throw new \RuntimeException(sprintf('Error occurred while trying to split address \'%s\'', $address)); + } + + if (!empty($matches['A_Street_name'])) { + return array( + 'additionToAddress1' => $matches['A_Addition_to_address_1'], + 'streetName' => $matches['A_Street_name'], + 'houseNumber' => $matches['A_House_number_match'], + 'houseNumberParts' => array( + 'base' => $matches['A_House_number_base'], + 'extension' => isset($matches['A_House_number_extension']) ? trim($matches['A_House_number_extension']) : '' + ), + 'additionToAddress2' => (isset($matches['A_Addition_to_address_2'])) ? $matches['A_Addition_to_address_2'] : '' + ); + } else { + return array( + 'additionToAddress1' => $matches['B_Addition_to_address_1'], + 'streetName' => $matches['B_Street_name'], + 'houseNumber' => $matches['B_House_number_match'], + 'houseNumberParts' => array( + 'base' => $matches['B_House_number_base'], + 'extension' => isset($matches['B_House_number_extension']) ? trim($matches['B_House_number_extension']) : '' + ), + 'additionToAddress2' => isset($matches['B_Addition_to_address_2']) ? $matches['B_Addition_to_address_2'] : '' + ); + } + } + + /** + * @param string $houseNumber A house number string to split in base and extension + * @return array + * @throws SplittingException + */ + public static function splitHouseNumber($houseNumber) + { + $regex = + '/ + \A\s* # Trim white spaces at the beginning + (?: ' . self::getHouseNumberPrefixes() . '?\s*)? + (?:\#\s*)? # Trim # + (? + [\pN]+ # House Number base (only the number) + ) + \s*[\/\-\.]?\s* # Separator (optional) + (? # House number extension (optional) + .*? # Here we allow every character. Everything after the separator is interpreted as extension + ) + \s*\Z # Trim white spaces at the end + /xu'; // Option (u)nicode and e(x)tended syntax + + $result = preg_match($regex, $houseNumber, $matches); + + if ($result === 0) { + throw new SplittingException(SplittingException::CODE_HOUSE_NUMBER_SPLITTING_ERROR, $houseNumber); + } elseif ($result === false) { + throw new \RuntimeException(sprintf('Error occurred while trying to house number \'%s\'', $houseNumber)); + } + + return array( + 'base' => $matches['House_number_base'], + 'extension' => $matches['House_number_extension'] + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/viison/address-splitter/src/Exceptions/SplittingException.php b/wp-content/plugins/pronamic-ideal/vendor/viison/address-splitter/src/Exceptions/SplittingException.php new file mode 100644 index 00000000..cdda51d0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/viison/address-splitter/src/Exceptions/SplittingException.php @@ -0,0 +1,37 @@ + 'Address \'%s\' could not be splitted into street name and house number.', + self::CODE_HOUSE_NUMBER_SPLITTING_ERROR => 'House number \'%s\' could not be splitted into base and extension.', + self::CODE_UNKNOWN_ERROR => 'Unknown error' + ); + + /** + * Create new SplittingException, automatically adds a meaningful error message when the error code is known. + * + * @param int $code + * @param string $splittingSubject The string that was tried to split + */ + public function __construct($code, $splittingSubject = '') + { + if (!array_key_exists($code, self::$errorMessages)) { + $code = self::CODE_UNKNOWN_ERROR; + } + $message = sprintf(self::$errorMessages[$code], $splittingSubject); + + parent::__construct($message, $code); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/BancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/BancontactGateway.php new file mode 100644 index 00000000..a3fb57e0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/BancontactGateway.php @@ -0,0 +1,67 @@ +name = __( 'Bancontact', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'Bancontact', 'pronamic_ideal' ), + ); + + $this->payment_method = PaymentMethods::BANCONTACT; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php new file mode 100644 index 00000000..06c791ce --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/BankTransferGateway.php @@ -0,0 +1,67 @@ +name = __( 'Bank Transfer', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'Bank Transfer', 'pronamic_ideal' ), + ); + + $this->payment_method = PaymentMethods::BANK_TRANSFER; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Charitable.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Charitable.php new file mode 100644 index 00000000..bf1c09de --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Charitable.php @@ -0,0 +1,17 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Charitable + */ + +namespace Pronamic\WordPress\Pay\Extensions\Charitable; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Charitable Dependency + * + * @author Reüel van der Steege + * @version 2.1.1 + * @since 2.1.0 + */ +class CharitableDependency extends Dependency { + /** + * Is met. + * + * @link + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \class_exists( '\Charitable' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/CharitableHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/CharitableHelper.php new file mode 100644 index 00000000..559d2870 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/CharitableHelper.php @@ -0,0 +1,136 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Charitable + */ + +namespace Pronamic\WordPress\Pay\Extensions\Charitable; + +use Charitable_Donation; +use Charitable_Donation_Processor; +use Charitable_Gateway; +use Pronamic\WordPress\Money\Parser as MoneyParser; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\AddressHelper; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\ContactNameHelper; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\CustomerHelper; + +/** + * Charitable Helper + * + * @version 2.2.0 + * @since 2.2.0 + */ +class CharitableHelper { + /** + * Get description. + * + * @return string + */ + public static function get_title( $donation_id ) { + return \sprintf( + /* translators: %s: Charitable donation ID */ + \__( 'Charitable donation %s', 'pronamic_ideal' ), + $donation_id + ); + } + + /** + * Get description. + * + * @return string + */ + public static function get_description( $gateway, $donation_id ) { + $description = $gateway->get_value( 'transaction_description' ); + + if ( '' === $description ) { + $description = self::get_title( $donation_id ); + } + + // Replacements. + $replacements = array( + '{donation_id}' => $donation_id, + ); + + return \strtr( $description, $replacements ); + } + + /** + * Get total amount value. + * + * @link https://github.com/Charitable/Charitable/blob/1.6.46/includes/abstracts/abstract-class-charitable-abstract-donation.php#L271-L287 + * @param int $donation_id Donation ID. + * @return float + */ + public static function get_total_amount_value( $donation_id ) { + $donation = new Charitable_Donation( $donation_id ); + + return $donation->get_total_donation_amount( true ); + } + + /** + * Get value from user data. + * + * @param array $user_data User data. + * @param string $key Array key. + * @return null|string + */ + public static function get_value_from_user_data( $user_data, $key ) { + if ( ! array_key_exists( $key, $user_data ) ) { + return null; + } + + return $user_data[ $key ]; + } + + /** + * Get customer from user data. + */ + public static function get_customer_from_user_data( $user_data ) { + return CustomerHelper::from_array( + array( + 'name' => self::get_name_from_user_data( $user_data ), + 'email' => self::get_value_from_user_data( $user_data, 'email' ), + 'phone' => self::get_value_from_user_data( $user_data, 'phone' ), + 'user_id' => null, + ) + ); + } + + /** + * Get name from user data. + */ + public static function get_name_from_user_data( $user_data ) { + return ContactNameHelper::from_array( + array( + 'first_name' => self::get_value_from_user_data( $user_data, 'first_name' ), + 'last_name' => self::get_value_from_user_data( $user_data, 'last_name' ), + ) + ); + } + + /** + * Get address from user data. + */ + public static function get_address_from_user_data( $user_data ) { + return AddressHelper::from_array( + array( + 'name' => self::get_name_from_user_data( $user_data ), + 'line_1' => self::get_value_from_user_data( $user_data, 'address' ), + 'line_2' => self::get_value_from_user_data( $user_data, 'address_2' ), + 'postal_code' => self::get_value_from_user_data( $user_data, 'postcode' ), + 'city' => self::get_value_from_user_data( $user_data, 'city' ), + 'region' => self::get_value_from_user_data( $user_data, 'state' ), + 'country_code' => self::get_value_from_user_data( $user_data, 'country' ), + 'email' => self::get_value_from_user_data( $user_data, 'email' ), + 'phone' => self::get_value_from_user_data( $user_data, 'phone' ), + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php new file mode 100644 index 00000000..0ea283a5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/CreditCardGateway.php @@ -0,0 +1,67 @@ +name = __( 'Credit Card', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'Credit Card', 'pronamic_ideal' ), + ); + + $this->payment_method = PaymentMethods::CREDIT_CARD; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php new file mode 100644 index 00000000..c8eaefa1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/DirectDebitGateway.php @@ -0,0 +1,67 @@ +name = __( 'Direct Debit', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'Direct Debit', 'pronamic_ideal' ), + ); + + $this->payment_method = PaymentMethods::DIRECT_DEBIT; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.1 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Extension.php new file mode 100644 index 00000000..f02e20a2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Extension.php @@ -0,0 +1,287 @@ + __( 'Charitable', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new CharitableDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( $this, 'redirect_url' ), 10, 2 ); + add_action( 'pronamic_payment_status_update_' . self::SLUG, array( $this, 'status_update' ), 10 ); + + add_filter( 'charitable_payment_gateways', array( $this, 'charitable_payment_gateways' ) ); + + // Currencies. + add_filter( 'charitable_currencies', array( $this, 'currencies' ), 10, 1 ); + add_filter( 'charitable_currency_symbol', array( $this, 'currency_symbol' ), 10, 2 ); + } + + /** + * Charitable payments gateways. + * + * @link https://github.com/Charitable/Charitable/blob/1.1.4/includes/gateways/class-charitable-gateways.php#L44-L51 + * + * @param array $gateways Gateways. + * + * @return array + */ + public function charitable_payment_gateways( $gateways ) { + $classes = array( + 'Gateway', + 'BankTransferGateway', + 'CreditCardGateway', + 'DirectDebitGateway', + 'IDealGateway', + 'BancontactGateway', + 'SofortGateway', + ); + + if ( PaymentMethods::is_active( PaymentMethods::GULDEN ) ) { + $classes[] = 'GuldenGateway'; + } + + foreach ( $classes as $class ) { + $class = __NAMESPACE__ . '\\' . $class; + + $id = call_user_func( array( $class, 'get_gateway_id' ) ); + + $gateways[ $id ] = $class; + + // @link https://github.com/Charitable/Charitable/blob/1.1.4/includes/donations/class-charitable-donation-processor.php#L165-L174 + // @link https://github.com/Charitable/Charitable/blob/1.4.5/includes/donations/class-charitable-donation-processor.php#L213-L247 + add_filter( 'charitable_process_donation_' . $id, array( $class, 'process_donation' ), 10, 3 ); + + if ( Core_Util::class_method_exists( $class, 'form_gateway_fields' ) ) { + // @link https://github.com/Charitable/Charitable/blob/1.4.5/includes/donations/class-charitable-donation-form.php#L387 + add_filter( 'charitable_donation_form_gateway_fields', array( $class, 'form_gateway_fields' ), 10, 2 ); + } + + if ( Core_Util::class_method_exists( $class, 'form_field_template' ) ) { + // @link https://github.com/Charitable/Charitable/blob/1.4.5/includes/abstracts/class-charitable-form.php#L231-L232 + add_filter( 'charitable_form_field_template', array( $class, 'form_field_template' ), 10, 4 ); + } + } + + return $gateways; + } + + /** + * Get the default return URL. + * + * @since 1.0.3 + * + * @param Charitable_Donation $donation Donation. + * + * @return string URL + */ + private static function get_return_url( Charitable_Donation $donation ) { + $url = home_url(); + + $donations = $donation->get_campaign_donations(); + + $campaign = reset( $donations ); + + if ( false !== $campaign ) { + $url = get_permalink( $campaign->campaign_id ); + } + + return $url; + } + + /** + * Payment redirect URL filter. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function redirect_url( $url, Payment $payment ) { + $donation_id = $payment->get_source_id(); + + $donation = new Charitable_Donation( $donation_id ); + + $url = self::get_return_url( $donation ); + + switch ( $payment->get_status() ) { + case PaymentStatus::SUCCESS: + $url = charitable_get_permalink( 'donation_receipt_page', array( 'donation_id' => $donation_id ) ); + + break; + } + + return $url; + } + + /** + * Update lead status of the specified payment + * + * @link https://github.com/Charitable/Charitable/blob/1.1.4/includes/gateways/class-charitable-gateway-paypal.php#L229-L357 + * + * @param Payment $payment Payment. + */ + public function status_update( Payment $payment ) { + $donation_id = $payment->get_source_id(); + + $donation = new Charitable_Donation( $donation_id ); + + /* Save the transation ID */ + $donation->set_gateway_transaction_id( $payment->get_transaction_id() ); + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + $donation->update_status( 'charitable-cancelled' ); + + break; + case PaymentStatus::EXPIRED: + $donation->update_status( 'charitable-failed' ); + + break; + case PaymentStatus::FAILURE: + $donation->update_status( 'charitable-failed' ); + + break; + case PaymentStatus::SUCCESS: + $donation->update_status( 'charitable-completed' ); + + break; + case PaymentStatus::OPEN: + default: + $donation->update_status( 'charitable-pending' ); + + break; + } + } + + /** + * Filter currencies. + * + * @param array $currencies Available currencies. + * + * @return mixed + */ + public function currencies( $currencies ) { + if ( ! is_array( $currencies ) ) { + return $currencies; + } + + if ( PaymentMethods::is_active( PaymentMethods::GULDEN ) ) { + $currencies['NLG'] = PaymentMethods::get_name( PaymentMethods::GULDEN ) . ' (G)'; + } + + return $currencies; + } + + /** + * Filter currency symbol. + * + * @param string $symbol Symbol. + * @param string $currency Currency. + * + * @return string + */ + public function currency_symbol( $symbol, $currency ) { + if ( 'NLG' === $currency ) { + $symbol = 'G'; + } + + return $symbol; + } + + /** + * Source column + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'Charitable', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + get_edit_post_link( $payment->source_id ), + /* translators: %s: source id */ + sprintf( __( 'Donation %s', 'pronamic_ideal' ), $payment->source_id ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'Charitable Donation', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return null|string + */ + public function source_url( $url, Payment $payment ) { + return get_edit_post_link( $payment->source_id ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Gateway.php new file mode 100644 index 00000000..f65afd96 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/Gateway.php @@ -0,0 +1,203 @@ +name = __( 'Pronamic', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'Pronamic', 'pronamic_ideal' ), + ); + + // @link https://github.com/Charitable/Charitable/blob/1.4.5/includes/gateways/class-charitable-gateway-paypal.php#L41-L44 + $this->supports = array( + '1.3.0', + ); + } + + /** + * Register gateway settings. + * + * @param array $settings + * + * @return array + * @since 1.0.0 + */ + public function gateway_settings( $settings ) { + $settings['config_id'] = array( + 'type' => 'select', + 'title' => __( 'Configuration', 'pronamic_ideal' ), + 'priority' => 8, + 'options' => Plugin::get_config_select_options( $this->payment_method ), + 'default' => get_option( 'pronamic_pay_config_id' ), + ); + + $settings['transaction_description'] = array( + 'type' => 'text', + 'title' => __( 'Transaction description', 'pronamic_ideal' ), + 'priority' => 8, + 'default' => __( 'Charitable donation {donation_id}', 'pronamic_ideal' ), + /* translators: %s: {tag} */ + 'help' => sprintf( __( 'Available tags: %s', 'pronamic_ideal' ), sprintf( '%s', '{donation_id}' ) ), + ); + + if ( null === $this->payment_method ) { + $settings['gateway_info'] = array( + 'type' => 'content', + 'title' => '', + 'priority' => 8, + 'content' => sprintf( '

    %s

    ', __( "This payment method does not use a predefined payment method for the payment. Some payment providers list all activated payment methods for your account to choose from. Use payment method specific gateways (such as 'iDEAL') to let customers choose their desired payment method at checkout.", 'pronamic_ideal' ) ), + ); + } + + return $settings; + } + + /** + * Process donation. + * + * @since 1.1.1 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Process donation. + * + * @since 1.0.0 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * @param Charitable_Gateway $charitable_gateway Charitable gateway. + * + * @return bool|array + */ + public static function pronamic_process_donation( $return, $donation_id, Charitable_Donation_Processor $processor, Charitable_Gateway $charitable_gateway ) { + $payment_method = $charitable_gateway->payment_method; + + $config_id = $charitable_gateway->get_value( 'config_id' ); + + // Use default gateway if no configuration has been set. + if ( '' === $config_id ) { + $config_id = \get_option( 'pronamic_pay_config_id' ); + } + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return false; + } + + // Data. + $user_data = $processor->get_donation_data_value( 'user' ); + + $gateway->set_payment_method( $payment_method ); + + /** + * Build payment. + */ + $payment = new Payment(); + + $payment->source = 'charitable'; + $payment->source_id = \strval( $donation_id ); + $payment->order_id = \strval( $donation_id ); + + // Description. + $payment->description = CharitableHelper::get_description( $charitable_gateway, $donation_id ); + + $payment->title = CharitableHelper::get_title( $donation_id ); + + // Customer. + $payment->set_customer( CharitableHelper::get_customer_from_user_data( $user_data ) ); + + // Address. + $payment->set_billing_address( CharitableHelper::get_address_from_user_data( $user_data ) ); + + // Currency. + $currency = Currency::get_instance( \charitable_get_currency() ); + + // Amount. + $payment->set_total_amount( new TaxedMoney( CharitableHelper::get_total_amount_value( $donation_id ), $currency ) ); + + // Method. + $payment->method = $payment_method; + + // Configuration. + $payment->config_id = $config_id; + + try { + $payment = Plugin::start_payment( $payment ); + + $error = $gateway->get_error(); + + if ( is_wp_error( $error ) ) { + throw new \Exception( $error->get_error_message() ); + } + } catch ( \Exception $e ) { + charitable_get_notices()->add_error( Plugin::get_default_error_message() ); + charitable_get_notices()->add_error( $e->getMessage() ); + + return false; + } + + return array( + 'redirect' => $payment->get_pay_redirect_url(), + 'safe' => false, + ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/GuldenGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/GuldenGateway.php new file mode 100644 index 00000000..6d8164c5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/GuldenGateway.php @@ -0,0 +1,67 @@ +name = PaymentMethods::get_name( PaymentMethods::GULDEN ); + + $this->defaults = array( + 'label' => PaymentMethods::get_name( PaymentMethods::GULDEN ), + ); + + $this->payment_method = PaymentMethods::GULDEN; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/IDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/IDealGateway.php new file mode 100644 index 00000000..337950c9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/IDealGateway.php @@ -0,0 +1,127 @@ +name = __( 'iDEAL', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'iDEAL', 'pronamic_ideal' ), + ); + + $this->payment_method = PaymentMethods::IDEAL; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Form gateway fields. + * + * @see https://github.com/Charitable/Charitable/blob/1.4.5/includes/donations/class-charitable-donation-form.php#L387 + * @since 1.0.2 + * + * @param array $fields Fields. + * @param Charitable_Gateway $gateway Gateway. + * + * @return array + */ + public static function form_gateway_fields( $fields, $gateway ) { + if ( get_class() !== get_class( $gateway ) ) { + return $fields; + } + + $payment_method = $gateway->payment_method; + + $config_id = $gateway->get_value( 'config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( $gateway ) { + $gateway->set_payment_method( $payment_method ); + + $fields['pronamic-pay-input-html'] = array( + 'type' => '', + 'gateway' => $gateway, + ); + } + + return $fields; + } + + /** + * Form gateway field template. + * + * @see https://github.com/Charitable/Charitable/blob/1.4.5/includes/abstracts/class-charitable-form.php#L231-L232 + * @since 1.0.2 + * + * @param false|Charitable_Template $template False by default. + * @param array $field Field definition. + * @param Charitable_Form $form The Charitable_Form object. + * @param int $index The current index. + * + * @return string + */ + public static function form_field_template( $template, $field, $form, $index ) { + if ( 'pronamic-pay-input-html' === $field['key'] ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $field['gateway']->get_input_html(); + + return; + } + + return $template; + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/SofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/SofortGateway.php new file mode 100644 index 00000000..f38e98f1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/charitable/src/SofortGateway.php @@ -0,0 +1,67 @@ +name = __( 'SOFORT Banking', 'pronamic_ideal' ); + + $this->defaults = array( + 'label' => __( 'SOFORT Banking', 'pronamic_ideal' ), + ); + + $this->payment_method = PaymentMethods::SOFORT; + } + + /** + * Process donation. + * + * @since 1.0.2 + * + * @param bool|array $return Return. + * @param int $donation_id Donation ID. + * @param Charitable_Donation_Processor $processor Charitable donation processor. + * + * @return bool|array + */ + public static function process_donation( $return, $donation_id, $processor ) { + return self::pronamic_process_donation( $return, $donation_id, $processor, new self() ); + } + + /** + * Returns the current gateway's ID. + * + * @return string + * @access public + * @static + * @since 1.0.3 + */ + public static function get_gateway_id() { + return self::ID; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/dist/payment-form-processor.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/dist/payment-form-processor.js new file mode 100644 index 00000000..e4940d12 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/dist/payment-form-processor.js @@ -0,0 +1,12 @@ +"use strict"; + +document.addEventListener('wpcf7submit', function (event) { + var detail = event.detail; + + if ('pronamic_pay_redirect' !== detail.status) { + return; + } + + window.location.href = detail.apiResponse.pronamic_pay_redirect_url; +}); +//# sourceMappingURL=payment-form-processor.js.map \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/dist/payment-form-processor.js.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/dist/payment-form-processor.js.map new file mode 100644 index 00000000..5157172e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/dist/payment-form-processor.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/payment-form-processor.js"],"names":["document","addEventListener","event","detail","status","window","location","href","apiResponse","pronamic_pay_redirect_url"],"mappings":";;AAAAA,QAAQ,CAACC,gBAAT,CAA2B,aAA3B,EAA0C,UAAEC,KAAF,EAAa;AACtD,MAAIC,MAAM,GAAGD,KAAK,CAACC,MAAnB;;AAEA,MAAK,4BAA4BA,MAAM,CAACC,MAAxC,EAAiD;AAChD;AACA;;AAEDC,EAAAA,MAAM,CAACC,QAAP,CAAgBC,IAAhB,GAAuBJ,MAAM,CAACK,WAAP,CAAmBC,yBAA1C;AACA,CARD","sourcesContent":["document.addEventListener( 'wpcf7submit', ( event ) => {\n\tlet detail = event.detail;\n\n\tif ( 'pronamic_pay_redirect' !== detail.status ) {\n\t\treturn;\n\t}\n\n\twindow.location.href = detail.apiResponse.pronamic_pay_redirect_url;\n} );\n"],"file":"payment-form-processor.js"} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/src/payment-form-processor.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/src/payment-form-processor.js new file mode 100644 index 00000000..970ce85b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/js/src/payment-form-processor.js @@ -0,0 +1,9 @@ +document.addEventListener( 'wpcf7submit', ( event ) => { + let detail = event.detail; + + if ( 'pronamic_pay_redirect' !== detail.status ) { + return; + } + + window.location.href = detail.apiResponse.pronamic_pay_redirect_url; +} ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/pronamic-pay-contact-form-7.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/pronamic-pay-contact-form-7.php new file mode 100644 index 00000000..c5062c95 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/pronamic-pay-contact-form-7.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +add_filter( + 'pronamic_pay_plugin_integrations', + function ( $integrations ) { + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\ContactForm7\Extension(); + + return $integrations; + } +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/readme.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/readme.txt new file mode 100644 index 00000000..f58998fb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/readme.txt @@ -0,0 +1,9 @@ +=== Pronamic Pay Contact Form 7 Add-On === +Contributors: pronamic, remcotolsma +Tags: pronamic, pay, contact-form-7, add-on +Requires at least: 5.2 +Tested up to: 5.4 +Requires PHP: 5.6 +Stable tag: 1.0.1 + +Extend the Pronamic Pay plugin with Contact Form 7 support to receive payments through a variety of payment providers. diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/ContactForm7Dependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/ContactForm7Dependency.php new file mode 100644 index 00000000..47490471 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/ContactForm7Dependency.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\ContactForm7 + */ + +namespace Pronamic\WordPress\Pay\Extensions\ContactForm7; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Contact Form 7 Dependency + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class ContactForm7Dependency extends Dependency { + /** + * Is met. + * + * @link + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + return \defined( '\WPCF7_VERSION' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Extension.php new file mode 100644 index 00000000..f4a6b4ed --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Extension.php @@ -0,0 +1,267 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\ContactForm7 + */ + +namespace Pronamic\WordPress\Pay\Extensions\ContactForm7; + +use GFUserData; +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use WPCF7_ContactForm; +use WPCF7_Submission; + +/** + * Title: WordPress pay extension Contact Form 7 extension + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class Extension extends AbstractPluginIntegration { + /** + * Slug + * + * @var string + */ + const SLUG = 'contact-form-7'; + + /** + * Feedback response args. + * + * @var array + */ + private $feedback_args; + + /** + * Construct Contact Form 7 plugin integration. + */ + public function __construct() { + parent::__construct( + array( + 'name' => __( 'Contact Form 7', 'pronamic_ideal' ), + 'version' => '1.0.0', + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new ContactForm7Dependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + \add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + \add_filter( 'pronamic_subscription_source_description_' . self::SLUG, array( $this, 'subscription_source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + \add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + \add_filter( 'pronamic_subscription_source_text_' . self::SLUG, array( $this, 'subscription_source_text' ), 10, 2 ); + + // Actions. + \add_action( 'wpcf7_init', array( $this, 'init' ) ); + } + + /** + * Initialize + */ + public function init() { + // Actions. + \add_action( 'wpcf7_before_send_mail', array( $this, 'before_send_mail' ), 10, 3 ); + \add_action( 'wpcf7_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + \add_action( 'wpcf7_mail_sent', array( $this, 'wpcf7_disabled_scripts_redirect' ) ); + \add_action( 'wpcf7_mail_failed', array( $this, 'wpcf7_disabled_scripts_redirect' ) ); + + // Filters. + \add_filter( 'pronamic_pay_subscription_amount_editable_' . self::SLUG, '__return_true' ); + + $this->register_tags(); + } + + /** + * Register tags. + */ + public function register_tags() { + // Amount tag. + new Tags\AmountTag(); + + // Payment method tag. + new Tags\PaymentMethodTag(); + + // Issuer tag. + new Tags\IssuerTag(); + } + + /** + * Handle submit, before sending mail. + * + * @param WPCF7_ContactForm $form Contact Form 7 form. + * @param bool $abort Whether or not to abort submission. + * @param WPCF7_Submission $submission Form submission. + * @return void + */ + public function before_send_mail( WPCF7_ContactForm $form, &$abort, WPCF7_Submission $submission ) { + // Get gateway. + $config_id = \get_option( 'pronamic_pay_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + // Start payment. + $payment = Pronamic::get_submission_payment( $submission ); + + // Return on invalid payment. + if ( null === $payment ) { + return; + } + + $payment->config_id = $config_id; + + $error = null; + + try { + $payment = Plugin::start_payment( $payment ); + + $this->feedback_args = array( + 'status' => 'pronamic_pay_redirect', + 'message' => __( 'Please wait while redirecting for payment', 'pronamic_ideal' ), + 'pronamic_pay_redirect_url' => $payment->get_pay_redirect_url(), + ); + } catch ( \Exception $e ) { + $this->feedback_args = array( + 'status' => 'pronamic_pay_error', + 'message' => sprintf( + '%s
    %s', + Plugin::get_default_error_message(), + $e->getMessage() + ), + ); + + $abort = true; + } + + \add_filter( 'wpcf7_ajax_json_echo', array( $this, 'feedback_response' ), 10, 2 ); + } + + /** + * Redirect when loading Contact Form 7 scripts has been disabled. + */ + public function wpcf7_disabled_scripts_redirect() { + if ( ! \has_filter( 'wpcf7_load_js' ) ) { + return; + } + + $load_js = \apply_filters( 'wpcf7_load_js', true ); + + if ( false !== $load_js ) { + return; + } + + $feedback_args = $this->feedback_args; + + if ( ! \array_key_exists( 'pronamic_pay_redirect_url', $feedback_args ) ) { + return; + } + + \wp_redirect( $feedback_args['pronamic_pay_redirect_url'] ); + } + + /** + * Feedback response. + * + * @param array $response REST API feedback response. + * @param array $result Form submit result. + * + * @return array + */ + public function feedback_response( $response, $result ) { + $response = \wp_parse_args( $this->feedback_args, $response ); + + return $response; + } + + /** + * Enqueue scripts. + */ + public function enqueue_scripts() { + \wp_register_script( + 'pronamic-pay-contact-form-7', + plugins_url( 'js/dist/payment-form-processor.js', dirname( __FILE__ ) ), + array(), + $this->get_version(), + true + ); + + \wp_enqueue_script( 'pronamic-pay-contact-form-7' ); + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + return __( 'Contact Form 7', 'pronamic_ideal' ); + } + + /** + * Source description. + * + * @param string $description Description. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'Contact Form 7 Entry', 'pronamic_ideal' ); + } + + /** + * Subscription source text. + * + * @param string $text Source text. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public function subscription_source_text( $text, Subscription $subscription ) { + return __( 'Contact Form 7', 'pronamic_ideal' ); + } + + /** + * Subscription source description. + * + * @param string $description Description. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public function subscription_source_description( $description, Subscription $subscription ) { + return __( 'Contact Form 7 Entry', 'pronamic_ideal' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php new file mode 100644 index 00000000..8fef4b30 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Pronamic.php @@ -0,0 +1,254 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\ContactForm7; + +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Payments\Payment; +use WPCF7_ContactForm; +use WPCF7_FormTagsManager; +use WPCF7_Pipes; +use WPCF7_Submission; + +/** + * Pronamic + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class Pronamic { + /** + * Get default gateway. + * + * @return Gateway|null + */ + public static function get_default_gateway() { + $config_id = \get_option( 'pronamic_pay_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + return $gateway; + } + + /** + * Get submission value. + * + * @param string $type Type to search for. + * @return mixed + */ + public static function get_submission_value( $type ) { + $result = null; + + $prefixed_type = 'pronamic_pay_' . $type; + + // @link https://contactform7.com/tag-syntax/ + $tags = WPCF7_FormTagsManager::get_instance()->get_scanned_tags(); + + foreach ( $tags as $tag ) { + // Check if tag base type equals requested tag or tag has requested option. + if ( ! \in_array( $tag->basetype, array( $type, $prefixed_type ), true ) && ! $tag->has_option( $prefixed_type ) ) { + continue; + } + + $value = trim( \filter_input( \INPUT_POST, $tag->name, \FILTER_SANITIZE_STRING ) ); + + if ( 'checkbox' === $tag->basetype ) { + $value = \filter_input( \INPUT_POST, $tag->name, \FILTER_DEFAULT, \FILTER_REQUIRE_ARRAY ); + } + + // Check empty value. + if ( empty( $value ) ) { + continue; + } + + $values = (array) $value; + + // Loop values. + foreach ( $values as $value ) { + /* + * Try to get value from piped field values. + * + * @link https://contactform7.com/selectable-recipient-with-pipes/ + */ + if ( $tag->pipes instanceof WPCF7_Pipes ) { + $pipes = \array_combine( $tag->pipes->collect_afters(), $tag->pipes->collect_befores() ); + + $pipe_value = \array_search( $value, $pipes, true ); + + if ( false !== $pipe_value ) { + $value = $pipe_value; + } + } + + // Parse value. + switch ( $type ) { + case 'amount': + // Handle free text input. + if ( $tag->has_option( 'free_text' ) && end( $tag->values ) === $value ) { + $free_text_name = sprintf( '%s_free_text', $tag->name ); + + $value = trim( \filter_input( \INPUT_POST, $free_text_name, \FILTER_SANITIZE_STRING ) ); + } + + $value = Tags\AmountTag::parse_value( $value ); + + // Set parsed value as result or add to existing money result. + if ( null !== $value ) { + $result = ( null === $result ? $value : $result->add( $value ) ); + } + + break; + default: + $result = $value; + } + } + + // Prefer tag with option (`pronamic_pay_email`) over tag name match (e.g. `email`). + if ( $tag->has_option( $prefixed_type ) ) { + return $result; + } + } + + return $result; + } + + /** + * Get Pronamic payment from Contact Form 7 form. + * + * @param WPCF7_Submission $submission Contact Form 7 form submission. + * + * @return Payment + */ + public static function get_submission_payment( WPCF7_Submission $submission ) { + $form = $submission->get_contact_form(); + + $payment = new Payment(); + + $amount = self::get_submission_value( 'amount' ); + + if ( null === $amount ) { + return null; + } + + $gateway = self::get_default_gateway(); + + if ( null === $gateway ) { + return null; + } + + $unique_id = \time(); + + // Title. + $title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + sprintf( + /* translators: %s: order id */ + __( 'Contact Form 7 Entry @ %s', 'pronamic_ideal' ), + $unique_id + ) + ); + + // Description. + $description = self::get_submission_value( 'description' ); + + if ( null === $description ) { + $description = sprintf( + /* translators: %s: payment number */ + __( 'Payment %s', 'pronamic_ideal' ), + $unique_id + ); + } + + // Payment method. + $payment_method = self::get_submission_value( 'method' ); + $issuer = self::get_submission_value( 'issuer' ); + + if ( empty( $payment_method ) && ( null !== $issuer || $gateway->payment_method_is_required() ) ) { + $payment_method = PaymentMethods::IDEAL; + } + + $payment->title = $title; + $payment->description = $description; + $payment->source = 'contact-form-7'; + $payment->method = $payment_method; + $payment->issuer = $issuer; + + /* + * Totals. + */ + $payment->set_total_amount( + new TaxedMoney( + $amount->get_value() + ) + ); + + // Contact. + $contact_name = new ContactName(); + $contact_name->set_first_name( self::get_submission_value( 'first_name' ) ); + $contact_name->set_last_name( self::get_submission_value( 'last_name' ) ); + + $customer = new Customer(); + $customer->set_name( $contact_name ); + $customer->set_email( self::get_submission_value( 'email' ) ); + + $payment->set_customer( $customer ); + + /* + * Address. + */ + $address = new Address(); + + $address->set_name( $contact_name ); + + $billing_address = clone $address; + $shipping_address = clone $address; + + $address_fields = array( + 'line_1', + 'line_2', + 'city', + 'region', + 'postal_code', + 'country_code', + 'company_name', + 'coc_number', + ); + + foreach ( $address_fields as $field ) { + $billing_value = self::get_submission_value( 'billing_address_' . $field ); + $shipping_value = self::get_submission_value( 'shipping_address_' . $field ); + $address_value = self::get_submission_value( 'address_' . $field ); + + if ( ! empty( $billing_value ) || ! empty( $address_value ) ) { + call_user_func( array( $billing_address, 'set_' . $field ), empty( $billing_value ) ? $address_value : $billing_value ); + } + + if ( ! empty( $shipping_value ) || ! empty( $address_value ) ) { + call_user_func( array( $shipping_address, 'set_' . $field ), empty( $shipping_value ) ? $address_value : $shipping_value ); + } + } + + $payment->set_billing_address( $billing_address ); + $payment->set_shipping_address( $shipping_address ); + + /* + * Return. + */ + return $payment; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php new file mode 100644 index 00000000..8de43ecf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/AmountTag.php @@ -0,0 +1,157 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Extensions\ContactForm7\Tags; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\Parser; +use function wpcf7_form_controls_class; +use function wpcf7_format_atts; +use function wpcf7_get_hangover; +use function wpcf7_get_validation_error; +use function wpcf7_support_html5; + +/** + * Amount tag. + * + * @author Reüel van der Steege + * @since 1.0.0 + * @version 1.0.0 + */ +class AmountTag { + /** + * Form tag. + */ + const TAG = 'pronamic_pay_amount'; + + /** + * Amount constructor. + */ + public function __construct() { + \wpcf7_add_form_tag( self::TAG, array( $this, 'handler' ), true ); + \wpcf7_add_form_tag( self::TAG . '*', array( $this, 'handler' ), true ); + + // Filters. + \add_filter( 'wpcf7_validate_' . self::TAG, array( $this, 'validate' ), 10, 2 ); + \add_filter( 'wpcf7_validate_' . self::TAG . '*', array( $this, 'validate' ), 10, 2 ); + \add_filter( 'wpcf7_messages', array( $this, 'messages' ) ); + } + + /** + * Form tag handler. + * + * @param object $tag Form tag. + * + * @return string + */ + public function handler( $tag ) { + if ( empty( $tag->name ) ) { + return ''; + } + + $error = wpcf7_get_validation_error( $tag->name ); + + $class = wpcf7_form_controls_class( $tag->type, 'wpcf7-text' ); + + if ( $error ) { + $class .= ' wpcf7-not-valid'; + } + + $value = (string) reset( $tag->values ); + + $attributes = array( + 'class' => $tag->get_class_option( $class ), + 'id' => $tag->get_id_option(), + 'name' => $tag->name, + 'size' => $tag->get_size_option( '8' ), + 'tabindex' => $tag->get_option( 'tabindex', 'signed_int', true ), + 'type' => 'text', + 'value' => wpcf7_get_hangover( $tag->name, $tag->get_default_option( $value ) ), + ); + + if ( $tag->has_option( 'readonly' ) ) { + $attributes['readonly'] = 'readonly'; + } + + $html = \sprintf( + '%3$s', + \sanitize_html_class( $tag->name ), + wpcf7_format_atts( $attributes ), + $error + ); + + return $html; + } + + /** + * Parse value. + * + * @param string $value Value to parse. + * @return Money|null + */ + public static function parse_value( $value ) { + $parser = new Parser(); + + try { + $amount = $parser->parse( $value ); + } catch ( \Exception $e ) { + return null; + } + + return $amount; + } + + /** + * Validate field input. + * + * @param object $result Validation result. + * @param object $tag Form tag. + * + * @return object + */ + public function validate( $result, $tag ) { + $value = trim( \filter_input( \INPUT_POST, $tag->name, \FILTER_SANITIZE_STRING ) ); + + // Check required. + if ( $tag->is_required() && empty( $value ) ) { + $result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) ); + + return $result; + } + + // Parse input. + $amount = self::parse_value( $value ); + + if ( null === $amount ) { + $result->invalidate( $tag, wpcf7_get_message( 'invalid_pronamic_pay_amount' ) ); + } + + return $result; + } + + /** + * Contact Form 7 messages. + * + * @param array $messages Messages. + * + * @return array + */ + public function messages( $messages ) { + return array_merge( + $messages, + array( + 'invalid_pronamic_pay_amount' => array( + 'description' => __( 'Input amount is invalid.', 'pronamic_ideal' ), + 'default' => __( 'The input amount is invalid.', 'pronamic_ideal' ), + ), + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php new file mode 100644 index 00000000..74f25670 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/IssuerTag.php @@ -0,0 +1,179 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Extensions\ContactForm7\Tags; + +use Pronamic\WordPress\Pay\Extensions\ContactForm7\Pronamic; +use function wpcf7_form_controls_class; +use function wpcf7_format_atts; +use function wpcf7_get_hangover; +use function wpcf7_get_validation_error; +use function wpcf7_support_html5; + +/** + * Issuer tag. + * + * @author Reüel van der Steege + * @since 1.0.0 + * @version 1.0.0 + */ +class IssuerTag { + /** + * Form tag. + */ + const TAG = 'pronamic_pay_issuer'; + + /** + * Issuer tag constructor. + */ + public function __construct() { + \wpcf7_add_form_tag( self::TAG, array( $this, 'handler' ), true ); + \wpcf7_add_form_tag( self::TAG . '*', array( $this, 'handler' ), true ); + + // Filters. + \add_filter( 'wpcf7_validate_' . self::TAG, array( $this, 'validate' ), 10, 2 ); + \add_filter( 'wpcf7_validate_' . self::TAG . '*', array( $this, 'validate' ), 10, 2 ); + + // Actions. + \add_action( 'wpcf7_admin_init', array( $this, 'add_tag_generator' ), 60 ); + } + + /** + * Form tag handler. + * + * @param object $tag Form tag. + * + * @return string + */ + public function handler( $tag ) { + if ( empty( $tag->name ) ) { + return ''; + } + + // Get gateway. + $gateway = Pronamic::get_default_gateway(); + + if ( null === $gateway ) { + return ''; + } + + $error = wpcf7_get_validation_error( $tag->name ); + + $class = wpcf7_form_controls_class( $tag->type, 'wpcf7-select' ); + + if ( $error ) { + $class .= ' wpcf7-not-valid'; + } + + $value = (string) reset( $tag->values ); + + $attributes = array( + 'class' => $tag->get_class_option( $class ), + 'id' => $tag->get_id_option(), + 'name' => $tag->name, + 'tabindex' => $tag->get_option( 'tabindex', 'signed_int', true ), + 'value' => wpcf7_get_hangover( $tag->name, $tag->get_default_option( $value ) ), + ); + + if ( $tag->has_option( 'readonly' ) ) { + $attributes['readonly'] = 'readonly'; + } + + // Payment method options. + $issuer_options = $gateway->get_transient_issuers(); + + if ( null === $issuer_options ) { + return ''; + } + + $options = array( + '', + ); + + foreach ( $issuer_options[0]['options'] as $value => $label ) { + $options[] = sprintf( + '', + \esc_attr( $value ), + selected( $attributes['value'], $value, false ), + \esc_html( $label ) + ); + } + + $html = \sprintf( + '%4$s', + \sanitize_html_class( $tag->name ), + wpcf7_format_atts( $attributes ), + implode( '', $options ), + $error + ); + + return $html; + } + + /** + * Get value. + * + * @param string $name Field name. + * + * @return string|null + */ + public static function get_value( $name ) { + $value = trim( \filter_input( \INPUT_POST, $name, \FILTER_SANITIZE_STRING ) ); + + if ( empty( $value ) ) { + return null; + } + + return $value; + } + + /** + * Validate field input. + * + * @param object $result Validation result. + * @param object $tag Form tag. + * + * @return object + */ + public function validate( $result, $tag ) { + $value = trim( \filter_input( \INPUT_POST, $tag->name, \FILTER_SANITIZE_STRING ) ); + + // Check required. + if ( $tag->is_required() && empty( $value ) ) { + $result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) ); + + return $result; + } + + return $result; + } + + /** + * Add tag generator. + * + * @return void + */ + public function add_tag_generator() { + $tag_generator = \WPCF7_TagGenerator::get_instance(); + + $tag_generator->add( self::TAG, __( 'Issuer', 'pronamic_ideal' ), array( $this, 'tag_generator' ) ); + } + + /** + * Tag generator. + * + * @param \WPCF7_ContactForm $form Contact form. + * @param array $args Arguments. + * @return void + */ + public function tag_generator( $form, $args ) { + require dirname( __FILE__ ) . '/../../views/issuer-tag-generator.php'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php new file mode 100644 index 00000000..32af8d8f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/src/Tags/PaymentMethodTag.php @@ -0,0 +1,222 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Extensions\ContactForm7\Tags; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\ContactForm7\Pronamic; +use function wpcf7_form_controls_class; +use function wpcf7_format_atts; +use function wpcf7_get_hangover; +use function wpcf7_get_validation_error; +use function wpcf7_support_html5; + +/** + * Payment method tag. + * + * @author Reüel van der Steege + * @since 1.0.0 + * @version 1.0.0 + */ +class PaymentMethodTag { + /** + * Form tag. + */ + const TAG = 'pronamic_pay_method'; + + /** + * Payment method tag constructor. + */ + public function __construct() { + \wpcf7_add_form_tag( self::TAG, array( $this, 'handler' ), true ); + \wpcf7_add_form_tag( self::TAG . '*', array( $this, 'handler' ), true ); + + // Filters. + \add_filter( 'wpcf7_validate_' . self::TAG, array( $this, 'validate' ), 10, 2 ); + \add_filter( 'wpcf7_validate_' . self::TAG . '*', array( $this, 'validate' ), 10, 2 ); + \add_filter( 'wpcf7_messages', array( $this, 'messages' ) ); + + // Actions. + \add_action( 'wpcf7_admin_init', array( $this, 'add_tag_generator' ), 60 ); + } + + /** + * Form tag handler. + * + * @param object $tag Form tag. + * + * @return string + */ + public function handler( $tag ) { + if ( empty( $tag->name ) ) { + return ''; + } + + // Get gateway. + $gateway = Pronamic::get_default_gateway(); + + if ( null === $gateway ) { + return ''; + } + + $error = wpcf7_get_validation_error( $tag->name ); + + $class = wpcf7_form_controls_class( $tag->type, 'wpcf7-select' ); + + if ( $error ) { + $class .= ' wpcf7-not-valid'; + } + + $value = (string) reset( $tag->values ); + + $attributes = array( + 'class' => $tag->get_class_option( $class ), + 'id' => $tag->get_id_option(), + 'name' => $tag->name, + 'tabindex' => $tag->get_option( 'tabindex', 'signed_int', true ), + 'value' => wpcf7_get_hangover( $tag->name, $tag->get_default_option( $value ) ), + ); + + if ( $tag->has_option( 'readonly' ) ) { + $attributes['readonly'] = 'readonly'; + } + + // Payment method options. + $method_options = $gateway->get_payment_method_field_options(); + + $options = array(); + + /* + * Search payment method values in tag pipes. + * + * @link https://contactform7.com/selectable-recipient-with-pipes/ + */ + $pipes = array(); + + if ( $tag->pipes instanceof \WPCF7_Pipes ) { + $pipes = \array_combine( $tag->pipes->collect_afters(), $tag->pipes->collect_befores() ); + } + + foreach ( $method_options as $value => $label ) { + if ( PaymentMethods::is_direct_debit_method( $value ) ) { + continue; + } + + if ( ! empty( $tag->values ) && ! \array_key_exists( $value, $pipes ) ) { + continue; + } + + $options[] = sprintf( + '', + \esc_attr( $value ), + selected( $attributes['value'], $value, false ), + \esc_html( $label ) + ); + } + + $html = \sprintf( + '%4$s', + \sanitize_html_class( $tag->name ), + wpcf7_format_atts( $attributes ), + implode( '', $options ), + $error + ); + + return $html; + } + + /** + * Get value. + * + * @param string $name Field name. + * + * @return string|null + */ + public static function get_value( $name ) { + $value = trim( \filter_input( \INPUT_POST, $name, \FILTER_SANITIZE_STRING ) ); + + if ( empty( $value ) ) { + return null; + } + + return $value; + } + + /** + * Validate field input. + * + * @param object $result Validation result. + * @param object $tag Form tag. + * + * @return object + */ + public function validate( $result, $tag ) { + $value = trim( \filter_input( \INPUT_POST, $tag->name, \FILTER_SANITIZE_STRING ) ); + + // Check required. + if ( $tag->is_required() && empty( $value ) ) { + $result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) ); + + return $result; + } + + // Check if gateway requires payment method. + $gateway = Pronamic::get_default_gateway(); + + if ( null !== $gateway && $gateway->payment_method_is_required() && empty( $value ) ) { + $result->invalidate( $tag, wpcf7_get_message( 'invalid_pronamic_pay_method_required' ) ); + + return $result; + } + + return $result; + } + + /** + * Contact Form 7 messages. + * + * @param array $messages Messages. + * + * @return array + */ + public function messages( $messages ) { + return array_merge( + $messages, + array( + 'invalid_pronamic_pay_method_required' => array( + 'description' => __( 'Payment method required.', 'pronamic_ideal' ), + 'default' => __( 'The payment method is invalid.', 'pronamic_ideal' ), + ), + ) + ); + } + + /** + * Add tag generator. + * + * @return void + */ + public function add_tag_generator() { + $tag_generator = \WPCF7_TagGenerator::get_instance(); + + $tag_generator->add( self::TAG, __( 'Payment method', 'pronamic_ideal' ), array( $this, 'tag_generator' ) ); + } + + /** + * Tag generator. + * + * @param \WPCF7_ContactForm $form Contact form. + * @param array $args Arguments. + * @return void + */ + public function tag_generator( $form, $args ) { + require dirname( __FILE__ ) . '/../../views/payment-method-tag-generator.php'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php new file mode 100644 index 00000000..21a85b76 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/views/issuer-tag-generator.php @@ -0,0 +1,111 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\ContactForm7 + */ + +$args = wp_parse_args( $args, array() ); + +/* translators: 1: Pronamic Pay plugin name, 2: documentation URL anchor */ +$description = __( 'Generate a tag for an issuer field. %1$s requires a field with the `pronamic_pay_amount` option, but payment method and issuer fields are optional in most cases. For step-by-step instructions on receiving payments with Contact Form 7, please see %2$s.', 'pronamic_ideal' ); + +$desc_link = wpcf7_link( __( 'https://www.pronamic.eu/support/how-to-connect-contact-form-7-to-pronamic-pay/', 'pronamic_ideal' ), __( 'How to connect Contact Form 7 to Pronamic Pay', 'pronamic_ideal' ) ); + +?> +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + + +
    +
    + + + +
    + + + +
    + + + +
    +
    +
    + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php new file mode 100644 index 00000000..b6059a4b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/contact-form-7/views/payment-method-tag-generator.php @@ -0,0 +1,155 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\ContactForm7 + */ + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\ContactForm7\Pronamic; + +$args = wp_parse_args( $args, array() ); + +/* translators: 1: Pronamic Pay plugin name, 2: documentation URL anchor */ +$description = __( 'Generate a tag for a payment method field. %1$s requires a field with the `pronamic_pay_amount` option, but payment method and issuer fields are optional in most cases. For step-by-step instructions on receiving payments with Contact Form 7, please see %2$s.', 'pronamic_ideal' ); + +$desc_link = wpcf7_link( __( 'https://www.pronamic.eu/support/how-to-connect-contact-form-7-to-pronamic-pay/', 'pronamic_ideal' ), __( 'How to connect Contact Form 7 to Pronamic Pay', 'pronamic_ideal' ) ); + +?> +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + + +
    +
    + + + +
    + + +
    + + + + + get_payment_method_field_options(); + + foreach ( $method_options as $value => $label ) { + if ( PaymentMethods::is_direct_debit_method( $value ) ) { + continue; + } + + ?> + +
    + + +
    +
    + + + +
    + + + +
    +
    +
    + +
    + + +
    + +
    + +
    + +

    + +

    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloads.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloads.php new file mode 100644 index 00000000..c5610ee6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloads.php @@ -0,0 +1,218 @@ + $payment_id, + 'post_type' => 'download', + 'page' => 'edd-payment-history', + 'view' => 'view-order-details', + ), + admin_url( 'edit.php' ) + ); + } + + /** + * Get download category. + * + * @param int $post_id Post ID. + * @return string|null + */ + public static function get_download_category( $post_id ) { + /* + * Yoast SEO primary term support. + * @link https://github.com/Yoast/wordpress-seo/blob/8.4/inc/wpseo-functions.php#L62-L81 + */ + if ( function_exists( 'yoast_get_primary_term' ) ) { + $name = yoast_get_primary_term( 'download_category', $post_id ); + + return empty( $name ) ? null : $name; + } + + /* + * WordPress core. + * @link https://developer.wordpress.org/reference/functions/wp_get_post_terms/ + */ + $term_names = wp_get_post_terms( + $post_id, + 'download_category', + array( + 'fields' => 'names', + 'orderby' => 'count', + 'order' => 'DESC', + ) + ); + + if ( $term_names instanceof WP_Error ) { + return null; + } + + $term_name = reset( $term_names ); + + if ( false === $term_name ) { + return null; + } + + return $term_name; + } + + /** + * Get payment number. + * + * @param int $payment_id Payment ID. + * @return string + */ + public static function get_payment_number( $payment_id ) { + /* + * Check if the 'edd_get_payment_number' function exists, it was added in Easy Digital Downloads version 2.0. + * + * @since 1.2.0 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.4.3/includes/payments/functions.php#L1178-L1204 + */ + if ( function_exists( 'edd_get_payment_number' ) ) { + return edd_get_payment_number( $payment_id ); + } + + return $payment_id; + } + + /** + * Get description. + * + * @param string $description Description. + * @param int $payment_id Payment ID. + * @param array $purchase_data Purchase data. + * + * @return string + */ + public static function get_description( $description, $payment_id, $purchase_data ) { + if ( empty( $description ) ) { + $description = '{edd_cart_details_name}'; + } + + // Name. + $edd_cart_details_name = ''; + + if ( is_array( $purchase_data['cart_details'] ) ) { + $names = wp_list_pluck( $purchase_data['cart_details'], 'name' ); + + $edd_cart_details_name = implode( ', ', $names ); + } + + // Replacements. + $replacements = array( + '{edd_cart_details_name}' => $edd_cart_details_name, + '{edd_payment_id}' => $payment_id, + '{edd_payment_number}' => self::get_payment_number( $payment_id ), + ); + + // Replace. + $description = strtr( $description, $replacements ); + + return $description; + } + + /** + * Get page URL by option. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.8/includes/admin/settings/register-settings.php#L16-L30 + * @param string $key Option key, for example: 'failure_page' or 'success_page'. + * @return string + */ + public static function get_option_page_url( $key ) { + $post_id = edd_get_option( $key ); + + if ( empty( $post_id ) ) { + return home_url( '/' ); + } + + if ( 'publish' !== get_post_status( $post_id ) ) { + return home_url( '/' ); + } + + $url = get_permalink( $post_id ); + + if ( false !== $url ) { + return $url; + } + + return home_url( '/' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloadsDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloadsDependency.php new file mode 100644 index 00000000..7e2b8810 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/EasyDigitalDownloadsDependency.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EasyDigitalDownloads + */ + +namespace Pronamic\WordPress\Pay\Extensions\EasyDigitalDownloads; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Easy Digital Downloads Dependency + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class EasyDigitalDownloadsDependency extends Dependency { + /** + * Is met. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.22/easy-digital-downloads.php#L209 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + return \defined( '\EDD_VERSION' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php new file mode 100644 index 00000000..e814b80c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/Extension.php @@ -0,0 +1,534 @@ + __( 'Easy Digital Downloads', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new EasyDigitalDownloadsDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_text_easydigitaldownloads', array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_easydigitaldownloads', array( $this, 'source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + /* + * Gateways + * @since 1.1.0 + */ + new Gateway( + array( + 'id' => 'pronamic_ideal', + 'admin_label' => __( 'Pronamic', 'pronamic_ideal' ), + 'checkout_label' => __( 'iDEAL', 'pronamic_ideal' ), + ) + ); + + foreach ( self::get_payment_methods() as $id => $payment_method ) { + new Gateway( + array( + 'id' => $id, + 'checkout_label' => PaymentMethods::get_name( $payment_method ), + 'payment_method' => $payment_method, + ) + ); + } + + add_filter( 'pronamic_payment_source_url_easydigitaldownloads', array( $this, 'source_url' ), 10, 2 ); + add_filter( 'pronamic_payment_redirect_url_easydigitaldownloads', array( __CLASS__, 'redirect_url' ), 10, 2 ); + add_action( 'pronamic_payment_status_update_easydigitaldownloads', array( __CLASS__, 'status_update' ), 10, 1 ); + + // Maybe empty cart for completed payment when handling returns. + add_action( 'save_post_pronamic_payment', array( __CLASS__, 'maybe_empty_cart' ), 10, 1 ); + + // Icons. + add_filter( 'edd_accepted_payment_icons', array( __CLASS__, 'accepted_payment_icons' ) ); + + // Currencies. + add_filter( 'edd_currencies', array( __CLASS__, 'currencies' ), 10, 1 ); + add_filter( 'edd_currency_symbol', array( __CLASS__, 'currency_symbol' ), 10, 2 ); + add_filter( 'edd_nlg_currency_filter_before', array( __CLASS__, 'currency_filter_before' ), 10, 3 ); + add_filter( 'edd_nlg_currency_filter_after', array( __CLASS__, 'currency_filter_after' ), 10, 3 ); + + // Statuses. + add_filter( 'edd_payment_statuses', array( __CLASS__, 'edd_payment_statuses' ) ); + add_filter( 'edd_payments_table_views', array( $this, 'payments_table_views' ) ); + + $this->register_cancelled_post_status(); + } + + /** + * Get payment methods. + * + * @return array + */ + private static function get_payment_methods() { + $default = array( + 'pronamic_pay_mister_cash' => PaymentMethods::BANCONTACT, + 'pronamic_pay_bank_transfer' => PaymentMethods::BANK_TRANSFER, + 'pronamic_pay_bitcoin' => PaymentMethods::BITCOIN, + 'pronamic_pay_credit_card' => PaymentMethods::CREDIT_CARD, + 'pronamic_pay_direct_debit' => PaymentMethods::DIRECT_DEBIT, + 'pronamic_pay_direct_debit_ideal' => PaymentMethods::DIRECT_DEBIT_IDEAL, + 'pronamic_pay_ideal' => PaymentMethods::IDEAL, + 'pronamic_pay_sofort' => PaymentMethods::SOFORT, + ); + + $optional = array( + 'pronamic_pay_afterpay' => PaymentMethods::AFTERPAY, + 'pronamic_pay_alipay' => PaymentMethods::ALIPAY, + 'pronamic_pay_belfius' => PaymentMethods::BELFIUS, + 'pronamic_pay_billink' => PaymentMethods::BILLINK, + 'pronamic_pay_bunq' => PaymentMethods::BUNQ, + 'pronamic_pay_capayable' => PaymentMethods::CAPAYABLE, + 'pronamic_pay_direct_debit_bancontact' => PaymentMethods::DIRECT_DEBIT_BANCONTACT, + 'pronamic_pay_direct_debit_ideal' => PaymentMethods::DIRECT_DEBIT_IDEAL, + 'pronamic_pay_direct_debit_sofort' => PaymentMethods::DIRECT_DEBIT_SOFORT, + 'pronamic_pay_focum' => PaymentMethods::FOCUM, + 'pronamic_pay_giropay' => PaymentMethods::GIROPAY, + 'pronamic_pay_gulden' => PaymentMethods::GULDEN, + 'pronamic_pay_idealqr' => PaymentMethods::IDEALQR, + 'pronamic_pay_in3' => PaymentMethods::IN3, + 'pronamic_pay_kbc' => PaymentMethods::KBC, + 'pronamic_pay_klarna_pay_later' => PaymentMethods::KLARNA_PAY_LATER, + 'pronamic_pay_maestro' => PaymentMethods::MAESTRO, + 'pronamic_pay_payconiq' => PaymentMethods::PAYCONIQ, + 'pronamic_pay_paypal' => PaymentMethods::PAYPAL, + ); + + $optional = array_filter( + $optional, + function ( $payment_method ) { + return PaymentMethods::is_active( $payment_method ); + } + ); + + $payment_methods = array_merge( $default, $optional ); + + uasort( + $payment_methods, + function ( $a, $b ) { + return strnatcasecmp( PaymentMethods::get_name( $a ), PaymentMethods::get_name( $b ) ); + } + ); + + return $payment_methods; + } + + /** + * Payment redirect URL filter. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * + * @return string + */ + public static function redirect_url( $url, $payment ) { + switch ( $payment->get_status() ) { + case Core_Statuses::CANCELLED: + case Core_Statuses::EXPIRED: + case Core_Statuses::FAILURE: + return EasyDigitalDownloads::get_option_page_url( 'failure_page' ); + + case Core_Statuses::SUCCESS: + return EasyDigitalDownloads::get_option_page_url( 'success_page' ); + + case Core_Statuses::RESERVED: + case Core_Statuses::OPEN: + return home_url( '/' ); + } + + return $url; + } + + /** + * Maybe empty cart for succesful payment. + * + * @param int $post_id Post ID. + * + * @return void + */ + public static function maybe_empty_cart( $post_id ) { + // Only empty cart when handling returns. + if ( ! Util::input_has_vars( INPUT_GET, array( 'payment', 'key' ) ) ) { + return; + } + + $payment = get_pronamic_payment( $post_id ); + + // Only empty for completed payments. + if ( ! $payment || $payment->get_status() !== Core_Statuses::SUCCESS ) { + return; + } + + edd_empty_cart(); + } + + /** + * Update the status of the specified payment + * + * @param Payment $payment Payment. + */ + public static function status_update( Payment $payment ) { + $source_id = (int) $payment->get_source_id(); + + // Only update if order is not completed. + $should_update = edd_get_payment_status( $source_id ) !== EasyDigitalDownloads::ORDER_STATUS_PUBLISH; + + // Always empty cart for completed payments. + if ( $payment->get_status() === Core_Statuses::SUCCESS ) { + edd_empty_cart(); + } + + if ( $should_update ) { + switch ( $payment->get_status() ) { + case Core_Statuses::CANCELLED: + edd_update_payment_status( $source_id, EasyDigitalDownloads::ORDER_STATUS_CANCELLED ); + + break; + case Core_Statuses::EXPIRED: + edd_update_payment_status( $source_id, EasyDigitalDownloads::ORDER_STATUS_ABANDONED ); + + break; + case Core_Statuses::FAILURE: + edd_update_payment_status( $source_id, EasyDigitalDownloads::ORDER_STATUS_FAILED ); + + break; + case Core_Statuses::RESERVED: + $note = array( + sprintf( + '%s %s.', + PaymentMethods::get_name( $payment->get_method() ), + __( 'payment reserved at gateway', 'pronamic_ideal' ) + ), + ); + + $gateway = Plugin::get_gateway( $payment->get_config_id() ); + + if ( $gateway->supports( 'reservation_payments' ) ) { + $payment_edit_link = add_query_arg( + array( + 'post' => $payment->get_id(), + 'action' => 'edit', + ), + admin_url( 'post.php' ) + ); + + $payment_link = sprintf( + '%2$s', + $payment_edit_link, + sprintf( + /* translators: %s: payment id */ + esc_html( __( 'payment #%s', 'pronamic_ideal' ) ), + $payment->get_id() + ) + ); + + $note[] = sprintf( + /* translators: %s: payment edit link */ + __( 'Create an invoice at payment gateway for %1$s after processing the order.', 'pronamic_ideal' ), + $payment_link // WPCS: xss ok. + ); + } + + $note = implode( ' ', $note ); + + edd_insert_payment_note( $source_id, $note ); + + break; + case Core_Statuses::SUCCESS: + edd_insert_payment_note( $source_id, __( 'Payment completed.', 'pronamic_ideal' ) ); + + /* + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/payments/view-order-details.php#L36 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/payments/view-order-details.php#L199-L206 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/payments/functions.php#L1312-L1332 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/gateways/paypal-standard.php#L555-L576 + */ + edd_update_payment_status( $source_id, EasyDigitalDownloads::ORDER_STATUS_PUBLISH ); + + break; + case Core_Statuses::OPEN: + edd_insert_payment_note( $source_id, __( 'Payment open.', 'pronamic_ideal' ) ); + + break; + default: + edd_insert_payment_note( $source_id, __( 'Payment unknown.', 'pronamic_ideal' ) ); + + break; + } + } + } + + /** + * Filter currencies. + * + * @param array $currencies Available currencies. + * + * @return mixed + */ + public static function currencies( $currencies ) { + if ( PaymentMethods::is_active( PaymentMethods::GULDEN ) ) { + $currencies['NLG'] = sprintf( + /* translators: %s: Gulden */ + '%s (G)', + PaymentMethods::get_name( PaymentMethods::GULDEN ) + ); + } + + return $currencies; + } + + /** + * Filter currency symbol. + * + * @param string $symbol Symbol. + * @param string $currency Currency. + * + * @return string + */ + public static function currency_symbol( $symbol, $currency ) { + if ( 'NLG' === $currency ) { + $symbol = 'G'; + } + + return $symbol; + } + + /** + * Filter currency before. + * + * @param string $formatted Formatted symbol and price. + * @param string $currency Currency. + * @param string $price Price. + * + * @return string + */ + public static function currency_filter_before( $formatted, $currency, $price ) { + if ( ! function_exists( 'edd_currency_symbol' ) ) { + return $formatted; + } + + $symbol = edd_currency_symbol( $currency ); + + switch ( $currency ) { + case 'NLG': + $formatted = $symbol . $price; + + break; + } + + return $formatted; + } + + /** + * Filter currency after. + * + * @param string $formatted Formatted symbol and price. + * @param string $currency Currency. + * @param string $price Price. + * + * @return string + */ + public static function currency_filter_after( $formatted, $currency, $price ) { + if ( ! function_exists( 'edd_currency_symbol' ) ) { + return $formatted; + } + + $symbol = edd_currency_symbol( $currency ); + + switch ( $currency ) { + case 'NLG': + $formatted = $price . $symbol; + + break; + } + + return $formatted; + } + + /** + * Source column + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string $text + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'Easy Digital Downloads', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + EasyDigitalDownloads::get_payment_url( $payment->source_id ), + /* translators: %s: payment number */ + sprintf( __( 'Payment %s', 'pronamic_ideal' ), $payment->source_id ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Description. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'Easy Digital Downloads Order', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + return EasyDigitalDownloads::get_payment_url( $payment->source_id ); + } + + /** + * Accepted payment icons + * + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.1.3/includes/admin/settings/register-settings.php#L261-L268 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.1.3/includes/checkout/template.php#L573-L609 + * + * @param array $icons Icons. + * + * @return array + */ + public static function accepted_payment_icons( $icons ) { + $payment_methods = self::get_payment_methods(); + + foreach ( $payment_methods as $id => $payment_method ) { + $icon = sprintf( + '/images/%s/icon-64x48.png', + str_replace( '_', '-', $payment_method ) + ); + + // Check if file exists. + if ( ! is_readable( plugin_dir_path( Plugin::$file ) . $icon ) ) { + continue; + } + + // Add icon URL. + $url = plugins_url( $icon, Plugin::$file ); + + $icons[ $url ] = PaymentMethods::get_name( $payment_method ); + } + + return $icons; + } + + /** + * Easy Digital Downloads payment statuses. + * + * The Easy Digital Downloads plugin is equipped with a "Set To Cancelled" bulk action. + * This bulk action will set the status of payments to 'cancelled', this is however not + * a registered payment status. Therefor we will register 'cancelled' as an payment + * status. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.20/includes/admin/payments/class-payments-table.php#L427-L517 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.20/includes/payments/functions.php#L761-L779 + * @param array $payment_statuses Easy Digital Downloads payment statuses. + * @return array + */ + public static function edd_payment_statuses( $payment_statuses ) { + if ( array_key_exists( 'cancelled', $payment_statuses ) ) { + return $payment_statuses; + } + + $payment_statuses['cancelled'] = __( 'Cancelled', 'pronamic_ideal' ); + + return $payment_statuses; + } + + /** + * Register cancelled post status. + * + * @return void + */ + private function register_cancelled_post_status() { + register_post_status( + 'cancelled', + array( + 'label' => _x( 'Cancelled', 'Easy Digital Downloads cancelled payment status', 'pronamic_ideal' ), + 'public' => true, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Cancelled (%s)', 'Cancelled (%s)', 'pronamic_ideal' ), + ) + ); + } + + /** + * Payments table views. + * + * @param array $views Payments table views. + * + * @return array + */ + public function payments_table_views( $views ) { + $count = \wp_count_posts( 'edd_payment' ); + + $views['cancelled'] = sprintf( + '%3$s (%4$s)', + add_query_arg( + array( + 'status' => 'cancelled', + 'paged' => false, + ) + ), + \filter_input( \INPUT_GET, 'status' ) === 'cancelled' ? ' class="current"' : '', + _x( 'Cancelled', 'Easy Digital Downloads cancelled payment status', 'pronamic_ideal' ), + \esc_html( $count->cancelled ) + ); + + return $views; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php new file mode 100644 index 00000000..c0445d55 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/Gateway.php @@ -0,0 +1,619 @@ + null, + 'admin_label' => null, + 'checkout_label' => null, + 'supports' => array(), + 'payment_method' => null, + ) + ); + + if ( null === $args['admin_label'] ) { + $args['admin_label'] = sprintf( + /* translators: 1: Gateway admin label prefix, 2: Gateway admin label */ + __( '%1$s - %2$s', 'pronamic_ideal' ), + __( 'Pronamic', 'pronamic_ideal' ), + $args['checkout_label'] + ); + } + + $this->id = $args['id']; + $this->admin_label = $args['admin_label']; + $this->checkout_label = $args['checkout_label']; + $this->supports = $args['supports']; + $this->payment_method = $args['payment_method']; + + // Settings. + $checkout_label = edd_get_option( $this->id . '_checkout_label' ); + if ( ! empty( $checkout_label ) ) { + $this->checkout_label = $checkout_label; + } + + // Actions. + add_action( 'edd_gateway_' . $this->id, array( $this, 'process_purchase' ) ); + + /* + * Remove CC Form + * + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/1.9.4/includes/checkout/template.php#L97 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/1.9.4/includes/gateways/paypal-standard.php#L12 + */ + add_action( 'edd_' . $this->id . '_cc_form', array( $this, 'payment_fields' ) ); + + // Filters. + add_filter( 'edd_settings_sections_gateways', array( $this, 'register_gateway_section' ) ); + add_filter( 'edd_settings_gateways', array( $this, 'settings_gateways' ) ); + add_filter( 'edd_payment_gateways', array( $this, 'payment_gateways' ) ); + + add_filter( 'edd_get_payment_transaction_id-' . $this->id, array( $this, 'get_payment_transaction_id' ) ); + } + + /** + * Add the gateway to Easy Digital Downloads + * + * @param mixed $gateways Gateways. + * + * @return mixed $gateways + */ + public function payment_gateways( $gateways ) { + $gateways[ $this->id ] = array( + 'admin_label' => $this->admin_label, + 'checkout_label' => $this->checkout_label, + 'supports' => $this->supports, + ); + + return $gateways; + } + + /** + * Register gateway section. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.8.17/includes/admin/settings/register-settings.php#L1272-L1275 + * + * @param array $gateway_sections Gateway sections. + * + * @return array + */ + public function register_gateway_section( $gateway_sections ) { + $gateway_sections[ $this->id ] = $this->admin_label; + + return $gateway_sections; + } + + /** + * Add the iDEAL configuration settings to the Easy Digital Downloads payment gateways settings page. + * + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/settings/register-settings.php#L126 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.8.17/includes/admin/settings/register-settings.php#L408-L409 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.8.17/includes/gateways/amazon-payments.php#L344-L424 + * + * @param mixed $settings_gateways Gateway settings. + * + * @return mixed $settings_gateways + */ + public function settings_gateways( $settings_gateways ) { + $settings = array( + $this->id => array( + 'id' => $this->id, + /* translators: %s: admin label */ + 'name' => '' . sprintf( __( '%s Settings', 'pronamic_ideal' ), $this->admin_label ) . '', + /* translators: %s: gateway admin label */ + 'desc' => sprintf( __( 'Configure the %s settings', 'pronamic_ideal' ), $this->admin_label ), + 'type' => 'header', + ), + $this->id . '_config_id' => array( + 'id' => $this->id . '_config_id', + 'name' => __( 'Gateway Configuration', 'pronamic_ideal' ), + 'type' => 'select', + 'options' => Plugin::get_config_select_options( $this->payment_method ), + 'std' => get_option( 'pronamic_pay_config_id' ), + ), + $this->id . '_checkout_label' => array( + 'id' => $this->id . '_checkout_label', + 'name' => __( 'Checkout Label', 'pronamic_ideal' ), + 'type' => 'text', + // @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.5.9/includes/admin/settings/register-settings.php#L1537-L1541 + // @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.5.9/includes/gateways/amazon-payments.php#L330 + 'std' => $this->checkout_label, + ), + $this->id . '_description' => array( + 'id' => $this->id . '_description', + 'name' => __( 'Description', 'pronamic_ideal' ), + 'type' => 'text', + // @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.5.9/includes/admin/settings/register-settings.php#L1537-L1541 + // @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.5.9/includes/gateways/amazon-payments.php#L330 + 'std' => '{edd_cart_details_name}', + /* translators: %s: {edd_cart_details_name} */ + 'desc' => '
    ' . sprintf( __( 'Default: %s', 'pronamic_ideal' ), '{edd_cart_details_name}' ) . + /* translators: %s: {edd_cart_details_name} */ + '
    ' . sprintf( __( 'Available Tags: %s', 'pronamic_ideal' ), '{edd_cart_details_name} {edd_payment_id}' ), + ), + ); + + $settings_gateways[ $this->id ] = $settings; + + return $settings_gateways; + } + + /** + * Get the Pronamic configuration ID for this gateway. + * + * @return null|string + */ + private function get_pronamic_config_id() { + $config_id = edd_get_option( $this->id . '_config_id' ); + + $config_id = empty( $config_id ) ? get_option( 'pronamic_pay_config_id' ) : $config_id; + + if ( empty( $config_id ) ) { + return null; + } + + return $config_id; + } + + /** + * Payment fields for this gateway + * + * @version 1.2.1 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/1.9.4/includes/checkout/template.php#L167 + */ + public function payment_fields() { + $gateway = Plugin::get_gateway( $this->get_pronamic_config_id() ); + + if ( null === $gateway ) { + return; + } + + /* + * Let the gateway know which payment method to use so it can return the correct inputs. + * @since 1.2.1 + */ + $gateway->set_payment_method( $this->payment_method ); + + $fields = $gateway->get_input_fields(); + + // Check if there are fields to display. + if ( empty( $fields ) ) { + return; + } + + echo '
    '; + echo '', esc_html( $this->checkout_label ), ''; + + foreach ( $fields as $field ) { + // Make field required. + $field['label'] .= ' *'; + $field['required'] = true; + + // @codingStandardsIgnoreStart + printf( '

    %s

    ', Util::input_fields_html( array( $field ) ) ); + // @codingStandardsIgnoreEnd + } + + echo '
    '; + } + + /** + * The $purchase_data array consists of the following data: + * + * $purchase_data = array( + * 'downloads' => array of download IDs, + * 'tax' => taxed amount on shopping cart + * 'subtotal' => total price before tax + * 'price' => total price of cart contents after taxes, + * 'purchase_key' => Random key + * 'user_email' => $user_email, + * 'date' => date( 'Y-m-d H:i:s' ), + * 'user_id' => $user_id, + * 'post_data' => $_POST, + * 'user_info' => array of user's information and used discount code + * 'cart_details' => array of cart details, + * ); + * + * @param array $purchase_data Purchase data. + */ + public function process_purchase( $purchase_data ) { + $config_id = $this->get_pronamic_config_id(); + + // Collect payment data. + $edd_currency = edd_get_currency(); + + $payment_data = array( + 'price' => $purchase_data['price'], + 'date' => $purchase_data['date'], + 'user_email' => $purchase_data['user_email'], + 'purchase_key' => $purchase_data['purchase_key'], + 'currency' => $edd_currency, + 'downloads' => $purchase_data['downloads'], + 'user_info' => $purchase_data['user_info'], + 'cart_details' => $purchase_data['cart_details'], + 'gateway' => $this->id, + 'status' => 'pending', + ); + + // Record the pending payment. + $edd_payment_id = edd_insert_payment( $payment_data ); + + // Check payment. + if ( false === $edd_payment_id ) { + // Log error. + edd_record_gateway_error( + __( 'Payment Error', 'pronamic_ideal' ), + sprintf( + /* translators: %s: payment data JSON */ + __( 'Payment creation failed before sending buyer to the payment provider. Payment data: %s', 'pronamic_ideal' ), + strval( wp_json_encode( $payment_data ) ) + ) + ); + + edd_send_back_to_checkout( + array( + 'payment-mode' => $purchase_data['post_data']['edd-gateway'], + ) + ); + + return; + } + + $edd_payment = edd_get_payment( $edd_payment_id ); + + // Get gateway and currency. + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + edd_set_error( 'pronamic_pay_error', Plugin::get_default_error_message() ); + + edd_send_back_to_checkout( + array( + 'payment-mode=' => $purchase_data['post_data']['edd-gateway'], + ) + ); + } + + // Currency. + $currency = Currency::get_instance( $edd_currency ); + + /** + * Tax. + * + * @todo We have to check how tax is handled in Easy Digial Downloads 3.0. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.22/includes/payments/functions.php#L148-L277 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/3.0.0-beta2/includes/payments/functions.php#L141-L200 + */ + $tax_percentage = null; + + if ( edd_use_taxes() ) { + if ( array_key_exists( 'tax_rate', $purchase_data ) ) { + $tax_rate = $purchase_data['tax_rate']; + + $tax_percentage = $tax_rate * 100; + } + } + + // Payment. + $payment = new Payment(); + + $payment->order_id = EasyDigitalDownloads::get_payment_number( $edd_payment_id ); + $payment->title = sprintf( + /* translators: %s: order id */ + __( 'Easy Digital Downloads order %s', 'pronamic_ideal' ), + $payment->order_id + ); + $payment->description = EasyDigitalDownloads::get_description( + edd_get_option( $this->id . '_description' ), + $edd_payment_id, + $purchase_data + ); + $payment->config_id = (int) $config_id; + $payment->source = 'easydigitaldownloads'; + $payment->source_id = $edd_payment_id; + $payment->method = $this->payment_method; + + if ( array_key_exists( 'price', $purchase_data ) ) { + $payment->set_total_amount( new TaxedMoney( $purchase_data['price'], $currency, $purchase_data['tax'], $tax_percentage ) ); + } + + // Name. + $name = new ContactName(); + + // Company Name. + $company_name = PurchaseDataHelper::get_company_name( $purchase_data ); + + // VAT Number. + $vat_number = PurchaseDataHelper::get_vat_number( $purchase_data ); + + // Customer. + $customer = new Customer(); + + $customer->set_name( $name ); + $customer->set_company_name( $company_name ); + $customer->set_vat_number( $vat_number ); + $customer->set_phone( null ); + + $payment->set_customer( $customer ); + + if ( array_key_exists( 'user_info', $purchase_data ) && is_array( $purchase_data['user_info'] ) ) { + $user_info = $purchase_data['user_info']; + + if ( array_key_exists( 'email', $user_info ) ) { + $customer->set_email( $user_info['email'] ); + } + + if ( array_key_exists( 'first_name', $user_info ) ) { + $name->set_first_name( $user_info['first_name'] ); + } + + if ( array_key_exists( 'last_name', $user_info ) ) { + $name->set_last_name( $user_info['last_name'] ); + } + + if ( array_key_exists( 'address', $user_info ) && is_array( $user_info['address'] ) && ! empty( $user_info['address'] ) ) { + $address_array = $user_info['address']; + + $address = new Address(); + + $address->set_name( $name ); + $address->set_company_name( $company_name ); + + if ( array_key_exists( 'line1', $address_array ) ) { + $address->set_line_1( $address_array['line1'] ); + } + + if ( array_key_exists( 'line2', $address_array ) ) { + $address->set_line_2( $address_array['line2'] ); + } + + if ( array_key_exists( 'city', $address_array ) ) { + $address->set_city( $address_array['city'] ); + } + + if ( array_key_exists( 'state', $address_array ) ) { + $address->set_region( $address_array['state'] ); + } + + if ( array_key_exists( 'country', $address_array ) ) { + $address->set_country_code( $address_array['country'] ); + } + + if ( array_key_exists( 'zip', $address_array ) ) { + $address->set_postal_code( $address_array['zip'] ); + } + + if ( array_key_exists( 'email', $user_info ) ) { + $address->set_email( $user_info['email'] ); + } + + $payment->set_billing_address( $address ); + $payment->set_shipping_address( $address ); + } + } + + // Lines. + $payment->lines = new PaymentLines(); + + if ( array_key_exists( 'cart_details', $purchase_data ) && is_array( $purchase_data['cart_details'] ) ) { + $cart_details = $purchase_data['cart_details']; + + $cart_detail_defaults = array( + 'name' => null, + 'id' => null, + 'item_number' => null, + 'item_price' => null, + 'quantity' => null, + 'discount' => null, + 'subtotal' => null, + 'tax' => null, + 'fees' => null, + 'price' => null, + ); + + foreach ( $cart_details as $cart_detail ) { + $detail = wp_parse_args( $cart_detail, $cart_detail_defaults ); + + $line = $payment->lines->new_line(); + + /** + * ID. + * + * We build the ID from the cart detail ID and the optional cart item price ID. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.17/includes/gateways/functions.php#L244-L247 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.17/includes/cart/functions.php#L220-L230 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.17/includes/cart/class-edd-cart.php#L1173-L1189 + */ + $id = $detail['id']; + + $item_price_id = \edd_get_cart_item_price_id( $detail ); + + if ( null !== $item_price_id ) { + $id = sprintf( '%s-%s', $id, $item_price_id ); + } + + $line->set_id( $id ); + + /** + * Name. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.17/includes/cart/functions.php#L243-L252 + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.17/includes/cart/class-edd-cart.php#L1207-L1227 + */ + $line->set_name( \edd_get_cart_item_name( $detail ) ); + + $unit_price = $detail['price'] / $detail['quantity']; + $unit_tax = $detail['tax'] / $detail['quantity']; + + $line->set_unit_price( new TaxedMoney( $unit_price, $currency, $unit_tax, $tax_percentage ) ); + $line->set_total_amount( new TaxedMoney( $detail['price'], $currency, $detail['tax'], $tax_percentage ) ); + + $line->set_type( PaymentLineType::DIGITAL ); + $line->set_quantity( $detail['quantity'] ); + $line->set_discount_amount( new Money( $detail['discount'], $currency ) ); + $line->set_product_url( get_permalink( $detail['id'] ) ); + $line->set_image_url( wp_get_attachment_url( get_post_thumbnail_id( $detail['id'] ) ) ); + $line->set_product_category( EasyDigitalDownloads::get_download_category( $detail['id'] ) ); + } + } + + // Fees. + $fees = $edd_payment->get_fees(); + + $fee_defaults = array( + 'amount' => null, + 'label' => null, + 'type' => null, + 'no_tax' => null, + 'download_id' => null, + 'price_id' => null, + ); + + foreach ( $fees as $id => $fee ) { + $fee = wp_parse_args( $fee, $fee_defaults ); + + $line = $payment->lines->new_line(); + + $fee_tax_percentage = $fee['no_tax'] ? null : $tax_percentage; + + $line->set_unit_price( new TaxedMoney( $fee['amount'], $currency, null, $fee_tax_percentage ) ); + $line->set_total_amount( new TaxedMoney( $fee['amount'], $currency, null, $fee_tax_percentage ) ); + + $line->set_type( PaymentLineType::FEE ); + $line->set_name( $fee['label'] ); + $line->set_id( $fee['id'] ); + $line->set_quantity( 1 ); + } + + // Start. + try { + $payment = Plugin::start_payment( $payment ); + } catch ( \Exception $e ) { + edd_record_gateway_error( + __( 'Payment Error', 'pronamic_ideal' ), + sprintf( + /* translators: %s: payment data JSON */ + __( 'Payment creation failed before sending buyer to the payment provider. Payment data: %s', 'pronamic_ideal' ), + (string) wp_json_encode( $payment_data ) + ), + (int) $edd_payment_id + ); + + edd_set_error( 'pronamic_pay_error', Plugin::get_default_error_message() ); + edd_set_error( 'pronamic_pay_error_' . $e->getCode(), $e->getMessage() ); + + edd_send_back_to_checkout( '?payment-mode=' . $purchase_data['post_data']['edd-gateway'] ); + + return; + } + + /* + * Transaction ID + * + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.3/includes/payments/functions.php#L1400-L1416 + */ + edd_set_payment_transaction_id( $edd_payment_id, $payment->get_transaction_id() ); + + // Insert payment note. + $payment_link = add_query_arg( + array( + 'post' => $payment->get_id(), + 'action' => 'edit', + ), + admin_url( 'post.php' ) + ); + + $note = sprintf( + /* translators: %s: payment id */ + __( 'Payment %s pending.', 'pronamic_ideal' ), + sprintf( '#%s', $payment_link, $payment->get_id() ) + ); + + edd_insert_payment_note( $edd_payment_id, $note ); + + $gateway->redirect( $payment ); + + exit; + } + + /** + * Get payment transaction ID + * + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.3/includes/payments/functions.php#L1378-L1398 + * + * @param string $payment_id Payment ID. + * + * @return null + */ + public function get_payment_transaction_id( $payment_id ) { + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/PurchaseDataHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/PurchaseDataHelper.php new file mode 100644 index 00000000..57cf8886 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/easy-digital-downloads/src/PurchaseDataHelper.php @@ -0,0 +1,85 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EasyDigitalDownloads + */ + +namespace Pronamic\WordPress\Pay\Extensions\EasyDigitalDownloads; + +/** + * Easy Digital Downloads purchase data helper + * + * @author Remco Tolsma + * @version 2.1.2 + * @since 2.1.2 + */ +class PurchaseDataHelper { + /** + * Get post data value. + * + * @link https://github.com/WordPress/WordPress-Coding-Standards/wiki/Fixing-errors-for-input-data + * @param array $purchase_data Purchase data. + * @param string $key Post data key. + * @return string|null + */ + public static function get_post_data_value( $purchase_data, $key ) { + if ( ! \array_key_exists( 'post_data', $purchase_data ) ) { + return null; + } + + $post_data = $purchase_data['post_data']; + + if ( ! \is_array( $post_data ) ) { + return null; + } + + if ( ! \array_key_exists( $key, $post_data ) ) { + return null; + } + + $value = $post_data[ $key ]; + $value = \wp_unslash( $value ); + $value = \sanitize_text_field( $value ); + $value = \trim( $value ); + + if ( empty( $value ) ) { + return null; + } + + return $value; + } + + /** + * Get company name from purchase data array. + * + * @param array $purchase_data Purchase data array. + * @return string|null + */ + public static function get_company_name( $purchase_data ) { + /** + * Pronamic - Easy Digital Downlaods - Company name. + * + * @link https://gitlab.com/pronamic-plugins/edd-company-name/-/blob/1.1.0/edd-company-name.php + */ + return self::get_post_data_value( $purchase_data, 'edd_company' ); + } + + /** + * Get VAT number from purchase data array. + * + * @param array $purchase_data Purchase data array. + * @return string|null + */ + public static function get_vat_number( $purchase_data ) { + /** + * Pronamic - Easy Digital Downlaods - VAT. + * + * @link https://gitlab.com/pronamic-plugins/edd-vat/-/blob/1.0.0/includes/class-purchase-form.php + */ + return self::get_post_data_value( $purchase_data, 'vat_number' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspresso.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspresso.php new file mode 100644 index 00000000..805bf209 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspresso.php @@ -0,0 +1,104 @@ + $id, + // The 'txn_details' key is not (always) filled in by the filters + // below, to prevent unknown key notices we add it here. + 'txn_details' => '', + ); + + $data = apply_filters( 'filter_hook_espresso_prepare_payment_data_for_gateways', $data ); + $data = apply_filters( 'filter_hook_espresso_get_total_cost', $data ); + + return $data; + } + + /** + * Update the payment data + * + * @link https://github.com/eventespresso/event-espresso-legacy/blob/3.1.35.P/includes/process-registration/payment_page.php#L407 + * + * @param array $payment_data Payment data. + */ + public static function update_payment( $payment_data ) { + event_espresso_require_gateway( 'process_payments.php' ); + + /* + * Apply filter to save payment data in database. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/event-espresso.3.1.24.1.P/gateways/process_payments.php#L75 + */ + $payment_data = apply_filters( 'filter_hook_espresso_update_attendee_payment_data_in_db', $payment_data ); + } + + /** + * E-mail after payment + * + * @link https://github.com/eventespresso/event-espresso-legacy/blob/3.1.35.P/includes/process-registration/payment_page.php#L407 + * + * @param array $payment_data Payment data. + */ + public static function email_after_payment( $payment_data ) { + event_espresso_require_gateway( 'process_payments.php' ); + + /* + * Load the email.php functions file + * + * @link https://github.com/eventespresso/event-espresso-legacy/blob/3.1.35.P/espresso.php#L464 + */ + $filename = EVENT_ESPRESSO_INCLUDES_DIR . 'functions/email.php'; + + if ( is_readable( $filename ) ) { + require_once $filename; + } + + // Actions. + add_action( 'action_hook_espresso_email_after_payment', 'espresso_email_after_payment' ); + + do_action( 'action_hook_espresso_email_after_payment', $payment_data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoDependency.php new file mode 100644 index 00000000..4641464f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoDependency.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspressoLegacy + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspressoLegacy; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Event Espresso Dependency + * + * @author Reüel van der Steege + * @version 2.2.1 + * @since 2.2.1 + */ +class EventEspressoDependency extends Dependency { + /** + * Is met. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/master/espresso.php#L37 + * @link https://plugins.trac.wordpress.org/browser/event-espresso-free/tags/3.1.35.L/espresso.php#L39 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \defined( '\EVENT_ESPRESSO_VERSION' ) ) { + return false; + } + + return \version_compare( + \EVENT_ESPRESSO_VERSION, + '4.0.0', + '<' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php new file mode 100644 index 00000000..1ef8f59d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/EventEspressoHelper.php @@ -0,0 +1,132 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspressoLegacy + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspressoLegacy; + +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\AddressHelper; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\ContactNameHelper; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\CustomerHelper; + +/** + * Event Espresso Helper + * + * @author Remco Tolsma + * @version 2.3.0 + * @since 2.3.0 + */ +class EventEspressoHelper { + /** + * Get description. + * + * @return string + */ + public static function get_description( $attendee_id ) { + /* translators: %s: attendee id */ + return \sprintf( + /* translators: %s: attendee ID */ + \__( 'Attendee %s', 'pronamic_ideal' ), + $attendee_id + ); + } + + /** + * Get customer from data. + * + * @return Customer|null + */ + public static function get_customer_from_data( $data ) { + return CustomerHelper::from_array( + array( + 'name' => self::get_name_from_data( $data ), + 'email' => $data['email'], + ) + ); + } + + /** + * Get name from data. + * + * @return ContactName|null + */ + public static function get_name_from_data( $data ) { + return ContactNameHelper::from_array( + array( + 'first_name' => $data['fname'], + 'last_name' => $data['lname'], + ) + ); + } + + /** + * Get address from data. + * + * @return Address|null + */ + public static function get_address_from_data( $data ) { + return AddressHelper::from_array( + array( + 'name' => self::get_name_from_data( $data ), + 'line_1' => $data['address'], + 'postal_code' => $data['zip'], + 'city' => $data['city'], + ) + ); + } + + /** + * Get notify URL. + * + * @return mixed + */ + public static function get_notify_url( $data ) { + global $org_options; + + return add_query_arg( + array( + 'attendee_id' => $data['attendee_id'], + 'registration_id' => $data['registration_id'], + 'event_id' => $data['event_id'], + ), + get_permalink( $org_options['notify_url'] ) + ); + } + + /** + * Get return URL. + * + * @return mixed + */ + public static function get_return_url( $data ) { + global $org_options; + + return add_query_arg( + array( + 'attendee_id' => $data['attendee_id'], + 'registration_id' => $data['registration_id'], + 'event_id' => $data['event_id'], + ), + get_permalink( $org_options['return_url'] ) + ); + } + + /** + * Get cancel return. + * + * @return mixed + */ + public static function get_cancel_return() { + global $org_options; + + return \get_permalink( $org_options['cancel_return'] ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php new file mode 100644 index 00000000..b60902d4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso-legacy/src/Extension.php @@ -0,0 +1,474 @@ + __( 'Event Espresso (legacy)', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new EventEspressoDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + \add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( __CLASS__, 'source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + \add_filter( 'action_hook_espresso_display_gateway_settings', array( __CLASS__, 'display_gateway_settings' ) ); + + \add_action( 'action_hook_espresso_display_onsite_payment_header', 'espresso_display_onsite_payment_header' ); + \add_action( 'action_hook_espresso_display_onsite_payment_footer', 'espresso_display_onsite_payment_footer' ); + \add_action( 'action_hook_espresso_display_onsite_payment_gateway', array( __CLASS__, 'display_gateway' ) ); + + \add_filter( 'filter_hook_espresso_transactions_get_attendee_id', array( __CLASS__, 'transactions_get_attendee_id' ) ); + + \add_action( 'template_redirect', array( __CLASS__, 'process_gateway' ) ); + + \add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( __CLASS__, 'redirect_url' ), 10, 2 ); + \add_action( 'pronamic_payment_status_update_' . self::SLUG, array( __CLASS__, 'update_status' ), 10, 1 ); + + \add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( __CLASS__, 'source_text' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( __CLASS__, 'source_url' ), 10, 2 ); + + // Fix fatal error since Event Espresso 3.1.29.1.P. + if ( \defined( '\EVENT_ESPRESSO_GATEWAY_DIR' ) ) { + $gateway_dir = \EVENT_ESPRESSO_GATEWAY_DIR . 'pronamic_ideal'; + $gateway_init = $gateway_dir . '/init.php'; + + if ( ! \is_readable( $gateway_init ) ) { + $created = \wp_mkdir_p( $gateway_dir ); + + if ( $created ) { + \touch( $gateway_init ); + } + } + } + } + + /** + * Process gateway + */ + public static function process_gateway() { + if ( ! filter_has_var( INPUT_POST, 'event_espresso_pronamic_ideal' ) ) { + return; + } + + $config_id = \get_option( self::OPTION_CONFIG_ID ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + $attendee_id = \apply_filters( 'filter_hook_espresso_transactions_get_attendee_id', '' ); + + $data = EventEspresso::get_payment_data_by_attendee_id( $attendee_id ); + + /** + * Build payment. + */ + $payment = new Payment(); + + $payment->source = 'event-espresso'; + $payment->source_id = $attendee_id; + $payment->order_id = $attendee_id; + + // Description. + $payment->description = EventEspressoHelper::get_description( $attendee_id ); + + $payment->title = EventEspressoHelper::get_description( $attendee_id ); + + // Customer. + $payment->set_customer( EventEspressoHelper::get_customer_from_data( $data ) ); + + // Address. + $payment->set_billing_address( EventEspressoHelper::get_address_from_data( $data ) ); + + // Currency. + $currency = Currency::get_instance( 'EUR' ); + + // Amount. + $payment->set_total_amount( new TaxedMoney( $data['total_cost'], $currency ) ); + + // Configuration. + $payment->config_id = $config_id; + + // Start. + try { + $payment = Plugin::start_payment( $payment ); + + // Redirect. + $gateway->redirect( $payment ); + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + } + } + + /** + * Display gateway + * + * @param array $payment_data Payment data. + */ + public static function display_gateway( $payment_data ) { + $config_id = get_option( self::OPTION_CONFIG_ID ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( $gateway ) { + ?> +
    + + ', + esc_attr__( 'Pay with iDEAL', 'pronamic_ideal' ), + esc_attr( plugins_url( 'images/ideal.nl/iDEAL-Payoff-2-klein.gif', Plugin::$file ) ) + ); + + ?> + + +
    +

    + +

    + +
    +
    + get_input_html(); + + ?> + +

    + ', + esc_html__( 'Pay with iDEAL', 'pronamic_ideal' ) + ); + + ?> +

    +
    +
    + +

    + + + +

    +
    +
    + + +
    +
    +

    + +

    + +

    + +
    +
    +
      + + +
    • + +
    • + +
      + + + + +
      +
        +
      • + + +
        + + self::OPTION_CONFIG_ID, + 'selected' => $config_id, + ) + ); + + ?> + +
        +
      • +
      +
      + + +
      + + + +
    • + +
    • + + +
    +
    +
    +
    +
    + get_source_id(); + + $data = EventEspresso::get_payment_data_by_attendee_id( $attendee_id ); + + $url = EventEspressoHelper::get_return_url( $data ); + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + $url = EventEspressoHelper::get_cancel_return(); + + break; + case PaymentStatus::EXPIRED: + case PaymentStatus::FAILURE: + case PaymentStatus::SUCCESS: + case PaymentStatus::OPEN: + default: + break; + } + + return $url; + } + + /** + * Update lead status of the specified payment + * + * @param Payment $payment Payment. + */ + public static function update_status( Payment $payment ) { + $attendee_id = $payment->get_source_id(); + + $payment_data = EventEspresso::get_payment_data_by_attendee_id( $attendee_id ); + $payment_data['txn_type'] = PaymentMethods::get_name( PaymentMethods::IDEAL ); + $payment_data['txn_id'] = $payment->get_transaction_id(); + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + $payment_data['payment_status'] = EventEspresso::PAYMENT_STATUS_INCOMPLETE; + EventEspresso::update_payment( $payment_data ); + + break; + case PaymentStatus::SUCCESS: + $payment_data['payment_status'] = EventEspresso::PAYMENT_STATUS_COMPLETED; + + EventEspresso::update_payment( $payment_data ); + EventEspresso::email_after_payment( $payment_data ); + + break; + } + } + + /** + * Source column + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public static function source_text( $text, Payment $payment ) { + $url = add_query_arg( + array( + 'page' => 'events', + 'event_admin_reports' => 'event_list_attendees', + 'all_a' => 'true', + ), + admin_url( 'admin.php' ) + ); + + $url = self::source_url( $url, $payment ); + + $text = __( 'Event Espresso', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + esc_attr( $url ), + /* translators: %s: payment source id */ + sprintf( __( 'Attendee #%s', 'pronamic_ideal' ), $payment->get_source_id() ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Pronamic payment. + * + * @return string + */ + public static function source_description( $description, Payment $payment ) { + return __( 'Event Espresso Attendee', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Pronamic payment. + * + * @return string + */ + public static function source_url( $url, Payment $payment ) { + $attendee_id = $payment->get_source_id(); + + $attendee = espresso_get_attendee_meta_value( $attendee_id, 'original_attendee_details' ); + + $attendee = unserialize( $attendee ); + + $url = add_query_arg( + array( + 'page' => 'events', + 'event_admin_reports' => 'edit_attendee_record', + 'event_id' => $attendee['event_id'], + 'registration_id' => $attendee['registration_id'], + 'form_action' => 'edit_attendee', + 'id' => $attendee_id, + ), + admin_url( 'admin.php' ) + ); + + return $url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AddOn.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AddOn.php new file mode 100644 index 00000000..076d599c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AddOn.php @@ -0,0 +1,77 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use EE_Addon; +use EE_Register_Addon; +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso addon + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.1.0 + */ +class AddOn extends EE_Addon { + /** + * Register addon. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.16.p/tests/mocks/addons/new-payment-method/espresso-new-payment-method.php#L45 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.16.p/tests/mocks/addons/new-payment-method/EE_New_Payment_Method.class.php#L26-L46 + */ + public static function register_addon() { + class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\AddOn', 'EE_Pronamic_WP_Pay_AddOn' ); + + $payment_methods_paths = array( + dirname( __FILE__ ) . '/ee/payment-methods/Pronamic', + ); + + $payment_methods = array( + PaymentMethods::ALIPAY => 'Pronamic_Alipay', + PaymentMethods::BANCONTACT => 'Pronamic_Bancontact', + PaymentMethods::BANK_TRANSFER => 'Pronamic_BankTransfer', + PaymentMethods::BELFIUS => 'Pronamic_Belfius', + PaymentMethods::BITCOIN => 'Pronamic_Bitcoin', + PaymentMethods::CREDIT_CARD => 'Pronamic_CreditCard', + PaymentMethods::DIRECT_DEBIT => 'Pronamic_DirectDebit', + PaymentMethods::GIROPAY => 'Pronamic_Giropay', + PaymentMethods::IDEAL => 'Pronamic_IDeal', + PaymentMethods::IDEALQR => 'Pronamic_IDealQR', + PaymentMethods::KBC => 'Pronamic_KBC', + PaymentMethods::PAYCONIQ => 'Pronamic_Payconiq', + PaymentMethods::PAYPAL => 'Pronamic_PayPal', + PaymentMethods::SOFORT => 'Pronamic_Sofort', + ); + + foreach ( $payment_methods as $payment_method => $ee_payment_method ) { + if ( ! PaymentMethods::is_active( $payment_method ) ) { + continue; + } + + $payment_methods_paths[] = dirname( __FILE__ ) . '/ee/payment-methods/' . $ee_payment_method; + } + + EE_Register_Addon::register( + 'pronamic_pay', + array( + 'version' => '1.0.0', + 'min_core_version' => '4.6.0', + 'main_file_path' => dirname( __FILE__ ) . '/ee/EE_Pronamic_WP_Pay_AddOn.php', + 'class_name' => 'EE_Pronamic_WP_Pay_AddOn', + 'payment_method_paths' => $payment_methods_paths, + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AlipayGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AlipayGateway.php new file mode 100644 index 00000000..9779b27b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AlipayGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Alipay gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class AlipayGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::ALIPAY; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AlipayPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AlipayPaymentMethod.php new file mode 100644 index 00000000..cae46907 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/AlipayPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ Alipay payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class AlipayPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::ALIPAY; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new AlipayGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::ALIPAY ); + $this->_default_button_url = plugins_url( 'images/alipay/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Alipay'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BancontactGateway.php new file mode 100644 index 00000000..92b533ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BancontactGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Bancontact gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BancontactGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BANCONTACT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BancontactPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BancontactPaymentMethod.php new file mode 100644 index 00000000..ba4bc7b9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BancontactPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ Bancontact payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BancontactPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BANCONTACT; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new BancontactGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::BANCONTACT ); + $this->_default_button_url = plugins_url( 'images/bancontact/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Bancontact'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BankTransferGateway.php new file mode 100644 index 00000000..f00d1f7e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BankTransferGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ bank transfer gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BankTransferGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BANK_TRANSFER; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BankTransferPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BankTransferPaymentMethod.php new file mode 100644 index 00000000..d9eef5af --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BankTransferPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ bank transfer payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BankTransferPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BANK_TRANSFER; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new BankTransferGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::BANK_TRANSFER ); + $this->_default_button_url = plugins_url( 'images/bank-transfer/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_BankTransfer'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BelfiusGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BelfiusGateway.php new file mode 100644 index 00000000..62011167 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BelfiusGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Belfius gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BelfiusGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BELFIUS; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BelfiusPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BelfiusPaymentMethod.php new file mode 100644 index 00000000..cf232dee --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BelfiusPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ Belfius payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BelfiusPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BELFIUS; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new BelfiusGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::BELFIUS ); + $this->_default_button_url = plugins_url( 'images/belfius/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Belfius'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BitcoinGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BitcoinGateway.php new file mode 100644 index 00000000..0cc6f0a3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BitcoinGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Bitcoin gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BitcoinGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BITCOIN; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BitcoinPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BitcoinPaymentMethod.php new file mode 100644 index 00000000..b2a169e3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/BitcoinPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ Bitcoin payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class BitcoinPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::BITCOIN; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new BitcoinGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::BITCOIN ); + $this->_default_button_url = plugins_url( 'images/bitcoin/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Bitcoin'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/CreditCardGateway.php new file mode 100644 index 00000000..1d32bc94 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/CreditCardGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ credit card gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class CreditCardGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::CREDIT_CARD; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/CreditCardPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/CreditCardPaymentMethod.php new file mode 100644 index 00000000..0ab7f916 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/CreditCardPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ credit card payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class CreditCardPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::CREDIT_CARD; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new CreditCardGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::CREDIT_CARD ); + $this->_default_button_url = plugins_url( 'images/credit-card/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_CreditCard'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/DirectDebitGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/DirectDebitGateway.php new file mode 100644 index 00000000..94790de3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/DirectDebitGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ direct debit gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class DirectDebitGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/DirectDebitPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/DirectDebitPaymentMethod.php new file mode 100644 index 00000000..dfd656f3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/DirectDebitPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ direct debit payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class DirectDebitPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new DirectDebitGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::DIRECT_DEBIT ); + $this->_default_button_url = plugins_url( 'images/direct-debit/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_DirectDebit'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/EventEspressoDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/EventEspressoDependency.php new file mode 100644 index 00000000..c12f827c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/EventEspressoDependency.php @@ -0,0 +1,40 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Event Espresso Dependency + * + * @author Reüel van der Steege + * @version 2.1.4 + * @since 2.1.4 + */ +class EventEspressoDependency extends Dependency { + /** + * Is met. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.2.2.reg/espresso.php#L53 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \defined( '\EVENT_ESPRESSO_VERSION' ) ) { + return false; + } + + return \version_compare( + \EVENT_ESPRESSO_VERSION, + '4.0.0', + '>=' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php new file mode 100644 index 00000000..3c245d53 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/EventEspressoHelper.php @@ -0,0 +1,85 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\ContactNameHelper; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\CustomerHelper; + +/** + * Event Espresso Helper + * + * @author Remco Tolsma + * @version 2.3.0 + * @since 2.3.0 + */ +class EventEspressoHelper { + /** + * Get title. + * + * @return string + */ + public function get_title( $transaction_id ) { + /* translators: %s: order id */ + return \sprintf( + \__( 'Event Espresso transaction %s', 'pronamic_ideal' ), + $transaction_id + ); + } + + /** + * Get description. + * + * @return string + */ + public function get_description( $transaction_id, $gateway ) { + $search = array( + '{transaction_id}', + ); + + $replace = array( + $transaction_id, + ); + + $description = ''; + + if ( method_exists( $gateway, 'get_transaction_description' ) ) { + $description = $gateway->get_transaction_description(); + } + + if ( '' === $description ) { + $description = self::get_title( $transaction_id ); + } + + return str_replace( $search, $replace, $description ); + } + + /** + * Get customer from attendee. + */ + public static function get_customer_from_attendee( $attendee ) { + return CustomerHelper::from_array( array( + 'name' => self::get_name_from_attendee( $attendee ), + 'email' => $attendee->email(), + ) ); + } + + /** + * Get name from primary attendee. + */ + public static function get_name_from_attendee( $attendee ) { + return ContactNameHelper::from_array( array( + 'first_name' => $attendee->fname(), + 'last_name' => $attendee->lname(), + ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/Extension.php new file mode 100644 index 00000000..2c870665 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/Extension.php @@ -0,0 +1,206 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use EE_Config; +use EE_Payment_Processor; +use EE_Registry; +use EEM_Gateways; +use EEM_Transaction; +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Title: WordPress pay Event Espresso extension + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.3 + * @since 1.0.2 + */ +class Extension extends AbstractPluginIntegration { + /** + * Slug. + * + * @var string + */ + const SLUG = 'eventespresso'; + + /** + * Constructs and initalize Event Espresso extension.s + */ + public function __construct() { + parent::__construct( + array( + 'name' => __( 'Event Espresso', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new EventEspressoDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // Actions. + add_action( 'AHEE__EE_System__load_espresso_addons', array( $this, 'register_addon' ) ); + + add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( __CLASS__, 'redirect_url' ), 10, 2 ); + add_action( 'pronamic_payment_status_update_' . self::SLUG, array( $this, 'status_update' ), 10 ); + } + + /** + * Load Espresso addons. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.16.p/core/EE_System.core.php#L162-L163 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.16.p/core/EE_System.core.php#L383-L398 + * + * @hooked AHEE__EE_System__load_espresso_addons - 10 - https://github.com/eventespresso/event-espresso-core/blob/4.9.66.p/core/EE_System.core.php#L378 + */ + public function register_addon() { + /* + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.16.p/tests/mocks/addons/new-payment-method/espresso-new-payment-method.php#L45 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.16.p/tests/mocks/addons/new-payment-method/EE_New_Payment_Method.class.php#L26-L46 + */ + AddOn::register_addon(); + } + + /** + * Update lead status of the specified payment. + * + * @param Payment $payment Pronamic payment. + */ + public static function status_update( Payment $payment ) { + $ee_transaction = EEM_Transaction::instance()->get_one_by_ID( $payment->get_source_id() ); + $ee_payment = $ee_transaction->last_payment(); + + EE_Payment_Processor::instance()->process_ipn( + array( + 'pronamic_payment_id' => $payment->get_id(), + 'pronamic_payment_status' => $payment->get_status(), + ), + $ee_transaction, + $ee_payment->payment_method() + ); + } + + /** + * Payment redirect URL filter. + * + * @param string $url Redirect URL. + * @param Payment $payment Pronamic payment. + * + * @return string + */ + public static function redirect_url( $url, Payment $payment ) { + $redirect_url = get_post_meta( $payment->get_id(), '_pronamic_payment_url_return', true ); + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + $redirect_url = get_post_meta( $payment->get_id(), '_pronamic_payment_url_cancel', true ); + + break; + case PaymentStatus::FAILURE: + $redirect_url = get_post_meta( $payment->get_id(), '_pronamic_payment_url_error', true ); + + break; + case PaymentStatus::SUCCESS: + $redirect_url = get_post_meta( $payment->get_id(), '_pronamic_payment_url_success', true ); + + break; + } + + if ( ! empty( $redirect_url ) ) { + return $redirect_url; + } + + return $url; + } + + /** + * Source column. + * + * @param string $text Source text. + * @param Payment $payment Pronamic payment. + * + * @return string + */ + public static function source_text( $text, Payment $payment ) { + $url = add_query_arg( + array( + 'page' => 'espresso_transactions', + 'action' => 'view_transaction', + 'TXN_ID' => $payment->get_source_id(), + ), + admin_url( 'admin.php' ) + ); + + $text = __( 'Event Espresso', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + esc_attr( $url ), + /* translators: %s: payment source id */ + sprintf( __( 'Transaction %s', 'pronamic_ideal' ), $payment->get_source_id() ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Pronamic payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'Event Espresso Transaction', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Pronamic payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + return add_query_arg( + array( + 'page' => 'espresso_transactions', + 'action' => 'view_transaction', + 'TXN_ID' => $payment->get_source_id(), + ), + admin_url( 'admin.php' ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/Gateway.php new file mode 100644 index 00000000..d7d12cfe --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/Gateway.php @@ -0,0 +1,245 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use EE_Error; +use EE_Offsite_Gateway; +use EEI_Transaction; +use EEI_Payment; +use Pronamic\WordPress\Money\Currency; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Title: WordPress pay Event Espresso 4.6+ gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.3 + * @since 1.1.0 + */ +class Gateway extends EE_Offsite_Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method; + + /** + * Configuration ID + * + * Extra meta inputs on payment method settings forms are magically loaded + * into class variables like this one ($_config_id). + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L181-L183 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_Gateway.lib.php#L158-L168 + * + * @var string + */ + protected $_config_id; + + /** + * Currencies supported. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.9.66.p/docs/L--Payment-Methods-and-Gateways/gateway-classes.md + * @var array + */ + protected $_currencies_supported = array( + 'EUR', + ); + + /** + * Transaction description. + * + * @since 1.1.5 + * @var string + */ + protected $_transaction_description; + + /** + * Construct. + */ + public function __construct() { + $this->set_uses_separate_IPN_request( true ); + + parent::__construct(); + } + + /** + * Get the gateay configuration ID. + * + * @return string + */ + public function get_config_id() { + return $this->_config_id; + } + + /** + * Get the gateway transaction description. + * + * @since 1.1.5 + * @return string + */ + public function get_transaction_description() { + return $this->_transaction_description; + } + + /** + * Set redirection info. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_Offsite_Gateway.lib.php#L51-L59 + * + * @param EEI_Payment $ee_payment Event Espresso payment. + * @param array $billing_info Billing info. + * @param string $return_url Return URL. + * @param null $notify_url Notify URL. + * @param string $cancel_url Cancel URL. + * @return EEI_Payment + * @throws EE_Error Throws Event Espresso error if gateway or payment can't be initiated. + */ + public function set_redirection_info( $ee_payment, $billing_info = array(), $return_url = null, $notify_url = null, $cancel_url = null ) { + $gateway = Plugin::get_gateway( $this->_config_id ); + + if ( ! $gateway ) { + $error = Plugin::get_default_error_message(); + + // @link https://github.com/eventespresso/event-espresso-core/blob/4.6.18.p/caffeinated/payment_methods/Mijireh/EEG_Mijireh.gateway.php#L147 + throw new EE_Error( $error ); + } + + $transaction = $ee_payment->transaction(); + + $total_line_item = $transaction->total_line_item(); + + $transaction_id = $transaction->ID(); + + $primary_attendee = $transaction->primary_registration()->attendee(); + + /** + * Build payment. + */ + $payment = new Payment(); + + $payment->source = 'eventespresso'; + $payment->source_id = $transaction_id; + $payment->order_id = $transaction_id; + + // Description. + $payment->description = EventEspressoHelper::get_description( $transaction_id, $this ); + + $payment->title = EventEspressoHelper::get_title( $transaction_id ); + + // Customer. + $payment->set_customer( EventEspressoHelper::get_customer_from_attendee( $primary_attendee ) ); + + // Currency. + $currency = Currency::get_instance( 'EUR' ); + + // Amount. + $payment->set_total_amount( new TaxedMoney( $transaction->total(), $currency ) ); + + // Configuration. + $payment->config_id = $this->_config_id; + + // Start. + try { + $payment = Plugin::start_payment( $payment ); + + update_post_meta( $payment->get_id(), '_pronamic_payment_url_return', $return_url ); + update_post_meta( $payment->get_id(), '_pronamic_payment_url_success', $return_url ); + update_post_meta( $payment->get_id(), '_pronamic_payment_url_cancel', $cancel_url ); + update_post_meta( $payment->get_id(), '_pronamic_payment_url_error', $cancel_url ); + + $redirect_url = $payment->get_pay_redirect_url(); + $redirect_args = $gateway->get_output_fields( $payment ); + + /* + * Since Event Espresso uses an HTML form to redirect users to the payment gateway + * we have to make sure an POST method is used when the redirect URL has query arguments. + * Otherwise the URL query arguments will be stripped by the users browser. + * Therefor we have to make sure the redirect arguments array is not empty. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.18.p/core/db_classes/EE_Payment.class.php#L547 + * @link http://stackoverflow.com/q/1116019 + */ + if ( false !== strpos( $redirect_url, '?' ) && empty( $redirect_args ) ) { + $redirect_args[] = ''; + } + + $ee_payment->set_redirect_url( $redirect_url ); + $ee_payment->set_redirect_args( $redirect_args ); + } catch ( \Exception $e ) { + // @link https://github.com/eventespresso/event-espresso-core/blob/4.6.18.p/caffeinated/payment_methods/Mijireh/EEG_Mijireh.gateway.php#L147 + $error_message = sprintf( + /* translators: %s: error message */ + __( 'Errors communicating with gateway: %s', 'pronamic_ideal' ), + implode( ',', $e->getMessage() ) + ); + + EE_Error::add_error( $error_message, __FILE__, __FUNCTION__, __LINE__ ); + + throw new EE_Error( $error_message ); + } + + return $ee_payment; + } + + /** + * Handle payment update + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_Offsite_Gateway.lib.php#L63-L71 + * + * @param array $update_info Update info, pften the contents of $_REQUEST, but not necessarily. + * @param EEI_Transaction $transaction Event Espresso transaction. + * @return EEI_Payment + */ + public function handle_payment_update( $update_info, $transaction ) { + if ( ! array_key_exists( 'pronamic_payment_status', $update_info ) ) { + return; + } + + $payment = $transaction->last_payment(); + + if ( empty( $payment ) ) { + return; + } + + $status = $update_info['pronamic_payment_status']; + + switch ( $status ) { + case PaymentStatus::CANCELLED: + $payment->set_status( $this->_pay_model->failed_status() ); + + break; + case PaymentStatus::EXPIRED: + $payment->set_status( $this->_pay_model->failed_status() ); + + break; + case PaymentStatus::FAILURE: + $payment->set_status( $this->_pay_model->failed_status() ); + + break; + case PaymentStatus::SUCCESS: + $payment->set_status( $this->_pay_model->approved_status() ); + + break; + } + + return $payment; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/GiropayGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/GiropayGateway.php new file mode 100644 index 00000000..6643326f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/GiropayGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Giropay gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class GiropayGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::GIROPAY; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/GiropayPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/GiropayPaymentMethod.php new file mode 100644 index 00000000..a20e5180 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/GiropayPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ Giropay payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class GiropayPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::GIROPAY; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new GiropayGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::GIROPAY ); + $this->_default_button_url = plugins_url( 'images/giropay/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Giropay'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealGateway.php new file mode 100644 index 00000000..61b293f1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso iDEAL gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.1.3 + */ +class IDealGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::IDEAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php new file mode 100644 index 00000000..1516eb70 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ iDEAL payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.1 + * @since 1.1.3 + */ +class IDealPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::IDEAL; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new IDealGateway(); + $this->_pretty_name = __( 'iDEAL', 'pronamic_ideal' ); + $this->_default_button_url = plugins_url( 'images/ideal/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_IDeal'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealQRGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealQRGateway.php new file mode 100644 index 00000000..15bf8be1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealQRGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ iDEAL QR gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class IDealQRGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::IDEALQR; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealQRPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealQRPaymentMethod.php new file mode 100644 index 00000000..d278534b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/IDealQRPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ iDEAL QR payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class IDealQRPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::IDEALQR; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new IDealQRGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::IDEALQR ); + $this->_default_button_url = plugins_url( 'images/ideal-qr/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_IDealQR'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/KBCGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/KBCGateway.php new file mode 100644 index 00000000..82fdde82 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/KBCGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ KBC gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class KBCGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::KBC; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/KBCPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/KBCPaymentMethod.php new file mode 100644 index 00000000..0686fce7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/KBCPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ KBC payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class KBCPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::KBC; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new KBCGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::KBC ); + $this->_default_button_url = plugins_url( 'images/kbc/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_KBC'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayPalGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayPalGateway.php new file mode 100644 index 00000000..1419d9b7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayPalGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ PayPal gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class PayPalGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::PAYPAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayPalPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayPalPaymentMethod.php new file mode 100644 index 00000000..f329c5a9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayPalPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ PayPal payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class PayPalPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::PAYPAL; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new PayPalGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::PAYPAL ); + $this->_default_button_url = plugins_url( 'images/paypal/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_PayPal'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayconiqGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayconiqGateway.php new file mode 100644 index 00000000..dbe3e8cc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayconiqGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Payconiq gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class PayconiqGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::PAYCONIQ; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayconiqPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayconiqPaymentMethod.php new file mode 100644 index 00000000..db45ae53 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PayconiqPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso Payconiq payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class PayconiqPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::PAYCONIQ; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new PayconiqPaymentMethod(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::PAYCONIQ ); + $this->_default_button_url = plugins_url( 'images/payconiq/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Payconiq'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php new file mode 100644 index 00000000..44657e2f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PaymentMethod.php @@ -0,0 +1,151 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use EE_Billing_Info_Form; +use EE_Form_Section_HTML; +use EE_Payment_Method; +use EE_Payment_Method_Form; +use EE_PMT_Base; +use EE_Registry; +use EE_Select_Input; +use EE_Text_Input; +use EE_Transaction; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso 4.6+ payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.1 + * @since 1.1.0 + */ +class PaymentMethod extends EE_PMT_Base { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = null; + + /** + * Constructs and initializes an Event Espresso payment method + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + if ( null === $this->payment_method ) { + $this->_gateway = new Gateway(); + $this->_pretty_name = __( 'Pronamic', 'pronamic_ideal' ); + $this->_default_button_url = plugins_url( 'images/credit-card/icon-64x48.png', Plugin::$file ); + } + + parent::__construct( $pm_instance ); + } + + /** + * Creates the billing form for this payment method type. + * + * @param \EE_Transaction $transaction Event Espresso transaction. + * @return EE_Billing_Info_Form|null + */ + public function generate_new_billing_form( EE_Transaction $transaction = null ) { + $config_id = $this->_gateway->get_config_id(); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( $gateway ) { + $gateway->set_payment_method( $this->payment_method ); + + if ( null === $this->payment_method && $gateway->payment_method_is_required() ) { + $gateway->set_payment_method( PaymentMethods::IDEAL ); + } + + $form = new EE_Billing_Info_Form( + $this->_pm_instance, + array( + 'name' => 'Pronamic_WP_Pay_Billing_Form', + 'subsections' => array( + 'html' => new EE_Form_Section_HTML( $gateway->get_input_html() ), + ), + ) + ); + + return $form; + } + + return null; + } + + /** + * Gets the form for all the settings related to this payment method type + * + * @return EE_Payment_Method_Form + */ + public function generate_new_settings_form() { + EE_Registry::instance()->load_helper( 'Template' ); + + $config_options = Plugin::get_config_select_options( $this->payment_method ); + + // Fix for incorrect normalization strategy + // @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/form_sections/inputs/EE_Form_Input_With_Options_Base.input.php#L89-L113. + $select_option = $config_options[0]; + + unset( $config_options[0] ); + + $config_options = array( 'select' => $select_option ) + $config_options; + + $form = new EE_Payment_Method_Form( + array( + 'extra_meta_inputs' => array( + 'config_id' => new EE_Select_Input( + $config_options, + array( + 'html_label_text' => __( 'Configuration', 'pronamic_ideal' ), + 'default' => get_option( 'pronamic_pay_config_id' ), + ) + ), + 'transaction_description' => new EE_Text_Input( + array( + 'html_label_text' => __( 'Transaction description', 'pronamic_ideal' ), + /* translators: %s: {tag} */ + 'html_help_text' => sprintf( __( 'Available tags: %s', 'pronamic_ideal' ), sprintf( '%s', '{transaction_id}' ) ), + 'default' => __( 'Event Espresso transaction {transaction_id}', 'pronamic_ideal' ), + ) + ), + ), + ) + ); + + return $form; + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + * + * @return string + */ + public function system_name() { + return 'Pronamic'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PaymentStatuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PaymentStatuses.php new file mode 100644 index 00000000..77817583 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/PaymentStatuses.php @@ -0,0 +1,58 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +/** + * Title: WordPress pay Event Espresso 4.6+ payment statuses + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.1.0 + */ +class PaymentStatuses { + /** + * Status approved + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/db_models/EEM_Payment.model.php#L19-L22 + */ + const APPROVED = 'PAP'; + + /** + * Pending + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/db_models/EEM_Payment.model.php#L25-L28 + */ + const PENDING = 'PPN'; + + /** + * Cancelled + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/db_models/EEM_Payment.model.php#L31-L35 + */ + const CANCELLED = 'PCN'; + + /** + * Declined + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/db_models/EEM_Payment.model.php#L39-L43 + */ + const DECLINED = 'PDC'; + + /** + * Failed + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/db_models/EEM_Payment.model.php#L47-L51 + */ + const FAILED = 'PFL'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/SofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/SofortGateway.php new file mode 100644 index 00000000..da57a672 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/SofortGateway.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WordPress pay Event Espresso 4.6+ Sofort gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class SofortGateway extends Gateway { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::SOFORT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/SofortPaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/SofortPaymentMethod.php new file mode 100644 index 00000000..2a5ad03b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/SofortPaymentMethod.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +namespace Pronamic\WordPress\Pay\Extensions\EventEspresso; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay Event Espresso Sofort payment method + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.0 + */ +class SofortPaymentMethod extends PaymentMethod { + /** + * Payment method. + * + * @since 2.0.0 + * + * @var string $payment_method + */ + protected $payment_method = PaymentMethods::SOFORT; + + /** + * Constructs and initializes an Event Espresso payment method. + * + * @param EE_Payment_Method $pm_instance Event Espresso payment method instance. + */ + public function __construct( $pm_instance = null ) { + $this->_gateway = new SofortGateway(); + $this->_pretty_name = PaymentMethods::get_name( PaymentMethods::SOFORT ); + $this->_default_button_url = plugins_url( 'images/sofort/icon-64x48.png', Plugin::$file ); + + parent::__construct( $pm_instance ); + } + + /** + * System name + * + * We have to override the `system_name` function since we don't follow the + * Event Espresso class name syntax. + * + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/core/libraries/payment_methods/EE_PMT_Base.lib.php#L575-L583 + * @link https://github.com/eventespresso/event-espresso-core/blob/4.6.17.p/admin_pages/payments/Payments_Admin_Page.core.php#L305 + */ + public function system_name() { + return 'Pronamic_Sofort'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/EE_Pronamic_WP_Pay_AddOn.class.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/EE_Pronamic_WP_Pay_AddOn.class.php new file mode 100644 index 00000000..3810d151 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/EE_Pronamic_WP_Pay_AddOn.class.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +return; diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic/EEG_Pronamic.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic/EEG_Pronamic.gateway.php new file mode 100644 index 00000000..58def020 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic/EEG_Pronamic.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\Gateway', 'EEG_Pronamic' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic/EE_PMT_Pronamic.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic/EE_PMT_Pronamic.pm.php new file mode 100644 index 00000000..622df896 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic/EE_PMT_Pronamic.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\PaymentMethod', 'EE_PMT_Pronamic' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Alipay/EEG_Pronamic_Alipay.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Alipay/EEG_Pronamic_Alipay.gateway.php new file mode 100644 index 00000000..422b1183 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Alipay/EEG_Pronamic_Alipay.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\AlipayGateway', 'EEG_Pronamic_Alipay' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Alipay/EE_PMT_Pronamic_Alipay.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Alipay/EE_PMT_Pronamic_Alipay.pm.php new file mode 100644 index 00000000..1bf8e5dd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Alipay/EE_PMT_Pronamic_Alipay.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\AlipayPaymentMethod', 'EE_PMT_Pronamic_Alipay' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bancontact/EEG_Pronamic_Bancontact.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bancontact/EEG_Pronamic_Bancontact.gateway.php new file mode 100644 index 00000000..1bc6ab4f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bancontact/EEG_Pronamic_Bancontact.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BancontactGateway', 'EEG_Pronamic_Bancontact' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bancontact/EE_PMT_Pronamic_Bancontact.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bancontact/EE_PMT_Pronamic_Bancontact.pm.php new file mode 100644 index 00000000..8f02577e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bancontact/EE_PMT_Pronamic_Bancontact.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BancontactPaymentMethod', 'EE_PMT_Pronamic_Bancontact' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_BankTransfer/EEG_Pronamic_BankTransfer.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_BankTransfer/EEG_Pronamic_BankTransfer.gateway.php new file mode 100644 index 00000000..91177ef5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_BankTransfer/EEG_Pronamic_BankTransfer.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BankTransferGateway', 'EEG_Pronamic_BankTransfer' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_BankTransfer/EE_PMT_Pronamic_BankTransfer.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_BankTransfer/EE_PMT_Pronamic_BankTransfer.pm.php new file mode 100644 index 00000000..cd271d1e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_BankTransfer/EE_PMT_Pronamic_BankTransfer.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BankTransferPaymentMethod', 'EE_PMT_Pronamic_BankTransfer' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Belfius/EEG_Pronamic_Belfius.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Belfius/EEG_Pronamic_Belfius.gateway.php new file mode 100644 index 00000000..7fb94886 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Belfius/EEG_Pronamic_Belfius.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BelfiusGateway', 'EEG_Pronamic_Belfius' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Belfius/EE_PMT_Pronamic_Belfius.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Belfius/EE_PMT_Pronamic_Belfius.pm.php new file mode 100644 index 00000000..833353bb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Belfius/EE_PMT_Pronamic_Belfius.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BelfiusPaymentMethod', 'EE_PMT_Pronamic_Belfius' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bitcoin/EEG_Pronamic_Bitcoin.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bitcoin/EEG_Pronamic_Bitcoin.gateway.php new file mode 100644 index 00000000..4be111a1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bitcoin/EEG_Pronamic_Bitcoin.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BitcoinGateway', 'EEG_Pronamic_Bitcoin' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bitcoin/EE_PMT_Pronamic_Bitcoin.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bitcoin/EE_PMT_Pronamic_Bitcoin.pm.php new file mode 100644 index 00000000..e3f99d8c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Bitcoin/EE_PMT_Pronamic_Bitcoin.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\BitcoinPaymentMethod', 'EE_PMT_Pronamic_Bitcoin' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_CreditCard/EEG_Pronamic_CreditCard.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_CreditCard/EEG_Pronamic_CreditCard.gateway.php new file mode 100644 index 00000000..f1e8d85f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_CreditCard/EEG_Pronamic_CreditCard.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\CreditCardGateway', 'EEG_Pronamic_CreditCard' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_CreditCard/EE_PMT_Pronamic_CreditCard.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_CreditCard/EE_PMT_Pronamic_CreditCard.pm.php new file mode 100644 index 00000000..2ba41d26 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_CreditCard/EE_PMT_Pronamic_CreditCard.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\CreditCardPaymentMethod', 'EE_PMT_Pronamic_CreditCard' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_DirectDebit/EEG_Pronamic_DirectDebit.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_DirectDebit/EEG_Pronamic_DirectDebit.gateway.php new file mode 100644 index 00000000..21aa27e4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_DirectDebit/EEG_Pronamic_DirectDebit.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\DirectDebitGateway', 'EEG_Pronamic_DirectDebit' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_DirectDebit/EE_PMT_Pronamic_DirectDebit.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_DirectDebit/EE_PMT_Pronamic_DirectDebit.pm.php new file mode 100644 index 00000000..c26565c2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_DirectDebit/EE_PMT_Pronamic_DirectDebit.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\DirectDebitPaymentMethod', 'EE_PMT_Pronamic_DirectDebit' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Giropay/EEG_Pronamic_Giropay.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Giropay/EEG_Pronamic_Giropay.gateway.php new file mode 100644 index 00000000..0eb6d559 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Giropay/EEG_Pronamic_Giropay.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\GiropayGateway', 'EEG_Pronamic_Giropay' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Giropay/EE_PMT_Pronamic_Giropay.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Giropay/EE_PMT_Pronamic_Giropay.pm.php new file mode 100644 index 00000000..97819ee9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Giropay/EE_PMT_Pronamic_Giropay.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\GiropayPaymentMethod', 'EE_PMT_Pronamic_Giropay' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDeal/EEG_Pronamic_IDeal.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDeal/EEG_Pronamic_IDeal.gateway.php new file mode 100644 index 00000000..aa1572e1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDeal/EEG_Pronamic_IDeal.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\IDealGateway', 'EEG_Pronamic_IDeal' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDeal/EE_PMT_Pronamic_IDeal.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDeal/EE_PMT_Pronamic_IDeal.pm.php new file mode 100644 index 00000000..7271cfd7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDeal/EE_PMT_Pronamic_IDeal.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\IDealPaymentMethod', 'EE_PMT_Pronamic_IDeal' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDealQR/EEG_Pronamic_IDealQR.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDealQR/EEG_Pronamic_IDealQR.gateway.php new file mode 100644 index 00000000..425cfdc3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDealQR/EEG_Pronamic_IDealQR.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\IDealQRGateway', 'EEG_Pronamic_IDealQR' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDealQR/EE_PMT_Pronamic_IDealQR.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDealQR/EE_PMT_Pronamic_IDealQR.pm.php new file mode 100644 index 00000000..9545d069 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_IDealQR/EE_PMT_Pronamic_IDealQR.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\IDealQRPaymentMethod', 'EE_PMT_Pronamic_IDealQR' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_KBC/EEG_Pronamic_KBC.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_KBC/EEG_Pronamic_KBC.gateway.php new file mode 100644 index 00000000..0760a75c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_KBC/EEG_Pronamic_KBC.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\KBCGateway', 'EEG_Pronamic_KBC' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_KBC/EE_PMT_Pronamic_KBC.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_KBC/EE_PMT_Pronamic_KBC.pm.php new file mode 100644 index 00000000..e1b7e6dd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_KBC/EE_PMT_Pronamic_KBC.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\KBCPaymentMethod', 'EE_PMT_Pronamic_KBC' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_PayPal/EEG_Pronamic_PayPal.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_PayPal/EEG_Pronamic_PayPal.gateway.php new file mode 100644 index 00000000..3f241636 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_PayPal/EEG_Pronamic_PayPal.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\PayPalGateway', 'EEG_Pronamic_PayPal' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_PayPal/EE_PMT_Pronamic_PayPal.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_PayPal/EE_PMT_Pronamic_PayPal.pm.php new file mode 100644 index 00000000..a5a633b7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_PayPal/EE_PMT_Pronamic_PayPal.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\PayPalPaymentMethod', 'EE_PMT_Pronamic_PayPal' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Payconiq/EEG_Pronamic_Payconiq.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Payconiq/EEG_Pronamic_Payconiq.gateway.php new file mode 100644 index 00000000..06a5018b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Payconiq/EEG_Pronamic_Payconiq.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\PayconiqGateway', 'EEG_Pronamic_Payconiq' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Payconiq/EE_PMT_Pronamic_Payconiq.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Payconiq/EE_PMT_Pronamic_Payconiq.pm.php new file mode 100644 index 00000000..8e974ce7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Payconiq/EE_PMT_Pronamic_Payconiq.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\PayconiqPaymentMethod', 'EE_PMT_Pronamic_Payconiq' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Sofort/EEG_Pronamic_Sofort.gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Sofort/EEG_Pronamic_Sofort.gateway.php new file mode 100644 index 00000000..1596ba92 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Sofort/EEG_Pronamic_Sofort.gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\SofortGateway', 'EEG_Pronamic_Sofort' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Sofort/EE_PMT_Pronamic_Sofort.pm.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Sofort/EE_PMT_Pronamic_Sofort.pm.php new file mode 100644 index 00000000..53fafe52 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/event-espresso/src/ee/payment-methods/Pronamic_Sofort/EE_PMT_Pronamic_Sofort.pm.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\EventEspresso + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\EventEspresso\SofortPaymentMethod', 'EE_PMT_Pronamic_Sofort' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.css new file mode 100644 index 00000000..6f8ef3aa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.css @@ -0,0 +1,35 @@ +/* line 1, ../scss/admin.scss */ +.pronamic-pay-formidable-icon { + background-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjU2IDBjMTQxLjM4NSAwIDI1NiAxMTQuNjE1IDI1NiAyNTZTMzk3LjM4NSA1MTIgMjU2IDUxMmMtNDguODUgMC05NC41MDQtMTMuNjgyLTEzMy4zNC0zNy40MjRMMTc0LjU1OCAzODRoOTIuOTg4YzcwLjY5MyAwIDEyOC01Ny4zMDggMTI4LTEyOCAwLTcwLjY5Mi01Ny4zMDctMTI4LTEyOC0xMjhoLTQ2LjY4MmMtMTUuMjQ4IDAtMjcuNjA4IDEyLjM2LTI3LjYwOCAyNy42MDggMCAxNS4yNDcgMTIuMzYgMjcuNjA4IDI3LjYwOCAyNy42MDhoNDYuNjgyYzQwLjE5OCAwIDcyLjc4NCAzMi41ODYgNzIuNzg0IDcyLjc4NCAwIDQwLjE5OC0zMi41ODYgNzIuNzg0LTcyLjc4NCA3Mi43ODRIMTY3LjE1M2MtMTIuODY5IDAtMjMuNjgxIDguODA1LTI2Ljc0MSAyMC43MmEyOCAyOCAwIDAwLS42MDYgMS45NjZsLTMwLjYyMiAxMTQuMjczQzQzLjE2MSA0MTkuNDQzIDAgMzQyLjc2MiAwIDI1NiAwIDExNC42MTUgMTE0LjYxNSAwIDI1NiAwem0xMS41NDUgMjIwLjg2M2gtNjUuNzU3Yy0xOS40MDYgMC0zNS4xMzcgMTUuNzMxLTM1LjEzNyAzNS4xMzdzMTUuNzMxIDM1LjEzNyAzNS4xMzcgMzUuMTM3aDY1Ljc1N2MxOS40MDYgMCAzNS4xMzctMTUuNzMxIDM1LjEzNy0zNS4xMzdzLTE1LjczMS0zNS4xMzctMzUuMTM3LTM1LjEzN3oiIGZpbGw9IiMxQTFCNDYiLz48L3N2Zz4="); + display: inline-block; + background-repeat: no-repeat; + vertical-align: middle; +} + +/* line 11, ../scss/admin.scss */ +.frm_pronamic_pay_action span .frm-inner-circle.frm-inverse { + background-color: #ffb200; +} + +/* line 22, ../scss/admin.scss */ +.frm_email_settings .frm_single_pronamic_pay_settings .widget-title .frm_form_action_icon .pronamic-pay-formidable-icon { + width: 24px; + height: 24px; + -webkit-filter: invert(100%) saturate(0%) contrast(85%); + filter: invert(100%) saturate(0%) contrast(85%); +} +/* line 32, ../scss/admin.scss */ +.frm_email_settings .frm_single_pronamic_pay_settings:hover .frm_form_action_icon .pronamic-pay-formidable-icon { + -webkit-filter: invert(100%) saturate(0%) contrast(20%); + filter: invert(100%) saturate(0%) contrast(20%); +} + +/* line 42, ../scss/admin.scss */ +.edit_field_type_pronamic_payment_method_select input[type='pronamic_payment_method_select'] { + display: none !important; +} +/* line 47, ../scss/admin.scss */ +.edit_field_type_pronamic_payment_method_select .pronamic-pay-formidable-eip-disable { + color: #aaa; + cursor: default; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.css.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.css.map new file mode 100644 index 00000000..e1595992 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["admin.css"],"names":[],"mappings":"AAAA,gCAAgC;AAChC;EACE,ggCAAggC;EAChgC,sBAAsB;EACtB,6BAA6B;EAC7B,uBAAuB;CACxB;;AAED,iCAAiC;AACjC;EACE,0BAA0B;CAC3B;;AAED,iCAAiC;AACjC;EACE,YAAY;EACZ,aAAa;EACb,wDAAgD;UAAhD,gDAAgD;CACjD;AACD,iCAAiC;AACjC;EACE,wDAAgD;UAAhD,gDAAgD;CACjD;;AAED,iCAAiC;AACjC;EACE,yBAAyB;CAC1B;AACD,iCAAiC;AACjC;EACE,YAAY;EACZ,gBAAgB;CACjB","file":"admin.css","sourcesContent":["/* line 1, ../scss/admin.scss */\n.pronamic-pay-formidable-icon {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjU2IDBjMTQxLjM4NSAwIDI1NiAxMTQuNjE1IDI1NiAyNTZTMzk3LjM4NSA1MTIgMjU2IDUxMmMtNDguODUgMC05NC41MDQtMTMuNjgyLTEzMy4zNC0zNy40MjRMMTc0LjU1OCAzODRoOTIuOTg4YzcwLjY5MyAwIDEyOC01Ny4zMDggMTI4LTEyOCAwLTcwLjY5Mi01Ny4zMDctMTI4LTEyOC0xMjhoLTQ2LjY4MmMtMTUuMjQ4IDAtMjcuNjA4IDEyLjM2LTI3LjYwOCAyNy42MDggMCAxNS4yNDcgMTIuMzYgMjcuNjA4IDI3LjYwOCAyNy42MDhoNDYuNjgyYzQwLjE5OCAwIDcyLjc4NCAzMi41ODYgNzIuNzg0IDcyLjc4NCAwIDQwLjE5OC0zMi41ODYgNzIuNzg0LTcyLjc4NCA3Mi43ODRIMTY3LjE1M2MtMTIuODY5IDAtMjMuNjgxIDguODA1LTI2Ljc0MSAyMC43MmEyOCAyOCAwIDAwLS42MDYgMS45NjZsLTMwLjYyMiAxMTQuMjczQzQzLjE2MSA0MTkuNDQzIDAgMzQyLjc2MiAwIDI1NiAwIDExNC42MTUgMTE0LjYxNSAwIDI1NiAwem0xMS41NDUgMjIwLjg2M2gtNjUuNzU3Yy0xOS40MDYgMC0zNS4xMzcgMTUuNzMxLTM1LjEzNyAzNS4xMzdzMTUuNzMxIDM1LjEzNyAzNS4xMzcgMzUuMTM3aDY1Ljc1N2MxOS40MDYgMCAzNS4xMzctMTUuNzMxIDM1LjEzNy0zNS4xMzdzLTE1LjczMS0zNS4xMzctMzUuMTM3LTM1LjEzN3oiIGZpbGw9IiMxQTFCNDYiLz48L3N2Zz4=\");\n display: inline-block;\n background-repeat: no-repeat;\n vertical-align: middle;\n}\n\n/* line 11, ../scss/admin.scss */\n.frm_pronamic_pay_action span .frm-inner-circle.frm-inverse {\n background-color: #ffb200;\n}\n\n/* line 22, ../scss/admin.scss */\n.frm_email_settings .frm_single_pronamic_pay_settings .widget-title .frm_form_action_icon .pronamic-pay-formidable-icon {\n width: 24px;\n height: 24px;\n filter: invert(100%) saturate(0%) contrast(85%);\n}\n/* line 32, ../scss/admin.scss */\n.frm_email_settings .frm_single_pronamic_pay_settings:hover .frm_form_action_icon .pronamic-pay-formidable-icon {\n filter: invert(100%) saturate(0%) contrast(20%);\n}\n\n/* line 42, ../scss/admin.scss */\n.edit_field_type_pronamic_payment_method_select input[type='pronamic_payment_method_select'] {\n display: none !important;\n}\n/* line 47, ../scss/admin.scss */\n.edit_field_type_pronamic_payment_method_select .pronamic-pay-formidable-eip-disable {\n color: #aaa;\n cursor: default;\n}\n"]} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.min.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.min.css new file mode 100644 index 00000000..cff4c5cd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/css/admin.min.css @@ -0,0 +1 @@ +.pronamic-pay-formidable-icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjU2IDBjMTQxLjM4NSAwIDI1NiAxMTQuNjE1IDI1NiAyNTZTMzk3LjM4NSA1MTIgMjU2IDUxMmMtNDguODUgMC05NC41MDQtMTMuNjgyLTEzMy4zNC0zNy40MjRMMTc0LjU1OCAzODRoOTIuOTg4YzcwLjY5MyAwIDEyOC01Ny4zMDggMTI4LTEyOCAwLTcwLjY5Mi01Ny4zMDctMTI4LTEyOC0xMjhoLTQ2LjY4MmMtMTUuMjQ4IDAtMjcuNjA4IDEyLjM2LTI3LjYwOCAyNy42MDggMCAxNS4yNDcgMTIuMzYgMjcuNjA4IDI3LjYwOCAyNy42MDhoNDYuNjgyYzQwLjE5OCAwIDcyLjc4NCAzMi41ODYgNzIuNzg0IDcyLjc4NCAwIDQwLjE5OC0zMi41ODYgNzIuNzg0LTcyLjc4NCA3Mi43ODRIMTY3LjE1M2MtMTIuODY5IDAtMjMuNjgxIDguODA1LTI2Ljc0MSAyMC43MmEyOCAyOCAwIDAwLS42MDYgMS45NjZsLTMwLjYyMiAxMTQuMjczQzQzLjE2MSA0MTkuNDQzIDAgMzQyLjc2MiAwIDI1NiAwIDExNC42MTUgMTE0LjYxNSAwIDI1NiAwem0xMS41NDUgMjIwLjg2M2gtNjUuNzU3Yy0xOS40MDYgMC0zNS4xMzcgMTUuNzMxLTM1LjEzNyAzNS4xMzdzMTUuNzMxIDM1LjEzNyAzNS4xMzcgMzUuMTM3aDY1Ljc1N2MxOS40MDYgMCAzNS4xMzctMTUuNzMxIDM1LjEzNy0zNS4xMzdzLTE1LjczMS0zNS4xMzctMzUuMTM3LTM1LjEzN3oiIGZpbGw9IiMxQTFCNDYiLz48L3N2Zz4=);display:inline-block;background-repeat:no-repeat;vertical-align:middle}.frm_pronamic_pay_action span .frm-inner-circle.frm-inverse{background-color:#ffb200}.frm_email_settings .frm_single_pronamic_pay_settings .widget-title .frm_form_action_icon .pronamic-pay-formidable-icon{width:24px;height:24px;-webkit-filter:invert(100%) saturate(0) contrast(85%);filter:invert(100%) saturate(0) contrast(85%)}.frm_email_settings .frm_single_pronamic_pay_settings:hover .frm_form_action_icon .pronamic-pay-formidable-icon{-webkit-filter:invert(100%) saturate(0) contrast(20%);filter:invert(100%) saturate(0) contrast(20%)}.edit_field_type_pronamic_payment_method_select input[type=pronamic_payment_method_select]{display:none!important}.edit_field_type_pronamic_payment_method_select .pronamic-pay-formidable-eip-disable{color:#aaa;cursor:default} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.js new file mode 100644 index 00000000..66a27b88 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.js @@ -0,0 +1,38 @@ +/** + * Prevent editing built-in payment methods values. + */ +function pronamicPayPreventEditingBuiltInPaymentMethods() { + jQuery( '.edit_field_type_pronamic_payment_method_select .frm_ipe_field_option_key' ).each( function () { + var option_key = jQuery( this ); + + if ( option_key.text().match( '^pronamic\_pay' ) ) { + option_key.addClass( 'pronamic-pay-formidable-eip-disable' ); + } + } ); + + jQuery( '.frm_ipe_field_option, .frm_ipe_field_option_key' ).on( 'mouseenter', function () { + var option_key = jQuery( this ); + + if ( option_key.hasClass( 'pronamic-pay-formidable-eip-disable' ) ) { + option_key.unbind( '.editInPlace' ); + option_key.addClass( 'pronamic-pay-formidable-eip-disable' ); + + return false; + } + } ); +} + +( function ( $ ) { + /** + * Ready. + */ + $( document ).ready( function() { + // Prevent editing built-in payment methods values. + pronamicPayPreventEditingBuiltInPaymentMethods(); + + $( document ).ajaxSuccess( function() { + // Prevent editing built-in payment methods values. + pronamicPayPreventEditingBuiltInPaymentMethods(); + } ); + } ); +} )( jQuery ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.min.js new file mode 100644 index 00000000..0fef1fcd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.min.js @@ -0,0 +1,2 @@ +function pronamicPayPreventEditingBuiltInPaymentMethods(){jQuery(".edit_field_type_pronamic_payment_method_select .frm_ipe_field_option_key").each(function(){var e=jQuery(this);e.text().match("^pronamic_pay")&&e.addClass("pronamic-pay-formidable-eip-disable")}),jQuery(".frm_ipe_field_option, .frm_ipe_field_option_key").on("mouseenter",function(){var e=jQuery(this);if(e.hasClass("pronamic-pay-formidable-eip-disable"))return e.unbind(".editInPlace"),e.addClass("pronamic-pay-formidable-eip-disable"),!1})}!function(e){e(document).ready(function(){pronamicPayPreventEditingBuiltInPaymentMethods(),e(document).ajaxSuccess(function(){pronamicPayPreventEditingBuiltInPaymentMethods()})})}(jQuery); +//# sourceMappingURL=admin.min.js.map \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.min.js.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.min.js.map new file mode 100644 index 00000000..4a80a7de --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/js/admin.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["admin.js"],"names":["pronamicPayPreventEditingBuiltInPaymentMethods","jQuery","each","option_key","this","text","match","addClass","on","hasClass","unbind","$","document","ready","ajaxSuccess"],"mappings":"AAGA,SAASA,iDACRC,OAAQ,6EAA8EC,KAAM,WAC3F,IAAIC,EAAaF,OAAQG,MAEpBD,EAAWE,OAAOC,MAAO,kBAC7BH,EAAWI,SAAU,yCAIvBN,OAAQ,oDAAqDO,GAAI,aAAc,WAC9E,IAAIL,EAAaF,OAAQG,MAEzB,GAAKD,EAAWM,SAAU,uCAIzB,OAHAN,EAAWO,OAAQ,gBACnBP,EAAWI,SAAU,wCAEd,KAKV,SAAaI,GAIZA,EAAGC,UAAWC,MAAO,WAEpBb,iDAEAW,EAAGC,UAAWE,YAAa,WAE1Bd,qDAVH,CAaKC","file":"admin.min.js"} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/scss/admin.scss b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/scss/admin.scss new file mode 100644 index 00000000..7f949360 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/scss/admin.scss @@ -0,0 +1,51 @@ +.pronamic-pay-formidable-icon { + background-image: url('data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjU2IDBjMTQxLjM4NSAwIDI1NiAxMTQuNjE1IDI1NiAyNTZTMzk3LjM4NSA1MTIgMjU2IDUxMmMtNDguODUgMC05NC41MDQtMTMuNjgyLTEzMy4zNC0zNy40MjRMMTc0LjU1OCAzODRoOTIuOTg4YzcwLjY5MyAwIDEyOC01Ny4zMDggMTI4LTEyOCAwLTcwLjY5Mi01Ny4zMDctMTI4LTEyOC0xMjhoLTQ2LjY4MmMtMTUuMjQ4IDAtMjcuNjA4IDEyLjM2LTI3LjYwOCAyNy42MDggMCAxNS4yNDcgMTIuMzYgMjcuNjA4IDI3LjYwOCAyNy42MDhoNDYuNjgyYzQwLjE5OCAwIDcyLjc4NCAzMi41ODYgNzIuNzg0IDcyLjc4NCAwIDQwLjE5OC0zMi41ODYgNzIuNzg0LTcyLjc4NCA3Mi43ODRIMTY3LjE1M2MtMTIuODY5IDAtMjMuNjgxIDguODA1LTI2Ljc0MSAyMC43MmEyOCAyOCAwIDAwLS42MDYgMS45NjZsLTMwLjYyMiAxMTQuMjczQzQzLjE2MSA0MTkuNDQzIDAgMzQyLjc2MiAwIDI1NiAwIDExNC42MTUgMTE0LjYxNSAwIDI1NiAwem0xMS41NDUgMjIwLjg2M2gtNjUuNzU3Yy0xOS40MDYgMC0zNS4xMzcgMTUuNzMxLTM1LjEzNyAzNS4xMzdzMTUuNzMxIDM1LjEzNyAzNS4xMzcgMzUuMTM3aDY1Ljc1N2MxOS40MDYgMCAzNS4xMzctMTUuNzMxIDM1LjEzNy0zNS4xMzdzLTE1LjczMS0zNS4xMzctMzUuMTM3LTM1LjEzN3oiIGZpbGw9IiMxQTFCNDYiLz48L3N2Zz4='); + display: inline-block; + background-repeat: no-repeat; + vertical-align: middle; +} + +.frm_pronamic_pay_action { + span { + .frm-inner-circle { + &.frm-inverse { + background-color: #ffb200; + } + } + } +} + +.frm_email_settings { + .frm_single_pronamic_pay_settings { + .widget-title { + .frm_form_action_icon { + .pronamic-pay-formidable-icon { + width: 24px; + height: 24px; + filter: invert(100%) saturate(0%) contrast(85%); + } + } + } + + &:hover { + .frm_form_action_icon { + .pronamic-pay-formidable-icon { + filter: invert(100%) saturate(0%) contrast(20%); + } + } + } + } +} + +.edit_field_type_pronamic_payment_method_select { + input { + &[type='pronamic_payment_method_select'] { + display: none !important; + } + } + + .pronamic-pay-formidable-eip-disable { + color: #aaa; + cursor: default; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php new file mode 100644 index 00000000..f6896109 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/BankSelectFieldType.php @@ -0,0 +1,162 @@ +render_admin_field( $field ); + } + } + + /** + * Render admin field. + * + * @param array $field Field. + */ + private function render_admin_field( $field ) { + $this->render_field( $field ); + } + + /** + * Form fields. + * + * @link https://formidableforms.com/knowledgebase/add-a-new-field/ + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/views/frm-fields/input.php#L171 + * + * @param array $field Field. + */ + public function form_fields( $field ) { + if ( self::ID === $field['type'] ) { + $this->render_field( $field ); + } + } + + /** + * Render field. + * + * @param array $field Field. + */ + private function render_field( $field ) { + $config_id = get_option( 'pronamic_pay_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + // Always use iDEAL payment method for issuer field. + $payment_method = $gateway->get_payment_method(); + + $gateway->set_payment_method( PaymentMethods::IDEAL ); + + try { + $issuer_field = $gateway->get_issuer_field(); + + $choices = $issuer_field['choices']; + $options = Util::select_options_grouped( $choices ); + + printf( + ''; + } catch ( \Exception $e ) { + printf( + '%s
    %s', + esc_html( Plugin::get_default_error_message() ), + esc_html( $e->getMessage() ) + ); + } + + // Reset payment method to original value. + $gateway->set_payment_method( $payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/Extension.php new file mode 100644 index 00000000..030465b6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/Extension.php @@ -0,0 +1,569 @@ + __( 'Formidable Forms', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new FormidableFormsDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + add_action( 'pronamic_payment_status_update_' . self::SLUG, array( $this, 'update_status' ), 10, 2 ); + add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + + add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); + + // @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/controllers/FrmFormActionsController.php#L39-L57 + // @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentSettingsController.php#L11 + add_action( 'frm_registered_form_actions', array( $this, 'registered_form_actions' ) ); + + // @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/controllers/FrmFormActionsController.php#L299-L308 + // @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentsController.php#L28-L29 + add_action( 'frm_trigger_pronamic_pay_create_action', array( $this, 'create_action' ), 10, 3 ); + + // @link https://github.com/wp-premium/formidable-paypal/blob/3.06/controllers/FrmPaymentSettingsController.php#L15-L19 + add_filter( 'frm_action_triggers', array( $this, 'add_payment_trigger' ) ); + add_filter( 'frm_email_action_options', array( $this, 'add_trigger_to_action' ) ); + add_filter( 'frm_twilio_action_options', array( $this, 'add_trigger_to_action' ) ); + add_filter( 'frm_mailchimp_action_options', array( $this, 'add_trigger_to_action' ) ); + add_filter( 'frm_register_action_options', array( $this, 'add_payment_trigger_to_register_user_action' ) ); + + // Field types. + $this->field_type_bank_select = new BankSelectFieldType(); + + if ( FormidableForms::version_compare( '3.0.0', '>' ) ) { + $this->field_type_payment_method_select = new PaymentMethodSelectFieldType(); + } + } + + /** + * Admin enqueue scripts. + */ + public function admin_enqueue_scripts() { + $screen = get_current_screen(); + + $in_form_editor = ( 'toplevel_page_formidable' === $screen->id && 'edit' === filter_input( INPUT_GET, 'frm_action', FILTER_SANITIZE_STRING ) ); + $in_settings = ( 'toplevel_page_formidable' === $screen->id && 'settings' === filter_input( INPUT_GET, 'frm_action', FILTER_SANITIZE_STRING ) ); + + if ( ! $in_form_editor && ! $in_settings ) { + return; + } + + $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + + wp_register_style( + 'pronamic-pay-formidable-forms', + plugins_url( 'css/admin' . $min . '.css', dirname( __FILE__ ) ), + array(), + '1.0.0' + ); + + wp_register_script( + 'pronamic-pay-formidable-forms', + plugins_url( 'js/admin' . $min . '.js', dirname( __FILE__ ) ), + array( 'jquery' ), + '1.0.0', + true + ); + + wp_enqueue_style( 'pronamic-pay-formidable-forms' ); + + wp_enqueue_script( 'pronamic-pay-formidable-forms' ); + } + + /** + * Update entry payment status of the specified payment + * + * @param Payment $payment Payment. + * @param bool $can_redirect Whether or not to redirect. + * + * @since unreleased + */ + public function update_status( Payment $payment, $can_redirect = false ) { + $entry_id = $payment->get_source_id(); + $entry = FrmEntry::getOne( $entry_id ); + + $status = get_post_meta( $payment->get_id(), '_pronamic_pay_formidable_forms_status', true ); + + // Return if status has not changed. + if ( $status === $payment->status ) { + return; + } + + update_post_meta( $payment->get_id(), '_pronamic_pay_formidable_forms_status', $payment->status ); + + switch ( $payment->status ) { + case PaymentStatus::CANCELLED: + FrmFormActionsController::trigger_actions( 'pronamic-pay-cancelled', $entry->form_id, $entry->id ); + break; + case PaymentStatus::EXPIRED: + FrmFormActionsController::trigger_actions( 'pronamic-pay-expired', $entry->form_id, $entry->id ); + break; + case PaymentStatus::FAILURE: + FrmFormActionsController::trigger_actions( 'pronamic-pay-failure', $entry->form_id, $entry->id ); + break; + case PaymentStatus::SUCCESS: + FrmFormActionsController::trigger_actions( 'pronamic-pay-success', $entry->form_id, $entry->id ); + + // Send delayed notifications. + $form_actions = FrmFormAction::get_action_for_form( $entry->form_id ); + + $action_id = get_post_meta( $payment->get_id(), '_pronamic_pay_formidable_forms_action_id', true ); + + if ( isset( $form_actions[ $action_id ] ) ) { + $action = $form_actions[ $action_id ]; + + if ( isset( $action->post_content['pronamic_pay_delay_notifications'] ) ) { + $this->send_email_now( $entry ); + } + } + + break; + case PaymentStatus::OPEN: + FrmFormActionsController::trigger_actions( 'pronamic-pay-pending', $entry->form_id, $entry->id ); + } + } + + /** + * Redirect URL. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * @return string + * @since 2.2.0 + */ + public function redirect_url( $url, Payment $payment ) { + // Check payment status. + if ( PaymentStatus::SUCCESS !== $payment->get_status() ) { + return $url; + } + + // Get entry and form. + $entry_id = $payment->get_source_id(); + + $entry = FrmEntry::getOne( $entry_id ); + + $form = FrmForm::getOne( $entry->form_id ); + + // Check if redirect success URL should be used. + if ( 'redirect' === $form->options['success_action'] ) { + $success_url = \trim( $form->options['success_url'] ); + + $success_url = \apply_filters( 'frm_content', $success_url, $form, $entry_id ); + + $success_url = \do_shortcode( $success_url ); + + $success_url = \filter_var( $success_url, \FILTER_SANITIZE_URL ); + + // Return success URL from settings. + if ( ! empty( $success_url ) ) { + return $success_url; + } + } + + // Return default URL. + return $url; + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public static function source_text( $text, Payment $payment ) { + $text = __( 'Formidable Forms', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + add_query_arg( + array( + 'page' => 'formidable-entries', + 'frm_action' => 'show', + 'id' => $payment->get_source_id(), + ), + admin_url( 'admin.php' ) + ), + sprintf( + /* translators: %s: source id */ + __( 'Entry #%s', 'pronamic_ideal' ), + $payment->get_source_id() + ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Payment. + * + * @return string|void + */ + public function source_description( $description, Payment $payment ) { + return __( 'Formidable Forms Entry', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + $url = add_query_arg( + array( + 'page' => 'formidable-entries', + 'frm_action' => 'show', + 'id' => $payment->get_source_id(), + ), + admin_url( 'admin.php' ) + ); + + return $url; + } + + /** + * Registered form actions. + * + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentSettingsController.php#L125-L128 + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/models/FrmPaymentAction.php + * + * @param array $actions Formidable Forms form actions. + * + * @return array + */ + public function registered_form_actions( $actions ) { + $actions['pronamic_pay'] = __NAMESPACE__ . '\PaymentAction'; + + return $actions; + } + + /** + * Create action. + * + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/controllers/FrmFormActionsController.php#L299-L308 + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentsController.php#L186-L193 + * + * @param FrmFormAction $action Action. + * @param FrmEntry $entry Entry. + * @param FrmForm $form Form. + */ + public function create_action( $action, $entry, $form ) { + /* + * Save config ID in object var for use building redirect url. + * + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentsController.php#L264-L266 + */ + $this->action = $action; + + // @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentsController.php#L268-L269 + // @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/models/FrmEntry.php#L698-L711 + add_action( 'frm_after_create_entry', array( $this, 'redirect_for_payment' ), 50, 2 ); + + // Delay notifications. + if ( ! self::$send_email_now && isset( $action->post_content['pronamic_pay_delay_notifications'] ) && 'on' === $action->post_content['pronamic_pay_delay_notifications'] ) { + remove_action( 'frm_trigger_email_action', 'FrmNotification::trigger_email', 10 ); + add_filter( 'frm_to_email', '__return_empty_array', 20 ); + add_filter( 'frm_send_new_user_notification', array( __CLASS__, 'stop_registration_email' ), 10, 3 ); + } + } + + /** + * Redirect for payment. + * + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/controllers/FrmPaymentsController.php#L274-L311 + * + * @param int $entry_id Entry ID. + * @param int $form_id Form ID. + */ + public function redirect_for_payment( $entry_id, $form_id ) { + $config_id = get_option( 'pronamic_pay_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + $entry = \FrmEntry::getOne( $entry_id, true ); + + /** + * Build payment. + */ + $payment = new Payment(); + + $payment->source = 'formidable-forms'; + $payment->source_id = $entry_id; + $payment->order_id = $entry_id; + + $payment->description = FormidableFormsHelper::get_description( $this->action, $form_id, $entry, $entry_id ); + + if ( empty( $payment->description ) ) { + $payment->description = sprintf( + '%s #%s', + __( 'Submission', 'pronamic_ideal' ), + $payment->source_id + ); + } + + $payment->title = \sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + \sprintf( + __( 'Formidable entry %s', 'pronamic_ideal' ), + $entry_id + ) + ); + + // Currency. + $currency = Currency::get_instance( FormidableFormsHelper::get_currency_from_settings() ); + + // Amount. + $payment->set_total_amount( new TaxedMoney( FormidableFormsHelper::get_amount_from_field( $this->action, $entry ), $currency ) ); + + // Method. + $payment->method = FormidableFormsHelper::get_payment_method_from_action_entry( $this->action, $entry ); + + // Only start payments for known/active payment methods. + if ( is_string( $payment->method ) && ! PaymentMethods::is_active( $payment->method ) ) { + return; + } + + if ( empty( $payment->method ) ) { + if ( null !== FormidableFormsHelper::get_issuer_from_form_entry( $form_id, $entry ) ) { + $payment->method = PaymentMethods::IDEAL; + } elseif ( $gateway->payment_method_is_required() ) { + $payment->method = PaymentMethods::IDEAL; + } + } + + // Issuer. + $payment->issuer = FormidableFormsHelper::get_issuer_from_form_entry( $form_id, $entry ); + + // Origin. + $payment->set_origin_id( FormidableFormsHelper::get_origin_id_from_entry( $entry ) ); + + // Configuration. + $payment->config_id = $config_id; + + try { + $payment = Plugin::start_payment( $payment ); + + // Save form action ID for reference on status update. + update_post_meta( $payment->get_id(), '_pronamic_pay_formidable_forms_action_id', $this->action->ID ); + + if ( wp_doing_ajax() ) { + // Do not use `wp_send_json_success()` as Formidable Forms doesn't properly handle the content type. + echo wp_json_encode( + array( + 'redirect' => $payment->get_pay_redirect_url(), + ) + ); + + exit; + } + + // Redirect. + $gateway->redirect( $payment ); + } catch ( \Exception $e ) { + add_filter( + 'frm_main_feedback', + function ( $message, $form, $entry_id ) use ( $e ) { + $atts = array( + 'class' => FrmFormsHelper::form_error_class(), + 'form' => $form, + 'entry_id' => $entry_id, + 'message' => sprintf( + '%s
    %s', + \esc_html( Plugin::get_default_error_message() ), + \esc_html( sprintf( '%s: %s', $e->getCode(), $e->getMessage() ) ) + ), + ); + + return FrmFormsHelper::get_success_message( $atts ); + }, + 10, + 3 + ); + + return; + } + } + + /** + * Stop registration email. + * + * @param bool $send_it Whether or not to send email. + * @param FrmForm $form Form. + * @param int $entry_id Entry ID. + * + * @return bool + * + * @since unreleased + */ + public static function stop_registration_email( $send_it, $form, $entry_id ) { + if ( ! is_callable( 'FrmRegAppController::send_paid_user_notification' ) ) { + // Don't stop the registration email unless the function + // from the Formidable Registration Add-On exists to send it later. + return $send_it; + } + + return false; + } + + /** + * Send email now. + * + * @param FrmEntry $entry Entry. + * + * @since unreleased + */ + public static function send_email_now( $entry ) { + self::$send_email_now = true; + + // Trigger email action. + if ( is_callable( 'FrmFormActionsController::trigger_actions' ) ) { + // Formidable Forms >= 2.0. + FrmFormActionsController::trigger_actions( 'create', $entry->form_id, $entry->id, 'email' ); + } elseif ( is_callable( 'FrmProNotification::entry_created' ) ) { + // Formidable Forms < 2.0. + FrmProNotification::entry_created( $entry->id, $entry->form_id ); + } + + // Trigger registration email. + if ( is_callable( 'FrmRegNotification::send_paid_user_notification' ) ) { + FrmRegNotification::send_paid_user_notification( $entry ); + } elseif ( is_callable( 'FrmRegAppController::send_paid_user_notification' ) ) { + FrmRegAppController::send_paid_user_notification( $entry ); + } + } + + /** + * Add payment trigger. + * + * @param array $triggers Triggers. + * + * @return array + * + * @since unreleased + */ + public static function add_payment_trigger( $triggers ) { + $triggers['pronamic-pay-pending'] = __( 'Pronamic payment pending', 'pronamic_ideal' ); + $triggers['pronamic-pay-success'] = __( 'Pronamic payment success', 'pronamic_ideal' ); + $triggers['pronamic-pay-cancelled'] = __( 'Pronamic payment cancelled', 'pronamic_ideal' ); + $triggers['pronamic-pay-expired'] = __( 'Pronamic payment expired', 'pronamic_ideal' ); + $triggers['pronamic-pay-failed'] = __( 'Pronamic payment failed', 'pronamic_ideal' ); + + return $triggers; + } + + /** + * Add trigger to action. + * + * @param array $options Options. + * + * @return array + * + * @since unreleased + */ + public static function add_trigger_to_action( $options ) { + $options['event'][] = 'pronamic-pay-pending'; + $options['event'][] = 'pronamic-pay-success'; + $options['event'][] = 'pronamic-pay-cancelled'; + $options['event'][] = 'pronamic-pay-expired'; + $options['event'][] = 'pronamic-pay-failed'; + + return $options; + } + + /** + * Add payment trigger to registration 2.0+ + * + * @param array $options Options. + * + * @return array + * + * @since unreleased + */ + public static function add_payment_trigger_to_register_user_action( $options ) { + if ( is_callable( 'FrmRegUserController::register_user' ) ) { + $options['event'][] = 'pronamic-pay-success'; + } + + return $options; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/FormidableForms.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/FormidableForms.php new file mode 100644 index 00000000..016df045 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/FormidableForms.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\FormidableForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\FormidableForms; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Formidable Forms Dependency + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class FormidableFormsDependency extends Dependency { + /** + * Is met. + * + * @link + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \class_exists( '\FrmAppHelper' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/FormidableFormsHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/FormidableFormsHelper.php new file mode 100644 index 00000000..cd151008 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/FormidableFormsHelper.php @@ -0,0 +1,174 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\FormidableForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\FormidableForms; + +use FrmField; +use FrmFieldsHelper; +use FrmProAppHelper; +use Pronamic\WordPress\Money\Parser; + +/** + * Formidable Forms Helper + * + * @author Remco Tolsma + * @version 2.2.0 + * @since 2.2.0 + */ +class FormidableFormsHelper { + /** + * Get currency from settings. + * + * @return string + */ + public static function get_currency_from_settings() { + $currency = null; + + // Try to get currency from Formidable Form settings. + if ( \class_exists( '\FrmProAppHelper' ) ) { + $settings = FrmProAppHelper::get_settings(); + + $currency = \trim( $settings->currency ); + } + + // Check empty currency. + if ( empty( $currency ) ) { + $currency = 'EUR'; + } + + return $currency; + } + + /** + * Get description. + * + * @param unknown $action Action. + * @param int $form_id Form ID. + * @param unknown $entry Entry. + * @param int $entry_id Entry ID. + * @return string + */ + public static function get_description( $action, $form_id, $entry, $entry_id ) { + // Description template. + $description_template = $action->post_content['pronamic_pay_transaction_description']; + + /* + * Find shortcode. + * + * @link https://github.com/wp-premium/formidable/blob/2.0.22/classes/helpers/FrmFieldsHelper.php#L684-L696 + */ + $shortcodes = FrmFieldsHelper::get_shortcodes( $description_template, $form_id ); + + /* + * Replace shortcodes. + * + * @link https://github.com/wp-premium/formidable/blob/2.0.22/classes/helpers/FrmFieldsHelper.php#L715-L821 + */ + $description = FrmFieldsHelper::replace_content_shortcodes( $description_template, $entry, $shortcodes ); + + // Check if there was a replacement to make sure the description has a dynamic part. + if ( $description_template === $description ) { + $description .= $entry_id; + } + + return $description; + } + + /** + * Get payment method from action/entry. + * + * @param unknowm $action Action. + * @param unknown $entry Entry. + * @return string|null + */ + public static function get_payment_method_from_action_entry( $action, $entry ) { + $payment_method = null; + + $payment_method_field = $action->post_content['pronamic_pay_payment_method_field']; + + if ( ! empty( $payment_method_field ) && isset( $entry->metas[ $payment_method_field ] ) ) { + $payment_method = $entry->metas[ $payment_method_field ]; + + $replacements = array( + 'pronamic_pay_' => '', + 'pronamic_pay' => '', + ); + + $payment_method = strtr( $payment_method, $replacements ); + + if ( empty( $payment_method ) ) { + $payment_method = null; + } + } + + return $payment_method; + } + + /** + * Get issuer from form entry. + * + * @param int $form_id Form ID. + * @param unknown $entry Entry. + * @return string|null + */ + public static function get_issuer_from_form_entry( $form_id, $entry ) { + $bank = null; + + $bank_fields = FrmField::get_all_types_in_form( $form_id, 'pronamic_bank_select' ); + + $bank_field = reset( $bank_fields ); + + if ( $bank_field && isset( $entry->metas[ $bank_field->id ] ) ) { + $bank = $entry->metas[ $bank_field->id ]; + } + + return $bank; + } + + /** + * Get amount from field. + * + * @param unknowm $action Action. + * @param unknown $entry Entry. + * @return float + */ + public static function get_amount_from_field( $action, $entry ) { + $amount = 0; + + $amount_field = $action->post_content['pronamic_pay_amount_field']; + + if ( ! empty( $amount_field ) && isset( $entry->metas[ $amount_field ] ) ) { + $parser = new Parser(); + + $amount = $parser->parse( $entry->metas[ $amount_field ] )->get_value(); + } + + return $amount; + } + + /** + * Get origin post ID from entry. + * + * @since 2.1.3 + * @return int|null + */ + public static function get_origin_id_from_entry( $entry ) { + // Get origin post ID via referrer in entry. + if ( \property_exists( $entry, 'description' ) && \is_array( $entry->description ) && isset( $entry->description['referrer'] ) ) { + $post_id = \url_to_postid( $entry->description['referrer'] ); + + if ( $post_id > 0 ) { + return $post_id; + } + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/PaymentAction.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/PaymentAction.php new file mode 100644 index 00000000..c652bd9f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/PaymentAction.php @@ -0,0 +1,83 @@ + 'pronamic-pay-formidable-icon frm-inverse', + 'color' => '#ffb200', + 'active' => true, + 'event' => array( 'create' ), + 'priority' => 9, // trigger before emails are sent so they can be stopped. + 'limit' => 99, + ) + ); + } + + /** + * Form. + * + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/models/FrmFormAction.php#L31-L39 + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/models/FrmPaymentAction.php#L37-L42 + * + * @param array $instance Current settings. + * @param array $args Arguments. + */ + public function form( $instance, $args = array() ) { + $form_fields = $this->get_field_options( $args['form']->id ); + + include \dirname( __FILE__ ) . '/../views/payment-settings.php'; + } + + /** + * Get field options. + * + * @link https://github.com/wp-premium/formidable-paypal/blob/3.02/models/FrmPaymentAction.php#L37-L42 + * + * @param int $form_id Form ID. + * + * @return array + */ + private function get_field_options( $form_id ) { + $form_fields = FrmField::getAll( + array( + 'fi.form_id' => \absint( $form_id ), + 'fi.type not' => array( 'divider', 'end_divider', 'html', 'break', 'captcha', 'rte', 'form' ), + ), + 'field_order' + ); + + return $form_fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php new file mode 100644 index 00000000..8e81e110 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/src/PaymentMethodSelectFieldType.php @@ -0,0 +1,408 @@ +' ) ) { + $icon = 'frm_credit-card-alt_icon'; + + if ( FormidableForms::version_compare( '4.0.0', '>' ) ) { + $icon = 'frm_credit_card_alt_icon'; + } + + // Add icon in Formidable Forms 3.0+. + $fields[ self::ID ] = array( + 'name' => __( 'Payment Method', 'pronamic_ideal' ), + 'icon' => 'frm_icon_font ' . $icon, + ); + } + + return $fields; + } + + /** + * Before field created. + * + * @link https://formidableforms.com/knowledgebase/add-a-new-field/ + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/controllers/FrmFieldsController.php#L74 + * + * @param array $field_data Field data. + * + * @return array + */ + public function before_field_created( $field_data ) { + if ( self::ID === $field_data['type'] ) { + $field_data['name'] = __( 'Choose a payment method', 'pronamic_ideal' ); + + $defaults = array( + 'separate_value' => 1, + ); + + $field_data['field_options'] = array_merge( $field_data['field_options'], $defaults ); + } + + return $field_data; + } + + /** + * Setup field editor variables. + * + * @param array $field Field as array. + * + * @return array + */ + public function edit_fields_vars( $field ) { + // Check original field type. + if ( self::ID !== $field['original_type'] ) { + return $field; + } + + // Set field type 'select'. + $field['type'] = 'select'; + + if ( FormidableForms::version_compare( '4.0.0', '>' ) ) { + $this->in_field_options = true; + + $field['original_type'] = 'select'; + + if ( empty( $field['options'] ) ) { + $field['options'] = $this->get_payment_methods(); + } + } + + return $field; + } + + /** + * Filter available field types to switch to in field options. + * + * @param array $field_types Array of field types that can be switched to. + * @param string $type Field type to get switch options for. + * + * @return array + */ + public function switch_field_types( $field_types, $type ) { + if ( ! $this->in_field_options ) { + return $field_types; + } + + $this->in_field_options = false; + + return array( + self::ID => array( + 'name' => __( 'Payment Methods', 'pronamic_ideal' ), + 'icon' => 'frm_icon_font frm_', + ), + ); + } + + /** + * Update field options. + * + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/views/frm-fields/show-build.php#L64https://github.com/wp-premium/formidable/blob/2.0.21/classes/models/FrmForm.php#L256 + * + * @param array $field_options Field options. + * @param FrmFieldType $field Field object. + * @param array $values Field values. + * + * @return array + */ + public function update_field_options( $field_options, $field, $values ) { + if ( self::ID !== $field->type ) { + return $field_options; + } + + $field_options['separate_value'] = 1; + + return $field_options; + } + + /** + * Display added fields. + * + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/views/frm-fields/show-build.php#L64 + * + * @param array $field Field. + */ + public function display_added_fields( $field ) { + if ( self::ID !== $field['original_type'] ) { + return; + } + + $this->in_field_options = true; + + $payment_method_select = FrmFieldFactory::get_field_type( self::ID ); + + $display = $payment_method_select->display_field_settings(); + + $field_name = sprintf( 'item_meta[%s]', $field['id'] ); + $html_id = sprintf( 'field_%s', $field['field_key'] ); + $field['html_name'] = $field_name; + $field['html_id'] = $html_id; + + if ( FormidableForms::version_compare( '4.0.0', '<' ) ) { + // Set options for field editor. + $options = $field['options']; + + if ( empty( $options ) ) { + $options = $this->get_payment_methods(); + } + + $field['options'] = $options; + } + + // Temporarily change field type. + $field['type'] = 'select'; + + require \FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/dropdown-field.php'; + } + + /** + * Form fields. + * + * @link https://formidableforms.com/knowledgebase/add-a-new-field/ + * @link https://github.com/wp-premium/formidable/blob/2.0.21/classes/views/frm-fields/input.php#L171 + * + * @param array $field Field. + */ + public function form_fields( $field ) { + if ( self::ID !== $field['type'] ) { + return; + } + + $field_name = sprintf( 'item_meta[%s]', $field['id'] ); + $html_id = sprintf( 'field_%s', $field['field_key'] ); + $field['html_name'] = $field_name; + $field['html_id'] = $html_id; + + // Set front-end options. + if ( empty( $field['options'] ) ) { + $field['options'] = $this->get_payment_methods(); + } + + // Read only. + $read_only = isset( $field['read_only'] ) ? $field['read_only'] : false; + + require \FrmAppHelper::plugin_path() . '/classes/views/frm-fields/front-end/dropdown-field.php'; + } + + /** + * Display value for field. + * + * @param string $value Field value. + * + * @return string + */ + public function display_field_value( $value ) { + if ( empty( $value ) ) { + return $value; + } + + $payment_methods = $this->get_payment_methods(); + + foreach ( $payment_methods as $payment_method ) { + if ( $value !== $payment_method['value'] ) { + continue; + } + + $value = $payment_method['label']; + } + + return $value; + } + + /** + * Bulk field choices. + * + * @param array $choices Bulk editor choices. + * + * @return array + */ + public function bulk_field_choices( $choices ) { + $methods = array(); + + $payment_methods = $this->get_payment_methods(); + + foreach ( $payment_methods as $payment_method ) { + $methods[] = sprintf( + '%1$s|%2$s', + $payment_method['label'], + $payment_method['value'] + ); + } + + $choices[ __( 'Payment Methods', 'pronamic_ideal' ) ] = $methods; + + return $choices; + } + + /** + * Import options from bulk editor. + */ + public function import_options() { + FrmAppHelper::permission_check( 'frm_edit_forms' ); + + check_ajax_referer( 'frm_ajax', 'nonce' ); + + if ( ! is_admin() || ! current_user_can( 'frm_edit_forms' ) ) { + return; + } + + if ( ! filter_has_var( INPUT_POST, 'field_id' ) ) { + return; + } + + $field_id = filter_input( INPUT_POST, 'field_id', FILTER_SANITIZE_STRING ); + + $field = FrmField::getOne( $field_id ); + + if ( self::ID !== $field->type ) { + return; + } + + $field = FrmFieldsHelper::setup_edit_vars( $field ); + + $options = FrmAppHelper::get_param( 'opts', '', 'post', 'wp_kses_post' ); + $options = explode( "\n", rtrim( $options, "\n" ) ); + $options = array_map( 'trim', $options ); + + foreach ( $options as $option_key => $option ) { + if ( false === strpos( $option, '|' ) ) { + continue; + } + + $values = explode( '|', $option ); + + $label = trim( $values[0] ); + $value = trim( $values[1] ); + + if ( $label !== $value ) { + $options[ $option_key ] = array( + 'label' => $label, + 'value' => $value, + ); + } + } + + $field['options'] = $options; + + FrmFieldsHelper::show_single_option( $field ); + + wp_die(); + } + + /** + * Get payment method options. + */ + public function get_payment_methods() { + $payment_methods = array(); + + $config_id = get_option( 'pronamic_pay_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return $payment_methods; + } + + try { + $options = $gateway->get_payment_method_field_options(); + } catch ( \Exception $e ) { + return $payment_methods; + } + + foreach ( $options as $payment_method => $name ) { + $value = 'pronamic_pay'; + + if ( ! empty( $payment_method ) ) { + $value = sprintf( 'pronamic_pay_%s', $payment_method ); + } + + $payment_methods[] = array( + 'label' => $name, + 'value' => $value, + ); + } + + return $payment_methods; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php new file mode 100644 index 00000000..c93d40d0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/formidable-forms/views/payment-settings.php @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + +
    + + + post_content['pronamic_pay_amount_field']; + + printf( + ''; + + ?> +
    + + + post_content['pronamic_pay_payment_method_field']; + + printf( + ''; + + ?> +
    + + + ', + esc_attr( $this->get_field_name( 'pronamic_pay_transaction_description' ) ), + esc_attr( $instance->post_content['pronamic_pay_transaction_description'] ), + esc_attr__( 'Enter a transactaction description, you can use Formidable Forms shortcodes.', 'pronamic_ideal' ) + ); + + ?> + +
    + + + %s', + esc_attr( $this->get_field_name( 'pronamic_pay_delay_notifications' ) ), + checked( $instance->post_content['pronamic_pay_delay_notifications'], 'on', false ), + esc_attr__( 'Delay email notifications until payment has been received.', 'pronamic_ideal' ) + ); + + ?> + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/BancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/BancontactGateway.php new file mode 100644 index 00000000..f8dd1987 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/BancontactGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give Bancontact gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class BancontactGateway extends Gateway { + /** + * Constructs and initialize Bancontact gateway. + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_mister_cash', + __( 'Bancontact', 'pronamic_ideal' ), + PaymentMethods::BANCONTACT + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/BankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/BankTransferGateway.php new file mode 100644 index 00000000..33e5513c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/BankTransferGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give Bank Transfer gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class BankTransferGateway extends Gateway { + /** + * Constructs and initialize Bank Transfer gateway + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_bank_transfer', + __( 'Bank Transfer', 'pronamic_ideal' ), + PaymentMethods::BANK_TRANSFER + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/CreditCardGateway.php new file mode 100644 index 00000000..4c5e1409 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/CreditCardGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give Credit Card gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class CreditCardGateway extends Gateway { + /** + * Constructs and initialize Credit Card gateway. + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_credit_card', + __( 'Credit Card', 'pronamic_ideal' ), + PaymentMethods::CREDIT_CARD + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/DirectDebitGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/DirectDebitGateway.php new file mode 100644 index 00000000..9eb90f36 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/DirectDebitGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give Direct Debit gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class DirectDebitGateway extends Gateway { + /** + * Constructs and initialize Direct Debit gateway. + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_direct_debit', + __( 'Direct Debit', 'pronamic_ideal' ), + PaymentMethods::DIRECT_DEBIT + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/Extension.php new file mode 100644 index 00000000..a4bc3be2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/Extension.php @@ -0,0 +1,254 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Title: Give extension + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.1 + * @since 1.0.0 + */ +class Extension extends AbstractPluginIntegration { + /** + * Slug + * + * @var string + */ + const SLUG = 'give'; + + /** + * Gateways. + * + * @var array|null + */ + private $gateways; + + /** + * Construct Give plugin integration. + * + * @return void + */ + public function __construct() { + parent::__construct( + array( + 'name' => __( 'Give', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new GiveDependency() ); + } + + /** + * Setup. + * + * @return void + */ + public function setup() { + \add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + \add_action( 'pronamic_payment_status_update_' . self::SLUG, array( $this, 'status_update' ), 10, 1 ); + \add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( $this, 'redirect_url' ), 10, 2 ); + + \add_filter( 'give_payment_gateways', array( $this, 'give_payment_gateways' ) ); + \add_filter( 'give_currencies', array( __CLASS__, 'currencies' ), 10, 1 ); + } + + /** + * Give payments gateways. + * + * @link https://github.com/WordImpress/Give/blob/1.3.6/includes/gateways/functions.php#L37 + * + * @param array $gateways Gateways. + * + * @return array + */ + public function give_payment_gateways( $gateways ) { + if ( null === $this->gateways ) { + $this->gateways = array(); + + $classes = array( + 'Gateway', + 'BancontactGateway', + 'BankTransferGateway', + 'CreditCardGateway', + 'DirectDebitGateway', + 'IDealGateway', + 'SofortGateway', + ); + + if ( PaymentMethods::is_active( PaymentMethods::GULDEN ) ) { + $classes[] = 'GuldenGateway'; + } + + foreach ( $classes as $class ) { + $class = __NAMESPACE__ . '\\' . $class; + + $gateway = new $class(); + + $this->gateways[ $gateway->id ] = array( + 'admin_label' => $gateway->name, + 'checkout_label' => $gateway->name, + ); + } + } + + return array_merge( $gateways, $this->gateways ); + } + + /** + * Payment redirect URL filter. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function redirect_url( $url, $payment ) { + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + case PaymentStatus::FAILURE: + $url = give_get_failed_transaction_uri(); + + break; + case PaymentStatus::SUCCESS: + $url = give_get_success_page_uri(); + + break; + } + + return $url; + } + + /** + * Update lead status of the specified payment + * + * @link https://github.com/Charitable/Charitable/blob/1.1.4/includes/gateways/class-charitable-gateway-paypal.php#L229-L357 + * + * @param Payment $payment Payment. + */ + public function status_update( Payment $payment ) { + $donation_id = (int) $payment->get_source_id(); + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + give_update_payment_status( $donation_id, 'cancelled' ); + + break; + case PaymentStatus::EXPIRED: + give_update_payment_status( $donation_id, 'abandoned' ); + + break; + case PaymentStatus::FAILURE: + give_update_payment_status( $donation_id, 'failed' ); + + break; + case PaymentStatus::SUCCESS: + give_update_payment_status( $donation_id, 'publish' ); + + break; + case PaymentStatus::OPEN: + default: + give_update_payment_status( $donation_id, 'pending' ); + + break; + } + } + + /** + * Filter currencies. + * + * @param array $currencies Available currencies. + * + * @return mixed + */ + public static function currencies( $currencies ) { + if ( PaymentMethods::is_active( PaymentMethods::GULDEN ) ) { + $currencies['NLG'] = array( + 'admin_label' => PaymentMethods::get_name( PaymentMethods::GULDEN ) . ' (G)', + 'symbol' => 'G', + 'setting' => array( + 'currency_position' => 'before', + 'thousands_separator' => '', + 'decimal_separator' => '.', + 'number_decimals' => 4, + ), + ); + } + + return $currencies; + } + + /** + * Source column + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + $source_id = (int) $payment->source_id; + + $text = __( 'Give', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + get_edit_post_link( $source_id ), + /* translators: %s: source id */ + sprintf( __( 'Donation %s', 'pronamic_ideal' ), $source_id ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'Give Donation', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + return get_edit_post_link( (int) $payment->source_id ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/Gateway.php new file mode 100644 index 00000000..6291627e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/Gateway.php @@ -0,0 +1,384 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Give\Helpers\Form\Utils as FormUtils; +use Pronamic\WordPress\Money\Currency; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Title: Give gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.4 + * @since 1.0.0 + */ +class Gateway { + /** + * The payment method + * + * @var string + */ + protected $payment_method; + + /** + * Unique identifier. + * + * @var string + */ + public $id; + + /** + * Name. + * + * @var string + */ + public $name; + + /** + * Constructs and initialize a gateway. + * + * @param string $id Gateway ID. + * @param string $name Gateway name. + * @param string $payment_method Gateway payment method. + */ + public function __construct( $id = 'pronamic_pay', $name = 'Pronamic', $payment_method = null ) { + $this->id = $id; + $this->name = $name; + $this->payment_method = $payment_method; + + // Add filters and actions. + add_filter( 'give_get_settings_gateways', array( $this, 'gateway_settings' ) ); + add_filter( 'give_get_sections_gateways', array( $this, 'gateways_sections' ) ); + + add_action( 'give_gateway_' . $this->id, array( $this, 'process_purchase' ) ); + + if ( defined( 'GIVE_VERSION' ) && version_compare( GIVE_VERSION, '1.7', '>=' ) ) { + add_action( 'give_donation_form_before_submit', array( $this, 'before_submit_input_fields' ) ); + } else { + add_action( 'give_purchase_form_before_submit', array( $this, 'before_submit_input_fields' ) ); + } + + add_action( 'give_' . $this->id . '_cc_form', array( $this, 'payment_fields' ) ); + } + + /** + * Add gateways section. + * + * @param array $sections Gateways sections. + * + * @return array + * @since 2.0.3 + */ + public function gateways_sections( $sections ) { + $sections[ $this->id ] = $this->name; + + return $sections; + } + + /** + * Register gateway settings. + * + * @param array $settings Gateway settings. + * + * @return array + * @since 1.0.0 + */ + public function gateway_settings( $settings ) { + $current_section = give_get_current_setting_section(); + + // Check if current section is the gateway ID. + if ( $this->id !== $current_section ) { + return $settings; + } + + $description = ''; + + if ( 'pronamic_pay' === $this->id ) { + $description = __( "This payment method does not use a predefined payment method for the payment. Some payment providers list all activated payment methods for your account to choose from. Use payment method specific gateways (such as 'iDEAL') to let customers choose their desired payment method at checkout.", 'pronamic_ideal' ); + } + + $settings[] = array( + 'desc' => $description, + 'id' => sprintf( 'give_title_%s', $this->id ), + 'type' => 'title', + ); + + $settings[] = array( + 'name' => __( 'Configuration', 'pronamic_ideal' ), + 'desc' => '', + 'id' => sprintf( 'give_%s_configuration', $this->id ), + 'type' => 'select', + 'options' => Plugin::get_config_select_options( $this->payment_method ), + 'default' => $this->get_config_id(), + ); + + $settings[] = array( + 'name' => __( 'Transaction description', 'pronamic_ideal' ), + 'desc' => sprintf( + /* translators: %s: {tag} */ + __( 'Available tags: %s', 'pronamic_ideal' ), + sprintf( '%s', '{donation_id}' ) + ), + 'id' => sprintf( 'give_%s_transaction_description', $this->id ), + 'type' => 'text', + 'default' => __( 'Give donation {donation_id}', 'pronamic_ideal' ), + ); + + $settings[] = array( + 'id' => sprintf( 'give_title_gateway_settings_%s', $this->id ), + 'type' => 'sectionend', + ); + + return $settings; + } + + /** + * Info fields. + * + * @param int $form_id Form ID. + */ + public function input_fields( $form_id ) { + $payment_mode = give_get_chosen_gateway( $form_id ); + + if ( $this->id !== $payment_mode ) { + return; + } + + // Errors. + if ( filter_has_var( INPUT_GET, 'payment-error' ) ) { + printf( + '
    %s
    ', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + Plugin::get_default_error_message() + ); + } + + // Gateway. + $config_id = $this->get_config_id(); + + try { + $gateway = Plugin::get_gateway( $config_id ); + + $gateway->set_payment_method( $this->payment_method ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $gateway->get_input_html(); + } catch ( \Exception $e ) { + printf( + '
    %s

    %s
    ', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + Plugin::get_default_error_message(), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + sprintf( '%s: %s', $e->getCode(), $e->getMessage() ) + ); + } + } + + /** + * Legacy input fields. + * + * @param int $form_id Form ID. + * @return void + */ + public function before_submit_input_fields( $form_id ) { + if ( \class_exists( 'Give\Helpers\Form\Utils' ) && ! FormUtils::isLegacyForm( $form_id ) ) { + return; + } + + $this->input_fields( $form_id ); + } + + /** + * Input fields. + * + * @param int $form_id Form ID. + * @return void + */ + public function payment_fields( $form_id ) { + if ( ! \class_exists( 'Give\Helpers\Form\Utils' ) ) { + return; + } + + if ( FormUtils::isLegacyForm( $form_id ) ) { + return; + } + + $this->input_fields( $form_id ); + } + + /** + * Process purchase. + * + * @since 1.0.0 + * + * @param array $purchase_data Purchase Data. + * + * @return void + */ + public function process_purchase( $purchase_data ) { + if ( ! wp_verify_nonce( $purchase_data['gateway_nonce'], 'give-gateway' ) ) { + wp_die( esc_html__( 'Nonce verification has failed', 'pronamic_ideal' ), esc_html__( 'Error', 'pronamic_ideal' ), array( 'response' => 403 ) ); + } + + $form_id = intval( $purchase_data['post_data']['give-form-id'] ); + + // Collect payment data. + $payment_data = array( + 'price' => $purchase_data['price'], + 'give_form_title' => $purchase_data['post_data']['give-form-title'], + 'give_form_id' => $form_id, + 'date' => $purchase_data['date'], + 'user_email' => $purchase_data['user_email'], + 'purchase_key' => $purchase_data['purchase_key'], + 'currency' => give_get_currency(), + 'user_info' => $purchase_data['user_info'], + 'status' => 'pending', + 'gateway' => $this->id, + ); + + // Record the pending payment. + $donation_id = give_insert_payment( $payment_data ); + + if ( false === $donation_id ) { + /* + * Record the error. + * /wp-admin/edit.php?post_type=give_forms&page=give-reports&tab=logs&view=gateway_errors + * @link https://github.com/WordImpress/Give/blob/1.3.6/includes/gateways/functions.php#L267-L285 + */ + give_record_gateway_error( + __( 'Payment Error', 'pronamic_ideal' ), + sprintf( + /* translators: %s: payment data as JSON */ + __( 'Payment creation failed before sending buyer to payment provider. Payment data: %s', 'pronamic_ideal' ), + (string) wp_json_encode( $payment_data ) + ) + ); + + /* + * Problems? Send back. + * @link https://github.com/WordImpress/Give/blob/1.3.6/includes/forms/functions.php#L150-L184 + */ + give_send_back_to_checkout( + array( + 'payment-error' => true, + 'payment-mode' => $purchase_data['post_data']['give-gateway'], + ) + ); + + return; + } + + $config_id = $this->get_config_id(); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway ) { + return; + } + + $gateway->set_payment_method( $this->payment_method ); + + $user_info = \give_get_payment_meta_user_info( $donation_id ); + + /** + * Build payment. + */ + $payment = new Payment(); + + $payment->source = 'give'; + $payment->source_id = $donation_id; + $payment->order_id = $donation_id; + + $payment->description = GiveHelper::get_description( $this, $donation_id ); + + $payment->title = GiveHelper::get_title( $donation_id ); + + // Customer. + $payment->set_customer( GiveHelper::get_customer_from_user_info( $user_info, $donation_id ) ); + + // Address. + $payment->set_billing_address( GiveHelper::get_address_from_user_info( $user_info, $donation_id ) ); + + // Currency. + $currency = Currency::get_instance( \give_get_payment_currency_code( $donation_id ) ); + + // Amount. + $payment->set_total_amount( new TaxedMoney( \give_donation_amount( $donation_id ), $currency ) ); + + // Method. + $payment->method = $this->payment_method; + + // Configuration. + $payment->config_id = $config_id; + + // Start. + try { + $payment = Plugin::start_payment( $payment ); + + // Redirect. + \wp_safe_redirect( $payment->get_pay_redirect_url(), 303 ); + } catch ( \Exception $e ) { + /* + * Record the error. + * /wp-admin/edit.php?post_type=give_forms&page=give-reports&tab=logs&view=gateway_errors + * @link https://github.com/WordImpress/Give/blob/1.3.6/includes/gateways/functions.php#L267-L285 + */ + give_record_gateway_error( + __( 'Payment Error', 'pronamic_ideal' ), + $e->getMessage(), + $donation_id + ); + + /* + * Problems? Send back. + * @link https://github.com/WordImpress/Give/blob/1.3.6/includes/forms/functions.php#L150-L184 + */ + give_send_back_to_checkout( + array( + 'payment-error' => true, + 'payment-mode' => $purchase_data['post_data']['give-gateway'], + ) + ); + } + } + + /** + * Get transaction description setting. + * + * @since 1.0.3 + * @return string + */ + public function get_transaction_description() { + return give_get_option( sprintf( 'give_%s_transaction_description', $this->id ), '' ); + } + + /** + * Get config ID. + * + * @return mixed + */ + protected function get_config_id() { + $config_id = give_get_option( sprintf( 'give_%s_configuration', $this->id ) ); + + if ( empty( $config_id ) ) { + // Use default gateway if no configuration has been set. + $config_id = get_option( 'pronamic_pay_config_id' ); + } + + return $config_id; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GiveDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GiveDependency.php new file mode 100644 index 00000000..a09ee9ac --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GiveDependency.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Give Dependency + * + * @author Reüel van der Steege + * @version 2.1.1 + * @since 2.1.1 + */ +class GiveDependency extends Dependency { + /** + * Is met. + * + * @link https://github.com/impress-org/givewp/blob/2.6.0/give.php#L52 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \class_exists( '\Give' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GiveHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GiveHelper.php new file mode 100644 index 00000000..6a6b1826 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GiveHelper.php @@ -0,0 +1,123 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\AddressHelper; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\ContactNameHelper; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\CustomerHelper; + +/** + * Give Helper + * + * @version 2.2.0 + * @since 2.2.0 + */ +class GiveHelper { + /** + * Get title. + * + * @param int $donation_id Donation ID. + * @return string + */ + public static function get_title( $donation_id ) { + return \sprintf( + /* translators: %s: Give donation ID */ + __( 'Give donation %s', 'pronamic_ideal' ), + $donation_id + ); + } + + /** + * Get description. + * + * @return string + */ + public static function get_description( $gateway, $donation_id ) { + $search = array( + '{donation_id}', + ); + + $replace = array( + $donation_id, + ); + + $description = $gateway->get_transaction_description(); + + if ( '' === $description ) { + $description = self::get_title( $donation_id ); + } + + return str_replace( $search, $replace, $description ); + } + + /** + * Get value from array. + * + * @param array $array Array. + * @param string $key Key. + * @return string|null + */ + private static function get_value_from_array( $array, $key ) { + if ( ! array_key_exists( $key, $array ) ) { + return null; + } + + return $array[ $key ]; + } + + /** + * Get customer from user data. + */ + public static function get_customer_from_user_info( $user_info, $donation_id ) { + return CustomerHelper::from_array( array( + 'name' => self::get_name_from_user_info( $user_info ), + 'email' => \give_get_payment_user_email( $donation_id ), + 'phone' => null, + 'user_id' => null, + ) ); + } + + /** + * Get name from user data. + * + * @return ContactName|null + */ + public static function get_name_from_user_info( $user_info ) { + return ContactNameHelper::from_array( array( + 'first_name' => self::get_value_from_array( $user_info, 'first_name' ), + 'last_name' => self::get_value_from_array( $user_info, 'last_name' ), + ) ); + } + + /** + * Get address from user info. + * + * @return Address|null + */ + public static function get_address_from_user_info( $user_info, $donation_id ) { + $address_info = self::get_value_from_array( $user_info, 'address' ); + + return AddressHelper::from_array( array( + 'name' => self::get_name_from_user_info( $user_info ), + 'line_1' => self::get_value_from_array( $address_info, 'line1' ), + 'line_2' => self::get_value_from_array( $address_info, 'line2' ), + 'postal_code' => self::get_value_from_array( $address_info, 'zip' ), + 'city' => self::get_value_from_array( $address_info, 'city' ), + 'region' => null, + 'country_code' => null, + 'email' => \give_get_payment_user_email( $donation_id ), + 'phone' => null, + ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GuldenGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GuldenGateway.php new file mode 100644 index 00000000..11329604 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/GuldenGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give Gulden gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 2.0.0 + */ +class GuldenGateway extends Gateway { + /** + * Constructs and initialize Gulden gateway. + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_gulden', + PaymentMethods::get_name( PaymentMethods::GULDEN ), + PaymentMethods::GULDEN + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/IDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/IDealGateway.php new file mode 100644 index 00000000..213ff328 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/IDealGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give iDEAL gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class IDealGateway extends Gateway { + /** + * Constructs and initialize iDEAL gateway. + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_ideal', + __( 'iDEAL', 'pronamic_ideal' ), + PaymentMethods::IDEAL + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/SofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/SofortGateway.php new file mode 100644 index 00000000..48729d9d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/give/src/SofortGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\Give + */ + +namespace Pronamic\WordPress\Pay\Extensions\Give; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Give Sofort gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class SofortGateway extends Gateway { + /** + * Constructs and initialize Sofort gateway. + */ + public function __construct() { + parent::__construct( + 'pronamic_pay_sofort', + __( 'SOFORT Banking', 'pronamic_ideal' ), + PaymentMethods::SOFORT + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.css new file mode 100644 index 00000000..a8b07689 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.css @@ -0,0 +1,57 @@ +/* line 8, ../scss/admin.scss */ +#tab_pronamic_pay h3 .dashicons.fa- { + font-size: inherit; + width: auto; + height: auto; +} + +/* line 18, ../scss/admin.scss */ +#titlediv + #gf-pay-feed-editor { + margin-top: 1em; +} + +/* line 24, ../scss/admin.scss */ +#gf-pay-feed-editor .form-table ul { + margin: 10px 0 0; +} +/* line 30, ../scss/admin.scss */ +#gf-pay-feed-editor .pronamic-pay-tab .pronamic-pay-tab-block { + background: #fff; +} +/* line 36, ../scss/admin.scss */ +#gf-pay-feed-editor .pronamic-pay-tab .pronamic-pay-table-striped tr:not(.even) { + background: #fff; +} +/* line 42, ../scss/admin.scss */ +#gf-pay-feed-editor .pronamic-pay-tab input + select { + vertical-align: initial; +} +/* line 49, ../scss/admin.scss */ +#gf-pay-feed-editor .pronamic-gf-subscription-tab fieldset > div { + margin-bottom: -1em; + margin-left: 2em; +} + +/* line 59, ../scss/admin.scss */ +.gforms_edit_form .ideal-edit-link { + display: none; + float: right; + font-size: 10px; + line-height: 16px; + height: 16px; + text-decoration: none; +} +/* line 75, ../scss/admin.scss */ +.gforms_edit_form .field_hover .ideal-edit-link, +.gforms_edit_form .field_selected .ideal-edit-link { + display: block; +} + +/* line 84, ../scss/admin.scss */ +.form-table .pronamic-pay-description { + display: block; +} +/* line 90, ../scss/admin.scss */ +.form-table.pronamic-gf-links-tab fieldset { + line-height: 2.75em; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.css.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.css.map new file mode 100644 index 00000000..1e899eff --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["admin.css"],"names":[],"mappings":"AAAA,gCAAgC;AAChC;EACE,mBAAmB;EACnB,YAAY;EACZ,aAAa;CACd;;AAED,iCAAiC;AACjC;EACE,gBAAgB;CACjB;;AAED,iCAAiC;AACjC;EACE,iBAAiB;CAClB;AACD,iCAAiC;AACjC;EACE,iBAAiB;CAClB;AACD,iCAAiC;AACjC;EACE,iBAAiB;CAClB;AACD,iCAAiC;AACjC;EACE,wBAAwB;CACzB;AACD,iCAAiC;AACjC;EACE,oBAAoB;EACpB,iBAAiB;CAClB;;AAED,iCAAiC;AACjC;EACE,cAAc;EACd,aAAa;EACb,gBAAgB;EAChB,kBAAkB;EAClB,aAAa;EACb,sBAAsB;CACvB;AACD,iCAAiC;AACjC;;EAEE,eAAe;CAChB;;AAED,iCAAiC;AACjC;EACE,eAAe;CAChB;AACD,iCAAiC;AACjC;EACE,oBAAoB;CACrB","file":"admin.css","sourcesContent":["/* line 8, ../scss/admin.scss */\n#tab_pronamic_pay h3 .dashicons.fa- {\n font-size: inherit;\n width: auto;\n height: auto;\n}\n\n/* line 18, ../scss/admin.scss */\n#titlediv + #gf-pay-feed-editor {\n margin-top: 1em;\n}\n\n/* line 24, ../scss/admin.scss */\n#gf-pay-feed-editor .form-table ul {\n margin: 10px 0 0;\n}\n/* line 30, ../scss/admin.scss */\n#gf-pay-feed-editor .pronamic-pay-tab .pronamic-pay-tab-block {\n background: #fff;\n}\n/* line 36, ../scss/admin.scss */\n#gf-pay-feed-editor .pronamic-pay-tab .pronamic-pay-table-striped tr:not(.even) {\n background: #fff;\n}\n/* line 42, ../scss/admin.scss */\n#gf-pay-feed-editor .pronamic-pay-tab input + select {\n vertical-align: initial;\n}\n/* line 49, ../scss/admin.scss */\n#gf-pay-feed-editor .pronamic-gf-subscription-tab fieldset > div {\n margin-bottom: -1em;\n margin-left: 2em;\n}\n\n/* line 59, ../scss/admin.scss */\n.gforms_edit_form .ideal-edit-link {\n display: none;\n float: right;\n font-size: 10px;\n line-height: 16px;\n height: 16px;\n text-decoration: none;\n}\n/* line 75, ../scss/admin.scss */\n.gforms_edit_form .field_hover .ideal-edit-link,\n.gforms_edit_form .field_selected .ideal-edit-link {\n display: block;\n}\n\n/* line 84, ../scss/admin.scss */\n.form-table .pronamic-pay-description {\n display: block;\n}\n/* line 90, ../scss/admin.scss */\n.form-table.pronamic-gf-links-tab fieldset {\n line-height: 2.75em;\n}\n"]} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.min.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.min.css new file mode 100644 index 00000000..d2060769 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/css/admin.min.css @@ -0,0 +1 @@ +#tab_pronamic_pay h3 .dashicons.fa-{font-size:inherit;width:auto;height:auto}#titlediv+#gf-pay-feed-editor{margin-top:1em}#gf-pay-feed-editor .form-table ul{margin:10px 0 0}#gf-pay-feed-editor .pronamic-pay-tab .pronamic-pay-tab-block{background:#fff}#gf-pay-feed-editor .pronamic-pay-tab .pronamic-pay-table-striped tr:not(.even){background:#fff}#gf-pay-feed-editor .pronamic-pay-tab input+select{vertical-align:initial}#gf-pay-feed-editor .pronamic-gf-subscription-tab fieldset>div{margin-bottom:-1em;margin-left:2em}.gforms_edit_form .ideal-edit-link{display:none;float:right;font-size:10px;line-height:16px;height:16px;text-decoration:none}.gforms_edit_form .field_hover .ideal-edit-link,.gforms_edit_form .field_selected .ideal-edit-link{display:block}.form-table .pronamic-pay-description{display:block}.form-table.pronamic-gf-links-tab fieldset{line-height:2.75em} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/images/contextual_pay_feeds.png b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/images/contextual_pay_feeds.png new file mode 100644 index 00000000..842c47e7 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/images/contextual_pay_feeds.png differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/js/admin.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/js/admin.js new file mode 100644 index 00000000..4504dd3d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/js/admin.js @@ -0,0 +1,551 @@ +/* global ajaxurl */ +/* global gform */ +/* global form */ +/* global SetFieldProperty */ +( function( $ ) { + /** + * Gravity Forms pay feed editor + */ + var GravityFormsPayFeedEditor = function( element ) { + var obj = this; + var $element = $( element ); + + // Elements + var elements = {}; + elements.feed = $element.find( '#gf_ideal_feed' ); + elements.gravityForm = $element.find( '#gf_ideal_gravity_form' ); + elements.formId = $element.find( '#_pronamic_pay_gf_form_id' ); + elements.configId = $element.find( '#gf_ideal_config_id' ); + elements.delayPostCreationItem = $element.find( '#gf_ideal_delay_post_creation_item' ); + elements.confirmationSelectFields = $element.find( '.gf_ideal_confirmation_select' ); + elements.userRoleFieldId = $element.find( '#gf_ideal_user_role_field_id' ); + elements.delayNotifications = $element.find( '#gf_ideal_delay_notifications' ); + elements.fieldSelectFields = $element.find( 'select.field-select' ); + elements.subscriptionAmountType = $element.find( 'input[name="_pronamic_pay_gf_subscription_amount_type"]' ); + elements.subscriptionAmountField = $element.find( '#pronamic_pay_gf_subscription_amount_field' ); + elements.subscriptionIntervalType = $element.find( 'input[name="_pronamic_pay_gf_subscription_interval_type"]' ); + elements.subscriptionInterval = $element.find( '#pronamic_pay_gf_subscription_interval' ); + elements.subscriptionIntervalPeriod = $element.find( '#pronamic_pay_gf_subscription_interval_period' ); + elements.subscriptionIntervalDateType = $element.find( 'input[name="_pronamic_pay_gf_subscription_interval_date_type"]' ); + elements.subscriptionIntervalDate = $element.find( '#pronamic_pay_gf_subscription_interval_date' ); + elements.subscriptionIntervalDateDay = $element.find( '#pronamic_pay_gf_subscription_interval_date_day' ); + elements.subscriptionIntervalDateMonth = $element.find( '#pronamic_pay_gf_subscription_interval_date_month' ); + elements.subscriptionIntervalField = $element.find( '#pronamic_pay_gf_subscription_interval_field' ); + elements.subscriptionFrequencyType = $element.find( 'input[name="_pronamic_pay_gf_subscription_frequency_type"]' ); + elements.subscriptionNumberPeriods = $element.find( '#pronamic_pay_gf_subscription_number_periods' ); + elements.subscriptionFrequencyField = $element.find( '#pronamic_pay_gf_subscription_frequency_field' ); + + // Data + var feed = $.parseJSON( elements.feed.val() ); + var gravityForm = $.parseJSON( elements.gravityForm.val() ); + + /** + * Update delay post creation item + */ + this.updateDelayPostCreationItem = function() { + var display = false; + + if ( gravityForm ) { + // Displaying delayed post creation setting if current form has a post field + var postFields = obj.getFieldsByType( [ 'post_title', 'post_content', 'post_excerpt', 'post_category', 'post_custom_field', 'post_image', 'post_tag' ] ); + + if ( postFields.length > 0 ) { + display = true; + } + } + + elements.delayPostCreationItem.toggle( display ); + }; + + /** + * Update confirmations + */ + this.updateConfirmationFields = function() { + elements.confirmationSelectFields.empty(); + $( '
    + + +
    + +
    + +
    + +

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

    +
  • ' ).appendTo( elements.delayNotifications ); + + var fieldId = 'pronamic-pay-gf-notification-' + notification.id; + + $( '' ) + .attr( 'id', fieldId ) + .val( notification.id ) + .prop( 'checked', $.inArray( notification.id, feed.delayNotificationIds ) >= 0 ) + .appendTo( item ); + + item.append( ' ' ); + + $( '
  • ").appendTo(r.delayNotifications),n="pronamic-pay-gf-notification-"+i.id,d('').attr("id",n).val(i.id).prop("checked",0<=d.inArray(i.id,s.delayNotificationIds)).appendTo(t),t.append(" "),d("
  • + + + +
  • + +
  • + + + +
  • + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use GFAPI; +use GFCommon; +use GFFormsModel; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; + +/** + * Title: WordPress pay extension Gravity Forms + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class GravityForms { + /** + * Indicator for an payment transaction type + * + * @var int + */ + const TRANSACTION_TYPE_PAYMENT = 1; + + /** + * Indicator for an subscription transaction type + * + * @var int + */ + const TRANSACTION_TYPE_SUBSCRIPTION = 2; + + /** + * Operator is + * + * @var string + */ + const OPERATOR_IS = '='; + + /** + * Operator is not + * + * @var string + */ + const OPERATOR_IS_NOT = '!='; + + /** + * Indicator for form total subscription amount type. + * + * @var string + */ + const SUBSCRIPTION_AMOUNT_TOTAL = 'total'; + + /** + * Indicator for field subscription amount type. + * + * @var string + */ + const SUBSCRIPTION_AMOUNT_FIELD = 'field'; + + /** + * Indicator for field subscription interval type. + * + * @var string + */ + const SUBSCRIPTION_INTERVAL_FIELD = 'field'; + + /** + * Indicator for fixed subscription interval type. + * + * @var string + */ + const SUBSCRIPTION_INTERVAL_FIXED = 'fixed'; + + /** + * Indicator for field subscription frequency type. + * + * @var string + */ + const SUBSCRIPTION_FREQUENCY_FIELD = 'field'; + + /** + * Indicator for fixed subscription frequency type. + * + * @var string + */ + const SUBSCRIPTION_FREQUENCY_FIXED = 'fixed'; + + /** + * Indicator for unlimited subscription frequency type. + * + * @var string + */ + const SUBSCRIPTION_FREQUENCY_UNLIMITED = 'unlimited'; + + /** + * Check if Gravity Forms is active (Automattic/developer style). + * + * @link https://bitbucket.org/Pronamic/gravityforms/src/42773f75ad7ad9ac9c31ce149510ff825e4aa01f/gravityforms.php?at=1.7.8#cl-95 + * @link https://github.com/Automattic/developer/blob/1.1.2/developer.php#L73 + * + * @return bool + */ + public static function is_active() { + return class_exists( 'GFForms' ); + } + + /** + * Update entry. + * + * @param array $entry Gravity Forms entry. + */ + public static function update_entry( $entry ) { + /* + * GFFormsModel::update_lead() is no longer in use since version 1.8.8! Instead use GFAPI::update_entry(). + * + * @link https://github.com/wp-premium/gravityforms/blob/1.8.13/forms_model.php#L587-L624 + * @link https://github.com/wp-premium/gravityforms/blob/1.8.13/includes/api.php#L495-L654 + * @link https://github.com/wp-premium/gravityforms/blob/1.8.7.11/forms_model.php#L587-L621 + */ + if ( Core_Util::class_method_exists( 'GFAPI', 'update_entry' ) ) { + GFAPI::update_entry( $entry ); + } elseif ( Core_Util::class_method_exists( 'GFFormsModel', 'update_lead' ) ) { + GFFormsModel::update_lead( $entry ); + } + } + + /** + * Update entry property. + * + * @param int $entry_id Entry ID. + * @param string $property Name of the property to update. + * @param string $value Value for the property. + */ + public static function update_entry_property( $entry_id, $property, $value ) { + if ( Core_Util::class_method_exists( 'GFAPI', 'update_entry_property' ) ) { + GFAPI::update_entry_property( $entry_id, $property, $value ); + } elseif ( Core_Util::class_method_exists( 'GFFormsModel', 'update_lead_property' ) ) { + GFFormsModel::update_lead_property( $entry_id, $property, $value ); + } + } + + /** + * Get entry property. + * + * @param int $entry_id Entry ID. + * @param string $property Name of the property to fetch. + * + * @return mixed|null + */ + public static function get_entry_property( $entry_id, $property ) { + $entry = GFFormsModel::get_lead( $entry_id ); + + if ( isset( $entry[ $property ] ) ) { + return $entry[ $property ]; + } + + return null; + } + + /** + * Compare the current Gravity Forms version + * + * @param string $version Version. + * @param string $operator Compare operator. + * + * @return bool + */ + public static function version_compare( $version, $operator ) { + if ( class_exists( 'GFCommon' ) ) { + return version_compare( GFCommon::$version, $version, $operator ); + } + + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/GravityFormsDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/GravityFormsDependency.php new file mode 100644 index 00000000..315bbfca --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/GravityFormsDependency.php @@ -0,0 +1,40 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Gravity Forms Dependency + * + * @author Reüel van der Steege + * @version 2.2.0 + * @since 2.2.0 + */ +class GravityFormsDependency extends Dependency { + /** + * Is met. + * + * @link https://github.com/WebSharks/s2Member/blob/130816/s2member/s2member.php#L69 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \class_exists( '\GFCommon' ) ) { + return false; + } + + return \version_compare( + \GFCommon::$version, + '1.0.0', + '>=' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/IssuersField.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/IssuersField.php new file mode 100644 index 00000000..871706bb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/IssuersField.php @@ -0,0 +1,578 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use GF_Field_Select; +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay extension Gravity Forms issuers field + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.10 + * @since 1.4.7 + * + * @property int $pronamicPayConfigId Added by admin.js. + * @property int $formId https://github.com/wp-premium/gravityforms/blob/2.3.2/includes/fields/class-gf-field.php#L1044 + * @property array $choices https://github.com/wp-premium/gravityforms/search?q=%22%24this-%3Echoices%22 + */ +class IssuersField extends GF_Field_Select { + /** + * Type + * + * @var string + */ + const TYPE = Fields::ISSUERS_FIELD_TYPE; + + /** + * Type + * + * @var string + */ + public $type = Fields::ISSUERS_FIELD_TYPE; + + /** + * Constructs and initializes issuers field. + * + * @param array $properties Properties. + */ + public function __construct( $properties = array() ) { + parent::__construct( $properties ); + + // Actions. + if ( ! has_action( 'gform_editor_js_set_default_values', array( __CLASS__, 'editor_js_set_default_values' ) ) ) { + add_action( 'gform_editor_js_set_default_values', array( __CLASS__, 'editor_js_set_default_values' ) ); + } + + if ( + ! isset( $this->formId ) + && + wp_doing_ajax() + && + filter_has_var( INPUT_POST, 'form_id' ) + && + 'rg_add_field' === filter_input( INPUT_POST, 'action' ) + && + false !== strpos( filter_input( INPUT_POST, 'field' ), self::TYPE ) + ) { + $this->formId = filter_input( INPUT_POST, 'form_id', FILTER_SANITIZE_NUMBER_INT ); + } + + // Choices. + if ( isset( $this->formId ) ) { + $this->set_choices( $this->formId ); + } + + // Set default display mode. + if ( ! isset( $this->pronamicPayDisplayMode ) ) { + $this->pronamicPayDisplayMode = 'select'; + } + + // Add display mode CSS classes. + if ( false === strpos( $this->cssClass, 'pronamic_pay_display_icons' ) && 'icons' === substr( $this->pronamicPayDisplayMode, 0, 5 ) ) { + $this->cssClass .= ' pronamic_pay_display_icons'; + } + + if ( false === strpos( $this->cssClass, 'gf_list_2col' ) && in_array( $this->pronamicPayDisplayMode, array( 'icons-64', 'icons-125' ), true ) ) { + $this->cssClass .= ' gf_list_2col'; + } + } + + /** + * Get form editor field settings for this field. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field-select.php#L16-L35 + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field.php#L144-L151 + * @return array + */ + public function get_form_editor_field_settings() { + return array( + 'conditional_logic_field_setting', + 'error_message_setting', + 'enable_enhanced_ui_setting', + 'label_setting', + 'label_placement_setting', + 'admin_label_setting', + 'size_setting', + 'placeholder_setting', + 'description_setting', + 'css_class_setting', + 'rules_setting', + 'pronamic_pay_config_field_setting', + 'pronamic_pay_display_field_setting', + ); + } + + /** + * Get the iDEAL gateway for this field. + * + * @return null|Gateway + */ + private function get_gateway() { + $gateway = null; + + if ( isset( $this->pronamicPayConfigId ) && ! empty( $this->pronamicPayConfigId ) ) { + $gateway = Plugin::get_gateway( $this->pronamicPayConfigId ); + } + + if ( ! $gateway ) { + $feeds = FeedsDB::get_feeds_by_form_id( $this->formId ); + + foreach ( $feeds as $feed ) { + $gateway = Plugin::get_gateway( $feed->config_id ); + + if ( $gateway ) { + $issuers = $gateway->get_transient_issuers(); + + if ( empty( $issuers ) ) { + continue; + } + + return $gateway; + } + } + } + + return $gateway; + } + + /** + * Set the issuer choices for this issuers field. + * + * @param int $form_id Gravity Forms form ID. + */ + private function set_choices( $form_id ) { + $this->choices = array(); + + // Prevent HTTP requests in forms list. + if ( \doing_filter( 'gform_form_actions' ) ) { + return; + } + + $gateway = $this->get_gateway(); + + if ( ! $gateway ) { + return; + } + + // Always use iDEAL payment method for issuer field. + $gateway->set_payment_method( PaymentMethods::IDEAL ); + + $field = $gateway->get_issuer_field(); + + $this->error = $gateway->get_error(); + + // @todo What todo if error? + if ( ! $field || is_wp_error( $this->error ) ) { + return; + } + + foreach ( $field['choices'] as $group ) { + foreach ( $group['options'] as $value => $label ) { + $this->choices[] = array( + 'value' => $value, + 'text' => $label, + ); + } + } + } + + /** + * Get the field input. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field-select.php#L41-L60 + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field.php#L182-L193 + * @link https://github.com/wp-premium/gravityforms/blob/2.3.2/includes/fields/class-gf-field.php#L228-L239 + * + * @param array $form The Form Object currently being processed. + * @param string|array $value The field value. From default/dynamic population, $_POST, or a resumed incomplete submission. + * @param null|array $entry Null or the Entry Object currently being edited. + * + * @return string + */ + public function get_field_input( $form, $value = '', $entry = null ) { + // Error handling. + if ( is_wp_error( $this->error ) ) { + return $this->error->get_error_message(); + } + + // Input. + $input = parent::get_field_input( $form, $value, $entry ); + + $field_css_id = sprintf( '#field_%1$s_%2$s', $this->formId, $this->id ); + + if ( ! is_admin() && 'icons' === substr( $this->pronamicPayDisplayMode, 0, 5 ) ) { + + ob_start(); + + ?> + +
    + +
    + + + + %s', + esc_url( $new_feed_url ), + __( 'New Payment Feed', 'pronamic_ideal' ) + ); + + $input = $link . $input; + } + + if ( ! empty( $feeds ) && empty( $this->choices ) ) { + // If there are feeds and no choices it's very likely this field is no supported by the gateway. + $error = sprintf( + '

    %s
    %s

    ', + __( 'This field is not supported by your payment gateway.', 'pronamic_ideal' ), + sprintf( + /* translators: %s: new feed URL */ + __( 'Please remove it from this form or add a supported payment gateway.', 'pronamic_ideal' ), + esc_url( $new_feed_url ) + ) + ); + + $input = $error . $input; + } + } + + return $input; + } + + /** + * Get form editor field title. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field.php#L106-L113 + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field-select.php#L12-L14 + * @return string + */ + public function get_form_editor_field_title() { + return esc_attr__( 'Issuer', 'pronamic_ideal' ); + } + + /** + * Get form editor button. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field.php#L115-L129 + * @return array + */ + public function get_form_editor_button() { + return array( + 'group' => 'pronamic_pay_fields', + 'text' => __( 'Issuer', 'pronamic_ideal' ), + ); + } + + /** + * Add button. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/form_detail.php#L2353-L2368 + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field.php#L617-L652 + * + * @param array $field_groups Field groups. + * + * @return array + */ + public function add_button( $field_groups ) { + // We have to make sure the custom pay field group is added, otherwise the button won't be added. + $field_groups = Fields::add_pay_field_group( $field_groups ); + + return parent::add_button( $field_groups ); + } + + /** + * Editor JavaScript default field values. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/js.php#L587-L599 + */ + public static function editor_js_set_default_values() { + $label = __( 'Choose a bank for iDEAL payment', 'pronamic_ideal' ); + + ?> + case '' : + if ( ! field.label ) { + field.label = ''; + } + + break; + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +/** + * Title: WordPress pay extension Gravity Forms lead properties + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class LeadProperties { + /** + * Lead propery payment status + * + * @var string + */ + const PAYMENT_STATUS = 'payment_status'; + + /** + * Lead propery payment amount + * + * @var string + */ + const PAYMENT_AMOUNT = 'payment_amount'; + + /** + * Lead propery payment date + * + * @var string + */ + const PAYMENT_DATE = 'payment_date'; + + /** + * Lead propery transaction ID + * + * @var string + */ + const TRANSACTION_ID = 'transaction_id'; + + /** + * Lead propery transaction type + * + * @var string + */ + const TRANSACTION_TYPE = 'transaction_type'; + + /** + * Lead property created by + * + * @var string + */ + const CREATED_BY = 'created_by'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Links.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Links.php new file mode 100644 index 00000000..ea76db00 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Links.php @@ -0,0 +1,84 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Title: WordPress pay extension Gravity Forms links + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.12 + * @since 1.0.0 + */ +class Links { + /** + * Indicator for the open status link + * + * @var string + */ + const OPEN = 'open'; + + /** + * Indicator for the cancel status link + * + * @var string + */ + const CANCEL = 'cancel'; + + /** + * Indicator for the error status link + * + * @var string + */ + const ERROR = 'error'; + + /** + * Indicator for the success status link + * + * @var string + */ + const SUCCESS = 'success'; + + /** + * Indicator for the expired status link + * + * @var string + */ + const EXPIRED = 'expired'; + + /** + * Link for payment status. + * + * @since 1.4.4 + * + * @param string $payment_status Payment status. + * @return string + */ + public static function transform_status( $payment_status ) { + switch ( $payment_status ) { + case PaymentStatus::CANCELLED: + return self::CANCEL; + case PaymentStatus::EXPIRED: + return self::EXPIRED; + case PaymentStatus::FAILURE: + return self::ERROR; + case PaymentStatus::SUCCESS: + return self::SUCCESS; + case PaymentStatus::OPEN: + default: + return self::OPEN; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PayFeed.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PayFeed.php new file mode 100644 index 00000000..511b7ef2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PayFeed.php @@ -0,0 +1,284 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use WP_Post; + +/** + * Title: WordPress pay extension Gravity Forms pay feed + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.3.0 + * @since 1.4.4 + */ +class PayFeed { + /** + * Indicator for an link to an WordPress page + * + * @var string + */ + const LINK_TYPE_PAGE = 'page'; + + /** + * Indicator for an link to an URL + * + * @var string + */ + const LINK_TYPE_URL = 'url'; + + /** + * Indicator for an link to the Gravity Forms confirmation. + * + * @var string + * @since 1.4.4 + */ + const LINK_TYPE_CONFIRMATION = 'confirmation'; + + /** + * The payment (post) ID. + * + * @var int + */ + public $id; + + /** + * The payment post object. + * + * @var WP_Post + */ + public $post; + + /** + * Condition enabled flag. + * + * @var bool + */ + public $condition_enabled; + + /** + * Conditional logic object. + * + * @var null|array + */ + public $conditional_logic_object; + + /** + * Delay notification ID's contains an array of notification ID's which + * should be delayed till the payment is successful. + * + * @since Gravity Forms 1.7 + * @var array + */ + public $delay_notification_ids; + + /** + * Flag to delay the creation of an post till the the payment is successful. + * + * @var boolean + */ + public $delay_post_creation; + + /** + * Flag to delay the creation of an post till the the payment is successful. + * + * @deprecated Gravity Forms 1.7 + * @var boolean + */ + public $delay_admin_notification; + + /** + * Flag to delay the creation of an post till the the payment is successful. + * + * @deprecated Gravity Forms 1.7 + * @var boolean + */ + public $delay_user_notification; + + /** + * Subscription frequency. + * + * @deprecated 2.5.0 + * @var string|false + */ + public $subscription_frequency; + + /** + * Construct and initialize payment object. + * + * @param int $post_id Post ID. + */ + public function __construct( $post_id ) { + $this->id = $post_id; + $this->post = get_post( $post_id ); + + // Load. + $this->form_id = get_post_meta( $post_id, '_pronamic_pay_gf_form_id', true ); + $this->config_id = get_post_meta( $post_id, '_pronamic_pay_gf_config_id', true ); + $this->entry_id_prefix = get_post_meta( $post_id, '_pronamic_pay_gf_entry_id_prefix', true ); + $this->order_id = get_post_meta( $post_id, '_pronamic_pay_gf_order_id', true ); + $this->transaction_description = get_post_meta( $post_id, '_pronamic_pay_gf_transaction_description', true ); + $this->condition_enabled = get_post_meta( $post_id, '_pronamic_pay_gf_condition_enabled', true ); + + // Conditional logic. + $conditional_logic_object = get_post_meta( $post_id, '_gaddon_setting_feed_condition_conditional_logic_object', true ); + + if ( ! empty( $conditional_logic_object ) ) { + $this->conditional_logic_object = \json_decode( $conditional_logic_object, true ); + } + + /* + * Legacy condition for backwards compatibility. + * + * @since 2.3.0 + */ + if ( null === $this->conditional_logic_object ) { + $condition_field_id = get_post_meta( $post_id, '_pronamic_pay_gf_condition_field_id', true ); + $condition_operator = get_post_meta( $post_id, '_pronamic_pay_gf_condition_operator', true ); + $condition_value = get_post_meta( $post_id, '_pronamic_pay_gf_condition_value', true ); + + if ( ! empty( $condition_field_id ) && ! empty( $condition_operator ) && ! empty( $condition_value ) ) { + $this->conditional_logic_object = array( + 'conditionalLogic' => array( + 'actionType' => 'show', + 'logicType' => 'all', + 'rules' => array( + array( + 'fieldId' => $condition_field_id, + 'operator' => ( GravityForms::OPERATOR_IS === $condition_operator ? 'is' : 'isnot' ), + 'value' => $condition_value, + ), + ), + ), + ); + } + } + + // Delay actions. + $this->delay_admin_notification = get_post_meta( $post_id, '_pronamic_pay_gf_delay_admin_notification', true ); + $this->delay_user_notification = get_post_meta( $post_id, '_pronamic_pay_gf_delay_user_notification', true ); + $this->delay_post_creation = get_post_meta( $post_id, '_pronamic_pay_gf_delay_post_creation', true ); + + $this->delay_actions = array(); + + $delay_actions = Extension::get_delay_actions(); + + $delay_actions = array_filter( + $delay_actions, + function( $action ) { + return $action['active']; + } + ); + + foreach ( $delay_actions as $slug => $data ) { + if ( '1' === get_post_meta( $post_id, $data['meta_key'], true ) ) { + $this->delay_actions[ $slug ] = $data; + } + } + + // Other. + $this->user_role_field_id = get_post_meta( $post_id, '_pronamic_pay_gf_user_role_field_id', true ); + + // Subscription. + $this->subscription_amount_type = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_amount_type', true ); + $this->subscription_amount_field = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_amount_field', true ); + $this->subscription_interval_type = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_type', true ); + $this->subscription_interval = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval', true ); + $this->subscription_interval_period = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_period', true ); + $this->subscription_interval_date_type = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_date_type', true ); + $this->subscription_interval_date = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_date', true ); + $this->subscription_interval_date_day = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_date_day', true ); + $this->subscription_interval_date_month = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_date_month', true ); + $this->subscription_interval_date_prorate = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_date_prorate', true ); + $this->subscription_interval_field = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_interval_field', true ); + $this->subscription_frequency_type = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_frequency_type', true ); + $this->subscription_frequency = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_frequency', true ); + $this->subscription_number_periods = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_number_periods', true ); + $this->subscription_frequency_field = get_post_meta( $post_id, '_pronamic_pay_gf_subscription_frequency_field', true ); + + /* + * Set subscription number periods from deprecated frequency setting + * for backwards compatibility. Add one, because the frequency excluded + * the first payment and total number of periods includes the first payment. + */ + if ( empty( $this->subscription_number_periods ) && ! empty( $this->subscription_frequency ) ) { + $this->subscription_number_periods = intval( $this->subscription_frequency ) + 1; + } + + if ( empty( $this->subscription_interval_date_type ) ) { + $this->subscription_interval_date_type = 'payment_date'; + } + + /** + * In version 2.5 the 'last' monthday option was removed. + * + * @link https://github.com/wp-pay-extensions/gravityforms/blob/2.4.0/views/html-admin-feed-settings.php#L753 + * @link https://github.com/wp-pay/core/issues/17 + */ + if ( 'last' === $this->subscription_interval_date ) { + $this->subscription_interval_date = 28; + } + + // Delay notification IDs. + $ids = get_post_meta( $post_id, '_pronamic_pay_gf_delay_notification_ids', true ); + $this->delay_notification_ids = is_array( $ids ) ? $ids : array(); + + // Fields. + $fields = get_post_meta( $post_id, '_pronamic_pay_gf_fields', true ); + $this->fields = is_array( $fields ) ? $fields : array(); + + // Links. + $links = get_post_meta( $post_id, '_pronamic_pay_gf_links', true ); + $this->links = is_array( $links ) ? $links : array(); + } + + /** + * Get the URL of the specified name + * + * @param string $name Name. + * + * @return false|null|string + */ + public function get_url( $name ) { + $url = null; + + if ( isset( $this->links[ $name ] ) ) { + $link = $this->links[ $name ]; + + // link is a standard class object, the type variable could not be defined. + if ( isset( $link['type'] ) ) { + switch ( $link['type'] ) { + case self::LINK_TYPE_PAGE: + $url = get_permalink( $link['page_id'] ); + + break; + case self::LINK_TYPE_URL: + $url = $link['url']; + + break; + } + } + } + + return $url; + } + + /** + * Returns a boolean if this feed has some delayed notifications + * + * @return boolean + */ + public function has_delayed_notifications() { + return ( ! empty( $this->delay_notification_ids ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php new file mode 100644 index 00000000..141acf70 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentAddOn.php @@ -0,0 +1,611 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use GFAddOnFeedsTable; +use GFPaymentAddOn; +use WP_Query; + +/** + * Title: WordPress pay extension Gravity Forms payment add-on + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.4.1 + * @since 1.1.0 + */ +class PaymentAddOn extends GFPaymentAddOn { + /** + * Slug. + * + * @var string + */ + const SLUG = 'pronamic_pay'; + + /** + * Capabilities. + * + * @link https://github.com/wp-premium/gravityformspaypal/blob/2.3.1/class-gf-paypal.php#L21-L22 + * + * @var array + */ + protected $_capabilities = array( + 'gravityforms_pronamic_pay', + 'gravityforms_pronamic_pay_uninstall', + ); + + /** + * Capabilities settings page. + * + * @link https://github.com/wp-premium/gravityformspaypal/blob/2.3.1/class-gf-paypal.php#L24-L27 + * + * @var string + */ + protected $_capabilities_settings_page = 'gravityforms_pronamic_pay'; + + /** + * Capabilities form settings. + * + * @var string + */ + protected $_capabilities_form_settings = 'gravityforms_pronamic_pay'; + + /** + * Capabilities uninstall. + * + * @var string + */ + protected $_capabilities_uninstall = 'gravityforms_pronamic_pay_uninstall'; + + /** + * Construct and initialize an Gravity Forms payment add-on + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.10.15/includes/addon/class-gf-payment-addon.php + * + * @since 1.3.0 + */ + public function __construct() { + parent::__construct(); + + /* + * Slug. + * + * @var string URL-friendly identifier used for form settings, add-on settings, text domain localization... + * @link https://github.com/wp-premium/gravityforms/blob/1.9.10.15/includes/addon/class-gf-addon.php#L24-L27 + */ + $this->_slug = self::SLUG; + + /* + * Title. + * + * @var string Title of the plugin to be used on the settings page, form settings and plugins page. Example: 'Gravity Forms MailChimp Add-On' + * @link https://github.com/wp-premium/gravityforms/blob/1.9.10.15/includes/addon/class-gf-addon.php#L40-L43 + */ + $this->_title = __( 'Pronamic Pay Add-On', 'pronamic_ideal' ); + + /* + * Short title. + * + * @var string Short version of the plugin title to be used on menus and other places where a less verbose string is useful. Example: 'MailChimp' + * @link https://github.com/wp-premium/gravityforms/blob/1.9.10.15/includes/addon/class-gf-addon.php#L44-L47 + */ + $this->_short_title = __( 'Pay', 'pronamic_ideal' ); + + /* + * Actions. + */ + add_action( 'admin_init', array( $this, 'pronamic_maybe_save_feed' ), 20 ); + + /* + * Filters. + */ + add_filter( 'gform_admin_pre_render', array( $this, 'admin_pre_render' ), 10, 1 ); + } + + /** + * Maybe save feed. + */ + public function pronamic_maybe_save_feed() { + if ( ! filter_has_var( INPUT_POST, 'pronamic_pay_nonce' ) ) { + return; + } + + if ( ! filter_has_var( INPUT_GET, 'id' ) ) { + return; + } + + if ( ! filter_has_var( INPUT_GET, 'fid' ) ) { + return; + } + + $form_id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); + $post_id = filter_input( INPUT_GET, 'fid', FILTER_SANITIZE_STRING ); + + if ( empty( $form_id ) ) { + return; + } + + check_admin_referer( 'pronamic_pay_save_pay_gf', 'pronamic_pay_nonce' ); + + $post_title = filter_input( INPUT_POST, '_pronamic_pay_gf_post_title', FILTER_SANITIZE_STRING ); + + if ( '' === trim( $post_title ) ) { + $feeds = $this->get_feeds( $form_id ); + + $post_title = sprintf( + '%s #%s', + __( 'Payment feed', 'pronamic_ideal' ), + count( $feeds ) + 1 + ); + } + + $post_id = wp_insert_post( + array( + 'ID' => $post_id, + 'post_type' => 'pronamic_pay_gf', + 'post_title' => $post_title, + 'post_status' => 'publish', + 'comment_status' => 'closed', + 'ping_status' => 'closed', + ) + ); + + $url = add_query_arg( + array( + 'page' => 'gf_edit_forms', + 'view' => 'settings', + 'subview' => 'pronamic_pay', + 'id' => $form_id, + 'fid' => $post_id, + 'message' => $post_id ? '1' : '0', + ), + 'admin.php' + ); + + wp_safe_redirect( $url ); + + exit; + } + + /** + * Filter the form in admin. + * + * @param array|null $form Gravity Forms form. + * + * @return array + */ + public function admin_pre_render( $form ) { + if ( null === $form ) { + return $form; + } + + $feeds = FeedsDB::get_feeds_by_form_id( $form['id'] ); + + $condition_field_ids = array(); + + foreach ( $feeds as $feed ) { + if ( empty( $feed->condition_field_id ) ) { + continue; + } + + $condition_field_ids[] = $feed->condition_field_id; + } + + $form['pronamic_pay_condition_field_ids'] = $condition_field_ids; + + return $form; + } + + /** + * Form settings page. + * + * @since 1.3.0 + * + * @param array $form Gravity Forms form. + */ + public function form_settings( $form ) { + $form_id = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); + $post_id = filter_input( INPUT_GET, 'fid', FILTER_SANITIZE_STRING ); + + if ( $this->is_detail_page() ) { + $feed = new PayFeed( $post_id ); + + $this->set_settings( + array( + 'feed_condition_conditional_logic' => $feed->condition_enabled, + 'feed_condition_conditional_logic_object' => $feed->conditional_logic_object, + ) + ); + + require dirname( __FILE__ ) . '/../views/html-admin-feed-gf-box.php'; + } else { + $this->feed_list_page( $form ); + } + } + + /** + * Feed list title. + * + * @return string + */ + public function feed_list_title() { + $title = sprintf( + ' %s', + esc_html__( 'Pay Feeds', 'pronamic_ideal' ) + ); + + if ( ! $this->can_create_feed() ) { + return $title; + } + + $url = add_query_arg( array( 'fid' => '0' ) ); + + $title .= sprintf( + '%s', + esc_url( $url ), + esc_html__( 'Add New', 'pronamic_ideal' ) + ); + + return $title; + } + + /** + * Get feed table. + * + * @param array $form Gravity Forms form. + * + * @return GFAddOnFeedsTable + */ + public function get_feed_table( $form ) { + $feeds = $this->get_feeds( rgar( $form, 'id' ) ); + $columns = $this->feed_list_columns(); + $bulk_actions = $this->get_bulk_actions(); + $action_links = $this->get_action_links(); + $column_value_callback = array( $this, 'get_column_value' ); + $no_item_callback = array( $this, 'feed_list_no_item_message' ); + $message_callback = array( $this, 'feed_list_message' ); + + $feed_table = new GFAddOnFeedsTable( $feeds, $this->_slug, $columns, $bulk_actions, $action_links, $column_value_callback, $no_item_callback, $message_callback, $this ); + + $feed_table->prepare_items(); + + return $feed_table; + } + + /** + * Get feeds. + * + * @param int|null $form_id Form ID. + * + * @return array Feeds. + */ + public function get_feeds( $form_id = null ) { + $query = new WP_Query( + array( + 'post_type' => 'pronamic_pay_gf', + 'posts_per_page' => 50, + 'meta_query' => array( + array( + 'key' => '_pronamic_pay_gf_form_id', + 'value' => $form_id, + ), + ), + ) + ); + + $posts = array(); + + foreach ( $query->posts as $post ) { + $post = (array) $post; + + $post = array_merge( + $post, + array( + 'id' => $post['ID'], + 'form_id' => get_post_meta( $post['ID'], '_pronamic_pay_gf_form_id', true ), + 'is_active' => true, + 'meta' => array( + 'post' => $post, + 'feed_name' => $post['post_title'], + 'transactionType' => 'product', + ), + ) + ); + + // Is activated? + if ( '0' === get_post_meta( $post['id'], '_pronamic_pay_gf_feed_active', true ) ) { + $post['is_active'] = false; + } + + $posts[] = $post; + } + + return $posts; + } + + /** + * Get feed. + * + * @param int|string $id Feed ID. + * + * @return false|array Feed or false if feed doesn't exist. + */ + public function get_feed( $id ) { + $post = get_post( $id, ARRAY_A ); + + if ( null === $post ) { + return false; + } + + $post = array_merge( + $post, + array( + 'id' => $post['ID'], + 'form_id' => get_post_meta( $id, '_pronamic_pay_gf_form_id', true ), + 'is_active' => true, + 'meta' => array( + 'post' => $post, + 'feed_name' => $post['post_title'], + 'transactionType' => 'product', + ), + ) + ); + + // Is activated? + if ( '0' === get_post_meta( $post['id'], '_pronamic_pay_gf_feed_active', true ) ) { + $post['is_active'] = false; + } + + return $post; + } + + /** + * Is feed condition met? + * + * @param array $feed Feed. + * @param array $form Gravity Forms form. + * @param array $entry Gravity Forms entry. + * + * @return bool + */ + public function is_feed_condition_met( $feed, $form, $entry ) { + $pay_feed = new PayFeed( $feed['ID'] ); + + if ( ! \array_key_exists( 'meta', $feed ) ) { + $feed['meta'] = array(); + } + + $feed['meta'] = array( + 'feed_condition_conditional_logic' => $pay_feed->condition_enabled, + 'feed_condition_conditional_logic_object' => $pay_feed->conditional_logic_object, + ); + + return parent::is_feed_condition_met( $feed, $form, $entry ); + } + + /** + * Feed list columns. + * + * @return array + */ + public function feed_list_columns() { + return array( + 'name' => esc_html__( 'Name', 'pronamic_ideal' ), + 'transaction_description' => esc_html__( 'Transaction Description', 'pronamic_ideal' ), + 'configuration' => esc_html__( 'Configuration', 'pronamic_ideal' ), + ); + } + + /** + * Column name value. + * + * @param array $feed Feed. + * + * @since unreleased + */ + public function get_column_value_name( $feed ) { + $title = get_the_title( $feed['id'] ); + + if ( empty( $title ) ) { + $title = __( 'Default pay feed', 'pronamic_ideal' ); + } + + $edit_url = add_query_arg( array( 'fid' => $feed['id'] ) ); + + ?> + + + + , 2: */ + $label = __( 'This form doesn\'t have any pay feeds. Let\'s go %1$screate one%2$s.', 'pronamic_ideal' ); + + printf( + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $label, + '', + '' + ); + } + + /** + * Add supported notification events. + * + * @param array $form The form currently being processed. + * + * @return array + */ + public function supported_notification_events( $form ) { + $events = array(); + + // Check if form has feeds for this add-on. + if ( ! $this->has_feed( $form['id'] ) ) { + return $events; + } + + $events = array( + 'complete_payment' => esc_html__( 'Payment Completed', 'pronamic_ideal' ), + 'fail_payment' => esc_html__( 'Payment Failed', 'pronamic_ideal' ), + 'add_pending_payment' => esc_html__( 'Payment Pending', 'pronamic_ideal' ), + + // Subscription events. + 'create_subscription' => esc_html__( 'Subscription Created', 'pronamic_ideal' ), + 'cancel_subscription' => esc_html__( 'Subscription Canceled', 'pronamic_ideal' ), + 'expire_subscription' => esc_html__( 'Subscription Expired', 'pronamic_ideal' ), + 'renew_subscription' => esc_html__( 'Subscription Renewal Notice', 'pronamic_ideal' ), + 'add_subscription_payment' => esc_html__( 'Subscription Payment Added', 'pronamic_ideal' ), + 'fail_subscription_payment' => esc_html__( 'Subscription Payment Failed', 'pronamic_ideal' ), + ); + + return $events; + } + + /** + * Activate feed. + * + * @param string $feed_id Feed ID. + * @param bool $is_active Is active flag. + * + * @return bool|int + */ + public function update_feed_active( $feed_id, $is_active ) { + return update_post_meta( $feed_id, '_pronamic_pay_gf_feed_active', $is_active ); + } + + /** + * Allow payment feeds to be duplicated. + * + * @param int|array $id The ID of the feed to be duplicated or the feed object when duplicating a form. + * + * @return boolean + */ + public function can_duplicate_feed( $id ) { + return true; + } + + /** + * Insert feed. + * + * @param string|int $form_id Form ID. + * @param bool $is_active Whether or not the feed is activated. + * @param array $meta Feed meta. + * + * @return int + */ + public function insert_feed( $form_id, $is_active, $meta ) { + // Original feed post is passed in meta through `get_feed()` method. + $original_feed = $meta['post']; + + // Insert post. + $post_id = wp_insert_post( + array( + 'post_type' => 'pronamic_pay_gf', + 'post_title' => $meta['feed_name'], + 'post_status' => 'publish', + 'comment_status' => 'closed', + 'ping_status' => 'closed', + ) + ); + + $original_meta = get_post_meta( $original_feed['ID'] ); + + foreach ( $original_meta as $meta_key => $meta_value ) { + $meta_value = array_shift( $meta_value ); + + if ( is_serialized( $meta_value ) ) { + $meta_value = unserialize( $meta_value ); + } + + switch ( $meta_key ) { + case '_pronamic_pay_gf_form_id': + $meta_value = $form_id; + + break; + case '_pronamic_pay_gf_feed_active': + $meta_value = $is_active; + + break; + } + + update_post_meta( $post_id, $meta_key, $meta_value ); + } + + return $post_id; + } + + /** + * Delete feed. + * + * @param int $feed_id Feed ID. + */ + public function delete_feed( $feed_id ) { + wp_delete_post( $feed_id ); + } + + /** + * Delete feeds. + * + * @param int $form_id Form ID. + */ + public function delete_feeds( $form_id = null ) { + if ( null === $form_id ) { + return; + } + + $feeds = $this->get_feeds( $form_id ); + + foreach ( $feeds as $feed ) { + $this->get_feed( $feed['ID'] ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentData.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentData.php new file mode 100644 index 00000000..ac8887e9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentData.php @@ -0,0 +1,295 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use GFCommon; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\CreditCard; +use RGFormsModel; + +/** + * Title: WordPress pay extension Gravity Forms payment data + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.10 + * @since 1.0.1 + */ +class PaymentData { + /** + * Gravity Forms form object + * + * @link http://www.gravityhelp.com/documentation/page/Form_Object + * @var array + */ + private $form; + + /** + * Gravity Forms entry object + * + * @link http://www.gravityhelp.com/documentation/page/Entry_Object + * @var array + */ + private $lead; + + /** + * Payment feed object + * + * @var PayFeed + */ + private $feed; + + /** + * Constructs and initialize an Gravity Forms iDEAL data proxy + * + * @param array $form Gravity Forms form. + * @param array $lead Gravity Forms lead/entry. + * @param PayFeed $feed Pay feed. + */ + public function __construct( $form, $lead, $feed ) { + $this->form = $form; + $this->lead = $lead; + $this->feed = $feed; + } + + /** + * Get the field value of the specified field + * + * @param string $field_name Field name. + * + * @return null|string + */ + public function get_field_value( $field_name ) { + if ( ! isset( $this->feed->fields[ $field_name ] ) ) { + return null; + } + + $field_id = $this->feed->fields[ $field_name ]; + + if ( 'auto' === $field_id ) { + $field_id = Util::get_detected_field_id( $field_name, $this->form, $this->lead ); + } + + if ( null === $field_id ) { + return null; + } + + if ( ! isset( $this->lead[ $field_id ] ) ) { + return null; + } + + return $this->lead[ $field_id ]; + } + + /** + * Get description. + * + * @return string + */ + public function get_description() { + $description = $this->feed->transaction_description; + + if ( empty( $description ) ) { + $description = '{entry_id}'; + } + + $description = GFCommon::replace_variables( $description, $this->form, $this->lead ); + + return $description; + } + + /** + * Get order ID. + * + * @return string + */ + public function get_order_id() { + $order_id = $this->feed->order_id; + + if ( ! empty( $this->feed->entry_id_prefix ) ) { + $order_id = $this->feed->entry_id_prefix . $order_id; + } + + if ( ! GFCommon::has_merge_tag( $order_id ) ) { + $order_id .= '{entry_id}'; + } + + $order_id = GFCommon::replace_variables( $order_id, $this->form, $this->lead ); + + return $order_id; + } + + /** + * Get currency alphabetic code. + * + * @return string + */ + public function get_currency_alphabetic_code() { + if ( isset( $this->lead['currency'] ) ) { + return $this->lead['currency']; + } + + return GFCommon::get_currency(); + } + + /** + * Get payment method. + * + * @return string|null + */ + public function get_payment_method() { + $fields = GFCommon::get_fields_by_type( $this->form, array( Fields::PAYMENT_METHODS_FIELD_TYPE ) ); + + foreach ( $fields as $field ) { + if ( ! RGFormsModel::is_field_hidden( $this->form, $field, array(), $this->lead ) ) { + $method = RGFormsModel::get_field_value( $field ); + + return $method; + } + } + } + + /** + * Get issuer ID. + * + * @return string|null + */ + public function get_issuer_id() { + $fields = GFCommon::get_fields_by_type( $this->form, array( IssuersField::TYPE ) ); + + foreach ( $fields as $field ) { + if ( RGFormsModel::is_field_hidden( $this->form, $field, array() ) ) { + continue; + } + + return RGFormsModel::get_field_value( $field ); + } + } + + /** + * Get credit card. + * + * @return CreditCard|null + */ + public function get_credit_card() { + $credit_card = null; + + $credit_card_fields = GFCommon::get_fields_by_type( $this->form, array( 'creditcard' ) ); + + $credit_card_field = array_shift( $credit_card_fields ); + + if ( $credit_card_field ) { + $credit_card = new CreditCard(); + + // Number. + $variable_name = sprintf( 'input_%s_1', $credit_card_field['id'] ); + $number = filter_input( INPUT_POST, $variable_name, FILTER_SANITIZE_STRING ); + + $credit_card->set_number( $number ); + + // Expiration date. + $variable_name = sprintf( 'input_%s_2', $credit_card_field['id'] ); + $expiration_date = filter_input( INPUT_POST, $variable_name, FILTER_VALIDATE_INT, FILTER_FORCE_ARRAY ); + + $month = array_shift( $expiration_date ); + $year = array_shift( $expiration_date ); + + $credit_card->set_expiration_month( $month ); + $credit_card->set_expiration_year( $year ); + + // Security code. + $variable_name = sprintf( 'input_%s_3', $credit_card_field['id'] ); + $security_code = filter_input( INPUT_POST, $variable_name, FILTER_SANITIZE_STRING ); + + $credit_card->set_security_code( $security_code ); + + // Name. + $variable_name = sprintf( 'input_%s_5', $credit_card_field['id'] ); + $name = filter_input( INPUT_POST, $variable_name, FILTER_SANITIZE_STRING ); + + $credit_card->set_name( $name ); + } + + return $credit_card; + } + + /** + * Get frequency. + * + * @return int|null + */ + public function get_subscription_frequency() { + switch ( $this->feed->subscription_frequency_type ) { + case GravityForms::SUBSCRIPTION_FREQUENCY_FIELD: + $field = RGFormsModel::get_field( $this->form, $this->feed->subscription_frequency_field ); + + if ( ! RGFormsModel::is_field_hidden( $this->form, $field, array(), $this->lead ) ) { + if ( isset( $this->lead[ $this->feed->subscription_frequency_field ] ) ) { + return intval( $this->lead[ $this->feed->subscription_frequency_field ] ); + } + } + + break; + case GravityForms::SUBSCRIPTION_FREQUENCY_FIXED: + return \intval( $this->feed->subscription_number_periods ); + } + + return null; + } + + /** + * Get subscription interval. + * + * @return object + */ + public function get_subscription_interval() { + $interval = (object) array( + 'unit' => 'D', + 'value' => null, + ); + + switch ( $this->feed->subscription_interval_type ) { + case GravityForms::SUBSCRIPTION_INTERVAL_FIELD: + $field = RGFormsModel::get_field( $this->form, $this->feed->subscription_interval_field ); + + if ( ! RGFormsModel::is_field_hidden( $this->form, $field, array(), $this->lead ) ) { + if ( isset( $this->lead[ $this->feed->subscription_interval_field ] ) ) { + $value = $this->lead[ $this->feed->subscription_interval_field ]; + + // Interval value. + $interval->value = \intval( $value ); + + // Interval unit. + $unit = Core_Util::string_to_interval_period( $value ); + + if ( null !== $unit ) { + $interval->unit = $unit; + } + } + } + + return $interval; + case GravityForms::SUBSCRIPTION_INTERVAL_FIXED: + $interval->value = \intval( $this->feed->subscription_interval ); + $interval->unit = $this->feed->subscription_interval_period; + + return $interval; + default: + return $interval; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php new file mode 100644 index 00000000..848f5c07 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentFormPostType.php @@ -0,0 +1,86 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +/** + * Title: WordPress payment form post type + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.2 + * @since 1.1.0 + */ +class PaymentFormPostType { + /** + * Construct and initialize payment form post type + */ + public function __construct() { + /** + * Priority of the initial post types function should be set to < 10. + * + * @link https://core.trac.wordpress.org/ticket/28488 + * @link https://core.trac.wordpress.org/changeset/29318 + * + * @link https://github.com/WordPress/WordPress/blob/4.0/wp-includes/post.php#L167 + */ + add_action( 'init', array( $this, 'init' ), 0 ); // Highest priority. + } + + /** + * Get the show UI flag for the payment form post type. + * + * @return boolean true if show UI, false otherwise + */ + private function get_show_ui() { + // If Gravity Forms is active and version is lower then 1.7 we show the WordPress UI. + return GravityForms::version_compare( '1.7', '<' ); + } + + /** + * Initialize. + */ + public function init() { + register_post_type( + 'pronamic_pay_gf', + array( + 'label' => __( 'Payment Feeds', 'pronamic_ideal' ), + 'labels' => array( + 'name' => __( 'Payment Feeds', 'pronamic_ideal' ), + 'singular_name' => __( 'Payment Feed', 'pronamic_ideal' ), + 'add_new' => __( 'Add New', 'pronamic_ideal' ), + 'add_new_item' => __( 'Add New Payment Feed', 'pronamic_ideal' ), + 'edit_item' => __( 'Edit Payment Feed', 'pronamic_ideal' ), + 'new_item' => __( 'New Payment Feed', 'pronamic_ideal' ), + 'all_items' => __( 'All Payment Feeds', 'pronamic_ideal' ), + 'view_item' => __( 'View Payment Feed', 'pronamic_ideal' ), + 'search_items' => __( 'Search Payment Feeds', 'pronamic_ideal' ), + 'not_found' => __( 'No payment feeds found.', 'pronamic_ideal' ), + 'not_found_in_trash' => __( 'No payment feeds found in Trash.', 'pronamic_ideal' ), + 'menu_name' => __( 'Payment Feeds', 'pronamic_ideal' ), + 'filter_items_list' => __( 'Filter payment feeds list', 'pronamic_ideal' ), + 'items_list_navigation' => __( 'Payment feeds list navigation', 'pronamic_ideal' ), + 'items_list' => __( 'Payment feeds list', 'pronamic_ideal' ), + ), + 'public' => false, + 'publicly_queryable' => false, + 'show_ui' => $this->get_show_ui(), + 'show_in_nav_menus' => false, + 'show_in_menu' => false, + 'show_in_admin_bar' => false, + 'supports' => array( 'title', 'revisions' ), + 'rewrite' => false, + 'query_var' => false, + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php new file mode 100644 index 00000000..dd95e465 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/PaymentMethodsField.php @@ -0,0 +1,819 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use GF_Field; +use GF_Field_Select; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WordPress pay extension Gravity Forms payment methods + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.3.1 + * @since 1.4.7 + * + * @property int $pronamicPayConfigId Added by admin.js. + * @property string $inputType https://github.com/wp-premium/gravityforms/blob/2.3.2/includes/fields/class-gf-field.php#L769-L777 + * @property array|null $inputs https://github.com/wp-premium/gravityforms/blob/2.3.2/includes/fields/class-gf-field.php#L416-L423 + * @property int $formId https://github.com/wp-premium/gravityforms/blob/2.3.2/includes/fields/class-gf-field.php#L1044 + * @property bool $enableChoiceValue https://github.com/wp-premium/gravityforms/search?q=enableChoiceValue + * @property array $choices https://github.com/wp-premium/gravityforms/search?q=%22%24this-%3Echoices%22 + */ +class PaymentMethodsField extends GF_Field_Select { + /** + * Type + * + * @var string + */ + const TYPE = Fields::PAYMENT_METHODS_FIELD_TYPE; + + /** + * Type + * + * @var string + */ + public $type = Fields::PAYMENT_METHODS_FIELD_TYPE; + + /** + * Constructs and initializes payment methods field. + * + * @param array $properties Field properties. + */ + public function __construct( $properties = array() ) { + parent::__construct( $properties ); + + /* + * The `inputType` of the payment methods field was in the past set to `checkbox` + * this results in a `GF_Field_Checkbox` field with additional inputs, but we what + * need is a payment methods field without additional inputs. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-fields.php#L60-L86 + */ + $this->inputs = null; + + // Actions. + if ( ! has_action( 'gform_editor_js_set_default_values', array( $this, 'editor_js_set_default_values' ) ) ) { + add_action( 'gform_editor_js_set_default_values', array( $this, 'editor_js_set_default_values' ) ); + } + + // Filters. + if ( ! has_filter( 'gform_gf_field_create', array( $this, 'field_create' ) ) ) { + add_filter( 'gform_gf_field_create', array( $this, 'field_create' ), 10, 2 ); + } + + if ( ! has_filter( 'gform_get_field_value', array( $this, 'get_field_value' ) ) ) { + add_filter( 'gform_get_field_value', array( $this, 'get_field_value' ), 10, 3 ); + } + + if ( ! has_filter( 'gform_form_update_meta', array( __CLASS__, 'form_update_meta' ) ) ) { + add_filter( 'gform_form_update_meta', array( __CLASS__, 'form_update_meta' ), 10, 3 ); + } + + if ( ! has_filter( 'gform_pre_render', array( __CLASS__, 'form_pre_render' ) ) ) { + add_filter( 'gform_pre_render', array( __CLASS__, 'form_pre_render' ), 10, 3 ); + } + + // Admin. + if ( is_admin() ) { + $this->inputType = 'checkbox'; + + /* + * Inputs property must be iterable. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.4.17/common.php#L804-L805 + */ + $this->inputs = array(); + + if ( empty( $this->formId ) && 'gf_edit_forms' === filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING ) ) { + $this->formId = filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); + } + } + + // Choices. + $this->enableChoiceValue = true; + + if ( isset( $this->formId ) ) { + $this->set_choices( $this->formId ); + } + + // Set default display mode. + if ( ! isset( $this->pronamicPayDisplayMode ) ) { + $this->pronamicPayDisplayMode = 'select'; + } + + // Add display mode CSS classes. + if ( false === strpos( $this->cssClass, 'pronamic_pay_display_icons' ) && 'icons' === substr( $this->pronamicPayDisplayMode, 0, 5 ) ) { + $this->cssClass .= ' pronamic_pay_display_icons'; + } + + if ( false === strpos( $this->cssClass, 'gf_list_2col' ) && in_array( $this->pronamicPayDisplayMode, array( 'icons-64', 'icons-125' ), true ) ) { + $this->cssClass .= ' gf_list_2col'; + } + } + + /** + * Filter the GF_Field object after it is created. + * + * @param \GF_Field $field A field object. + * @param array $properties An array of field properties used to generate the field object. + * + * @return \GF_Field + * + * @link https://docs.gravityforms.com/gform_gf_field_create/ + */ + public function field_create( $field, $properties ) { + // Check field type. + if ( $this->type !== $field->type ) { + return $field; + } + + // Check field object class. + if ( ! ( $field instanceof \Pronamic\WordPress\Pay\Extensions\GravityForms\PaymentMethodsField ) ) { + $field = new self( $properties ); + } + + return $field; + } + + /** + * Get form editor field settings for this field. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field-select.php#L16-L35 + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field.php#L144-L151 + * + * @return array + */ + public function get_form_editor_field_settings() { + return array( + 'conditional_logic_field_setting', + 'error_message_setting', + 'enable_enhanced_ui_setting', + 'label_setting', + 'label_placement_setting', + 'admin_label_setting', + 'size_setting', + 'choices_setting', + 'placeholder_setting', + 'description_setting', + 'css_class_setting', + 'rules_setting', + 'pronamic_pay_config_field_setting', + 'pronamic_pay_display_field_setting', + ); + } + + /** + * Get the gateways for this field. + * + * @return array + */ + private function get_gateways() { + $gateways = array(); + + $feeds = FeedsDB::get_feeds_by_form_id( $this->formId ); + + // Get all config IDs. + $config_ids = wp_list_pluck( $feeds, 'config_id' ); + + // Remove duplicates. + $config_ids = array_unique( $config_ids ); + + // Check if field config ID setting is set as config of a payment feed. + if ( isset( $this->pronamicPayConfigId ) && in_array( $this->pronamicPayConfigId, $config_ids, true ) ) { + $gateway = Plugin::get_gateway( $this->pronamicPayConfigId ); + + if ( $gateway ) { + $gateways[] = $gateway; + } + } + + // Get all gateways if config ID setting is unused. + if ( empty( $gateways ) ) { + $gateways = array_map( + array( 'Pronamic\WordPress\Pay\Plugin', 'get_gateway' ), + $config_ids + ); + + // Remove non-existing gateways. + $gateways = array_filter( $gateways ); + } + + return $gateways; + } + + /** + * Merge payment method choices from the payment gateway, leave `isSelected` in tact so users can enable/disable payment methods manual. + * + * @param int $form_id Form ID. + */ + private function set_choices( $form_id ) { + // Prevent HTTP requests in forms list. + if ( \doing_filter( 'gform_form_actions' ) ) { + $this->choices = array(); + + return; + } + + // Gateway available payment methods. + $payment_methods = $this->get_gateway_payment_methods(); + + // Choices. + $choices = array(); + + // Gravity Forms. + if ( is_array( $this->choices ) ) { + foreach ( $this->choices as $choice ) { + $value = $choice['value']; + + $choice['builtin'] = isset( $payment_methods[ $value ] ); + + $choices[ $value ] = $choice; + } + } + + // Built-in. + foreach ( $payment_methods as $value => $label ) { + // Only add built-in payment if it's not already set. + if ( ! isset( $choices[ $value ] ) ) { + $choices[ $value ] = array( + 'value' => $value, + 'text' => $label, + 'isSelected' => false, + 'builtin' => true, + ); + } + } + + // Set choices. + $this->choices = array_values( $choices ); + } + + /** + * Filter Gravity Forms selected choice. + * + * @param array $choice Choice. + * + * @return boolean true if 'isSelected' is set and true, false otherwise. + */ + public static function filter_choice_is_selected( $choice ) { + return is_array( $choice ) && isset( $choice['isSelected'] ) && $choice['isSelected']; + } + + /** + * Unselect the specified choice. + * + * @param array $choice Choice. + * + * @return array choice + */ + public function unselect_choice( $choice ) { + $choice['isSelected'] = false; + + return $choice; + } + + /** + * Get the field input. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field-select.php#L41-L60 + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/includes/fields/class-gf-field.php#L182-L193 + * + * @param array $form Form. + * @param string $value Field value. + * @param array $entry Entry. + * + * @return string + */ + public function get_field_input( $form, $value = '', $entry = null ) { + // Error handling. + if ( is_wp_error( $this->error ) ) { + return $this->error->get_error_message(); + } + + // Filter choices for display. + $choices = $this->choices; + + $display_choices = $choices; + + if ( \is_admin() && 'gf_edit_forms' === \filter_input( \INPUT_GET, 'page', \FILTER_SANITIZE_STRING ) ) { + $display_choices = array_filter( $choices, array( __CLASS__, 'filter_choice_is_selected' ) ); + } + + // Make first item selected. + \array_walk( + $display_choices, + function ( &$item, $key ) { + $item['isSelected'] = ( 0 === $key ); + } + ); + + $this->choices = \array_values( $display_choices ); + + // Input. + $input = parent::get_field_input( $form, $value, $entry ); + + $field_css_id = sprintf( '#field_%1$s_%2$s', $this->formId, $this->id ); + + if ( ! is_admin() && 'icons' === substr( $this->pronamicPayDisplayMode, 0, 5 ) ) { + ob_start(); + + ?> + +
    + +
    + + + + choices = $choices; + + if ( is_admin() ) { + $feeds = FeedsDB::get_feeds_by_form_id( $form['id'] ); + + if ( empty( $feeds ) ) { + $link = sprintf( + "%s", + esc_url( Admin::get_new_feed_url( $form['id'] ) ), + esc_html__( 'New Payment Feed', 'pronamic_ideal' ) + ); + + $input = $link . $input; + } + } + + return $input; + } + + /** + * Get value entry detail. + * + * @param array|string $value Value. + * @param string $currency Currency. + * @param bool $use_text Use text from choices. + * @param string $format Format. + * @param string $media Media. + * + * @return string + */ + public function get_value_entry_detail( $value, $currency = '', $use_text = false, $format = 'html', $media = 'screen' ) { + $use_text = true; + + return parent::get_value_entry_detail( $value, $currency, $use_text, $format, $media ); + } + + /** + * Get field value. + * + * @param string|array $value Field value. + * @param array $entry Entry. + * @param GF_Field|null $field Field. + * + * @return string|array + */ + public function get_field_value( $value, $entry, $field ) { + if ( ! \is_object( $field ) ) { + return $value; + } + + if ( self::TYPE !== $field->type ) { + return $value; + } + + // Check if already a string value. + if ( ! \is_array( $value ) ) { + return $value; + } + + $value = \array_shift( $value ); + + return $value; + } + + /** + * Filter form update meta. + * + * @param array $form_meta Form meta. + * @param int $form_id Form id. + * @param string $meta_name Meta name. + * + * @return array + */ + public static function form_update_meta( $form_meta, $form_id, $meta_name ) { + if ( 'display_meta' === $meta_name ) { + foreach ( $form_meta['fields'] as &$field ) { + if ( self::TYPE !== $field['type'] ) { + continue; + } + + $field->inputType = 'select'; + } + } + + return $form_meta; + } + + /** + * Form pre render. + * + * @param array $form Form. + * @param bool $ajax Whether or not to use AJAX. + * @param array $field_values Field values. + * @return array + */ + public static function form_pre_render( $form, $ajax, $field_values ) { + foreach ( $form['fields'] as $key => &$field ) { + // Check field type. + if ( self::TYPE !== $field->type ) { + continue; + } + + // Remove unselected choices. + $display_choices = array_filter( $field['choices'], array( __CLASS__, 'filter_choice_is_selected' ) ); + + // Set first item as selected. + \array_walk( + $display_choices, + function ( &$item, $key ) { + $item['isSelected'] = ( 0 === $key ); + } + ); + + // Set field choices. + $field['choices'] = $display_choices; + } + + return $form; + } + + /** + * Get form editor field title. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field.php#L106-L113 + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field-select.php#L12-L14 + * + * @return string + */ + public function get_form_editor_field_title() { + return esc_attr__( 'Payment Method', 'pronamic_ideal' ); + } + + /** + * Get form editor button. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field.php#L115-L129 + * + * @return array + */ + public function get_form_editor_button() { + return array( + 'group' => 'pronamic_pay_fields', + 'text' => __( 'Payment Method', 'pronamic_ideal' ), + ); + } + + /** + * Add button. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/form_detail.php#L2353-L2368 + * @link https://github.com/wp-premium/gravityforms/blob/1.9.19/includes/fields/class-gf-field.php#L617-L652 + * + * @param array $field_groups Field groups. + * + * @return array + */ + public function add_button( $field_groups ) { + // We have to make sure the custom pay field group is added, otherwise the button won't be added. + $field_groups = Fields::add_pay_field_group( $field_groups ); + + return parent::add_button( $field_groups ); + } + + /** + * Get gateway available payment methods. + * + * @return array + */ + private function get_gateway_payment_methods() { + $gateways = $this->get_gateways(); + + $payment_methods = array(); + + foreach ( $gateways as $gateway ) { + $options = $gateway->get_payment_method_field_options( false ); + + $payment_methods = array_merge( $payment_methods, $options ); + + $this->error = $gateway->get_error(); + } + + if ( empty( $payment_methods ) ) { + $active_methods = PaymentMethods::get_active_payment_methods(); + + foreach ( $active_methods as $payment_method ) { + $payment_methods[ $payment_method ] = PaymentMethods::get_name( $payment_method ); + } + } + + return $payment_methods; + } + + /** + * Editor JavaScript default field values. + * + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/js.php#L587-L599 + * @link https://github.com/wp-premium/gravityforms/blob/2.0.3/js/forms.js#L38-L43 + */ + public function editor_js_set_default_values() { + ?> + case '' : + if ( ! field.label ) { + field.label = ''; + } + + field.enableChoiceValue = true; + + if ( ! field.choices ) { + field.choices = new Array(); + + get_gateway_payment_methods() as $payment_method => $name ) : ?> + + var choice = new Choice( , ); + + choice.isSelected = true; + choice.builtin = true; + + field.choices.push( choice ); + + + + } + + break; + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_Statuses; + +/** + * Title: WordPress pay extension Gravity Forms payment statuses + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.12 + * @since 1.0.0 + */ +class PaymentStatuses { + /** + * Payment status processing + * + * @var string + */ + const PROCESSING = 'Processing'; + + /** + * Payment status active + * + * @var string + */ + const ACTIVE = 'Active'; + + /** + * Payment status cancelled + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Payment status expired + * + * @var string + */ + const EXPIRED = 'Expired'; + + /** + * Payment status failed + * + * @var string + */ + const FAILED = 'Failed'; + + /** + * Payment status approved + * + * @var string + */ + const APPROVED = 'Approved'; + + /** + * Payment status paid + * + * @var string + */ + const PAID = 'Paid'; + + /** + * Payment status denied + * + * @var string + */ + const DENIED = 'Denied'; + + /** + * Payment status pending + * + * @var string + */ + const PENDING = 'Pending'; + + /** + * Payment status refunded + * + * @var string + */ + const REFUNDED = 'Refunded'; + + /** + * Payment status voided + * + * @var string + */ + const VOIDED = 'Voided'; + + /** + * Transform a Pronamic Pay status to a Gravity Forms payment status. + * + * @since 2.1.1 + * @param string $status OmniKassa 2.0 status. + * @return string|null + */ + public static function transform( $status ) { + switch ( $status ) { + case Core_Statuses::SUCCESS: + return self::PAID; + + case Core_Statuses::CANCELLED: + return self::CANCELLED; + + case Core_Statuses::EXPIRED: + return self::EXPIRED; + + case Core_Statuses::FAILURE: + return self::FAILED; + + case Core_Statuses::REFUNDED: + return self::REFUNDED; + + case Core_Statuses::RESERVED: + case Core_Statuses::OPEN: + return self::PROCESSING; + + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Processor.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Processor.php new file mode 100644 index 00000000..1f6b0003 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Processor.php @@ -0,0 +1,761 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use GFCommon; +use Pronamic\WordPress\Money\Currency; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentLines; +use Pronamic\WordPress\Pay\Payments\PaymentLineType; +use Pronamic\WordPress\Pay\Subscriptions\AlignmentRule; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionInterval; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPhase; + +/** + * Title: WordPress pay extension Gravity Forms processor + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.4.1 + * @since 1.0.0 + */ +class Processor { + /** + * The Pronamic Pay Gravity Forms extension + * + * @var Extension + */ + private $extension; + + /** + * The Gravity Forms form + * + * @var array + */ + private $form; + + /** + * The Gravity Forms form ID + * + * @var null|string + */ + private $form_id; + + /** + * Payment feed + * + * @var null|PayFeed + */ + private $feed; + + /** + * Gateway + * + * @var null|AbstractGatewayIntegration + */ + private $gateway; + + /** + * Payment + * + * @var null|Payment + */ + private $payment; + + /** + * Error + * + * @var null|\Exception + */ + private $error; + + /** + * Constructs and initalize an Gravity Forms payment form processor + * + * @param array $form Gravity Forms form. + * @param Extension $extension Extension. + */ + public function __construct( array $form, Extension $extension ) { + $this->extension = $extension; + $this->form = $form; + $this->form_id = isset( $form['id'] ) ? $form['id'] : null; + + // Determine payment feed for processing. + $feeds = FeedsDB::get_active_feeds_by_form_id( $this->form_id ); + + $entry = array(); + + foreach ( $feeds as $feed ) { + $gf_feed = $extension->addon->get_feed( $feed->id ); + + if ( false === $gf_feed ) { + continue; + } + + if ( ! $extension->addon->is_feed_condition_met( $gf_feed, $form, $entry ) ) { + continue; + } + + $this->feed = $feed; + + $this->add_hooks(); + + break; + } + } + + /** + * Add hooks. + */ + private function add_hooks() { + /* + * Handle submission. + */ + + // Lead. + add_action( 'gform_entry_post_save', array( $this, 'entry_post_save' ), 10, 2 ); + + // Delay (@see GFFormDisplay::handle_submission > GFCommon::send_form_submission_notifications). + add_filter( 'gform_disable_admin_notification_' . $this->form_id, array( $this, 'maybe_delay_admin_notification' ), 10, 3 ); + add_filter( 'gform_disable_user_notification_' . $this->form_id, array( $this, 'maybe_delay_user_notification' ), 10, 3 ); + add_filter( 'gform_disable_post_creation_' . $this->form_id, array( $this, 'maybe_delay_post_creation' ), 10, 3 ); + add_filter( 'gform_disable_notification_' . $this->form_id, array( $this, 'maybe_delay_notification' ), 10, 4 ); + + // Confirmation (@see GFFormDisplay::handle_confirmation). + // @link http://www.gravityhelp.com/documentation/page/Gform_confirmation. + add_filter( 'gform_confirmation_' . $this->form_id, array( $this, 'confirmation' ), 10, 4 ); + + /* + * After submission. + */ + add_action( 'gform_after_submission_' . $this->form_id, array( $this, 'after_submission' ), 10, 2 ); + + add_filter( 'gform_is_delayed_pre_process_feed_' . $this->form_id, array( $this, 'maybe_delay_feed' ), 10, 4 ); + add_filter( 'gravityflow_is_delayed_pre_process_workflow', array( $this, 'maybe_delay_workflow' ), 10, 3 ); + } + + /** + * Check if we are processing the passed in form. + * + * @param array $form Gravity Forms form. + * + * @return bool True if the passed in form is processed, false otherwise. + */ + public function is_processing( $form ) { + $is_form = false; + + if ( isset( $form['id'] ) ) { + $is_form = ( absint( $this->form_id ) === absint( $form['id'] ) ); + } + + $is_processing = ( null !== $this->feed ) && $is_form; + + return $is_processing; + } + + /** + * Pre submission. + * + * @param array $form Gravity Forms form. + * @return void + */ + public function pre_submission( $form ) { + if ( ! $this->is_processing( $form ) ) { + return; + } + + /* + * Delay actions. + * + * The Add-Ons mainly use the 'gform_after_submission' to export entries, to delay this we have to remove these + * actions before this filter executes. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.8.16/form_display.php#L101-L103. + * @link https://github.com/wp-premium/gravityforms/blob/1.8.16/form_display.php#L111-L113. + */ + + foreach ( $this->feed->delay_actions as $slug => $data ) { + $delayed_payment_integration = ( isset( $data['delayed_payment_integration'] ) && true === $data['delayed_payment_integration'] ); + + if ( isset( $data['addon'] ) && ! $delayed_payment_integration ) { + remove_filter( 'gform_entry_post_save', array( $data['addon'], 'maybe_process_feed' ), 10 ); + } + + if ( isset( $data['delay_callback'] ) ) { + call_user_func( $data['delay_callback'] ); + } + } + } + + /** + * Entry post save. + * + * @param array $lead Gravity Forms lead/entry. + * @param array $form Gravity Forms form. + * + * @return array + */ + public function entry_post_save( $lead, $form ) { + if ( ! $this->is_processing( $form ) ) { + return $lead; + } + + // Check for payment ID. + $payment_id = gform_get_meta( $lead['id'], 'pronamic_payment_id' ); + + if ( ! empty( $payment_id ) ) { + return $lead; + } + + // Gateway. + $this->gateway = Plugin::get_gateway( $this->feed->config_id ); + + if ( ! $this->gateway ) { + return $lead; + } + + // Payment data. + $data = new PaymentData( $form, $lead, $this->feed ); + + // Payment. + $payment = new Payment(); + + $payment->title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + $data->get_description() + ); + + $payment->config_id = $this->feed->config_id; + $payment->order_id = $data->get_order_id(); + $payment->description = $data->get_description(); + $payment->method = $data->get_payment_method(); + $payment->issuer = $data->get_issuer_id(); + + // Currency. + $currency = Currency::get_instance( $data->get_currency_alphabetic_code() ); + + // Source. + $payment->set_source( 'gravityformsideal' ); + $payment->set_source_id( $lead['id'] ); + + // Credit Card. + $payment->set_credit_card( $data->get_credit_card() ); + + // Name. + $name = new ContactName(); + + $name->set_prefix( $data->get_field_value( 'prefix_name' ) ); + $name->set_first_name( $data->get_field_value( 'first_name' ) ); + $name->set_middle_name( $data->get_field_value( 'middle_name' ) ); + $name->set_last_name( $data->get_field_value( 'last_name' ) ); + $name->set_suffix( $data->get_field_value( 'suffix_name' ) ); + + // Customer. + $customer = new Customer(); + + $customer->set_name( $name ); + $customer->set_phone( $data->get_field_value( 'telephone_number' ) ); + $customer->set_email( $data->get_field_value( 'email' ) ); + + $payment->set_customer( $customer ); + + // Company Name. + $company_name = $data->get_field_value( 'company_name' ); + + $customer->set_company_name( $company_name ); + + // VAT Number. + $customer->set_vat_number( $data->get_field_value( 'vat_number' ) ); + + // Address. + $address = new Address(); + + $country_name = $data->get_field_value( 'country' ); + $country_code = GFCommon::get_country_code( $country_name ); + + if ( empty( $country_code ) ) { + $country_code = null; + } + + $address->set_name( $name ); + $address->set_company_name( $company_name ); + $address->set_line_1( $data->get_field_value( 'address1' ) ); + $address->set_line_2( $data->get_field_value( 'address2' ) ); + $address->set_postal_code( $data->get_field_value( 'zip' ) ); + $address->set_city( $data->get_field_value( 'city' ) ); + $address->set_region( $data->get_field_value( 'state' ) ); + $address->set_country_code( $country_code ); + $address->set_country_name( $country_name ); + $address->set_email( $data->get_field_value( 'email' ) ); + $address->set_phone( $data->get_field_value( 'telephone_number' ) ); + + $payment->set_billing_address( $address ); + $payment->set_shipping_address( $address ); + + // Consumer bank details. + $consumer_bank_details = new BankAccountDetails(); + + $consumer_bank_details->set_name( $data->get_field_value( 'consumer_bank_details_name' ) ); + $consumer_bank_details->set_iban( $data->get_field_value( 'consumer_bank_details_iban' ) ); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + + // Lines. + $payment->lines = new PaymentLines(); + + $subscription_lines = new PaymentLines(); + + $product_fields = GFCommon::get_product_fields( $form, $lead ); + + if ( is_array( $product_fields ) ) { + // Products. + if ( array_key_exists( 'products', $product_fields ) && is_array( $product_fields['products'] ) ) { + $products = $product_fields['products']; + + foreach ( $products as $key => $product ) { + $key = \strval( $key ); + + $product_lines = array(); + + $line = $payment->lines->new_line(); + + $product_lines[] = $line; + + $line->set_id( $key ); + + if ( array_key_exists( 'name', $product ) ) { + $line->set_name( $product['name'] ); + } + + if ( array_key_exists( 'price', $product ) ) { + $value = GFCommon::to_number( $product['price'] ); + + $line->set_unit_price( new TaxedMoney( $value, $currency ) ); + + if ( array_key_exists( 'quantity', $product ) ) { + $value = ( $value * intval( $product['quantity'] ) ); + } + + $line->set_total_amount( new TaxedMoney( $value, $currency ) ); + } + + if ( array_key_exists( 'quantity', $product ) ) { + $line->set_quantity( intval( $product['quantity'] ) ); + } + + if ( array_key_exists( 'options', $product ) && is_array( $product['options'] ) ) { + $options = $product['options']; + + foreach ( $options as $option ) { + $line = $payment->lines->new_line(); + + $product_lines[] = $line; + + $line->set_quantity( 1 ); + + if ( array_key_exists( 'option_label', $option ) ) { + $line->set_name( $option['option_label'] ); + } + + if ( array_key_exists( 'price', $option ) ) { + $value = GFCommon::to_number( $option['price'] ); + + $line->set_unit_price( new TaxedMoney( $value, $currency ) ); + + $line->set_total_amount( new TaxedMoney( $value, $currency ) ); + } + } + } + + if ( + GravityForms::SUBSCRIPTION_AMOUNT_FIELD === $this->feed->subscription_amount_type + && + $key === $this->feed->subscription_amount_field + ) { + foreach ( $product_lines as $line ) { + $subscription_lines->add_line( $line ); + } + } + } + } + + // Shipping. + if ( array_key_exists( 'shipping', $product_fields ) && is_array( $product_fields['shipping'] ) && array_key_exists( 'price', $product_fields['shipping'] ) && false !== $product_fields['shipping']['price'] ) { + $shipping = $product_fields['shipping']; + + $line = $payment->lines->new_line(); + + $line->set_type( PaymentLineType::SHIPPING ); + $line->set_quantity( 1 ); + + if ( array_key_exists( 'id', $shipping ) ) { + $line->set_id( $shipping['id'] ); + } + + if ( array_key_exists( 'name', $shipping ) ) { + $line->set_name( $shipping['name'] ); + } + + if ( array_key_exists( 'price', $shipping ) ) { + $value = $shipping['price']; + + $line->set_unit_price( new TaxedMoney( $value, $currency ) ); + + $line->set_total_amount( new TaxedMoney( $value, $currency ) ); + } + } + } + + /** + * Donation. + * + * @todo Should we do something with 'donation'? + * @link https://github.com/wp-pay-extensions/gravityforms/blob/2.4.0/src/PaymentData.php#L231-L264 + */ + + // Does payment contain any lines? + if ( 0 === count( $payment->lines ) ) { + return $lead; + } + + /** + * Subscription. + * + * As soon as a recurring amount is set, we create a subscription. + */ + if ( GravityForms::SUBSCRIPTION_AMOUNT_TOTAL === $this->feed->subscription_amount_type ) { + foreach ( $payment->lines as $line ) { + $subscription_lines->add_line( $line ); + } + } + + $interval = $data->get_subscription_interval(); + + if ( null !== $interval->value && $interval->value > 0 && $subscription_lines->get_amount()->get_value() > 0 ) { + $payment->subscription_source_id = $lead['id']; + + // Build subscription. + $subscription = new Subscription(); + + $subscription->lines = $subscription_lines; + + // Phase. + $start_date = new \DateTimeImmutable(); + + $phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( 'P' . $interval->value . $interval->unit ), + $subscription_lines->get_amount() + ); + + $phase->set_total_periods( $data->get_subscription_frequency() ); + + // Period alignment. + if ( 'sync' === $this->feed->subscription_interval_date_type ) { + $alignment_rule = new AlignmentRule( $interval->unit ); + + switch ( $interval->unit ) { + case 'D': + break; + case 'W': + $alignment_rule->by_numeric_day_of_the_week( \intval( $this->feed->subscription_interval_date_day ) ); + break; + case 'M': + $alignment_rule->by_numeric_day_of_the_month( \intval( $this->feed->subscription_interval_date ) ); + break; + case 'Y': + $alignment_rule->by_numeric_day_of_the_month( \intval( $this->feed->subscription_interval_date ) ); + $alignment_rule->by_numeric_month( \intval( $this->feed->subscription_interval_date_month ) ); + } + + $align_date = $alignment_rule->get_date( $start_date ); + + $alignment_phase = SubscriptionPhase::align( $phase, $align_date ); + + $alignment_rate = $alignment_phase->get_alignment_rate(); + + // Amount proration. + if ( '1' === $this->feed->subscription_interval_date_prorate && null !== $alignment_rate ) { + $new_lines = new PaymentLines(); + + $subscription_lines_array = $subscription_lines->get_array(); + + foreach ( $payment->lines as $line ) { + $new_line = $line; + + if ( in_array( $line, $subscription_lines_array, true ) ) { + $new_line = clone $new_line; + + $total_amount = $new_line->get_total_amount(); + $total_amount = $total_amount->multiply( $alignment_rate ); + + $new_line->set_total_amount( $total_amount ); + + $unit_price = $new_line->get_unit_price(); + + if ( null !== $unit_price ) { + $unit_price = $unit_price->multiply( $alignment_rate ); + } + + $new_line->set_unit_price( $unit_price ); + } + + $new_lines->add_line( $new_line ); + } + + $payment->lines = $new_lines; + + $alignment_phase->set_amount( $payment->lines->get_amount() ); + $alignment_phase->set_prorated( true ); + } + + $subscription->add_phase( $alignment_phase ); + } + + $subscription->add_phase( $phase ); + + $payment->add_period( $subscription->new_period() ); + + $payment->subscription = $subscription; + } + + // Total amount. + $payment->set_total_amount( $payment->lines->get_amount() ); + + // Don't delay feed actions for free payments. + $amount = $payment->get_total_amount()->get_value(); + + if ( empty( $amount ) ) { + $this->feed->delay_actions = array(); + } + + // Use iDEAL instead of 'Direct Debit (mandate via iDEAL)' without subscription. + if ( null === $payment->get_subscription() && PaymentMethods::DIRECT_DEBIT_IDEAL === $payment->get_method() ) { + $payment->method = PaymentMethods::IDEAL; + } + + // Update entry meta. + gform_update_meta( $lead['id'], 'ideal_feed_id', $this->feed->id ); + gform_update_meta( $lead['id'], 'payment_gateway', 'pronamic_pay' ); + + $lead[ LeadProperties::PAYMENT_STATUS ] = PaymentStatuses::PROCESSING; + $lead[ LeadProperties::PAYMENT_DATE ] = gmdate( 'y-m-d H:i:s' ); + $lead[ LeadProperties::TRANSACTION_TYPE ] = GravityForms::TRANSACTION_TYPE_PAYMENT; + + GravityForms::update_entry( $lead ); + + // Start. + try { + $this->payment = Plugin::start_payment( $payment ); + } catch ( \Exception $e ) { + $this->payment = $payment; + + $this->error = $e; + } + + // Update entry meta. + gform_update_meta( $lead['id'], 'pronamic_payment_id', $this->payment->get_id() ); + + $periods = $this->payment->get_periods(); + + if ( null !== $periods ) { + foreach ( $periods as $period ) { + $subscription_id = $period->get_phase()->get_subscription()->get_id(); + + if ( null !== $subscription_id ) { + gform_update_meta( $lead['id'], 'pronamic_subscription_id', $subscription_id ); + } + } + } + + $lead[ LeadProperties::PAYMENT_STATUS ] = PaymentStatuses::transform( $this->payment->get_status() ); + $lead[ LeadProperties::PAYMENT_AMOUNT ] = $this->payment->get_total_amount()->get_value(); + $lead[ LeadProperties::TRANSACTION_ID ] = $this->payment->get_transaction_id(); + + GravityForms::update_entry( $lead ); + + // Pending payment. + if ( PaymentStatuses::PROCESSING === $lead[ LeadProperties::PAYMENT_STATUS ] ) { + // Add pending payment. + $action = array( + 'id' => $this->payment->get_id(), + 'transaction_id' => $this->payment->get_transaction_id(), + 'amount' => $this->payment->get_total_amount()->get_value(), + 'entry_id' => $lead['id'], + ); + + $this->extension->payment_action( 'add_pending_payment', $lead, $action ); + } + + // Return lead. + return $lead; + } + + /** + * Maybe delay notifications. + * + * @param bool $is_disabled Is disabled flag. + * @param array $notification Gravity Forms notification. + * @param array $form Gravity Forms form. + * @param array $lead Gravity Forms lead/entry. + * + * @return bool + */ + public function maybe_delay_notification( $is_disabled, $notification, $form, $lead ) { + if ( ! $is_disabled && $this->is_processing( $form ) ) { + $is_disabled = in_array( $notification['id'], $this->feed->delay_notification_ids, true ); + } + + return $is_disabled; + } + + /** + * Maybe delay admin notification + * + * @param bool $is_disabled Is disabled flag. + * @param array $form Gravity Forms form. + * @param array $lead Gravity Forms lead/entry. + * + * @return boolean true if admin notification is disabled / delayed, false otherwise + */ + public function maybe_delay_admin_notification( $is_disabled, $form, $lead ) { + if ( ! $is_disabled && $this->is_processing( $form ) ) { + $is_disabled = $this->feed->delay_admin_notification; + } + + return $is_disabled; + } + + /** + * Maybe delay user notification + * + * @param bool $is_disabled Is disabled flag. + * @param array $form Gravity Forms form. + * @param array $lead Gravity Forms lead/entry. + * + * @return boolean true if user notification is disabled / delayed, false otherwise + */ + public function maybe_delay_user_notification( $is_disabled, $form, $lead ) { + if ( ! $is_disabled && $this->is_processing( $form ) ) { + $is_disabled = $this->feed->delay_user_notification; + } + + return $is_disabled; + } + + /** + * Maybe delay post creation. + * + * @param boole $is_disabled Is disabled flag. + * @param array $form Gravity Forms form. + * @param array $lead Gravity Forms lead/entry. + * + * @return boolean true if post creation is disabled / delayed, false otherwise + */ + public function maybe_delay_post_creation( $is_disabled, $form, $lead ) { + if ( ! $is_disabled && $this->is_processing( $form ) ) { + $is_disabled = $this->feed->delay_post_creation; + } + + return $is_disabled; + } + + /** + * Maybe delay feed. + * + * @param bool $is_delayed Is delayed flag. + * @param array $form Gravity Forms form. + * @param array $entry Gravity Forms entry. + * @param string $slug Delay action slug. + * + * @return bool + */ + public function maybe_delay_feed( $is_delayed, $form, $entry, $slug ) { + if ( $this->is_processing( $form ) && isset( $this->feed->delay_actions[ $slug ] ) ) { + $is_delayed = true; + } + + return $is_delayed; + } + + /** + * Maybe delay workflow. + * + * @link https://github.com/gravityflow/gravityflow/blob/master/class-gravity-flow.php#L4711-L4720 + * + * @param bool $is_delayed Indicates if processing of the workflow should be delayed. + * @param array $entry Gravity Forms entry. + * @param array $form Gravity Forms form. + * + * @return bool + */ + public function maybe_delay_workflow( $is_delayed, $entry, $form ) { + return $this->maybe_delay_feed( $is_delayed, $form, $entry, 'gravityflow' ); + } + + /** + * Confirmation. + * + * @link http://www.gravityhelp.com/documentation/page/Gform_confirmation + * + * @param array $confirmation Gravity Forms confirmation. + * @param array $form Gravity Forms form. + * @param array $lead Gravity Forms lead/entry. + * @param bool $ajax AJAX request flag. + * + * @return array|string + */ + public function confirmation( $confirmation, $form, $lead, $ajax ) { + if ( ! $this->is_processing( $form ) ) { + return $confirmation; + } + + if ( ! $this->gateway || ! $this->payment ) { + return $confirmation; + } + + $confirmation = array( 'redirect' => $this->payment->get_pay_redirect_url() ); + + if ( $this->error instanceof \Exception ) { + $html = '
      '; + $html .= '
    • ' . Plugin::get_default_error_message() . '
    • '; + $html .= '
    • ' . $this->error->getMessage() . '
    • '; + $html .= '
    '; + + $confirmation = $html; + } + + return $confirmation; + } + + /** + * After submission. + * + * @param array $lead Gravity Forms lead/entry. + * @param array $form Gravity Forms form. + */ + public function after_submission( $lead, $form ) { + + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Util.php new file mode 100644 index 00000000..5cb0f81f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/src/Util.php @@ -0,0 +1,100 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\GravityForms; + +use RGFormsModel; + +/** + * Title: WordPress pay extension Gravity Forms extension + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.3.0 + * @since 1.0.0 + */ +class Util { + /** + * Get detected field ID. + * + * @param string $field_name Field name. + * @param array $form Form. + * @param array $entry Entry. + * + * @return string|null + */ + public static function get_detected_field_id( $field_name, $form, $entry ) { + // Field types with optional input ID suffix as key. + $types = array( + 'name' => array( + 2 => 'prefix_name', + 3 => 'first_name', + 4 => 'middle_name', + 6 => 'last_name', + 8 => 'suffix_name', + ), + 'address' => array( + 1 => 'address1', + 2 => 'address2', + 3 => 'city', + 4 => 'state', + 5 => 'zip', + 6 => 'country', + ), + 'phone' => array( 'telephone_number' ), + 'email' => array( 'email' ), + ); + + // Determine type and input ID suffix (if applicable). + $input_type = null; + $input_suffix = null; + + foreach ( $types as $type => $fields ) { + $search = \array_search( $field_name, $fields, true ); + + if ( false === $search ) { + continue; + } + + $input_type = $type; + + // Input ID suffix. + if ( \in_array( $type, array( 'name', 'address' ), true ) ) { + $input_suffix = $search; + } + + break; + } + + // Find first visible field of type. + foreach ( $form['fields'] as $field ) { + // Check field type. + if ( $field->type !== $input_type ) { + continue; + } + + // Check field visibility. + if ( RGFormsModel::is_field_hidden( $form, $field, array(), $entry ) ) { + continue; + } + + // Input ID needs suffix? + if ( null !== $input_suffix ) { + return $field->id . '.' . $input_suffix; + } + + return $field->id; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php new file mode 100644 index 00000000..ec04bdc5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-gf-box.php @@ -0,0 +1,55 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +?> +
    +

    %s

    ', + esc_attr( $class ), + esc_html( $msg ) + ); + } + + ?> + +
    +
    + + + + + +
    +
    + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-meta-box.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-meta-box.php new file mode 100644 index 00000000..17f05dd3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-meta-box.php @@ -0,0 +1,14 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +/** + * Require. + */ +require dirname( __FILE__ ) . '/html-admin-feed-settings.php'; diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php new file mode 100644 index 00000000..a8202fb3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-feed-settings.php @@ -0,0 +1,1015 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +use Pronamic\WordPress\Pay\Admin\AdminModule; +use Pronamic\WordPress\Pay\Extensions\GravityForms\Extension; +use Pronamic\WordPress\Pay\Extensions\GravityForms\Links; +use Pronamic\WordPress\Pay\Extensions\GravityForms\PayFeed; + +$form_meta = RGFormsModel::get_form_meta( $form_id ); + +$entry_id_prefix = get_post_meta( $post_id, '_pronamic_pay_gf_entry_id_prefix', true ); +$order_id = get_post_meta( $post_id, '_pronamic_pay_gf_order_id', true ); + +if ( ! empty( $entry_id_prefix ) ) { + $order_id = $entry_id_prefix . $order_id; +} + +if ( ! GFCommon::has_merge_tag( $order_id ) ) { + $order_id .= '{entry_id}'; +} + +$pay_feed = new PayFeed( $post_id ); + +$feed = new stdClass(); +$feed->conditionEnabled = $pay_feed->condition_enabled; +$feed->conditionalLogicObject = $pay_feed->conditional_logic_object; +$feed->delayNotificationIds = $pay_feed->delay_notification_ids; +$feed->fields = get_post_meta( $post_id, '_pronamic_pay_gf_fields', true ); +$feed->userRoleFieldId = get_post_meta( $post_id, '_pronamic_pay_gf_user_role_field_id', true ); +$feed->links = $pay_feed->links; +$feed->subscriptionAmountType = $pay_feed->subscription_amount_type; +$feed->subscriptionAmountField = $pay_feed->subscription_amount_field; +$feed->subscriptionIntervalType = $pay_feed->subscription_interval_type; +$feed->subscriptionInterval = $pay_feed->subscription_interval; +$feed->subscriptionIntervalPeriod = $pay_feed->subscription_interval_period; +$feed->subscriptionIntervalField = $pay_feed->subscription_interval_field; +$feed->subscriptionFrequencyType = $pay_feed->subscription_frequency_type; +$feed->subscriptionNumberPeriods = $pay_feed->subscription_number_periods; +$feed->subscriptionFrequencyField = $pay_feed->subscription_frequency_field; + +?> +
    + + + + + + + + + + + + +
    + +
      +
    • +
    • +
    • +
    • +
    • +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + '_pronamic_pay_gf_config_id', + 'selected' => $config_id, + ) + ); + + ?> +
    + + + + + + + + + + %s', + '{entry_id}' + ) + ), + array( + 'code' => array(), + ) + ); + + ?> + +
    + + %s %s %s', + '{entry_id}', + '{form_id}', + '{form_title}' + ) + ), + array( + 'code' => array(), + ) + ); + + ?> + +
    + + +
    +
    + + + + + + + + + %s', + '{entry_id}' + ) + ), + array( + 'code' => array(), + ) + ); + + ?> + +
    + + %s %s %s', + '{entry_id}', + '{form_id}', + '{form_title}' + ) + ), + array( + 'code' => array(), + ) + ); + + ?> + +
    + + +
    +
    + + + + +

    + +

    + + =' ) ) : + + $notifications = array(); + if ( isset( $form_meta['notifications'] ) && is_array( $form_meta['notifications'] ) ) { + $notifications = $form_meta['notifications']; + } + + printf( '
      ' ); + + if ( ! empty( $notifications ) ) { + foreach ( $notifications as $notification ) { + if ( 'form_submission' !== $notification['event'] ) { + continue; + } + + $id = $notification['id']; + + printf( '
    • ' ); + + printf( + '', + esc_attr( 'pronamic-pay-gf-notification-' . $id ), + esc_attr( $id ), + checked( in_array( $id, $pay_feed->delay_notification_ids, true ), true, false ) + ); + + printf( ' ' ); + + printf( + '', + esc_attr( 'pronamic-pay-gf-notification-' . $id ), + esc_html( $notification['name'] ) + ); + + printf( '
    • ' ); + } + } + + printf( '
    ' ); + + else : + + ?> + +
      +
    • + /> + + +
    • +
    • + /> + + +
    • +
    • + +
    • +
    + + + +
    + + + + +

    + +

    + + $data ) { + $delay_actions[ $slug ]['delay'] = ( '1' === get_post_meta( $post_id, $delay_actions[ $slug ]['meta_key'], true ) ); + } + + ?> +
      +
    • + /> + + +
    • + + $action ) : ?> + +
    • + /> + + +
    • + + + +
    +
    +
    + +
    +
    + +
    + + + __( 'Success', 'pronamic_ideal' ), + Links::CANCEL => __( 'Cancelled', 'pronamic_ideal' ), + Links::EXPIRED => __( 'Expired', 'pronamic_ideal' ), + Links::ERROR => __( 'Error', 'pronamic_ideal' ), + Links::OPEN => __( 'Open', 'pronamic_ideal' ), + ); + + foreach ( $fields as $name => $label ) : + + ?> + + + links[ $name ] ) ) { + $link = $pay_feed->links[ $name ]; + + $type = isset( $link['type'] ) ? $link['type'] : null; + $confirmation_id = isset( $link['confirmation_id'] ) ? $link['confirmation_id'] : null; + $page_id = isset( $link['page_id'] ) ? $link['page_id'] : null; + $url = isset( $link['url'] ) ? $link['url'] : null; + } + + ?> + + + + + +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + + + +
    + + + +
    + + + +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    + + + + + +
    + +
    + + + +
    + + + + +
    + + + + +
    + +
    +
    +
    + + +
    + + + + + + +
    + + + +
    + + + +
    + +
    + + + +
    + + + +
    + +
    +
    +
    + + +
    + + + + +

    + +

    + +
    + + + +
    + + + +
    + subscription_interval_date_prorate ); ?> /> + + +
    +
    +
    +
    + +
    +
    + +
    + + __( 'Prefix Name', 'pronamic_ideal' ), + 'first_name' => __( 'First Name', 'pronamic_ideal' ), + 'middle_name' => __( 'Middle Name', 'pronamic_ideal' ), + 'last_name' => __( 'Last Name', 'pronamic_ideal' ), + 'suffix_name' => __( 'Suffix Name', 'pronamic_ideal' ), + 'address1' => __( 'Address', 'pronamic_ideal' ), + 'address2' => __( 'Address 2', 'pronamic_ideal' ), + 'zip' => __( 'Zip', 'pronamic_ideal' ), + 'city' => __( 'City', 'pronamic_ideal' ), + 'state' => __( 'State', 'pronamic_ideal' ), + 'country' => __( 'Country', 'pronamic_ideal' ), + 'telephone_number' => __( 'Telephone Number', 'pronamic_ideal' ), + 'email' => __( 'Email', 'pronamic_ideal' ), + 'consumer_bank_details_name' => __( 'Account Holder Name', 'pronamic_ideal' ), + 'consumer_bank_details_iban' => __( 'Account IBAN', 'pronamic_ideal' ), + 'company_name' => __( 'Company Name', 'pronamic_ideal' ), + 'vat_number' => __( 'VAT Number', 'pronamic_ideal' ), + ); + + ?> + + + + $label ) : ?> + + + + + + + + +
    + + +
    +
    + +
    +
    + +
    + + + + + + + + + + +
    + + +
    + + + 'conditionalLogic', + 'label' => __( 'Conditional Logic', 'pronamic_ideal' ), + 'type' => 'feed_condition', + ); + + $this->settings_feed_condition( $field ); + + ?> +
    + + + + + + +
    + + + +
    +
    + + + var form = %s; + %s + ', + wp_json_encode( $js_form ), + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + GFCommon::gf_vars( false ) + ); + + endif; + + endif; + + ?> + +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php new file mode 100644 index 00000000..92d94475 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/gravityforms/views/html-admin-temporary-feeds-page.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\GravityForms + */ + +?> + + +
    +

    + get_version() + ) + ); + + ?> +

    + +
    + +
    + +
    + +
    +

    + +

    + + +
    + +
    + + + +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprApplePayGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprApplePayGateway.php new file mode 100644 index 00000000..0af9479e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprApplePayGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\ApplePayGateway', 'MeprApplePayGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprBankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprBankTransferGateway.php new file mode 100644 index 00000000..7b219f37 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprBankTransferGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\BankTransferGateway', 'MeprBankTransferGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprBitcoinGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprBitcoinGateway.php new file mode 100644 index 00000000..3aa40e60 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprBitcoinGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\BitcoinGateway', 'MeprBitcoinGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprCreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprCreditCardGateway.php new file mode 100644 index 00000000..cdebf91b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprCreditCardGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\CreditCardGateway', 'MeprCreditCardGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitBancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitBancontactGateway.php new file mode 100644 index 00000000..f7afdae2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitBancontactGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\DirectDebitBancontactGateway', 'MeprDirectDebitBancontactGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitGateway.php new file mode 100644 index 00000000..38d79147 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\DirectDebitGateway', 'MeprDirectDebitGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitIDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitIDealGateway.php new file mode 100644 index 00000000..d357bb38 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitIDealGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\DirectDebitIDealGateway', 'MeprDirectDebitIDealGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitSofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitSofortGateway.php new file mode 100644 index 00000000..7d02ff72 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprDirectDebitSofortGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\DirectDebitSofortGateway', 'MeprDirectDebitSofortGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprIDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprIDealGateway.php new file mode 100644 index 00000000..eedcef39 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprIDealGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\IDealGateway', 'MeprIDealGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprMisterCashGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprMisterCashGateway.php new file mode 100644 index 00000000..02e0280c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprMisterCashGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\BancontactGateway', 'MeprMisterCashGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPronamicGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPronamicGateway.php new file mode 100644 index 00000000..8fe7466c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPronamicGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\Gateway', 'MeprPronamicGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPronamicPayPalGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPronamicPayPalGateway.php new file mode 100644 index 00000000..f583d699 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPronamicPayPalGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\PayPalGateway', 'MeprPronamicPayPalGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPrzelewy24Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPrzelewy24Gateway.php new file mode 100644 index 00000000..893b1767 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprPrzelewy24Gateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\Przelewy24Gateway', 'MeprPrzelewy24Gateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprSofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprSofortGateway.php new file mode 100644 index 00000000..e21a7ec6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/gateways/MeprSofortGateway.php @@ -0,0 +1,11 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +class_alias( 'Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\SofortGateway', 'MeprSofortGateway' ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php new file mode 100644 index 00000000..c7a9fc38 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Admin/AdminSubscriptions.php @@ -0,0 +1,203 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Admin; + +use WP_Query; + +/** + * Admin subscriptions + * + * @author Remco Tolsma + * @version 2.0.11 + * @since 1.0.0 + */ +class AdminSubscriptions { + /** + * Subscriptions map. + * + * @var array|null + */ + private $subscriptions_map; + + /** + * Setup. + */ + public function setup() { + // @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/controllers/MeprSubscriptionsCtrl.php#L19-L26 + $hook = 'memberpress_page_memberpress-subscriptions'; + + add_filter( 'manage_' . $hook . '_columns', array( $this, 'manage_subscriptions_columns' ), 15 ); + + add_action( 'mepr-admin-subscriptions-cell', array( $this, 'admin_subscriptions_cell' ), 10, 4 ); + + add_filter( 'mepr_view_get_string', array( $this, 'extend_subscription_form' ), 10, 3 ); + } + + /** + * Manage subscriptions columns. + * + * @param array $columns Columns. + */ + public function manage_subscriptions_columns( $columns ) { + $columns['pronamic_subscription'] = __( 'Pronamic Subscription', 'pronamic_ideal' ); + + return $columns; + } + + /** + * Get subscriptions map. + * + * @param object $table Table. + * @return array + */ + private function get_subscriptions_map( $table ) { + if ( is_array( $this->subscriptions_map ) ) { + return $this->subscriptions_map; + } + + $this->subscriptions_map = array(); + + if ( ! isset( $table->items ) ) { + return; + } + + $memberpress_subscriptions = $table->items; + + if ( ! is_array( $memberpress_subscriptions ) || empty( $memberpress_subscriptions ) ) { + return; + } + + $memberpress_subscription_ids = wp_list_pluck( $memberpress_subscriptions, 'id' ); + + $query = new WP_Query( + array( + 'post_type' => 'pronamic_pay_subscr', + 'post_status' => 'any', + 'nopaging' => true, + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_source', + 'compare' => '=', + 'value' => 'memberpress', + ), + array( + 'key' => '_pronamic_subscription_source_id', + 'compare' => 'IN', + 'value' => $memberpress_subscription_ids, + ), + ), + ) + ); + + if ( $query->have_posts() ) { + while ( $query->have_posts() ) { + $query->the_post(); + + $memberpress_subscription_id = get_post_meta( get_the_ID(), '_pronamic_subscription_source_id', true ); + + $this->subscriptions_map[ $memberpress_subscription_id ] = get_post(); + } + + wp_reset_postdata(); + } + + return $this->subscriptions_map; + } + + /** + * Admin subscription cell. + * + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/controllers/MeprSubscriptionsCtrl.php#L73 + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/lib/MeprSubscriptionsTable.php#L230 + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/lib/MeprView.php#L49 + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/views/admin/subscriptions/row.php + * + * @param string $column_name Column name. + * @param object $rec Record. + * @param object $table Table. + * @param string $attributes Attributes. + */ + public function admin_subscriptions_cell( $column_name, $rec, $table, $attributes ) { + if ( 'pronamic_subscription' !== $column_name ) { + return; + } + + $map = $this->get_subscriptions_map( $table ); + + printf( + '', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $attributes + ); + + $memberpress_subscription_id = $rec->id; + + if ( isset( $map[ $memberpress_subscription_id ] ) ) { + $pronamic_subscription_post = $map[ $memberpress_subscription_id ]; + + printf( + '%s', + esc_attr( get_edit_post_link( $pronamic_subscription_post ) ), + esc_html( $pronamic_subscription_post->ID ) + ); + } else { + echo '—'; + } + + echo ''; + } + + /** + * Extend subscription form. + * + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/controllers/MeprSubscriptionsCtrl.php#L105-L133 + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/views/admin/subscriptions/edit.php + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/views/admin/subscriptions/form.php + * + * @param string $view View. + * @param string $slug Slug. + * @param array $vars Variables. + * @return string + */ + public function extend_subscription_form( $view, $slug, $vars ) { + if ( '/admin/subscriptions/form' !== $slug ) { + return $view; + } + + if ( ! array_key_exists( 'sub', $vars ) ) { + return $view; + } + + $memberpress_subscription = $vars['sub']; + + /* + * Check if variable is a object, should be instance of `MeprSubscription`. + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/models/MeprSubscription.php + */ + if ( ! is_object( $memberpress_subscription ) ) { + return $view; + } + + if ( ! isset( $memberpress_subscription->id ) ) { + return $view; + } + + $memberpress_subscription_id = $memberpress_subscription->id; + + ob_start(); + + include dirname( __FILE__ ) . '/../../views/subscription-form.php'; + + $view .= ob_get_clean(); + + return $view; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Admin/AdminTransactions.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Admin/AdminTransactions.php new file mode 100644 index 00000000..ad5af7f9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Admin/AdminTransactions.php @@ -0,0 +1,121 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Admin; + +use WP_Query; + +/** + * Admin transactions + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class AdminTransactions { + /** + * Setup. + */ + public function setup() { + // @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/controllers/MeprTransactionsCtrl.php + $hook = 'memberpress_page_memberpress-trans'; + + add_filter( 'manage_' . $hook . '_columns', array( $this, 'manage_transactions_columns' ), 10 ); + + add_filter( 'mepr_view_get_string', array( $this, 'extend_transaction_row' ), 10, 3 ); + add_filter( 'mepr_view_get_string', array( $this, 'extend_transaction_form' ), 10, 3 ); + } + + /** + * Manage transactions columns. + * + * @param array $columns Columns. + */ + public function manage_transactions_columns( $columns ) { + /* + * Unfortunately there is currently no filter to extend the transactions table row, + * we therefore do not add an column for the Pronamic payment: + * + * $columns['pronamic_payment'] = __( 'Pronamic Payment', 'pronamic_ideal' ); + */ + + return $columns; + } + + /** + * Extend transaction row. + * + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/controllers/MeprTransactionsCtrl.php#L479-L486 + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/views/admin/transactions/list.php + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/views/admin/transactions/row.php + * + * @param string $view View. + * @param string $slug Slug. + * @param array $vars Variables. + * @return string + */ + public function extend_transaction_row( $view, $slug, $vars ) { + if ( '/admin/transactions/row' !== $slug ) { + return $view; + } + + /* + * Unfortunately there is currently no filter to extend the transactions table row. + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/views/admin/transactions/row.php + * + * If we want to add a custom column we should extend the HTML/DOM. + * @link https://docs.gravityforms.com/gform_submit_button/#5-append-custom-css-classes-to-the-button + */ + + return $view; + } + + /** + * Extend transaction form. + * + * @param string $view View. + * @param string $slug Slug. + * @param array $vars Variables. + * @return string + */ + public function extend_transaction_form( $view, $slug, $vars ) { + if ( '/admin/transactions/trans_form' !== $slug ) { + return $view; + } + + if ( ! array_key_exists( 'txn', $vars ) ) { + return $view; + } + + $memberpress_transaction = $vars['txn']; + + /* + * Check if variable is a object, should be instance of `MeprTransaction`. + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/models/MeprTransaction.php + */ + if ( ! is_object( $memberpress_transaction ) ) { + return $view; + } + + if ( ! isset( $memberpress_transaction->id ) ) { + return $view; + } + + $memberpress_transaction_id = $memberpress_transaction->id; + + ob_start(); + + include dirname( __FILE__ ) . '/../../views/transaction-form.php'; + + $view .= ob_get_clean(); + + return $view; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Extension.php new file mode 100644 index 00000000..19c35b90 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Extension.php @@ -0,0 +1,501 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress; + +use MeprDb; +use MeprOptions; +use MeprProduct; +use MeprSubscription; +use MeprTransaction; +use MeprUtils; +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways\Gateway; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; + +/** + * WordPress pay MemberPress extension + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class Extension extends AbstractPluginIntegration { + /** + * The slug of this addon + * + * @var string + */ + const SLUG = 'memberpress'; + + /** + * Construct MemberPress plugin integration. + */ + public function __construct() { + parent::__construct( + array( + 'name' => __( 'MemberPress', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new MemberPressDependency() ); + } + + /** + * Setup. + */ + public function setup() { + \add_filter( 'pronamic_subscription_source_description_' . self::SLUG, array( $this, 'subscription_source_description' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprGatewayFactory.php#L48-50 + \add_filter( 'mepr-gateway-paths', array( $this, 'gateway_paths' ) ); + + \add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( $this, 'redirect_url' ), 10, 2 ); + \add_action( 'pronamic_payment_status_update_' . self::SLUG, array( $this, 'status_update' ), 10, 1 ); + + \add_filter( 'pronamic_subscription_source_text_' . self::SLUG, array( $this, 'subscription_source_text' ), 10, 2 ); + \add_filter( 'pronamic_subscription_source_url_' . self::SLUG, array( $this, 'subscription_source_url' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + + \add_action( 'mepr_subscription_pre_delete', array( $this, 'subscription_pre_delete' ), 10, 1 ); + + \add_action( 'mepr_subscription_transition_status', array( $this, 'memberpress_subscription_transition_status' ), 10, 3 ); + + // Hide MemberPress columns for payments and subscriptions. + \add_filter( 'registered_post_type', array( $this, 'post_type_columns_hide' ), 15, 1 ); + + if ( \is_admin() ) { + $this->admin_subscriptions = new Admin\AdminSubscriptions(); + $this->admin_transactions = new Admin\AdminTransactions(); + + $this->admin_subscriptions->setup(); + $this->admin_transactions->setup(); + } + } + + /** + * Gateway paths. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprGatewayFactory.php#L48-50 + * + * @param array $paths Array with gateway paths. + * @return array + */ + public function gateway_paths( $paths ) { + $paths[] = dirname( __FILE__ ) . '/../gateways/'; + + return $paths; + } + + /** + * Hide MemberPress columns for payments and subscriptions. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/controllers/MeprAppCtrl.php#L129-146 + * + * @param string $post_type Registered post type. + * + * @return void + */ + public function post_type_columns_hide( $post_type ) { + if ( ! in_array( $post_type, array( 'pronamic_payment', 'pronamic_pay_subscr' ), true ) ) { + return; + } + + remove_filter( 'manage_edit-' . $post_type . '_columns', 'MeprAppCtrl::columns' ); + } + + /** + * Payment redirect URL filter. + * + * @since 1.0.1 + * + * @param string $url Payment redirect URL. + * @param Payment $payment Payment to redirect for. + * + * @return string + */ + public function redirect_url( $url, Payment $payment ) { + global $transaction; + + $transaction_id = $payment->get_source_id(); + + $transaction = new MeprTransaction( $transaction_id ); + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + case PaymentStatus::EXPIRED: + case PaymentStatus::FAILURE: + $product = $transaction->product(); + + $url = add_query_arg( + array( + 'action' => 'payment_form', + 'txn' => $transaction->trans_num, + 'errors' => array( + __( 'Payment failed. Please try again.', 'pronamic_ideal' ), + ), + '_wpnonce' => wp_create_nonce( 'mepr_payment_form' ), + ), + $product->url() + ); + + break; + case PaymentStatus::SUCCESS: + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/models/MeprOptions.php#L768-782 + $mepr_options = MeprOptions::fetch(); + + $product = new MeprProduct( $transaction->product_id ); + $sanitized_title = sanitize_title( $product->post_title ); + + $args = array( + 'membership_id' => $product->ID, + 'membership' => $sanitized_title, + 'trans_num' => $transaction->trans_num, + ); + + $url = $mepr_options->thankyou_page_url( http_build_query( $args ) ); + + break; + case PaymentStatus::OPEN: + default: + break; + } + + return $url; + } + + /** + * Update lead status of the specified payment. + * + * @link https://github.com/Charitable/Charitable/blob/1.1.4/includes/gateways/class-charitable-gateway-paypal.php#L229-L357 + * + * @param Payment $payment The payment whose status is updated. + */ + public function status_update( Payment $payment ) { + $transaction = new MeprTransaction( $payment->get_source_id() ); + + if ( $payment->get_recurring() || empty( $transaction->id ) ) { + $subscription_id = $payment->get_subscription()->get_source_id(); + $subscription = new MeprSubscription( $subscription_id ); + + // Same source ID and first transaction ID for recurring payment means we need to add a new transaction. + if ( $payment->get_source_id() === $subscription->id ) { + // First transaction. + $first_txn = $subscription->first_txn(); + + if ( false === $first_txn || ! ( $first_txn instanceof MeprTransaction ) ) { + $first_txn = new MeprTransaction(); + $first_txn->user_id = $subscription->user_id; + $first_txn->product_id = $subscription->product_id; + $first_txn->coupon_id = $subscription->coupon_id; + $first_txn->gateway = null; + } + + // Transaction number. + $trans_num = $payment->get_transaction_id(); + + if ( empty( $trans_num ) ) { + $trans_num = uniqid(); + } + + // New transaction. + $transaction = new MeprTransaction(); + $transaction->created_at = $payment->post->post_date_gmt; + $transaction->user_id = $first_txn->user_id; + $transaction->product_id = $first_txn->product_id; + $transaction->coupon_id = $first_txn->coupon_id; + $transaction->gateway = $first_txn->gateway; + $transaction->trans_num = $trans_num; + $transaction->txn_type = MeprTransaction::$payment_str; + $transaction->status = MeprTransaction::$pending_str; + $transaction->expires_at = MeprUtils::ts_to_mysql_date( $payment->get_end_date()->getTimestamp(), 'Y-m-d 23:59:59' ); + $transaction->subscription_id = $subscription->id; + + $transaction->set_gross( $payment->get_total_amount()->get_value() ); + + $transaction->store(); + + // Set source ID. + $payment->set_meta( 'source_id', $transaction->id ); + + $payment->source_id = $transaction->id; + + if ( MeprSubscription::$active_str === $subscription->status ) { + /* + * We create a 'confirmed' 'subscription_confirmation' + * transaction for a grace period of 15 days. + * + * Transactions of type "subscription_confirmation" with a + * status of "confirmed" are hidden in the UI, and are used + * as a way to provide free trial periods and the 24 hour + * grace period on a recurring subscription signup. + * + * @link https://docs.memberpress.com/article/219-where-is-data-stored. + */ + $subscription_confirmation = new MeprTransaction(); + $subscription_confirmation->created_at = $payment->post->post_date_gmt; + $subscription_confirmation->user_id = $first_txn->user_id; + $subscription_confirmation->product_id = $first_txn->product_id; + $subscription_confirmation->coupon_id = $first_txn->coupon_id; + $subscription_confirmation->gateway = $first_txn->gateway; + $subscription_confirmation->trans_num = $trans_num; + $subscription_confirmation->txn_type = MeprTransaction::$subscription_confirmation_str; + $subscription_confirmation->status = MeprTransaction::$confirmed_str; + $subscription_confirmation->subscription_id = $subscription->id; + $subscription_confirmation->expires_at = MeprUtils::ts_to_mysql_date( strtotime( $payment->post->post_date_gmt ) + MeprUtils::days( 15 ), 'Y-m-d 23:59:59' ); + + $subscription_confirmation->set_subtotal( 0.00 ); + + $subscription_confirmation->store(); + } + } + } + + $should_update = ! MemberPress::transaction_has_status( + $transaction, + array( + MeprTransaction::$failed_str, + MeprTransaction::$complete_str, + ) + ); + + // Allow successful recurring payments to update failed transaction. + if ( $payment->get_recurring() && PaymentStatus::SUCCESS === $payment->get_status() && MeprTransaction::$failed_str === $transaction->status ) { + $should_update = true; + } + + if ( $should_update ) { + $gateway = new Gateway(); + + $gateway->pronamic_payment = $payment; + $gateway->mp_txn = $transaction; + + switch ( $payment->get_status() ) { + case PaymentStatus::FAILURE: + $gateway->record_payment_failure(); + + // Set subscription 'On Hold' to prevent subsequent + // successful subscriptions from awaking subscription. + if ( ! $payment->get_recurring() ) { + $subscription = $payment->get_subscription(); + + if ( null !== $subscription ) { + $subscription->set_status( SubscriptionStatus::ON_HOLD ); + } + } + + break; + case PaymentStatus::CANCELLED: + case PaymentStatus::EXPIRED: + $gateway->record_payment_failure(); + + break; + case PaymentStatus::SUCCESS: + if ( $payment->get_recurring() ) { + $gateway->record_subscription_payment(); + } else { + $gateway->record_payment(); + } + + break; + case PaymentStatus::OPEN: + default: + break; + } + } + } + + /** + * Subscription deleted. + * + * @param int $subscription_id MemberPress subscription id. + */ + public function subscription_pre_delete( $subscription_id ) { + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $subscription_id ); + + if ( ! $subscription ) { + return; + } + + // Add note. + $note = sprintf( + /* translators: %s: MemberPress */ + __( '%s subscription deleted.', 'pronamic_ideal' ), + __( 'MemberPress', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + // The status of canceled or completed subscriptions will not be changed automatically. + if ( ! in_array( $subscription->get_status(), array( SubscriptionStatus::CANCELLED, SubscriptionStatus::COMPLETED ), true ) ) { + $subscription->set_status( SubscriptionStatus::CANCELLED ); + + $subscription->save(); + } + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment to create the source text for. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'MemberPress', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + add_query_arg( + array( + 'page' => 'memberpress-trans', + 'action' => 'edit', + 'id' => $payment->source_id, + ), + admin_url( 'admin.php' ) + ), + /* translators: %s: payment source id */ + sprintf( __( 'Transaction %s', 'pronamic_ideal' ), $payment->source_id ) + ); + + return $text; + } + + /** + * Subscription source text. + * + * @param string $text Source text. + * @param Subscription $subscription Subscription to create the source text for. + * + * @return string + */ + public function subscription_source_text( $text, Subscription $subscription ) { + $text = __( 'MemberPress', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + add_query_arg( + array( + 'page' => 'memberpress-subscriptions', + 'subscription' => $subscription->source_id, + ), + admin_url( 'admin.php' ) + ), + /* translators: %s: payment source id */ + sprintf( __( 'Subscription %s', 'pronamic_ideal' ), $subscription->source_id ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Description. + * @param Payment $payment Payment to create the description for. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'MemberPress Transaction', 'pronamic_ideal' ); + } + + /** + * Subscription source description. + * + * @param string $description Description. + * @param Subscription $subscription Subscription to create the description for. + * + * @return string + */ + public function subscription_source_description( $description, Subscription $subscription ) { + return __( 'MemberPress Subscription', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url URL. + * @param Payment $payment The payment to create the source URL for. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + $url = add_query_arg( + array( + 'page' => 'memberpress-trans', + 'action' => 'edit', + 'id' => $payment->source_id, + ), + admin_url( 'admin.php' ) + ); + + return $url; + } + + /** + * Subscription source URL. + * + * @param string $url URL. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public function subscription_source_url( $url, Subscription $subscription ) { + $url = add_query_arg( + array( + 'page' => 'memberpress-subscriptions', + 'subscription' => $subscription->source_id, + ), + admin_url( 'admin.php' ) + ); + + return $url; + } + + /** + * MemberPress update subscription. + * + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/controllers/MeprSubscriptionsCtrl.php#L92-L111 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/models/MeprSubscription.php#L100-L123 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/models/MeprSubscription.php#L112 + * + * @param string $status_old Old status identifier. + * @param string $status_new New status identifier. + * @param MeprSubscription $memberpress_subscription MemberPress subscription object. + */ + public function memberpress_subscription_transition_status( $status_old, $status_new, $memberpress_subscription ) { + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $memberpress_subscription->id ); + + if ( empty( $subscription ) ) { + return; + } + + $status = SubscriptionStatuses::transform( $status_new ); + + $subscription->set_status( $status ); + + $subscription->save(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/ApplePayGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/ApplePayGateway.php new file mode 100644 index 00000000..f41b9475 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/ApplePayGateway.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress Apple Pay gateway + * + * @author Reüel van der Steege + * @version 2.3.0 + * @since 2.3.0 + */ +class ApplePayGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::APPLE_PAY; + + /** + * Constructs and initialize Apple Pay gateway. + */ + public function __construct() { + parent::__construct(); + + // Capabilities. + $this->capabilities = array( + 'process-payments', + 'create-subscriptions', + 'cancel-subscriptions', + 'update-subscriptions', + 'suspend-subscriptions', + 'resume-subscriptions', + 'subscription-trial-payment', + ); + } + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprApplePayGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BancontactGateway.php new file mode 100644 index 00000000..e7d8f9cd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BancontactGateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress Bancontact/Mister Cash gateway + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class BancontactGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::BANCONTACT; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprMisterCashGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.1 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BankTransferGateway.php new file mode 100644 index 00000000..f27fe9e5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BankTransferGateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress bank transfer gateway + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class BankTransferGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::BANK_TRANSFER; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprBankTransferGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BitcoinGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BitcoinGateway.php new file mode 100644 index 00000000..62e039bf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/BitcoinGateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress Bitcoin gateway + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 1.0.5 + */ +class BitcoinGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::BITCOIN; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprBitcoinGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/CreditCardGateway.php new file mode 100644 index 00000000..115cc7ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/CreditCardGateway.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress credit card gateway + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class CreditCardGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::CREDIT_CARD; + + /** + * Constructs and initialize credit card gateway. + */ + public function __construct() { + parent::__construct(); + + // Capabilities. + $this->capabilities = array( + 'process-payments', + 'create-subscriptions', + 'cancel-subscriptions', + 'update-subscriptions', + 'suspend-subscriptions', + 'resume-subscriptions', + 'subscription-trial-payment', + ); + } + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprCreditCardGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitBancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitBancontactGateway.php new file mode 100644 index 00000000..98d773e6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitBancontactGateway.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress pay MemberPress Direct Debit mandate via Bancontact gateway + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 1.0.6 + */ +class DirectDebitBancontactGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT_BANCONTACT; + + /** + * Constructs and initialize credit card gateway. + */ + public function __construct() { + parent::__construct(); + + // Capabilities. + $this->capabilities = array( + 'process-payments', + 'create-subscriptions', + 'cancel-subscriptions', + 'update-subscriptions', + 'suspend-subscriptions', + 'resume-subscriptions', + 'subscription-trial-payment', + ); + } + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprDirectDebitBancontactGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return plugins_url( 'images/direct-debit-bancontact/icon-32x32.png', Plugin::$file ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitGateway.php new file mode 100644 index 00000000..60a8d1a9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitGateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress direct debit gateway + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class DirectDebitGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprDirectDebitGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitIDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitIDealGateway.php new file mode 100644 index 00000000..87374643 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitIDealGateway.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress pay MemberPress Direct Debit mandate via iDEAL gateway + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.0 + */ +class DirectDebitIDealGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT_IDEAL; + + /** + * Constructs and initialize credit card gateway. + */ + public function __construct() { + parent::__construct(); + + // Capabilities. + $this->capabilities = array( + 'process-payments', + 'create-subscriptions', + 'cancel-subscriptions', + 'update-subscriptions', + 'suspend-subscriptions', + 'resume-subscriptions', + 'subscription-trial-payment', + ); + } + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprDirectDebitIDealGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return plugins_url( 'images/direct-debit-ideal/icon-32x32.png', Plugin::$file ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitSofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitSofortGateway.php new file mode 100644 index 00000000..9967bcdc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/DirectDebitSofortGateway.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress pay MemberPress Direct Debit mandate via Sofort gateway + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 1.0.6 + */ +class DirectDebitSofortGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT_SOFORT; + + /** + * Constructs and initialize credit card gateway. + */ + public function __construct() { + parent::__construct(); + + // Capabilities. + $this->capabilities = array( + 'process-payments', + 'create-subscriptions', + 'cancel-subscriptions', + 'update-subscriptions', + 'suspend-subscriptions', + 'resume-subscriptions', + 'subscription-trial-payment', + ); + } + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprDirectDebitSofortGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return plugins_url( 'images/direct-debit-sofort/icon-32x32.png', Plugin::$file ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php new file mode 100644 index 00000000..0feb4918 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/Gateway.php @@ -0,0 +1,995 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use MeprBaseRealGateway; +use MeprEmailFactory; +use MeprOptions; +use MeprProduct; +use MeprSubscription; +use MeprTransaction; +use MeprTransactionsHelper; +use MeprUser; +use MeprUtils; +use MeprView; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; +use ReflectionClass; + +/** + * WordPress pay MemberPress gateway + * + * @author Remco Tolsma + * @version 2.1.2 + * @since 1.0.0 + */ +class Gateway extends MeprBaseRealGateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method; + + /** + * MemberPress transaction. + * + * @var MeprTransaction + */ + public $mp_txn; + + /** + * Pronamic payment. + * + * @var Payment + */ + public $pronamic_payment; + + /** + * Constructs and initialize iDEAL gateway. + */ + public function __construct() { + // Set the name of this gateway. + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L12-13. + $this->name = __( 'Pronamic', 'pronamic_ideal' ); + + if ( ! empty( $this->payment_method ) ) { + $this->name = sprintf( + /* translators: %s: payment method name */ + __( 'Pronamic - %s', 'pronamic_ideal' ), + PaymentMethods::get_name( $this->payment_method ) + ); + } + + // Set the default settings. + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L72-73. + $this->set_defaults(); + + // Set the capabilities of this gateway. + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L36-37. + $this->capabilities = array(); + + // Setup the notification actions for this gateway. + $this->notifiers = array(); + } + + /** + * Load the specified settings. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L69-70 + * + * @param array $settings MemberPress gateway settings array. + */ + public function load( $settings ) { + $this->settings = (object) $settings; + + $this->set_defaults(); + } + + /** + * Custom helper function to send transaction notices. + * + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/lib/MeprUtils.php#L1333-L1351 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/models/MeprTransaction.php + * + * @param MeprTransaction $transaction MemberPress transaction object. + * @param string $method PHP function name to call. + * + * @return mixed + */ + public function send_transaction_notices( $transaction, $method ) { + $class = 'MeprUtils'; + + if ( ! Core_Util::class_method_exists( $class, $method ) ) { + $class = $this; + } + + // `send_product_welcome_notices` is called from `send_signup_notices` in newer versions. + if ( 'send_product_welcome_notices' === $method ) { + if ( 'MeprUtils' === $class ) { + return null; + } + + if ( ! \method_exists( $class, 'send_product_welcome_notices' ) ) { + return null; + } + } + + return call_user_func( array( $class, $method ), $transaction ); + } + + /** + * Get icon function (this is not a MemberPress function). + * + * @since 1.0.2 + * @return string + */ + protected function get_icon() { + return ''; + } + + /** + * Get class alias name. + * + * @return string + */ + public function get_alias() { + return 'MeprPronamicGateway'; + } + + /** + * Set the default settings. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L72-73 + */ + protected function set_defaults() { + if ( ! isset( $this->settings ) ) { + $this->settings = array(); + } + + $this->settings = (object) array_merge( + array( + 'gateway' => $this->get_alias(), + 'id' => $this->generate_id(), + 'label' => '', + 'use_label' => true, + 'icon' => $this->get_icon(), + 'use_icon' => true, + 'desc' => '', + 'use_desc' => true, + 'config_id' => '', + 'email' => '', + 'sandbox' => false, + 'debug' => false, + ), + (array) $this->settings + ); + + $this->id = $this->settings->id; + $this->label = $this->settings->label; + $this->use_label = $this->settings->use_label; + $this->icon = $this->settings->icon; + $this->use_icon = $this->settings->use_icon; + $this->desc = $this->settings->desc; + $this->use_desc = $this->settings->use_desc; + } + + /** + * Process payment. + * + * @param MeprTransaction $txn MemberPress transaction object. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L119-122 + */ + public function process_payment( $txn ) { + + } + + /** + * Record subscription payment. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L140-145 + */ + public function record_subscription_payment() { + $transaction = $this->mp_txn; + + $transaction->status = MeprTransaction::$complete_str; + $transaction->expires_at = MeprUtils::ts_to_mysql_date( $this->pronamic_payment->get_end_date()->getTimestamp(), 'Y-m-d 23:59:59' ); + $transaction->store(); + + $subscription = $transaction->subscription(); + + if ( $subscription ) { + $should_activate = ! \in_array( + $subscription->status, + array( + MeprSubscription::$active_str, + MeprSubscription::$cancelled_str, + ), + true + ); + + if ( $should_activate ) { + $subscription->status = MeprSubscription::$active_str; + $subscription->store(); + } + + $subscription->expire_confirmation_txn(); + + $subscription->limit_payment_cycles(); + } + + $this->send_transaction_notices( $transaction, 'send_transaction_receipt_notices' ); + + return $transaction; + } + + /** + * Record payment failure. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L147-148 + */ + public function record_payment_failure() { + $transaction = $this->mp_txn; + + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/models/MeprTransaction.php#L50. + $transaction->status = MeprTransaction::$failed_str; + $transaction->store(); + + // Expire associated subscription transactions for non-recurring payments. + if ( ! ( isset( $this->pronamic_payment ) && $this->pronamic_payment->get_recurring() ) ) { + $subscription = $transaction->subscription(); + + if ( $subscription ) { + $subscription->expire_txns(); + $subscription->store(); + } + } + + $this->send_transaction_notices( $transaction, 'send_failed_txn_notices' ); + + return $transaction; + } + + /** + * Record payment. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L124-129 + */ + public function record_payment() { + $transaction = $this->mp_txn; + + $transaction->status = MeprTransaction::$complete_str; + + // This will only work before maybe_cancel_old_sub is run. + $upgrade = $transaction->is_upgrade(); + $downgrade = $transaction->is_downgrade(); + + $event_transaction = $transaction->maybe_cancel_old_sub(); + + $subscription = $transaction->subscription(); + + if ( $subscription ) { + $event_subscription = $subscription->maybe_cancel_old_sub(); + + $subscription->status = MeprSubscription::$active_str; + $subscription->created_at = $transaction->created_at; + $subscription->store(); + + if ( false === $event_transaction && false !== $event_subscription ) { + $event_transaction = $event_subscription; + } + } + + $transaction->store(); + + /* + * For some reasons the `send_product_welcome_notices` function accepts 1 or 3 arguments. We are not sure + * if this is a difference in the 'Business' and 'Developer' edition or between version `1.2.4` and `1.2.7`. + * + * @link https://github.com/wp-premium/memberpress-developer/blob/1.2.4/app/lib/MeprBaseGateway.php#L596-L612 + * @link https://github.com/wp-premium/memberpress-business/blob/1.2.7/app/lib/MeprBaseGateway.php#L609-L619 + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/models/MeprTransaction.php#L51 + */ + $reflection = new ReflectionClass( 'MeprBaseRealGateway' ); + + if ( $reflection->hasMethod( 'send_product_welcome_notices' ) && 3 === $reflection->getMethod( 'send_product_welcome_notices' )->getNumberOfParameters() ) { + $uemail = MeprEmailFactory::fetch( + 'MeprUserProductWelcomeEmail', + 'MeprBaseProductEmail', + array( + array( + 'product_id' => $transaction->product_id, + ), + ) + ); + + /** + * The `send_product_welcome_notices` method is only available in earlier version of MemberPress. + * + * @scrutinizer ignore-call + */ + $this->send_product_welcome_notices( + $uemail, + MeprTransactionsHelper::get_email_params( $transaction ), + $transaction->user() + ); + } else { + $this->send_transaction_notices( $transaction, 'send_product_welcome_notices' ); + } + + // Send upgrade/downgrade notices. + $product = $transaction->product(); + + if ( 'lifetime' === $product->period_type ) { + if ( $upgrade ) { + $this->upgraded_sub( $transaction, $event_transaction ); + $this->send_transaction_notices( $transaction, 'send_upgraded_txn_notices' ); + } elseif ( $downgrade ) { + $this->downgraded_sub( $transaction, $event_transaction ); + $this->send_transaction_notices( $transaction, 'send_downgraded_txn_notices' ); + } else { + $this->new_sub( $transaction ); + } + } + + $this->send_transaction_notices( $transaction, 'send_signup_notices' ); + $this->send_transaction_notices( $transaction, 'send_transaction_receipt_notices' ); + + return $transaction; + } + + /** + * Process refund. + * + * @param MeprTransaction $txn MemberPress transaction object. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L131-133 + */ + public function process_refund( MeprTransaction $txn ) { + + } + + /** + * Record refund. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L135-138 + */ + public function record_refund() { + + } + + /** + * Process trial payment. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L150-157 + * + * @param MeprTransaction $transaction MemberPress transaction object. + */ + public function process_trial_payment( $transaction ) { + + } + + /** + * Reord trial payment. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L159-161 + * + * @param MeprTransaction $transaction MemberPress transaction object. + */ + public function record_trial_payment( $transaction ) { + + } + + /** + * Process create subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L163-167 + * + * @param MeprTransaction $txn MemberPress transaction object. + */ + public function process_create_subscription( $txn ) { + + } + + /** + * Record create subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L169-174 + */ + public function record_create_subscription() { + + } + + /** + * Process update subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L176 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/lib/MeprBaseGateway.php#L194 + * + * @param int $sub_id Subscription ID. + */ + public function process_update_subscription( $sub_id ) { + + } + + /** + * Record update subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L178-182 + */ + public function record_update_subscription() { + + } + + /** + * Process suspend subscription. + * + * @param int $sub_id Subscription id. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L184-186 + */ + public function process_suspend_subscription( $sub_id ) { + if ( ! MeprSubscription::exists( $sub_id ) ) { + return; + } + + $sub = new MeprSubscription( $sub_id ); + + if ( MeprSubscription::$suspended_str === $sub->status ) { + // Subscription is already suspended. + return; + } + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $sub->id ); + + if ( ! $subscription ) { + return; + } + + $sub->status = MeprSubscription::$suspended_str; + + $sub->store(); + + // Send suspended subscription notices. + MeprUtils::send_suspended_sub_notices( $sub ); + + $note = sprintf( + /* translators: %s: extension name */ + __( '%s subscription on hold.', 'pronamic_ideal' ), + __( 'MemberPress', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + // The status of canceled or completed subscriptions will not be changed automatically. + if ( ! in_array( $subscription->get_status(), array( SubscriptionStatus::CANCELLED, SubscriptionStatus::COMPLETED ), true ) ) { + $subscription->set_status( SubscriptionStatus::ON_HOLD ); + + $subscription->save(); + } + } + + /** + * Record suspend subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L188-191 + */ + public function record_suspend_subscription() { + + } + + /** + * Process resume subscription. + * + * @param int $sub_id Subscription id. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L193-195 + */ + public function process_resume_subscription( $sub_id ) { + if ( ! MeprSubscription::exists( $sub_id ) ) { + return; + } + + $sub = new MeprSubscription( $sub_id ); + + if ( MeprSubscription::$active_str === $sub->status ) { + // Subscription is already active. + return; + } + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $sub->id ); + + if ( ! $subscription ) { + return; + } + + $sub->status = MeprSubscription::$active_str; + + $sub->store(); + + // Check if prior txn is expired yet or not, if so create a temporary txn so the user can access the content immediately. + $prior_txn = $sub->latest_txn(); + + if ( false === $prior_txn || ! ( $prior_txn instanceof MeprTransaction ) || strtotime( $prior_txn->expires_at ) < time() ) { + $txn = new MeprTransaction(); + $txn->subscription_id = $sub->id; + $txn->trans_num = $sub->subscr_id . '-' . uniqid(); + $txn->status = MeprTransaction::$confirmed_str; + $txn->txn_type = MeprTransaction::$subscription_confirmation_str; + $txn->response = (string) $sub; + $txn->expires_at = MeprUtils::ts_to_mysql_date( time() + MeprUtils::days( 1 ), 'Y-m-d 23:59:59' ); + + $txn->set_subtotal( 0.00 ); // Just a confirmation txn. + + $txn->store(); + } + + // Send resumed subscription notices. + MeprUtils::send_resumed_sub_notices( $sub ); + + // Add note. + $note = sprintf( + /* translators: %s: extension name */ + __( '%s subscription reactivated.', 'pronamic_ideal' ), + __( 'MemberPress', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + // The status of canceled or completed subscriptions will not be changed automatically. + if ( ! in_array( $subscription->get_status(), array( SubscriptionStatus::CANCELLED, SubscriptionStatus::COMPLETED ), true ) ) { + $subscription->set_status( SubscriptionStatus::ACTIVE ); + + $subscription->save(); + } + } + + /** + * Record resume subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L197-201 + */ + public function record_resume_subscription() { + + } + + /** + * Process cancel subscription. + * + * @param int $sub_id Subscription id. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L202-206 + */ + public function process_cancel_subscription( $sub_id ) { + if ( ! MeprSubscription::exists( $sub_id ) ) { + return; + } + + $sub = new MeprSubscription( $sub_id ); + + if ( MeprSubscription::$cancelled_str === $sub->status ) { + // Subscription is already cancelled. + return; + } + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $sub->id ); + + if ( ! $subscription ) { + return; + } + + // Add note. + $note = sprintf( + /* translators: %s: extension name */ + __( '%s subscription cancelled.', 'pronamic_ideal' ), + __( 'MemberPress', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + // The status of canceled or completed subscriptions will not be changed automatically. + if ( ! in_array( $subscription->get_status(), array( SubscriptionStatus::CANCELLED, SubscriptionStatus::COMPLETED ), true ) ) { + $subscription->set_status( SubscriptionStatus::CANCELLED ); + + $subscription->next_payment_date = null; + $subscription->next_payment_delivery_date = null; + + // Delete next payment post meta. + $subscription->set_meta( 'next_payment', null ); + $subscription->set_meta( 'next_payment_delivery_date', null ); + + $subscription->save(); + } + + // Cancel MemberPress subscription. + $sub->status = MeprSubscription::$cancelled_str; + + $sub->store(); + + // Expire the grace period (confirmation) if no completed payments have come through. + if ( (int) $sub->txn_count <= 0 ) { + $sub->expire_txns(); + } + + $sub->limit_reached_actions(); + + // Send cancelled subscription notices. + MeprUtils::send_cancelled_sub_notices( $sub ); + } + + /** + * Record cancel subscription. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L208-212 + */ + public function record_cancel_subscription() { + + } + + /** + * Process signup form. + * + * Gets called when the signup form is posted used for running any payment + * method specific actions when processing the customer signup form. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L214-217 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/controllers/MeprCheckoutCtrl.php#L262 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/lib/MeprBaseGateway.php#L232-L235 + * + * @param MeprTransaction $txn MemberPress transaction object. + */ + public function process_signup_form( $txn ) { + + } + + /** + * Payment redirect. + * + * @param MeprTransaction $txn MemberPress transaction object. + * + * @throws \Exception Throws exception on gateway payment start error. + * @since 1.0.2 + */ + public function payment_redirect( $txn ) { + $txn = new MeprTransaction( $txn->id ); + + // Gateway. + $config_id = $this->settings->config_id; + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + // Create Pronamic payment. + $payment = Pronamic::get_payment( $txn ); + + $payment->config_id = $this->settings->config_id; + $payment->method = $this->payment_method; + + $error = null; + + try { + $payment = Plugin::start_payment( $payment ); + } catch ( \Exception $e ) { + $error = $e; + } + + /* + * Update trial transaction. + * + * Notes: + * - MemberPress also uses trial amount for prorated upgrade/downgrade + * - Not updated BEFORE payment start, as transaction total amount is used for subscription amount. + * - Reload transaction to make sure actual status is being used (i.e. on free downgrade). + */ + $txn = new MeprTransaction( $txn->id ); + + $subscription = $txn->subscription(); + + if ( $subscription && $subscription->in_trial() ) { + $txn->expires_at = MeprUtils::ts_to_mysql_date( $payment->get_end_date()->getTimestamp(), 'Y-m-d 23:59:59' ); + + $txn->set_subtotal( $subscription->trial_amount ); + $txn->store(); + } + + if ( $error instanceof \Exception ) { + // Rethrow error, catched by MemberPress. + throw $error; + } + + // Redirect. + $gateway->redirect( $payment ); + } + + /** + * Display payment page. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L219-223 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/controllers/MeprCheckoutCtrl.php#L290 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/gateways/MeprPayPalGateway.php#L775-L850 + * + * @param MeprTransaction $txn MemberPress transaction object. + * + * @throws \Exception Throws exception on gateway payment start error. + */ + public function display_payment_page( $txn ) { + // Gateway. + $config_id = $this->settings->config_id; + + $gateway = Plugin::get_gateway( $config_id ); + + if ( $gateway && '' === $gateway->get_input_html() ) { + $this->payment_redirect( $txn ); + } + } + + /** + * Process payment form. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L239-289 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/controllers/MeprCheckoutCtrl.php#L336 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/gateways/MeprPayPalGateway.php#L1011 + * + * @param MeprTransaction $txn MemberPress transaction object. + * + * @return bool + * @throws \Exception Throws exception on gateway payment start error. + */ + public function process_payment_form( $txn ) { + if ( ! filter_has_var( INPUT_POST, 'pronamic_pay_memberpress_pay' ) ) { + return false; + } + + // Gateway. + $config_id = $this->settings->config_id; + + $gateway = Plugin::get_gateway( $config_id ); + + if ( $gateway ) { + $this->payment_redirect( $txn ); + } + } + + /** + * Enqueue payment form scripts. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L219-223 + */ + public function enqueue_payment_form_scripts() { + + } + + /** + * Display payment form. + * + * This spits out html for the payment form on the registration / payment + * page for the user to fill out for payment. + * + * @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/lib/MeprBaseGateway.php#L230-233 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/lib/MeprBaseGateway.php#L248-L251 + * @link https://github.com/wp-premium/memberpress-basic/blob/1.3.18/app/controllers/MeprCheckoutCtrl.php#L318 + * + * @param float $amount Transaction amount to create a payment form for. + * @param MeprUser $user MemberPress user object. + * @param int $product_id Product ID. + * @param int $txn_id Transaction ID. + */ + public function display_payment_form( $amount, $user, $product_id, $txn_id ) { + $product = new MeprProduct( $product_id ); + + $coupon = false; + + $txn = new MeprTransaction( $txn_id ); + + // Artifically set the price of the $prd in case a coupon was used. + if ( $product->price !== $amount ) { + $coupon = true; + $product->price = $amount; + } + + $invoice = MeprTransactionsHelper::get_invoice( $txn ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $invoice; + + ?> +
    +
    + + + + +
     
    + + settings->config_id; + + $gateway = Plugin::get_gateway( $config_id ); + + if ( $gateway ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $gateway->get_input_html(); + } + + ?> + +
     
    + + + + + + +
    +
    + + + + integrations_str, + $this->id, + 'config_id' + ); + + ?> + + + +
    + + + +
    + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress iDEAL gateway + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class IDealGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::IDEAL; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprIDealGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 1.0.2 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/PayPalGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/PayPalGateway.php new file mode 100644 index 00000000..1015ae1f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/PayPalGateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress PayPal gateway + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 1.0.5 + */ +class PayPalGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::PAYPAL; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprPronamicPayPalGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 1.0.2 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/Przelewy24Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/Przelewy24Gateway.php new file mode 100644 index 00000000..0679a01f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/Przelewy24Gateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress Przelewy24 gateway + * + * @author Reüel van der Steege + * @version 2.2.0 + * @since 2.2.0 + */ +class Przelewy24Gateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::PRZELEWY24; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprPrzelewy24Gateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/SofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/SofortGateway.php new file mode 100644 index 00000000..183aac98 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Gateways/SofortGateway.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Extensions\MemberPress\Pronamic; + +/** + * WordPress pay MemberPress Sofort gateway + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class SofortGateway extends Gateway { + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::SOFORT; + + /** + * Get alias class name of this gateway. + * + * @return string + */ + public function get_alias() { + return 'MeprSofortGateway'; + } + + /** + * Get icon function, please note that this is not a MemberPress function. + * + * @since 2.0.8 + * @return string + */ + protected function get_icon() { + return Pronamic::get_method_icon_url( $this->payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/MemberPress.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/MemberPress.php new file mode 100644 index 00000000..96583b36 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/MemberPress.php @@ -0,0 +1,51 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress; + +use MeprTransaction; +use MeprOptions; + +/** + * WordPress pay MemberPress + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 1.0.0 + */ +class MemberPress { + /** + * Transaction has status. + * + * @param MeprTransaction $transaction MemberPress transaction object. + * @param string|array $status MemberPress transaction status string. + * + * @return bool Returns true if the transaction has the specified status, false otherwise. + */ + public static function transaction_has_status( MeprTransaction $transaction, $status ) { + if ( is_array( $status ) ) { + return in_array( $transaction->status, $status, true ); + } + + return ( $transaction->status === $status ); + } + + /** + * Get currency. + * + * @return string + */ + public static function get_currency() { + $mepr_options = MeprOptions::fetch(); + + // @link https://gitlab.com/pronamic/memberpress/blob/1.2.4/app/models/MeprOptions.php#L136-137 + return $mepr_options->currency_code; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/MemberPressDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/MemberPressDependency.php new file mode 100644 index 00000000..a2c4ae34 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/MemberPressDependency.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * MemberPress Dependency + * + * @author Reüel van der Steege + * @version 2.1.1 + * @since 2.1.1 + */ +class MemberPressDependency extends Dependency { + /** + * Is met. + * + * @link + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \defined( '\MEPR_VERSION' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Pronamic.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Pronamic.php new file mode 100644 index 00000000..8be83000 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/Pronamic.php @@ -0,0 +1,249 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress; + +use MeprTransaction; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentLines; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionInterval; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPhase; + +/** + * Pronamic + * + * @author Remco Tolsma + * @version 2.0.10 + * @since 2.0.5 + */ +class Pronamic { + /** + * Get payment method icon URL. + * + * @param $method + * @return string + */ + public static function get_method_icon_url( $method ) { + $method = \str_replace( '_', '-', $method ); + + return sprintf( 'https://cdn.wp-pay.org/jsdelivr.net/npm/@wp-pay/logos@1.6.5/dist/methods/%1$s/method-%1$s-640x360.svg', $method ); + } + + /** + * Get Pronamic payment from MemberPress transaction. + * + * @param MeprTransaction $memberpress_transaction MemberPress transaction object. + * + * @return Payment + */ + public static function get_payment( MeprTransaction $memberpress_transaction ) { + $payment = new Payment(); + + // MemberPress. + $memberpress_user = $memberpress_transaction->user(); + $memberpress_product = $memberpress_transaction->product(); + $memberpress_subscription = $memberpress_transaction->subscription(); + + // Title. + $title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + sprintf( + /* translators: %s: order id */ + __( 'MemberPress transaction %s', 'pronamic_ideal' ), + $memberpress_transaction->id + ) + ); + + $payment->order_id = $memberpress_transaction->id; + $payment->title = $title; + $payment->description = $memberpress_product->post_title; + $payment->user_id = $memberpress_user->ID; + $payment->source = 'memberpress'; + $payment->source_id = $memberpress_transaction->id; + $payment->issuer = null; + + // Contact. + $contact_name = new ContactName(); + $contact_name->set_first_name( $memberpress_user->first_name ); + $contact_name->set_last_name( $memberpress_user->last_name ); + + $customer = new Customer(); + $customer->set_name( $contact_name ); + $customer->set_email( $memberpress_user->user_email ); + $customer->set_user_id( $memberpress_user->ID ); + + $payment->set_customer( $customer ); + + /* + * Address. + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/models/MeprUser.php#L1191-L1216 + */ + $address = new Address(); + + $address->set_name( $contact_name ); + + $address_fields = array( + 'one' => 'set_line_1', + 'two' => 'set_line_2', + 'city' => 'set_city', + 'state' => 'set_region', + 'zip' => 'set_postal_code', + 'country' => 'set_country_code', + ); + + foreach ( $address_fields as $field => $function ) { + $value = $memberpress_user->address( $field, false ); + + if ( empty( $value ) ) { + continue; + } + + call_user_func( array( $address, $function ), $value ); + } + + $payment->set_billing_address( $address ); + $payment->set_shipping_address( $address ); + + /* + * Totals. + */ + $payment->set_total_amount( + new TaxedMoney( + $memberpress_transaction->total, + MemberPress::get_currency(), + $memberpress_transaction->tax_amount, + $memberpress_transaction->tax_rate + ) + ); + + /* + * Vat number. + * @link https://github.com/wp-premium/memberpress-business/search?utf8=%E2%9C%93&q=mepr_vat_number&type= + * @todo + */ + + /* + * Subscription. + * @link https://github.com/wp-premium/memberpress-business/blob/1.3.36/app/models/MeprTransaction.php#L603-L618 + */ + $payment->subscription = self::get_subscription( $memberpress_transaction ); + + if ( $payment->subscription ) { + $payment->subscription_source_id = $memberpress_transaction->subscription_id; + + $payment->add_period( $payment->subscription->new_period() ); + + if ( $memberpress_subscription->in_trial() ) { + $payment->set_total_amount( + new TaxedMoney( + $memberpress_subscription->trial_amount, + MemberPress::get_currency(), + null, // Calculate tax value based on tax percentage. + $memberpress_transaction->tax_rate + ) + ); + } + } + + /* + * Lines. + */ + $payment->lines = new PaymentLines(); + + $line = $payment->lines->new_line(); + + $line->set_id( $memberpress_product->ID ); + $line->set_name( $memberpress_product->post_title ); + $line->set_quantity( 1 ); + $line->set_unit_price( $payment->get_total_amount() ); + $line->set_total_amount( $payment->get_total_amount() ); + $line->set_product_url( get_permalink( $memberpress_product->ID ) ); + + /* + * Return. + */ + return $payment; + } + + /** + * Get Pronamic subscription from MemberPress transaction. + * + * @param MeprTransaction $memberpress_transaction MemberPress transaction object. + * + * @return Subscription|null + */ + public static function get_subscription( MeprTransaction $memberpress_transaction ) { + $memberpress_product = $memberpress_transaction->product(); + + if ( $memberpress_product->is_one_time_payment() ) { + return null; + } + + $memberpress_subscription = $memberpress_transaction->subscription(); + + if ( ! $memberpress_subscription ) { + return null; + } + + /** + * Subscription. + */ + $subscription = new Subscription(); + + $start_date = new \DateTimeImmutable(); + + // Trial phase. + if ( $memberpress_subscription->in_trial() ) { + $trial_phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( 'P' . $memberpress_subscription->trial_days . 'D' ), + new TaxedMoney( $memberpress_subscription->trial_amount, MemberPress::get_currency() ) + ); + + $trial_phase->set_total_periods( 1 ); + $trial_phase->set_trial( true ); + + $subscription->add_phase( $trial_phase ); + + $start_date = $trial_phase->get_end_date(); + } + + // Total periods. + $total_periods = null; + + $limit_cycles_number = (int) $memberpress_subscription->limit_cycles_num; + + if ( $memberpress_subscription->limit_cycles && $limit_cycles_number > 0 ) { + $total_periods = $limit_cycles_number; + } + + // Regular phase. + $regular_phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( 'P' . $memberpress_product->period . Core_Util::to_period( $memberpress_product->period_type ) ), + new TaxedMoney( $memberpress_transaction->total, MemberPress::get_currency() ) + ); + + $regular_phase->set_total_periods( $total_periods ); + + $subscription->add_phase( $regular_phase ); + + return $subscription; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/SubscriptionStatuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/SubscriptionStatuses.php new file mode 100644 index 00000000..197655b1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/src/SubscriptionStatuses.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +namespace Pronamic\WordPress\Pay\Extensions\MemberPress; + +use MeprSubscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; + +/** + * Subscription statuses + * + * @author Remco Tolsma + * @version 2.0.1 + * @since 2.0.1 + */ +class SubscriptionStatuses { + /** + * Transform a MemberPress subscription status to a WordPress Pay subscription status. + * + * @link https://github.com/wp-premium/memberpress-basic/blob/master/app/models/MeprSubscription.php#L5-L9 + * + * @param string $status MemberPress subscription status value. + * + * @return string|null + */ + public static function transform( $status ) { + switch ( $status ) { + case MeprSubscription::$pending_str: + return SubscriptionStatus::OPEN; + case MeprSubscription::$active_str: + return SubscriptionStatus::ACTIVE; + case MeprSubscription::$suspended_str: + return null; + case MeprSubscription::$cancelled_str: + return SubscriptionStatus::CANCELLED; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/views/subscription-form.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/views/subscription-form.php new file mode 100644 index 00000000..cabb1e7a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/views/subscription-form.php @@ -0,0 +1,63 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +?> + + + + + + 'pronamic_pay_subscr', + 'post_status' => 'any', + 'nopaging' => true, + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_source', + 'compare' => '=', + 'value' => 'memberpress', + ), + array( + 'key' => '_pronamic_subscription_source_id', + 'compare' => '=', + 'value' => $memberpress_subscription_id, + ), + ), + ) + ); + + if ( $query->have_posts() ) { + echo '
      '; + + while ( $query->have_posts() ) { + $query->the_post(); + + echo '
    • '; + + printf( + '%s', + esc_attr( get_edit_post_link( get_post() ) ), + esc_html( get_the_ID() ) + ); + + echo '
    • '; + } + + echo '
    '; + + wp_reset_postdata(); + } + + ?> + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/views/transaction-form.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/views/transaction-form.php new file mode 100644 index 00000000..32e6753f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/memberpress/views/transaction-form.php @@ -0,0 +1,63 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\MemberPress + */ + +?> + + + + + + 'pronamic_payment', + 'post_status' => 'any', + 'nopaging' => true, + 'meta_query' => array( + array( + 'key' => '_pronamic_payment_source', + 'compare' => '=', + 'value' => 'memberpress', + ), + array( + 'key' => '_pronamic_payment_source_id', + 'compare' => '=', + 'value' => $memberpress_transaction_id, + ), + ), + ) + ); + + if ( $query->have_posts() ) { + echo '
      '; + + while ( $query->have_posts() ) { + $query->the_post(); + + echo '
    • '; + + printf( + '%s', + esc_attr( get_edit_post_link( get_post() ) ), + esc_html( get_the_ID() ) + ); + + echo '
    • '; + } + + echo '
    '; + + wp_reset_postdata(); + } + + ?> + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/Extension.php new file mode 100644 index 00000000..e618262d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/Extension.php @@ -0,0 +1,276 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\NinjaForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\NinjaForms; + +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Extension + * + * @version 1.3.0 + * @since 1.0.0 + */ +class Extension extends AbstractPluginIntegration { + /** + * Slug + * + * @var string + */ + const SLUG = 'ninja-forms'; + + /** + * Construct Ninja Forms plugin integration. + */ + public function __construct() { + parent::__construct( + array( + 'name' => __( 'Ninja Forms', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new NinjaFormsDependency() ); + } + + /** + * Setup. + */ + public function setup() { + \add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + \add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + \add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( $this, 'redirect_url' ), 10, 2 ); + + \add_filter( 'ninja_forms_field_type_sections', array( $this, 'field_type_sections' ) ); + \add_filter( 'ninja_forms_register_fields', array( $this, 'register_fields' ), 10, 3 ); + \add_filter( 'ninja_forms_register_payment_gateways', array( $this, 'register_payment_gateways' ), 10, 1 ); + \add_filter( 'ninja_forms_field_settings_groups', array( $this, 'register_settings_groups' ) ); + } + + /** + * Filter field type sections. + * + * @param array $sections Field type sections. + * + * @return array + */ + public function field_type_sections( $sections ) { + $sections['pronamic_pay'] = array( + 'id' => 'pronamic_pay', + 'nicename' => __( 'Pronamic Pay', 'pronamic_ideal' ), + 'fieldTypes' => array(), + ); + + return $sections; + } + + /** + * Register custom fields + * + * @param array $fields Fields from Ninja Forms. + * @return array $fields + */ + public function register_fields( $fields ) { + $fields['pronamic_pay_payment_method'] = new PaymentMethodsField(); + $fields['pronamic_pay_issuer'] = new IssuersField(); + + return $fields; + } + + /** + * Register payment gateways. + * + * @param array $gateways Payment gateways. + * + * @return array + */ + public function register_payment_gateways( $gateways ) { + $gateways['pronamic_pay'] = new PaymentGateway(); + + return $gateways; + } + + /** + * Register settings groups. + * + * @param array $groups Settings groups. + * + * @return array + */ + public function register_settings_groups( $groups ) { + $groups['pronamic_pay'] = array( + 'id' => 'pronamic_pay', + 'label' => __( 'Pronamic Pay', 'pronamic_ideal' ), + 'priority' => 200, + ); + + return $groups; + } + + /** + * Payment redirect URL filter. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * + * @return string + * @since 1.1.1 + */ + public function redirect_url( $url, $payment ) { + $form_id = $payment->get_meta( 'ninjaforms_payment_form_id' ); + $action_id = $payment->get_meta( 'ninjaforms_payment_action_id' ); + + if ( empty( $form_id ) || empty( $action_id ) ) { + return $url; + } + + $action_settings = Ninja_Forms()->form( $form_id )->get_action( $action_id )->get_settings(); + + $status_url = null; + + switch ( $payment->status ) { + case PaymentStatus::CANCELLED: + $status_url = NinjaFormsHelper::get_page_link_from_action_settings( $action_settings, 'pronamic_pay_cancel_page_id' ); + + break; + case PaymentStatus::EXPIRED: + $status_url = NinjaFormsHelper::get_page_link_from_action_settings( $action_settings, 'pronamic_pay_expired_page_id' ); + + break; + case PaymentStatus::FAILURE: + $status_url = NinjaFormsHelper::get_page_link_from_action_settings( $action_settings, 'pronamic_pay_error_page_id' ); + + break; + case PaymentStatus::SUCCESS: + $status_url = NinjaFormsHelper::get_page_link_from_action_settings( $action_settings, 'pronamic_pay_completed_page_id' ); + + break; + case PaymentStatus::OPEN: + default: + $status_url = NinjaFormsHelper::get_page_link_from_action_settings( $action_settings, 'pronamic_pay_unknown_page_id' ); + + break; + } + + if ( ! empty( $status_url ) ) { + return $status_url; + } + + return $url; + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + $source_id = $payment->get_source_id(); + + if ( empty( $source_id ) ) { + return $url; + } + + $source_id = intval( $source_id ); + + // Source ID could be a submission ID. + if ( 'nf_sub' === get_post_type( $source_id ) ) { + $url = add_query_arg( + array( + 'post' => $source_id, + 'action' => 'edit', + ), + admin_url( 'post.php' ) + ); + } + + return $url; + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'Ninja Forms', 'pronamic_ideal' ) . '
    '; + + $source_id = $payment->get_source_id(); + + if ( empty( $source_id ) ) { + return $text; + } + + $source_id = intval( $source_id ); + + if ( 'nf_sub' === get_post_type( $source_id ) ) { + $text .= sprintf( + '%s', + add_query_arg( + array( + 'post' => $source_id, + 'action' => 'edit', + ), + admin_url( 'post.php' ) + ), + /* translators: %s: source id */ + sprintf( __( 'Entry #%s', 'pronamic_ideal' ), $source_id ) + ); + } else { + /* translators: %s: payment source id */ + $text .= sprintf( __( '#%s', 'pronamic_ideal' ), $source_id ); + } + + return $text; + } + + /** + * Source description. + * + * @param string $description Description. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + $description = __( 'Ninja Forms', 'pronamic_ideal' ); + + $source_id = $payment->get_source_id(); + + if ( empty( $source_id ) ) { + return $description; + } + + $source_id = intval( $source_id ); + + if ( 'nf_sub' === get_post_type( $source_id ) ) { + $description = __( 'Ninja Forms Entry', 'pronamic_ideal' ); + } + + return $description; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/IssuersField.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/IssuersField.php new file mode 100644 index 00000000..28bc2127 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/IssuersField.php @@ -0,0 +1,170 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\NinjaForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\NinjaForms; + +use NF_Abstracts_List; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Issuers field + * + * @version 1.0.3 + * @since 1.0.0 + */ +class IssuersField extends NF_Abstracts_List { + + /** + * Name. + * + * @var string + */ + protected $_name = 'pronamic_pay_issuer'; + + /** + * Type. + * + * @var string + */ + protected $_type = 'pronamic_pay_issuer'; + + /** + * Nice name for display. + * + * @var string + */ + protected $_nicename = 'Issuer'; + + /** + * Section. + * + * @var string + */ + protected $_section = 'pronamic_pay'; + + /** + * Icon. + * + * @var string + */ + protected $_icon = 'bank'; + + /** + * Template. + * + * @var string + */ + protected $_templates = 'listselect'; + + /** + * Old classname for earlier versions. + * + * @var string + */ + protected $_old_classname = 'list-select'; + + /** + * Settings. + * + * @var array + */ + protected $_settings = array(); + + /** + * Form ID. + * + * @var int + */ + public $form_id; + + /** + * Constructs and initializes the field object. + */ + public function __construct() { + parent::__construct(); + + $this->_nicename = __( 'Issuer', 'pronamic_ideal' ); + + $this->_settings['options']['value'] = array(); + + // Actions. + \add_action( 'ninja_forms_render_options_' . $this->_type, array( $this, 'render_options' ), 10, 0 ); + \add_action( 'nf_get_form_id', array( $this, 'set_form_id' ) ); + } + + /** + * Set form ID. + * + * @param int $form_id Form ID. + * @return void + */ + public function set_form_id( $form_id ) { + $this->form_id = $form_id; + } + + /** + * Get settings. + * + * @return array + */ + public function get_settings() { + // Hide options settings in form builder. + if ( is_admin() ) { + unset( $this->_settings['options'] ); + } + + return $this->_settings; + } + + /** + * Get options. + * + * @return array + */ + public function render_options() { + $options = array(); + $order = 0; + + $action_settings = NinjaFormsHelper::get_collect_payment_action_settings( $this->form_id ); + + $config_id = NinjaFormsHelper::get_config_id_from_action_settings( $action_settings ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway ) { + return $options; + } + + $gateway->set_payment_method( PaymentMethods::IDEAL ); + + try { + $issuers = $gateway->get_transient_issuers(); + } catch ( \Exception $e ) { + $issuers = null; + } + + if ( empty( $issuers ) ) { + return $options; + } + + foreach ( $issuers[0]['options'] as $value => $label ) { + $options[] = array( + 'label' => $label, + 'value' => $value, + 'calc' => '', + 'selected' => 0, + 'order' => ++$order, + ); + } + + return $options; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/NinjaFormsDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/NinjaFormsDependency.php new file mode 100644 index 00000000..2f98a0dd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/NinjaFormsDependency.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\NinjaForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\NinjaForms; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * Ninja Forms Dependency + * + * @author Reüel van der Steege + * @version 1.1.1 + * @since 1.1.1 + */ +class NinjaFormsDependency extends Dependency { + /** + * Is met. + * + * @link https://git.saturdaydrive.io/_/ninja-forms/ninja-forms/blob/3.4.24.1/ninja-forms.php#L55 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \class_exists( '\Ninja_Forms' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/NinjaFormsHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/NinjaFormsHelper.php new file mode 100644 index 00000000..2d20770e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/NinjaFormsHelper.php @@ -0,0 +1,182 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\NinjaForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\NinjaForms; + +/** + * Ninja Forms Helper + * + * @version 1.3.0 + * @since 1.3.0 + */ +class NinjaFormsHelper { + /** + * Get source ID from submission data. + * + * @param array $data Submission data. + * @return string|int + */ + public static function get_source_id_from_submission_data( $data ) { + /** + * Ninja Forms form submissions are only saved if a save action has been set. + * Only in this case a form submission ID is available. + */ + if ( isset( $data['actions']['save']['sub_id'] ) ) { + return $data['actions']['save']['sub_id']; + } + + return \time(); + } + + /** + * Get Collect Payment action settings. + * + * @param int|string $form_id Form ID. + * @return array|null + */ + public static function get_collect_payment_action_settings( $form_id ) { + $actions = \Ninja_Forms()->form( $form_id )->get_actions(); + + foreach ( $actions as $action ) { + $action_settings = $action->get_settings(); + + // Check Collect Payment action. + if ( 'collectpayment' !== $action_settings['type'] ) { + continue; + } + + // Check gateway. + if ( 'pronamic_pay' !== $action_settings['payment_gateways'] ) { + continue; + } + + return $action_settings; + } + + return null; + } + + /** + * Get config ID from action settings or use default config. + * + * @param array $action_settings Action settings. + * @return string + */ + public static function get_config_id_from_action_settings( $action_settings ) { + $config_id = $action_settings['pronamic_pay_config_id']; + + if ( empty( $config_id ) ) { + $config_id = \get_option( 'pronamic_pay_config_id' ); + } + + return $config_id; + } + + /** + * Get description from action settings. + * + * @param array $action_settings Action settings. + * @return string + */ + public static function get_description_from_action_settings( $action_settings ) { + return $action_settings['pronamic_pay_description']; + } + + /** + * Get currency from form. + * + * @param int $form_id Form ID. + * @return string + */ + public static function get_currency_from_form_id( $form_id ) { + $form = \Ninja_Forms()->form( $form_id )->get(); + + $currency = $form->get_setting( 'currency' ); + + if ( ! empty( $currency ) ) { + // Return currency from form settings. + return $currency; + } + + // Return currency from Ninja Forms settings. + return \Ninja_Forms()->get_setting( 'currency' ); + } + + /** + * Get payment method from submission data. + * + * @param array $data Form submission data. + * @return string|null + */ + public function get_payment_method_from_submission_data( $data ) { + $payment_method = null; + + // Get payment method from a payment method field if it exists. + foreach ( $data['fields'] as $field ) { + if ( 'pronamic_pay_payment_method' !== $field['type'] ) { + continue; + } + + $value = $field['value']; + + if ( ! empty( $value ) ) { + $payment_method = $value; + + break; + } + } + + return $payment_method; + } + + /** + * Get issuer from submission data. + * + * @param array $data Submission data. + * @return string|null + */ + public static function get_issuer_from_submission_data( $data ) { + $issuer = null; + + // Get issuer from an issuers field if it exists. + foreach ( $data['fields'] as $field ) { + if ( 'pronamic_pay_issuer' !== $field['type'] ) { + continue; + } + + $issuer = $field['value']; + + break; + } + + return $issuer; + } + + /** + * Get page link from action settings. + * + * @param array $action_settings Action settings. + * @param string $key Setting key. + * @return string|null + */ + public static function get_page_link_from_action_settings( $action_settings, $key ) { + if ( ! \array_key_exists( $key, $action_settings ) ) { + return null; + } + + $page_id = $action_settings[ $key ]; + + if ( 'publish' !== get_post_status( $page_id ) ) { + return null; + } + + return \get_permalink( $page_id ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php new file mode 100644 index 00000000..246f52f9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/PaymentGateway.php @@ -0,0 +1,224 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\NinjaForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\NinjaForms; + +use NF_Abstracts_PaymentGateway; +use Pronamic\WordPress\Money\Currency; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Payment gateway + * + * @version 1.3.0 + * @since 1.0.0 + */ +final class PaymentGateway extends NF_Abstracts_PaymentGateway { + /** + * Slug. + * + * @var string + */ + protected $_slug = 'pronamic_pay'; + + /** + * Name. + * + * @var string + */ + protected $_name = ''; + + /** + * Settings. + * + * @var array + */ + protected $_settings = array(); + + /** + * Constructor for the payment gateway. + */ + public function __construct() { + $this->_name = __( 'Pronamic Pay', 'pronamic_ideal' ); + + $this->_settings = $this->action_settings(); + } + + /** + * Processing form. + * + * @param array $action_settings Action settings. + * @param string $form_id Form id. + * @param array $data Form data. + * @return array|bool + */ + public function process( $action_settings, $form_id, $data ) { + // Gateway. + $config_id = NinjaFormsHelper::get_config_id_from_action_settings( $action_settings ); + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return false; + } + + /** + * Build payment. + */ + $payment = new Payment(); + + $payment->source = 'ninja-forms'; + $payment->source_id = NinjaFormsHelper::get_source_id_from_submission_data( $data ); + $payment->order_id = $payment->source_id; + + $payment->description = NinjaFormsHelper::get_description_from_action_settings( $action_settings ); + + if ( empty( $payment->description ) ) { + $payment->description = sprintf( + '%s #%s', + __( 'Submission', 'pronamic_ideal' ), + $payment->source_id + ); + } + + $payment->title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + $payment->description + ); + + // Currency. + $currency = Currency::get_instance( NinjaFormsHelper::get_currency_from_form_id( $form_id ) ); + + // Amount. + $payment->set_total_amount( new TaxedMoney( $action_settings['payment_total'], $currency ) ); + + // Method. + $payment->method = NinjaFormsHelper::get_payment_method_from_submission_data( $data ); + + // Issuer. + $payment->issuer = NinjaFormsHelper::get_issuer_from_submission_data( $data ); + + // Configuration. + $payment->config_id = $config_id; + + // Set default payment method if necessary. + if ( empty( $payment->method ) && ( null !== $payment->issuer || $gateway->payment_method_is_required() ) ) { + $payment->method = PaymentMethods::IDEAL; + } + + // Only start payments for known/active payment methods. + if ( is_string( $payment->method ) && ! PaymentMethods::is_active( $payment->method ) ) { + return false; + } + + try { + $payment = Plugin::start_payment( $payment ); + + // Save form and action ID in payment meta for use in redirect URL. + $payment->set_meta( 'ninjaforms_payment_action_id', $action_settings['id'] ); + $payment->set_meta( 'ninjaforms_payment_form_id', $form_id ); + + $data['actions']['redirect'] = $payment->get_pay_redirect_url(); + } catch ( \Exception $e ) { + $message = sprintf( '%1$s: %2$s', $e->getCode(), $e->getMessage() ); + + $data['errors']['form']['pronamic-pay'] = Plugin::get_default_error_message(); + $data['errors']['form']['pronamic-pay-gateway'] = esc_html( $message ); + } + + return $data; + } + + /** + * Action settings. + * + * @return array + */ + public function action_settings() { + $settings = array(); + + // Configuration. + $settings['config_id'] = array( + 'label' => __( 'Configuration', 'pronamic_ideal' ), + 'name' => 'pronamic_pay_config_id', + 'group' => 'pronamic_pay', + 'type' => 'select', + 'width' => 'full', + 'options' => array(), + ); + + foreach ( Plugin::get_config_select_options() as $value => $label ) { + $settings['config_id']['options'][] = array( + 'label' => $label, + 'value' => $value, + ); + } + + // Description. + $settings['description'] = array( + 'name' => 'pronamic_pay_description', + 'type' => 'textbox', + 'group' => 'pronamic_pay', + 'label' => __( 'Transaction Description', 'pronamic_ideal' ), + 'placeholder' => '', + 'value' => '', + 'width' => 'full', + 'use_merge_tags' => array( + 'include' => array( + 'calcs', + ), + ), + ); + + /* + * Status pages. + */ + $settings['pronamic_pay_status_pages'] = array( + 'name' => 'pronamic_pay_status_pages', + 'type' => 'fieldset', + 'label' => __( 'Payment Status Pages', 'pronamic_ideal' ), + 'width' => 'full', + 'group' => 'pronamic_pay', + 'settings' => array(), + ); + + $options = array( + array( + 'label' => __( '— Select —', 'pronamic_ideal' ), + ), + ); + + foreach ( \get_pages() as $page ) { + $options[] = array( + 'label' => $page->post_title, + 'value' => $page->ID, + ); + } + + // Add settings fields. + foreach ( \pronamic_pay_plugin()->get_pages() as $id => $label ) { + $settings['pronamic_pay_status_pages']['settings'][] = array( + 'name' => $id, + 'type' => 'select', + 'group' => 'pronamic_pay', + 'label' => $label, + 'placeholder' => '', + 'value' => '', + 'width' => 'full', + 'options' => $options, + ); + } + + return $settings; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php new file mode 100644 index 00000000..ab4feec3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/ninjaforms/src/PaymentMethodsField.php @@ -0,0 +1,176 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\NinjaForms + */ + +namespace Pronamic\WordPress\Pay\Extensions\NinjaForms; + +use NF_Abstracts_List; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Payment methods field + * + * @version 1.0.1 + * @since 1.0.0 + */ +class PaymentMethodsField extends NF_Abstracts_List { + + /** + * Name. + * + * @var string + */ + protected $_name = 'pronamic_pay_payment_method'; + + /** + * Type. + * + * @var string + */ + protected $_type = 'pronamic_pay_payment_method'; + + /** + * Nice name for display. + * + * @var string + */ + protected $_nicename = 'Payment Methods'; + + /** + * Section. + * + * @var string + */ + protected $_section = 'pronamic_pay'; + + /** + * Icon. + * + * @var string + */ + protected $_icon = 'credit-card'; + + /** + * Template. + * + * @var string + */ + protected $_templates = 'listselect'; + + /** + * Old classname for earlier versions. + * + * @var string + */ + protected $_old_classname = 'list-select'; + + /** + * Settings. + * + * @var array + */ + protected $_settings = array(); + + /** + * Constructs and initializes the field object. + */ + public function __construct() { + parent::__construct(); + + // Set field properties. + $this->_nicename = __( 'Payment Methods', 'pronamic_ideal' ); + + $this->_settings['options']['value'] = $this->get_pronamic_payment_method_options(); + + add_filter( 'ninja_forms_render_options_' . $this->_type, array( $this, 'render_options' ) ); + + // Remove calc field for options. + unset( $this->_settings['options']['columns']['calc'] ); + unset( $this->_settings['options']['columns']['selected'] ); + } + + /** + * Get default Pronamic payment method options. + * + * @return array + */ + private function get_pronamic_payment_method_options() { + $options = array(); + + $order = 0; + + // Get gateway payment method options. + $payment_methods = $this->get_pronamic_gateway_payment_methods(); + + foreach ( $payment_methods as $value => $label ) { + $options[] = array( + 'label' => $label, + 'value' => $value, + 'calc' => '', + 'selected' => 1, + 'order' => $order, + ); + + $order++; + } + + return $options; + } + + /** + * Render options. + * + * @param array $options Options. + * + * @return array + */ + public function render_options( $options ) { + foreach ( $options as &$option ) { + if ( 0 === $option['value'] ) { + $option['value'] = ''; + } + } + + return $options; + } + + /** + * Get gateway available payment methods. + * + * @return array + */ + private function get_pronamic_gateway_payment_methods() { + $payment_methods = array(); + + $form_id = \filter_input( \INPUT_GET, 'form_id', \FILTER_SANITIZE_NUMBER_INT ); + + $action_settings = NinjaFormsHelper::get_collect_payment_action_settings( $form_id ); + + $config_id = NinjaFormsHelper::get_config_id_from_action_settings( $action_settings ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway ) { + return $payment_methods; + } + + $payment_methods = $gateway->get_payment_method_field_options(); + + if ( empty( $payment_methods ) ) { + $active_methods = PaymentMethods::get_active_payment_methods(); + + foreach ( $active_methods as $payment_method ) { + $payment_methods[ $payment_method ] = PaymentMethods::get_name( $payment_method ); + } + } + + return $payment_methods; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/pronamic-pay-rcp.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/pronamic-pay-rcp.php new file mode 100644 index 00000000..02abf153 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/pronamic-pay-rcp.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +add_filter( + 'pronamic_pay_plugin_integrations', + function( $integrations ) { + $integrations[] = new \Pronamic\WordPress\Pay\Extensions\RestrictContentPro\Extension(); + + return $integrations; + } +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BancontactGateway.php new file mode 100644 index 00000000..a1889fb5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BancontactGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Bancontact gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class BancontactGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_bancontact'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::BANCONTACT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BankTransferGateway.php new file mode 100644 index 00000000..a0e8f026 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BankTransferGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Bank Transfer gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class BankTransferGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_bank_transfer'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::BANK_TRANSFER; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BitcoinGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BitcoinGateway.php new file mode 100644 index 00000000..4dd138a1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/BitcoinGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Bitcoin gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class BitcoinGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_bitcoin'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::BITCOIN; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/CreditCardGateway.php new file mode 100644 index 00000000..0e1ce04d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/CreditCardGateway.php @@ -0,0 +1,62 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Credit Card gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class CreditCardGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_credit_card'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::CREDIT_CARD; + + /** + * Construct and initialize Credit Card gateway. + */ + public function init() { + global $rcp_options; + + parent::init(); + + // Recurring subscription payments. + $config_option = $this->id . '_config_id'; + + if ( ! isset( $rcp_options[ $config_option ] ) ) { + return; + } + + $gateway = Plugin::get_gateway( $rcp_options[ $config_option ] ); + + if ( $gateway && $gateway->supports( 'recurring_credit_card' ) ) { + $this->supports = array( + 'recurring', + 'trial', + ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitBancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitBancontactGateway.php new file mode 100644 index 00000000..4d0527f1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitBancontactGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Direct Debit (mandate via Bancontact) gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class DirectDebitBancontactGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_direct_debit_bancontact'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT_BANCONTACT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitGateway.php new file mode 100644 index 00000000..1ca7868e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Direct Debit gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class DirectDebitGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_direct_debit'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitIDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitIDealGateway.php new file mode 100644 index 00000000..92c088e8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitIDealGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Direct Debit (mandate via iDEAL) gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class DirectDebitIDealGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_direct_debit_ideal'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT_IDEAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitSofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitSofortGateway.php new file mode 100644 index 00000000..5879402e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/DirectDebitSofortGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Direct Debit (mandate via Sofort) gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.1 + */ +class DirectDebitSofortGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_direct_debit_sofort'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::DIRECT_DEBIT_SOFORT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php new file mode 100644 index 00000000..0a43b9a5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Extension.php @@ -0,0 +1,917 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_PaymentStatus; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; +use RCP_Member; +use RCP_Payments; +use WP_Query; + +/** + * Extension + * + * @author Reüel van der Steege + * @version 2.2.2 + * @since 1.0.0 + */ +class Extension extends AbstractPluginIntegration { + /** + * Construct Restrict Content Pro plugin integration. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args['name'] = __( 'Restrict Content Pro', 'pronamic_ideal' ); + + parent::__construct( $args ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new RestrictContentProDependency() ); + + // Upgrades. + $upgrades = $this->get_upgrades(); + + $upgrades->add( new Upgrade216() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_description', array( $this, 'payment_source_description' ), 10, 2 ); + add_filter( 'pronamic_payment_source_url', array( $this, 'payment_source_url' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_description', array( $this, 'subscription_source_description' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_url', array( $this, 'subscription_source_url' ), 10, 2 ); + + /* + * The Restrict Content Pro plugin gets bootstrapped with priority `4`. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/restrict-content-pro.php#L119 + */ + add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ), 5 ); + } + + /** + * Plugins loaded. + */ + public function plugins_loaded() { + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + /** + * On admin initialize we mark the upgrades as executable. This needs to run before + * the `wp-pay/core` admin init install routine (priority 5). + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.2.3/includes/class-restrict-content-pro.php#L199-215 + * @link https://github.com/wp-pay/core/blob/2.2.0/src/Admin/Install.php#L65 + */ + add_action( 'admin_init', array( $this, 'admin_init_upgrades_executable' ), 4 ); + + add_filter( 'rcp_payment_gateways', array( $this, 'register_pronamic_gateways' ) ); + add_action( 'rcp_payments_settings', array( $this, 'payments_settings' ) ); + add_action( 'rcp_transition_membership_status', array( $this, 'rcp_transition_membership_status' ), 10, 3 ); + + add_filter( 'rcp_membership_can_cancel', array( $this, 'rcp_membership_can_cancel' ), 10, 3 ); + add_filter( 'rcp_membership_payment_profile_cancelled', array( $this, 'rcp_membership_payment_profile_cancelled' ), 10, 5 ); + + add_action( 'pronamic_payment_status_update_rcp_payment', array( $this, 'payment_status_update' ), 10, 1 ); + add_filter( 'pronamic_payment_redirect_url', array( $this, 'payment_redirect_url' ), 10, 2 ); + add_filter( 'pronamic_payment_source_text_rcp_payment', array( $this, 'payment_source_text' ), 10, 2 ); + + add_filter( 'pronamic_subscription_source_text_rcp_membership', array( $this, 'subscription_source_text' ), 10, 2 ); + + add_action( 'pronamic_pay_new_payment', array( $this, 'new_payment' ) ); + add_action( 'pronamic_pay_update_payment', array( $this, 'update_payment' ) ); + + add_action( 'rcp_edit_membership_after', array( $this, 'rcp_edit_membership_after' ) ); + add_action( 'rcp_edit_payment_after', array( $this, 'rcp_edit_payment_after' ) ); + + /** + * Filter the subscription next payment delivery date. + * + * Priority is set to 9 so payment gateways can override with priority 10. + * + * @link https://github.com/wp-pay-gateways/mollie/blob/2.1.4/src/Integration.php#L272-L344 + */ + \add_filter( 'pronamic_pay_subscription_next_payment_delivery_date', array( $this, 'next_payment_delivery_date' ), 9, 2 ); + } + + /** + * Are upgrades executable. + * + * @return boolean True if upgrades are executable, false otherwise. + * @throws \Exception When this function is called outside the WordPress admin environment. + */ + private function are_upgrades_executable() { + /** + * This function can only run in the admin. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.2.3/includes/class-restrict-content-pro.php#L199-215 + */ + if ( ! is_admin() ) { + throw new \Exception( 'Can not run `are_upgrades_executable` function outside the WordPress admin environment.' ); + } + + /** + * Check if upgrade needed. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.2.3/includes/admin/upgrades.php#L11-39 + * @link https://basecamp.com/1810084/projects/10966871/todos/404760254 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.2.3/includes/class-restrict-content-pro.php#L199-215 + */ + if ( \rcp_check_if_upgrade_needed() ) { + return false; + } + + /** + * Check for incomplete jobs. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.2.3/includes/batch/batch-functions.php#L254-277 + */ + $queue = \RCP\Utils\Batch\get_jobs( + array( + 'status' => 'incomplete', + ) + ); + + if ( ! empty( $queue ) ) { + return false; + } + + return true; + } + + /** + * Upgrades are only executable when no Restrict Content Pro upgrade is needed. + */ + public function admin_init_upgrades_executable() { + $this->get_upgrades()->set_executable( $this->are_upgrades_executable() ); + } + + /** + * Register Pronamic gateways. + * + * @param array $gateways Gateways. + * @return array + */ + public function register_pronamic_gateways( $gateways ) { + return array_merge( $gateways, $this->get_gateways() ); + } + + /** + * Get gateway data. + * + * @param string $label Label. + * @param string $class Class. + * @return array + */ + private function get_gateway_data( $label, $class ) { + $gateway = new $class(); + + return array( + 'label' => $gateway->get_label(), + 'admin_label' => sprintf( + '%s - %s', + __( 'Pronamic', 'pronamic_ideal' ), + $label + ), + 'class' => $class, + ); + } + + /** + * Get Pronamic gateways. + * + * @return array + */ + private function get_gateways() { + return array( + 'pronamic_pay' => $this->get_gateway_data( __( 'Pay', 'pronamic_ideal' ), Gateway::class ), + 'pronamic_pay_bancontact' => $this->get_gateway_data( __( 'Bancontact', 'pronamic_ideal' ), BancontactGateway::class ), + 'pronamic_pay_banktransfer' => $this->get_gateway_data( __( 'Bank Transfer', 'pronamic_ideal' ), BankTransferGateway::class ), + 'pronamic_pay_bitcoin' => $this->get_gateway_data( __( 'Bitcoin', 'pronamic_ideal' ), BitcoinGateway::class ), + 'pronamic_pay_credit_card' => $this->get_gateway_data( __( 'Credit Card', 'pronamic_ideal' ), CreditCardGateway::class ), + 'pronamic_pay_direct_debit' => $this->get_gateway_data( __( 'Direct Debit', 'pronamic_ideal' ), DirectDebitGateway::class ), + 'pronamic_pay_direct_debit_bancontact' => $this->get_gateway_data( + sprintf( + /* translators: %s: payment method */ + __( 'Direct Debit (mandate via %s)', 'pronamic_ideal' ), + __( 'Bancontact', 'pronamic_ideal' ) + ), + DirectDebitBancontactGateway::class + ), + 'pronamic_pay_direct_debit_ideal' => $this->get_gateway_data( + sprintf( + /* translators: %s: payment method */ + __( 'Direct Debit (mandate via %s)', 'pronamic_ideal' ), + __( 'iDEAL', 'pronamic_ideal' ) + ), + DirectDebitIDealGateway::class + ), + 'pronamic_pay_direct_debit_sofort' => $this->get_gateway_data( + sprintf( + /* translators: %s: payment method */ + __( 'Direct Debit (mandate via %s)', 'pronamic_ideal' ), + __( 'SOFORT', 'pronamic_ideal' ) + ), + DirectDebitSofortGateway::class + ), + 'pronamic_pay_ideal' => $this->get_gateway_data( __( 'iDEAL', 'pronamic_ideal' ), IDealGateway::class ), + 'pronamic_pay_paypal' => $this->get_gateway_data( __( 'PayPal', 'pronamic_ideal' ), PayPalGateway::class ), + 'pronamic_pay_sofort' => $this->get_gateway_data( __( 'SOFORT', 'pronamic_ideal' ), SofortGateway::class ), + ); + } + + /** + * Payment settings. + * + * @param array $rcp_options Restrict Content Pro options. + */ + public function payments_settings( $rcp_options ) { + foreach ( $this->get_gateways() as $data ) { + $gateway = new $data['class'](); + + $gateway->payments_settings( $rcp_options ); + } + } + + /** + * Payment redirect URL filter. + * + * @param string $url URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function payment_redirect_url( $url, $payment ) { + if ( 'rcp_payment' !== $payment->source ) { + return $url; + } + + if ( Core_PaymentStatus::SUCCESS !== $payment->get_status() ) { + return $url; + } + + // Return success page URL. + return rcp_get_return_url( $payment->get_customer()->get_user_id() ); + } + + /** + * Update the status of the specified payment. + * + * @param Payment $payment Payment. + */ + public function payment_status_update( Payment $payment ) { + /** + * Find the related Restrict Content Pro payment. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/class-rcp-payments.php#L309-334 + */ + $rcp_payments = new RCP_Payments(); + + $rcp_payment_id = $payment->get_source_id(); + + $rcp_payment = $rcp_payments->get_payment( $rcp_payment_id ); + + if ( is_null( $rcp_payment ) ) { + return; + } + + // Only update if order is not completed. + if ( PaymentStatus::COMPLETE === $rcp_payment->status ) { + return; + } + + $core_status = $payment->get_status(); + + $rcp_payment_data = array( + 'status' => PaymentStatus::from_core( $core_status ), + ); + + switch ( $core_status ) { + case Core_PaymentStatus::CANCELLED: + case Core_PaymentStatus::EXPIRED: + case Core_PaymentStatus::FAILURE: + $rcp_payments->update( $rcp_payment_id, $rcp_payment_data ); + + /** + * Find and cancel the Restrict Content Pro membership. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/memberships/membership-functions.php#L15-29 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/class-rcp-payments.php#L75 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/memberships/class-rcp-membership.php#L1700-1808 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/gateways/class-rcp-payment-gateway-paypal.php#L466 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/gateways/class-rcp-payment-gateway-paypal.php#L570-571 + */ + $rcp_membership = rcp_get_membership( $rcp_payment->membership_id ); + + $should_expire = false !== $rcp_membership; + + // Do not expire membership if first payment expires and subscription is active, + // because a newer completed payment activated the subscription. + $subscription = $payment->get_subscription(); + + if ( Core_PaymentStatus::EXPIRED === $core_status && null !== $subscription ) { + $first_payment = $subscription->get_first_payment(); + + if ( $first_payment->get_id() === $payment->get_id() && SubscriptionStatus::ACTIVE === $subscription->get_status() ) { + $should_expire = false; + } + } + + if ( $should_expire ) { + // Set expiration date to yesterday. + $rcp_membership->expire(); + + // Set status to `pending` to prevent access to restricted content. + $rcp_membership->set_status( 'pending' ); + } + + break; + case Core_PaymentStatus::SUCCESS: + $rcp_payments->update( $rcp_payment_id, $rcp_payment_data ); + + // Renew membership if not active. + $rcp_membership = rcp_get_membership( $rcp_payment->membership_id ); + + if ( MembershipStatus::ACTIVE !== $rcp_membership->get_status() ) { + $expiration = ''; + + $end_date = $payment->get_end_date(); + + if ( null !== $end_date ) { + $expiration = $end_date->format( DateTime::MYSQL ); + } + + $rcp_membership->renew( true, 'active', $expiration ); + } + + break; + case Core_PaymentStatus::OPEN: + // Nothing to do? + break; + } + } + + /** + * Restrict Content Pro transition membership status. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/master/includes/memberships/class-rcp-membership.php#L673-683 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/master/includes/database/engine/class-query.php#L2061-2070 + * + * @param string $old_status Old membership status. + * @param string $new_status New membership status. + * @param int $membership_id ID of the membership. + */ + public function rcp_transition_membership_status( $old_status, $new_status, $membership_id ) { + $query = new WP_Query( + array( + 'post_type' => 'pronamic_pay_subscr', + 'post_status' => 'any', + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_source', + 'value' => 'rcp_membership', + ), + array( + 'key' => '_pronamic_subscription_source_id', + 'value' => $membership_id, + ), + ), + 'nopaging' => true, + 'no_found_rows' => true, + 'order' => 'DESC', + 'orderby' => 'ID', + ) + ); + + if ( ! $query->have_posts() ) { + return; + } + + $core_status = MembershipStatus::to_core_subscription_status( $new_status ); + + $note = null; + + switch ( $new_status ) { + case MembershipStatus::ACTIVE: + $note = sprintf( + /* translators: %s: Restrict Content Pro */ + __( 'Subscription activated by %s.', 'pronamic_ideal' ), + __( 'Restrict Content Pro', 'pronamic_ideal' ) + ); + + break; + case MembershipStatus::CANCELLED: + $note = sprintf( + /* translators: %s: Restrict Content Pro */ + __( 'Subscription canceled by %s.', 'pronamic_ideal' ), + __( 'Restrict Content Pro', 'pronamic_ideal' ) + ); + + break; + case MembershipStatus::PENDING: + $note = sprintf( + /* translators: %s: Restrict Content Pro */ + __( 'Subscription pending by %s.', 'pronamic_ideal' ), + __( 'Restrict Content Pro', 'pronamic_ideal' ) + ); + + break; + } + + if ( is_null( $core_status ) ) { + return; + } + + while ( $query->have_posts() ) { + $query->the_post(); + + // Get subscription. + $subscription = get_pronamic_subscription( get_the_ID() ); + + if ( null === $subscription ) { + continue; + } + + // Set subscription status. + $subscription->set_status( $core_status ); + + // Add note. + $subscription->add_note( $note ); + + $subscription->save(); + } + + wp_reset_postdata(); + } + + /** + * Restrict Content Pro membership can cancel. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/memberships/class-rcp-membership.php#L2239-2248 + * + * @param bool $can_cancel Whether or not this membership can be cancelled. + * @param int $membership_id ID of the membership. + * @param \RCP_Membership $membership Membership object. + * + * @return bool + */ + public function rcp_membership_can_cancel( $can_cancel, $membership_id, $membership ) { + $gateways = $this->get_gateways(); + + if ( ! array_key_exists( $membership->get_gateway(), $gateways ) ) { + return $can_cancel; + } + + if ( ! $membership->is_recurring() ) { + return $can_cancel; + } + + if ( MembershipStatus::ACTIVE !== $membership->get_status() ) { + return $can_cancel; + } + + if ( ! $membership->is_paid() ) { + return $can_cancel; + } + + if ( $membership->is_expired() ) { + return $can_cancel; + } + + return true; + } + + /** + * Restrict Content Pro membership payment profile cancelled. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/memberships/class-rcp-membership.php#L2372-2385 + * + * @param true|WP_Error $success Whether or not the cancellation was successful. + * @param string $gateway Payment gateway for this membership. + * @param string $gateway_subscription_id Gateway subscription ID. + * @param int $membership_id ID of the membership. + * @param RCP_Membership $membership Membership object. + */ + public function rcp_membership_payment_profile_cancelled( $success, $gateway, $gateway_subscription_id, $membership_id, $membership ) { + $gateways = $this->get_gateways(); + + if ( ! array_key_exists( $gateway, $gateways ) ) { + return $success; + } + + return true; + } + + /** + * Source column + * + * @param string $text Text. + * @param Payment $payment Payment. + * + * @return string $text + */ + public function payment_source_text( $text, Payment $payment ) { + $text = __( 'Restrict Content Pro', 'pronamic_ideal' ) . '
    '; + + $source_url = add_query_arg( + array( + 'page' => 'rcp-payments', + 'payment_id' => $payment->source_id, + 'view' => 'edit-payment', + ), + admin_url( 'admin.php' ) + ); + + $text .= sprintf( + '%s', + esc_url( $source_url ), + /* translators: %s: payment number */ + sprintf( __( 'Payment %s', 'pronamic_ideal' ), $payment->source_id ) + ); + + return $text; + } + + /** + * Payment source description. + * + * @link https://github.com/wp-pay/core/blob/2.1.6/src/Payments/Payment.php#L659-L671 + * + * @param string $description Description. + * @param Payment $payment Payment. + * + * @return string + */ + public function payment_source_description( $description, Payment $payment ) { + switch ( $payment->source ) { + case 'rcp_payment': + return __( 'Restrict Content Pro Payment', 'pronamic_ideal' ); + default: + return $description; + } + } + + /** + * Payment source URL. + * + * @param string $url URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function payment_source_url( $url, Payment $payment ) { + switch ( $payment->source ) { + case 'rcp_payment': + return add_query_arg( + array( + 'page' => 'rcp-payments', + 'view' => 'edit-payment', + 'payment_id' => $payment->source_id, + ), + admin_url( 'admin.php' ) + ); + default: + return $url; + } + } + + /** + * Subscription source description. + * + * @link https://github.com/wp-pay/core/blob/2.1.6/src/Payments/Payment.php#L659-L671 + * + * @param string $description Description. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public function subscription_source_description( $description, Subscription $subscription ) { + switch ( $subscription->get_source() ) { + case 'rcp_membership': + return __( 'Restrict Content Pro Membership', 'pronamic_ideal' ); + default: + return $description; + } + } + + /** + * Subscription source text. + * + * @param string $text Text. + * @param Subscription $subscription Subscription. + * + * @return string $text + */ + public function subscription_source_text( $text, Subscription $subscription ) { + $text = __( 'Restrict Content Pro', 'pronamic_ideal' ) . '
    '; + + $source_url = add_query_arg( + array( + 'page' => 'rcp-members', + 'membership_id' => $subscription->get_source_id(), + 'view' => 'edit', + ), + admin_url( 'admin.php' ) + ); + + $text .= sprintf( + '%s', + esc_url( $source_url ), + /* translators: %s: source id */ + sprintf( __( 'Membership %s', 'pronamic_ideal' ), $subscription->get_source_id() ) + ); + + return $text; + } + + /** + * Subscription source URL. + * + * @param string $url URL. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public function subscription_source_url( $url, Subscription $subscription ) { + switch ( $subscription->get_source() ) { + case 'rcp_membership': + return add_query_arg( + array( + 'page' => 'rcp-members', + 'view' => 'edit', + 'membership_id' => $subscription->get_source_id(), + ), + admin_url( 'admin.php' ) + ); + default: + return $url; + } + } + + /** + * Get Restrict Content Pro mebership from payment. + * + * @param Payment $payment Pronamic Pay payment. + * @return \RCP_Membership|null + * @throws \Exception When Restrict Content Pro membership can not be found. + */ + private function get_rcp_membership_from_payment( Payment $payment ) { + if ( 'rcp_membership' !== $payment->source ) { + return null; + } + + $membership_id = $payment->source_id; + + /** + * Try to find the Restrict Content Pro membership from the + * payment source ID. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/memberships/membership-functions.php#L15-29 + */ + $rcp_membership = \rcp_get_membership( $membership_id ); + + if ( false === $rcp_membership ) { + throw new \Exception( + \sprintf( + 'Could not find Restrict Content Pro membership with ID: %s.', + $membership_id + ) + ); + } + + return $rcp_membership; + } + + /** + * This function is hooked into the `pronamic_pay_new_payment` routine. + * It will check if the new payment is created from a Restrict Content Pro + * membership. If that is the case it will create a new Restrict Content Pro + * payment. + * + * @link https://github.com/wp-pay/core/blob/2.1.6/src/Payments/PaymentsDataStoreCPT.php#L234 + * + * @param Payment $payment Payment. + * @throws \Exception When Restrict Content Pro returns unexpected value. + */ + public function new_payment( Payment $payment ) { + $rcp_membership = $this->get_rcp_membership_from_payment( $payment ); + + if ( null === $rcp_membership ) { + return; + } + + /** + * Insert Restrict Content Pro payment. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/class-rcp-payments.php#L55-191 + */ + $rcp_payments = new \RCP_Payments(); + + $result = $rcp_payments->insert( + array( + 'date' => $payment->get_date()->format( 'Y-m-d g:i:s' ), + 'payment_type' => '', + 'transaction_type' => 'renewal', + 'user_id' => $rcp_membership->get_customer()->get_user_id(), + 'customer_id' => $rcp_membership->get_customer_id(), + 'membership_id' => $rcp_membership->get_id(), + 'amount' => $payment->get_total_amount()->get_value(), + // Transaction ID can not be null therefor we use `strval` to cast `null` to an empty string. + 'transaction_id' => \strval( $payment->get_transaction_id() ), + 'subscription' => \rcp_get_subscription_name( $rcp_membership->get_object_id() ), + 'subscription_key' => $rcp_membership->get_subscription_key(), + 'object_type' => 'subscription', + 'object_id' => $rcp_membership->get_object_id(), + 'status' => PaymentStatus::from_core( $payment->get_status() ), + ) + ); + + if ( false === $result ) { + throw new \Exception( + \sprintf( + 'Could not create Restrict Content Pro payment for payment %s.', + $payment->get_id() + ) + ); + } + + // Renew membership. + $expiration = ''; + + $end_date = $payment->get_end_date(); + + if ( null !== $end_date ) { + $expiration = $end_date->format( DateTime::MYSQL ); + } + + $rcp_membership->renew( true, 'active', $expiration ); + + // Set source. + $rcp_payment_id = $result; + + $payment->source = 'rcp_payment'; + $payment->source_id = $rcp_payment_id; + + $payment->save(); + } + + /** + * Update payment. + * + * @param Payment $payment Payment. + * @throws \Exception When Restrict Content Pro returns unexpected value. + */ + public function update_payment( Payment $payment ) { + /** + * Check if the payment is connected to a Restrict Content Pro + * payment. + */ + if ( 'rcp_payment' !== $payment->source ) { + return; + } + + /** + * Update Restrict Content Pro payment. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/master/includes/class-rcp-payments.php#L219-284 + */ + $rcp_payments = new \RCP_Payments(); + + $result = $rcp_payments->update( + $payment->source_id, + array( + 'status' => PaymentStatus::from_core( $payment->get_status() ), + 'transaction_id' => \strval( $payment->get_transaction_id() ), + ) + ); + + if ( false === $result ) { + throw new \Exception( + \sprintf( + 'Could not update Restrict Content Pro payment for payment %s.', + $payment->get_id() + ) + ); + } + } + + /** + * Restrict Conent Pro edit membership after. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L285-294 + * + * @param RCP_Membership $membership Restrict Content Pro membership. + */ + public function rcp_edit_membership_after( $membership ) { + $query = new \WP_Query( + array( + 'post_type' => 'pronamic_pay_subscr', + 'post_status' => 'any', + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_source', + 'value' => 'rcp_membership', + ), + array( + 'key' => '_pronamic_subscription_source_id', + 'value' => $membership->get_id(), + ), + ), + 'nopaging' => true, + 'no_found_rows' => true, + 'order' => 'DESC', + 'orderby' => 'ID', + ) + ); + + include __DIR__ . '/../views/edit-membership.php'; + + \wp_reset_postdata(); + } + + /** + * Restrict Content Pro edit payment after. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L127 + * + * @param object $payment Restrict Content Pro payment. + */ + public function rcp_edit_payment_after( $payment ) { + $query = new \WP_Query( + array( + 'post_type' => 'pronamic_payment', + 'post_status' => 'any', + 'meta_query' => array( + array( + 'key' => '_pronamic_payment_source', + 'value' => 'rcp_payment', + ), + array( + 'key' => '_pronamic_payment_source_id', + 'value' => $payment->id, + ), + ), + 'nopaging' => true, + 'no_found_rows' => true, + 'order' => 'DESC', + 'orderby' => 'ID', + ) + ); + + include __DIR__ . '/../views/edit-payment.php'; + + \wp_reset_postdata(); + } + + /** + * Next payment delivery date. + * + * The Restrict Content Pro will check for expired memberships on a daily base: + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/includes/cron-functions.php#L29-31 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/includes/cron-functions.php#L47-106 + * + * To ensure that renewal payments are started on time, we set the next payment date 1 day earlier. + * + * Otherwise Restrict Content Pro will send an expiration email when the renewal payment was created too late: + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/includes/email-functions.php#L328-348 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/includes/email-functions.php#L207-242 + * + * @param \DateTime $next_payment_delivery_date Next payment delivery date. + * @param Subscription $subscription Subscription. + * @return \DateTime + */ + public function next_payment_delivery_date( \DateTime $next_payment_delivery_date, Subscription $subscription ) { + if ( 'rcp_membership' !== $subscription->source ) { + return $next_payment_delivery_date; + } + + $date = clone $next_payment_delivery_date; + + $date = $date->modify( '-1 day' ); + + return $date; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php new file mode 100644 index 00000000..956741de --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Gateway.php @@ -0,0 +1,295 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Admin\AdminModule; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; +use RCP_Member; +use RCP_Payment_Gateway; +use RCP_Payments; + +/** + * Gateway + * + * @author Reüel van der Steege + * @version 2.1.6 + * @since 1.0.0 + */ +class Gateway extends RCP_Payment_Gateway { + /** + * ID + * + * @var string + */ + protected $id = 'pronamic_pay'; + + /** + * Payment method + * + * @var string + */ + protected $payment_method; + + /** + * Admin label + * + * @var string + */ + protected $admin_label; + + /** + * Label + * + * @var string + */ + protected $label; + + /** + * Initialize. + */ + public function init() { + $this->label = $this->get_label(); + $this->admin_label = PaymentMethods::get_name( $this->payment_method, __( 'Pronamic', 'pronamic_ideal' ) ); + + if ( PaymentMethods::is_direct_debit_method( $this->payment_method ) ) { + $this->supports = array( + 'recurring', + 'trial', + ); + } + } + + /** + * Get the Pronamic configuration ID for this gateway. + * + * @global array $rcp_options Restrict Content Pro options. + * @return string + */ + private function get_pronamic_config_id() { + global $rcp_options; + + $key = $this->id . '_config_id'; + + if ( array_key_exists( $key, $rcp_options ) ) { + $config_id = $rcp_options[ $key ]; + } + + if ( empty( $config_id ) ) { + $config_id = get_option( 'pronamic_pay_config_id' ); + } + + return $config_id; + } + + /** + * Get label from settings, fallback to core payment method name. + * + * @return string|null + */ + public function get_label() { + global $rcp_options; + + $label = PaymentMethods::get_name( $this->payment_method, __( 'Pronamic', 'pronamic_ideal' ) ); + + // Check options. + if ( ! \is_array( $rcp_options ) ) { + return $label; + } + + // Get label from options. + $option = $this->id . '_label'; + + if ( \array_key_exists( $option, $rcp_options ) && ! empty( $rcp_options[ $option ] ) ) { + return (string) $rcp_options[ $option ]; + } + + return $label; + } + + /** + * Add the iDEAL configuration settings to the Restrict Content Pro payment gateways settings page. + * + * @link https://github.com/restrictcontentpro/restrict-content-pro/blob/2.2.8/includes/admin/settings/register-settings.php#L126 + * + * @param array $rcp_options Restrict Content Pro options. + */ + public function payments_settings( $rcp_options ) { + $config_option = $this->id . '_config_id'; + $label_option = $this->id . '_label'; + + ?> + + + + + + + + + + + + + + + +
    + %s', + esc_html( + sprintf( + /* translators: %s: admin label */ + __( '%s Settings', 'pronamic_ideal' ), + $this->admin_label + ) + ) + ); + + ?> +
    + + + label; + + if ( isset( $rcp_options[ $label_option ] ) ) { + $label = $rcp_options[ $label_option ]; + } + + ?> + + + +

    +
    + + + 'rcp_settings[' . esc_attr( $config_option ) . ']', + 'selected' => $this->get_pronamic_config_id(), + 'payment_method' => $this->payment_method, + ) + ); + + ?> + +

    +
    + + fields(); + } + + /** + * Fields. + * + * @return string + */ + public function fields() { + ob_start(); + + $gateway = Plugin::get_gateway( $this->get_pronamic_config_id() ); + + if ( $gateway ) { + $gateway->set_payment_method( $this->payment_method ); + + $input = $gateway->get_input_html(); + + if ( $input ) { + echo '

    '; + // phpcs:ignore WordPress.Security.EscapeOutput + echo $input; + echo '

    '; + } + } + + return ob_get_clean(); + } + + /** + * Process signup. + * + * @global RCP_Payments $rcp_payments_db Restrict Content Pro payments object. + */ + public function process_signup() { + global $rcp_payments_db; + + $config_id = $this->get_pronamic_config_id(); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( empty( $gateway ) ) { + do_action( 'rcp_registration_failed', $this ); + + wp_die( + esc_html( Plugin::get_default_error_message() ), + esc_html__( 'Payment Error', 'pronamic_ideal' ), + array( 'response' => '401' ) + ); + } + + $payment = Util::new_payment_from_rcp_gateway( $this ); + + $payment->config_id = $config_id; + $payment->method = $this->payment_method; + + try { + $payment = Plugin::start_payment( $payment, $gateway ); + } catch ( \Exception $e ) { + do_action( 'rcp_registration_failed', $this ); + + wp_die( + esc_html( + sprintf( + /* translators: %s: JSON encoded payment data */ + __( 'Payment creation failed before sending buyer to the payment provider. Error: %s', 'pronamic_ideal' ), + $e->getMessage() + ) + ), + esc_html__( 'Payment Error', 'pronamic_ideal' ), + array( 'response' => '401' ) + ); + } + + // Transaction ID. + $transaction_id = $payment->get_transaction_id(); + + if ( null !== $transaction_id ) { + $rcp_payments_db->update( + $this->payment->id, + array( + 'transaction_id' => $transaction_id, + ) + ); + } + + $gateway->redirect( $payment ); + + exit; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/IDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/IDealGateway.php new file mode 100644 index 00000000..6bd28bb8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/IDealGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * IDEAL gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class IDealGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_ideal'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::IDEAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/LengthUnit.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/LengthUnit.php new file mode 100644 index 00000000..67108cfa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/LengthUnit.php @@ -0,0 +1,64 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_PaymentStatus; + +/** + * Restrict Content Pro length unit + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class LengthUnit { + /** + * Day. + * + * @var string + */ + const DAY = 'day'; + + /** + * Month. + * + * @var string + */ + const MONTH = 'month'; + + /** + * Year. + * + * @var string + */ + const YEAR = 'year'; + + /** + * Convert a Restrict Content Pro length unit to WordPress payment core unit. + * + * @param string|null $length_unit Restrict Content Pro unit. + * @return string|null WordPress payment core unit. + */ + public static function to_core( $length_unit ) { + switch ( $length_unit ) { + case self::DAY: + return 'D'; + case self::MONTH: + return 'M'; + case self::YEAR: + return 'Y'; + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/MembershipStatus.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/MembershipStatus.php new file mode 100644 index 00000000..5fb7e243 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/MembershipStatus.php @@ -0,0 +1,87 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; + +/** + * Restrict Content Pro membership status + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L105-112 + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class MembershipStatus { + /** + * Membership status active. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L105-112 + * + * @var string + */ + const ACTIVE = 'active'; + + /** + * Membership status expired. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L105-112 + * + * @var string + */ + const EXPIRED = 'expired'; + + /** + * Membership status cancelled. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L105-112 + * + * @var string + */ + const CANCELLED = 'cancelled'; + + /** + * Membership status pending. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L105-112 + * + * @var string + */ + const PENDING = 'pending'; + + /** + * Convert a Restrict Content Pro membership status to a core subscription status. + * + * @link https://github.com/wp-pay/core/blob/2.1.6/src/Core/Statuses.php + * + * @param string|null $rcp_status Restrict Content Pro membership status. + * @return string|null Core subscription status. + */ + public static function to_core_subscription_status( $rcp_status ) { + switch ( $rcp_status ) { + case self::ACTIVE: + return SubscriptionStatus::ACTIVE; + case self::EXPIRED: + /** + * The expired subscription status will likely be removed + * from the WordPress pay library in the future. + */ + return null; + case self::CANCELLED: + return SubscriptionStatus::CANCELLED; + case self::PENDING: + return SubscriptionStatus::OPEN; + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/PayPalGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/PayPalGateway.php new file mode 100644 index 00000000..c39358b1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/PayPalGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * PayPal gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.1 + */ +class PayPalGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_paypal'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::PAYPAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/PaymentStatus.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/PaymentStatus.php new file mode 100644 index 00000000..85b33c45 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/PaymentStatus.php @@ -0,0 +1,94 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_PaymentStatus; + +/** + * Restrict Content Pro payment status + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class PaymentStatus { + /** + * Payment status pending. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @var string + */ + const PENDING = 'pending'; + + /** + * Payment status complete. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @var string + */ + const COMPLETE = 'complete'; + + /** + * Payment status failed. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @var string + */ + const FAILED = 'failed'; + + /** + * Payment status refunded. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @var string + */ + const REFUNDED = 'refunded'; + + /** + * Payment status abandoned. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L104-118 + * + * @var string + */ + const ABANDONED = 'abandoned'; + + /** + * Convert a core payment status to a Restrict Content Pro payment status. + * + * @link https://github.com/wp-pay/core/blob/2.1.6/src/Core/Statuses.php + * + * @param string|null $core_status Core payment status. + * @return string|null Restrict Content Pro payment status. + */ + public static function from_core( $core_status ) { + switch ( $core_status ) { + case Core_PaymentStatus::OPEN: + return self::PENDING; + case Core_PaymentStatus::CANCELLED: + return self::FAILED; + case Core_PaymentStatus::EXPIRED: + return self::ABANDONED; + case Core_PaymentStatus::FAILURE: + return self::FAILED; + case Core_PaymentStatus::SUCCESS: + return self::COMPLETE; + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/RestrictContentProDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/RestrictContentProDependency.php new file mode 100644 index 00000000..7f0b4001 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/RestrictContentProDependency.php @@ -0,0 +1,40 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +/** + * PHP Dependency + * + * @link https://github.com/Yoast/yoast-acf-analysis/blob/2.3.0/inc/dependencies/dependency-yoast-seo.php + * @link https://github.com/dsawardekar/wp-requirements/blob/0.3.0/lib/Requirements.php#L104-L118 + * @author Remco Tolsma + * @version 2.1.6 + * @since 2.1.6 + */ +class RestrictContentProDependency extends \Pronamic\WordPress\Pay\Dependencies\Dependency { + /** + * Is met. + * + * @link https://github.com/dsawardekar/wp-requirements/blob/0.3.0/lib/Requirements.php#L104-L118 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \defined( '\RCP_PLUGIN_VERSION' ) ) { + return false; + } + + return \version_compare( + \RCP_PLUGIN_VERSION, + '3.0.0', + '>=' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/SofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/SofortGateway.php new file mode 100644 index 00000000..44963dd4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/SofortGateway.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Sofort gateway + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class SofortGateway extends Gateway { + /** + * Gateway id. + * + * @var string + */ + protected $id = 'pronamic_pay_sofort'; + + /** + * Payment method. + * + * @var string + */ + protected $payment_method = PaymentMethods::SOFORT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php new file mode 100644 index 00000000..f2997be9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Upgrade216.php @@ -0,0 +1,527 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Upgrades + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; +use Pronamic\WordPress\Pay\Upgrades\Upgrade; + +/** + * Upgrade 2.1.6 + * + * @author Remco Tolsma + * @version 2.1.6 + * @since 2.1.6 + */ +class Upgrade216 extends Upgrade { + /** + * Construct 2.1.6 upgrade. + */ + public function __construct() { + parent::__construct( '2.1.6' ); + + if ( \defined( '\WP_CLI' ) && \WP_CLI ) { + $this->cli_init(); + } + } + + /** + * Execute. + * + * @return void + */ + public function execute() { + $this->upgrade_subscriptions(); + $this->upgrade_payments(); + } + + /** + * WP-CLI initialize. + * + * @link https://github.com/wp-cli/wp-cli/issues/4818 + * @return void + */ + public function cli_init() { + \WP_CLI::add_command( + 'pronamic-pay restrict-content-pro upgrade-216 execute', + function( $args, $assoc_args ) { + \WP_CLI::log( 'Upgrade 2.1.6' ); + + $this->execute(); + }, + array( + 'shortdesc' => 'Execute Restrict Content Pro upgrade 2.1.6.', + ) + ); + + \WP_CLI::add_command( + 'pronamic-pay restrict-content-pro upgrade-216 list-subscriptions', + function( $args, $assoc_args ) { + \WP_CLI::log( 'Upgrade 2.1.6 - Subscriptions List' ); + + $posts = $this->get_subscription_posts(); + + \WP_CLI\Utils\format_items( 'table', $posts, array( 'ID', 'post_title', 'post_status' ) ); + }, + array( + 'shortdesc' => 'Execute Restrict Content Pro upgrade 2.1.6.', + ) + ); + + \WP_CLI::add_command( + 'pronamic-pay restrict-content-pro upgrade-216 upgrade-subscriptions', + function( $args, $assoc_args ) { + \WP_CLI::log( 'Upgrade 2.1.6 - Subscriptions' ); + + $this->upgrade_subscriptions( + array( + 'skip-no-match' => \WP_CLI\Utils\get_flag_value( $assoc_args, 'skip-no-match', true ), + 'reactivate' => \WP_CLI\Utils\get_flag_value( $assoc_args, 'reactivate', true ), + 'dry-run' => \WP_CLI\Utils\get_flag_value( $assoc_args, 'dry-run', true ), + 'post__in' => \WP_CLI\Utils\get_flag_value( $assoc_args, 'post__in', null ), + ) + ); + }, + array( + 'shortdesc' => 'Execute Restrict Content Pro upgrade 2.1.6.', + ) + ); + + \WP_CLI::add_command( + 'pronamic-pay restrict-content-pro upgrade-216 list-payments', + function( $args, $assoc_args ) { + \WP_CLI::log( 'Upgrade 2.1.6 - Payments List' ); + + $posts = $this->get_payment_posts(); + + \WP_CLI\Utils\format_items( 'table', $posts, array( 'ID', 'post_title', 'post_status' ) ); + }, + array( + 'shortdesc' => 'Execute Restrict Content Pro upgrade 2.1.6.', + ) + ); + } + + /** + * Get subscription posts to upgrade. + * + * @param array $args Query arguments. + * @return array + */ + private function get_subscription_posts( $args = array() ) { + $args['post_type'] = 'pronamic_pay_subscr'; + $args['post_status'] = 'any'; + $args['nopaging'] = true; + $args['no_found_rows'] = true; + $args['order'] = 'DESC'; + $args['orderby'] = 'ID'; + $args['meta_query'] = array( + array( + 'key' => '_pronamic_subscription_source', + 'value' => 'restrictcontentpro', + ), + ); + + $query = new \WP_Query( $args ); + + return $query->posts; + } + + /** + * Get payment posts to upgrade. + * + * @return array + */ + private function get_payment_posts() { + $query = new \WP_Query( + array( + 'post_type' => 'pronamic_payment', + 'post_status' => 'any', + 'meta_query' => array( + array( + 'key' => '_pronamic_payment_source', + 'value' => 'restrictcontentpro', + ), + ), + 'nopaging' => true, + 'no_found_rows' => true, + 'order' => 'DESC', + 'orderby' => 'ID', + ) + ); + + return $query->posts; + } + + /** + * Log. + * + * @link https://make.wordpress.org/cli/handbook/internal-api/wp-cli-log/ + * @param string $message Message. + * @return void + */ + private function log( $message ) { + if ( method_exists( '\WP_CLI', 'log' ) ) { + \WP_CLI::log( $message ); + } + } + + /** + * Check if Restrict Content Pro membership customer is connected to the specified WordPress user ID. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.1/includes/memberships/class-rcp-membership.php#L376-391 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.1/includes/customers/class-rcp-customer.php#L198-207 + * @param \RCP_Membership|null $rcp_membership Restrict Content Pro membership. + * @param int $wp_user_id WordPress user ID. + * @return boolean True if Restrict Content Pro membership is for the specified WordPress user ID, false otherwise. + */ + private function is_rcp_membership_for_wp_user_id( $rcp_membership, $wp_user_id ) { + if ( null === $rcp_membership ) { + return false; + } + + $rcp_customer = $rcp_membership->get_customer(); + + $rcp_customer_user_id = null; + + if ( $rcp_customer instanceof \RCP_Customer ) { + $rcp_customer_user_id = \intval( $rcp_customer->get_user_id() ); + } + + return ( $wp_user_id === $rcp_customer_user_id ); + } + + /** + * Upgrade subscriptions. + * + * @param array $args Arguments. + */ + private function upgrade_subscriptions( $args = array() ) { + $args = \wp_parse_args( + $args, + array( + 'skip-no-match' => false, + 'reactivate' => false, + 'dry-run' => false, + 'post__in' => null, + ) + ); + + $skip_no_match = \filter_var( $args['skip-no-match'], FILTER_VALIDATE_BOOLEAN ); + $reactivate = \filter_var( $args['reactivate'], FILTER_VALIDATE_BOOLEAN ); + $dry_run = \filter_var( $args['dry-run'], FILTER_VALIDATE_BOOLEAN ); + + $query_args = array(); + + if ( null !== $args['post__in'] ) { + $query_args['post__in'] = \explode( ',', $args['post__in'] ); + } + + $subscription_posts = $this->get_subscription_posts( $query_args ); + + $this->log( + \sprintf( + 'Processing %d subscription posts…', + \number_format_i18n( \count( $subscription_posts ) ) + ) + ); + + foreach ( $subscription_posts as $subscription_post ) { + $subscription_post_id = $subscription_post->ID; + + $this->log( + \sprintf( + 'Subscription post %s', + $subscription_post_id + ) + ); + + /** + * Get subscription. + * + * @link https://github.com/wp-pay/core/blob/2.2.4/includes/functions.php#L158-L180 + */ + $subscription = \get_pronamic_subscription( $subscription_post_id ); + + if ( null === $subscription ) { + continue; + } + + $pronamic_subscription_post_author_id = \intval( get_post_field( 'post_author', $subscription_post_id ) ); + + /** + * Get source. + */ + $subscription_source = \get_post_meta( $subscription_post_id, '_pronamic_subscription_source', true ); + $subscription_source_id = \get_post_meta( $subscription_post_id, '_pronamic_subscription_source_id', true ); + + \update_post_meta( $subscription_post_id, '_pronamic_subscription_rcp_update_source', $subscription_source ); + \update_post_meta( $subscription_post_id, '_pronamic_subscription_rcp_update_source_id', $subscription_source_id ); + + /** + * We have to find a matching Restrict Content Pro memberships. + */ + $rcp_membership = null; + + /** + * In Restrict Content Pro versions before 3.0 we may have saved the Restrict Content Pro payment ID as source ID. + */ + if ( null === $rcp_membership ) { + $potential_rcp_payment_id = $subscription_source_id; + + $potential_rcp_membership = $this->get_rcp_membership_by_rcp_payment_id( $potential_rcp_payment_id ); + + if ( $this->is_rcp_membership_for_wp_user_id( $potential_rcp_membership, $pronamic_subscription_post_author_id ) ) { + $rcp_membership = $potential_rcp_membership; + + $this->log( + \sprintf( + '- Found Restrict Content Pro membership `%s` through potential Restrict Content Pro payment ID `%s`.', + $rcp_membership->get_id(), + $potential_rcp_payment_id + ) + ); + } + } + + /** + * In Restrict Content Pro versions before 3.0 we may have saved the WordPress user ID as source ID. + */ + if ( null === $rcp_membership ) { + $potential_wp_user_id = $subscription_source_id; + + $potential_rcp_membership = $this->get_rcp_membership_by_wp_user_id( $potential_wp_user_id ); + + if ( $this->is_rcp_membership_for_wp_user_id( $potential_rcp_membership, $pronamic_subscription_post_author_id ) ) { + $rcp_membership = $potential_rcp_membership; + + $this->log( + \sprintf( + '- Found Restrict Content Pro membership `%s` through potential WordPress user ID `%s`.', + $rcp_membership->get_id(), + $potential_wp_user_id + ) + ); + } + } + + /** + * No match. + */ + if ( null === $rcp_membership ) { + $this->log( '- No Restrict Content Pro membership found.' ); + + if ( false === $dry_run && false === $skip_no_match ) { + $subscription->set_status( SubscriptionStatus::ON_HOLD ); + + $subscription->add_note( + \sprintf( + /* translators: %s: Potential WordPress user ID. */ + __( 'Since Restrict Content Pro 3 a subscription must be linked to a Restrict Content Pro membership. Unfortunately, this subscription could not be linked to a Restrict Content Pro membership based on the source ID %s. That is why this subscription has been put on hold so that it can be corrected manually.', 'pronamic_ideal' ), + $subscription_source_id + ) + ); + + $subscription->save(); + } + + continue; + } + + /** + * Ok. + */ + $status = $args['status']; + + if ( false === $dry_run ) { + if ( true === $reactivate && SubscriptionStatus::ON_HOLD === $subscription->get_status() ) { + $subscription->set_status( SubscriptionStatus::ACTIVE ); + } + + $subscription->set_source( 'rcp_membership' ); + $subscription->set_source_id( $rcp_membership->get_id() ); + + $subscription->add_note( + \sprintf( + /* translators: 1: Old source, 2: Old source ID, 3: New source, 4: New source ID. */ + __( 'Since Restrict Content Pro 3 a subscription must be linked to a Restrict Content Pro membership. That\'s why source "%1$s" with ID "%2$s" was updated to source "%3$s" with ID "%4$s".', 'pronamic_ideal' ), + $subscription_source, + $subscription_source_id, + 'rcp_membership', + $rcp_membership->get_id() + ) + ); + + $subscription->save(); + } + } + } + + /** + * Upgrade payments. + */ + private function upgrade_payments() { + $payment_posts = $this->get_payment_posts(); + + foreach ( $payment_posts as $payment_post ) { + $payment_post_id = $payment_post->ID; + + /** + * Get payment. + * + * @link https://github.com/wp-pay/core/blob/2.2.4/includes/functions.php#L24-L46 + */ + $payment = \get_pronamic_payment( $payment_post_id ); + + if ( null === $payment ) { + continue; + } + + /** + * Get source. + */ + $payment_source = \get_post_meta( $payment_post_id, '_pronamic_payment_source', true ); + $payment_source_id = \get_post_meta( $payment_post_id, '_pronamic_payment_source_id', true ); + + \update_post_meta( $payment_post_id, '_pronamic_payment_rcp_update_source', $payment_source ); + \update_post_meta( $payment_post_id, '_pronamic_payment_rcp_update_source_id', $payment_source_id ); + + /** + * We have to find a matching Restrict Content Pro payment. + */ + $rcp_payment = null; + + /** + * In Restrict Content Pro versions before 3.0 we may have saved the Restrict Content Pro payment ID as source ID. + */ + if ( null === $rcp_payment ) { + $potential_rcp_payment_id = $payment_source_id; + + $rcp_payment = $this->get_rcp_payment_by_rcp_payment_id( $potential_rcp_payment_id ); + } + + /** + * No match, no problem. + */ + if ( null === $rcp_payment ) { + continue; + } + + /** + * Check if Restrict Content Pro payment user ID matches payment post author. + */ + $pronamic_payment_post_author_id = \intval( get_post_field( 'post_author', $payment_post_id ) ); + + $rcp_payment_user_id = \intval( $rcp_payment->user_id ); + + if ( $pronamic_payment_post_author_id !== $rcp_payment_user_id ) { + continue; + } + + /** + * Ok. + */ + $payment->set_source( 'rcp_payment' ); + $payment->set_source_id( $rcp_payment->id ); + + $payment->add_note( + \sprintf( + /* translators: 1: Old source, 2: Old source ID, 3: New source, 4: New source ID. */ + __( 'Since Restrict Content Pro 3 a payment must be linked to a Restrict Content Pro payment. That\'s why source "%1$s" with ID "%2$s" was updated to source "%3$s" with ID %4$s".', 'pronamic_ideal' ), + $payment_source, + $payment_source_id, + 'rcp_payment', + $rcp_payment->id + ) + ); + + $payment->save(); + } + } + + /** + * Get Restrict Content Pro payment by a Restrict Content Pro payment ID. + * + * @param int $rcp_payment_id Restrict Content Pro payment ID. + * @return object|null + */ + private function get_rcp_payment_by_rcp_payment_id( $rcp_payment_id ) { + $rcp_payments = new \RCP_Payments(); + + $rcp_payment = $rcp_payments->get_payment( $rcp_payment_id ); + + if ( null === $rcp_payment ) { + return null; + } + + return $rcp_payment; + } + + /** + * Get Restrict Content Pro membership by Restrict Content Pro payment ID. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.1/includes/class-rcp-payments.php + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.1/includes/database/engine/class-query.php#L1546-1564 + * @param int $rcp_payment_id Restrict Content Pro payment ID. + * @return \RCP_Membership|null + */ + private function get_rcp_membership_by_rcp_payment_id( $rcp_payment_id ) { + $rcp_payment = $this->get_rcp_payment_by_rcp_payment_id( $rcp_payment_id ); + + if ( null === $rcp_payment ) { + return null; + } + + $rcp_membership_id = \intval( $rcp_payment->membership_id ); + + if ( 0 !== $rcp_membership_id ) { + $rcp_membership = \rcp_get_membership( $rcp_membership_id ); + + if ( false !== $rcp_membership ) { + return $rcp_membership; + } + } + + $rcp_customer_id = \intval( $rcp_payment->customer_id ); + + if ( 0 !== $rcp_customer_id ) { + $rcp_membership = \rcp_get_customer_single_membership( $rcp_customer_id ); + + if ( false !== $rcp_membership ) { + return $rcp_membership; + } + } + + return null; + } + + /** + * Get Restrict Content Pro membership by WordPress user ID. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.1/includes/customers/customer-functions.php#L15-34 + * @param int $wp_user_id WordPress user ID. + * @return \RCP_Membership|null + */ + private function get_rcp_membership_by_wp_user_id( $wp_user_id ) { + $rcp_customer = \rcp_get_customer_by_user_id( $wp_user_id ); + + if ( false === $rcp_customer ) { + return null; + } + + $rcp_membership = \rcp_get_customer_single_membership( $rcp_customer->get_id() ); + + if ( false === $rcp_membership ) { + return null; + } + + return $rcp_membership; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Util.php new file mode 100644 index 00000000..93a7c528 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/src/Util.php @@ -0,0 +1,284 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + */ + +namespace Pronamic\WordPress\Pay\Extensions\RestrictContentPro; + +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentLines; +use Pronamic\WordPress\Pay\Payments\PaymentLineType; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionInterval; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPhase; +use RCP_Payment_Gateway; + +/** + * Util + * + * @author Reüel van der Steege + * @version 2.2.2 + * @since 1.0.0 + */ +class Util { + /** + * Create new payment from Restrict Content Pro gateway object. + * + * @link https://restrictcontentpro.com/tour/payment-gateways/add-your-own/ + * @link http://docs.pippinsplugins.com/article/812-payment-gateway-api + * @link https://github.com/wp-pay-extensions/woocommerce/blob/develop/src/Gateway.php + * + * @param RCP_Payment_Gateway $gateway Restrict Content Pro gateway object. + * @return Payment + */ + public static function new_payment_from_rcp_gateway( $gateway ) { + // Payment. + $payment = new Payment(); + + // Title. + $payment->title = sprintf( + /* translators: %s: Restrict Content Pro payment ID */ + __( 'Restrict Content Pro payment %s', 'pronamic_ideal' ), + $gateway->payment->id + ); + + // Description. + $payment->description = $gateway->subscription_name; + + // Source. + $payment->source = 'rcp_payment'; + $payment->source_id = $gateway->payment->id; + + // Issuer. + if ( array_key_exists( 'post_data', $gateway->subscription_data ) ) { + $post_data = $gateway->subscription_data['post_data']; + + if ( array_key_exists( 'pronamic_ideal_issuer_id', $post_data ) ) { + $payment->issuer = $post_data['pronamic_ideal_issuer_id']; + } + } + + // Customer. + $customer = self::new_customer_from_rcp_gateway( $gateway ); + + $payment->set_customer( $customer ); + + // Payment lines. + $payment->lines = self::new_payment_lines_from_rcp_gateway( $gateway ); + + // Subscription. + $subscription = self::new_subscription_from_rcp_gateway( $gateway ); + + $payment->subscription = $subscription; + + if ( null !== $subscription ) { + $payment->subscription_id = $subscription->get_id(); + + $payment->add_period( $subscription->new_period() ); + } + + // Total amount. + $amount = new TaxedMoney( $gateway->initial_amount, $gateway->currency ); + + $amount = $amount->add( new TaxedMoney( $gateway->payment->fees, $gateway->currency ) ); + + $payment->set_total_amount( $amount ); + + // Result. + return $payment; + } + + /** + * Create new customer from Restrict Content Pro gateway object. + * + * @link https://restrictcontentpro.com/tour/payment-gateways/add-your-own/ + * @link http://docs.pippinsplugins.com/article/812-payment-gateway-api + * @link https://github.com/wp-pay-extensions/woocommerce/blob/develop/src/Gateway.php + * + * @param RCP_Payment_Gateway $gateway Restrict Content Pro gateway object. + * @return Payment + */ + public static function new_customer_from_rcp_gateway( $gateway ) { + // Contact name. + $contact_name = new ContactName(); + + if ( array_key_exists( 'post_data', $gateway->subscription_data ) ) { + $post_data = $gateway->subscription_data['post_data']; + + if ( array_key_exists( 'rcp_user_first', $post_data ) ) { + $contact_name->set_first_name( $post_data['rcp_user_first'] ); + } + + if ( array_key_exists( 'rcp_user_last', $post_data ) ) { + $contact_name->set_last_name( $post_data['rcp_user_last'] ); + } + } + + // Customer. + $customer = new Customer(); + + $customer->set_name( $contact_name ); + $customer->set_email( $gateway->email ); + $customer->set_user_id( $gateway->user_id ); + + // Result. + return $customer; + } + + /** + * New payment lines from Restrict Content Pro gateway object. + * + * @link https://restrictcontentpro.com/tour/payment-gateways/add-your-own/ + * @link http://docs.pippinsplugins.com/article/812-payment-gateway-api + * @link https://github.com/wp-pay-extensions/woocommerce/blob/develop/src/Gateway.php + * + * @param RCP_Payment_Gateway $gateway Restrict Content Pro gateway object. + * @return PaymentLines + */ + public static function new_payment_lines_from_rcp_gateway( $gateway ) { + $lines = new PaymentLines(); + + // Membership. + $line = $lines->new_line(); + + $line->set_id( $gateway->subscription_id ); + $line->set_sku( null ); + $line->set_type( PaymentLineType::DIGITAL ); + $line->set_name( $gateway->subscription_name ); + $line->set_quantity( 1 ); + $line->set_unit_price( new TaxedMoney( $gateway->payment->subtotal, $gateway->currency ) ); + $line->set_total_amount( new TaxedMoney( $gateway->payment->subtotal, $gateway->currency ) ); + $line->set_product_url( null ); + $line->set_image_url( null ); + $line->set_product_category( null ); + + // Discount. + if ( $gateway->discount ) { + $line = $lines->new_line(); + + $line->set_id( null ); + $line->set_sku( null ); + $line->set_type( PaymentLineType::DISCOUNT ); + $line->set_name( + sprintf( + /* translators: %s: Restrict Content Pro discount code */ + __( 'Discount code `%s`', 'pronamic_ideal' ), + $gateway->discount_code + ) + ); + $line->set_quantity( 1 ); + $line->set_unit_price( new TaxedMoney( -$gateway->discount, $gateway->currency ) ); + $line->set_total_amount( new TaxedMoney( -$gateway->discount, $gateway->currency ) ); + $line->set_product_url( null ); + $line->set_image_url( null ); + $line->set_product_category( null ); + } + + // Fees. + if ( $gateway->payment->fees ) { + $line = $lines->new_line(); + + $line->set_id( null ); + $line->set_sku( null ); + $line->set_type( PaymentLineType::FEE ); + $line->set_name( __( 'Fees', 'pronamic_ideal' ) ); + $line->set_quantity( 1 ); + $line->set_unit_price( new TaxedMoney( $gateway->payment->fees, $gateway->currency ) ); + $line->set_total_amount( new TaxedMoney( $gateway->payment->fees, $gateway->currency ) ); + $line->set_product_url( null ); + $line->set_image_url( null ); + $line->set_product_category( null ); + } + + // Result. + return $lines; + } + + /** + * Create new subscription from Restrict Content Pro gateway object. + * + * @link https://restrictcontentpro.com/tour/payment-gateways/add-your-own/ + * @link http://docs.pippinsplugins.com/article/812-payment-gateway-api + * @link https://github.com/wp-pay-extensions/woocommerce/blob/develop/src/Gateway.php + * + * @param RCP_Payment_Gateway $gateway Restrict Content Pro gateway object. + * @return Subscription|null + */ + public static function new_subscription_from_rcp_gateway( $gateway ) { + if ( ! $gateway->auto_renew ) { + return null; + } + + if ( empty( $gateway->length ) ) { + return null; + } + + // Get existing subscription for membership. + $subscriptions = \get_pronamic_subscriptions_by_source( 'rcp_membership', $gateway->membership->get_id() ); + + $subscription = array_shift( $subscriptions ); + + if ( null === $subscription ) { + $subscription = new Subscription(); + } + + /** + * Maximum number of times to renew this membership. Default is `0` for unlimited. + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/includes/memberships/class-rcp-membership.php#L138-143 + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/-/blob/3.3.3/includes/memberships/class-rcp-membership.php#L1169-1178 + */ + $maximum_renewals = $gateway->membership->get_maximum_renewals(); + $maximum_renewals = \intval( $maximum_renewals ); + + // Initial phase. + $interval_spec = 'P' . \intval( $gateway->length ) . LengthUnit::to_core( $gateway->length_unit ); + + $trial_duration = $gateway->subscription_data['trial_duration']; + + if ( 0 !== \intval( $trial_duration ) ) { + $interval_spec = 'P' . $trial_duration . LengthUnit::to_core( $gateway->subscription_data['trial_duration_unit'] ); + } + + $initial_phase = new SubscriptionPhase( + $subscription, + new \DateTimeImmutable(), + new SubscriptionInterval( $interval_spec ), + new TaxedMoney( $gateway->initial_amount, $gateway->currency ) + ); + + $initial_phase->set_total_periods( 1 ); + + $regular_phase = new SubscriptionPhase( + $subscription, + $initial_phase->get_end_date(), + new SubscriptionInterval( 'P' . \intval( $gateway->length ) . LengthUnit::to_core( $gateway->length_unit ) ), + new TaxedMoney( $gateway->amount, $gateway->currency ) + ); + + if ( 0 !== $maximum_renewals ) { + $regular_phase->set_total_periods( $maximum_renewals ); + } + + // Add phases to subscription. + $subscription->add_phase( $initial_phase ); + $subscription->add_phase( $regular_phase ); + + // Other. + $subscription->description = $gateway->subscription_name; + + // Source. + $subscription->source = 'rcp_membership'; + $subscription->source_id = $gateway->membership->get_id(); + + return $subscription; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/views/edit-membership.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/views/edit-membership.php new file mode 100644 index 00000000..f8c65024 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/views/edit-membership.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/memberships/edit-membership.php#L285-294 + */ + +?> + + + + + + have_posts() ) { + while ( $query->have_posts() ) { + $query->the_post(); + + printf( + '%s', + esc_url( get_edit_post_link() ), + esc_html( get_the_ID() ) + ); + } + } + + ?> + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/views/edit-payment.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/views/edit-payment.php new file mode 100644 index 00000000..4ea4d4b4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/restrict-content-pro/views/edit-payment.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\RestrictContentPro + * + * @link https://gitlab.com/pronamic-plugins/restrict-content-pro/blob/3.0.10/includes/admin/payments/edit-payment.php#L127 + */ + +?> + + + + + + have_posts() ) { + while ( $query->have_posts() ) { + $query->the_post(); + + printf( + '%s', + esc_url( get_edit_post_link() ), + esc_html( get_the_ID() ) + ); + } + } + + ?> + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Extension.php new file mode 100644 index 00000000..e5b77280 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Extension.php @@ -0,0 +1,459 @@ + __( 's2Member', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new S2MemberDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_text_' . self::SLUG, array( $this, 'subscription_source_text' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_description_' . self::SLUG, array( $this, 'subscription_source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // Bridge classes. + new Settings(); + new Shortcodes(); + + $slug = 's2member'; + + add_action( 'pronamic_payment_status_update_' . $slug, array( __CLASS__, 'update_status' ), 10, 1 ); + add_action( 'pronamic_subscription_renewal_notice_' . self::SLUG, array( __CLASS__, 'subscription_renewal_notice' ) ); + + $option_name = 'pronamic_pay_s2member_signup_email_message'; + add_filter( 'default_option_' . $option_name, array( __CLASS__, 'default_option_s2member_signup_email_message' ) ); + + $option_name = 'pronamic_pay_s2member_subscription_renewal_notice_email_subject'; + add_filter( 'default_option_' . $option_name, array( __CLASS__, 'default_option_s2member_subscription_renewal_notice_email_subject' ) ); + + $option_name = 'pronamic_pay_s2member_subscription_renewal_notice_email_message'; + add_filter( 'default_option_' . $option_name, array( __CLASS__, 'default_option_s2member_subscription_renewal_notice_email_message' ) ); + } + + /** + * Default option s2Member signup email message + * + * @param string $default Default. + * @return string + */ + public static function default_option_s2member_signup_email_message( $default ) { + $default = sprintf( + /* translators: 1: %%email%%, 2: %%password%%, 3: blog name */ + __( + 'Thanks %1$s! Your membership has been approved. + +Your password is %2$s. Please change your password when you login. + +If you have any trouble, please feel free to contact us. + +Best Regards, +%3$s', + 'pronamic_ideal' + ), + '%%email%%', + '%%password%%', + get_bloginfo( 'name' ) + ); + + return $default; + } + + /** + * Default option s2Member subscription renewal notice email subject. + * + * @param string $default Default. + * @return string + */ + public static function default_option_s2member_subscription_renewal_notice_email_subject( $default ) { + return __( 'Subscription Renewal Notice', 'pronamic_ideal' ) . ' | ' . get_bloginfo( 'name' ); + } + + /** + * Default option s2Member subscription renewal notice email message. + * + * @param string $default Default. + * @return string + */ + public static function default_option_s2member_subscription_renewal_notice_email_message( $default ) { + return sprintf( + /* translators: 1: %%email%%, 2: %%subscription_renewal_date%%, 3: %%subscription_cancel_url%%, 4: blog name */ + __( + 'Dear %1$s, + +Your membership is due for renewal on %2$s. + +To cancel your subscription, visit %3$s + +Best Regards, +%4$s', + 'pronamic_ideal' + ), + '%%email%%', + '%%subscription_renewal_date%%', + '%%subscription_cancel_url%%', + get_bloginfo( 'name' ) + ); + } + + /** + * Update status. + * + * @param Payment $payment Payment. + * @return void + */ + public static function update_status( Payment $payment ) { + // Check failed recurring payment. + if ( $payment->get_recurring() ) { + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + case PaymentStatus::EXPIRED: + case PaymentStatus::FAILURE: + $user = get_user_by( 'email', $payment->get_email() ); + + if ( false !== $user ) { + Util::auto_eot_now_user_update( $user ); + } + + return; + } + } + + // Continue with successful payments only. + if ( PaymentStatus::SUCCESS !== $payment->get_status() ) { + return; + } + + $payment_data = Util::get_payment_data( $payment ); + + $email = $payment->get_email(); + + // Get account from email address. + $user = get_user_by( 'email', $email ); + + if ( ! $user && $payment->get_recurring() ) { + // Invalid user for recurring payment, abort to prevent account creation. + return; + } + + $random_string = ''; + + // No valid user? + if ( ! $user ) { + // Make a random string for password. + $random_string = wp_generate_password( 10 ); + + // Make a user with the username as the email. + $user_id = wp_create_user( $email, $random_string, $email ); + + // Subject. + $subject = __( 'Account Confirmation', 'pronamic_ideal' ) . ' | ' . get_bloginfo( 'name' ); + + // Message. + $message = get_option( 'pronamic_pay_s2member_signup_email_message' ); + + $message = str_replace( + array( + '%%email%%', + '%%password%%', + ), + array( + $email, + $random_string, + ), + $message + ); + + // Mail. + wp_mail( $email, $subject, $message ); + + $user = new WP_User( $user_id ); + + // Update subscription post author. + $subscription = $payment->get_subscription(); + + if ( null !== $subscription ) { + $customer = $subscription->get_customer(); + + if ( null !== $customer ) { + $customer->set_user_id( $user_id ); + + $subscription->set_customer( $customer ); + + $subscription->save(); + } + + // Update subscription post author. + wp_update_post( + array( + 'ID' => $subscription->get_id(), + 'post_author' => $user->ID, + ) + ); + } + } + + // Set s2Member subscription ID. + update_user_option( $user->ID, 's2member_subscr_gateway', $payment->get_method() ); + + $periods = $payment->get_periods(); + + if ( null !== $periods ) { + foreach ( $periods as $period ) { + $subscription_id = $period->get_phase()->get_subscription()->get_id(); + + if ( null !== $subscription_id ) { + update_user_option( $user->ID, 's2member_subscr_id', $subscription_id ); + } + } + } + + $level = $payment_data['level']; + $period = $payment_data['period']; + $ccaps = $payment_data['ccaps']; + + $capability = 'access_s2member_level' . $level; + $role = 's2member_level' . $level; + + // Update user role. + $user->set_role( $role ); + + $note = sprintf( + /* translators: 1: email, 2: role, 3: capability */ + __( 'Update user "%1$s" to role "%2$s" and added custom capability "%3$s".', 'pronamic_ideal' ), + $email, + $role, + $capability + ); + + $payment->add_note( $note ); + + // Custom Capabilities. + if ( ! empty( $ccaps ) ) { + $ccaps = Util::ccap_string_to_array( $ccaps ); + + Util::ccap_user_update( $user, $ccaps ); + } + + // Registration times. + $registration_time = time(); + + $registration_times = get_user_option( 's2member_paid_registration_times', $user->ID ); + if ( empty( $registration_times ) ) { + $registration_times = array(); + } + + $registration_times[ 'level' . $level ] = $registration_time; + + update_user_option( $user->ID, 's2member_paid_registration_times', $registration_times ); + + if ( in_array( $period, array( '1 L' ), true ) ) { + // Lifetime, delete end of time option. + delete_user_option( $user->ID, 's2member_auto_eot_time' ); + } else { + /* + * Auto end of time. + * @link https://github.com/WebSharks/s2Member/blob/131126/s2member/includes/classes/utils-time.inc.php#L100 + */ + $eot_time_current = get_user_option( 's2member_auto_eot_time', $user->ID ); + + if ( ! is_numeric( $eot_time_current ) ) { + $eot_time_current = time(); + } + + // Prevent updating eot if (retry) payment period end date is (before) current eot time. + $should_update_eot = true; + + $end_date = $payment->get_end_date(); + + if ( null !== $end_date && $end_date->getTimestamp() <= $eot_time_current ) { + $should_update_eot = false; + } + + if ( $should_update_eot ) { + if ( $payment->get_recurring() ) { + add_filter( 'ws_plugin__s2member_eot_grace_time', '__return_zero' ); + + // Calculate EOT time for period from today. + $eot_time_new = c_ws_plugin__s2member_utils_time::auto_eot_time( 0, '', '', $period, 0, $eot_time_current ); + + remove_filter( 'ws_plugin__s2member_eot_grace_time', '__return_zero' ); + } else { + $eot_time_new = c_ws_plugin__s2member_utils_time::auto_eot_time( $user->ID, '', $period, false, $eot_time_current ); + } + + update_user_option( $user->ID, 's2member_auto_eot_time', $eot_time_new ); + } + } + + // Subscribe with list servers. + if ( ! $payment->get_recurring() && Core_Util::class_method_exists( 'c_ws_plugin__s2member_list_servers', 'process_list_servers' ) ) { + // IP address. + $ip = Server::get( 'REMOTE_ADDR' ); + + $customer = $payment->customer; + + if ( null !== $customer ) { + $ip = $customer->get_ip_address(); + } + + // Name. + $first_name = $user->first_name; + $last_name = $user->last_name; + + // Opt in? + $opt_in = 1 === \intval( get_post_meta( $payment->get_id(), '_pronamic_payment_s2member_opt_in', true ) ); + + c_ws_plugin__s2member_list_servers::process_list_servers( $role, $level, $email, $random_string, $email, $first_name, $last_name, $ip, $opt_in, true, $user->ID ); + } + } + + /** + * Send subscription renewal notice + * + * @param Subscription $subscription Subscription. + * @return void + */ + public static function subscription_renewal_notice( Subscription $subscription ) { + // Email address. + $email = $subscription->get_meta( 'email' ); + + // Subject. + $subject = (string) get_option( 'pronamic_pay_s2member_subscription_renewal_notice_email_subject' ); + + // Message. + $message = (string) get_option( 'pronamic_pay_s2member_subscription_renewal_notice_email_message' ); + + if ( '' === trim( $message ) ) { + return; + } + + // Get renewal date. + $next_payment_date = $subscription->get_next_payment_date(); + + if ( ! $next_payment_date ) { + return; + } + + $date_format = \get_option( 'date_format', \pronamic_pay_plugin()->datetime_format( '' ) ); + + $subscription_renewal_date = date_i18n( $date_format, $next_payment_date->getTimestamp() ); + + // Get amount from current phase. + $amount = null; + + $current_phase = $subscription->get_current_phase(); + + if ( null !== $current_phase ) { + $amount = $current_phase->get_amount()->format_i18n(); + } + + $replacements = array( + '%%email%%' => $email, + '%%amount%%' => $amount, + '%%subscription_cancel_url%%' => $subscription->get_cancel_url(), + '%%subscription_renewal_url%%' => $subscription->get_renewal_url(), + '%%subscription_renewal_date%%' => $subscription_renewal_date, + ); + + $subject = strtr( $subject, $replacements ); + $message = strtr( $message, $replacements ); + + // Mail. + wp_mail( $email, $subject, $message ); + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment. + * @return string + */ + public static function source_text( $text, Payment $payment ) { + return __( 's2Member', 'pronamic_ideal' ); + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Payment. + * @return string + */ + public static function source_description( $description, Payment $payment ) { + return __( 's2Member', 'pronamic_ideal' ); + } + + /** + * Subscription source text. + * + * @param string $text Source text. + * @param Subscription $subscription Subscription. + * @return string + */ + public static function subscription_source_text( $text, Subscription $subscription ) { + return __( 's2Member', 'pronamic_ideal' ); + } + + /** + * Subscription source description. + * + * @param string $description Source description. + * @param Subscription $subscription Subscription. + * @return string + */ + public static function subscription_source_description( $description, Subscription $subscription ) { + return __( 's2Member', 'pronamic_ideal' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/S2Member.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/S2Member.php new file mode 100644 index 00000000..411fd1fb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/S2Member.php @@ -0,0 +1,69 @@ + __( '1 day', 'pronamic_ideal' ), + '2 D' => __( '2 day', 'pronamic_ideal' ), + '3 D' => __( '3 day', 'pronamic_ideal' ), + '4 D' => __( '4 day', 'pronamic_ideal' ), + '5 D' => __( '5 day', 'pronamic_ideal' ), + '6 D' => __( '6 day', 'pronamic_ideal' ), + '1 W' => __( '1 week', 'pronamic_ideal' ), + '2 W' => __( '2 week', 'pronamic_ideal' ), + '3 W' => __( '3 week', 'pronamic_ideal' ), + '1 M' => __( '1 month', 'pronamic_ideal' ), + '2 M' => __( '2 month', 'pronamic_ideal' ), + '3 M' => __( '3 month', 'pronamic_ideal' ), + '4 M' => __( '4 month', 'pronamic_ideal' ), + '5 M' => __( '5 month', 'pronamic_ideal' ), + '6 M' => __( '6 month', 'pronamic_ideal' ), + '1 Y' => __( '1 year', 'pronamic_ideal' ), + '2 Y' => __( '2 years', 'pronamic_ideal' ), + '3 Y' => __( '3 years', 'pronamic_ideal' ), + '4 Y' => __( '4 years', 'pronamic_ideal' ), + '5 Y' => __( '5 years', 'pronamic_ideal' ), + '1 L' => __( 'lifetime', 'pronamic_ideal' ), + 'R1 D' => __( '1 day', 'pronamic_ideal' ), + 'R2 D' => __( '2 day', 'pronamic_ideal' ), + 'R3 D' => __( '3 day', 'pronamic_ideal' ), + 'R4 D' => __( '4 day', 'pronamic_ideal' ), + 'R5 D' => __( '5 day', 'pronamic_ideal' ), + 'R6 D' => __( '6 day', 'pronamic_ideal' ), + 'R1 W' => __( '1 week', 'pronamic_ideal' ), + 'R2 W' => __( '2 week', 'pronamic_ideal' ), + 'R3 W' => __( '3 week', 'pronamic_ideal' ), + 'R1 M' => __( '1 month', 'pronamic_ideal' ), + 'R2 M' => __( '2 month', 'pronamic_ideal' ), + 'R3 M' => __( '3 month', 'pronamic_ideal' ), + 'R4 M' => __( '4 month', 'pronamic_ideal' ), + 'R5 M' => __( '5 month', 'pronamic_ideal' ), + 'R6 M' => __( '6 month', 'pronamic_ideal' ), + 'R365 D' => __( '1 year', 'pronamic_ideal' ), + ); + + $periods = apply_filters( 'pronamic_ideal_s2member_default_periods', $periods ); + + return $periods; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/S2MemberDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/S2MemberDependency.php new file mode 100644 index 00000000..2707a76a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/S2MemberDependency.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\S2Member + */ + +namespace Pronamic\WordPress\Pay\Extensions\S2Member; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * S2Member Dependency + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class S2MemberDependency extends Dependency { + /** + * Is met. + * + * @link https://github.com/WebSharks/s2Member/blob/130816/s2member/s2member.php#L69 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + return \defined( '\WS_PLUGIN__S2MEMBER_VERSION' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Settings.php new file mode 100644 index 00000000..23555163 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Settings.php @@ -0,0 +1,165 @@ + 'pronamic_pay_s2member_config_id', + 'label_for' => 'pronamic_pay_s2member_config_id', + ) + ); + + // Setting - Signup e-mail message + register_setting( 'pronamic_pay_s2member', 'pronamic_pay_s2member_signup_email_message' ); + + add_settings_field( + 'pronamic_pay_s2member_signup_email_message', // id + __( 'Signup Confirmation Email Message', 'pronamic_ideal' ), // title + array( $this, 'wp_editor' ), // callback + 'pronamic_pay_s2member', // page + 'pronamic_pay_s2member_general', // section + array( // args + 'name' => 'pronamic_pay_s2member_signup_email_message', + 'label_for' => 'pronamic_pay_s2member_signup_email_message', + ) + ); + + // Setting - Subscription renewal notice email subject + register_setting( 'pronamic_pay_s2member', 'pronamic_pay_s2member_subscription_renewal_notice_email_subject' ); + + add_settings_field( + 'pronamic_pay_s2member_subscription_renewal_notice_email_subject', // id + __( 'Subscription Renewal Notice Email Subject', 'pronamic_ideal' ), // title + array( $this, 'text_field' ), // callback + 'pronamic_pay_s2member', // page + 'pronamic_pay_s2member_general', // section + array( // args + 'name' => 'pronamic_pay_s2member_subscription_renewal_notice_email_subject', + 'label_for' => 'pronamic_pay_s2member_subscription_renewal_notice_email_subject', + ) + ); + + // Setting - Subscription renewal notice email message + register_setting( 'pronamic_pay_s2member', 'pronamic_pay_s2member_subscription_renewal_notice_email_message' ); + + add_settings_field( + 'pronamic_pay_s2member_subscription_renewal_notice_email_message', // id + __( 'Subscription Renewal Notice Email Message', 'pronamic_ideal' ), // title + array( $this, 'wp_editor' ), // callback + 'pronamic_pay_s2member', // page + 'pronamic_pay_s2member_general', // section + array( // args + 'name' => 'pronamic_pay_s2member_subscription_renewal_notice_email_message', + 'label_for' => 'pronamic_pay_s2member_subscription_renewal_notice_email_message', + ) + ); + } + + /** + * WordPress editor + * + * @param $args + */ + public function wp_editor( $args ) { + $content = get_option( $args['name'] ); + + wp_editor( $content, $args['name'] ); + } + + /** + * Text field. + * + * @param $args + */ + public function text_field( $args ) { + $value = get_option( $args['name'] ); + + printf( + '', + esc_attr( $args['name'] ), + esc_attr( $value ) + ); + } + + /** + * Admin menu + */ + public function admin_menu() { + $parent_slug = apply_filters( 'ws_plugin__s2member_during_add_admin_options_menu_slug', 'ws-plugin--s2member-start' ); + + if ( apply_filters( 'ws_plugin__s2member_during_add_admin_options_add_divider_6', true, get_defined_vars() ) ) { /* Divider. */ + add_submenu_page( $parent_slug, '', '', 'create_users', '#' ); + } + + add_submenu_page( + $parent_slug, + __( 'Pronamic Pay Options', 'pronamic_ideal' ), + __( 'Payment Options', 'pronamic_ideal' ), + 'create_users', + 'pronamic_pay_s2member_settings', + array( $this, 'page_options' ) + ); + + add_submenu_page( + $parent_slug, + __( 'Pronamic Pay Buttons Generator', 'pronamic_ideal' ), + __( 'Payment Buttons', 'pronamic_ideal' ), + 'create_users', + 'pronamic_pay_s2member_buttons', + array( $this, 'page_buttons_generator' ) + ); + } + + /** + * Page view options + */ + public function page_options() { + include dirname( __FILE__ ) . '/../views/html-admin-page-settings.php'; + } + + /** + * Page button generator + */ + public function page_buttons_generator() { + include dirname( __FILE__ ) . '/../views/html-admin-page-buttons-generator.php'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Shortcodes.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Shortcodes.php new file mode 100644 index 00000000..aa555de8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Shortcodes.php @@ -0,0 +1,534 @@ +index ++; + + $defaults = array( + 'period' => null, + 'cost' => null, + 'level' => null, + 'description' => __( 'iDEAL s2Member Payment || {{order_id}}', 'pronamic_ideal' ), + 'button_text' => __( 'Pay', 'pronamic_ideal' ), + 'ccaps' => null, + 'payment_method' => null, + 'recurring' => null, + 'subscription_id' => null, + ); + + // Combine the passed options. + $atts = shortcode_atts( $defaults, $atts ); + + $atts['order_id'] = uniqid(); + + // Output. + $output = ''; + + // Get the config ID. + $config_id = get_option( 'pronamic_pay_s2member_config_id' ); + + // Get the gateway from the configuration. + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return $output; + } + + if ( null !== $atts['payment_method'] ) { + $supported_payment_methods = $gateway->get_supported_payment_methods(); + + if ( in_array( $atts['payment_method'], $supported_payment_methods, true ) ) { + $gateway->set_payment_method( $atts['payment_method'] ); + } else { + $atts['payment_method'] = null; + } + } + + // Period. + $period = \str_replace( ' ', '', $atts['period'] ); + + if ( ! empty( $period ) ) { + $interval_value = (int) $period; + + $interval = (object) array( + 'value' => $interval_value, + 'unit' => \str_replace( $interval_value, '', $period ), + ); + + $atts['period'] = sprintf( '%d %s', $interval->value, $interval->unit ); + } + + // Hash. + $hash_data = array( + 'order_id' => $atts['order_id'], + 'period' => $atts['period'], + 'cost' => $atts['cost'], + 'level' => $atts['level'], + 'description' => $atts['description'], + 'ccaps' => $atts['ccaps'], + 'payment_method' => $atts['payment_method'], + 'recurring' => $atts['recurring'], + 'subscription_id' => $atts['subscription_id'], + ); + + // Output. + $output .= $this->payment_error(); + + $output .= '
    '; + + if ( ! is_user_logged_in() ) { + $output .= sprintf( + '', + esc_attr( 'pronamic_pay_s2member_email' ), + esc_html__( 'Email', 'pronamic_ideal' ) + ); + $output .= ' '; + $output .= sprintf( + '', + esc_attr( 'pronamic_pay_s2member_email' ), + esc_attr( 'pronamic_pay_s2member_email' ), + (string) Util::get_user_input_email() + ); + $output .= ' '; + } + + // List servers opt-in checkbox. + if ( Core_Util::class_method_exists( 'c_ws_plugin__s2member_list_servers', 'list_servers_integrated' ) && ! empty( $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in'] ) && c_ws_plugin__s2member_list_servers::list_servers_integrated() ) { + $output .= sprintf( + '
    ', + checked( $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in'], 1, false ), + $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in_label'] + ); + } + + $output .= $gateway->get_input_html(); + + $output .= ' '; + + $output .= Pay_Util::html_hidden_fields( + array( + 'pronamic_pay_s2member_index' => $this->index, + 'pronamic_pay_s2member_hash' => $this->create_hash( $hash_data ), + 'pronamic_pay_s2member_data[order_id]' => $atts['order_id'], + 'pronamic_pay_s2member_data[period]' => $atts['period'], + 'pronamic_pay_s2member_data[cost]' => $atts['cost'], + 'pronamic_pay_s2member_data[level]' => $atts['level'], + 'pronamic_pay_s2member_data[description]' => $atts['description'], + 'pronamic_pay_s2member_data[ccaps]' => $atts['ccaps'], + 'pronamic_pay_s2member_data[payment_method]' => $atts['payment_method'], + 'pronamic_pay_s2member_data[recurring]' => $atts['recurring'], + 'pronamic_pay_s2member_data[subscription_id]' => $atts['subscription_id'], + ) + ); + + $output .= sprintf( + '', + esc_attr( 'pronamic_pay_s2member' ), + esc_attr( $atts['button_text'] ) + ); + + $output .= '
    '; + + return $output; + } + + /** + * Handle payment + */ + public function handle_payment() { + if ( ! filter_has_var( INPUT_POST, 'pronamic_pay_s2member' ) ) { + return; + } + + $index = filter_input( INPUT_POST, 'pronamic_pay_s2member_index', FILTER_SANITIZE_STRING ); + $hash = filter_input( INPUT_POST, 'pronamic_pay_s2member_hash', FILTER_SANITIZE_STRING ); + $data = filter_input( INPUT_POST, 'pronamic_pay_s2member_data', FILTER_SANITIZE_STRING, FILTER_REQUIRE_ARRAY ); + $opt_in = filter_input( INPUT_POST, 'pronamic_pay_s2member_opt_in', FILTER_SANITIZE_NUMBER_INT ); + + if ( $hash !== $this->create_hash( $data ) ) { + return; + } + + // Data. + $email = Util::get_user_input_email(); + + if ( empty( $email ) ) { + return; + } + + // Gateway. + $config_id = (int) \get_option( 'pronamic_pay_s2member_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway ) { + // Set error message. + $this->error[ $index ] = array( + Plugin::get_default_error_message(), + __( 'The payment gateway could not be found.', 'pronamic_ideal' ), + ); + + return; + } + + /* + * Payment. + */ + $payment = new Payment(); + + $order_id = $data['order_id']; + + $replacements = array( + '{{order_id}}' => $order_id, + ); + + $description = strtr( $data['description'], $replacements ); + + $payment->set_config_id( $config_id ); + $payment->set_description( $description ); + + $payment->method = $data['payment_method']; + $payment->order_id = $order_id; + + // Source. + $payment->set_source( 's2member' ); + $payment->set_source_id( $order_id ); + + // Data. + $user = \wp_get_current_user(); + + $first_name = $user->first_name; + $last_name = $user->last_name; + $user_id = \get_current_user_id(); + + // Name. + $name = null; + + $name_data = array( + $first_name, + $last_name, + ); + + $name_data = array_filter( $name_data ); + + if ( ! empty( $name_data ) ) { + $name = new ContactName(); + + if ( ! empty( $first_name ) ) { + $name->set_first_name( $first_name ); + } + + if ( ! empty( $last_name ) ) { + $name->set_last_name( $last_name ); + } + } + + // Customer. + $customer_data = array( + $name, + $email, + $user_id, + ); + + $customer_data = array_filter( $customer_data ); + + if ( ! empty( $customer_data ) ) { + $customer = new Customer(); + + $customer->set_name( $name ); + $customer->set_email( $email ); + + if ( ! empty( $user_id ) ) { + $customer->set_user_id( (int) $user_id ); + } + + $payment->set_customer( $customer ); + } + + // Billing address. + $address_data = array( + $name, + $email, + ); + + $address_data = array_filter( $address_data ); + + if ( ! empty( $address_data ) ) { + $address = new Address(); + + if ( ! empty( $name ) ) { + $address->set_name( $name ); + } + + $address->set_email( $email ); + + $payment->set_billing_address( $address ); + } + + // Lines. + $payment->lines = new PaymentLines(); + + $line = $payment->lines->new_line(); + + $price = new TaxedMoney( $data['cost'], 'EUR' ); + + $line->set_name( $description ); + $line->set_quantity( 1 ); + $line->set_unit_price( $price ); + $line->set_total_amount( $price ); + + $payment->set_total_amount( $payment->lines->get_amount() ); + + // Subscription. + if ( 'Y' === $data['recurring'] && isset( $data['period'] ) && ! empty( $data['period'] ) ) { + // Find existing subscription. + $subscription = null; + + $start_date = new \DateTimeImmutable(); + + if ( ! empty( $data['subscription_id'] ) ) { + $subscription = \get_pronamic_subscription( (int) $data['subscription_id'] ); + } + + $user_subscription_id = \get_user_option( 's2member_subscr_id', $user_id ); + + if ( null === $subscription && ! empty( $user_subscription_id ) ) { + $subscription = \get_pronamic_subscription( (int) $user_subscription_id ); + } + + // Cancel active phases. + if ( null !== $subscription ) { + foreach ( $subscription->get_phases() as $phase ) { + // Check if phase has already been completed. + if ( $phase->all_periods_created() ) { + continue; + } + + // Check if phase is already canceled. + $canceled_at = $phase->get_canceled_at(); + + if ( ! empty( $canceled_at ) ) { + continue; + } + + // Set start date for new phases (before setting canceled date). + $next_date = $phase->get_next_date(); + + if ( null !== $next_date ) { + $start_date = $next_date; + } + + // Set canceled date. + $phase->set_canceled_at( new \DateTimeImmutable() ); + } + + $payment->subscription_id = $subscription->get_id(); + } + + // New subscription. + if ( null === $subscription ) { + $subscription = new Subscription(); + } + + // Data. + $subscription->set_description( $description ); + $subscription->set_lines( $payment->get_lines() ); + + // Phase. + $period = \str_replace( ' ', '', $data['period'] ); + + $interval_value = (int) $period; + + $interval = (object) array( + 'value' => $interval_value, + 'unit' => \str_replace( $interval_value, '', $period ), + ); + + $phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( 'P' . $interval->value . Core_Util::to_period( $interval->unit ) ), + $price + ); + + $subscription->add_phase( $phase ); + + $period = $subscription->new_period(); + + if ( null !== $period ) { + $payment->add_period( $period ); + } + + // Update existing subscription dates. + if ( null !== $payment->subscription_id ) { + $next_payment_date = $phase->get_next_date(); + + if ( null !== $next_payment_date ) { + $next_payment_date = DateTime::create_from_immutable( $next_payment_date ); + } + + $subscription->set_next_payment_date( $next_payment_date ); + $subscription->set_next_payment_delivery_date( SubscriptionHelper::calculate_next_payment_delivery_date( $subscription ) ); + + $subscription->set_expiry_date( DateTime::create_from_immutable( $start_date ) ); + } + + $payment->subscription = $subscription; + $payment->subscription_source_id = $payment->get_source_id(); + } + + // Start. + try { + $payment = Plugin::start_payment( $payment ); + } catch ( \Exception $e ) { + // Set error message. + $this->error[ $index ] = array( + Plugin::get_default_error_message(), + $e->getMessage(), + ); + } + + update_post_meta( $payment->get_id(), '_pronamic_payment_s2member_period', $data['period'] ); + update_post_meta( $payment->get_id(), '_pronamic_payment_s2member_level', $data['level'] ); + update_post_meta( $payment->get_id(), '_pronamic_payment_s2member_ccaps', $data['ccaps'] ); + + // List server opt-in. + if ( ! empty( $opt_in ) ) { + update_post_meta( $payment->get_id(), '_pronamic_payment_s2member_opt_in', $opt_in ); + } + + // Add s2Member meta to subscription. + $periods = $payment->get_periods(); + + if ( null !== $periods ) { + foreach ( $periods as $period ) { + $subscription_id = $period->get_phase()->get_subscription()->get_id(); + + if ( null === $subscription_id ) { + continue; + } + + update_post_meta( $subscription_id, '_pronamic_subscription_s2member_period', $data['period'] ); + update_post_meta( $subscription_id, '_pronamic_subscription_s2member_level', $data['level'] ); + update_post_meta( $subscription_id, '_pronamic_subscription_s2member_ccaps', $data['ccaps'] ); + } + } + + if ( ! \array_key_exists( $index, $this->error ) ) { + // Redirect. + $gateway->redirect( $payment ); + } + } + + /** + * Payment error for shortcode + * + * @param int $index Shortcode index. + * + * @return bool/string Default: false. Error string in case of payment error + * + * @since 1.1.0 + */ + public function payment_error( $index = null ) { + if ( ! is_int( $index ) ) { + $index = $this->index; + } + + if ( isset( $this->error[ $index ] ) ) { + return sprintf( + '

    %s
    %s: %s

    ', + $this->error[ $index ][0], + __( 'Error', 'pronamic_ideal' ), + $this->error[ $index ][1] + ); + } + + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Util.php new file mode 100644 index 00000000..471724ea --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/src/Util.php @@ -0,0 +1,150 @@ +allcaps as $capability => $granted ) { + if ( 'access_s2member_ccap_' === substr( $capability, 0, 21 ) ) { + $user->remove_cap( $capability ); + } + } + + // Add custom capabilities. + foreach ( $custom_capabilities as $custom_capability ) { + $user->add_cap( 'access_s2member_ccap_' . $custom_capability ); + } + } + + /** + * Update user auto EOT time to now + grace time setting. Membership will end on next s2Member auto EOT process. + * + * @param WP_User $user User. + */ + public static function auto_eot_now_user_update( $user ) { + if ( ! ( $user instanceof WP_User ) ) { + return; + } + + $auto_eot_time = strtotime( 'now' ); + + if ( isset( $GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_grace_time'] ) ) { + $eot_grace_time = (int) $GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_grace_time']; + $eot_grace_time = (int) apply_filters( 'ws_plugin__s2member_eot_grace_time', $eot_grace_time ); + + $auto_eot_time += $eot_grace_time; + } + + update_user_option( $user->ID, 's2member_auto_eot_time', $auto_eot_time ); + } + + /** + * Update users custom capabilities + * + * @link https://github.com/websharks/s2member/blob/150311/s2member/includes/classes/paypal-notify-in-subscr-modify-w-level.inc.php#L103-L111 + * + * @param Payment $payment Payment. + * + * @return array + */ + public static function get_payment_data( Payment $payment ) { + // Get subscription ID from payment periods. + $subscription_id = null; + + $periods = $payment->get_periods(); + + if ( null !== $periods ) { + foreach ( $periods as $period ) { + $subscription_id = $period->get_phase()->get_subscription()->get_id(); + } + } + + // Determine post ID and recurring. + $post_id = $payment->get_id(); + + $meta_prefix = '_pronamic_payment_'; + + $recurring = null; + + if ( null !== $subscription_id ) { + if ( $payment->get_recurring() ) { + $post_id = $subscription_id; + + $meta_prefix = '_pronamic_subscription_'; + } + + $recurring = 'Y'; + } + + // Return payment data. + return array( + 'level' => get_post_meta( $post_id, $meta_prefix . 's2member_level', true ), + 'period' => get_post_meta( $post_id, $meta_prefix . 's2member_period', true ), + 'ccaps' => get_post_meta( $post_id, $meta_prefix . 's2member_ccaps', true ), + 'recurring' => $recurring, + 'subscription_id' => $subscription_id, + ); + } + + /** + * Get email address from logged in user or form input. + * + * @return string|null + */ + public static function get_user_input_email() { + $email = null; + + // Get email from logged in user. + if ( \is_user_logged_in() ) { + $user = \wp_get_current_user(); + + $email = $user->user_email; + } + + // Get email from form input. + if ( \filter_has_var( \INPUT_POST, 'pronamic_pay_s2member_email' ) ) { + $email = (string) \filter_input( \INPUT_POST, 'pronamic_pay_s2member_email', \FILTER_VALIDATE_EMAIL ); + } + + return $email; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php new file mode 100644 index 00000000..81a70513 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/views/html-admin-page-buttons-generator.php @@ -0,0 +1,170 @@ + +
    +

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

    + '; + + $select = ''; + $select .= ''; + + /* translators: 1: amount input, 2: period select */ + $label = __( 'I want to charge %1$s for %2$s', 'pronamic_ideal' ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + printf( $label, $input, $select ); + + $select = ''; + $select .= ''; + + /* translators: %s: level select */ + $label = __( 'access to level %s content.', 'pronamic_ideal' ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + printf( $label, $select ); + + ?> +

    +

    + + +

    +

    + + + %s', 'pronamic_ideal' ); + + printf( + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $label, + esc_html__( 'Pay', 'pronamic_ideal' ) + ); + + ?> +

    +

    + : + + +

    +
    + +
    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/views/html-admin-page-settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/views/html-admin-page-settings.php new file mode 100644 index 00000000..8ec6b85d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/s2member/views/html-admin-page-settings.php @@ -0,0 +1,11 @@ +
    +

    + +
    + + + + + +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/CreditCardGateway.php new file mode 100644 index 00000000..0cc4facd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/CreditCardGateway.php @@ -0,0 +1,45 @@ +config_id ); + + if ( $gateway && $gateway->supports( 'recurring_credit_card' ) ) { + // @since unreleased + $this->supports = array( + 'products', + 'subscriptions', + 'subscription_amount_changes', + 'subscription_cancellation', + 'subscription_date_changes', + 'subscription_payment_method_change_customer', + 'subscription_reactivation', + 'subscription_suspension', + ); + + // Handle subscription payments. + add_action( 'woocommerce_scheduled_subscription_payment_' . $this->id, array( $this, 'process_subscription_payment' ), 10, 2 ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitBancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitBancontactGateway.php new file mode 100644 index 00000000..ecf79257 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitBancontactGateway.php @@ -0,0 +1,39 @@ +supports = array( + 'products', + 'subscriptions', + 'subscription_amount_changes', + 'subscription_cancellation', + 'subscription_date_changes', + 'subscription_payment_method_change_customer', + 'subscription_reactivation', + 'subscription_suspension', + ); + + // Handle subscription payments. + add_action( 'woocommerce_scheduled_subscription_payment_' . $this->id, array( $this, 'process_subscription_payment' ), 10, 2 ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitIDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitIDealGateway.php new file mode 100644 index 00000000..c628988f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitIDealGateway.php @@ -0,0 +1,39 @@ +supports = array( + 'products', + 'subscriptions', + 'subscription_amount_changes', + 'subscription_cancellation', + 'subscription_date_changes', + 'subscription_payment_method_change_customer', + 'subscription_reactivation', + 'subscription_suspension', + ); + + // Handle subscription payments. + add_action( 'woocommerce_scheduled_subscription_payment_' . $this->id, array( $this, 'process_subscription_payment' ), 10, 2 ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitSofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitSofortGateway.php new file mode 100644 index 00000000..8b7eceee --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/DirectDebitSofortGateway.php @@ -0,0 +1,39 @@ +supports = array( + 'products', + 'subscriptions', + 'subscription_amount_changes', + 'subscription_cancellation', + 'subscription_date_changes', + 'subscription_payment_method_change_customer', + 'subscription_reactivation', + 'subscription_suspension', + ); + + // Handle subscription payments. + add_action( 'woocommerce_scheduled_subscription_payment_' . $this->id, array( $this, 'process_subscription_payment' ), 10, 2 ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/Extension.php new file mode 100644 index 00000000..e287b2e4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/Extension.php @@ -0,0 +1,1266 @@ + __( 'WooCommerce', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new WooCommerceDependency() ); + } + + /** + * Setup plugin integration. + * + * @return void + */ + public function setup() { + add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( __CLASS__, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( __CLASS__, 'source_description' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_text_' . self::SLUG, array( __CLASS__, 'subscription_source_text' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_description_' . self::SLUG, array( __CLASS__, 'subscription_source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + add_action( 'init', array( __CLASS__, 'init' ) ); + + add_action( 'admin_init', array( __CLASS__, 'admin_init' ), 15 ); + + add_filter( 'woocommerce_payment_gateways', array( __CLASS__, 'payment_gateways' ) ); + + add_filter( 'woocommerce_thankyou_order_received_text', array( __CLASS__, 'woocommerce_thankyou_order_received_text' ), 20, 2 ); + } + + /** + * Initialize + * + * @return void + */ + public static function init() { + add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( __CLASS__, 'redirect_url' ), 10, 2 ); + add_action( 'pronamic_payment_status_update_' . self::SLUG, array( __CLASS__, 'status_update' ), 10, 1 ); + add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( __CLASS__, 'source_url' ), 10, 2 ); + add_filter( 'pronamic_subscription_source_url_' . self::SLUG, array( __CLASS__, 'subscription_source_url' ), 10, 2 ); + + add_action( 'pronamic_payment_status_update_' . self::SLUG . '_reserved_to_cancelled', array( __CLASS__, 'reservation_cancelled_note' ), 10, 1 ); + + // WooCommerce Subscriptions. + add_action( 'woocommerce_subscription_status_cancelled', array( __CLASS__, 'subscription_cancelled' ), 10, 1 ); + add_action( 'woocommerce_subscription_status_on-hold', array( __CLASS__, 'subscription_on_hold' ), 10, 1 ); + add_action( 'woocommerce_subscription_status_on-hold_to_active', array( __CLASS__, 'subscription_reactivated' ), 10, 1 ); + add_action( 'woocommerce_subscriptions_switch_completed', array( __CLASS__, 'subscription_switch_completed' ), 10, 1 ); + + // Currencies. + add_filter( 'woocommerce_currencies', array( __CLASS__, 'currencies' ), 10, 1 ); + add_filter( 'woocommerce_currency_symbol', array( __CLASS__, 'currency_symbol' ), 10, 2 ); + + // Checkout fields. + add_filter( 'woocommerce_checkout_fields', array( __CLASS__, 'checkout_fields' ), 10, 1 ); + add_action( 'woocommerce_checkout_update_order_meta', array( __CLASS__, 'checkout_update_order_meta' ), 10, 2 ); + + self::register_settings(); + } + + /** + * Add the gateways to WooCommerce. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.5.3/includes/class-wc-payment-gateways.php#L99-L100 + * @Link https://github.com/wp-pay-extensions/easy-digital-downloads/blob/2.0.2/src/Extension.php#L29-L147 + * + * @param array $wc_gateways WooCommerce payment gateways. + * @return array + */ + public static function payment_gateways( $wc_gateways ) { + $gateways = self::get_gateways(); + + foreach ( $gateways as $key => $args ) { + $args = wp_parse_args( + $args, + array( + 'id' => $key, + 'class' => __NAMESPACE__ . '\Gateway', + 'check_active' => true, + ) + ); + + if ( $args['check_active'] && isset( $args['payment_method'] ) ) { + $payment_method = $args['payment_method']; + + if ( ! PaymentMethods::is_active( $payment_method ) ) { + continue; + } + } + + $class = $args['class']; + + $wc_gateways[] = new $class( $args ); + } + + return $wc_gateways; + } + + /** + * Get gateways. + * + * @return array + */ + public static function get_gateways() { + $icon_url_base = 'https://cdn.wp-pay.org/jsdelivr.net/npm/@wp-pay/logos@1.6.5/dist/methods'; + + return array( + array( + 'id' => 'pronamic_pay', + 'method_title' => __( 'Pronamic', 'pronamic_ideal' ), + 'method_description' => __( "This payment method does not use a predefined payment method for the payment. Some payment providers list all activated payment methods for your account to choose from. Use payment method specific gateways (such as 'iDEAL') to let customers choose their desired payment method at checkout.", 'pronamic_ideal' ), + 'check_active' => false, + ), + array( + 'id' => 'pronamic_pay_afterpay', + 'payment_method' => PaymentMethods::AFTERPAY, + 'icon' => $icon_url_base . '/afterpay/method-afterpay-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_alipay', + 'payment_method' => PaymentMethods::ALIPAY, + 'icon' => $icon_url_base . '/alipay/method-alipay-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_apple_pay', + 'payment_method' => PaymentMethods::APPLE_PAY, + 'icon' => $icon_url_base . '/apple-pay/method-apple-pay-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_mister_cash', + 'payment_method' => PaymentMethods::BANCONTACT, + 'icon' => $icon_url_base . '/bancontact/method-bancontact-wc-51x32.svg', + 'check_active' => false, + ), + array( + 'id' => 'pronamic_pay_bank_transfer', + 'payment_method' => PaymentMethods::BANK_TRANSFER, + 'icon' => $icon_url_base . '/bank-transfer/method-bank-transfer-wc-51x32.svg', + 'check_active' => false, + ), + array( + 'id' => 'pronamic_pay_belfius', + 'payment_method' => PaymentMethods::BELFIUS, + 'icon' => $icon_url_base . '/belfius/method-belfius-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_bitcoin', + 'payment_method' => PaymentMethods::BITCOIN, + 'icon' => $icon_url_base . '/bitcoin/method-bitcoin-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_bunq', + 'payment_method' => PaymentMethods::BUNQ, + 'icon' => $icon_url_base . '/bunq/method-bunq-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_credit_card', + 'payment_method' => PaymentMethods::CREDIT_CARD, + 'icon' => $icon_url_base . '/credit-card/method-credit-card-wc-51x32.svg', + 'check_active' => false, + 'class' => __NAMESPACE__ . '\CreditCardGateway', + ), + array( + 'id' => 'pronamic_pay_direct_debit', + 'payment_method' => PaymentMethods::DIRECT_DEBIT, + 'icon' => $icon_url_base . '/direct-debit/method-direct-debit-wc-51x32.svg', + 'check_active' => false, + ), + array( + 'id' => 'pronamic_pay_direct_debit_bancontact', + 'payment_method' => PaymentMethods::DIRECT_DEBIT_BANCONTACT, + 'icon' => $icon_url_base . '/direct-debit-bancontact/method-direct-debit-bancontact-wc-107-32.svg', + 'class' => __NAMESPACE__ . '\DirectDebitBancontactGateway', + 'form_fields' => array( + 'description' => array( + 'default' => sprintf( + /* translators: %s: payment method */ + __( 'By using this payment method you authorize us via %s to debit payments from your bank account.', 'pronamic_ideal' ), + __( 'Bancontact', 'pronamic_ideal' ) + ), + ), + ), + ), + array( + 'id' => 'pronamic_pay_direct_debit_ideal', + 'payment_method' => PaymentMethods::DIRECT_DEBIT_IDEAL, + 'icon' => $icon_url_base . '/direct-debit-ideal/method-direct-debit-ideal-wc-107-32.svg', + 'class' => __NAMESPACE__ . '\DirectDebitIDealGateway', + 'form_fields' => array( + 'description' => array( + 'default' => sprintf( + /* translators: %s: payment method */ + __( 'By using this payment method you authorize us via %s to debit payments from your bank account.', 'pronamic_ideal' ), + __( 'iDEAL', 'pronamic_ideal' ) + ), + ), + ), + ), + array( + 'id' => 'pronamic_pay_direct_debit_sofort', + 'payment_method' => PaymentMethods::DIRECT_DEBIT_SOFORT, + 'icon' => $icon_url_base . '/direct-debit-sofort/method-direct-debit-sofort-wc-107-32.svg', + 'class' => __NAMESPACE__ . '\DirectDebitSofortGateway', + 'form_fields' => array( + 'description' => array( + 'default' => sprintf( + /* translators: %s: payment method */ + __( 'By using this payment method you authorize us via %s to debit payments from your bank account.', 'pronamic_ideal' ), + __( 'SOFORT', 'pronamic_ideal' ) + ), + ), + ), + ), + array( + 'id' => 'pronamic_pay_focum', + 'payment_method' => PaymentMethods::FOCUM, + 'icon' => $icon_url_base . '/focum/method-focum-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_eps', + 'payment_method' => PaymentMethods::EPS, + 'icon' => $icon_url_base . '/eps/method-eps-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_giropay', + 'payment_method' => PaymentMethods::GIROPAY, + 'icon' => $icon_url_base . '/giropay/method-giropay-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_google_pay', + 'payment_method' => PaymentMethods::GOOGLE_PAY, + 'icon' => $icon_url_base . '/google-pay/method-google-pay-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_gulden', + 'payment_method' => PaymentMethods::GULDEN, + 'icon' => $icon_url_base . '/gulden/method-gulden-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_ideal', + 'payment_method' => PaymentMethods::IDEAL, + 'icon' => $icon_url_base . '/ideal/method-ideal-wc-51x32.svg', + 'form_fields' => array( + 'description' => array( + 'default' => __( 'With iDEAL you can easily pay online in the secure environment of your own bank.', 'pronamic_ideal' ), + ), + ), + 'check_active' => false, + ), + array( + 'id' => 'pronamic_pay_idealqr', + 'payment_method' => PaymentMethods::IDEALQR, + 'icon' => $icon_url_base . '/ideal-qr/method-ideal-qr-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_in3', + 'payment_method' => PaymentMethods::IN3, + 'icon' => $icon_url_base . '/in3/method-in3-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_kbc', + 'payment_method' => PaymentMethods::KBC, + 'icon' => $icon_url_base . '/kbc/method-kbc-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_klarna_pay_later', + 'payment_method' => PaymentMethods::KLARNA_PAY_LATER, + 'icon' => $icon_url_base . '/klarna/method-klarna-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_maestro', + 'payment_method' => PaymentMethods::MAESTRO, + 'icon' => $icon_url_base . '/maestro/method-maestro-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_payconiq', + 'payment_method' => PaymentMethods::PAYCONIQ, + 'icon' => $icon_url_base . '/payconiq/method-payconiq-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_paypal', + 'payment_method' => PaymentMethods::PAYPAL, + 'icon' => $icon_url_base . '/paypal/method-paypal-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_przelewy24', + 'payment_method' => PaymentMethods::PRZELEWY24, + 'icon' => $icon_url_base . '/przelewy24/method-sofort-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_santander', + 'payment_method' => PaymentMethods::SANTANDER, + 'icon' => $icon_url_base . '/santander/method-sofort-wc-51x32.svg', + ), + array( + 'id' => 'pronamic_pay_sofort', + 'payment_method' => PaymentMethods::SOFORT, + 'icon' => $icon_url_base . '/sofort/method-sofort-wc-51x32.svg', + ), + ); + } + + /** + * WooCommerce thank you. + * + * @param string $order_id WooCommerce order ID. + */ + public static function woocommerce_thankyou_order_received_text( $message, WC_Order $order ) { + // Check order status. + if ( ! WooCommerce::order_has_status( $order, 'pending' ) ) { + return $message; + } + + // Chek supported gateway. + $gateway = \wp_list_filter( + self::get_gateways(), + array( + 'id' => $order->get_payment_method( 'raw' ), + ) + ); + + if ( empty( $gateway ) ) { + return $message; + } + + // Add notice. + $message .= \sprintf( + '
    %s
    ', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + __( 'We process your order as soon as we have processed your payment.', 'pronamic_ideal' ) + ); + + return $message; + } + + /** + * Payment redirect URL filter. + * + * @since 1.1.7 + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * + * @return string + */ + public static function redirect_url( $url, Payment $payment ) { + $source_id = $payment->get_source_id(); + + try { + $order = new WC_Order( (int) $source_id ); + } catch ( Exception $e ) { + return $url; + } + + switch ( $payment->get_status() ) { + case PaymentStatus::CANCELLED: + case PaymentStatus::EXPIRED: + case PaymentStatus::FAILURE: + return WooCommerce::get_order_pay_url( $order ); + + case PaymentStatus::SUCCESS: + case PaymentStatus::OPEN: + default: + $gateway = new Gateway(); + + return $gateway->get_return_url( $order ); + } + } + + /** + * Add note when reserved payment is cancelled. + * + * @param Payment $payment Payment. + */ + public static function reservation_cancelled_note( Payment $payment ) { + $source_id = $payment->get_source_id(); + + $order = new WC_Order( (int) $source_id ); + + // Payment method title. + $payment_method_title = $payment->get_meta( 'woocommerce_payment_method_title' ); + + if ( empty( $payment_method_title ) ) { + $payment_method_title = WooCommerce::get_payment_method_title( $order ); + } + + $order->add_order_note( + sprintf( + '%s %s.', + $payment_method_title, + __( 'reserved payment cancelled', 'pronamic_ideal' ) + ) + ); + } + + /** + * Status update. + * + * @param Payment $payment Payment. + * @return void + */ + public static function status_update( Payment $payment ) { + $source_id = $payment->get_source_id(); + + /** + * Retrieve WooCommerce order from payment source ID, + * if no order is found return early. + * + * @link https://docs.woocommerce.com/wc-apidocs/function-wc_get_order.html + */ + $order = wc_get_order( $source_id ); + + if ( false === $order ) { + return; + } + + $new_status = null; + + /** + * Payment method title. + * + * The WooCommerce payment method title should be stored in the payment meta, + * if that is not the case we fallback to the payment method stored in the + * WooCommerce order. + */ + $payment_method_title = $payment->get_meta( 'woocommerce_payment_method_title' ); + + if ( empty( $payment_method_title ) ) { + $payment_method_title = WooCommerce::get_payment_method_title( $order ); + } + + /** + * Note. + */ + $note = sprintf( + /* translators: 1: payment URL, 2: payment ID, 3: WooCommerce payment method title, 4: Pronamic payment status */ + __( 'Payment #%2$s via "%3$s" updated to "%4$s".', 'pronamic_ideal' ), + esc_urL( $payment->get_edit_payment_url() ), + esc_html( $payment->get_id() ), + esc_html( $payment_method_title ), + esc_html( $payment->get_status_label() ) + ); + + /** + * Reservation. + * + * For a payment with status 'reserverd' we add an extra note to inform shop + * managers what to do. + */ + if ( PaymentStatus::RESERVED === $payment->get_status() ) { + $gateway = Plugin::get_gateway( $payment->get_config_id() ); + + if ( $gateway && $gateway->supports( 'reservation_payments' ) ) { + $note .= "\r\n"; + $note .= "\r\n"; + + $note .= sprintf( + /* translators: 1: payment URL, 2: payment ID */ + __( 'Create an invoice at payment gateway for payment #%2$s after processing the order.', 'pronamic_ideal' ), + esc_url( $payment->get_edit_payment_url() ), + esc_html( $payment->get_id() ) + ); + } + + $new_status = WooCommerce::ORDER_STATUS_PROCESSING; + } + + /** + * Expired or failed. + * + * WooCommerce PayPal gateway uses 'failed' order status for an 'expired' payment. + * + * @link https://plugins.trac.wordpress.org/browser/woocommerce/tags/1.5.4/classes/gateways/class-wc-paypal.php#L557. + */ + if ( in_array( $payment->get_status(), array( PaymentStatus::EXPIRED, PaymentStatus::FAILURE ), true ) ) { + $new_status = WooCommerce::ORDER_STATUS_FAILED; + } + + /** + * Add note and update status. + */ + $order->add_order_note( $note ); + + $is_pay_gateway = ( 'pronamic_' === substr( $order->get_payment_method(), 0, 9 ) ); + + if ( null !== $new_status && $is_pay_gateway ) { + // Only update status if order Pronamic payment ID is same as payment. + $order_payment_id = (int) $order->get_meta( '_pronamic_payment_id' ); + + if ( empty( $order_payment_id ) || $payment->get_id() === $order_payment_id ) { + $order->update_status( $new_status ); + } + } + + /** + * Subscriptions. + * + * For a failed payment we will let the related subscriptions know by calling + * the `payment_failed` function. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.4.7/includes/class-wc-subscription.php#L1661-L1694 + * + * @todo check if manually updating the subscription is still necessary. + */ + if ( PaymentStatus::FAILURE === $payment->get_status() ) { + $subscriptions = array(); + + if ( function_exists( 'wcs_order_contains_renewal' ) && wcs_order_contains_renewal( $order ) ) { + $subscriptions = wcs_get_subscriptions_for_renewal_order( $order ); + } + + foreach ( $subscriptions as $subscription ) { + $subscription->payment_failed(); + } + } + + /** + * Success. + */ + if ( PaymentStatus::SUCCESS === $payment->get_status() ) { + $order->payment_complete( $payment->get_transaction_id() ); + } + } + + /** + * Update subscription status when WooCommerce subscription is set on hold. + * + * @param $wcs_subscription + */ + public static function subscription_on_hold( $wcs_subscription ) { + $source_id = WooCommerce::subscription_source_id( $wcs_subscription ); + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $source_id ); + + if ( ! $subscription ) { + return; + } + + $note = sprintf( + /* translators: %s: extension name */ + __( '%s subscription on hold.', 'pronamic_ideal' ), + __( 'WooCommerce', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + $subscription->set_status( SubscriptionStatus::ON_HOLD ); + + $subscription->save(); + + $subscription->set_meta( 'next_payment', null ); + } + + /** + * Update subscription status and dates when WooCommerce subscription is reactivated. + * + * @param $wcs_subscription + */ + public static function subscription_reactivated( $wcs_subscription ) { + $source_id = WooCommerce::subscription_source_id( $wcs_subscription ); + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $source_id ); + + if ( ! $subscription ) { + return; + } + + $note = sprintf( + /* translators: %s: extension name */ + __( '%s subscription reactivated.', 'pronamic_ideal' ), + __( 'WooCommerce', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + $subscription->set_status( SubscriptionStatus::ACTIVE ); + + // Set next payment date. + $next_payment_date = new DateTime( '@' . $wcs_subscription->get_time( 'next_payment' ) ); + + $subscription->set_next_payment_date( $next_payment_date ); + $subscription->set_next_payment_delivery_date( $next_payment_date ); + + $subscription->set_expiry_date( $next_payment_date ); + + $subscription->save(); + } + + /** + * Update subscription status when WooCommerce subscription is cancelled. + * + * @param $wcs_subscription + */ + public static function subscription_cancelled( $wcs_subscription ) { + $source_id = WooCommerce::subscription_source_id( $wcs_subscription ); + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $source_id ); + + if ( ! $subscription ) { + return; + } + + $note = sprintf( + /* translators: %s: extension name */ + __( '%s subscription cancelled.', 'pronamic_ideal' ), + __( 'WooCommerce', 'pronamic_ideal' ) + ); + + $subscription->add_note( $note ); + + $subscription->set_status( SubscriptionStatus::CANCELLED ); + + $subscription->save(); + } + + /** + * Update subscription meta and dates when WooCommerce subscription is switched. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscription.php#L1174-L1186 + * + * @param WC_Order $order Order. + */ + public static function subscription_switch_completed( $order ) { + $subscriptions = wcs_get_subscriptions_for_order( $order ); + $wcs_subscription = array_pop( $subscriptions ); + + $source_id = WooCommerce::subscription_source_id( $wcs_subscription ); + + $subscription = get_pronamic_subscription_by_meta( '_pronamic_subscription_source_id', $source_id ); + + if ( empty( $subscription ) ) { + return; + } + + // Find subscription order item. + foreach ( $order->get_items() as $item ) { + $product = WooCommerce::get_order_item_product( $item ); + + if ( ! WC_Subscriptions_Product::is_subscription( $product ) ) { + continue; + } + + $start_date = new \DateTimeImmutable(); + + // Cancel all uncanceled phases. + foreach ( $subscription->get_phases() as $phase ) { + // Check if phase has already been completed. + if ( $phase->all_periods_created() ) { + continue; + } + + // Check if phase is already canceled. + $canceled_at = $phase->get_canceled_at(); + + if ( ! empty( $canceled_at ) ) { + continue; + } + + // Set start date for new phases (before setting canceled date). + $next_date = $phase->get_next_date(); + + if ( null !== $next_date ) { + $start_date = $next_date; + } + + // Set canceled date. + $phase->set_canceled_at( new \DateTimeImmutable() ); + } + + // Free trial phase. + $trial_length = WooCommerce::get_subscription_product_trial_length( $product ); + + if ( null !== $trial_length ) { + $trial_phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( + sprintf( + 'P%d%s', + $trial_length, + Core_Util::to_period( (string) WooCommerce::get_subscription_product_trial_period( $product ) ) + ) + ), + new TaxedMoney( 0, WooCommerce::get_currency() ) + ); + + $trial_phase->set_total_periods( 1 ); + $trial_phase->set_trial( true ); + + $subscription->add_phase( $trial_phase ); + + $start_date = $trial_phase->get_end_date(); + } + + // Regular phase. + $regular_phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( + \sprintf( + 'P%d%s', + WooCommerce::get_subscription_product_interval( $product ), + Core_Util::to_period( (string) WooCommerce::get_subscription_product_period( $product ) ) + ) + ), + new TaxedMoney( $wcs_subscription->get_total(), WooCommerce::get_currency() ) + ); + + $product_length = (int) WooCommerce::get_subscription_product_length( $product ); + + $regular_phase->set_total_periods( $product_length > 0 ? $product_length : null ); + + $subscription->add_phase( $regular_phase ); + + // Update dates. + $next_payment_date = new DateTime( '@' . $wcs_subscription->get_time( 'next_payment' ) ); + + $subscription->set_next_payment_date( $next_payment_date ); + $subscription->set_next_payment_delivery_date( $next_payment_date ); + + $subscription->set_expiry_date( $next_payment_date ); + + $subscription->save(); + } + } + + /** + * Register settings. + */ + public static function register_settings() { + // Date of birth checkout field. + register_setting( + 'pronamic_pay', + 'pronamic_pay_woocommerce_birth_date_field', + array( + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + register_setting( + 'pronamic_pay', + 'pronamic_pay_woocommerce_birth_date_field_enable', + array( + 'type' => 'boolean', + 'default' => false, + ) + ); + + // Gender checkout field. + register_setting( + 'pronamic_pay', + 'pronamic_pay_woocommerce_gender_field', + array( + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + register_setting( + 'pronamic_pay', + 'pronamic_pay_woocommerce_gender_field_enable', + array( + 'type' => 'boolean', + 'default' => false, + ) + ); + } + + /** + * Admin init. + */ + public static function admin_init() { + // Plugin settings - WooCommerce. + add_settings_section( + 'pronamic_pay_woocommerce', + __( 'WooCommerce', 'pronamic_ideal' ), + array( __CLASS__, 'settings_section' ), + 'pronamic_pay' + ); + + // Add settings fields. + add_settings_field( + 'pronamic_pay_woocommerce_birth_date_field', + __( 'Date of birth checkout field', 'pronamic_ideal' ), + array( __CLASS__, 'input_checkout_fields_select' ), + 'pronamic_pay', + 'pronamic_pay_woocommerce', + array( + 'label_for' => 'pronamic_pay_woocommerce_birth_date_field', + ) + ); + + add_settings_field( + 'pronamic_pay_woocommerce_birth_date_field_enable', + __( 'Add date of birth field', 'pronamic_ideal' ), + array( __CLASS__, 'input_checkbox' ), + 'pronamic_pay', + 'pronamic_pay_woocommerce', + array( + 'legend' => __( 'Add date of birth field', 'pronamic_ideal' ), + 'description' => __( 'Add date of birth field to billing checkout fields', 'pronamic_ideal' ), + 'label_for' => 'pronamic_pay_woocommerce_birth_date_field_enable', + 'classes' => 'regular-text', + 'type' => 'checkbox', + ) + ); + + add_settings_field( + 'pronamic_pay_woocommerce_gender_field', + __( 'Gender checkout field', 'pronamic_ideal' ), + array( __CLASS__, 'input_checkout_fields_select' ), + 'pronamic_pay', + 'pronamic_pay_woocommerce', + array( + 'label_for' => 'pronamic_pay_woocommerce_gender_field', + ) + ); + + add_settings_field( + 'pronamic_pay_woocommerce_gender_field_enable', + __( 'Add gender field', 'pronamic_ideal' ), + array( __CLASS__, 'input_checkbox' ), + 'pronamic_pay', + 'pronamic_pay_woocommerce', + array( + 'legend' => __( 'Add gender field', 'pronamic_ideal' ), + 'description' => __( 'Add gender field to billing checkout fields', 'pronamic_ideal' ), + 'label_for' => 'pronamic_pay_woocommerce_gender_field_enable', + 'classes' => 'regular-text', + 'type' => 'checkbox', + ) + ); + } + + /** + * Settings section. + * + * @param array $args Settings section arguments. + */ + public static function settings_section( $args ) { + switch ( $args['id'] ) { + case 'pronamic_pay_woocommerce': + echo '

    '; + + esc_html_e( + 'Extra fields are used for post-pay payment methods such as AfterPay and Klarna.', + 'pronamic_ideal' + ); + + echo '

    '; + + break; + } + } + + /** + * Input checkbox. + * + * @link https://github.com/WordPress/WordPress/blob/4.9.1/wp-admin/options-writing.php#L60-L68 + * @link https://github.com/WordPress/WordPress/blob/4.9.1/wp-admin/options-reading.php#L110-L141 + * @param array $args Arguments. + */ + public static function input_checkbox( $args ) { + $id = $args['label_for']; + $name = $args['label_for']; + $value = get_option( $name ); + $legend = $args['legend']; + + echo '
    '; + + printf( + '%s', + esc_html( $legend ) + ); + + printf( + ''; + + echo '
    '; + } + + /** + * Input element. + * + * @param array $args Arguments. + */ + public static function input_element( $args ) { + $defaults = array( + 'type' => 'text', + 'classes' => 'regular-text', + 'description' => '', + 'options' => array(), + ); + + $args = wp_parse_args( $args, $defaults ); + + $name = $args['label_for']; + $value = (string) get_option( $name ); + + $atts = array( + 'name' => $name, + 'id' => $name, + 'type' => $args['type'], + 'class' => $args['classes'], + 'value' => $value, + ); + + switch ( $args['type'] ) { + case 'select': + printf( + '', + // @codingStandardsIgnoreStart + Pay_Util::array_to_html_attributes( $atts ), + Pay_Util::select_options_grouped( $args['options'], $value ) + // @codingStandardsIgnoreEnd + ); + + break; + default: + printf( + '', + // @codingStandardsIgnoreStart + Pay_Util::array_to_html_attributes( $atts ) + // @codingStandardsIgnoreEnd + ); + } + + if ( ! empty( $args['description'] ) ) { + printf( + '

    %s

    ', + esc_html( $args['description'] ) + ); + } + } + + /** + * Select input with WooCommerce checkout fields. + * + * @param array $args Input element arguments. + * @return void + */ + public static function input_checkout_fields_select( $args ) { + $options = array( + array( + 'options' => array( + __( '— Select a checkout field —', 'pronamic_ideal' ), + ), + ), + ); + + // Get WooCommerce checkout fields. + try { + /** + * Do action `woocommerce_load_cart_from_session` here to prevent fatal error with non-empty cart during + * shutdown, caused by calling undefined (frontend) function `wc_get_cart_item_data_hash()`. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.3.1/includes/class-wc-cart.php#L609 + * @link https://github.com/woocommerce/woocommerce/blob/4.3.1/includes/class-wc-cart-session.php#L72 + * @since 2.1.4 + */ + \do_action( 'woocommerce_load_cart_from_session' ); + + $fields = WooCommerce::get_checkout_fields(); + } catch ( \Error $e ) { + $fields = array(); + } + + $options = array_merge( $options, $fields ); + + $args['type'] = 'select'; + $args['options'] = $options; + + self::input_element( $args ); + } + + /** + * Filter WooCommerce checkout fields. + * + * @param array $fields Checkout fields. + * + * @link https://docs.woocommerce.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/ + * + * @return array + */ + public static function checkout_fields( $fields ) { + // Add date of birth field if enabled. + $enable_birth_date_field = get_option( 'pronamic_pay_woocommerce_birth_date_field_enable' ); + + if ( $enable_birth_date_field ) { + $fields['billing']['pronamic_pay_birth_date'] = array( + 'type' => 'date', + 'label' => __( 'Date of birth', 'pronamic_ideal' ), + 'priority' => 110, + ); + } + + // Add gender field if enabled. + $enable_gender_field = get_option( 'pronamic_pay_woocommerce_gender_field_enable' ); + + if ( $enable_gender_field ) { + $fields['billing']['pronamic_pay_gender'] = array( + 'type' => 'select', + 'label' => __( 'Gender', 'pronamic_ideal' ), + 'priority' => 120, + 'options' => array( + '' => __( '— Select gender —', 'pronamic_ideal' ), + 'F' => __( 'Female', 'pronamic_ideal' ), + 'M' => __( 'Male', 'pronamic_ideal' ), + 'X' => __( 'Other', 'pronamic_ideal' ), + ), + ); + } + + // Make fields required. + $required = array( + get_option( 'pronamic_pay_woocommerce_birth_date_field' ), + get_option( 'pronamic_pay_woocommerce_gender_field' ), + ); + + $required = array_filter( $required ); + + if ( ! empty( $required ) ) { + foreach ( $fields as &$fieldset ) { + foreach ( $fieldset as $field_key => &$field ) { + if ( ! in_array( $field_key, $required, true ) ) { + continue; + } + + $field['required'] = true; + } + } + } + + return $fields; + } + + /** + * Checkout update order meta. + * + * @param int $order_id Order ID. + * @param array $posted Posted checkout data. + */ + public static function checkout_update_order_meta( $order_id, $posted ) { + $fields = array( + 'pronamic_pay_gender' => '_pronamic_pay_gender', + 'pronamic_pay_birth_date' => '_pronamic_pay_birth_date', + ); + + foreach ( $fields as $field_id => $meta_key ) { + if ( ! filter_has_var( INPUT_POST, $field_id ) ) { + continue; + } + + $meta_value = filter_input( INPUT_POST, $field_id, FILTER_SANITIZE_STRING ); + + update_post_meta( $order_id, $meta_key, $meta_value ); + } + } + + /** + * Filter currencies. + * + * @param array $currencies Available currencies. + * + * @return mixed + */ + public static function currencies( $currencies ) { + if ( PaymentMethods::is_active( PaymentMethods::GULDEN ) ) { + $currencies['NLG'] = PaymentMethods::get_name( PaymentMethods::GULDEN ); + } + + return $currencies; + } + + /** + * Filter currency symbol. + * + * @param string $symbol Symbol. + * @param string $currency Currency. + * + * @return string + */ + public static function currency_symbol( $symbol, $currency ) { + if ( 'NLG' === $currency ) { + return 'G'; + } + + return $symbol; + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public static function source_text( $text, Payment $payment ) { + $text = __( 'WooCommerce', 'pronamic_ideal' ) . '
    '; + + // Check order post meta for order number. + $order_number = '#' . $payment->source_id; + + $value = get_post_meta( $payment->source_id, '_order_number', true ); + + if ( ! empty( $value ) ) { + $order_number = $value; + } + + $text .= sprintf( + '%s', + get_edit_post_link( $payment->source_id ), + /* translators: %s: order number */ + sprintf( __( 'Order %s', 'pronamic_ideal' ), $order_number ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Payment. + * + * @return string + */ + public static function source_description( $description, Payment $payment ) { + return __( 'WooCommerce Order', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return null|string + */ + public static function source_url( $url, Payment $payment ) { + return get_edit_post_link( $payment->source_id ); + } + + /** + * Subscription source text. + * + * @param string $text Source text. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public static function subscription_source_text( $text, Subscription $subscription ) { + $text = __( 'WooCommerce', 'pronamic_ideal' ) . '
    '; + + // Check order post meta for order number. + $source_id = (int) $subscription->get_source_id(); + + $order_number = sprintf( '#%s', $source_id ); + + $value = get_post_meta( $source_id, '_order_number', true ); + + if ( ! empty( $value ) ) { + $order_number = $value; + } + + $text .= sprintf( + '%s', + get_edit_post_link( $source_id ), + /* translators: %s: order number */ + sprintf( __( 'Order %s', 'pronamic_ideal' ), $order_number ) + ); + + return $text; + } + + /** + * Subscription source description. + * + * @param string $description Source description. + * @param Subscription $subscription Subscription. + * + * @return string + */ + public static function subscription_source_description( $description, Subscription $subscription ) { + return __( 'WooCommerce Order', 'pronamic_ideal' ); + } + + /** + * Subscription source URL. + * + * @param string $url Source URL. + * @param Subscription $subscription Subscription. + * + * @return null|string + */ + public static function subscription_source_url( $url, Subscription $subscription ) { + return get_edit_post_link( (int) $subscription->source_id ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/Gateway.php new file mode 100644 index 00000000..2dc9a708 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/Gateway.php @@ -0,0 +1,1099 @@ +args = wp_parse_args( + $args, + array( + 'id' => null, + 'method_title' => null, + 'method_description' => null, + // Custom. + 'payment_method' => null, + 'icon' => null, + ) + ); + + $this->id = isset( $this->args['id'] ) ? $this->args['id'] : static::ID; + + if ( isset( $this->args['payment_method'] ) ) { + $this->payment_method = $this->args['payment_method']; + } + + $this->method_title = $this->args['method_title']; + + if ( null === $this->method_title ) { + $this->method_title = sprintf( + /* translators: 1: Gateway admin label prefix, 2: Gateway admin label */ + __( '%1$s - %2$s', 'pronamic_ideal' ), + __( 'Pronamic', 'pronamic_ideal' ), + PaymentMethods::get_name( $this->payment_method, __( 'Pronamic', 'pronamic_ideal' ) ) + ); + } + + if ( isset( $this->args['method_description'] ) ) { + $this->method_description = $this->args['method_description']; + } + + /** + * Set order button text if payment method is known. + * + * @since 1.2.7 + */ + if ( null !== $this->payment_method ) { + $this->order_button_text = sprintf( + /* translators: %s: payment method title */ + __( 'Proceed to %s', 'pronamic_ideal' ), + PaymentMethods::get_name( $this->payment_method, __( 'Pronamic', 'pronamic_ideal' ) ) + ); + } + + // Load the form fields. + $this->init_form_fields(); + + // Load the settings. + $this->init_settings(); + + // Define user set variables. + $this->icon = $this->get_pronamic_option( 'icon' ); + $this->title = $this->get_pronamic_option( 'title' ); + $this->description = $this->get_pronamic_option( 'description' ); + $this->enabled = $this->get_pronamic_option( 'enabled' ); + $this->config_id = $this->get_pronamic_option( 'config_id' ); + $this->payment_description = $this->get_pronamic_option( 'payment_description' ); + + // Actions. + $update_action = 'woocommerce_update_options_payment_gateways_' . $this->id; + + if ( WooCommerce::version_compare( '2.0.0', '<' ) ) { + $update_action = 'woocommerce_update_options_payment_gateways'; + } + + add_action( $update_action, array( $this, 'process_admin_options' ) ); + + add_action( 'woocommerce_after_checkout_validation', array( $this, 'after_checkout_validation' ), 10, 2 ); + + // Has fields? + $gateway = Plugin::get_gateway( $this->config_id ); + + if ( $gateway ) { + $first_payment_method = PaymentMethods::get_first_payment_method( $this->payment_method ); + + $gateway->set_payment_method( $first_payment_method ); + + $this->input_fields = $gateway->get_input_fields(); + + $fields = $this->get_input_fields(); + + if ( ! empty( $fields ) ) { + $this->has_fields = true; + } + } + } + + /** + * Get Pronamic option + * + * The WooCommerce settings API only have an 'get_option' function in + * WooCommerce version 2 or higher. + * + * @link https://github.com/woothemes/woocommerce/blob/v2.0.0/classes/abstracts/abstract-wc-settings-api.php#L130 + * + * @param string $key Option key. + * + * @return mixed + */ + public function get_pronamic_option( $key ) { + $value = false; + + if ( method_exists( $this, 'get_option' ) ) { + $value = parent::get_option( $key ); + } elseif ( isset( $this->settings[ $key ] ) ) { + $value = $this->settings[ $key ]; + } + + return $value; + } + + /** + * Initialise form fields + */ + public function init_form_fields() { + $description_prefix = ''; + + if ( WooCommerce::version_compare( '2.0.0', '<' ) ) { + $description_prefix = '
    '; + } + + $this->form_fields = array( + 'enabled' => array( + 'title' => __( 'Enable/Disable', 'pronamic_ideal' ), + 'type' => 'checkbox', + 'label' => sprintf( + /* translators: %s: payment method title */ + __( 'Enable %s', 'pronamic_ideal' ), + $this->method_title + ), + 'default' => 'no', + ), + 'title' => array( + 'title' => __( 'Title', 'pronamic_ideal' ), + 'type' => 'text', + 'description' => $description_prefix . __( 'This controls the title which the user sees during checkout.', 'pronamic_ideal' ), + 'default' => PaymentMethods::get_name( $this->payment_method, __( 'Pronamic', 'pronamic_ideal' ) ), + ), + 'description' => array( + 'title' => __( 'Description', 'pronamic_ideal' ), + 'type' => 'textarea', + 'description' => $description_prefix . sprintf( + /* translators: %s: payment method title */ + __( 'Give the customer instructions for paying via %s, and let them know that their order won\'t be shipping until the money is received.', 'pronamic_ideal' ), + $this->method_title + ), + 'default' => '', + ), + 'icon' => array( + 'title' => __( 'Icon', 'pronamic_ideal' ), + 'type' => 'text', + 'description' => sprintf( + '%s%s', + $description_prefix, + __( 'This controls the icon which the user sees during checkout.', 'pronamic_ideal' ) + ), + 'default' => '', + ), + 'config_id' => array( + 'title' => __( 'Configuration', 'pronamic_ideal' ), + 'type' => 'select', + 'default' => get_option( 'pronamic_pay_config_id' ), + 'options' => Plugin::get_config_select_options( $this->payment_method ), + ), + 'payment' => array( + 'title' => __( 'Payment Options', 'pronamic_ideal' ), + 'type' => 'title', + 'description' => '', + ), + 'payment_description' => array( + 'title' => __( 'Payment Description', 'pronamic_ideal' ), + 'type' => 'text', + 'description' => sprintf( + '%s%s
    %s
    %s', + $description_prefix, + __( 'This controls the payment description.', 'pronamic_ideal' ), + /* translators: %s: default code */ + sprintf( __( 'Default: %s', 'pronamic_ideal' ), __( 'Order {order_number}', 'pronamic_ideal' ) ), + /* translators: %s: tags */ + sprintf( __( 'Tags: %s', 'pronamic_ideal' ), sprintf( '%s %s %s', '{order_number}', '{order_date}', '{blogname}' ) ) + ), + 'default' => __( 'Order {order_number}', 'pronamic_ideal' ), + ), + ); + + if ( isset( $this->args['icon'] ) ) { + $this->form_fields['icon']['default'] = $this->args['icon']; + + $this->form_fields['icon']['description'] = sprintf( + '%s%s
    %s', + $description_prefix, + __( 'This controls the icon which the user sees during checkout.', 'pronamic_ideal' ), + /* translators: %s: default code */ + sprintf( __( 'Default: %s', 'pronamic_ideal' ), $this->form_fields['icon']['default'] ) + ); + } + + if ( isset( $this->args['form_fields'] ) && is_array( $this->args['form_fields'] ) ) { + foreach ( $this->args['form_fields'] as $name => $field ) { + if ( ! isset( $this->form_fields[ $name ] ) ) { + $this->form_fields[ $name ] = array(); + } + + foreach ( $field as $key => $value ) { + $this->form_fields[ $name ][ $key ] = $value; + } + } + } + } + + /** + * Process the payment and return the result. + * + * @param string $order_id WooCommerce order ID. + * + * @return array + */ + public function process_payment( $order_id ) { + // Gateway. + $gateway = Plugin::get_gateway( $this->config_id ); + + if ( null === $gateway ) { + $notice = __( 'The payment gateway could not be found.', 'pronamic_ideal' ); + + if ( current_user_can( 'manage_options' ) && empty( $this->config_id ) ) { + // @link https://github.com/woothemes/woocommerce/blob/v2.1.5/includes/admin/settings/class-wc-settings-page.php#L66 + $notice = sprintf( + /* translators: %s: WooCommerce checkout settings URL */ + __( 'You have to select an gateway configuration on the WooCommerce checkout settings page.', 'pronamic_ideal' ), + add_query_arg( + array( + 'page' => 'wc-settings', + 'tab' => 'checkout', + 'section' => sanitize_title( __CLASS__ ), + ), + admin_url( 'admin.php' ) + ) + ); + } + + WooCommerce::add_notice( $notice, 'error' ); + + return array( 'result' => 'failure' ); + } + + // Order. + $order = wc_get_order( $order_id ); + + // Make sure this is a valid order. + if ( ! ( $order instanceof \WC_Order ) ) { + return array( 'result' => 'failure' ); + } + + // Blog name. + $blogname = get_option( 'blogname' ); + + if ( empty( $blogname ) ) { + $blogname = ''; + } + + // @link https://github.com/WordPress/WordPress/blob/3.8.1/wp-includes/pluggable.php#L1085. + // The blogname option is escaped with `esc_html` on the way into the database in sanitize_option + // we want to reverse this for the gateways. + $blogname = wp_specialchars_decode( $blogname, ENT_QUOTES ); + + // Title. + $title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + sprintf( + /* translators: %s: order id */ + __( 'WooCommerce order %s', 'pronamic_ideal' ), + $order->get_order_number() + ) + ); + + // Description. + // @link https://github.com/woothemes/woocommerce/blob/v2.0.19/classes/emails/class-wc-email-new-order.php. + $replacements = array( + '{blogname}' => $blogname, + '{site_title}' => $blogname, + '{order_date}' => date_i18n( WooCommerce::get_date_format(), WooCommerce::get_order_date( $order ) ), + '{order_number}' => $order->get_order_number(), + ); + + if ( empty( $this->payment_description ) ) { + $this->payment_description = $this->form_fields['payment_description']['default']; + } + + $description = strtr( $this->payment_description, $replacements ); + + // Contact. + $contact_name = new ContactName(); + $contact_name->set_first_name( WooCommerce::get_billing_first_name( $order ) ); + $contact_name->set_last_name( WooCommerce::get_billing_last_name( $order ) ); + + $customer = new Customer(); + $customer->set_name( $contact_name ); + $customer->set_email( WooCommerce::get_billing_email( $order ) ); + $customer->set_phone( WooCommerce::get_billing_phone( $order ) ); + + // Company name. + $company_name = WooCommerce::get_billing_company( $order ); + + if ( ! empty( $company_name ) ) { + $customer->set_company_name( $company_name ); + } + + // Customer gender. + $gender = filter_input( INPUT_POST, $this->id . '_gender', FILTER_SANITIZE_STRING ); + + $gender_field = get_option( 'pronamic_pay_woocommerce_gender_field' ); + + if ( ! empty( $gender_field ) ) { + $gender = $order->get_meta( '_' . $gender_field, true ); + } + + if ( ! empty( $gender ) ) { + $customer->set_gender( $gender ); + } + + // Customer birth date. + $birth_date = filter_input( INPUT_POST, $this->id . '_birth_date', FILTER_SANITIZE_STRING ); + + $birth_date_field = get_option( 'pronamic_pay_woocommerce_birth_date_field' ); + + if ( ! empty( $birth_date_field ) ) { + $birth_date = $order->get_meta( '_' . $birth_date_field, true ); + } + + if ( ! empty( $birth_date ) ) { + $customer->set_birth_date( new DateTime( $birth_date ) ); + } + + // Billing address. + $billing_address = new Address(); + $billing_address->set_name( $contact_name ); + $billing_address->set_company_name( WooCommerce::get_billing_company( $order ) ); + $billing_address->set_line_1( WooCommerce::get_billing_address_1( $order ) ); + $billing_address->set_line_2( WooCommerce::get_billing_address_2( $order ) ); + $billing_address->set_postal_code( WooCommerce::get_billing_postcode( $order ) ); + $billing_address->set_city( WooCommerce::get_billing_city( $order ) ); + $billing_address->set_email( WooCommerce::get_billing_email( $order ) ); + $billing_address->set_phone( WooCommerce::get_billing_phone( $order ) ); + + $region = new Region(); + + $region->set_code( WooCommerce::get_billing_state( $order ) ); + + $billing_address->set_region( $region ); + + $billing_country = WooCommerce::get_billing_country( $order ); + + if ( ! empty( $billing_country ) ) { + $billing_address->set_country_code( $billing_country ); + } + + // Shipping address. + $shipping_name = new ContactName(); + $shipping_name->set_first_name( WooCommerce::get_shipping_first_name( $order ) ); + $shipping_name->set_last_name( WooCommerce::get_shipping_last_name( $order ) ); + + $shipping_address = new Address(); + $shipping_address->set_name( $shipping_name ); + $shipping_address->set_company_name( WooCommerce::get_shipping_company( $order ) ); + $shipping_address->set_line_1( WooCommerce::get_shipping_address_1( $order ) ); + $shipping_address->set_line_2( WooCommerce::get_shipping_address_2( $order ) ); + $shipping_address->set_postal_code( WooCommerce::get_shipping_postcode( $order ) ); + $shipping_address->set_city( WooCommerce::get_shipping_city( $order ) ); + $shipping_address->set_region( WooCommerce::get_shipping_state( $order ) ); + $shipping_address->set_email( WooCommerce::get_shipping_email( $order ) ); + $shipping_address->set_phone( WooCommerce::get_shipping_phone( $order ) ); + + $shipping_country = WooCommerce::get_shipping_country( $order ); + + if ( ! empty( $shipping_country ) ) { + $shipping_address->set_country_code( $shipping_country ); + } + + // Issuer. + $issuer = filter_input( INPUT_POST, $this->id . '_issuer_id', FILTER_SANITIZE_STRING ); + + $payment = new Payment(); + + /* + * An '#' character can result in the following iDEAL error: + * code = SO1000 + * message = Failure in system + * detail = System generating error: issuer + * consumer_message = Paying with iDEAL is not possible. Please try again later or pay another way. + * + * Or in case of Sisow: + * + * + * TA3230 + * No purchaseid + * + * + * + * @link http://wcdocs.woothemes.com/user-guide/extensions/functionality/sequential-order-numbers/#add-compatibility + * + * @see page 30 http://pronamic.nl/wp-content/uploads/2012/09/iDEAL-Merchant-Integratie-Gids-NL.pdf + * + * The use of characters that are not listed above will not lead to a refusal of a batch or post, but the + * character will be changed by Equens (formerly Interpay) to a space, question mark or asterisk. The + * same goes for diacritical characters (à, ç, ô, ü, ý etcetera). + */ + $payment->order_id = str_replace( '#', '', $order->get_order_number() ); + + $payment->title = $title; + $payment->description = $description; + $payment->config_id = $this->config_id; + $payment->user_id = $order->get_user_id(); + $payment->source = Extension::SLUG; + $payment->source_id = WooCommerce::get_order_id( $order ); + $payment->method = $this->payment_method; + $payment->issuer = $issuer; + $payment->recurring = $this->is_recurring; + $payment->subscription = $this->get_payment_subscription( $order ); + $payment->subscription_id = $this->get_payment_subscription_id( $order ); + $payment->subscription_source_id = $this->get_payment_subscription_source_id( $order ); + + $payment->set_customer( $customer ); + $payment->set_billing_address( $billing_address ); + $payment->set_shipping_address( $shipping_address ); + + $amount = WooCommerce::get_order_total( $order ); + $tax_amount = WooCommerce::get_order_total_tax( $order ); + $shipping_amount = WooCommerce::get_order_shipping_total( $order ); + + /* + * WooCommerce Deposits remaining amount. + * @since 1.1.6 + */ + if ( WooCommerce::order_has_status( $order, 'partially-paid' ) && isset( $order->wc_deposits_remaining ) ) { + $amount = $order->wc_deposits_remaining; + $tax_amount = null; + $shipping_amount = null; + } + + /* + * WooCommerce Subscriptions switch order. + */ + if ( $this->is_recurring && WooCommerce::is_subscriptions_active() && wcs_order_contains_switch( $order ) ) { + // Use parent order total as amount for switches. + $wc_subscriptions = wcs_get_subscriptions_for_order( $order, array( 'order_type' => 'any' ) ); + + $wc_subscription = array_pop( $wc_subscriptions ); + + $parent_order = WooCommerce::get_subscription_parent_order( $wc_subscription ); + + $amount = WooCommerce::get_order_total( $parent_order ); + $tax_amount = WooCommerce::get_order_total_tax( $parent_order ); + $shipping_amount = WooCommerce::get_order_shipping_total( $parent_order ); + } + + // Set shipping amount. + $payment->set_shipping_amount( + new Money( + $shipping_amount, + WooCommerce::get_currency() + ) + ); + + // Set total amount. + $payment->set_total_amount( + new TaxedMoney( + $amount, + WooCommerce::get_currency(), + $tax_amount + ) + ); + + /* + * Payment lines and order items. + * + * WooCommerce has multiple order item types: + * `line_item`, `fee`, `shipping`, `tax`, `coupon` + * @link https://github.com/woocommerce/woocommerce/search?q=%22extends+WC_Order_Item%22 + * + * For now we handle only the `line_item`, `fee` and `shipping` items, + * we consciously don't handle the `tax` and `coupon` items. + * + * **Order item `coupon`** + * Coupon items are also applied to the `line_item` item and line total. + * @link https://basecamp.com/1810084/projects/10966871/todos/372490988 + * + * **Order item `tax`** + * Tax items are also applied to the `line_item` item and line total. + */ + $items = $order->get_items( array( 'line_item', 'fee', 'shipping' ) ); + + $payment->lines = new PaymentLines(); + + foreach ( $items as $item_id => $item ) { + $line = $payment->lines->new_line(); + + $type = OrderItemType::transform( $item ); + + // Quantity. + $quantity = wc_stock_amount( $item['qty'] ); + + if ( PaymentLineType::SHIPPING === $type ) { + $quantity = 1; + } + + // Set line properties. + $line->set_id( $item_id ); + $line->set_sku( WooCommerce::get_order_item_sku( $item ) ); + $line->set_type( $type ); + $line->set_name( $item['name'] ); + $line->set_quantity( $quantity ); + $line->set_unit_price( new TaxedMoney( $order->get_item_total( $item, true ), WooCommerce::get_currency(), $order->get_item_tax( $item ) ) ); + $line->set_total_amount( new TaxedMoney( $order->get_line_total( $item, true ), WooCommerce::get_currency(), $order->get_line_tax( $item ) ) ); + $line->set_product_url( WooCommerce::get_order_item_url( $item ) ); + $line->set_image_url( WooCommerce::get_order_item_image( $item ) ); + $line->set_product_category( WooCommerce::get_order_item_category( $item ) ); + } + + // Start payment. + $subscription = $payment->get_subscription(); + + try { + if ( $this->is_recurring ) { + if ( null === $subscription ) { + return array( 'result' => 'failure' ); + } + + $this->payment = pronamic_pay_plugin()->subscriptions_module->start_payment( $payment ); + } else { + // Add new subscription period to payment. + if ( null !== $subscription ) { + $payment->add_period( $subscription->new_period() ); + } + + // Start payment. + $this->payment = Plugin::start_payment( $payment ); + } + } catch ( \Exception $exception ) { + WooCommerce::add_notice( Plugin::get_default_error_message(), 'error' ); + + /** + * We will rethrow the exception so WooCommerce can also handle the exception. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.7.1/includes/class-wc-checkout.php#L1129-L1131 + */ + throw $exception; + } + + // Store WooCommerce gateway in payment meta. + $this->payment->set_meta( 'woocommerce_payment_method', $order->get_payment_method() ); + $this->payment->set_meta( 'woocommerce_payment_method_title', $order->get_payment_method_title() ); + + // Store payment ID in WooCommerce order meta. + $order->update_meta_data( '_pronamic_payment_id', $payment->get_id() ); + $order->save(); + + $error = $gateway->get_error(); + + // Set subscription payment method on renewal to account for changed payment method. + if ( WooCommerce::is_subscriptions_active() && wcs_order_contains_renewal( $order ) ) { + $subscriptions = wcs_get_subscriptions_for_renewal_order( $order ); + + foreach ( $subscriptions as $wcs_subscription ) { + $wcs_subscription->set_payment_method( $this->id ); + $wcs_subscription->save(); + } + } + + // Set payment start and end date on subscription switch. + if ( WooCommerce::is_subscriptions_active() && wcs_order_contains_switch( $order ) && null !== $subscription ) { + $subscriptions = wcs_get_subscriptions_for_order( $order ); + + $wcs_subscription = array_pop( $subscriptions ); + + $start_date = new DateTime( '@' . $wcs_subscription->get_time( 'start_date' ) ); + + $this->payment->start_date = $start_date; + + $end_date = clone $start_date; + + foreach ( $order->get_items() as $item ) { + $product = WooCommerce::get_order_item_product( $item ); + + // Check for product (only items of type `line_item` have products). + if ( null === $product ) { + continue; + } + + if ( ! WC_Subscriptions_Product::is_subscription( $product ) ) { + continue; + } + + $end_date->add( + new \DateInterval( + sprintf( + 'P%d%s', + WooCommerce::get_subscription_product_interval( $product ), + Util::to_period( (string) WooCommerce::get_subscription_product_period( $product ) ) + ) + ) + ); + + break; + } + + $this->payment->end_date = $end_date; + + $this->payment->save(); + } + + if ( is_wp_error( $error ) ) { + WooCommerce::add_notice( Plugin::get_default_error_message(), 'error' ); + + foreach ( $error->get_error_messages() as $message ) { + WooCommerce::add_notice( $message, 'error' ); + } + + // Remove subscription next payment date for recurring payments. + if ( isset( $subscription ) ) { + $subscription->set_meta( 'next_payment', null ); + } + + // @link https://github.com/woothemes/woocommerce/blob/v1.6.6/woocommerce-functions.php#L518 + // @link https://github.com/woothemes/woocommerce/blob/v2.1.5/includes/class-wc-checkout.php#L669 + return array( 'result' => 'failure' ); + } + + // Reload order for actual status (could be paid already; i.e. through recurring credit card payment). + $order = \wc_get_order( $order ); + + // Order note and status. + $new_status_slug = WooCommerce::ORDER_STATUS_PENDING; + + $note = __( 'Awaiting payment.', 'pronamic_ideal' ); + + $order_status = WooCommerce::order_get_status( $order ); + + // Only add order note if status is already pending or if WooCommerce Deposits is activated. + if ( $new_status_slug === $order_status || isset( $order->wc_deposits_remaining ) ) { + $order->add_order_note( $note ); + } elseif ( PaymentStatus::SUCCESS !== $payment->get_status() ) { + // Mark as pending (we're awaiting the payment). + $order->update_status( $new_status_slug, $note ); + } + + // Return results array. + return array( + 'result' => 'success', + 'redirect' => $this->payment->get_pay_redirect_url(), + ); + } + + /** + * Process WooCommerce Subscriptions payment. + * + * @param float $amount Subscription payment amount. + * @param WC_Order $order WooCommerce order. + * + * @throws \WC_Data_Exception Throws exception when invalid order data is found. + */ + public function process_subscription_payment( $amount, $order ) { + // Set recurring payment indicator. + $this->is_recurring = true; + + // Order ID. + $order_id = WooCommerce::get_order_id( $order ); + + // Get subscriptions for order. + $subscriptions = wcs_get_subscriptions_for_order( + $order_id, + array( + 'order_type' => 'any', + ) + ); + + // Process payments for subscriptions. + foreach ( $subscriptions as $subscription ) { + // Skip manual renewal subscriptions. + if ( $subscription->is_manual() ) { + continue; + } + + // Set order payment method. + $payment_method = WooCommerce::get_subscription_payment_method( $subscription ); + + $order->set_payment_method( $payment_method ); + + // Process payment. + $this->process_payment( $order_id ); + + // Update payment. + if ( $this->payment ) { + Plugin::update_payment( $this->payment, false ); + } + } + } + + /** + * Get payment subscription. + * + * @since 1.2.1 + * @see https://github.com/woothemes/woocommerce/blob/v2.1.3/includes/abstracts/abstract-wc-payment-gateway.php#L52 + * @see https://github.com/wp-premium/woocommerce-subscriptions/blob/2.0.18/includes/class-wc-subscriptions-renewal-order.php#L371-L398 + * + * @param WC_Order $order WooCommerce order. + * + * @return Subscription|null + */ + public function get_payment_subscription( WC_Order $order ) { + if ( ! WooCommerce::is_subscriptions_active() ) { + return null; + } + + // Get existing subscription for recurring payments. + if ( $this->is_recurring ) { + $subscription_id = $this->get_payment_subscription_id( $order ); + + if ( null !== $subscription_id ) { + return get_pronamic_subscription( $subscription_id ); + } + } + + // Get subscriptions for order. + $subscriptions = wcs_get_subscriptions_for_order( $order, array( 'order_type' => 'any' ) ); + + if ( empty( $subscriptions ) ) { + return null; + } + + // Find subscription product order line item. + foreach ( $order->get_items() as $item ) { + $product = WooCommerce::get_order_item_product( $item ); + + // Check for product (only items of type `line_item` have products). + if ( null === $product ) { + continue; + } + + if ( ! WC_Subscriptions_Product::is_subscription( $product ) ) { + continue; + } + + // Amount. + $amount = WooCommerce::get_subscription_product_price( $product ); + + if ( $this->is_recurring ) { + // Use order total as amount for renewal orders. + $amount = WooCommerce::get_order_total( $order ); + } + + if ( wcs_order_contains_switch( $order ) ) { + // Use parent order total as amount for switches. + $wc_subscription = array_pop( $subscriptions ); + + $parent_order = WooCommerce::get_subscription_parent_order( $wc_subscription ); + + if ( null !== $parent_order ) { + $amount = $parent_order->get_total(); + } + } + + // Check for valid amount. + if ( null === $amount ) { + continue; + } + + // Subscription. + $subscription = new Subscription(); + + $start_date = new \DateTimeImmutable(); + + // Free trial phase. + $trial_length = WooCommerce::get_subscription_product_trial_length( $product ); + + if ( null !== $trial_length ) { + $trial_phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( + sprintf( + 'P%d%s', + $trial_length, + Util::to_period( (string) WooCommerce::get_subscription_product_trial_period( $product ) ) + ) + ), + new TaxedMoney( 0, WooCommerce::get_currency() ) + ); + + $trial_phase->set_total_periods( 1 ); + $trial_phase->set_trial( true ); + + $subscription->add_phase( $trial_phase ); + + $start_date = $trial_phase->get_end_date(); + } + + // Regular phase. + $regular_phase = new SubscriptionPhase( + $subscription, + $start_date, + new SubscriptionInterval( + sprintf( + 'P%d%s', + WooCommerce::get_subscription_product_interval( $product ), + Util::to_period( (string) WooCommerce::get_subscription_product_period( $product ) ) + ) + ), + new TaxedMoney( $amount, WooCommerce::get_currency() ) + ); + + $product_length = (int) WooCommerce::get_subscription_product_length( $product ); + + $regular_phase->set_total_periods( $product_length > 0 ? $product_length : null ); + + $subscription->add_phase( $regular_phase ); + + // Description. + $subscription->description = sprintf( + 'Order #%s - %s', + WooCommerce::get_order_id( $order ), + $product->get_title() + ); + + return $subscription; + } + + return null; + } + + /** + * Get payment subscription ID. + * + * @param WC_Order $order WooCommerce order. + * + * @return string|null + */ + public function get_payment_subscription_id( WC_Order $order ) { + $subscription_source_id = $this->get_payment_subscription_source_id( $order ); + + $payment = get_pronamic_payment_by_meta( '_pronamic_payment_source_id', $subscription_source_id ); + + if ( ! empty( $payment ) ) { + return $payment->get_meta( 'subscription_id' ); + } + + return null; + } + + /** + * Get payment subscription source ID. + * + * @since 1.2.1 + * + * @param WC_Order $order WooCommerce order. + * + * @return string + */ + public function get_payment_subscription_source_id( WC_Order $order ) { + // Prevent returning a source ID for payments that should not have one. + if ( ! $this->is_recurring && null === $this->get_payment_subscription( $order ) ) { + return false; + } + + // Get subscriptions for renewal and switch orders. + $subscriptions = wcs_get_subscriptions_for_order( + WooCommerce::get_order_id( $order ), + array( + 'order_type' => array( + 'renewal', + 'switch', + ), + ) + ); + + // Return parent order ID for renewal and switch orders. + foreach ( $subscriptions as $wc_subscription ) { + $parent_order = WooCommerce::get_subscription_parent_order( $wc_subscription ); + + if ( null === $parent_order ) { + continue; + } + + return WooCommerce::get_order_id( $parent_order ); + } + + // Return order ID. + return WooCommerce::get_order_id( $order ); + } + + /** + * Payment fields + * + * @link https://github.com/woothemes/woocommerce/blob/v1.6.6/templates/checkout/form-pay.php#L66 + */ + public function payment_fields() { + // @link https://github.com/woothemes/woocommerce/blob/v1.6.6/classes/gateways/class-wc-payment-gateway.php#L181 + parent::payment_fields(); + + $input_fields = $this->get_input_fields(); + + if ( empty( $input_fields ) ) { + return; + } + + // Print fields. + $this->print_fields( $input_fields ); + } + + + /** + * Filtered payment fields. + * + * @return array + */ + public function get_input_fields() { + $fields = $this->input_fields; + + if ( empty( $fields ) ) { + return null; + } + + // Prevent duplicate input fields, by removing fields for which + // a checkout field has been set in plugin settings. + $remove_fields = array( + 'pronamic_pay_gender' => get_option( 'pronamic_pay_woocommerce_gender_field' ), + 'pronamic_pay_birth_date' => get_option( 'pronamic_pay_woocommerce_birth_date_field' ), + ); + + foreach ( $remove_fields as $field_id => $field_setting ) { + if ( empty( $field_setting ) ) { + continue; + } + + // Field setting has been set, filter input fields. + $fields = wp_list_filter( $fields, array( 'id' => $field_id ), 'NOT' ); + } + + return $fields; + } + + /** + * Print the specified fields. + * + * @param array $fields Fields to print. + */ + public function print_fields( $fields ) { + $input_ids = array( + 'pronamic_ideal_issuer_id' => 'issuer_id', + 'pronamic_credit_card_issuer_id' => 'issuer_id', + 'pronamic_pay_gender' => 'gender', + 'pronamic_pay_birth_date' => 'birth_date', + ); + + foreach ( $fields as &$field ) { + if ( ! isset( $field['id'] ) ) { + continue; + } + + if ( 'pronamic_' !== substr( $field['id'], 0, 9 ) ) { + continue; + } + + foreach ( $input_ids as $input_id => $input_id_suffix ) { + if ( $input_id !== $field['id'] ) { + continue; + } + + $field['id'] = sprintf( '%1$s_%2$s', $this->id, $input_id_suffix ); + $field['name'] = $field['id']; + + if ( isset( $field['required'] ) && $field['required'] ) { + $field['label'] = sprintf( '%s *', $field['label'] ); + } + } + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo Util::input_fields_html( $fields ); + } + + /** + * Validate required payment method input fields after checkout. + * + * @param array $data Posted data. + * @param \WP_Error $errors Checkout validation errors. + */ + public function after_checkout_validation( $data, $errors ) { + if ( ! isset( $data['payment_method'] ) || $this->id !== $data['payment_method'] ) { + return; + } + + $input_ids = array( + 'gender', + 'birth_date', + ); + + foreach ( $input_ids as $input_id ) { + $input_name = sprintf( '%s_%s', $this->id, $input_id ); + + if ( ! filter_has_var( INPUT_POST, $input_name ) ) { + continue; + } + + $input_value = filter_input( INPUT_POST, $input_name, FILTER_SANITIZE_STRING ); + + // Add error for empty input value. + if ( empty( $input_value ) ) { + $error = sprintf( + /* translators: %s: payment method title */ + __( 'A required field for the %s payment method is empty.', 'pronamic_ideal' ), + $this->method_title + ); + + $errors->add( $this->id, $error ); + } + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/OrderItemType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/OrderItemType.php new file mode 100644 index 00000000..60c3b279 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/OrderItemType.php @@ -0,0 +1,98 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions + */ + +namespace Pronamic\WordPress\Pay\Extensions\WooCommerce; + +use Pronamic\WordPress\Pay\Payments\PaymentLineType; +use WC_Order_Item; + +/** + * Title: WooCommerce order item type + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.5 + * @since 2.0.2 + */ +class OrderItemType { + /** + * Constant for 'coupon' type. + * + * @var string + */ + const COUPON = 'coupon'; + + /** + * Constant for 'fee' type. + * + * @var string + */ + const FEE = 'fee'; + + /** + * Constant for 'line_item' type (products). + * + * @var string + */ + const LINE_ITEM = 'line_item'; + + /** + * Constant for 'shipping' type. + * + * @var string + */ + const SHIPPING = 'shipping'; + + /** + * Constant for 'tax' type. + * + * @var string + */ + const TAX = 'tax'; + + /** + * Transform WooCommerce order item type to general payment line type. + * + * @param WC_Order_Item $item WooCommerce order item type. + * + * @return null|string + */ + public static function transform( $item ) { + switch ( $item->get_type() ) { + case self::COUPON: + return PaymentLineType::DISCOUNT; + + case self::FEE: + return PaymentLineType::FEE; + + case self::LINE_ITEM: + if ( is_callable( array( $item, 'get_product' ) ) ) { + $product = $item->get_product(); + + if ( $product->is_virtual() ) { + return PaymentLineType::DIGITAL; + } + } + + return PaymentLineType::PHYSICAL; + + case self::SHIPPING: + return PaymentLineType::SHIPPING; + + case self::TAX: + return PaymentLineType::TAX; + + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/WooCommerce.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/WooCommerce.php new file mode 100644 index 00000000..e920bf63 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/WooCommerce.php @@ -0,0 +1,963 @@ +=' ) + && + post_type_exists( 'shop_subscription' ) + ); + } + + /** + * Version compare. + * + * @param string $version Version. + * @param string $operator Comparison operator. + * + * @return bool|mixed + */ + public static function version_compare( $version, $operator ) { + $result = true; + + // @link https://github.com/woothemes/woocommerce/blob/v1.6.6/woocommerce.php#L140 + if ( defined( 'WOOCOMMERCE_VERSION' ) ) { + $result = version_compare( WOOCOMMERCE_VERSION, $version, $operator ); + } + + return $result; + } + + /** + * Get WooCommerce date format + * + * @return string + */ + public static function get_date_format() { + if ( function_exists( 'wc_date_format' ) ) { + // WooCommerce 3.0+ + // @link https://github.com/woocommerce/woocommerce/blob/3.0.0/includes/wc-formatting-functions.php#L518-L525. + return wc_date_format(); + } elseif ( function_exists( 'woocommerce_date_format' ) ) { + // @link https://github.com/woothemes/woocommerce/blob/v2.0.20/woocommerce-core-functions.php#L2169. + return woocommerce_date_format(); + } + + return get_option( 'date_format' ); + } + + /** + * Get currency. + * + * @see Pronamic_Pay_PaymentDataInterface::get_currency_alphabetic_code() + * @return string + */ + public static function get_currency() { + // @link https://github.com/woothemes/woocommerce/blob/2.0.20/woocommerce-core-functions.php#L692-L700 + // @link https://github.com/woothemes/woocommerce/blob/2.1.0/includes/wc-core-functions.php#L146-L152 + // @link https://github.com/woothemes/woocommerce/blob/2.5.5/includes/wc-core-functions.php#L256-L263 + if ( function_exists( 'get_woocommerce_currency' ) ) { + return get_woocommerce_currency(); + } + + // @link https://plugins.trac.wordpress.org/browser/woocommerce/tags/1.5.2.1/admin/woocommerce-admin-settings.php#L32 + return get_option( 'woocommerce_currency' ); + } + + /** + * Get order pay URL for backwards compatibility. + * + * @param WC_Order $order WooCommerce order. + * + * @return string the pay URL + */ + public static function get_order_pay_url( $order ) { + $url = null; + + if ( method_exists( $order, 'get_checkout_payment_url' ) ) { + // WooCommerce >= 2.1. + // @link http://docs.woothemes.com/document/woocommerce-endpoints-2-1/. + // @link https://github.com/woothemes/woocommerce/blob/v2.1.0/includes/class-wc-order.php#L1057-L1079. + return $order->get_checkout_payment_url( false ); + } + + // WooCommerce < 2.1. + return add_query_arg( + array( + 'order' => $order->id, + 'key' => $order->order_key, + ), + get_permalink( woocommerce_get_page_id( 'pay' ) ) + ); + } + + /** + * Add notice. + * + * @param string $message + * @param string $type + */ + public static function add_notice( $message, $type = 'success' ) { + global $woocommerce; + + if ( function_exists( 'wc_add_notice' ) ) { + // @link https://github.com/woothemes/woocommerce/blob/v2.1.0/includes/wc-notice-functions.php#L54-L71 + wc_add_notice( $message, $type ); + } elseif ( 'error' === $type && method_exists( $woocommerce, 'add_error' ) ) { + // @link https://github.com/woothemes/woocommerce/blob/v2.0.0/woocommerce.php#L1429-L1438 + // @link https://github.com/woothemes/woocommerce/blob/v2.1.0/woocommerce.php#L797-L804 + $woocommerce->add_error( $message ); + } elseif ( method_exists( $woocommerce, 'add_message' ) ) { + // @link https://github.com/woothemes/woocommerce/blob/v2.0.0/woocommerce.php#L1441-L1450 + // @link https://github.com/woothemes/woocommerce/blob/v2.1.0/woocommerce.php#L806-L813 + $woocommerce->add_message( $message ); + } + } + + /** + * Order has status. + * + * @param WC_Order $order + * @param string|array $status + * + * @return bool + */ + public static function order_has_status( $order, $status ) { + if ( method_exists( $order, 'has_status' ) ) { + return $order->has_status( $status ); + } + + if ( is_array( $status ) ) { + return in_array( $order->status, $status, true ); + } + + return ( $order->status === $status ); + } + + /** + * Get order status. + * + * @since 1.2.1 + * + * @param WC_Order $order + * + * @return string + */ + public static function order_get_status( $order ) { + if ( method_exists( $order, 'get_status' ) ) { + return $order->get_status(); + } + + return $order->status; + } + + /** + * Get order id. + * + * @since 2.0.2 + * + * @param WC_Order $order Order. + * + * @return string + */ + public static function get_order_id( $order ) { + if ( is_callable( array( $order, 'get_id' ) ) ) { + return $order->get_id(); + } + + return $order->id; + } + + /** + * Get order date. + * + * @since 2.0.2 + * + * @param WC_Order $order Order. + * + * @return string + */ + public static function get_order_date( $order ) { + if ( is_callable( array( $order, 'get_date_created' ) ) ) { + return $order->get_date_created()->getTimestamp(); + } + + return strtotime( $order->order_date ); + } + + /** + * Get order total. + * + * @since 2.0.2 + * + * @param WC_Order $order Order. + * + * @return string + */ + public static function get_order_total( $order ) { + if ( is_callable( array( $order, 'get_total' ) ) ) { + // WooCommerce 3.0+. + return $order->get_total(); + } + + return $order->order_total; + } + + /** + * Get order total tax. + * + * @since 2.0.2 + * + * @param WC_Order $order Order. + * + * @return string + */ + public static function get_order_total_tax( $order ) { + if ( is_callable( array( $order, 'get_total_tax' ) ) ) { + // WooCommerce 3.0+. + return $order->get_total_tax(); + } + + return $order->total_tax; + } + + /** + * Get order shipping total. + * + * @since 2.0.2 + * + * @param WC_Order $order Order. + * + * @return string + */ + public static function get_order_shipping_total( $order ) { + if ( is_callable( array( $order, 'get_shipping_total' ) ) ) { + // WooCommerce 3.0+. + return $order->get_shipping_total(); + } + + return $order->shipping_total; + } + + /** + * Get order property. + * + * @param WC_Order $order WooCommerce order. + * @param string $property Property. + * + * @return mixed + */ + public static function get_order_property( $order, $property ) { + $callable = array( + $order, + sprintf( 'get_%s', $property ), + ); + + if ( is_callable( $callable ) ) { + // WooCommerce 3.0+. + return call_user_func( $callable ); + } + + if ( isset( $order->{$property} ) ) { + return $order->{$property}; + } + + return null; + } + + /** + * Get payment method title. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_payment_method_title( WC_Order $order ) { + return self::get_order_property( $order, 'payment_method_title' ); + } + + /** + * Get billing first name. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_first_name( WC_Order $order ) { + return self::get_order_property( $order, 'billing_first_name' ); + } + + /** + * Get billing last name. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_last_name( WC_Order $order ) { + return self::get_order_property( $order, 'billing_last_name' ); + } + + /** + * Get billing company. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_company( WC_Order $order ) { + return self::get_order_property( $order, 'billing_company' ); + } + + /** + * Get billing address 1. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_address_1( WC_Order $order ) { + return self::get_order_property( $order, 'billing_address_1' ); + } + + /** + * Get billing address 2. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_address_2( WC_Order $order ) { + return self::get_order_property( $order, 'billing_address_2' ); + } + + /** + * Get billing postcode. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_postcode( WC_Order $order ) { + return self::get_order_property( $order, 'billing_postcode' ); + } + + /** + * Get billing city. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_city( WC_Order $order ) { + return self::get_order_property( $order, 'billing_city' ); + } + + /** + * Get billing state. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_state( WC_Order $order ) { + return self::get_order_property( $order, 'billing_state' ); + } + + /** + * Get billing country. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_country( WC_Order $order ) { + return self::get_order_property( $order, 'billing_country' ); + } + + /** + * Get billing email. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_email( WC_Order $order ) { + return self::get_order_property( $order, 'billing_email' ); + } + + /** + * Get billing phone. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_billing_phone( WC_Order $order ) { + return self::get_order_property( $order, 'billing_phone' ); + } + + /** + * Get shipping first name. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_first_name( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_first_name' ); + } + + /** + * Get shipping last name. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_last_name( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_last_name' ); + } + + /** + * Get shipping company. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_company( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_company' ); + } + + /** + * Get shipping address 1. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_address_1( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_address_1' ); + } + + /** + * Get shipping address 2. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_address_2( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_address_2' ); + } + + /** + * Get shipping postcode. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_postcode( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_postcode' ); + } + + /** + * Get shipping city. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_city( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_city' ); + } + + /** + * Get shipping state. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_state( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_state' ); + } + + /** + * Get shipping country. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_country( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_country' ); + } + + /** + * Get shipping email. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_email( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_email' ); + } + + /** + * Get shipping phone. + * + * @param WC_Order $order WooCommerce order. + * + * @return mixed + */ + public static function get_shipping_phone( WC_Order $order ) { + return self::get_order_property( $order, 'shipping_phone' ); + } + + public static function subscription_source_id( $wcs_subscription ) { + if ( ! is_object( $wcs_subscription ) ) { + return; + } + + if ( method_exists( $wcs_subscription, 'get_parent' ) ) { + return self::get_order_id( $wcs_subscription->get_parent() ); + } + + return self::get_order_id( $wcs_subscription->order ); + } + + /** + * Get subscription order parent. + * + * @param \WC_Subscription $wcs_subscription + * + * @return WC_Order|null + */ + public static function get_subscription_parent_order( $wcs_subscription ) { + if ( method_exists( $wcs_subscription, 'get_parent' ) ) { + // WooCommerce 3.0+. + return $wcs_subscription->get_parent(); + } + + return $wcs_subscription->order; + } + + /** + * Get subscription payment method. + * + * @param \WC_Subscription $wcs_subscription + * + * @return string + */ + public static function get_subscription_payment_method( $wcs_subscription ) { + if ( method_exists( $wcs_subscription, 'get_payment_method' ) ) { + // WooCommerce 3.0+. + return $wcs_subscription->get_payment_method(); + } + + return $wcs_subscription->payment_gateway; + } + + /** + * Get subscription product price. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscriptions-product.php#L384-L404 + * + * @var WC_Subscriptions_Product + * @return float + */ + public static function get_subscription_product_price( $product ) { + // WooCommerce > 3.0. + if ( method_exists( 'WC_Subscriptions_Product', 'get_price' ) ) { + return WC_Subscriptions_Product::get_price( $product ); + } + + // WooCommerce < 3.0. + if ( isset( $product->subscription_price ) ) { + return $product->subscription_price; + } + } + + /** + * Get subscription product length. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscriptions-product.php#L464-L473 + * + * @var WC_Subscriptions_Product + * @return int + */ + public static function get_subscription_product_length( $product ) { + // WooCommerce > 3.0. + if ( method_exists( 'WC_Subscriptions_Product', 'get_length' ) ) { + return WC_Subscriptions_Product::get_length( $product ); + } + + // WooCommerce < 3.0. + if ( isset( $product->subscription_length ) ) { + return $product->subscription_length; + } + } + + /** + * Get subscription product trial length. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscriptions-product.php#L475-L484 + * + * @param WC_Subscriptions_Product $product Product. + * @return int|null + */ + public static function get_subscription_product_trial_length( $product ) { + $length = null; + + // WooCommerce > 3.0. + if ( method_exists( 'WC_Subscriptions_Product', 'get_trial_length' ) ) { + $length = WC_Subscriptions_Product::get_trial_length( $product ); + } + + // WooCommerce < 3.0. + if ( null === $length && isset( $product->subscription_trial_length ) ) { + $length = $product->subscription_trial_length; + } + + if ( ! empty( $length ) ) { + return $length; + } + + return null; + } + + /** + * Get subscription product trial period. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscriptions-product.php#L486-L495 + * + * @param WC_Subscriptions_Product $product Product. + * @return int|null + */ + public static function get_subscription_product_trial_period( $product ) { + $length = null; + + // WooCommerce > 3.0. + if ( method_exists( 'WC_Subscriptions_Product', 'get_trial_period' ) ) { + $length = WC_Subscriptions_Product::get_trial_period( $product ); + } + + // WooCommerce < 3.0. + if ( null === $length && isset( $product->subscription_trial_period ) ) { + $length = $product->subscription_trial_period; + } + + if ( ! empty( $length ) ) { + return $length; + } + + return null; + } + + /** + * Get subscription product interval. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscriptions-product.php#L453-L462 + * + * @var WC_Subscriptions_Product + * @return int + */ + public static function get_subscription_product_interval( $product ) { + // WooCommerce > 3.0. + if ( method_exists( 'WC_Subscriptions_Product', 'get_interval' ) ) { + return WC_Subscriptions_Product::get_interval( $product ); + } + + // WooCommerce < 3.0. + if ( isset( $product->subscription_period_interval ) ) { + return $product->subscription_period_interval; + } + } + + /** + * Get subscription product interval. + * + * @link https://github.com/wp-premium/woocommerce-subscriptions/blob/2.2.18/includes/class-wc-subscriptions-product.php#L442-L451 + * + * @var WC_Subscriptions_Product + * @return int + */ + public static function get_subscription_product_period( $product ) { + // WooCommerce > 3.0. + if ( method_exists( 'WC_Subscriptions_Product', 'get_period' ) ) { + return WC_Subscriptions_Product::get_period( $product ); + } + + // WooCommerce < 3.0. + if ( isset( $product->subscription_period ) ) { + return $product->subscription_period; + } + } + + /** + * Get order item product. + * + * @param WC_Order_Item|WC_Order_Item_Product $item Order item. + * + * @return null|WC_Product + */ + public static function get_order_item_product( $item ) { + if ( ! is_callable( array( $item, 'get_product' ) ) ) { + return null; + } + + $product = $item->get_product(); + + if ( false === $product ) { + return null; + } + + return $product; + } + + /** + * Get order item URL. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.5.1/includes/class-wc-order-item.php#L261 + * @param WC_Order_Item|WC_Order_Item_Product $item Order item. + * @return string|null + */ + public static function get_order_item_url( $item ) { + $product = self::get_order_item_product( $item ); + + if ( empty( $product ) ) { + return null; + } + + $url = $product->get_permalink(); + + if ( empty( $url ) ) { + return null; + } + + return $url; + } + + /** + * Get order item image. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.5.1/includes/class-wc-order-item.php#L261 + * @param WC_Order_Item $item Order item. + * @return string|null + */ + public static function get_order_item_image( $item ) { + $product = self::get_order_item_product( $item ); + + if ( empty( $product ) ) { + return null; + } + + $image_url = wp_get_attachment_url( (int) $product->get_image_id() ); + + if ( empty( $image_url ) ) { + return null; + } + + return $image_url; + } + + /** + * Get order item category. + * + * @param WC_Order_Item $item Order item. + * @return string|null + */ + public static function get_order_item_category( $item ) { + $product = self::get_order_item_product( $item ); + + if ( empty( $product ) ) { + return null; + } + + /* + * Yoast SEO primary term support. + * @link https://github.com/Yoast/wordpress-seo/blob/8.4/inc/wpseo-functions.php#L62-L81 + */ + if ( function_exists( 'yoast_get_primary_term' ) ) { + $name = yoast_get_primary_term( 'product_cat', $product->get_id() ); + + return empty( $name ) ? null : $name; + } + + /* + * WordPress core. + * @link https://developer.wordpress.org/reference/functions/wp_get_post_terms/ + */ + if ( ! is_callable( array( $product, 'get_category_ids' ) ) ) { + return null; + } + + $category_ids = $product->get_category_ids(); + + if ( ! is_array( $category_ids ) ) { + return null; + } + + $category_id = reset( $category_ids ); + + $term = get_term( $category_id ); + + if ( empty( $term ) || $term instanceof WP_Error ) { + return null; + } + + return $term->name; + } + + /** + * Get order item SKU. + * + * @param WC_Order_Item $item Order item. + * + * @return string|null + */ + public static function get_order_item_sku( $item ) { + $product = self::get_order_item_product( $item ); + + if ( empty( $product ) ) { + return null; + } + + $sku = $product->get_sku(); + + if ( empty( $sku ) ) { + return null; + } + + return $sku; + } + + /** + * Get checkout fields. + * + * @return array + * + * @throws Exception + */ + public static function get_checkout_fields() { + $fields = array(); + + // Make sure to have a valid WooCommerce session, customer and cart. + if ( null === \WC()->session || null === \WC()->cart ) { + if ( ! \function_exists( '\wc_load_cart' ) ) { + /** + * WooCommerce versions < 3.6.4. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.3.1/includes/wc-core-functions.php#L2408-L2423 + */ + return $fields; + } + + \wc_load_cart(); + } + + // Get checkout fields. + foreach ( \WC()->checkout()->get_checkout_fields() as $fieldset_key => $fieldset ) { + $fields[ $fieldset_key ] = array( + 'name' => ucfirst( $fieldset_key ), + 'options' => array(), + ); + + foreach ( $fieldset as $field_key => $field ) { + if ( empty( $field['label'] ) || strstr( $field_key, 'password' ) ) { + continue; + } + + $fields[ $fieldset_key ]['options'][ $field_key ] = $field['label']; + } + } + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/WooCommerceDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/WooCommerceDependency.php new file mode 100644 index 00000000..ce5a3c8e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/woocommerce/src/WooCommerceDependency.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WooCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WooCommerce; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * WooCommerce Dependency + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class WooCommerceDependency extends Dependency { + /** + * Is met. + * + * @link + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \defined( '\WOOCOMMERCE_VERSION' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php new file mode 100644 index 00000000..c75e23c3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Extension.php @@ -0,0 +1,352 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce; + +use Pronamic\WordPress\Pay\AbstractPluginIntegration; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways\Gateway; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: WP eCommerce extension + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.1 + * @since 1.0.0 + */ +class Extension extends AbstractPluginIntegration { + /** + * Slug + * + * @var string + */ + const SLUG = 'wp-e-commerce'; + + /** + * Option for payment method + * + * @var string + */ + const OPTION_PRONAMIC_PAYMENT_METHOD = 'pronamic_pay_pronamic_wpsc_payment_method'; + + /** + * Construct Ninja Forms plugin integration. + */ + public function __construct() { + parent::__construct( + array( + 'name' => __( 'WP eCommerce', 'pronamic_ideal' ), + ) + ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new WPeCommerceDependency() ); + } + + /** + * Setup. + */ + public function setup() { + \add_filter( 'pronamic_payment_source_description_' . self::SLUG, array( $this, 'source_description' ), 10, 2 ); + + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // Add gateways. + \add_filter( 'wpsc_merchants_modules', array( $this, 'merchants_modules' ) ); + + // Save gateway options. + \add_action( 'wpsc_submit_gateway_options', array( $this, 'submit_gateway_options' ) ); + + // Update payment status. + \add_action( 'pronamic_payment_status_update_' . self::SLUG, array( $this, 'status_update' ), 10, 2 ); + + // Filters. + \add_filter( 'pronamic_payment_redirect_url_' . self::SLUG, array( $this, 'redirect_url' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_text_' . self::SLUG, array( $this, 'source_text' ), 10, 2 ); + \add_filter( 'pronamic_payment_source_url_' . self::SLUG, array( $this, 'source_url' ), 10, 2 ); + } + + /** + * Merchants modules + * + * @param array $gateways Gateways. + * + * @return array + */ + public function merchants_modules( $gateways = array() ) { + global $nzshpcrt_gateways, $num, $wpsc_gateways, $gateway_checkout_form_fields; + + $classes = array( + 'Gateway' => array( + 'name' => __( 'Pronamic', 'pronamic_ideal' ), + 'display_name' => __( 'Pronamic', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic', + ), + 'AfterPayGateway' => array( + 'name' => __( 'Pronamic - AfterPay', 'pronamic_ideal' ), + 'display_name' => __( 'AfterPay', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_afterpay', + ), + 'BancontactGateway' => array( + 'name' => __( 'Pronamic - Bancontact', 'pronamic_ideal' ), + 'display_name' => __( 'Bancontact', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_bancontact', + ), + 'BankTransferGateway' => array( + 'name' => __( 'Pronamic - Bank Transfer', 'pronamic_ideal' ), + 'display_name' => __( 'Bank Transfer', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_bank_transfer', + ), + 'CreditCardGateway' => array( + 'name' => __( 'Pronamic - Credit Card', 'pronamic_ideal' ), + 'display_name' => __( 'Credit Card', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_credit_card', + ), + 'FocumGateway' => array( + 'name' => __( 'Pronamic - Focum', 'pronamic_ideal' ), + 'display_name' => __( 'Focum', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_focum', + ), + 'GiropayGateway' => array( + 'name' => __( 'Pronamic - Giropay', 'pronamic_ideal' ), + 'display_name' => __( 'Giropay', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_giropay', + ), + 'IDealGateway' => array( + 'name' => __( 'Pronamic - iDEAL', 'pronamic_ideal' ), + 'image' => plugins_url( '/images/ideal/icon-32x32.png', Plugin::$file ), + 'display_name' => __( 'iDEAL', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_ideal', + ), + 'MaestroGateway' => array( + 'name' => __( 'Pronamic - Maestro', 'pronamic_ideal' ), + 'display_name' => __( 'Maestro', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_maestro', + ), + 'PayPalGateway' => array( + 'name' => __( 'Pronamic - PayPal', 'pronamic_ideal' ), + 'display_name' => __( 'PayPal', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_paypal', + ), + 'SofortGateway' => array( + 'name' => __( 'Pronamic - SOFORT', 'pronamic_ideal' ), + 'display_name' => __( 'SOFORT', 'pronamic_ideal' ), + 'internalname' => 'wpsc_merchant_pronamic_sofort', + ), + ); + + foreach ( $classes as $class => $args ) { + $class_name = sprintf( + __NAMESPACE__ . '\Gateways\%s', + $class + ); + + $args = wp_parse_args( + $args, + array( + 'api_version' => 2.0, + 'class_name' => $class_name, + 'has_recurring_billing' => false, + 'wp_admin_cannot_cancel' => false, + 'requirements' => array( + 'php_version' => 5.3, + 'extra_modules' => array(), + ), + 'form' => $class_name . '::admin_config_form', + 'submit_function' => $class_name . '::admin_config_submit', + ) + ); + + $gateways[] = $args; + } + + $gateway_checkout_form_fields['wpsc_merchant_pronamic'] = Gateways\Gateway::advanced_inputs(); + $gateway_checkout_form_fields['wpsc_merchant_pronamic_ideal'] = Gateways\IDealGateway::advanced_inputs(); + + return $gateways; + } + + /** + * Process gateway options submit. + */ + public function submit_gateway_options() { + // Get gateways. + $gateways = self::merchants_modules(); + + foreach ( $gateways as $gateway ) { + if ( ! isset( $gateway['submit_function'] ) ) { + continue; + } + + // Call admin config submit function for gateway. + call_user_func( $gateway['submit_function'] ); + } + } + + /** + * Update lead status of the specified payment + * + * @param Payment $payment Payment. + * @param bool $can_redirect Whether or not to redirect. + */ + public function status_update( Payment $payment, $can_redirect = false ) { + $merchant = new Gateway( $payment->get_source_id() ); + + switch ( $payment->status ) { + case PaymentStatus::CANCELLED: + $merchant->set_purchase_processed_by_purchid( WPeCommerce::PURCHASE_STATUS_INCOMPLETE_SALE ); + + break; + case PaymentStatus::SUCCESS: + /* + * Transactions results + * + * @link https://github.com/wp-e-commerce/WP-e-Commerce/blob/v3.8.9.5/wpsc-merchants/paypal-pro.merchant.php#L303 + */ + $session_id = $payment->get_meta( 'wpsc_session_id' ); + + transaction_results( $session_id ); + + $merchant->set_purchase_processed_by_purchid( WPeCommerce::PURCHASE_STATUS_ACCEPTED_PAYMENT ); + + break; + case PaymentStatus::EXPIRED: + case PaymentStatus::FAILURE: + case PaymentStatus::OPEN: + default: + break; + } + } + + /** + * Payment redirect URL filter. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function redirect_url( $url, Payment $payment ) { + // URL arguments. + $args = array( + 'sessionid' => $payment->get_meta( 'wpsc_session_id' ), + 'gateway' => 'wpsc_merchant_pronamic', + ); + + switch ( $payment->status ) { + case PaymentStatus::CANCELLED: + /* + * Remove 'sessionid' paramater from the transaction URL, so customers + * will get a message 'Sorry your transaction was not accepted.'. + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.8.3/wpsc-theme/functions/wpsc-transaction_results_functions.php#L94 + */ + unset( $args['sessionid'] ); + + $args['return'] = 'cancel'; + + break; + case PaymentStatus::EXPIRED: + case PaymentStatus::FAILURE: + /* + * Remove 'sessionid' paramater from the transaction URL, so customers + * will get a message 'Sorry your transaction was not accepted.'. + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.8.3/wpsc-theme/functions/wpsc-transaction_results_functions.php#L94 + */ + unset( $args['sessionid'] ); + + $args['return'] = 'error'; + + break; + case PaymentStatus::SUCCESS: + case PaymentStatus::OPEN: + default: + break; + } + + $url = add_query_arg( + $args, + get_option( 'transact_url' ) + ); + + return $url; + } + + /** + * Source text. + * + * @param string $text Source text. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'WP e-Commerce', 'pronamic_ideal' ) . '
    '; + + $text .= sprintf( + '%s', + add_query_arg( + array( + 'page' => 'wpsc-sales-logs', + 'purchaselog_id' => $payment->get_source_id(), + ), + admin_url( 'index.php' ) + ), + /* translators: %s: payment source id */ + sprintf( __( 'Purchase #%s', 'pronamic_ideal' ), $payment->get_source_id() ) + ); + + return $text; + } + + /** + * Source description. + * + * @param string $description Source description. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_description( $description, Payment $payment ) { + return __( 'WP e-Commerce Purchase', 'pronamic_ideal' ); + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + $url = add_query_arg( + array( + 'page' => 'wpsc-purchase-logs', + 'c' => 'item_details', + 'id' => $payment->get_source_id(), + ), + admin_url( 'index.php' ) + ); + + return $url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/AfterPayGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/AfterPayGateway.php new file mode 100644 index 00000000..7463f5d9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/AfterPayGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * AfterPay Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class AfterPayGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::AFTERPAY; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/BancontactGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/BancontactGateway.php new file mode 100644 index 00000000..766a6217 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/BancontactGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Bancontact Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class BancontactGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::BANCONTACT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/BankTransferGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/BankTransferGateway.php new file mode 100644 index 00000000..ab3642f8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/BankTransferGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Bank Transfer Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class BankTransferGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::BANK_TRANSFER; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/CreditCardGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/CreditCardGateway.php new file mode 100644 index 00000000..4bb99305 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/CreditCardGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Credit Card Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class CreditCardGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::CREDIT_CARD; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/FocumGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/FocumGateway.php new file mode 100644 index 00000000..c8a4a9c9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/FocumGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Focum Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class FocumGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::FOCUM; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php new file mode 100644 index 00000000..cfd52c19 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/Gateway.php @@ -0,0 +1,306 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Admin\AdminModule; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\Extensions\WPeCommerce\WPeCommerce; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use wpsc_merchant; + +/** + * Title: WP e-Commerce Pronamic gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class Gateway extends wpsc_merchant { + /** + * Payment method + * + * @var null|string $payment_method + */ + const PAYMENT_METHOD = null; + + /** + * Construct and initialize an Pronamic merchant class + * + * @param null|string $purchase_id Purchase ID. + * @param bool $is_receiving Whether or not is receiving. + */ + public function __construct( $purchase_id = null, $is_receiving = false ) { + parent::__construct( $purchase_id, $is_receiving ); + + $this->name = PaymentMethods::get_name( static::PAYMENT_METHOD, __( 'Pronamic', 'pronamic_ideal' ) ); + } + + /** + * Get option config ID. + * + * @return string + */ + private static function get_option_config_id() { + $method = static::PAYMENT_METHOD; + $method = ( null === $method ) ? 'pronamic' : $method; + + $name = sprintf( + 'pronamic_pay_%s_wpsc_config_id', + $method + ); + + return $name; + } + + /** + * Get config ID. + * + * @return int + */ + private static function get_config_id() { + $name = self::get_option_config_id(); + + $config_id = get_option( $name, null ); + + return (int) $config_id; + } + + /** + * Submit to gateway + */ + public function submit() { + global $wpsc_cart; + + $config_id = self::get_config_id(); + + /* + * Set purchase processed to 'order_received' (2). + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-includes/merchant.class.php#L301 + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + */ + $this->set_purchase_processed_by_purchid( WPeCommerce::PURCHASE_STATUS_ORDER_RECEIVED ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + $payment_method = static::PAYMENT_METHOD; + + if ( null !== $payment_method ) { + $gateway->set_payment_method( $payment_method ); + } + + // Payment. + $payment = new Payment(); + + // Customer. + $customer = new Customer(); + + $payment->set_customer( $customer ); + + if ( isset( $this->cart_data['email_address'] ) ) { + $customer->set_email( $this->cart_data['email_address'] ); + } + + // Billing address. + $billing_address = WPeCommerce::get_address_from_cart_data( $this->cart_data, 'billing_address' ); + + if ( null !== $billing_address ) { + $payment->set_billing_address( $billing_address ); + + $billing_address->set_email( $customer->get_email() ); + + // Name. + $name = $customer->get_name(); + + if ( null === $name ) { + $customer->set_name( $billing_address->get_name() ); + } + + // Phone. + $phone = $customer->get_phone(); + + if ( null === $phone ) { + $customer->set_phone( $billing_address->get_phone() ); + } + } + + // Shipping address. + $shipping_address = WPeCommerce::get_address_from_cart_data( $this->cart_data, 'shipping_address' ); + + if ( null !== $shipping_address ) { + $payment->set_shipping_address( $shipping_address ); + + $shipping_address->set_email( $customer->get_email() ); + + // Name. + $name = $customer->get_name(); + + if ( null === $name ) { + $customer->set_name( $shipping_address->get_name() ); + } + + // Phone. + $phone = $customer->get_phone(); + + if ( null === $phone ) { + $customer->set_phone( $shipping_address->get_phone() ); + } + } + + // Payment lines. + $payment_lines = WPeCommerce::get_payment_lines_from_cart_items( $wpsc_cart->cart_items, $this->cart_data ); + + if ( null !== $payment_lines ) { + $payment->set_lines( $payment_lines ); + } + + // Other. + $payment->title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + sprintf( + /* translators: %s: order id */ + __( 'WP eCommerce order %s', 'pronamic_ideal' ), + $this->purchase_id + ) + ); + + $payment->config_id = $config_id; + $payment->order_id = $this->purchase_id; + $payment->description = sprintf( + /* translators: %s: order number */ + __( 'Order %s', 'pronamic_ideal' ), + $this->purchase_id + ); + $payment->source = 'wp-e-commerce'; + $payment->source_id = $this->purchase_id; + + if ( isset( $this->cart_data['email_address'] ) ) { + $payment->email = $this->cart_data['email_address']; + } + + $payment->method = $payment_method; + + // Set total amount. + $payment->set_total_amount( + new TaxedMoney( + $this->cart_data['total_price'], + WPeCommerce::get_currency_from_cart_data( $this->cart_data ), + WPeCommerce::get_total_tax() + ) + ); + + // Start payment. + $error = null; + + try { + // @todo Build payment inside try/catch block. + + $payment = Plugin::start_payment( $payment ); + } catch ( \Exception $e ) { + $error = $e; + } + + // Meta. + if ( isset( $this->purchase_id ) ) { + $payment->set_meta( 'wpsc_purchase_id', $this->purchase_id ); + } + + if ( isset( $this->cart_data['session_id'] ) ) { + $payment->set_meta( 'wpsc_session_id', $this->cart_data['session_id'] ); + } + + if ( $error instanceof \Exception ) { + Plugin::render_exception( $error ); + + return; + } + + // Redirect. + $gateway->redirect( $payment ); + } + + /** + * Admin configuration form + */ + public static function admin_config_form() { + $name = self::get_option_config_id(); + + $html = ''; + + $html .= ''; + $html .= ' '; + $html .= ' ' . __( 'Configuration', 'pronamic_ideal' ); + $html .= ' '; + $html .= ' '; + $html .= AdminModule::dropdown_configs( + array( + 'name' => $name, + 'echo' => false, + ) + ); + $html .= ' '; + $html .= ''; + + return $html; + } + + /** + * Admin config submit. + * + * @return void + */ + public static function admin_config_submit() { + // Config ID. + $name = self::get_option_config_id(); + + if ( ! filter_has_var( INPUT_POST, $name ) ) { + return; + } + + $config_id = filter_input( INPUT_POST, $name, FILTER_SANITIZE_STRING ); + + update_option( $name, $config_id ); + } + + /** + * Advanced inputs + * + * @return null|string + */ + public static function advanced_inputs() { + $config_id = self::get_config_id(); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return null; + } + + $payment_method = static::PAYMENT_METHOD; + + if ( null !== $payment_method ) { + $gateway->set_payment_method( $payment_method ); + } + + return $gateway->get_input_html(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/GiropayGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/GiropayGateway.php new file mode 100644 index 00000000..b286e8c5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/GiropayGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Giropay Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class GiropayGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::GIROPAY; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/IDealGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/IDealGateway.php new file mode 100644 index 00000000..ececda47 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/IDealGateway.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: WP e-Commerce iDEAL gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class IDealGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::IDEAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/MaestroGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/MaestroGateway.php new file mode 100644 index 00000000..2754c09c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/MaestroGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Maestro Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class MaestroGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::MAESTRO; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/PayPalGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/PayPalGateway.php new file mode 100644 index 00000000..792d7411 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/PayPalGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * PayPal Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class PayPalGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::PAYPAL; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/SofortGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/SofortGateway.php new file mode 100644 index 00000000..6ee8c4e7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/Gateways/SofortGateway.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce\Gateways; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * SOFORT Gateway. + * + * @author Remco Tolsma + * @version 2.0.2 + * @version 2.0.2 + */ +class SofortGateway extends Gateway { + /** + * Payment method + * + * @var string $payment_method + */ + const PAYMENT_METHOD = PaymentMethods::SOFORT; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/WPeCommerce.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/WPeCommerce.php new file mode 100644 index 00000000..fa90af2a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/WPeCommerce.php @@ -0,0 +1,270 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce; + +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Payments\PaymentLines; +use wpec_taxes_controller; + +/** + * Title: WP e-Commerce + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class WPeCommerce { + /** + * Purche status + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + * @var int + */ + const PURCHASE_STATUS_INCOMPLETE_SALE = 1; + + /** + * Purche status + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + * @var int + */ + const PURCHASE_STATUS_ORDER_RECEIVED = 2; + + /** + * Purche status + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + * @var int + */ + const PURCHASE_STATUS_ACCEPTED_PAYMENT = 3; + + /** + * Purche status + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + * @var int + */ + const PURCHASE_STATUS_JOB_DISPATCHED = 4; + + /** + * Purche status + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + * @var int + */ + const PURCHASE_STATUS_CLOSED_ORDER = 5; + + /** + * Purche status + * + * @link https://plugins.trac.wordpress.org/browser/wp-e-commerce/tags/3.8.7.6.2/wpsc-core/wpsc-functions.php#L115 + * @var int + */ + const PURCHASE_STATUS_DECLINED_PAYMENT = 6; + + /** + * Check if WP e-Comerce is active (Automattic/developer style) + * + * @link https://github.com/wp-e-commerce/WP-e-Commerce/blob/v3.8.9.5/wp-shopping-cart.php#L11 + * @link https://github.com/Automattic/developer/blob/1.1.2/developer.php#L73 + * + * @return boolean + */ + public static function is_active() { + return class_exists( 'WP_eCommerce' ); + } + + /** + * Get currency from cart data. + * + * @param array $cart_data Cart data. + * @return string|null + */ + public static function get_currency_from_cart_data( $cart_data ) { + if ( ! array_key_exists( 'store_currency', $cart_data ) ) { + return null; + } + + return $cart_data['store_currency']; + } + + /** + * Get address from cart data. + * + * @param array $cart_data Cart data. + * @param string $key Cart data key. + * @return Address|null + */ + public static function get_address_from_cart_data( $cart_data, $key ) { + if ( ! array_key_exists( $key, $cart_data ) ) { + return null; + } + + $data = $cart_data[ $key ]; + + if ( ! is_array( $data ) ) { + return null; + } + + $data = array_filter( $data ); + + $address = new Address(); + + $contact_name = new ContactName(); + + if ( array_key_exists( 'first_name', $data ) ) { + $contact_name->set_first_name( $data['first_name'] ); + } + + if ( array_key_exists( 'last_name', $data ) ) { + $contact_name->set_last_name( $data['last_name'] ); + } + + $address->set_name( $contact_name ); + + if ( array_key_exists( 'address', $data ) ) { + $address->set_line_1( $data['address'] ); + } + + if ( array_key_exists( 'city', $data ) ) { + $address->set_city( $data['city'] ); + } + + if ( array_key_exists( 'state', $data ) ) { + $address->set_region( $data['state'] ); + } + + if ( array_key_exists( 'country', $data ) ) { + $address->set_country_code( $data['country'] ); + } + + if ( array_key_exists( 'post_code', $data ) ) { + $address->set_postal_code( $data['post_code'] ); + } + + if ( array_key_exists( 'phone', $data ) ) { + $address->set_phone( $data['phone'] ); + } + + return $address; + } + + /** + * Get payment lines from cart data. + * + * @param array $items Cart items. + * @param array $cart_data Cart data. + * + * @return PaymentLines|null + */ + public static function get_payment_lines_from_cart_items( $items, $cart_data ) { + if ( ! is_array( $items ) ) { + return null; + } + + $currency = self::get_currency_from_cart_data( $cart_data ); + + $lines = new PaymentLines(); + + if ( class_exists( '\wpec_taxes_controller' ) ) { + $taxes_controller = new wpec_taxes_controller(); + } + + foreach ( $items as $item ) { + $line = $lines->new_line(); + + $quantity = 1; + + $total_price_value = null; + $total_tax_value = null; + + $unit_price_value = null; + $unit_tax_value = null; + + // ID. + if ( isset( $item->product_id ) ) { + $line->set_id( $item->product_id ); + } + + // Name. + if ( isset( $item->product_name ) ) { + $line->set_name( $item->product_name ); + } + + // Quantity. + if ( isset( $item->quantity ) ) { + $quantity = intval( $item->quantity ); + } + + $line->set_quantity( $quantity ); + + // Tax. + if ( isset( $taxes_controller ) ) { + // Get included tax. + $tax = $taxes_controller->wpec_taxes_calculate_included_tax( $item ); + + if ( ! $taxes_controller->wpec_taxes_isincluded() ) { + // Get excluded tax. + $tax = $taxes_controller->wpec_taxes_calculate_excluded_tax( $item, $tax ); + } + + $total_tax_value = $tax['tax']; + $unit_tax_value = $total_tax_value / $quantity; + } + + // Price. + if ( isset( $item->unit_price, $item->total_price ) ) { + $total_price_value = $item->total_price; + $unit_price_value = $item->unit_price; + + if ( isset( $taxes_controller, $total_tax_value, $unit_tax_value ) && ! $taxes_controller->wpec_taxes_isincluded() ) { + $total_price_value += $total_tax_value; + $unit_price_value += $unit_tax_value; + } + + $line->set_unit_price( new TaxedMoney( $unit_price_value, $currency, $unit_tax_value ) ); + $line->set_total_amount( new TaxedMoney( $total_price_value, $currency, $total_tax_value ) ); + } + } + + return $lines; + } + + /** + * Get total tax amount for purchase. + * + * @return float + */ + public static function get_total_tax() { + $return = 0; + + if ( ! class_exists( '\wpec_taxes_controller' ) ) { + return $return; + } + + $taxes_controller = new wpec_taxes_controller(); + + if ( is_callable( array( $taxes_controller, 'wpec_taxes_calculate_total' ) ) ) { + $total_taxes = $taxes_controller->wpec_taxes_calculate_total(); + + if ( is_array( $total_taxes ) && isset( $total_taxes['total'] ) ) { + $return = $total_taxes['total']; + } + } + + return $return; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/WPeCommerceDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/WPeCommerceDependency.php new file mode 100644 index 00000000..f94f5d6e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-extensions/wp-e-commerce/src/WPeCommerceDependency.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Extensions\WPeCommerce + */ + +namespace Pronamic\WordPress\Pay\Extensions\WPeCommerce; + +use Pronamic\WordPress\Pay\Dependencies\Dependency; + +/** + * WP eCommerce Dependency + * + * @author Reüel van der Steege + * @version 2.1.1 + * @since 2.1.1 + */ +class WPeCommerceDependency extends Dependency { + /** + * Is met. + * + * @link + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + if ( ! \class_exists( '\WP_eCommerce' ) ) { + return false; + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/js/dist/checkout-drop-in.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/js/dist/checkout-drop-in.js new file mode 100644 index 00000000..cddd0e7b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/js/dist/checkout-drop-in.js @@ -0,0 +1,195 @@ +"use strict"; + +/* global AdyenCheckout, pronamicPayAdyenCheckout */ +(function () { + 'use strict'; + + var checkout = new AdyenCheckout(pronamicPayAdyenCheckout.configuration); + + var validate_http_status = function validate_http_status(response) { + if (response.status >= 200 && response.status < 300) { + return Promise.resolve(response); + } + + return Promise.reject(new Error(response.statusText)); + }; + + var get_json = function get_json(response) { + return response.json(); + }; + + if (pronamicPayAdyenCheckout.paymentMethodsConfiguration.applepay) { + pronamicPayAdyenCheckout.paymentMethodsConfiguration.applepay.onValidateMerchant = function (resolve, reject, validationUrl) { + send_request(pronamicPayAdyenCheckout.applePayMerchantValidationUrl, { + validation_url: validationUrl + }).then(validate_http_status).then(get_json).then(function (response) { + // Handle Pronamic Pay error. + if (response.error) { + return Promise.reject(new Error(response.error)); + } // Handle Adyen error. + + + if (response.statusMessage) { + return Promise.reject(new Error(response.statusMessage)); + } + + return resolve(response); + }).catch(function (error) { + dropin.setStatus('error', { + message: error.message + }); + setTimeout(function () { + dropin.setStatus('ready'); + }, 5000); + return reject(); + }); + }; + } + + var pronamicPayAdyenProcessing = false; + var dropin = checkout.create('dropin', { + paymentMethodsConfiguration: pronamicPayAdyenCheckout.paymentMethodsConfiguration, + onSubmit: function onSubmit(state, dropin) { + if (pronamicPayAdyenProcessing) { + return false; + } + + pronamicPayAdyenProcessing = true; + send_request(pronamicPayAdyenCheckout.paymentsUrl, state.data).then(validate_http_status).then(get_json).then(function (response) { + pronamicPayAdyenProcessing = false; // Handle error. + + if (response.error) { + return Promise.reject(new Error(response.error)); + } // Handle action object. + + + if (response.action) { + dropin.handleAction(response.action); + } // Handle result code. + + + if (response.resultCode) { + paymentResult(response); + } + }).catch(function (error) { + dropin.setStatus('error', { + message: error.message + }); + setTimeout(function () { + dropin.setStatus('ready'); + }, 5000); + }); + }, + onAdditionalDetails: function onAdditionalDetails(state, dropin) { + send_request(pronamicPayAdyenCheckout.paymentsDetailsUrl, state.data).then(validate_http_status).then(get_json).then(function (response) { + // Handle action object. + if (response.action) { + dropin.handleAction(response.action); + } // Handle result code. + + + if (response.resultCode) { + paymentResult(response); + } + }).catch(function (error) { + throw Error(error); + }); + } + }).mount('#pronamic-pay-checkout'); + + var send_request = function send_request(url, data) { + return fetch(url, { + method: 'POST', + cache: 'no-cache', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + }; + + var paymentResult = function paymentResult(response) { + /* + * Handle payment result + * + * @link https://docs.adyen.com/checkout/drop-in-web#step-6-present-payment-result + */ + switch (response.resultCode) { + case 'Authorised': + // The payment was successful. + dropin.setStatus('success', { + message: pronamicPayAdyenCheckout.paymentAuthorised + }); + /* + * Inform the shopper that the payment was successful. + */ + + window.location.href = pronamicPayAdyenCheckout.paymentReturnUrl; + break; + + case 'Error': + // Inform the shopper that there was an error processing their payment. + + /* + * You'll receive a `refusalReason` in the same response, indicating the cause of the error. + */ + if (response.refusalReason) { + dropin.setStatus('error', { + message: response.refusalReason + }); + } + + break; + + case 'Pending': + // The shopper has completed the payment but the final result is not yet known. + + /* + * Inform the shopper that you've received their order, and are waiting for the payment to be completed. + */ + window.location.href = pronamicPayAdyenCheckout.paymentReturnUrl; + break; + + case 'PresentToShopper': + // Present the voucher or the QR code to the shopper. + + /* + * For a voucher payment method, inform the shopper that you are waiting for their payment. You will receive the final result of the payment in an AUTHORISATION notification. + * + * For a qrCode payment method, wait for the AUTHORISATION notification before presenting the payment result to the shopper. + * + * @todo + */ + break; + + case 'Refused': + // The payment was refused. + + /* + * Inform the shopper that the payment was refused. Ask the shopper to try the payment again using a different payment method or card. + */ + dropin.setStatus('error', { + message: pronamicPayAdyenCheckout.paymentRefused + ' (' + response.refusalReason + ')' + }); + setTimeout(function () { + dropin.setStatus('ready'); + }, 8000); + break; + + case 'Received': + // For some payment methods, it can take some time before the final status of the payment is known. + dropin.setStatus('success', { + message: pronamicPayAdyenCheckout.paymentReceived + }); + /* + * Inform the shopper that you've received their order, and are waiting for the payment to clear. + */ + + setTimeout(function () { + window.location.href = pronamicPayAdyenCheckout.paymentReturnUrl; + }, 3000); + break; + } + }; +})(); +//# sourceMappingURL=checkout-drop-in.js.map \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/js/dist/checkout-drop-in.js.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/js/dist/checkout-drop-in.js.map new file mode 100644 index 00000000..270624b1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/js/dist/checkout-drop-in.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/checkout-drop-in.js"],"names":["checkout","AdyenCheckout","pronamicPayAdyenCheckout","configuration","validate_http_status","response","status","Promise","resolve","reject","Error","statusText","get_json","json","paymentMethodsConfiguration","applepay","onValidateMerchant","validationUrl","send_request","applePayMerchantValidationUrl","validation_url","then","error","statusMessage","catch","dropin","setStatus","message","setTimeout","pronamicPayAdyenProcessing","create","onSubmit","state","paymentsUrl","data","action","handleAction","resultCode","paymentResult","onAdditionalDetails","paymentsDetailsUrl","mount","url","fetch","method","cache","headers","body","JSON","stringify","paymentAuthorised","window","location","href","paymentReturnUrl","refusalReason","paymentRefused","paymentReceived"],"mappings":";;AAAA;AACA,CAAE,YAAY;AACb;;AAEA,MAAMA,QAAQ,GAAG,IAAIC,aAAJ,CAAmBC,wBAAwB,CAACC,aAA5C,CAAjB;;AAEA,MAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAAC,QAAQ,EAAI;AACxC,QAAKA,QAAQ,CAACC,MAAT,IAAmB,GAAnB,IAA0BD,QAAQ,CAACC,MAAT,GAAkB,GAAjD,EAAuD;AACtD,aAAOC,OAAO,CAACC,OAAR,CAAiBH,QAAjB,CAAP;AACA;;AAED,WAAOE,OAAO,CAACE,MAAR,CAAgB,IAAIC,KAAJ,CAAWL,QAAQ,CAACM,UAApB,CAAhB,CAAP;AACA,GAND;;AAQA,MAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAAP,QAAQ;AAAA,WAAIA,QAAQ,CAACQ,IAAT,EAAJ;AAAA,GAAzB;;AAEA,MAAKX,wBAAwB,CAACY,2BAAzB,CAAqDC,QAA1D,EAAqE;AACpEb,IAAAA,wBAAwB,CAACY,2BAAzB,CAAqDC,QAArD,CAA8DC,kBAA9D,GAAmF,UAAER,OAAF,EAAWC,MAAX,EAAmBQ,aAAnB,EAAsC;AACxHC,MAAAA,YAAY,CAAEhB,wBAAwB,CAACiB,6BAA3B,EAA0D;AAAEC,QAAAA,cAAc,EAAEH;AAAlB,OAA1D,CAAZ,CACEI,IADF,CACQjB,oBADR,EAEEiB,IAFF,CAEQT,QAFR,EAGES,IAHF,CAGQ,UAAAhB,QAAQ,EAAI;AAClB;AACA,YAAKA,QAAQ,CAACiB,KAAd,EAAsB;AACrB,iBAAOf,OAAO,CAACE,MAAR,CAAgB,IAAIC,KAAJ,CAAWL,QAAQ,CAACiB,KAApB,CAAhB,CAAP;AACA,SAJiB,CAMlB;;;AACA,YAAKjB,QAAQ,CAACkB,aAAd,EAA8B;AAC7B,iBAAOhB,OAAO,CAACE,MAAR,CAAgB,IAAIC,KAAJ,CAAWL,QAAQ,CAACkB,aAApB,CAAhB,CAAP;AACA;;AAED,eAAOf,OAAO,CAAEH,QAAF,CAAd;AACA,OAfF,EAgBEmB,KAhBF,CAgBS,UAAAF,KAAK,EAAI;AAChBG,QAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB,EAA2B;AAAEC,UAAAA,OAAO,EAAEL,KAAK,CAACK;AAAjB,SAA3B;AAEAC,QAAAA,UAAU,CAAE,YAAM;AAACH,UAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB;AAA6B,SAAtC,EAAwC,IAAxC,CAAV;AAEA,eAAOjB,MAAM,EAAb;AACA,OAtBF;AAuBA,KAxBD;AAyBA;;AAED,MAAIoB,0BAA0B,GAAG,KAAjC;AAEA,MAAMJ,MAAM,GAAGzB,QAAQ,CAAC8B,MAAT,CAAiB,QAAjB,EAA2B;AACzChB,IAAAA,2BAA2B,EAAEZ,wBAAwB,CAACY,2BADb;AAEzCiB,IAAAA,QAAQ,EAAE,kBAAEC,KAAF,EAASP,MAAT,EAAqB;AAC9B,UAAKI,0BAAL,EAAkC;AACjC,eAAO,KAAP;AACA;;AAEDA,MAAAA,0BAA0B,GAAG,IAA7B;AAEAX,MAAAA,YAAY,CAAEhB,wBAAwB,CAAC+B,WAA3B,EAAwCD,KAAK,CAACE,IAA9C,CAAZ,CACCb,IADD,CACOjB,oBADP,EAECiB,IAFD,CAEOT,QAFP,EAGCS,IAHD,CAGO,UAAAhB,QAAQ,EAAI;AAClBwB,QAAAA,0BAA0B,GAAG,KAA7B,CADkB,CAGlB;;AACA,YAAKxB,QAAQ,CAACiB,KAAd,EAAsB;AACrB,iBAAOf,OAAO,CAACE,MAAR,CAAgB,IAAIC,KAAJ,CAAWL,QAAQ,CAACiB,KAApB,CAAhB,CAAP;AACA,SANiB,CAQlB;;;AACA,YAAKjB,QAAQ,CAAC8B,MAAd,EAAuB;AACtBV,UAAAA,MAAM,CAACW,YAAP,CAAqB/B,QAAQ,CAAC8B,MAA9B;AACA,SAXiB,CAalB;;;AACA,YAAK9B,QAAQ,CAACgC,UAAd,EAA2B;AAC1BC,UAAAA,aAAa,CAAEjC,QAAF,CAAb;AACA;AACD,OApBD,EAqBCmB,KArBD,CAqBQ,UAAAF,KAAK,EAAI;AAChBG,QAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB,EAA2B;AAAEC,UAAAA,OAAO,EAAEL,KAAK,CAACK;AAAjB,SAA3B;AAEAC,QAAAA,UAAU,CAAE,YAAM;AAAEH,UAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB;AAA8B,SAAxC,EAA0C,IAA1C,CAAV;AACA,OAzBD;AA0BA,KAnCwC;AAoCzCa,IAAAA,mBAAmB,EAAE,6BAAEP,KAAF,EAASP,MAAT,EAAqB;AACzCP,MAAAA,YAAY,CAAEhB,wBAAwB,CAACsC,kBAA3B,EAA+CR,KAAK,CAACE,IAArD,CAAZ,CACCb,IADD,CACOjB,oBADP,EAECiB,IAFD,CAEOT,QAFP,EAGCS,IAHD,CAGO,UAAAhB,QAAQ,EAAI;AAClB;AACA,YAAKA,QAAQ,CAAC8B,MAAd,EAAuB;AACtBV,UAAAA,MAAM,CAACW,YAAP,CAAqB/B,QAAQ,CAAC8B,MAA9B;AACA,SAJiB,CAMlB;;;AACA,YAAK9B,QAAQ,CAACgC,UAAd,EAA2B;AAC1BC,UAAAA,aAAa,CAAEjC,QAAF,CAAb;AACA;AACD,OAbD,EAcCmB,KAdD,CAcQ,UAAAF,KAAK,EAAI;AAChB,cAAMZ,KAAK,CAAEY,KAAF,CAAX;AACA,OAhBD;AAiBA;AAtDwC,GAA3B,EAwDdmB,KAxDc,CAwDP,wBAxDO,CAAf;;AA0DA,MAAMvB,YAAY,GAAG,SAAfA,YAAe,CAAEwB,GAAF,EAAOR,IAAP,EAAiB;AACrC,WAAOS,KAAK,CACXD,GADW,EAEX;AACCE,MAAAA,MAAM,EAAE,MADT;AAECC,MAAAA,KAAK,EAAE,UAFR;AAGCC,MAAAA,OAAO,EAAE;AAAE,wBAAgB;AAAlB,OAHV;AAICC,MAAAA,IAAI,EAAEC,IAAI,CAACC,SAAL,CAAgBf,IAAhB;AAJP,KAFW,CAAZ;AASA,GAVD;;AAYA,MAAMI,aAAa,GAAG,SAAhBA,aAAgB,CAAEjC,QAAF,EAAgB;AACrC;;;;;AAKA,YAASA,QAAQ,CAACgC,UAAlB;AACC,WAAK,YAAL;AACC;AACAZ,QAAAA,MAAM,CAACC,SAAP,CAAkB,SAAlB,EAA6B;AAAEC,UAAAA,OAAO,EAAEzB,wBAAwB,CAACgD;AAApC,SAA7B;AAEA;;;;AAGAC,QAAAA,MAAM,CAACC,QAAP,CAAgBC,IAAhB,GAAuBnD,wBAAwB,CAACoD,gBAAhD;AAEA;;AACD,WAAK,OAAL;AACC;;AAEA;;;AAGA,YAAKjD,QAAQ,CAACkD,aAAd,EAA8B;AAC7B9B,UAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB,EAA2B;AAAEC,YAAAA,OAAO,EAAEtB,QAAQ,CAACkD;AAApB,WAA3B;AACA;;AAED;;AACD,WAAK,SAAL;AACC;;AAEA;;;AAGAJ,QAAAA,MAAM,CAACC,QAAP,CAAgBC,IAAhB,GAAuBnD,wBAAwB,CAACoD,gBAAhD;AAEA;;AACD,WAAK,kBAAL;AACC;;AAEA;;;;;;;AAOA;;AACD,WAAK,SAAL;AACC;;AAEA;;;AAGA7B,QAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB,EAA2B;AAAEC,UAAAA,OAAO,EAAEzB,wBAAwB,CAACsD,cAAzB,GAA0C,IAA1C,GAAiDnD,QAAQ,CAACkD,aAA1D,GAA0E;AAArF,SAA3B;AAEA3B,QAAAA,UAAU,CACT,YAAM;AACLH,UAAAA,MAAM,CAACC,SAAP,CAAkB,OAAlB;AACA,SAHQ,EAIT,IAJS,CAAV;AAOA;;AACD,WAAK,UAAL;AACC;AACAD,QAAAA,MAAM,CAACC,SAAP,CAAkB,SAAlB,EAA6B;AAAEC,UAAAA,OAAO,EAAEzB,wBAAwB,CAACuD;AAApC,SAA7B;AAEA;;;;AAGA7B,QAAAA,UAAU,CACT,YAAM;AACLuB,UAAAA,MAAM,CAACC,QAAP,CAAgBC,IAAhB,GAAuBnD,wBAAwB,CAACoD,gBAAhD;AACA,SAHQ,EAIT,IAJS,CAAV;AAOA;AAxEF;AA0EA,GAhFD;AAiFA,CApMD","sourcesContent":["/* global AdyenCheckout, pronamicPayAdyenCheckout */\n( function () {\n\t'use strict';\n\n\tconst checkout = new AdyenCheckout( pronamicPayAdyenCheckout.configuration );\n\n\tconst validate_http_status = response => {\n\t\tif ( response.status >= 200 && response.status < 300 ) {\n\t\t\treturn Promise.resolve( response );\n\t\t}\n\n\t\treturn Promise.reject( new Error( response.statusText ) );\n\t};\n\n\tconst get_json = response => response.json();\n\n\tif ( pronamicPayAdyenCheckout.paymentMethodsConfiguration.applepay ) {\n\t\tpronamicPayAdyenCheckout.paymentMethodsConfiguration.applepay.onValidateMerchant = ( resolve, reject, validationUrl ) => {\n\t\t\tsend_request( pronamicPayAdyenCheckout.applePayMerchantValidationUrl, { validation_url: validationUrl } )\n\t\t\t\t.then( validate_http_status )\n\t\t\t\t.then( get_json )\n\t\t\t\t.then( response => {\n\t\t\t\t\t// Handle Pronamic Pay error.\n\t\t\t\t\tif ( response.error ) {\n\t\t\t\t\t\treturn Promise.reject( new Error( response.error ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Handle Adyen error.\n\t\t\t\t\tif ( response.statusMessage ) {\n\t\t\t\t\t\treturn Promise.reject( new Error( response.statusMessage ) );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn resolve( response );\n\t\t\t\t} )\n\t\t\t\t.catch( error => {\n\t\t\t\t\tdropin.setStatus( 'error', { message: error.message } );\n\n\t\t\t\t\tsetTimeout( () => {dropin.setStatus( 'ready' );}, 5000 );\n\n\t\t\t\t\treturn reject();\n\t\t\t\t} );\n\t\t};\n\t}\n\n\tlet pronamicPayAdyenProcessing = false;\n\n\tconst dropin = checkout.create( 'dropin', {\n\t\tpaymentMethodsConfiguration: pronamicPayAdyenCheckout.paymentMethodsConfiguration,\n\t\tonSubmit: ( state, dropin ) => {\n\t\t\tif ( pronamicPayAdyenProcessing ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tpronamicPayAdyenProcessing = true;\n\n\t\t\tsend_request( pronamicPayAdyenCheckout.paymentsUrl, state.data )\n\t\t\t.then( validate_http_status )\n\t\t\t.then( get_json )\n\t\t\t.then( response => {\n\t\t\t\tpronamicPayAdyenProcessing = false;\n\n\t\t\t\t// Handle error.\n\t\t\t\tif ( response.error ) {\n\t\t\t\t\treturn Promise.reject( new Error( response.error ) );\n\t\t\t\t}\n\n\t\t\t\t// Handle action object.\n\t\t\t\tif ( response.action ) {\n\t\t\t\t\tdropin.handleAction( response.action );\n\t\t\t\t}\n\n\t\t\t\t// Handle result code.\n\t\t\t\tif ( response.resultCode ) {\n\t\t\t\t\tpaymentResult( response );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( error => {\n\t\t\t\tdropin.setStatus( 'error', { message: error.message } );\n\n\t\t\t\tsetTimeout( () => { dropin.setStatus( 'ready' ); }, 5000 );\n\t\t\t} );\n\t\t},\n\t\tonAdditionalDetails: ( state, dropin ) => {\n\t\t\tsend_request( pronamicPayAdyenCheckout.paymentsDetailsUrl, state.data )\n\t\t\t.then( validate_http_status )\n\t\t\t.then( get_json )\n\t\t\t.then( response => {\n\t\t\t\t// Handle action object.\n\t\t\t\tif ( response.action ) {\n\t\t\t\t\tdropin.handleAction( response.action );\n\t\t\t\t}\n\n\t\t\t\t// Handle result code.\n\t\t\t\tif ( response.resultCode ) {\n\t\t\t\t\tpaymentResult( response );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( error => {\n\t\t\t\tthrow Error( error );\n\t\t\t} );\n\t\t}\n\t} )\n\t.mount( '#pronamic-pay-checkout' );\n\n\tconst send_request = ( url, data ) => {\n\t\treturn fetch(\n\t\t\turl,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\tcache: 'no-cache',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify( data )\n\t\t\t}\n\t\t);\n\t};\n\n\tconst paymentResult = ( response ) => {\n\t\t/*\n\t\t * Handle payment result\n\t\t *\n\t\t * @link https://docs.adyen.com/checkout/drop-in-web#step-6-present-payment-result\n\t\t */\n\t\tswitch ( response.resultCode ) {\n\t\t\tcase 'Authorised':\n\t\t\t\t// The payment was successful.\n\t\t\t\tdropin.setStatus( 'success', { message: pronamicPayAdyenCheckout.paymentAuthorised } );\n\n\t\t\t\t/*\n\t\t\t\t * Inform the shopper that the payment was successful.\n\t\t\t\t */\n\t\t\t\twindow.location.href = pronamicPayAdyenCheckout.paymentReturnUrl;\n\n\t\t\t\tbreak;\n\t\t\tcase 'Error':\n\t\t\t\t// Inform the shopper that there was an error processing their payment.\n\n\t\t\t\t/*\n\t\t\t\t * You'll receive a `refusalReason` in the same response, indicating the cause of the error.\n\t\t\t\t */\n\t\t\t\tif ( response.refusalReason ) {\n\t\t\t\t\tdropin.setStatus( 'error', { message: response.refusalReason } );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'Pending':\n\t\t\t\t// The shopper has completed the payment but the final result is not yet known.\n\n\t\t\t\t/*\n\t\t\t\t * Inform the shopper that you've received their order, and are waiting for the payment to be completed.\n\t\t\t\t */\n\t\t\t\twindow.location.href = pronamicPayAdyenCheckout.paymentReturnUrl;\n\n\t\t\t\tbreak;\n\t\t\tcase 'PresentToShopper':\n\t\t\t\t// Present the voucher or the QR code to the shopper.\n\n\t\t\t\t/*\n\t\t\t\t * For a voucher payment method, inform the shopper that you are waiting for their payment. You will receive the final result of the payment in an AUTHORISATION notification.\n\t\t\t\t *\n\t\t\t\t * For a qrCode payment method, wait for the AUTHORISATION notification before presenting the payment result to the shopper.\n\t\t\t\t *\n\t\t\t\t * @todo\n\t\t\t\t */\n\t\t\t\tbreak;\n\t\t\tcase 'Refused':\n\t\t\t\t// The payment was refused.\n\n\t\t\t\t/*\n\t\t\t\t * Inform the shopper that the payment was refused. Ask the shopper to try the payment again using a different payment method or card.\n\t\t\t\t */\n\t\t\t\tdropin.setStatus( 'error', { message: pronamicPayAdyenCheckout.paymentRefused + ' (' + response.refusalReason + ')' } );\n\n\t\t\t\tsetTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdropin.setStatus( 'ready' );\n\t\t\t\t\t},\n\t\t\t\t\t8000\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\t\t\tcase 'Received':\n\t\t\t\t// For some payment methods, it can take some time before the final status of the payment is known.\n\t\t\t\tdropin.setStatus( 'success', { message: pronamicPayAdyenCheckout.paymentReceived } );\n\n\t\t\t\t/*\n\t\t\t\t * Inform the shopper that you've received their order, and are waiting for the payment to clear.\n\t\t\t\t */\n\t\t\t\tsetTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\twindow.location.href = pronamicPayAdyenCheckout.paymentReturnUrl;\n\t\t\t\t\t},\n\t\t\t\t\t3000\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\t\t}\n\t};\n} )();\n"],"file":"checkout-drop-in.js"} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/action.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/action.json new file mode 100644 index 00000000..3e5969d5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/action.json @@ -0,0 +1,37 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/action.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen action.", + "type": "object", + "properties": { + "data": { + "type": "object", + "description": "When the redirect URL must be accessed via POST, use this data to post to the redirect URL." + }, + "method": { + "type": "string", + "description": "Specifies the HTTP method, for example GET or POST.", + "enum": ["GET", "POST"] + }, + "paymentData": { + "type": "string", + "description": "When non-empty, contains a value that you must submit to the `/payments/details` endpoint. In some cases, required for polling." + }, + "paymentMethodType": { + "type": "string", + "description": "Specifies the payment method." + }, + "token": { + "type": "string", + "description": "A token to pass to the 3DS2 Component to get the fingerprint/challenge." + }, + "type": { + "type": "string", + "description": "Enum that specifies the action that needs to be taken by the client." + }, + "url": { + "type": "string", + "description": "Specifies the URL to redirect to." + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/amount.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/amount.json new file mode 100644 index 00000000..7959b85a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/amount.json @@ -0,0 +1,22 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/amount.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen amount.", + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "The three-character ISO currency code.", + "minLength": 3, + "maxLength": 3 + }, + "value": { + "type": "integer", + "description": "The payable amount that can be charged for the transaction." + } + }, + "required": [ + "currency", + "value" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/details.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/details.json new file mode 100644 index 00000000..cd0eb791 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/details.json @@ -0,0 +1,16 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/details.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen payment response details.", + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The value to provide in the result." + }, + "type": { + "type": "string", + "description": "The type of the required input." + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/error.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/error.json new file mode 100644 index 00000000..80925ce6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/error.json @@ -0,0 +1,22 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/error.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen error.", + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "requested URI": { + "type": "string" + } + }, + "required": [ + "code", + "message", + "requested URI" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/name.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/name.json new file mode 100644 index 00000000..bd4709d2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/name.json @@ -0,0 +1,30 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/name.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen name.", + "type": "object", + "properties": { + "firstName": { + "type": "string", + "description": "A person's first name." + }, + "gender": { + "type": "string", + "enum": ["MALE", "FEMALE", "UNKNOWN"] + }, + "infix": { + "type": "string", + "description": "A person name's infix, if applicable.", + "maxLength": 20 + }, + "lastName": { + "type": "string", + "description": "A person's last name." + } + }, + "required": [ + "firstName", + "gender", + "lastName" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/notification-request-item.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/notification-request-item.json new file mode 100644 index 00000000..eb87b278 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/notification-request-item.json @@ -0,0 +1,58 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/notification-request-item.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen notification request item.", + "type": "object", + "properties": { + "amount": { + "$ref": "amount.json" + }, + "pspReference": { + "type": "string", + "description": "Adyen's 16-character unique reference associated with the transaction/the request." + }, + "eventCode": { + "type": "string", + "description": "The type of event the notification item refers to." + }, + "eventDate": { + "type": "string", + "format": "date-time", + "description": "The time when the event was generated." + }, + "merchantAccountCode": { + "type": "string", + "description": "The merchant account identifier used in the transaction the notification item refers to." + }, + "operations": { + "type": "array", + "description": "This field holds a list of the modification operations supported by the transaction the notification item refers to.", + "items": { + "type": "string", + "enum": ["CANCEL", "CAPTURE", "REFUND"] + } + }, + "merchantReference": { + "type": "string", + "description": "A reference to uniquely identify the payment." + }, + "paymentMethod": { + "type": "string", + "description": "The payment method used in the transaction the notification item refers to." + }, + "success": { + "type": "string", + "description": "Informs about the outcome of the event (`eventCode`) the notification refers to.", + "enum": ["true", "false"] + } + }, + "required": [ + "amount", + "pspReference", + "eventCode", + "eventDate", + "merchantAccountCode", + "merchantReference", + "success" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/notification-request.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/notification-request.json new file mode 100644 index 00000000..1fd96047 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/notification-request.json @@ -0,0 +1,35 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/notification-request.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen notification request.", + "type": "object", + "properties": { + "live": { + "type": "string", + "description": "Informs about the origin of the notification.", + "enum": ["true", "false"] + }, + "notificationItems": { + "type": "array", + "items": { "$ref": "#/definitions/notificationItemContainer" }, + "description": "A container object for the details included in the notification." + } + }, + "required": [ + "live", + "notificationItems" + ], + "definitions": { + "notificationItemContainer": { + "type": "object", + "properties": { + "NotificationRequestItem": { + "$ref": "notification-request-item.json" + } + }, + "required": [ + "NotificationRequestItem" + ] + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-method.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-method.json new file mode 100644 index 00000000..acb54d5b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-method.json @@ -0,0 +1,20 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/payment-method.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen payment method.", + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "details": { + "type": "array" + } + }, + "required": [ + "type" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-methods-response.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-methods-response.json new file mode 100644 index 00000000..e006703e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-methods-response.json @@ -0,0 +1,23 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/payment-methods-response.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen payment methods response.", + "type": "object", + "properties": { + "groups": { + "type": "array", + "description": "Groups of payment methods." + }, + "oneClickPaymentMethods": { + "type": "array", + "description": "Detailed list of one-click payment methods" + }, + "paymentMethods": { + "type": "array", + "description": "Detailed list of payment methods required to generate payment forms." + } + }, + "required": [ + "paymentMethods" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-response.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-response.json new file mode 100644 index 00000000..f448e847 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-response.json @@ -0,0 +1,43 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/payment-response.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen payment response.", + "type": "object", + "properties": { + "action": { + "$ref": "action.json" + }, + "details": { + "type": "array", + "description": "When non-empty, contains all the fields that you must submit to the /payments/details endpoint.", + "items": { + "anyOf": [ + { + "$ref": "details.json" + } + ] + } + }, + "resultCode": { + "type": "string", + "description": "The result of the payment.", + "enum": ["Authorised", "Refused", "RedirectShopper", "Received", "Cancelled", "Pending", "Error"] + }, + "paymentData": { + "type": "string", + "description": "When non-empty, contains a value that you must submit to the `/payments/details` endpoint." + }, + "pspReference": { + "type": "string", + "description": "Adyen's 16-character string reference associated with the transaction/request. This value is globally unique; quote it when communicating with us about this request.", + "minLength": 16, + "maxLength": 16 + }, + "redirect": { + "$ref": "redirect.json" + } + }, + "required": [ + "resultCode" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-result.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-result.json new file mode 100644 index 00000000..a5cd63f4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-result.json @@ -0,0 +1,33 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/payment-result.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen payment result response.", + "type": "object", + "properties": { + "merchantReference": { + "type": "string", + "description": "A unique value that you provided in the initial /paymentSession request as a reference field." + }, + "paymentMethod": { + "type": "string", + "description": "The payment method used in the transaction" + }, + "pspReference": { + "type": "string", + "description": "Adyen's 16-character string reference associated with the transaction/request. This value is globally unique; quote it when communicating with us about this request." + }, + "resultCode": { + "type": "string", + "description": "The result of the payment." + }, + "shopperLocale": { + "type": "string", + "description": "The shopperLocale value provided in the payment request" + } + }, + "required": [ + "merchantReference", + "paymentMethod", + "shopperLocale" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-session-response.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-session-response.json new file mode 100644 index 00000000..d633bddc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/payment-session-response.json @@ -0,0 +1,15 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/payment-session-response.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen payment session response.", + "type": "object", + "properties": { + "paymentSession": { + "type": "string", + "description": "The encoded payment session that you need to pass to the SDK" + } + }, + "required": [ + "paymentSession" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/redirect.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/redirect.json new file mode 100644 index 00000000..c010452a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/redirect.json @@ -0,0 +1,25 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/redirect.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen redirect.", + "type": "object", + "properties": { + "data": { + "type": "object", + "description": "When the redirect URL must be accessed via POST, use this data to post to the redirect URL" + }, + "method": { + "type": "string", + "description": "The web method that you must use to access the redirect URL", + "enum": ["GET", "POST"] + }, + "url": { + "type": "string", + "description": "The URL, to which you must redirect a shopper to complete a payment" + } + }, + "required": [ + "method", + "url" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/service-exception.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/service-exception.json new file mode 100644 index 00000000..7fc8718d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/json-schemas/service-exception.json @@ -0,0 +1,30 @@ +{ + "$id": "https://github.com/wp-pay-gateways/adyen/blob/master/json-schemas/service-exception.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Adyen service exception.", + "type": "object", + "properties": { + "status": { + "type": ["integer", "string"], + "description": "The HTTP response status code." + }, + "errorCode": { + "type": "string", + "description": "The Adyen code that is mapped to the error message." + }, + "message": { + "type": "string", + "description": "The Adyen code that is mapped to the error message." + }, + "errorType": { + "type": "string", + "description": "The type of error that was encountered." + } + }, + "required": [ + "status", + "errorCode", + "message", + "errorType" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/pronamic-pay-adyen.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/pronamic-pay-adyen.php new file mode 100644 index 00000000..938ffd8a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/pronamic-pay-adyen.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +add_filter( + 'pronamic_pay_gateways', + function( $gateways ) { + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Adyen\Integration(); + + return $gateways; + } +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/readme.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/readme.txt new file mode 100644 index 00000000..b0908f49 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/readme.txt @@ -0,0 +1,9 @@ +=== Pronamic Pay Adyen Add-On === +Contributors: pronamic, remcotolsma +Tags: pronamic, pay, adyen, add-on +Requires at least: 4.7 +Tested up to: 5.1 +Requires PHP: 5.3 +Stable tag: 1.0.0 + +Extend the Pronamic Pay plugin with the Adyen gateway to receive payments with Adyen through a variety of WordPress plugins. diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AbstractGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AbstractGateway.php new file mode 100644 index 00000000..7115e215 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AbstractGateway.php @@ -0,0 +1,146 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; + +/** + * Gateway + * + * @link https://github.com/adyenpayments/php/blob/master/generatepaymentform.php + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +abstract class AbstractGateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + public $client; + + /** + * Constructs and initializes an Adyen gateway. + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array(); + + // Client. + $this->client = new Client( $config ); + } + + /** + * Get available payment methods. + * + * @return array + * @see Core_Gateway::get_available_payment_methods() + */ + public function get_available_payment_methods() { + $core_payment_methods = array(); + + try { + $payment_methods_response = $this->client->get_payment_methods( new PaymentMethodsRequest( $this->config->get_merchant_account() ) ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'adyen_error', $e->getMessage() ); + + return $core_payment_methods; + } + + foreach ( $payment_methods_response->get_payment_methods() as $payment_method ) { + $type = $payment_method->get_type(); + + if ( null === $type ) { + continue; + } + + $core_payment_method = PaymentMethodType::to_wp( $type ); + + $core_payment_methods[] = $core_payment_method; + } + + $core_payment_methods = array_filter( $core_payment_methods ); + $core_payment_methods = array_unique( $core_payment_methods ); + + return $core_payment_methods; + } + + /** + * Get issuers. + * + * @return array>> + * @see Pronamic_WP_Pay_Gateway::get_issuers() + */ + public function get_issuers() { + $issuers = array(); + + try { + $payment_methods_response = $this->client->get_payment_methods( new PaymentMethodsRequest( $this->config->get_merchant_account() ) ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'adyen_error', $e->getMessage() ); + + return $issuers; + } + + $payment_methods = $payment_methods_response->get_payment_methods(); + + // Limit to iDEAL payment methods. + $payment_methods = array_filter( + $payment_methods, + /** + * Check if payment method is iDEAL. + * + * @param PaymentMethod $payment_method Payment method. + * + * @return boolean True if payment method is iDEAL, false otherwise. + */ + function( $payment_method ) { + return ( PaymentMethodType::IDEAL === $payment_method->get_type() ); + } + ); + + foreach ( $payment_methods as $payment_method ) { + $details = $payment_method->get_details(); + + if ( is_array( $details ) ) { + foreach ( $details as $detail ) { + if ( ! isset( $detail->key, $detail->type, $detail->items ) ) { + continue; + } + + if ( 'issuer' === $detail->key && 'select' === $detail->type ) { + foreach ( $detail->items as $item ) { + $issuers[ \strval( $item->id ) ] = \strval( $item->name ); + } + } + } + } + } + + if ( empty( $issuers ) ) { + return $issuers; + } + + return array( + array( + 'options' => $issuers, + ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AbstractPaymentRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AbstractPaymentRequest.php new file mode 100644 index 00000000..5a10b03b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AbstractPaymentRequest.php @@ -0,0 +1,600 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use DateTime; +use InvalidArgumentException; + +/** + * Abstract payment request + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/paymentSession + * + * @author Remco Tolsma + * @version 1.1.2 + * @since 1.0.0 + */ +abstract class AbstractPaymentRequest extends Request { + /** + * Amount. + * + * @var Amount + */ + private $amount; + + /** + * Information about your application. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo + * @var ApplicationInfo|null + */ + private $application_info; + + /** + * Billing address. + * + * @var Address|null + */ + private $billing_address; + + /** + * Channel. + * + * The platform where a payment transaction takes place. This field is optional for filtering out + * payment methods that are only available on specific platforms. If this value is not set, + * then we will try to infer it from the sdkVersion or token. + * + * Possible values: Android, iOS, Web. + * + * @var string|null + */ + private $channel; + + /** + * The shopper country. + * + * Format: ISO 3166-1 alpha-2 Example: NL or DE + * + * @var string|null + */ + private $country_code; + + /** + * Date of birth. + * + * @var DateTime|null + */ + private $date_of_birth; + + /** + * The address where the purchased goods should be delivered + * + * @var Address|null + */ + private $delivery_address; + + /** + * Line items regarding the payment. + * + * @var LineItems|null + */ + private $line_items; + + /** + * The merchant account identifier, with which you want to process the transaction. + * + * @var string + */ + private $merchant_account; + + /** + * This reference allows linking multiple transactions to each other for reporting + * purposes (i.e. order auth-rate). The reference should be unique per billing cycle. + * The same merchant order reference should never be reused after the first authorised + * attempt. If used, this field should be supplied for all incoming authorisations. + * + * @var string|null + */ + private $merchant_order_reference; + + /** + * Metadata consists of entries, each of which includes a key and a value. Limitations: Maximum 20 key-value + * pairs per request. When exceeding, the "177" error occurs: "Metadata size exceeds limit". + * + * @var array|null + */ + private $metadata; + + /** + * The reference to uniquely identify a payment. This reference is used in all communication + * with you about the payment status. We recommend using a unique value per payment; + * however, it is not a requirement. If you need to provide multiple references for + * a transaction, separate them with hyphens ("-"). Maximum length: 80 characters. + * + * @var string + */ + private $reference; + + /** + * The URL to return to. + * + * @var string + */ + private $return_url; + + /** + * The shopper's IP address. + * + * @var string|null + */ + private $shopper_ip; + + /** + * The combination of a language code and a country code to specify the language to be used in the payment. + * + * @var string|null + */ + private $shopper_locale; + + /** + * The shopper's full name and gender (if specified) + * + * @var Name|null + */ + private $shopper_name; + + /** + * The shopper's email address. We recommend that you provide this data, as it is used in velocity fraud checks. + * + * @var string|null + */ + private $shopper_email; + + /** + * The shopper's reference to uniquely identify this shopper (e.g. user ID or account ID). This field is + * required for recurring payments + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_shopperReference + * @var string|null + */ + private $shopper_reference; + + /** + * The text to appear on the shopper's bank statement. + * + * @var string|null + */ + private $shopper_statement; + + /** + * The shopper's telephone number + * + * @var string|null + */ + private $telephone_number; + + /** + * Construct a payment request object. + * + * @param Amount $amount The amount information for the transaction. + * @param string $merchant_account The merchant account identifier, with which you want to process the transaction. + * @param string $reference The reference to uniquely identify a payment. + * @param string $return_url The URL to return to. + */ + public function __construct( Amount $amount, $merchant_account, $reference, $return_url ) { + $this->amount = $amount; + $this->merchant_account = $merchant_account; + $this->reference = $reference; + $this->return_url = $return_url; + } + + /** + * Get amount. + * + * @return Amount + */ + public function get_amount() { + return $this->amount; + } + + /** + * Get application info. + * + * @return ApplicationInfo|null + */ + public function get_application_info() { + return $this->application_info; + } + + /** + * Set application info. + * + * @param ApplicationInfo|null $application_info Application info. + * @return void + */ + public function set_application_info( $application_info ) { + $this->application_info = $application_info; + } + + /** + * Get billing address. + * + * @return Address|null + */ + public function get_billing_address() { + return $this->billing_address; + } + + /** + * Set billing address. + * + * @param Address|null $billing_address Billing address. + * @return void + */ + public function set_billing_address( Address $billing_address = null ) { + $this->billing_address = $billing_address; + } + + /** + * Get channel. + * + * @return string|null + */ + public function get_channel() { + return $this->channel; + } + + /** + * Set channel. + * + * @param string|null $channel Channel. + * @return void + */ + public function set_channel( $channel ) { + $this->channel = $channel; + } + + /** + * Get country code. + * + * @return string|null + */ + public function get_country_code() { + return $this->country_code; + } + + /** + * Set country code. + * + * @param string|null $country_code Country code. + * @return void + * @throws InvalidArgumentException Throws invalid argument exception when country code is not 2 characters. + */ + public function set_country_code( $country_code ) { + if ( null !== $country_code && 2 !== strlen( $country_code ) ) { + throw new InvalidArgumentException( + sprintf( + 'Given country code `%s` not ISO 3166-1 alpha-2 value.', + $country_code + ) + ); + } + + $this->country_code = $country_code; + } + + /** + * Get date of birth. + * + * @return DateTime|null + */ + public function get_date_of_birth() { + return $this->date_of_birth; + } + + /** + * Set date of birth. + * + * @param DateTime|null $date_of_birth Date of birth. + * @return void + */ + public function set_date_of_birth( DateTime $date_of_birth = null ) { + $this->date_of_birth = $date_of_birth; + } + + /** + * Get delivery address. + * + * @return Address|null + */ + public function get_delivery_address() { + return $this->delivery_address; + } + + /** + * Set delivery address. + * + * @param Address|null $delivery_address Delivery address. + * @return void + */ + public function set_delivery_address( Address $delivery_address = null ) { + $this->delivery_address = $delivery_address; + } + + /** + * Get line items. + * + * @return LineItems|null + */ + public function get_line_items() { + return $this->line_items; + } + + /** + * Set line items. + * + * @param LineItems|null $line_items Line items. + * @return void + */ + public function set_line_items( $line_items ) { + $this->line_items = $line_items; + } + + /** + * Create and set new line items. + * + * @return LineItems + */ + public function new_line_items() { + $this->line_items = new LineItems(); + + return $this->line_items; + } + + /** + * Get merchant account. + * + * @return string + */ + public function get_merchant_account() { + return $this->merchant_account; + } + + + /** + * Get merchant order reference. + * + * @return mixed + */ + public function get_merchant_order_reference() { + return $this->merchant_order_reference; + } + + /** + * Set merchant order reference. + * + * @param mixed $merchant_order_reference Merchant order reference. + * @return void + */ + public function set_merchant_order_reference( $merchant_order_reference ) { + $this->merchant_order_reference = $merchant_order_reference; + } + + /** + * Get metadata. + * + * @return array|null + */ + public function get_metadata() { + return $this->metadata; + } + + /** + * Set metadata. + * + * @param array|null $metadata Metadata. + * @return void + */ + public function set_metadata( $metadata ) { + $this->metadata = $metadata; + } + + /** + * Get reference. + * + * @return string + */ + public function get_reference() { + return $this->reference; + } + + /** + * Get return URL. + * + * @return string + */ + public function get_return_url() { + return $this->return_url; + } + + /** + * Get shopper IP. + * + * @return string|null + */ + public function get_shopper_ip() { + return $this->shopper_ip; + } + + /** + * Set shopper IP. + * + * @param string|null $shopper_ip Shopper IP. + * @return void + */ + public function set_shopper_ip( $shopper_ip ) { + $this->shopper_ip = $shopper_ip; + } + + /** + * Get shopper locale. + * + * @return string|null + */ + public function get_shopper_locale() { + return $this->shopper_locale; + } + + /** + * Set shopper locale. + * + * @param string|null $shopper_locale Shopper locale. + * @return void + */ + public function set_shopper_locale( $shopper_locale ) { + $this->shopper_locale = $shopper_locale; + } + + /** + * Get shopper name. + * + * @return Name|null + */ + public function get_shopper_name() { + return $this->shopper_name; + } + + /** + * Set shopper name. + * + * @param Name|null $shopper_name Shopper name. + * @return void + */ + public function set_shopper_name( Name $shopper_name = null ) { + $this->shopper_name = $shopper_name; + } + + /** + * Get shopper email. + * + * @return string|null + */ + public function get_shopper_email() { + return $this->shopper_email; + } + + /** + * Set shopper email. + * + * @param string|null $shopper_email Shopper email. + * + * @return void + */ + public function set_shopper_email( $shopper_email = null ) { + $this->shopper_email = $shopper_email; + } + + /** + * Get shopper reference. + * + * @return string|null + */ + public function get_shopper_reference() { + return $this->shopper_reference; + } + + /** + * Set shopper reference. + * + * @param string|null $shopper_reference Shopper reference. + * @return void + */ + public function set_shopper_reference( $shopper_reference ) { + $this->shopper_reference = $shopper_reference; + } + + /** + * Get shopper statement. + * + * @return string|null + */ + public function get_shopper_statement() { + return $this->shopper_statement; + } + + /** + * Set shopper statement. + * + * @param string|null $shopper_statement Shopper statement. + * @return void + */ + public function set_shopper_statement( $shopper_statement ) { + $this->shopper_statement = $shopper_statement; + } + + /** + * Get telephone number. + * + * @return string|null + */ + public function get_telephone_number() { + return $this->telephone_number; + } + + /** + * Set shopper statement. + * + * @param string|null $telephone_number Telephone number. + * @return void + */ + public function set_telephone_number( $telephone_number ) { + $this->telephone_number = $telephone_number; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $metadata = $this->get_metadata(); + + $properties = Util::filter_null( + array( + 'amount' => $this->get_amount()->get_json(), + 'applicationInfo' => $this->application_info, + 'billingAddress' => is_null( $this->billing_address ) ? null : $this->billing_address->get_json(), + 'channel' => $this->channel, + 'countryCode' => $this->country_code, + 'dateOfBirth' => is_null( $this->date_of_birth ) ? null : $this->date_of_birth->format( 'Y-m-d' ), + 'deliveryAddress' => is_null( $this->delivery_address ) ? null : $this->delivery_address->get_json(), + 'lineItems' => is_null( $this->line_items ) ? null : $this->line_items->get_json(), + 'merchantAccount' => $this->get_merchant_account(), + 'merchantOrderReference' => $this->get_merchant_order_reference(), + 'metadata' => empty( $metadata ) ? null : (object) $metadata, + 'reference' => $this->get_reference(), + 'returnUrl' => $this->get_return_url(), + 'shopperIP' => $this->shopper_ip, + 'shopperLocale' => $this->shopper_locale, + 'shopperName' => is_null( $this->shopper_name ) ? null : $this->shopper_name->get_json(), + 'shopperEmail' => $this->shopper_email, + 'shopperReference' => $this->shopper_reference, + 'shopperStatement' => $this->shopper_statement, + 'telephoneNumber' => $this->telephone_number, + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ActionInformation.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ActionInformation.php new file mode 100644 index 00000000..c3e86052 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ActionInformation.php @@ -0,0 +1,284 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Action information + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Reüel van der Steege + * @version 1.1.0 + * @since 1.1.0 + */ +class ActionInformation extends ResponseObject { + /** + * When the redirect URL must be accessed via POST, use this data to post to the redirect URL. + * + * @var object|null + */ + private $data; + + /** + * The web method that you must use to access the redirect URL. + * + * Possible values: GET, POST. + * + * @var string|null + */ + private $method; + + /** + * When non-empty, contains a value that you must submit to the /payments/details endpoint. In some cases, required for polling. + * + * @var string|null + */ + private $payment_data; + + /** + * Specifies the payment method. + * + * @var string|null + */ + private $payment_method_type; + + /** + * A token to pass to the 3DS2 Component to get the fingerprint/challenge. + * + * @var string|null + */ + private $token; + + /** + * Enum that specifies the action that needs to be taken by the client. + * + * @var string|null + */ + private $type; + + /** + * The URL, to which you must redirect a shopper to complete a payment + * + * @var string|null + */ + private $url; + + /** + * Get data. + * + * @return object|null + */ + public function get_data() { + return $this->data; + } + + /** + * Set data. + * + * @param object|null $data Data. + * @return void + */ + public function set_data( $data ) { + $this->data = $data; + } + + /** + * Get method. + * + * @return string|null + */ + public function get_method() { + return $this->method; + } + + /** + * Set method. + * + * @param string|null $method Method. + * @return void + */ + public function set_method( $method ) { + $this->method = $method; + } + + /** + * Get payment data. + * + * @return string|null + */ + public function get_payment_data() { + return $this->payment_data; + } + + /** + * Set payment data. + * + * @param string|null $payment_data Payment data. + * @return void + */ + public function set_payment_data( $payment_data ) { + $this->payment_data = $payment_data; + } + + /** + * Get payment method type. + * + * @return string|null + */ + public function get_payment_method_type() { + return $this->payment_method_type; + } + + /** + * Set payment method type. + * + * @param string|null $payment_method_type Payment method type. + * @return void + */ + public function set_payment_method_type( $payment_method_type ) { + $this->payment_method_type = $payment_method_type; + } + + /** + * Get token. + * + * @return string|null + */ + public function get_token() { + return $this->token; + } + + /** + * Set token. + * + * @param string|null $token Token. + * @return void + */ + public function set_token( $token ) { + $this->token = $token; + } + + /** + * Get type. + * + * @return string|null + */ + public function get_type() { + return $this->type; + } + + /** + * Set type. + * + * @param string|null $type Type. + * @return void + */ + public function set_type( $type ) { + $this->type = $type; + } + + /** + * Get URL. + * + * @return string|null + */ + public function get_url() { + return $this->url; + } + + /** + * Set URL. + * + * @param string|null $url URL. + * @return void + */ + public function set_url( $url ) { + $this->url = $url; + } + + /** + * Create action information from object. + * + * @param object $object Object. + * @return ActionInformation + * @throws \JsonSchema\Exception\ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/action.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $action = new self(); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + if ( isset( $object->data ) ) { + $action->set_data( $object->data ); + } + + if ( isset( $object->method ) ) { + $action->set_method( $object->method ); + } + + if ( isset( $object->paymentData ) ) { + $action->set_payment_data( $object->paymentData ); + } + + if ( isset( $object->paymentMethodType ) ) { + $action->set_payment_method_type( $object->paymentMethodType ); + } + + if ( isset( $object->token ) ) { + $action->set_token( $object->token ); + } + + if ( isset( $object->type ) ) { + $action->set_type( $object->type ); + } + + if ( isset( $object->url ) ) { + $action->set_url( $object->url ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + return $action; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'data' => $this->get_data(), + 'method' => $this->get_method(), + 'paymentData' => $this->get_payment_data(), + 'paymentMethodType' => $this->get_payment_method_type(), + 'token' => $this->get_token(), + 'type' => $this->get_type(), + 'url' => $this->get_url(), + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Address.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Address.php new file mode 100644 index 00000000..e9d92caf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Address.php @@ -0,0 +1,262 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use InvalidArgumentException; + +/** + * Address + * + * @link https://docs.adyen.com/developers/api-reference/common-api/address + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Address { + /** + * City. + * + * @var string|null + */ + private $city; + + /** + * Country. + * + * @var string + */ + private $country; + + /** + * House number or name. + * + * @var string|null + */ + private $house_number_or_name; + + /** + * Postal code. + * + * @var string|null + */ + private $postal_code; + + /** + * State or province. + * + * @var string|null + */ + private $state_or_province; + + /** + * Street. + * + * @var string|null + */ + private $street; + + /** + * Construct address. + * + * @param string $country Country. + * @param string $street Street. + * @param string $house_number_or_name House number or name. + * @param string $postal_code Postal code. + * @param string $city City. + * @param string $state_or_province State or province. + * + * @throws InvalidArgumentException Throws invalid argument exception when Adyen address requirements are not met. + */ + public function __construct( $country, $street = null, $house_number_or_name = null, $postal_code = null, $city = null, $state_or_province = null ) { + /* + * The two-character country code of the address. + * + * The permitted country codes are defined in ISO-3166-1 alpha-2 (e.g. 'NL'). + */ + if ( 2 !== strlen( $country ) ) { + throw new InvalidArgumentException( + sprintf( + 'Given country `%s` not ISO 3166-1 alpha-2 value.', + $country + ) + ); + } + + /* + * The name of the street. + * + * > The house number should not be included in this field; it should be separately provided via houseNumberOrName. + * + * Required if either `houseNumberOrName`, `city`, `postalCode`, or `stateOrProvince` are provided. + */ + $fields = array_filter( array( $house_number_or_name, $city, $postal_code, $state_or_province ) ); + + if ( empty( $street ) && ! empty( $fields ) ) { + throw new InvalidArgumentException( + 'The name of the street is required if either `houseNumberOrName`, `city`, `postalCode`, or `stateOrProvince` are provided.' + ); + } + + /* + * The postal code. + * + * A maximum of five (5) digits for an address in the USA, or a maximum of ten (10) characters for an address in all other countries. + * + * Required if either `houseNumberOrName`, `street`, `city`, or `stateOrProvince` are provided. + */ + $fields = array_filter( array( $house_number_or_name, $street, $city, $state_or_province ) ); + + if ( empty( $postal_code ) && ! empty( $fields ) ) { + throw new InvalidArgumentException( + 'The postal code is required if either `houseNumberOrName`, `street`, `city`, or `stateOrProvince` are provided.' + ); + } + + if ( ! empty( $postal_code ) ) { + $max = ( 'US' === $country ) ? 5 : 10; + + if ( strlen( $postal_code ) > $max ) { + throw new InvalidArgumentException( + sprintf( + 'Given postal code `%s` is longer then `%d` digits.', + $postal_code, + $max + ) + ); + } + } + + /* + * The name of the city. + * + * Required if either `houseNumberOrName`, `street`, `postalCode`, or `stateOrProvince` are provided. + */ + $fields = array_filter( array( $house_number_or_name, $street, $postal_code, $state_or_province ) ); + + if ( empty( $city ) && ! empty( $fields ) ) { + throw new InvalidArgumentException( + 'The name of the city is required if either `houseNumberOrName`, `street`, `postalCode`, or `stateOrProvince` are provided.' + ); + } + + /* + * Two (2) characters for an address in the USA or Canada, or a maximum of three (3) characters for an address in all other countries. + * + * Required for an address in the USA or Canada if either `houseNumberOrName`, `street`, `city`, or `postalCode` are provided. + */ + $fields = array_filter( array( $house_number_or_name, $street, $city, $postal_code ) ); + + if ( empty( $state_or_province ) && in_array( $country, array( 'CA', 'US' ), true ) && ! empty( $fields ) ) { + throw new InvalidArgumentException( + 'State or province is required for an address in the USA or Canada if either `houseNumberOrName`, `street`, `city`, or `postalCode` are provided.' + ); + } + + if ( ! empty( $state_or_province ) ) { + $max = in_array( $country, array( 'CA', 'US' ), true ) ? 2 : 3; + + if ( strlen( $state_or_province ) > $max ) { + throw new InvalidArgumentException( + sprintf( + 'Given state or province `%s` is longer then `%d` digits.', + $state_or_province, + $max + ) + ); + } + } + + // Ok. + $this->country = $country; + $this->street = $street; + $this->house_number_or_name = $house_number_or_name; + $this->postal_code = $postal_code; + $this->city = $city; + $this->state_or_province = $state_or_province; + } + + /** + * Get city. + * + * @return string|null + */ + public function get_city() { + return $this->city; + } + + /** + * Get country. + * + * @return string + */ + public function get_country() { + return $this->country; + } + + /** + * Get house number or name. + * + * @return string|null + */ + public function get_house_number_or_name() { + return $this->house_number_or_name; + } + + /** + * Get postal code. + * + * @return string|null + */ + public function get_postal_code() { + return $this->postal_code; + } + + /** + * Get state or province. + * + * @return string|null + */ + public function get_state_or_province() { + return $this->state_or_province; + } + + /** + * Get street. + * + * @return string|null + */ + public function get_street() { + return $this->street; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'country' => $this->country, + 'city' => $this->city, + 'houseNumberOrName' => $this->house_number_or_name, + 'postalCode' => $this->postal_code, + 'stateOrProvince' => $this->state_or_province, + 'street' => $this->street, + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AddressTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AddressTransformer.php new file mode 100644 index 00000000..2fb567e2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AddressTransformer.php @@ -0,0 +1,66 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use InvalidArgumentException; +use Pronamic\WordPress\Pay\Address as Pay_Address; + +/** + * Address transformer + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class AddressTransformer { + /** + * Transform WordPress Pay address to Adyen address. + * + * @param Pay_Address $address WordPress Pay address to convert. + * @return Address|null + */ + public static function transform( Pay_Address $address ) { + $country = $address->get_country(); + + if ( null === $country ) { + return null; + } + + $country_code = $country->get_code(); + + if ( null === $country_code ) { + return null; + } + + $state_or_province = null; + + $region = $address->get_region(); + + if ( null !== $region ) { + $state_or_province = $region->get_code(); + } + + try { + $address = new Address( + $country_code, + $address->get_street_name(), + (string) $address->get_house_number(), + $address->get_postal_code(), + $address->get_city(), + $state_or_province + ); + } catch ( InvalidArgumentException $exception ) { + return null; + } + + return $address; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Amount.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Amount.php new file mode 100644 index 00000000..c0186e0d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Amount.php @@ -0,0 +1,122 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Amount + * + * @link https://docs.adyen.com/developers/api-reference/common-api/amount + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Amount implements \JsonSerializable { + /** + * Currency. + * + * @var string + */ + private $currency; + + /** + * Value. + * + * @var int + */ + private $value; + + /** + * Construct amount. + * + * @param string $currency Currency. + * @param int $value Value. + * + * @throws \InvalidArgumentException Throws invalid argument exception when Adyen amount requirements are not met. + */ + public function __construct( $currency, $value ) { + if ( 3 !== strlen( $currency ) ) { + throw new \InvalidArgumentException( + sprintf( + 'Given currency `%s` not a three-character ISO currency code.', + $currency + ) + ); + } + + $this->currency = $currency; + $this->value = $value; + } + + /** + * Get currency. + * + * @return string + */ + public function get_currency() { + return $this->currency; + } + + /** + * Get amount. + * + * @return int + */ + public function get_value() { + return $this->value; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + return (object) array( + 'currency' => $this->get_currency(), + 'value' => $this->get_value(), + ); + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return object + */ + public function jsonSerialize() { + return $this->get_json(); + } + + /** + * Create amount from object. + * + * @param object $object Object. + * @return Amount + * @throws \JsonSchema\Exception\ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/amount.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return new self( + $object->currency, + $object->value + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AmountTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AmountTransformer.php new file mode 100644 index 00000000..552381af --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/AmountTransformer.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use InvalidArgumentException; +use Pronamic\WordPress\Money\Money; + +/** + * Amount transformer + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class AmountTransformer { + /** + * Transform Pronamic money to Adyen amount. + * + * @param Money $money Pronamic money to convert. + * @return Amount + * @throws InvalidArgumentException Throws invalid argument exception when WordPress money object does not contain a currency with an alphabetic code. + */ + public static function transform( Money $money ) { + $currency = $money->get_currency()->get_alphabetic_code(); + + if ( null === $currency ) { + throw new InvalidArgumentException( 'Can not transform WordPress money object to Adyen amount object due to empty currency code.' ); + } + + $amount = new Amount( + $currency, + $money->get_minor_units() + ); + + return $amount; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ApplicationInfo.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ApplicationInfo.php new file mode 100644 index 00000000..c91dcb7f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ApplicationInfo.php @@ -0,0 +1,103 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Application info + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo + * @link https://docs.adyen.com/development-resources/building-adyen-solutions + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class ApplicationInfo implements \JsonSerializable { + /** + * Adyen-developed software, such as libraries and plugins, used to interact with the Adyen API. For example, Magento plugin, Java API library, etc. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo-adyenLibrary + * @var object|null + */ + public $adyen_library; + + /** + * Adyen-developed software to get payment details. For example, Checkout SDK, Secured Fields SDK, etc. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo-adyenPaymentSource + * @var object|null + */ + public $adyen_payment_source; + + /** + * Third-party developed platform used to initiate payment requests. For example, Magento, Zuora, etc. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo-externalPlatform + * @var object|null + */ + public $external_platform; + + /** + * Merchant developed software, such as cashier application, used to interact with the Adyen API. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo-merchantApplication + * @var object|null + */ + public $merchant_application; + + /** + * Merchant device information. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo-merchantDevice + * @var object|null + */ + public $merchant_device; + + /** + * Shopper interaction device, such as terminal, mobile device or web browser, to initiate payment requests. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo-shopperInteractionDevice + * @var object|null + */ + public $shopper_interaction_device; + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'adyenLibrary' => $this->adyen_library, + 'adyenPaymentSource' => $this->adyen_payment_source, + 'externalPlatform' => $this->external_platform, + 'merchantApplication' => $this->merchant_application, + 'merchantDevice' => $this->merchant_device, + 'shopperInteractionDevice' => $this->shopper_interaction_device, + ) + ); + + $object = (object) $properties; + + return $object; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return object + */ + public function jsonSerialize() { + return $this->get_json(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/BrowserInformation.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/BrowserInformation.php new file mode 100644 index 00000000..f7c59dba --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/BrowserInformation.php @@ -0,0 +1,355 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Browser information + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_browserInfo + * @link https://docs.adyen.com/development-resources/building-adyen-solutions + * + * @author Reüel van der Steege + * @version 1.1.1 + * @since 1.1.1 + */ +class BrowserInformation implements \JsonSerializable { + /** + * The accept header value of the shopper's browser. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_browserInfo-acceptHeader + * @var string|null + */ + private $accept_header; + + /** + * The color depth of the shopper's browser in bits per pixel. This should be obtained by using the browser's + * screen.colorDepth property. Accepted values: 1, 4, 8, 15, 16, 24, 32 or 48 bit color depth. + * + * @link + * @var int|null + */ + private $color_depth; + + /** + * Boolean value indicating if the shopper's browser is able to execute Java. + * + * @link + * @var bool|null + */ + private $java_enabled; + + /** + * Boolean value indicating if the shopper's browser is able to execute JavaScript. + * A default 'true' value is assumed if the field is not present. + * + * @link + * @var bool|null + */ + private $javascript_enabled; + + /** + * The navigator.language value of the shopper's browser (as defined in IETF BCP 47). + * + * @link + * @var string|null + */ + private $language; + + /** + * The total height of the shopper's device screen in pixels. + * + * @link + * @var int|null + */ + private $screen_height; + + /** + * The total width of the shopper's device screen in pixels. + * + * @link + * @var int|null + */ + private $screen_width; + + /** + * Time difference between UTC time and the shopper's browser local time, in minutes. + * + * @link + * @var int|null + */ + private $timezone_offset; + + /** + * The user agent value of the shopper's browser. + * + * @link + * @var string|null + */ + private $user_agent; + + /** + * Get accept header. + * + * @return string|null + */ + public function get_accept_header() { + return $this->accept_header; + } + + /** + * Set accept header. + * + * @param string|null $accept_header Accept header. + * @return void + */ + public function set_accept_header( $accept_header ) { + $this->accept_header = $accept_header; + } + + /** + * Get color depth. + * + * @return int|null + */ + public function get_color_depth() { + return $this->color_depth; + } + + /** + * Set color depth. + * + * @param int|null $color_depth Color depth. + * @return void + */ + public function set_color_depth( $color_depth ) { + $this->color_depth = $color_depth; + } + + /** + * Get java enabled. + * + * @return bool|null + */ + public function get_java_enabled() { + return $this->java_enabled; + } + + /** + * Set java enabled. + * + * @param bool|null $java_enabled Java enabled. + * @return void + */ + public function set_java_enabled( $java_enabled ) { + $this->java_enabled = $java_enabled; + } + + /** + * Get javascript enabled. + * + * @return bool|null + */ + public function get_javascript_enabled() { + return $this->javascript_enabled; + } + + /** + * Set javascript enabled. + * + * @param bool|null $javascript_enabled Javascript enabled. + * @return void + */ + public function set_javascript_enabled( $javascript_enabled ) { + $this->javascript_enabled = $javascript_enabled; + } + + /** + * Get language. + * + * @return string|null + */ + public function get_language() { + return $this->language; + } + + /** + * Set language. + * + * @param string|null $language Language. + * @return void + */ + public function set_language( $language ) { + $this->language = $language; + } + + /** + * Get screen height. + * + * @return int|null + */ + public function get_screen_height() { + return $this->screen_height; + } + + /** + * Set screen height. + * + * @param int|null $screen_height Screen height. + * @return void + */ + public function set_screen_height( $screen_height ) { + $this->screen_height = $screen_height; + } + + /** + * Get screen width. + * + * @return int|null + */ + public function get_screen_width() { + return $this->screen_width; + } + + /** + * Set screen width. + * + * @param int|null $screen_width Screen width. + * @return void + */ + public function set_screen_width( $screen_width ) { + $this->screen_width = $screen_width; + } + + /** + * Get timezone offset. + * + * @return int|null + */ + public function get_timezone_offset() { + return $this->timezone_offset; + } + + /** + * Set timezone offset. + * + * @param int|null $timezone_offset Timezone offset. + * @return void + */ + public function set_timezone_offset( $timezone_offset ) { + $this->timezone_offset = $timezone_offset; + } + + /** + * Get user agent. + * + * @return string|null + */ + public function get_user_agent() { + return $this->user_agent; + } + + /** + * Set user agent. + * + * @param string|null $user_agent User agent. + * @return void + */ + public function set_user_agent( $user_agent ) { + $this->user_agent = $user_agent; + } + + /** + * Create browser information from object. + * + * @param object $object Object. + * @return BrowserInformation + */ + public static function from_object( $object ) { + $browser_information = new self(); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + if ( isset( $object->acceptHeader ) ) { + $browser_information->set_accept_header( $object->acceptHeader ); + } + + if ( isset( $object->colorDepth ) ) { + $browser_information->set_color_depth( $object->colorDepth ); + } + + if ( isset( $object->javaEnabled ) ) { + $browser_information->set_java_enabled( $object->javaEnabled ); + } + + if ( isset( $object->javaScriptEnabled ) ) { + $browser_information->set_javascript_enabled( $object->javaScriptEnabled ); + } + + if ( isset( $object->language ) ) { + $browser_information->set_language( $object->language ); + } + + if ( isset( $object->screenHeight ) ) { + $browser_information->set_screen_height( $object->screenHeight ); + } + + if ( isset( $object->screenWidth ) ) { + $browser_information->set_screen_width( $object->screenWidth ); + } + + if ( isset( $object->timeZoneOffset ) ) { + $browser_information->set_timezone_offset( $object->timeZoneOffset ); + } + + if ( isset( $object->userAgent ) ) { + $browser_information->set_user_agent( $object->userAgent ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + return $browser_information; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'acceptHeader' => $this->get_accept_header(), + 'colorDepth' => $this->get_color_depth(), + 'javaEnabled' => $this->get_java_enabled(), + 'javaScriptEnabled' => $this->get_javascript_enabled(), + 'language' => $this->get_language(), + 'screenHeight' => $this->get_screen_height(), + 'screenWidth' => $this->get_screen_width(), + 'timeZoneOffset' => $this->get_timezone_offset(), + 'userAgent' => $this->get_user_agent(), + ) + ); + + $object = (object) $properties; + + return $object; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return object + */ + public function jsonSerialize() { + return $this->get_json(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Channel.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Channel.php new file mode 100644 index 00000000..9d500461 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Channel.php @@ -0,0 +1,43 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Channel + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Channel { + /** + * Channel iOS. + * + * @var string + */ + const IOS = 'iOS'; + + /** + * Channel Android. + * + * @var string + */ + const ANDROID = 'Android'; + + /** + * Channel web. + * + * @var string + */ + const WEB = 'Web'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Client.php new file mode 100644 index 00000000..00aea77d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Client.php @@ -0,0 +1,173 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Facades\Http; + +/** + * Adyen client + * + * @link https://github.com/adyenpayments/php/blob/master/generatepaymentform.php + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class Client { + /** + * Config. + * + * @var Config + */ + private $config; + + /** + * Constructs and initializes an Adyen client object. + * + * @param Config $config Adyen config. + */ + public function __construct( Config $config ) { + $this->config = $config; + } + + /** + * Send request with the specified action and parameters + * + * @param string $method Adyen API method. + * @param Request $request Request object. + * @return object + * @throws \Exception Throws exception when error occurs. + */ + private function send_request( $method, $request ) { + // Request. + $url = $this->config->get_api_url( $method ); + + $response = Http::request( + $url, + array( + 'method' => 'POST', + 'headers' => array( + 'X-API-key' => $this->config->get_api_key(), + 'Content-Type' => 'application/json', + ), + 'body' => \wp_json_encode( $request->get_json() ), + ) + ); + + $data = $response->json(); + + // Object. + if ( ! \is_object( $data ) ) { + throw new \Exception( + \sprintf( + 'Could not JSON decode Adyen response to an object, HTTP response: "%s", HTTP body: "%s".', + $response->status(), + $response->body() + ), + \intval( $response->status() ) + ); + } + + // Error. + if ( isset( $data->error ) ) { + $error = Error::from_object( $data->error ); + + throw $error; + } + + // Service Exception. + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + if ( isset( $data->status, $data->errorCode, $data->message, $data->errorType ) ) { + $service_exception = ServiceException::from_object( $data ); + + throw $service_exception; + } + + return $data; + } + + /** + * Create payment. + * + * @param PaymentRequest $request Payment request. + * + * @return PaymentResponse + * + * @throws \Exception Throws error if request fails. + */ + public function create_payment( PaymentRequest $request ) { + $data = $this->send_request( 'v51/payments', $request ); + + return PaymentResponse::from_object( $data ); + } + + /** + * Submit additional payment details. + * + * @param PaymentDetailsRequest $request Payment request. + * + * @return PaymentResponse + * + * @throws \Exception Throws error if request fails. + */ + public function request_payment_details( PaymentDetailsRequest $request ) { + $data = $this->send_request( 'v51/payments/details', $request ); + + return PaymentResponse::from_object( $data ); + } + + /** + * Create payment session. + * + * @param PaymentSessionRequest $request Payment session request. + * + * @return PaymentSessionResponse + * + * @throws \Exception Throws error if request fails. + */ + public function create_payment_session( PaymentSessionRequest $request ) { + $data = $this->send_request( 'v41/paymentSession', $request ); + + return PaymentSessionResponse::from_object( $data ); + } + + /** + * Get payment result. + * + * @param PaymentResultRequest $request Payment result request. + * + * @return PaymentResultResponse + * + * @throws \Exception Throws error if request fails. + */ + public function get_payment_result( PaymentResultRequest $request ) { + $data = $this->send_request( 'v41/payments/result', $request ); + + return PaymentResultResponse::from_object( $data ); + } + + /** + * Get payment methods. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/paymentMethods + * @link https://docs.adyen.com/checkout/drop-in-web#step-1-get-available-payment-methods + * + * @param PaymentMethodsRequest $request Payment methods request. + * + * @return PaymentMethodsResponse + * @throws \Exception Throws error if request fails. + */ + public function get_payment_methods( PaymentMethodsRequest $request ) { + $data = $this->send_request( 'v51/paymentMethods', $request ); + + return PaymentMethodsResponse::from_object( $data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Config.php new file mode 100644 index 00000000..5bcf4f7a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Config.php @@ -0,0 +1,184 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Config + * + * @author Remco Tolsma + * @version 1.1.1 + * @since 1.0.0 + */ +class Config extends GatewayConfig { + /** + * API Key. + * + * @var string|null + */ + public $api_key; + + /** + * API Live URL Prefix. + * + * @var string|null + */ + public $api_live_url_prefix; + + /** + * Merchant Account. + * + * @var string|null + */ + public $merchant_account; + + /** + * Merchant Order Reference. + * + * @var string|null + */ + public $merchant_order_reference; + + /** + * Origin key. + * + * @var string|null + */ + public $origin_key; + + /** + * Apple Pay merchant identifier. + * + * @var string|null + */ + public $apple_pay_merchant_id; + + /** + * Apple Pay merchant identity certificate. + * + * @var string|null + */ + public $apple_pay_merchant_id_certificate; + + /** + * Apple Pay merchant identity private key. + * + * @var string|null + */ + public $apple_pay_merchant_id_private_key; + + /** + * Apple Pay merchant identity private key password. + * + * @var string|null + */ + public $apple_pay_merchant_id_private_key_password; + + /** + * Google Pay merchant identifier. + * + * @var string|null + */ + public $google_pay_merchant_identifier; + + /** + * Get API key. + * + * @return string|null + */ + public function get_api_key() { + return $this->api_key; + } + + /** + * Get merchant account. + * + * @return string + */ + public function get_merchant_account() { + return (string) $this->merchant_account; + } + + /** + * Get merchant order reference. + * + * @return string + */ + public function get_merchant_order_reference() { + return (string) $this->merchant_order_reference; + } + + /** + * Get Apple Pay merchant identifier. + * + * @return string|null + */ + public function get_apple_pay_merchant_id() { + return $this->apple_pay_merchant_id; + } + + /** + * Get Apple Pay merchant identity certificate. + * + * @return string|null + */ + public function get_apple_pay_merchant_id_certificate() { + return $this->apple_pay_merchant_id_certificate; + } + + /** + * Get Apple Pay merchant identity private key. + * + * @return string|null + */ + public function get_apple_pay_merchant_id_private_key() { + return $this->apple_pay_merchant_id_private_key; + } + + /** + * Get Apple Pay merchant identity private key password. + * + * @return string|null + */ + public function get_apple_pay_merchant_id_private_key_password() { + return $this->apple_pay_merchant_id_private_key_password; + } + + /** + * Get Google Pay merchant identifier. + * + * @return string|null + */ + public function get_google_pay_merchant_identifier() { + return $this->google_pay_merchant_identifier; + } + + /** + * Get API URL. + * + * @param string $method API method. + * @return string + * @throws \Exception Throws exception when mode is live and API live URL prefix is empty. + */ + public function get_api_url( $method ) { + if ( Core_Gateway::MODE_TEST === $this->mode ) { + return sprintf( Endpoint::API_URL_TEST, $method ); + } + + if ( empty( $this->api_live_url_prefix ) ) { + throw new \Exception( 'Adyen API Live URL prefix is required for live configurations.' ); + } + + return sprintf( Endpoint::API_URL_LIVE, $this->api_live_url_prefix, $method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/DetailsInformation.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/DetailsInformation.php new file mode 100644 index 00000000..5bf28a55 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/DetailsInformation.php @@ -0,0 +1,123 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Details information + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Reüel van der Steege + * @version 1.1.0 + * @since 1.1.0 + */ +class DetailsInformation extends ResponseObject { + /** + * The value to provide in the result. + * + * @var string|null + */ + private $key; + + /** + * The type of the required input. + * + * @var string|null + */ + private $type; + + /** + * Get key. + * + * @return string|null + */ + public function get_key() { + return $this->key; + } + + /** + * Set key. + * + * @param string|null $key Key. + * @return void + */ + public function set_key( $key ) { + $this->key = $key; + } + + /** + * Get type. + * + * @return string|null + */ + public function get_type() { + return $this->type; + } + + /** + * Set type. + * + * @param string|null $type Type. + * @return void + */ + public function set_type( $type ) { + $this->type = $type; + } + + /** + * Create details information from object. + * + * @param object $object Object. + * @return DetailsInformation + * @throws \JsonSchema\Exception\ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/details.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $details = new self(); + + if ( isset( $object->key ) ) { + $details->set_key( $object->key ); + } + + if ( isset( $object->type ) ) { + $details->set_type( $object->type ); + } + + return $details; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'key' => $this->get_key(), + 'type' => $this->get_type(), + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/DropInGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/DropInGateway.php new file mode 100644 index 00000000..3d842443 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/DropInGateway.php @@ -0,0 +1,599 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Drop-in gateway + * + * @link https://github.com/adyenpayments/php/blob/master/generatepaymentform.php + * + * @author Remco Tolsma + * @version 1.2.1 + * @since 1.0.0 + */ +class DropInGateway extends AbstractGateway { + /** + * Web SDK version. + * + * @link https://docs.adyen.com/developers/checkout/web-sdk/release-notes-web-sdk + * + * @var string + */ + const SDK_VERSION = '3.4.0'; + + /** + * Constructs and initializes an Adyen gateway. + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + // Supported features. + $this->supports = array( + 'webhook_log', + 'webhook', + ); + } + + /** + * Get supported payment methods + * + * @return array + * @see Core_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::ALIPAY, + PaymentMethods::APPLE_PAY, + PaymentMethods::BANCONTACT, + PaymentMethods::CREDIT_CARD, + PaymentMethods::DIRECT_DEBIT, + PaymentMethods::EPS, + PaymentMethods::GIROPAY, + PaymentMethods::GOOGLE_PAY, + PaymentMethods::IDEAL, + PaymentMethods::SOFORT, + ); + } + + /** + * Start. + * + * @param Payment $payment Payment. + * @return void + */ + public function start( Payment $payment ) { + $payment->set_meta( 'adyen_sdk_version', self::SDK_VERSION ); + $payment->set_action_url( $payment->get_pay_redirect_url() ); + + /* + * API Integration + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + */ + $api_integration_payment_method_types = array( + PaymentMethodType::ALIPAY, + PaymentMethodType::IDEAL, + PaymentMethodType::DIRECT_EBANKING, + ); + + // Return early if API integration is not being used. + $payment_method_type = PaymentMethodType::transform( $payment->get_method() ); + + if ( ! in_array( $payment_method_type, $api_integration_payment_method_types, true ) ) { + return; + } + + // Payment method. + $payment_method = array( + 'type' => $payment_method_type, + ); + + if ( PaymentMethodType::IDEAL === $payment_method_type ) { + $payment_method['issuer'] = (string) $payment->get_issuer(); + } + + $payment_method = new PaymentMethod( (object) $payment_method ); + + // Create payment. + $payment_response = $this->create_payment( $payment, $payment_method ); + + // Set payment action URL. + $redirect = $payment_response->get_redirect(); + + if ( null !== $redirect ) { + $payment->set_action_url( $redirect->get_url() ); + } + } + + /** + * Payment redirect. + * + * @param Payment $payment Payment. + * @return void + */ + public function payment_redirect( Payment $payment ) { + // Check payment ID. + $payment_id = $payment->get_id(); + + if ( null === $payment_id ) { + return; + } + + $payment_response = $payment->get_meta( 'adyen_payment_response' ); + + // Only show drop-in checkout page if payment method does not redirect. + if ( is_object( $payment_response ) ) { + $payment_response = PaymentResponse::from_object( $payment_response ); + + $redirect = $payment_response->get_redirect(); + + if ( null !== $redirect ) { + \wp_redirect( $redirect->get_url() ); + } + } + + /** + * Payment methods. + */ + $request = new PaymentMethodsRequest( $this->config->get_merchant_account() ); + + if ( null !== $payment->get_method() ) { + // Payment method type. + $payment_method_type = PaymentMethodType::transform( $payment->get_method() ); + + if ( null !== $payment_method_type ) { + $request->set_allowed_payment_methods( array( $payment_method_type ) ); + } + } + + // Prevent Apple Pay if no merchant identifier has been configured. + $apple_pay_merchant_id = $this->config->get_apple_pay_merchant_id(); + + if ( empty( $apple_pay_merchant_id ) ) { + $request->set_blocked_payment_methods( array( PaymentMethodType::APPLE_PAY ) ); + } + + // Set country code. + $locale = Util::get_payment_locale( $payment ); + + $country_code = \Locale::getRegion( $locale ); + + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + $country = $billing_address->get_country_code(); + + if ( null !== $country ) { + $country_code = $country; + } + } + + $request->set_country_code( $country_code ); + $request->set_amount( AmountTransformer::transform( $payment->get_total_amount() ) ); + + try { + $payment_methods = $this->client->get_payment_methods( $request ); + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + + exit; + } + + $payment_method_types = $payment_methods->get_payment_method_types(); + + // Register scripts. + $url_script = sprintf( + 'https://checkoutshopper-%s.adyen.com/checkoutshopper/sdk/%s/adyen.js', + ( self::MODE_TEST === $payment->get_mode() ? 'test' : 'live' ), + self::SDK_VERSION + ); + + // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Version is part of URL. + wp_register_script( + 'pronamic-pay-adyen-checkout', + $url_script, + array(), + self::SDK_VERSION, + false + ); + + wp_register_script( + 'pronamic-pay-adyen-google-pay', + 'https://pay.google.com/gp/p/js/pay.js', + array(), + \pronamic_pay_plugin()->get_version(), + false + ); + + $dependencies = array( 'pronamic-pay-adyen-checkout' ); + + if ( \in_array( PaymentMethodType::GOOGLE_PAY, $payment_method_types, true ) ) { + $dependencies[] = 'pronamic-pay-adyen-google-pay'; + } + + wp_register_script( + 'pronamic-pay-adyen-checkout-drop-in', + plugins_url( '../js/dist/checkout-drop-in.js', __FILE__ ), + $dependencies, + \pronamic_pay_plugin()->get_version(), + true + ); + + // Register styles. + $url_stylesheet = sprintf( + 'https://checkoutshopper-%s.adyen.com/checkoutshopper/sdk/%s/adyen.css', + ( self::MODE_TEST === $payment->get_mode() ? 'test' : 'live' ), + self::SDK_VERSION + ); + + // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- Version is part of URL. + wp_register_style( + 'pronamic-pay-adyen-checkout', + $url_stylesheet, + array(), + null + ); + + /** + * Adyen checkout configuration. + * + * @link https://docs.adyen.com/checkout/drop-in-web + * @link https://docs.adyen.com/checkout/components-web + */ + $configuration = (object) array( + 'locale' => Util::get_payment_locale( $payment ), + 'environment' => ( self::MODE_TEST === $payment->get_mode() ? 'test' : 'live' ), + 'originKey' => $this->config->origin_key, + 'paymentMethodsResponse' => $payment_methods->get_original_object(), + 'amount' => AmountTransformer::transform( $payment->get_total_amount() )->get_json(), + ); + + /** + * Filters the Adyen checkout configuration. + * + * @param object $configuration Adyen checkout configuration. + * @since 1.2.0 + */ + $configuration = apply_filters( 'pronamic_pay_adyen_checkout_configuration', $configuration ); + + wp_localize_script( + 'pronamic-pay-adyen-checkout', + 'pronamicPayAdyenCheckout', + array( + 'paymentMethodsConfiguration' => $this->get_checkout_payment_methods_configuration( $payment_method_types, $payment ), + 'paymentsUrl' => rest_url( Integration::REST_ROUTE_NAMESPACE . '/payments/' . $payment_id ), + 'paymentsDetailsUrl' => rest_url( Integration::REST_ROUTE_NAMESPACE . '/payments/details/' ), + 'applePayMerchantValidationUrl' => rest_url( Integration::REST_ROUTE_NAMESPACE . '/payments/applepay/merchant-validation/' . $payment_id ), + 'paymentReturnUrl' => $payment->get_return_url(), + 'configuration' => $configuration, + 'paymentAuthorised' => __( 'Payment completed successfully.', 'pronamic_ideal' ), + 'paymentReceived' => __( 'The order has been received and we are waiting for the payment to clear.', 'pronamic_ideal' ), + 'paymentRefused' => __( 'The payment has been refused. Please try again using a different method or card.', 'pronamic_ideal' ), + ) + ); + + // Add checkout head action. + add_action( 'pronamic_pay_adyen_checkout_head', array( $this, 'checkout_head' ) ); + + // No cache. + Core_Util::no_cache(); + + require __DIR__ . '/../views/checkout-drop-in.php'; + + exit; + } + + /** + * Checkout head. + * + * @return void + */ + public function checkout_head() { + wp_print_styles( 'pronamic-pay-redirect' ); + + wp_print_scripts( 'pronamic-pay-adyen-checkout' ); + + wp_print_styles( 'pronamic-pay-adyen-checkout' ); + } + + /** + * Update status of the specified payment. + * + * @param Payment $payment Payment. + * + * @return void + */ + public function update_status( Payment $payment ) { + // Process payload on return. + if ( filter_has_var( INPUT_GET, 'payload' ) ) { + $payload = filter_input( INPUT_GET, 'payload', FILTER_SANITIZE_STRING ); + + $payment_result_request = new PaymentResultRequest( $payload ); + + try { + $payment_result_response = $this->client->get_payment_result( $payment_result_request ); + + PaymentResultHelper::update_payment( $payment, $payment_result_response ); + } catch ( \Exception $e ) { + $note = sprintf( + /* translators: %s: exception message */ + __( 'Error getting payment result: %s', 'pronamic_ideal' ), + $e->getMessage() + ); + + $payment->add_note( $note ); + } + + return; + } + + // Retrieve status from payment details. + $payment_response = $payment->get_meta( 'adyen_payment_response' ); + + if ( is_object( $payment_response ) ) { + $payment_response = PaymentResponse::from_object( $payment_response ); + + $details_result = $payment->get_meta( 'adyen_details_result' ); + + // Set details result meta from GET or POST request parameters. + if ( '' === $details_result ) { + $details_result = array(); + + $details = $payment_response->get_details(); + + if ( null !== $details ) { + $input_type = ( 'POST' === Server::get( 'REQUEST_METHOD' ) ? INPUT_POST : INPUT_GET ); + + foreach ( $details as $detail ) { + $key = (string) $detail->get_key(); + + $details_result[ $key ] = \filter_input( $input_type, $key, FILTER_SANITIZE_STRING ); + } + + $details_result = Util::filter_null( $details_result ); + } + + if ( ! empty( $details_result ) ) { + $payment->set_meta( 'adyen_details_result', \wp_json_encode( (object) $details_result ) ); + } + } + + $payment_data = $payment_response->get_payment_data(); + + // Do not attempt to retrieve status without any request data, + // payment status already updated when additional details were submitted (i.e. cards). + if ( empty( $details_result ) && empty( $payment_data ) ) { + return; + } + + // Update payment status from payment details. + $payment_details_request = new PaymentDetailsRequest(); + + $payment_details_request->set_details( (object) $details_result ); + + $payment_details_request->set_payment_data( $payment_data ); + + try { + $payment_details_response = $this->client->request_payment_details( $payment_details_request ); + + PaymentResponseHelper::update_payment( $payment, $payment_details_response ); + } catch ( \Exception $e ) { + $note = sprintf( + /* translators: %s: exception message */ + __( 'Error getting payment details: %s', 'pronamic_ideal' ), + $e->getMessage() + ); + + $payment->add_note( $note ); + } + } + } + + /** + * Create payment. + * + * @param Payment $payment Payment. + * @param PaymentMethod $payment_method Payment method. + * @param object $data Adyen `state.data` object from drop-in. + * + * @return PaymentResponse + * @throws \InvalidArgumentException Throws exception on invalid amount. + * @throws \Exception Throws exception if payment creation request fails. + */ + public function create_payment( Payment $payment, PaymentMethod $payment_method, $data = null ) { + $amount = AmountTransformer::transform( $payment->get_total_amount() ); + + // Payment request. + $payment_request = new PaymentRequest( + $amount, + $this->config->get_merchant_account(), + (string) $payment->get_id(), + $payment->get_return_url(), + $payment_method + ); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + // Set browser info. + if ( \is_object( $data ) && isset( $data->browserInfo ) ) { + $browser_info = BrowserInformation::from_object( $data->browserInfo ); + + $payment_request->set_browser_info( $browser_info ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + // Merchant order reference. + $payment_request->set_merchant_order_reference( $payment->format_string( $this->config->get_merchant_order_reference() ) ); + + /** + * Application info. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_applicationInfo + * @link https://docs.adyen.com/development-resources/building-adyen-solutions + */ + $application_info = new ApplicationInfo(); + + $application_info->merchant_application = (object) array( + 'name' => 'Pronamic Pay', + 'version' => \pronamic_pay_plugin()->get_version(), + ); + + $application_info->external_platform = (object) array( + 'integrator' => 'Pronamic', + 'name' => 'WordPress', + 'version' => \get_bloginfo( 'version' ), + ); + + $payment_request->set_application_info( $application_info ); + + // Set country code. + $locale = Util::get_payment_locale( $payment ); + + $country_code = \Locale::getRegion( $locale ); + + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + $country = $billing_address->get_country_code(); + + if ( null !== $country ) { + $country_code = $country; + } + } + + $payment_request->set_country_code( $country_code ); + + // Complement payment request. + PaymentRequestHelper::complement( $payment, $payment_request ); + + // Create payment. + $payment_response = $this->client->create_payment( $payment_request ); + + /* + * Store payment response for later requests to `/payments/details`. + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments/details + */ + $payment->set_meta( 'adyen_payment_response', $payment_response->get_json() ); + + // Update payment status based on response. + PaymentResponseHelper::update_payment( $payment, $payment_response ); + + return $payment_response; + } + + /** + * Send payment details. + * + * @param PaymentDetailsRequest $payment_details_request Payment details request. + * + * @return PaymentResponse + * @throws \Exception Throws error if request fails. + */ + public function send_payment_details( PaymentDetailsRequest $payment_details_request ) { + $payment_response = $this->client->request_payment_details( $payment_details_request ); + + return $payment_response; + } + + /** + * Get checkout payment methods configuration. + * + * @param array $payment_method_types Payment method types. + * @param Payment $payment Payment. + * + * @return object + */ + public function get_checkout_payment_methods_configuration( $payment_method_types, Payment $payment ) { + $configuration = array(); + + /* + * Apple Pay. + * + * @link https://docs.adyen.com/payment-methods/apple-pay/web-drop-in#show-apple-pay-in-your-payment-form + */ + if ( \in_array( PaymentMethodType::APPLE_PAY, $payment_method_types, true ) ) { + $configuration['applepay'] = array( + 'amount' => $payment->get_total_amount()->get_minor_units(), + 'currencyCode' => $payment->get_total_amount()->get_currency()->get_alphabetic_code(), + 'configuration' => array( + 'merchantName' => \get_bloginfo( 'name' ), + 'merchantIdentifier' => $this->config->get_apple_pay_merchant_id(), + ), + ); + + // Line items. + $lines = $payment->get_lines(); + + if ( null !== $lines ) { + $line_items = array(); + + foreach ( $lines as $line ) { + $line_items[] = array( + 'label' => $line->get_name(), + 'amount' => (string) $line->get_total_amount()->get_value(), + 'type' => 'final', + ); + } + + $configuration['applepay']['lineItems'] = $line_items; + } + } + + /* + * Cards. + * + * @link https://docs.adyen.com/payment-methods/cards/web-drop-in#show-the-available-cards-in-your-payment-form + */ + if ( \in_array( PaymentMethodType::SCHEME, $payment_method_types, true ) ) { + $configuration['card'] = array( + 'hasHolderName' => true, + 'holderNameRequired' => true, + 'hideCVC' => false, + 'name' => __( 'Credit or debit card', 'pronamic_ideal' ), + ); + } + + /* + * Google Pay. + * + * @link https://docs.adyen.com/payment-methods/google-pay/web-drop-in#show-google-pay-in-your-payment-form + */ + if ( \in_array( PaymentMethodType::GOOGLE_PAY, $payment_method_types, true ) ) { + $configuration['paywithgoogle'] = array( + 'environment' => ( self::MODE_TEST === $this->config->mode ? 'TEST' : 'PRODUCTION' ), + 'amount' => array( + 'currency' => $payment->get_total_amount()->get_currency()->get_alphabetic_code(), + 'value' => $payment->get_total_amount()->get_minor_units(), + ), + 'configuration' => array( + 'gatewayMerchantId' => $this->config->merchant_account, + ), + ); + + if ( self::MODE_LIVE === $this->config->mode ) { + $configuration['paywithgoogle']['configuration']['merchantIdentifier'] = $this->config->get_google_pay_merchant_identifier(); + } + } + + return (object) $configuration; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Endpoint.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Endpoint.php new file mode 100644 index 00000000..b1c9f42d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Endpoint.php @@ -0,0 +1,36 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Endpoint + * + * @link https://docs.adyen.com/developers/development-resources/live-endpoints + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Endpoint { + /** + * API endpoint test URL. + * + * @var string + */ + const API_URL_TEST = 'https://checkout-test.adyen.com/%s'; + + /** + * API endpoint live URL. + * + * @var string + */ + const API_URL_LIVE = 'https://%s-checkout-live.adyenpayments.com/checkout/%s'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Error.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Error.php new file mode 100644 index 00000000..2f08ef0c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Error.php @@ -0,0 +1,97 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Exception; +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Error + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Error extends Exception { + /** + * The requested URI. + * + * @var string + */ + private $requested_uri; + + /** + * Construct error. + * + * @param int $code Code. + * @param string $message Message. + * @param string $requested_uri Requested URI. + */ + public function __construct( $code, $message, $requested_uri ) { + parent::__construct( $message, $code ); + + $this->requested_uri = $requested_uri; + } + + /** + * Get code. + * + * @return int + */ + public function get_code() { + return intval( $this->getCode() ); + } + + /** + * Get message. + * + * @return string + */ + public function get_message() { + return $this->getMessage(); + } + + /** + * Get requested URI. + * + * @return string + */ + public function get_requested_uri() { + return $this->requested_uri; + } + + /** + * Create error from object. + * + * @param object $object Object. + * @return Error + * @throws ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/error.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + return new self( + $object->code, + $object->message, + $object->{'requested URI'} + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ErrorType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ErrorType.php new file mode 100644 index 00000000..a9be8b1b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ErrorType.php @@ -0,0 +1,50 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Error type + * + * @link https://docs.adyen.com/developers/api-reference/common-api/serviceexception + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class ErrorType { + /** + * Indicator for 'internal' error type. + * + * @var string + */ + const INTERNAL = 'internal'; + + /** + * Indicator for 'validation' error type. + * + * @var string + */ + const VALIDATION = 'validation'; + + /** + * Indicator for 'security' error type. + * + * @var string + */ + const SECURITY = 'security'; + + /** + * Indicator for 'configuration' error type. + * + * @var string + */ + const CONFIGURATION = 'configuration'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/EventCode.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/EventCode.php new file mode 100644 index 00000000..f17535ef --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/EventCode.php @@ -0,0 +1,43 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Event Codes. + * + * @link https://docs.adyen.com/developers/development-resources/notifications/event-codes + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class EventCode { + /** + * Indicator for the 'AUTHORIZATION' event code. + * + * @var string + */ + const AUTHORIZATION = 'AUTHORISATION'; + + /** + * Indicator for the 'REPORT_AVAILABLE' event code. + * + * @var string + */ + const REPORT_AVAILABLE = 'REPORT_AVAILABLE'; + + /** + * Indicator for the 'PAIDOUT_REVERSED' event code. + * + * @var string + */ + const PAIDOUT_REVERSED = 'PAIDOUT_REVERSED'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Gender.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Gender.php new file mode 100644 index 00000000..d34470d3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Gender.php @@ -0,0 +1,43 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Gender + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Gender { + /** + * Indicator for the 'MALE' gender. + * + * @var string + */ + const MALE = 'MALE'; + + /** + * Indicator for the 'FEMALE' gender. + * + * @var string + */ + const FEMALE = 'FEMALE'; + + /** + * Indicator for the 'UNKNOWN' gender. + * + * @var string + */ + const UNKNOWN = 'UNKNOWN'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/GenderTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/GenderTransformer.php new file mode 100644 index 00000000..3a6a7e71 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/GenderTransformer.php @@ -0,0 +1,42 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Gender as Pay_Gender; + +/** + * Gender transformer + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class GenderTransformer { + /** + * Transform WordPress Pay gender to Adyen gender. + * + * @param string|null $gender WordPress Pay gender to convert. + * @return string + */ + public static function transform( $gender ) { + switch ( $gender ) { + case Pay_Gender::FEMALE: + return Gender::FEMALE; + + case Pay_Gender::MALE: + return Gender::MALE; + + case Pay_Gender::OTHER: + default: + return Gender::UNKNOWN; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Integration.php new file mode 100644 index 00000000..030652f3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Integration.php @@ -0,0 +1,756 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Dependencies\PhpExtensionDependency; +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; +use Pronamic\WordPress\Pay\Util as Pay_Util; + +/** + * Integration + * + * @author Remco Tolsma + * @version 1.1.2 + * @since 1.0.0 + */ +class Integration extends AbstractGatewayIntegration { + /** + * REST route namespace. + * + * @var string + */ + const REST_ROUTE_NAMESPACE = 'pronamic-pay/adyen/v1'; + + /** + * Construct Adyen integration. + * + * @param array> $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'id' => 'adyen', + 'name' => 'Adyen', + 'provider' => 'adyen', + 'url' => \__( 'https://www.adyen.com/', 'pronamic_ideal' ), + 'product_url' => \__( 'https://www.adyen.com/pricing', 'pronamic_ideal' ), + 'dashboard_url' => array( + \__( 'test', 'pronamic_ideal' ) => 'https://ca-test.adyen.com/ca/ca/login.shtml', + \__( 'live', 'pronamic_ideal' ) => 'https://ca-live.adyen.com/ca/ca/login.shtml', + ), + 'manual_url' => \__( 'https://www.pronamic.eu/manuals/using-adyen-pronamic-pay/', 'pronamic_ideal' ), + 'supports' => array( + 'webhook', + 'webhook_log', + ), + ) + ); + + parent::__construct( $args ); + + // Dependencies. + $dependencies = $this->get_dependencies(); + + $dependencies->add( new PhpExtensionDependency( 'intl' ) ); + } + + /** + * Setup gateway integration. + * + * @return void + */ + public function setup() { + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // Notifications controller. + $notifications_controller = new NotificationsController(); + + $notifications_controller->setup(); + + // Payments controller. + $payments_controller = new PaymentsController(); + + $payments_controller->setup(); + + // Payments result controller. + $payments_result_controller = new PaymentsResultController(); + + $payments_result_controller->setup(); + + // Site Health controller. + $site_healht_controller = new SiteHealthController(); + + $site_healht_controller->setup(); + + // Settings. + add_action( 'init', array( $this, 'init' ) ); + add_action( 'admin_init', array( $this, 'admin_init' ), 15 ); + + // Actions. + add_action( 'current_screen', array( $this, 'maybe_download_certificate_or_key' ) ); + + \add_filter( 'pronamic_gateway_configuration_display_value_' . $this->get_id(), array( $this, 'gateway_configuration_display_value' ), 10, 2 ); + } + + /** + * Initialize. + * + * @return void + */ + public function init() { + /* + * Authentication - User Name + */ + register_setting( + 'pronamic_pay', + 'pronamic_pay_adyen_notification_authentication_username', + array( + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + /* + * Authentication - Password + */ + register_setting( + 'pronamic_pay', + 'pronamic_pay_adyen_notification_authentication_password', + array( + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + } + + /** + * Admin initialize. + * + * @return void + */ + public function admin_init() { + add_settings_section( + 'pronamic_pay_adyen_notification_authentication', + /* translators: Translate 'notification' the same as in the Adyen dashboard. */ + _x( 'Adyen Notification Authentication', 'Adyen', 'pronamic_ideal' ), + array( $this, 'settings_section_notification_authentication' ), + 'pronamic_pay' + ); + + add_settings_field( + 'pronamic_pay_adyen_notification_authentication_username', + __( 'User Name', 'pronamic_ideal' ), + array( __CLASS__, 'input_element' ), + 'pronamic_pay', + 'pronamic_pay_adyen_notification_authentication', + array( + 'label_for' => 'pronamic_pay_adyen_notification_authentication_username', + ) + ); + + add_settings_field( + 'pronamic_pay_adyen_notification_authentication_password', + __( 'Password', 'pronamic_ideal' ), + array( __CLASS__, 'input_element' ), + 'pronamic_pay', + 'pronamic_pay_adyen_notification_authentication', + array( + 'label_for' => 'pronamic_pay_adyen_notification_authentication_password', + ) + ); + } + + /** + * Settings section notification authentication. + * + * @return void + */ + public function settings_section_notification_authentication() { + printf( + '

    %s

    ', + esc_html__( + 'Set the user name and password below and in the webhook authentication settings in the Adyen dashboard for increased security (recommended).', + 'pronamic_ideal' + ) + ); + } + + /** + * Input text. + * + * @param array $args Arguments. + * @return void + */ + public static function input_element( $args ) { + $name = $args['label_for']; + + $value = get_option( $name ); + $value = strval( $value ); + + printf( + '', + esc_attr( $name ), + esc_attr( $name ), + esc_attr( $value ) + ); + } + + /** + * Get settings fields. + * + * @return array>> + */ + public function get_settings_fields() { + $fields = array(); + + // Merchant Account. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_merchant_account', + 'title' => _x( 'Merchant Account', 'adyen', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'The merchant account identifier, with which you want to process the transaction.', 'pronamic_ideal' ), + ); + + // API Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_api_key', + 'title' => _x( 'API Key', 'adyen', 'pronamic_ideal' ), + 'type' => 'textarea', + 'classes' => array( 'code' ), + 'tooltip' => __( 'API key as mentioned in the payment provider dashboard.', 'pronamic_ideal' ), + 'description' => sprintf( + '%s', + esc_url( 'https://docs.adyen.com/developers/user-management/how-to-get-the-api-key' ), + esc_html__( 'Adyen documentation: "How to get the API key".', 'pronamic_ideal' ) + ), + ); + + // Live API URL prefix. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_api_live_url_prefix', + 'title' => _x( 'API Live URL Prefix', 'adyen', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'The unique prefix for the live API URL, as mentioned at Account » API URLs in the Adyen dashboard.', 'pronamic_ideal' ), + 'description' => sprintf( + '%s', + esc_url( 'https://docs.adyen.com/developers/development-resources/live-endpoints#liveurlprefix' ), + esc_html__( 'Adyen documentation: "Live URL prefix".', 'pronamic_ideal' ) + ), + ); + + // Origin Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_origin_key', + 'title' => _x( 'Origin Key', 'adyen', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( + 'regular-text', + 'code', + 'pronamic-pay-form-control-lg', + ), + 'tooltip' => __( 'An origin key is a client-side key that is used to validate Adyen\'s JavaScript component library. It is required for the Drop-in and Component integrations.', 'pronamic_ideal' ), + 'description' => sprintf( + '%s', + esc_url( 'https://docs.adyen.com/user-management/how-to-get-an-origin-key' ), + esc_html__( 'Adyen documentation: "How to get an origin key".', 'pronamic_ideal' ) + ), + ); + + // Merchant Order Reference. + $fields[] = array( + 'section' => 'advanced', + 'filter' => array( + 'filter' => \FILTER_SANITIZE_STRING, + 'flags' => \FILTER_FLAG_NO_ENCODE_QUOTES, + ), + 'meta_key' => '_pronamic_gateway_adyen_merchant_order_reference', + 'title' => __( 'Merchant Order Reference', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => \sprintf( + /* translators: %s: parameterName */ + \__( 'The Adyen %s parameter.', 'pronamic_ideal' ), + \sprintf( '%s', 'merchantOrderReference' ) + ), + 'description' => \sprintf( + '%s %s
    %s', + \__( 'Available tags:', 'pronamic_ideal' ), + \sprintf( + '%s %s', + '{order_id}', + '{payment_id}' + ), + \sprintf( + /* translators: %s: default code */ + \__( 'Default: %s', 'pronamic_ideal' ), + '{payment_id}' + ) + ), + ); + + // Apple Pay - Merchant identifier. + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_apple_pay_merchant_id', + 'title' => _x( 'Apple Pay Merchant ID', 'adyen', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Your Apple Pay Merchant ID. Required for accepting live payments.', 'pronamic_ideal' ), + 'description' => sprintf( + '%s
    %s', + esc_url( 'https://docs.adyen.com/payment-methods/apple-pay/web-drop-in#before-you-begin' ), + esc_html__( 'Adyen documentation: "Apple Pay Drop-in - Before you begin".', 'pronamic_ideal' ), + esc_url( 'https://developer.apple.com/documentation/apple_pay_on_the_web/configuring_your_environment' ), + esc_html__( 'Apple documentation: "Configuring your environment".', 'pronamic_ideal' ) + ), + ); + + // Apple Pay - Merchant Identity PKCS#12. + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_apple_pay_merchant_id_certificate', + 'title' => __( 'Apple Pay Merchant Identity Certificate', 'pronamic_ideal' ), + 'type' => 'textarea', + 'callback' => array( $this, 'field_certificate' ), + 'classes' => array( 'code' ), + 'tooltip' => __( 'The Apple Pay Merchant Identity certificate required for secure communication with Apple.', 'pronamic_ideal' ), + 'description' => sprintf( + '%s', + esc_url( 'https://docs.adyen.com/payment-methods/apple-pay/enable-apple-pay#create-merchant-identity-certificate' ), + esc_html__( 'Adyen documentation: "Enable Apple Pay - Create a merchant identity certificate".', 'pronamic_ideal' ) + ), + ); + + // Apple Pay - Merchant Identity private key. + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key', + 'title' => __( 'Apple Pay Merchant Identity Private Key', 'pronamic_ideal' ), + 'type' => 'textarea', + 'callback' => array( $this, 'field_private_key' ), + 'classes' => array( 'code' ), + 'tooltip' => __( 'The private key of the Apple Pay Merchant Identity certificate for secure communication with Apple.', 'pronamic_ideal' ), + ); + + // Apple Pay - Merchant Identity certificate private key password. + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key_password', + 'title' => _x( 'Apple Pay Merchant Identity Private Key Password', 'adyen', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Your Apple Pay Merchant Identity Certificate private key password.', 'pronamic_ideal' ), + ); + + // Google Pay - Merchant identifier. + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_adyen_google_pay_merchant_identifier', + 'title' => _x( 'Google Pay Merchant ID', 'adyen', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Your Google Merchant ID. Required for accepting live payments.', 'pronamic_ideal' ), + 'description' => sprintf( + '%s
    %s', + esc_url( 'https://docs.adyen.com/payment-methods/google-pay/web-drop-in#test-and-go-live' ), + esc_html__( 'Adyen documentation: "Google Pay Drop-in - Test and go live".', 'pronamic_ideal' ), + esc_url( 'https://developers.google.com/pay/api/web/guides/test-and-deploy/deploy-production-environment' ), + esc_html__( 'Google documentation: "Deploy production environment".', 'pronamic_ideal' ) + ), + ); + + // Webhook URL. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Webhook URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + 'value' => rest_url( self::REST_ROUTE_NAMESPACE . '/notifications' ), + 'readonly' => true, + 'tooltip' => sprintf( + /* translators: %s: payment provider name */ + __( 'Copy the Webhook URL to the %s dashboard to receive automatic transaction status updates.', 'pronamic_ideal' ), + __( 'Adyen', 'pronamic_ideal' ) + ), + ); + + /** + * SSL Version. + * + * @link https://docs.adyen.com/developers/development-resources/notifications/set-up-notifications#step3configurenotificationsinthecustomerarea + * @link https://www.howsmyssl.com/a/check + */ + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'SSL Version', 'pronamic_ideal' ), + 'type' => 'description', + 'html' => __( 'Choose the SSL Version of your server on the Adyen Customer Area.', 'pronamic_ideal' ), + ); + + /** + * Method. + * + * @link https://docs.adyen.com/developers/development-resources/notifications/set-up-notifications#step3configurenotificationsinthecustomerarea + * @link https://www.howsmyssl.com/a/check + */ + $fields[] = array( + 'section' => 'feedback', + 'title' => _x( 'Method', 'adyen notification', 'pronamic_ideal' ), + 'type' => 'description', + 'html' => __( 'JSON', 'pronamic_ideal' ), + ); + + // Webhook authentication settings. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Authentication', 'pronamic_ideal' ), + 'type' => 'description', + 'html' => \sprintf( + /* translators: %s: Pronamic Pay settings page URL. */ + __( 'Go to the Pronamic Pay settings page for webhook authentication settings.', 'pronamic_ideal' ), + \esc_url( + \add_query_arg( + array( + 'page' => 'pronamic_pay_settings', + ), + \admin_url( 'admin.php' ) + ) + ) + ), + ); + + // Return fields. + return $fields; + } + + /** + * Field certificate. + * + * @param array $field Field. + * @return void + */ + public function field_certificate( $field ) { + if ( ! \array_key_exists( 'meta_key', $field ) ) { + return; + } + + $post_id = \get_the_ID(); + + if ( false === $post_id ) { + return; + } + + $certificate = \get_post_meta( $post_id, $field['meta_key'], true ); + + if ( ! empty( $certificate ) ) { + $fingerprint = Security::get_sha_fingerprint( $certificate ); + + echo '
    '; + + if ( null !== $fingerprint ) { + $fingerprint = \str_split( $fingerprint, 2 ); + $fingerprint = \implode( ':', $fingerprint ); + + echo '
    ', \esc_html__( 'SHA Fingerprint', 'pronamic_ideal' ), '
    '; + echo '
    ', \esc_html( $fingerprint ), '
    '; + } + + $info = \openssl_x509_parse( $certificate ); + + if ( $info ) { + $date_format = __( 'M j, Y @ G:i', 'pronamic_ideal' ); + + if ( isset( $info['validFrom_time_t'] ) ) { + echo '
    ', \esc_html__( 'Valid From', 'pronamic_ideal' ), '
    '; + echo '
    ', \esc_html( \date_i18n( $date_format, $info['validFrom_time_t'] ) ), '
    '; + } + + if ( isset( $info['validTo_time_t'] ) ) { + echo '
    ', \esc_html__( 'Valid To', 'pronamic_ideal' ), '
    '; + echo '
    ', \esc_html( \date_i18n( $date_format, $info['validTo_time_t'] ) ), '
    '; + } + } + + echo '
    '; + } elseif ( false !== \strpos( $field['meta_key'], 'apple_pay' ) ) { + \printf( + '

    %s

     

    ', + \esc_html__( 'Upload an Apple Pay Merchant Identity certificate, which can be exported from Keychain Access on Mac as a PKCS#12 (*.p12) file.', 'pronamic_ideal' ) + ); + } + + ?> +

    + %s ', + \esc_html__( 'Upload', 'pronamic_ideal' ), + \esc_attr( $field['meta_key'] . '_file' ) + ); + + ?> +

    + $field Field. + * @return void + */ + public function field_private_key( $field ) { + if ( ! \array_key_exists( 'meta_key', $field ) ) { + return; + } + + $post_id = \get_the_ID(); + + if ( false === $post_id ) { + return; + } + + $private_key = \get_post_meta( $post_id, $field['meta_key'], true ); + + ?> +

    + %s

     

    ', + \esc_html__( 'Leave empty to auto fill when uploading an Apple Pay Merchant Identity PKCS#12 certificate file.', 'pronamic_ideal' ) + ); + } + + \printf( + '', + \esc_html__( 'Upload', 'pronamic_ideal' ), + \esc_attr( $field['meta_key'] . '_file' ) + ); + + ?> +

    + 'apple-pay-merchant-identity-certificate-%s.pem', + '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key' => 'apple-pay-merchant-identity-private-key-%s.pem', + ); + + // Check download actions. + $is_download_action = false; + + foreach ( $fields as $meta_key => $filename ) { + if ( \filter_has_var( \INPUT_POST, 'download' . $meta_key ) ) { + $is_download_action = true; + + break; + } + } + + // No valid download action found. + if ( false === $is_download_action ) { + return; + } + + $post_id = filter_input( \INPUT_POST, 'post_ID', \FILTER_SANITIZE_STRING ); + + $filename = sprintf( $filename, $post_id ); + + header( 'Content-Description: File Transfer' ); + header( 'Content-Disposition: attachment; filename=' . $filename ); + header( 'Content-Type: application/x-pem-file; charset=' . get_option( 'blog_charset' ), true ); + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo get_post_meta( $post_id, $meta_key, true ); + + exit; + } + + /** + * Gateway configuration display value. + * + * @param string $display_value Display value. + * @param int $post_id Gateway configuration post ID. + * @return string + */ + public function gateway_configuration_display_value( $display_value, $post_id ) { + $config = $this->get_config( $post_id ); + + return $config->get_merchant_account(); + } + + /** + * Save post. + * + * @param int $post_id Post ID. + * @return void + */ + public function save_post( $post_id ) { + // Files. + $files = array( + '_pronamic_gateway_adyen_apple_pay_merchant_id_certificate_file' => '_pronamic_gateway_adyen_apple_pay_merchant_id_certificate', + '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key_file' => '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key', + ); + + foreach ( $files as $name => $meta_key ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated + if ( isset( $_FILES[ $name ] ) && \UPLOAD_ERR_OK === $_FILES[ $name ]['error'] ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $value = file_get_contents( $_FILES[ $name ]['tmp_name'], true ); + + update_post_meta( $post_id, $meta_key, $value ); + } + } + + // Update Apple Pay Merchant Identity certificate and private key from uploaded PKCS#12 file. + $apple_pay_merchant_id_pkcs12 = get_post_meta( $post_id, '_pronamic_gateway_adyen_apple_pay_merchant_id_certificate', true ); + + if ( ! empty( $apple_pay_merchant_id_pkcs12 ) ) { + // Try to read file without using password. + $pkcs12_read = \openssl_pkcs12_read( $apple_pay_merchant_id_pkcs12, $certs, '' ); + + $password = \get_post_meta( $post_id, '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key_password', true ); + + // Try to read file with private key password. + if ( false === $pkcs12_read ) { + $pkcs12_read = \openssl_pkcs12_read( $apple_pay_merchant_id_pkcs12, $certs, $password ); + } + + if ( true === $pkcs12_read ) { + if ( isset( $certs['cert'] ) ) { + \update_post_meta( $post_id, '_pronamic_gateway_adyen_apple_pay_merchant_id_certificate', $certs['cert'] ); + } + + if ( isset( $certs['pkey'] ) ) { + $private_key = $certs['pkey']; + + $cipher = null; + + // Try to export the private key encrypted. + if ( defined( 'OPENSSL_CIPHER_AES_128_CBC' ) ) { + $cipher = \OPENSSL_CIPHER_AES_128_CBC; + } elseif ( defined( 'OPENSSL_CIPHER_3DES' ) ) { + $cipher = \OPENSSL_CIPHER_3DES; + } + + if ( null !== $cipher && '' !== $password ) { + $args = array( + 'digest_alg' => 'SHA256', + 'private_key_bits' => 2048, + 'private_key_type' => \OPENSSL_KEYTYPE_RSA, + 'encrypt_key' => true, + 'encrypt_key_cipher' => $cipher, + 'subjectKeyIdentifier' => 'hash', + 'authorityKeyIdentifier' => 'keyid:always,issuer:always', + 'basicConstraints' => 'CA:true', + ); + + \openssl_pkey_export( $certs['pkey'], $private_key, $password, $args ); + } + + \update_post_meta( $post_id, '_pronamic_gateway_adyen_apple_pay_merchant_id_private_key', $private_key ); + } + } + } + } + + /** + * Get configuration by post ID. + * + * @param int $post_id Post ID. + * @return Config + */ + public function get_config( $post_id ) { + $config = new Config(); + + $config->mode = $this->get_meta( $post_id, 'mode' ); + $config->api_key = $this->get_meta( $post_id, 'adyen_api_key' ); + $config->api_live_url_prefix = $this->get_meta( $post_id, 'adyen_api_live_url_prefix' ); + $config->merchant_account = $this->get_meta( $post_id, 'adyen_merchant_account' ); + $config->origin_key = $this->get_meta( $post_id, 'adyen_origin_key' ); + $config->merchant_order_reference = $this->get_meta( $post_id, 'adyen_merchant_order_reference' ); + $config->apple_pay_merchant_id = $this->get_meta( $post_id, 'adyen_apple_pay_merchant_id' ); + $config->apple_pay_merchant_id_certificate = $this->get_meta( $post_id, 'adyen_apple_pay_merchant_id_certificate' ); + $config->apple_pay_merchant_id_private_key = $this->get_meta( $post_id, 'adyen_apple_pay_merchant_id_private_key' ); + $config->apple_pay_merchant_id_private_key_password = $this->get_meta( $post_id, 'adyen_apple_pay_merchant_id_private_key_password' ); + $config->google_pay_merchant_identifier = $this->get_meta( $post_id, 'adyen_google_pay_merchant_identifier' ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return AbstractGateway + */ + public function get_gateway( $post_id ) { + $config = $this->get_config( $post_id ); + + if ( empty( $config->origin_key ) ) { + return new WebSdkGateway( $config ); + } + + return new DropInGateway( $config ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/LineItem.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/LineItem.php new file mode 100644 index 00000000..a1b918d3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/LineItem.php @@ -0,0 +1,278 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Line item. + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class LineItem implements \JsonSerializable { + /** + * Amount excluding tax. + * + * @var int|null + */ + private $amount_excluding_tax; + + /** + * Amount including tax. + * + * @var int|null + */ + private $amount_including_tax; + + /** + * Description. + * + * @var string|null + */ + private $description; + + /** + * Item id. + * + * @var string|null + */ + private $id; + + /** + * Quantity. + * + * @var int|null + */ + private $quantity; + + /** + * Tax amount. + * + * @var int|null + */ + private $tax_amount; + + /** + * Tax category: High, Low, None, Zero. + * + * @var string|null + */ + private $tax_category; + + /** + * Tax percentage, in minor units. + * + * @var int|null + */ + private $tax_percentage; + + /** + * Construct line item. + * + * @param string $description Name. + * @param int $quantity Quantity. + * @param int $amount_including_tax Amount (including tax). + * + * @throws \InvalidArgumentException Throws invalid argument exception when arguments are invalid. + */ + public function __construct( $description, $quantity, $amount_including_tax ) { + $this->set_description( $description ); + $this->set_quantity( $quantity ); + $this->set_amount_including_tax( $amount_including_tax ); + } + + /** + * Get amount excluding tax. + * + * @return int|null + */ + public function get_amount_excluding_tax() { + return $this->amount_excluding_tax; + } + + /** + * Set amount excluding tax. + * + * @param int|null $amount_excluding_tax Amount excluding tax. + * @return void + */ + public function set_amount_excluding_tax( $amount_excluding_tax = null ) { + $this->amount_excluding_tax = $amount_excluding_tax; + } + + /** + * Get amount excluding tax. + * + * @return int|null + */ + public function get_amount_including_tax() { + return $this->amount_including_tax; + } + + /** + * Set amount including tax. + * + * @param int|null $amount_including_tax Amount excluding tax. + * @return void + */ + public function set_amount_including_tax( $amount_including_tax = null ) { + $this->amount_including_tax = $amount_including_tax; + } + + /** + * Get item description. + * + * @return string|null + */ + public function get_description() { + return $this->description; + } + + /** + * Set item description. + * + * @param string|null $description Description. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 100`. + */ + public function set_description( $description = null ) { + $this->description = $description; + } + + /** + * Get item ID. + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set item ID. + * + * @param string|null $id ID. + * @return void + */ + public function set_id( $id = null ) { + $this->id = $id; + } + + /** + * Get quantity. + * + * @return int|null + */ + public function get_quantity() { + return $this->quantity; + } + + /** + * Get quantity. + * + * @param int|null $quantity Quantity. + * @return void + */ + public function set_quantity( $quantity = null ) { + $this->quantity = $quantity; + } + + /** + * Get tax amount. + * + * @return int|null + */ + public function get_tax_amount() { + return $this->tax_amount; + } + + /** + * Set tax amount. + * + * @param int|null $tax_amount Tax amount. + * @return void + */ + public function set_tax_amount( $tax_amount = null ) { + $this->tax_amount = $tax_amount; + } + + /** + * Get tax category. + * + * @return string|null + */ + public function get_tax_category() { + return $this->tax_category; + } + + /** + * Set tax category. + * + * @param string|null $tax_category Tax category. + * @return void + */ + public function set_tax_category( $tax_category ) { + $this->tax_category = $tax_category; + } + + /** + * Get tax percentage. + * + * @return int|null + */ + public function get_tax_percentage() { + return $this->tax_percentage; + } + + /** + * Set tax percentage. + * + * @param int|null $tax_percentage Tax percentage. + * @return void + */ + public function set_tax_percentage( $tax_percentage ) { + $this->tax_percentage = $tax_percentage; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'amountExcludingTax' => $this->amount_excluding_tax, + 'amountIncludingTax' => $this->amount_including_tax, + 'description' => $this->description, + 'id' => $this->id, + 'quantity' => $this->quantity, + 'taxAmount' => $this->tax_amount, + 'taxCategory' => $this->tax_category, + 'taxPercentage' => $this->tax_percentage, + ) + ); + + $object = (object) $properties; + + return $object; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return object + */ + public function jsonSerialize() { + return $this->get_json(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/LineItems.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/LineItems.php new file mode 100644 index 00000000..65e09e08 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/LineItems.php @@ -0,0 +1,112 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Line items. + * + * @author Reüel van der Steege + * @version 1.0.5 + * @since 1.0.0 + */ +class LineItems implements \JsonSerializable { + /** + * Line items. + * + * @var array + */ + private $line_items; + + /** + * Construct line items. + * + * @param LineItem[] $items Line items. + */ + public function __construct( $items = null ) { + $this->line_items = array(); + + if ( is_array( $items ) ) { + foreach ( $items as $item ) { + $this->add_item( $item ); + } + } + } + + /** + * Create and add new line item. + * + * @param string $description Name. + * @param int $quantity Quantity. + * @param int $amount_including_tax Amount (including tax). + * + * @return LineItem + * + * @throws \InvalidArgumentException Throws invalid argument exception when arguments are invalid. + */ + public function new_item( $description, $quantity, $amount_including_tax ) { + $item = new LineItem( $description, $quantity, $amount_including_tax ); + + $this->add_item( $item ); + + return $item; + } + + /** + * Add line item. + * + * @param LineItem $item Line item. + * @return void + */ + public function add_item( LineItem $item ) { + $this->line_items[] = $item; + } + + /** + * Get line items. + * + * @return LineItem[] + */ + public function get_line_items() { + return $this->line_items; + } + + /** + * Get JSON. + * + * @return array + */ + public function get_json() { + $data = array_map( + /** + * Get line item JSON. + * + * @param LineItem $item Line item. + * @return object + */ + function( LineItem $item ) { + return $item->get_json(); + }, + $this->get_line_items() + ); + + return $data; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return array + */ + public function jsonSerialize() { + return $this->get_json(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Name.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Name.php new file mode 100644 index 00000000..ff813133 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Name.php @@ -0,0 +1,141 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use InvalidArgumentException; + +/** + * Name + * + * @link https://docs.adyen.com/developers/api-reference/common-api/name + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Name { + /** + * First name. + * + * @var string + */ + private $first_name; + + /** + * Gender. + * + * @var string + */ + private $gender; + + /** + * The name's infix, if applicable. + * + * @var string|null + */ + private $infix; + + /** + * Last name. + * + * @var string + */ + private $last_name; + + /** + * Construct shopper name. + * + * @param string $first_name First name. + * @param string $last_name Last name. + * @param string $gender Gender. + */ + public function __construct( $first_name, $last_name, $gender ) { + $this->first_name = $first_name; + $this->last_name = $last_name; + $this->gender = $gender; + } + + /** + * Get first name. + * + * @return string + */ + public function get_first_name() { + return $this->first_name; + } + + /** + * Get gender. + * + * @return string + */ + public function get_gender() { + return $this->gender; + } + + /** + * Get infix. + * + * @return string|null + */ + public function get_infix() { + return $this->infix; + } + + /** + * Set infix. + * + * @param string|null $infix Infix. + * @return void + * @throws InvalidArgumentException Throws invalid argument exception when infix is longer then 20 characters. + */ + public function set_infix( $infix ) { + if ( null !== $infix && mb_strlen( $infix ) > 20 ) { + throw new InvalidArgumentException( + sprintf( + 'Given infix `%s` is longer then 20 characters.', + $infix + ) + ); + } + + $this->infix = $infix; + } + + /** + * Get last name. + * + * @return string + */ + public function get_last_name() { + return $this->last_name; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'firstName' => $this->get_first_name(), + 'gender' => $this->get_gender(), + 'infix' => $this->get_infix(), + 'lastName' => $this->get_last_name(), + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationRequest.php new file mode 100644 index 00000000..63d0e70c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationRequest.php @@ -0,0 +1,102 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Notification request + * + * @link https://docs.adyen.com/developers/api-reference/notifications-api#notificationrequest + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class NotificationRequest extends ResponseObject { + /** + * Informs about the origin of the notification: + * + * - `true`: the notification originated from the live environment. + * - `false`: the notification originated from the test environment. + * + * @var boolean + */ + private $live; + + /** + * A container object for the details included in the notification. + * + * @var array + */ + private $items; + + /** + * Construct notification request. + * + * @param boolean $live Informs about the origin of the notification. + * @param NotificationRequestItem[] $items A container object for the details included in the notification. + */ + public function __construct( $live, $items ) { + $this->live = $live; + $this->items = $items; + } + + /** + * Live. + * + * @return boolean True if live, false otherwise. + */ + public function is_live() { + return $this->live; + } + + /** + * Get items. + * + * @return NotificationRequestItem[] + */ + public function get_items() { + return $this->items; + } + + /** + * Create notification request from object. + * + * @param object $object Object. + * @return NotificationRequest + * @throws \InvalidArgumentException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_object( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/notification-request.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $items = array(); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + foreach ( $object->notificationItems as $o ) { + $items[] = NotificationRequestItem::from_object( $o->NotificationRequestItem ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + return new self( + filter_var( $object->live, FILTER_VALIDATE_BOOLEAN ), + $items + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationRequestItem.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationRequestItem.php new file mode 100644 index 00000000..d16c6ed9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationRequestItem.php @@ -0,0 +1,273 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use DateTime; + +/** + * Notification request item + * + * @link https://docs.adyen.com/developers/api-reference/notifications-api#notificationrequestitem + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class NotificationRequestItem extends ResponseObject { + /** + * Amount. + * + * @var Amount + */ + private $amount; + + /** + * Adyen's 16-character unique reference associated with the transaction/the request. This value is globally unique; quote it when communicating with us about this request. + * + * @var string + */ + private $psp_reference; + + /** + * The type of event the notification item refers to. + * + * @var string + */ + private $event_code; + + /** + * The time when the event was generated. + * + * @var DateTime + */ + private $event_date; + + /** + * The merchant account identifier used in the transaction the notification item refers to. + * + * @var string + */ + private $merchant_account_code; + + /** + * This field holds a list of the modification operations supported by the transaction the notification item refers to. + * + * This field is populated only in authorisation notifications. + * + * In case of HTTP POST notifications, the operation list is a sequence of comma-separated string values. + * + * @var array>>|null + */ + private $operations; + + /** + * A reference to uniquely identify the payment. + * + * @var string + */ + private $merchant_reference; + + /** + * The payment method used in the transaction the notification item refers to. + * + * This field is populated only in authorisation notifications. + * + * @var string|null + */ + private $payment_method; + + /** + * Informs about the outcome of the event (`eventCode`) the notification refers to: + * + * - `true`: the event (`eventCode`) the notification refers to was executed successfully. + * - `false`: the event was not executed successfully. + * + * @var boolean + */ + private $success; + + /** + * Construct notification request item. + * + * @link https://stackoverflow.com/questions/34468660/how-to-use-builder-pattern-with-all-parameters-as-mandatory + * + * @param Amount $amount Amount. + * @param string $psp_reference PSP reference. + * @param string $event_code Event code. + * @param DateTime $event_date Event date. + * @param string $merchant_account_code Merchant account code. + * @param string $merchant_reference Merchant reference. + * @param boolean $success Success. + */ + public function __construct( + Amount $amount, + $psp_reference, + $event_code, + DateTime $event_date, + $merchant_account_code, + $merchant_reference, + $success + ) { + $this->amount = $amount; + $this->psp_reference = $psp_reference; + $this->event_code = $event_code; + $this->event_date = $event_date; + $this->merchant_account_code = $merchant_account_code; + $this->merchant_reference = $merchant_reference; + $this->success = $success; + } + + /** + * Get amount. + * + * @return Amount + */ + public function get_amount() { + return $this->amount; + } + + /** + * Get PSP reference. + * + * @return string + */ + public function get_psp_reference() { + return $this->psp_reference; + } + + /** + * Get event code. + * + * @return string + */ + public function get_event_code() { + return $this->event_code; + } + + /** + * Get event date. + * + * @return DateTime + */ + public function get_event_date() { + return $this->event_date; + } + + /** + * Get merchant account code. + * + * @return string + */ + public function get_merchant_account_code() { + return $this->merchant_account_code; + } + + /** + * Get operations. + * + * @return array>>|null + */ + public function get_operations() { + return $this->operations; + } + + /** + * Set operations. + * + * @param array>>|null $operations Operations. + * @return void + */ + public function set_operations( array $operations = null ) { + $this->operations = $operations; + } + + /** + * Get operations. + * + * @return string + */ + public function get_merchant_reference() { + return $this->merchant_reference; + } + + /** + * Get payment method. + * + * @return string|null + */ + public function get_payment_method() { + return $this->payment_method; + } + + /** + * Set payment method. + * + * @param string|null $payment_method Payment method. + * @return void + */ + public function set_payment_method( $payment_method ) { + $this->payment_method = $payment_method; + } + + /** + * Is success. + * + * @return boolean + */ + public function is_success() { + return $this->success; + } + + /** + * Create notification request item from object. + * + * @param object $object Object. + * @return NotificationRequestItem + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_object( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/notification-request-item.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + $item = new self( + Amount::from_object( $object->amount ), + $object->pspReference, + $object->eventCode, + new DateTime( $object->eventDate ), + $object->merchantAccountCode, + $object->merchantReference, + filter_var( $object->success, FILTER_VALIDATE_BOOLEAN ) + ); + + if ( property_exists( $object, 'operations' ) ) { + $item->set_operations( $object->operations ); + } + + if ( property_exists( $object, 'paymentMethod' ) ) { + $item->set_payment_method( $object->paymentMethod ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + $item->set_original_object( $object ); + + return $item; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationsController.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationsController.php new file mode 100644 index 00000000..b4959357 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/NotificationsController.php @@ -0,0 +1,173 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Exception\ValidationException; +use Pronamic\WordPress\Pay\Payments\PaymentStatus as PaymentStatus; +use WP_Error; +use WP_REST_Request; + +/** + * Notification controller + * + * @link https://docs.adyen.com/developers/api-reference/notifications-api#notificationrequest + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class NotificationsController { + /** + * Setup. + * + * @return void + */ + public function setup() { + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * + * @return void + */ + public function rest_api_init() { + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/notifications', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_adyen_notifications' ), + 'permission_callback' => array( $this, 'rest_api_adyen_permissions_check' ), + ) + ); + } + + /** + * REST API Adyen permissions check. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/#permissions-callback + * + * @param WP_REST_Request $request Request. + * @return true|WP_Error + */ + public function rest_api_adyen_permissions_check( WP_REST_Request $request ) { + $username = get_option( 'pronamic_pay_adyen_notification_authentication_username' ); + $password = get_option( 'pronamic_pay_adyen_notification_authentication_password' ); + + if ( empty( $username ) && empty( $password ) ) { + return true; + } + + $authorization = $request->get_header( 'Authorization' ); + + /** + * Authorization header missing. + * + * @link https://basecamp.com/1810084/projects/10966871/todos/403544593 + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-includes/rest-api/class-wp-rest-request.php#L188-L208 + * @link https://www.wp-pay.org/http-authorization-header-missing/ + */ + if ( null === $authorization ) { + return new WP_Error( + 'rest_forbidden_context', + sprintf( + /* translators: %s: Help URL. */ + __( 'HTTP Authorization header is missing, read %s for more information.', 'pronamic_ideal' ), + 'https://www.wp-pay.org/http-authorization-header-missing/' + ), + array( 'status' => rest_authorization_required_code() ) + ); + } + + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- Benign reason. + if ( 'Basic ' . base64_encode( $username . ':' . $password ) === $authorization ) { + return true; + } + + return new WP_Error( + 'rest_forbidden_context', + /* translators: Translate 'notification' the same as in the Adyen dashboard. */ + _x( 'Sorry, you are not allowed to post Adyen notifications.', 'Adyen', 'pronamic_ideal' ), + array( 'status' => rest_authorization_required_code() ) + ); + } + + /** + * REST API Adyen notifications handler. + * + * @param WP_REST_Request $request Request. + * @return object + */ + public function rest_api_adyen_notifications( WP_REST_Request $request ) { + $json = $request->get_body(); + + $data = json_decode( $json ); + + try { + $notification_request = NotificationRequest::from_object( $data ); + } catch ( ValidationException $e ) { + return new WP_Error( + 'adyen_invalid_notification', + /* translators: Translate 'notification' the same as in the Adyen dashboard. */ + _x( 'Cannot parse JSON notification.', 'Adyen', 'pronamic_ideal' ), + array( 'status' => 500 ) + ); + } + + foreach ( $notification_request->get_items() as $item ) { + $payment = get_pronamic_payment( $item->get_merchant_reference() ); + + if ( null === $payment ) { + continue; + } + + // Add note. + $note = sprintf( + '

    %s

    ', + sprintf( + /* translators: %s: payment provider name */ + __( 'Webhook requested by %s.', 'pronamic_ideal' ), + __( 'Adyen', 'pronamic_ideal' ) + ) + ); + + $json = wp_json_encode( $item->get_json(), JSON_PRETTY_PRINT ); + + if ( false !== $json ) { + $note .= sprintf( + '
    %s
    ', + $json + ); + } + + $payment->add_note( $note ); + + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Authorization. + if ( EventCode::AUTHORIZATION === $item->get_event_code() ) { + $payment->set_status( $item->is_success() ? PaymentStatus::SUCCESS : PaymentStatus::FAILURE ); + + $payment->save(); + } + } + + $response = (object) array( + 'notificationResponse' => '[accepted]', + ); + + return $response; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentDetailsRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentDetailsRequest.php new file mode 100644 index 00000000..ef0b64fb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentDetailsRequest.php @@ -0,0 +1,92 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Payment details request + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments/details + * + * @author Reüel van der Steege + * @version 1.1.0 + * @since 1.1.0 + */ +class PaymentDetailsRequest extends Request { + /** + * Use this collection to submit the details that were returned as a result of the /payments call. + * + * @var object|null + */ + private $details; + + /** + * The paymentData value that you received in the response to the /payments call. + * + * @var string|null + */ + private $payment_data; + + /** + * Get details. + * + * @return object|null + */ + public function get_details() { + return $this->details; + } + + /** + * Set details. + * + * @param object|null $details Details. + * @return void + */ + public function set_details( $details ) { + $this->details = $details; + } + + /** + * Get payment data. + * + * @return string|null + */ + public function get_payment_data() { + return $this->payment_data; + } + + /** + * Set payment data. + * + * @param string|null $payment_data Payment data. + * @return void + */ + public function set_payment_data( $payment_data ) { + $this->payment_data = $payment_data; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'details' => $this->get_details(), + 'paymentData' => $this->get_payment_data(), + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethod.php new file mode 100644 index 00000000..c678a83e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethod.php @@ -0,0 +1,109 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Payment method + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class PaymentMethod extends ResponseObject { + /** + * Type. + * + * @var string|null + */ + private $type; + + /** + * Details. + * + * @var array|null + */ + private $details; + + /** + * Construct a payment method. + * + * @param object $payment_method_object Original object. + */ + public function __construct( $payment_method_object ) { + // Set type. + if ( isset( $payment_method_object->type ) ) { + $this->type = $payment_method_object->type; + } + + $this->set_original_object( $payment_method_object ); + } + + /** + * Get type. + * + * @return string|null + */ + public function get_type() { + return $this->type; + } + + /** + * Get details. + * + * @return array|null + */ + public function get_details() { + return $this->details; + } + + /** + * Set details. + * + * @param array $details Details. + * @return void + */ + public function set_details( $details ) { + $this->details = $details; + } + + /** + * Create payment method from object. + * + * @param object $object Object. + * @return PaymentMethod + * @throws ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment-method.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + $payment_method = new self( $object ); + + if ( isset( $object->details ) ) { + $payment_method->set_details( $object->details ); + } + + $payment_method->set_original_object( $object ); + + return $payment_method; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodType.php new file mode 100644 index 00000000..96b492d9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodType.php @@ -0,0 +1,208 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Payment method type + * + * @link https://docs.adyen.com/developers/classic-integration/directory-lookup#DirectoryLookup-Step2:Displaylocalpaymentmethods + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class PaymentMethodType { + /** + * Constant for the 'scheme' payment method type. + * + * @link https://docs.adyen.com/developers/development-resources/test-cards/test-card-numbers + * + * @var string + */ + const SCHEME = 'scheme'; + + /** + * Constant for the 'afterpay_default' payment method type. + * + * @var string + */ + const AFTERPAY = 'afterpay_default'; + + /** + * Constant for the 'alipay' payment method type. + * + * @var string + */ + const ALIPAY = 'alipay'; + + /** + * Constant for the 'applepay' payment method type. + * + * @var string + */ + const APPLE_PAY = 'applepay'; + + /** + * Constant for the 'bcmc' payment method type. + * + * @var string + */ + const BANCONTACT = 'bcmc'; + + /** + * Constant for the 'sepadirectdebit' payment method type. + * + * @var string + */ + const DIRECT_DEBIT = 'sepadirectdebit'; + + /** + * Constant for the 'directEbanking' payment method type. + * + * @var string + */ + const DIRECT_EBANKING = 'directEbanking'; + + /** + * Constant for the 'dotpay' payment method type. + * + * @var string + */ + const DOTPAY = 'dotpay'; + + /** + * Constant for the 'eps' payment method type. + * + * @var string + */ + const EPS = 'eps'; + + /** + * Constant for the 'GiroPay' payment method type. + * + * @var string + */ + const GIROPAY = 'giropay'; + + /** + * Constant for the 'paywithgoogle' payment method type. + * + * @var string + */ + const GOOGLE_PAY = 'paywithgoogle'; + + /** + * Constant for the 'ideal' payment method type. + * + * @var string + */ + const IDEAL = 'ideal'; + + /** + * Constant for the 'klarna' payment method type. + * + * @var string + */ + const KLARNA = 'klarna'; + + /** + * Constant for the 'maestro' payment method type. + * + * @var string + */ + const MAESTRO = 'maestro'; + + /** + * Constant for the 'Multibanco' payment method type. + * + * @var string + */ + const MULTIBANCO = 'multibanco'; + + /** + * Constant for the 'PayPal' payment method type. + * + * @var string + */ + const PAYPAL = 'paypal'; + + /** + * Constant for the 'SEPA Direct Debit' payment method type. + * + * @var string + */ + const SEPA_DIRECT_DEBIT = 'sepadirectdebit'; + + /** + * Constant for the 'UnionPay' payment method type. + * + * @var string + */ + const UNIONPAY = 'unionpay'; + + /** + * Map payment methods to brand codes. + * + * @var array + */ + private static $map = array( + PaymentMethods::AFTERPAY => self::AFTERPAY, + PaymentMethods::ALIPAY => self::ALIPAY, + PaymentMethods::APPLE_PAY => self::APPLE_PAY, + PaymentMethods::BANCONTACT => self::BANCONTACT, + PaymentMethods::CREDIT_CARD => self::SCHEME, + PaymentMethods::DIRECT_DEBIT => self::SEPA_DIRECT_DEBIT, + PaymentMethods::EPS => self::EPS, + PaymentMethods::GIROPAY => self::GIROPAY, + PaymentMethods::GOOGLE_PAY => self::GOOGLE_PAY, + PaymentMethods::IDEAL => self::IDEAL, + PaymentMethods::KLARNA_PAY_LATER => self::KLARNA, + PaymentMethods::MAESTRO => self::MAESTRO, + PaymentMethods::PAYPAL => self::PAYPAL, + PaymentMethods::SOFORT => self::DIRECT_EBANKING, + ); + + /** + * Transform WordPress payment method to Adyen brand code. + * + * @param string|null $payment_method Payment method. + * @return string|null + */ + public static function transform( $payment_method ) { + if ( null === $payment_method ) { + return null; + } + + if ( array_key_exists( $payment_method, self::$map ) ) { + return self::$map[ $payment_method ]; + } + + return null; + } + + /** + * Transform Adyen method to WordPress payment method. + * + * @param string $adyen_type Adyen method type. + * @return string|null + */ + public static function to_wp( $adyen_type ) { + $result = array_search( $adyen_type, self::$map, true ); + + if ( false === $result ) { + return null; + } + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodsRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodsRequest.php new file mode 100644 index 00000000..0eb0130b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodsRequest.php @@ -0,0 +1,170 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Payment methods request + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/paymentMethods + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentMethodsRequest extends Request { + /** + * Allowed payment methods. + * + * @var array|null + */ + private $allowed_payment_methods; + + /** + * Blocked payment methods. + * + * @var array|null + */ + private $blocked_payment_methods; + + /** + * The merchant account identifier, with which you want to process the transaction. + * + * @var string + */ + private $merchant_account; + + /** + * The shopper's country code. + * + * @var string|null + */ + private $country_code; + + /** + * The amount information for the transaction. + * + * @var Amount|null + */ + private $amount; + + /** + * Construct a payment request object. + * + * @param string $merchant_account The merchant account identifier. + */ + public function __construct( $merchant_account ) { + $this->merchant_account = $merchant_account; + } + + /** + * Get allowed payment methods. + * + * @return array|null + */ + public function get_allowed_payment_methods() { + return $this->allowed_payment_methods; + } + + /** + * Set allowed payment methods. + * + * @param array $allowed_payment_methods Allowed payment methods. + * @return void + */ + public function set_allowed_payment_methods( $allowed_payment_methods ) { + $this->allowed_payment_methods = $allowed_payment_methods; + } + + /** + * Get blocked payment methods. + * + * @return array|null + */ + public function get_blocked_payment_methods() { + return $this->blocked_payment_methods; + } + + /** + * Set blocked payment methods. + * + * @param array $blocked_payment_methods Blocked payment methods. + * @return void + */ + public function set_blocked_payment_methods( $blocked_payment_methods ) { + $this->blocked_payment_methods = $blocked_payment_methods; + } + + /** + * Get country code. + * + * @return string|null + */ + public function get_country_code() { + return $this->country_code; + } + + /** + * Set the shopper's country code. + * + * @param string|null $country_code The shopper's country code. + * @return void + */ + public function set_country_code( $country_code ) { + $this->country_code = $country_code; + } + + /** + * Get amount. + * + * @return Amount|null + */ + public function get_amount() { + return $this->amount; + } + + /** + * Set the amount information for the transaction. + * + * @param Amount|null $amount The amount information for the transaction. + * @return void + */ + public function set_amount( Amount $amount = null ) { + $this->amount = $amount; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'merchantAccount' => $this->merchant_account, + 'countryCode' => $this->get_country_code(), + 'allowedPaymentMethods' => $this->get_allowed_payment_methods(), + 'blockedPaymentMethods' => $this->get_blocked_payment_methods(), + ) + ); + + // Amount. + $amount = $this->get_amount(); + + if ( null !== $amount ) { + $properties['amount'] = $amount->get_json(); + } + + // Return object. + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodsResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodsResponse.php new file mode 100644 index 00000000..af5f884e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentMethodsResponse.php @@ -0,0 +1,120 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Payment methods response + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/paymentSession + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class PaymentMethodsResponse extends ResponseObject { + /** + * Groups of payment methods. + * + * @var array> + */ + private $groups; + + /** + * Detailed list of payment methods required to generate payment forms. + * + * @var PaymentMethod[] + */ + private $payment_methods; + + /** + * Construct payment session response object. + * + * @param array> $groups Groups. + * @param PaymentMethod[] $payment_methods Payment methods. + */ + public function __construct( $groups, $payment_methods ) { + $this->groups = $groups; + $this->payment_methods = $payment_methods; + } + + /** + * Get payment methods. + * + * @return PaymentMethod[] + */ + public function get_payment_methods() { + return $this->payment_methods; + } + + /** + * Get payment method types. + * + * @return array + */ + public function get_payment_method_types() { + $types = array(); + + // Loop payment methods. + $payment_methods = $this->payment_methods; + + foreach ( $payment_methods as $payment_method ) { + $type = $payment_method->get_type(); + + if ( null !== $type ) { + $types[] = $type; + } + } + + return $types; + } + + /** + * Create payment methods repsonse from object. + * + * @param object $object Object. + * @return PaymentMethodsResponse + * @throws ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment-methods-response.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + $payment_methods = array(); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + foreach ( $object->paymentMethods as $payment_method_object ) { + $payment_methods[] = PaymentMethod::from_object( $payment_method_object ); + } + + $groups = array(); + + if ( isset( $object->groups ) ) { + $groups = $object->groups; + } + + $response = new self( $groups, $payment_methods ); + + $response->set_original_object( $object ); + + return $response; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentRequest.php new file mode 100644 index 00000000..1500d086 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentRequest.php @@ -0,0 +1,107 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Payment request + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v40/payments + * + * @author Reüel van der Steege + * @version 1.1.1 + * @since 1.0.0 + */ +class PaymentRequest extends AbstractPaymentRequest { + /** + * The shopper's browser information. + * For 3D Secure 2 transactions, `browserInfo` is required for `channel` web (or `deviceChannel` browser). + * + * @var BrowserInformation|null + */ + private $browser_info; + + /** + * The collection that contains the type of the payment method and its + * specific information (e.g. idealIssuer). + * + * @var PaymentMethod + */ + private $payment_method; + + /** + * Construct a payment request object. + * + * @param Amount $amount The amount information for the transaction. + * @param string $merchant_account The merchant account identifier, with which you want to process the transaction. + * @param string $reference The reference to uniquely identify a payment. + * @param string $return_url The URL to return to. + * @param PaymentMethod $payment_method The collection that contains the type of the payment method and its specific information (e.g. idealIssuer). + */ + public function __construct( Amount $amount, $merchant_account, $reference, $return_url, PaymentMethod $payment_method ) { + parent::__construct( $amount, $merchant_account, $reference, $return_url ); + + $this->payment_method = $payment_method; + } + + /** + * Get payment method. + * + * @return PaymentMethod + */ + public function get_payment_method() { + return $this->payment_method; + } + + /** + * Get browser info. + * + * @return BrowserInformation|null + */ + public function get_browser_info() { + return $this->browser_info; + } + + /** + * Set browser info. + * + * @param BrowserInformation|null $browser_info Browser info. + * @return void + */ + public function set_browser_info( $browser_info ) { + $this->browser_info = $browser_info; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $object = parent::get_json(); + + $properties = (array) $object; + + // Browser information. + $browser_info = $this->get_browser_info(); + + if ( null !== $browser_info ) { + $properties['browserInfo'] = $browser_info->get_json(); + } + + // Payment method. + $properties['paymentMethod'] = $this->get_payment_method()->get_json(); + + // Return object. + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentRequestHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentRequestHelper.php new file mode 100644 index 00000000..c6c63d18 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentRequestHelper.php @@ -0,0 +1,158 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Payment request helper + * + * @author Remco Tolsma + * @version 1.1.1 + * @since 1.0.0 + */ +class PaymentRequestHelper { + /** + * Complement WordPress Pay payment to Adyen payment request. + * + * @param Payment $payment WordPress Pay payment to convert. + * @param AbstractPaymentRequest $request Adyen payment request. + * @return void + * @throws \Exception Throws exception on invalid metadata. + */ + public static function complement( Payment $payment, AbstractPaymentRequest $request ) { + // Channel. + $request->set_channel( Channel::WEB ); + + // Shopper. + $request->set_shopper_statement( $payment->get_description() ); + + // Customer. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + /* + * When sending in the shopper reference we always create a recurring contract. If you would not + * like to store the details, we recommend to exclude the shopper reference. + * + * $user_id = $customer->get_user_id(); + * $request->set_shopper_reference( \is_null( $user_id ) ? null : \strval( $user_id ) ); + */ + $request->set_shopper_ip( $customer->get_ip_address() ); + $request->set_shopper_locale( $customer->get_locale() ); + $request->set_telephone_number( $customer->get_phone() ); + $request->set_shopper_email( $customer->get_email() ); + + // Shopper name. + $name = $customer->get_name(); + + if ( null !== $name ) { + $shopper_name = new Name( + (string) $name->get_first_name(), + (string) $name->get_last_name(), + GenderTransformer::transform( $customer->get_gender() ) + ); + + $request->set_shopper_name( $shopper_name ); + } + + // Date of birth. + $request->set_date_of_birth( $customer->get_birth_date() ); + } + + // Billing address. + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + $address = AddressTransformer::transform( $billing_address ); + + $request->set_billing_address( $address ); + } + + // Delivery address. + $shipping_address = $payment->get_shipping_address(); + + if ( null !== $shipping_address ) { + $address = AddressTransformer::transform( $shipping_address ); + + $request->set_delivery_address( $address ); + } + + // Lines. + $lines = $payment->get_lines(); + + if ( null !== $lines ) { + $line_items = $request->new_line_items(); + + $i = 1; + + foreach ( $lines as $line ) { + // Description. + $description = $line->get_description(); + + // Use line item name as fallback for description. + if ( null === $description ) { + /* translators: %s: item index */ + $description = sprintf( __( 'Item %s', 'pronamic_ideal' ), $i++ ); + + if ( null !== $line->get_name() && '' !== $line->get_name() ) { + $description = $line->get_name(); + } + } + + $item = $line_items->new_item( + (string) $description, + (int) $line->get_quantity(), + $line->get_total_amount()->get_including_tax()->get_minor_units() + ); + + $item->set_amount_excluding_tax( $line->get_total_amount()->get_excluding_tax()->get_minor_units() ); + + $item->set_id( $line->get_id() ); + + // Tax amount. + $tax_amount = $line->get_total_amount()->get_tax_amount(); + + if ( null !== $tax_amount ) { + $item->set_tax_amount( $tax_amount->get_minor_units() ); + $item->set_tax_percentage( (int) $line->get_total_amount()->get_tax_percentage() * 100 ); + } + } + } + + // Metadata. + $metadata = array(); + + /** + * Filters the Adyen checkout configuration. + * + * @param array $metadata Payment request metadata. + * @since 1.1.1 + */ + $metadata = apply_filters( 'pronamic_pay_adyen_payment_metadata', $metadata, $payment ); + + /* + * Maximum 20 key-value pairs per request. When exceeding, the "177" error occurs: "Metadata size exceeds limit". + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v51/payments__reqParam_metadata + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/paymentSession__reqParam_metadata + */ + if ( ! \is_array( $metadata ) ) { + throw new \Exception( 'Adyen metadata must be an array.' ); + } + + if ( count( $metadata ) > 20 ) { + throw new \Exception( 'Adyen metadata exceeds maximum of 20 items.' ); + } + + $request->set_metadata( $metadata ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResponse.php new file mode 100644 index 00000000..fca20e41 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResponse.php @@ -0,0 +1,305 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Payment response + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentResponse extends ResponseObject { + /** + * Details. + * + * @var array|null + */ + private $details; + + /** + * Adyen's 16-character string reference associated with the transaction/request. This value is globally unique; quote it when communicating with us about this request. + * + * `pspReference` is returned only for non-redirect payment methods. + * + * @var string|null + */ + private $psp_reference; + + /** + * When the payment flow requires a redirect, this object contains information about the redirect URL. + * + * @var RedirectInformation|null + */ + private $redirect; + + /** + * The action. + * + * @var ActionInformation|null + */ + private $action; + + /** + * Payment data. + * + * @var string|null + */ + private $payment_data; + + /** + * Refusal reason. + * + * @var string|null + */ + private $refusal_reason; + + /** + * The result of the payment. + * + * @var string + */ + private $result_code; + + /** + * Construct payment response object. + * + * @param string $result_code Result code. + */ + public function __construct( $result_code ) { + $this->result_code = $result_code; + } + + /** + * Get details. + * + * @return array|null + */ + public function get_details() { + return $this->details; + } + + /** + * Set details. + * + * @param array|null $details Details. + * @return void + */ + public function set_details( $details ) { + $this->details = $details; + } + + /** + * Get payment data. + * + * @return string|null + */ + public function get_payment_data() { + return $this->payment_data; + } + + /** + * Set payment data. + * + * @param string|null $payment_data Payment data. + * @return void + */ + public function set_payment_data( $payment_data ) { + $this->payment_data = $payment_data; + } + + /** + * Get result code. + * + * @return string + */ + public function get_result_code() { + return $this->result_code; + } + + /** + * Get PSP reference. + * + * @return string|null + */ + public function get_psp_reference() { + return $this->psp_reference; + } + + /** + * Set PSP reference. + * + * @param string|null $psp_reference PSP reference. + * @return void + */ + public function set_psp_reference( $psp_reference ) { + $this->psp_reference = $psp_reference; + } + + /** + * Get refusal reason. + * + * @return string|null + */ + public function get_refusal_reason() { + return $this->refusal_reason; + } + + /** + * Set refusal reason. + * + * @param string|null $refusal_reason Refusal reason. + * @return void + */ + public function set_refusal_reason( $refusal_reason ) { + $this->refusal_reason = $refusal_reason; + } + + /** + * Get redirect. + * + * @return RedirectInformation|null + */ + public function get_redirect() { + return $this->redirect; + } + + /** + * Set redirect. + * + * @param RedirectInformation|null $redirect Redirect information. + * @return void + */ + public function set_redirect( RedirectInformation $redirect = null ) { + $this->redirect = $redirect; + } + + /** + * Get action. + * + * @return ActionInformation|null + */ + public function get_action() { + return $this->action; + } + + /** + * Set action. + * + * @param ActionInformation|null $action Action information. + * @return void + */ + public function set_action( ActionInformation $action = null ) { + $this->action = $action; + } + + /** + * Create payment response from object. + * + * @param object $object Object. + * @return PaymentResponse + * @throws ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment-response.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + $payment_response = new self( $object->resultCode ); + + if ( isset( $object->pspReference ) ) { + $payment_response->set_psp_reference( $object->pspReference ); + } + + if ( isset( $object->action ) ) { + $payment_response->set_action( ActionInformation::from_object( $object->action ) ); + } + + if ( isset( $object->details ) ) { + $details = array(); + + foreach ( $object->details as $detail ) { + $details[] = DetailsInformation::from_object( $detail ); + } + + $payment_response->set_details( $details ); + } + + if ( isset( $object->refusalReason ) ) { + $payment_response->set_refusal_reason( $object->refusalReason ); + } + + if ( isset( $object->redirect ) ) { + $payment_response->set_redirect( RedirectInformation::from_object( $object->redirect ) ); + } + + if ( isset( $object->paymentData ) ) { + $payment_response->set_payment_data( $object->paymentData ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + return $payment_response; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + // Redirect. + $redirect = $this->get_redirect(); + + if ( null !== $redirect ) { + $redirect = $redirect->get_json(); + } + + // Properties. + $properties = array( + 'refusalReason' => $this->get_refusal_reason(), + 'redirect' => $redirect, + 'resultCode' => $this->get_result_code(), + 'paymentData' => $this->get_payment_data(), + ); + + // Details. + $details = $this->get_details(); + + if ( null !== $details ) { + $properties['details'] = array(); + + foreach ( $details as $detail ) { + $properties['details'][] = $detail->get_json(); + } + } + + $properties = Util::filter_null( $properties ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php new file mode 100644 index 00000000..773b1359 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResponseHelper.php @@ -0,0 +1,72 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Payment response helper + * + * @author Reüel van der Steege + * @version 1.1.0 + * @since 1.1.0 + */ +class PaymentResponseHelper { + /** + * Update payment to the payment response. + * + * @param Payment $payment Payment. + * @param PaymentResponse $response Response. + * + * @return void + */ + public static function update_payment( Payment $payment, PaymentResponse $response ) { + // Add note. + $note = sprintf( + '

    %s

    ', + sprintf( + /* translators: %s: payment provider name */ + __( 'Verified payment result.', 'pronamic_ideal' ), + __( 'Adyen', 'pronamic_ideal' ) + ) + ); + + $json = wp_json_encode( $response->get_json(), JSON_PRETTY_PRINT ); + + if ( false !== $json ) { + $note .= sprintf( + '
    %s
    ', + $json + ); + } + + $payment->add_note( $note ); + + // PSP reference. + $psp_reference = $response->get_psp_reference(); + + if ( null !== $psp_reference ) { + $payment->set_transaction_id( $psp_reference ); + } + + // Result code. + $result_code = $response->get_result_code(); + + $status = ResultCode::transform( $result_code ); + + if ( null !== $status && PaymentStatus::OPEN !== $status ) { + $payment->set_status( $status ); + } + + $payment->save(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php new file mode 100644 index 00000000..63bcfbba --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultHelper.php @@ -0,0 +1,70 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Payment result helper + * + * @author Remco Tolsma + * @version 1.1.2 + * @since 1.0.0 + */ +class PaymentResultHelper { + /** + * Update payment to the payment result response. + * + * @param Payment $payment Payment. + * @param PaymentResultResponse $response Response. + * @return void + */ + public static function update_payment( Payment $payment, PaymentResultResponse $response ) { + // Add note. + $note = sprintf( + '

    %s

    ', + sprintf( + /* translators: %s: payment provider name */ + __( 'Verified payment result.', 'pronamic_ideal' ), + __( 'Adyen', 'pronamic_ideal' ) + ) + ); + + $json = wp_json_encode( $response->get_json(), JSON_PRETTY_PRINT ); + + if ( false !== $json ) { + $note .= sprintf( + '
    %s
    ', + $json + ); + } + + $payment->add_note( $note ); + + // PSP reference. + $psp_reference = $response->get_psp_reference(); + + if ( null !== $psp_reference ) { + $payment->set_transaction_id( $psp_reference ); + } + + // Result code. + $result_code = $response->get_result_code(); + + $status = ResultCode::transform( $result_code ); + + if ( null !== $status ) { + $payment->set_status( $status ); + } + + $payment->save(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultRequest.php new file mode 100644 index 00000000..ea18606b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultRequest.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Payment result request + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments/result + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentResultRequest extends Request { + /** + * Encrypted and signed payment result data. You should receive this value from the Checkout SDK after the shopper completes the payment. + * + * @var string + */ + private $payload; + + /** + * Construct a payment result request object. + * + * @param string $payload Payload. + */ + public function __construct( $payload ) { + $this->payload = $payload; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + return (object) array( + 'payload' => $this->payload, + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultResponse.php new file mode 100644 index 00000000..03c98c78 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentResultResponse.php @@ -0,0 +1,181 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use InvalidArgumentException; +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Payment result response + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments/result + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentResultResponse extends ResponseObject { + /** + * A unique value that you provided in the initial `/paymentSession` request as a `reference` field. + * + * @var string + */ + private $merchant_reference; + + /** + * The payment method used in the transaction. + * + * @var string + */ + private $payment_method; + + /** + * The shopperLocale value provided in the payment request + * + * @var string + */ + private $shopper_locale; + + /** + * The result of the payment. + * + * @var string|null + */ + private $result_code; + + /** + * Adyen's 16-character string reference associated with the transaction/request. This value is globally unique; quote it when communicating with us about this request. + * + * @var string|null + */ + private $psp_reference; + + /** + * Construct payment result response object. + * + * @param string $merchant_reference Merchant reference. + * @param string $payment_method Payment method. + * @param string $shopper_locale Shopper locale. + */ + public function __construct( $merchant_reference, $payment_method, $shopper_locale ) { + $this->merchant_reference = $merchant_reference; + $this->payment_method = $payment_method; + $this->shopper_locale = $shopper_locale; + } + + /** + * Get merchant reference. + * + * @return string + */ + public function get_merchant_reference() { + return $this->merchant_reference; + } + + /** + * Get payment method. + * + * @return string + */ + public function get_payment_method() { + return $this->payment_method; + } + + /** + * Get shopper locale. + * + * @return string + */ + public function get_shopper_locale() { + return $this->shopper_locale; + } + + /** + * Get result code. + * + * @return string|null + */ + public function get_result_code() { + return $this->result_code; + } + + /** + * Set result code. + * + * @param string|null $result_code Result code. + * @return void + */ + public function set_result_code( $result_code ) { + $this->result_code = $result_code; + } + + /** + * Get PSP reference. + * + * @return string|null + */ + public function get_psp_reference() { + return $this->psp_reference; + } + + /** + * Set PSP reference. + * + * @param string|null $psp_reference PSP reference. + * @return void + */ + public function set_psp_reference( $psp_reference ) { + $this->psp_reference = $psp_reference; + } + + /** + * Create payment result repsonse from object. + * + * @param object $object Object. + * @return PaymentResultResponse + * @throws ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment-result.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + $response = new self( + $object->merchantReference, + $object->paymentMethod, + $object->shopperLocale + ); + + if ( isset( $object->pspReference ) ) { + $response->set_psp_reference( $object->pspReference ); + } + + if ( isset( $object->resultCode ) ) { + $response->set_result_code( $object->resultCode ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + + $response->set_original_object( $object ); + + return $response; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentSessionRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentSessionRequest.php new file mode 100644 index 00000000..4b821e50 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentSessionRequest.php @@ -0,0 +1,148 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Payment session request + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/paymentSession + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class PaymentSessionRequest extends AbstractPaymentRequest { + /** + * Allowed payment methods. + * + * List of payments methods to be presented to the shopper. To refer to payment methods, + * use their brandCode from https://docs.adyen.com/developers/payment-methods/payment-methods-overview + * + * @var array|null + */ + private $allowed_payment_methods; + + /** + * Origin. + * + * Required for the Web integration. Set this parameter to the + * origin URL of the page that you are loading the SDK from. + * + * @var string|null + */ + private $origin; + + /** + * SDK version. + * + * @var string|null + */ + private $sdk_version; + + /** + * Construct a payment request object. + * + * @param Amount $amount The amount information for the transaction. + * @param string $merchant_account The merchant account identifier, with which you want to process the transaction. + * @param string $reference The reference to uniquely identify a payment. + * @param string $return_url The URL to return to. + * @param string $country_code The collection that contains the type of the payment method and its specific information (e.g. idealIssuer). + */ + public function __construct( Amount $amount, $merchant_account, $reference, $return_url, $country_code ) { + parent::__construct( $amount, $merchant_account, $reference, $return_url ); + + $this->set_country_code( $country_code ); + } + + /** + * Get allowed payment methods. + * + * @return array|null + */ + public function get_allowed_payment_methods() { + return $this->allowed_payment_methods; + } + + /** + * Set allowed payment methods. + * + * @param array|null $allowed_payment_methods Allowed payment methods. + * @return void + */ + public function set_allowed_payment_methods( $allowed_payment_methods ) { + $this->allowed_payment_methods = $allowed_payment_methods; + } + + /** + * Get origin. + * + * @return string|null + */ + public function get_origin() { + return $this->origin; + } + + /** + * Set origin. + * + * @param string|null $origin Origin. + * @return void + */ + public function set_origin( $origin ) { + $this->origin = $origin; + } + + /** + * Get SDK version. + * + * @return string|null + */ + public function get_sdk_version() { + return $this->sdk_version; + } + + /** + * Set SDK version. + * + * @param string|null $sdk_version SDK version. + * @return void + */ + public function set_sdk_version( $sdk_version ) { + $this->sdk_version = $sdk_version; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $object = parent::get_json(); + + $properties = (array) $object; + + // Optional. + $optional = Util::filter_null( + array( + 'allowedPaymentMethods' => $this->allowed_payment_methods, + 'origin' => $this->origin, + 'sdkVersion' => $this->sdk_version, + ) + ); + + $properties = array_merge( $properties, $optional ); + + // Return object. + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentSessionResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentSessionResponse.php new file mode 100644 index 00000000..a8a81f09 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentSessionResponse.php @@ -0,0 +1,73 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Payment session response + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/paymentSession + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentSessionResponse extends ResponseObject { + /** + * The encoded payment session that you need to pass to the SDK. + * + * @var string + */ + private $payment_session; + + /** + * Construct payment session response object. + * + * @param string $payment_session The encoded payment session. + */ + public function __construct( $payment_session ) { + $this->payment_session = $payment_session; + } + + /** + * Get payment session. + * + * @return string + */ + public function get_payment_session() { + return $this->payment_session; + } + + /** + * Create payment session repsonse from object. + * + * @param object $object Object. + * @return PaymentSessionResponse + * @throws ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment-session-response.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + return new self( $object->paymentSession ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentsController.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentsController.php new file mode 100644 index 00000000..55cb6b0e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentsController.php @@ -0,0 +1,625 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Exception\ValidationException; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Plugin; +use WP_REST_Request; + +/** + * Payments result controller + * + * @link https://docs.adyen.com/developers/checkout/web-sdk/customization/logic#beforecomplete + * + * @author Reüel van der Steege + * @version 1.1.2 + * @since 1.1.0 + */ +class PaymentsController { + /** + * Setup. + * + * @return void + */ + public function setup() { + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * + * @return void + */ + public function rest_api_init() { + // Register REST route `/payments//{payment_id}`. + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/payments/(?P\d+)', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_adyen_payments' ), + 'permission_callback' => '__return_true', + 'args' => array( + 'payment_id' => array( + 'description' => __( 'Payment ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + ), + ) + ); + + // Register REST route `/payments/details/{payment_id}`. + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/payments/details/(?P\d+)', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_adyen_payment_details' ), + 'permission_callback' => '__return_true', + 'args' => array( + 'payment_id' => array( + 'description' => __( 'Payment ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + ), + ) + ); + + // Register REST route `/payments/applepay/merchant-validation/`. + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/payments/applepay/merchant-validation/(?P\d+)', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_applepay_merchant_validation' ), + 'permission_callback' => '__return_true', + 'args' => array( + 'payment_id' => array( + 'description' => __( 'Payment ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + ), + ) + ); + } + + /** + * REST API Adyen payments handler. + * + * @param WP_REST_Request $request Request. + * @return object + * @throws \Exception Throws exception on Adyen service exception response. + */ + public function rest_api_adyen_payments( WP_REST_Request $request ) { + $payment_id = $request->get_param( 'payment_id' ); + + // Payment ID. + if ( null === $payment_id ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-payment-id', + __( 'No payment ID given in `payment_id` parameter.', 'pronamic_ideal' ) + ); + } + + $payment = \get_pronamic_payment( $payment_id ); + + if ( null === $payment ) { + return new \WP_Error( + 'pronamic-pay-adyen-payment-not-found', + sprintf( + /* translators: %s: payment ID */ + __( 'Could not find payment with ID `%s`.', 'pronamic_ideal' ), + $payment_id + ), + $payment_id + ); + } + + // State data. + $data = \json_decode( $request->get_body() ); + + if ( null === $data ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-data', + __( 'No data given in request body.', 'pronamic_ideal' ) + ); + } + + // Gateway. + $config_id = $payment->get_config_id(); + + if ( null === $config_id ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-config', + __( 'No gateway configuration ID given in payment.', 'pronamic_ideal' ) + ); + } + + $gateway = Plugin::get_gateway( $config_id ); + + if ( empty( $gateway ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-gateway-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + if ( ! isset( $gateway->client ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-client-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find client in gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + // Create payment. + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + if ( ! isset( $data->paymentMethod->type ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-payment-method', + __( 'No payment method given.', 'pronamic_ideal' ) + ); + } + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + $payment_method = PaymentMethod::from_object( $data->paymentMethod ); + + try { + if ( ! \is_callable( array( $gateway, 'create_payment' ) ) ) { + return (object) array( + 'error' => __( 'Gateway does not support method to create payment.', 'pronamic_ideal' ), + ); + } + + try { + $response = $gateway->create_payment( $payment, $payment_method, $data ); + } catch ( \Pronamic\WordPress\Pay\Gateways\Adyen\ServiceException $service_exception ) { + $message = $service_exception->getMessage(); + + $error_code = $service_exception->get_error_code(); + + if ( ! empty( $error_code ) ) { + $message = sprintf( + /* translators: 1: error message, 2: error code */ + __( '%1$s (error %2$s)', 'pronamic_ideal' ), + $service_exception->getMessage(), + $error_code + ); + } + + throw new \Exception( $message ); + } + } catch ( \Exception $e ) { + $error = $e->getMessage(); + + $error_code = $e->getCode(); + + if ( ! empty( $error_code ) ) { + $error = sprintf( '%s - %s', $error_code, $e->getMessage() ); + } + + return (object) array( 'error' => $error ); + } + + // Update payment status based on response. + PaymentResponseHelper::update_payment( $payment, $response ); + + $result = array( + 'resultCode' => $response->get_result_code(), + ); + + // Return action if available. + $action = $response->get_action(); + + if ( null !== $action ) { + $result['action'] = $action->get_json(); + } + + // Return refusal reason if available. + $refusal_reason = $response->get_refusal_reason(); + + if ( null !== $refusal_reason ) { + $result['refusalReason'] = $refusal_reason; + } + + return (object) $result; + } + + /** + * REST API Adyen payment details handler. + * + * @param WP_REST_Request $request Request. + * @return object + * @throws \Exception Throws exception on Adyen service exception response. + */ + public function rest_api_adyen_payment_details( WP_REST_Request $request ) { + $payment_id = $request->get_param( 'payment_id' ); + + // Payment ID. + if ( null === $payment_id ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-payment-id', + __( 'No payment ID given in `payment_id` parameter.', 'pronamic_ideal' ) + ); + } + + $payment = \get_pronamic_payment( $payment_id ); + + if ( null === $payment ) { + return new \WP_Error( + 'pronamic-pay-adyen-payment-not-found', + sprintf( + /* translators: %s: payment ID */ + __( 'Could not find payment with ID `%s`.', 'pronamic_ideal' ), + $payment_id + ), + $payment_id + ); + } + + // State data. + $data = \json_decode( $request->get_body() ); + + if ( null === $data ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-data', + __( 'No data given in request body.', 'pronamic_ideal' ) + ); + } + + // Gateway. + $config_id = $payment->get_config_id(); + + if ( null === $config_id ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-config', + __( 'No gateway configuration ID given in payment.', 'pronamic_ideal' ) + ); + } + + $gateway = Plugin::get_gateway( $config_id ); + + if ( empty( $gateway ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-gateway-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + if ( ! isset( $gateway->client ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-client-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find client in gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + if ( ! isset( $data->paymentMethod->type ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-payment-method', + __( 'No payment method given.', 'pronamic_ideal' ) + ); + } + + // Send additional payment details. + $payment_details_request = new PaymentDetailsRequest(); + + // Set payment data from original payment response. + $payment_response = $payment->get_meta( 'adyen_payment_response' ); + + if ( is_string( $payment_response ) && '' !== $payment_response ) { + $payment_response = \json_decode( $payment_response ); + + $payment_response = PaymentResponse::from_object( $payment_response ); + + $payment_data = $payment_response->get_payment_data(); + + $payment_details_request->set_payment_data( $payment_data ); + } + + try { + if ( ! \is_callable( array( $gateway, 'send_payment_details' ) ) ) { + return (object) array( + 'error' => __( 'Gateway does not support sending additional payment details.', 'pronamic_ideal' ), + ); + } + + try { + $response = $gateway->send_payment_details( $payment_details_request ); + } catch ( \Pronamic\WordPress\Pay\Gateways\Adyen\ServiceException $service_exception ) { + $message = $service_exception->getMessage(); + + $error_code = $service_exception->get_error_code(); + + if ( ! empty( $error_code ) ) { + $message = sprintf( + /* translators: 1: error message, 2: error code */ + __( '%1$s (error %2$s)', 'pronamic_ideal' ), + $service_exception->getMessage(), + $error_code + ); + } + + throw new \Exception( $message ); + } + + // Update payment status based on response. + PaymentResponseHelper::update_payment( $payment, $response ); + } catch ( \Exception $e ) { + $error = $e->getMessage(); + + $error_code = $e->getCode(); + + if ( ! empty( $error_code ) ) { + $error = sprintf( '%s - %s', $error_code, $e->getMessage() ); + } + + return (object) array( 'error' => $error ); + } + + $result = array( + 'resultCode' => $response->get_result_code(), + ); + + // Return action if available. + $action = $response->get_action(); + + if ( null !== $action ) { + $result['action'] = $action->get_json(); + } + + // Return refusal reason if available. + $refusal_reason = $response->get_refusal_reason(); + + if ( null !== $refusal_reason ) { + $result['refusalReason'] = $refusal_reason; + } + + return (object) $result; + } + + /** + * REST API Apple Pay merchant validation handler. + * + * @param WP_REST_Request $request Request. + * @return object + * @throws \Exception Throws exception on merchant identity files problems. + */ + public function rest_api_applepay_merchant_validation( WP_REST_Request $request ) { + $payment_id = $request->get_param( 'payment_id' ); + + // Payment ID. + if ( null === $payment_id ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-payment-id', + __( 'No payment ID given in `payment_id` parameter.', 'pronamic_ideal' ) + ); + } + + $payment = \get_pronamic_payment( $payment_id ); + + if ( null === $payment ) { + return new \WP_Error( + 'pronamic-pay-adyen-payment-not-found', + sprintf( + /* translators: %s: payment ID */ + __( 'Could not find payment with ID `%s`.', 'pronamic_ideal' ), + $payment_id + ), + $payment_id + ); + } + + // State data. + $data = \json_decode( $request->get_body() ); + + if ( null === $data ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-data', + __( 'No data given in request body.', 'pronamic_ideal' ) + ); + } + + // Gateway. + $config_id = $payment->get_config_id(); + + if ( null === $config_id ) { + return new \WP_Error( + 'pronamic-pay-adyen-no-config', + __( 'No gateway configuration ID given in payment.', 'pronamic_ideal' ) + ); + } + + $gateway = Plugin::get_gateway( $config_id ); + + if ( empty( $gateway ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-gateway-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + if ( ! isset( $gateway->client ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-client-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find client in gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + // Merchant identifier. + $integration = new Integration(); + + $config = $integration->get_config( $config_id ); + + $merchant_identifier = $config->get_apple_pay_merchant_id(); + + if ( empty( $merchant_identifier ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-applepay-no-merchant-identifier', + __( 'Apple Pay merchant identifier not configured in gateway settings.', 'pronamic_ideal' ) + ); + } + + if ( ! isset( $data->validation_url ) ) { + return new \WP_Error( + 'pronamic-pay-adyen-applepay-no-validation-url', + __( 'No Apple Pay merchant validation URL given.', 'pronamic_ideal' ) + ); + } + + /* + * Request an Apple Pay payment session. + * + * @link https://developer.apple.com/documentation/apple_pay_on_the_web/applepaysession/1778021-onvalidatemerchant + * @link https://developer.apple.com/documentation/apple_pay_on_the_web/apple_pay_js_api/requesting_an_apple_pay_payment_session + * @link https://docs.adyen.com/payment-methods/apple-pay/web-drop-in#show-apple-pay-in-your-payment-form + */ + $request = array( + 'merchantIdentifier' => $merchant_identifier, + 'displayName' => \get_bloginfo( 'name' ), + 'initiative' => 'web', + 'initiativeContext' => Server::get( 'HTTP_HOST', FILTER_SANITIZE_STRING ), + ); + + try { + add_action( 'http_api_curl', array( $this, 'http_curl_applepay_merchant_identity' ), 10, 2 ); + + $certificate = $config->get_apple_pay_merchant_id_certificate(); + $private_key = $config->get_apple_pay_merchant_id_private_key(); + + if ( empty( $certificate ) || empty( $private_key ) ) { + throw new \Exception( __( 'Invalid Apple Pay Merchant Identity configuration.', 'pronamic_ideal' ) ); + } + + // Create temporary files for merchant validation. + $certificate_file = \tmpfile(); + $private_key_file = \tmpfile(); + + if ( false === $certificate_file || false === $private_key_file ) { + throw new \Exception( __( 'Error creating merchant identity files.', 'pronamic_ideal' ) ); + } + + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite -- Temporary files. + \fwrite( $certificate_file, $certificate ); + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite -- Temporary files. + \fwrite( $private_key_file, $private_key ); + + // Validate merchant. + $response = \wp_remote_request( + $data->validation_url, + array( + 'method' => 'POST', + 'headers' => array( + 'Content-Type' => 'application/json', + ), + 'body' => \wp_json_encode( (object) $request ), + 'adyen_applepay_merchant_identity' => array( + 'certificate_path' => stream_get_meta_data( $certificate_file )['uri'], + 'private_key_path' => stream_get_meta_data( $private_key_file )['uri'], + 'private_key_password' => $config->get_apple_pay_merchant_id_private_key_password(), + ), + ) + ); + + // Remove temporary files. + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose -- Temporary files. + \fclose( $certificate_file ); + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose -- Temporary files. + \fclose( $private_key_file ); + + $body = \wp_remote_retrieve_body( $response ); + + $result = \json_decode( $body ); + } catch ( \Exception $e ) { + $error = $e->getMessage(); + + $error_code = $e->getCode(); + + if ( ! empty( $error_code ) ) { + $error = sprintf( '%s - %s', $error_code, $e->getMessage() ); + } + + return (object) array( 'error' => $error ); + } + + return (object) $result; + } + + /** + * HTTP CURL options for Apple Pay merchant validation. + * + * @param resource $handle CURL handle. + * @param array> $parsed_args Parsed arguments. + * @return void + * @throws \Exception Throws exception on error while reading temporary files. + */ + public function http_curl_applepay_merchant_identity( $handle, $parsed_args ) { + if ( ! isset( $parsed_args['adyen_applepay_merchant_identity'] ) ) { + return; + } + + $merchant_identity = $parsed_args['adyen_applepay_merchant_identity']; + + $certificate_path = $merchant_identity['certificate_path']; + $private_key_path = $merchant_identity['private_key_path']; + $private_key_password = $merchant_identity['private_key_password']; + + // Check temporary files existence. + if ( ! \is_readable( $certificate_path ) || ! \is_readable( $private_key_path ) ) { + throw new \Exception( __( 'Error reading merchant identity files.', 'pronamic_ideal' ) ); + } + + // Set merchant identity certificate and private key SSL options. + // phpcs:disable WordPress.WP.AlternativeFunctions.curl_curl_setopt + \curl_setopt( $handle, CURLOPT_SSLCERT, $certificate_path ); + \curl_setopt( $handle, CURLOPT_SSLKEY, $private_key_path ); + + // Set merchant identity private key password. + if ( ! empty( $private_key_password ) ) { + \curl_setopt( $handle, CURLOPT_SSLKEYPASSWD, $private_key_password ); + } + + // phpcs:enable WordPress.WP.AlternativeFunctions.curl_curl_setopt + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php new file mode 100644 index 00000000..7b458a84 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/PaymentsResultController.php @@ -0,0 +1,154 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use JsonSchema\Exception\ValidationException; +use Pronamic\WordPress\Pay\Plugin; +use WP_Error; +use WP_REST_Request; + +/** + * Payments result controller + * + * @link https://docs.adyen.com/developers/checkout/web-sdk/customization/logic#beforecomplete + * + * @author Remco Tolsma + * @version 1.0.3 + * @since 1.0.0 + */ +class PaymentsResultController { + /** + * Setup. + * + * @return void + */ + public function setup() { + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * + * @return void + */ + public function rest_api_init() { + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/payments/result/(?P\d+)', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_adyen_payments_result' ), + 'permission_callback' => '__return_true', + 'args' => array( + 'config_id' => array( + 'description' => __( 'Gateway configuration ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + 'payload' => array( + 'description' => __( 'Payload.', 'pronamic_ideal' ), + 'type' => 'string', + ), + 'resultCode' => array( + 'description' => __( 'Result code.', 'pronamic_ideal' ), + 'type' => 'string', + ), + 'resultText' => array( + 'description' => __( 'Result text.', 'pronamic_ideal' ), + 'type' => 'string', + ), + ), + ) + ); + } + + /** + * REST API Adyen payments result handler. + * + * @param WP_REST_Request $request Request. + * @return object + */ + public function rest_api_adyen_payments_result( WP_REST_Request $request ) { + $config_id = $request->get_param( 'config_id' ); + + if ( null === $config_id ) { + return new WP_Error( + 'pronamic-pay-adyen-no-gateway-configuration-id', + __( 'No gateway configuration ID given in `config_id` parameter.', 'pronamic_ideal' ) + ); + } + + $payload = $request->get_param( 'payload' ); + + if ( null === $payload ) { + return new WP_Error( + 'pronamic-pay-adyen-no-payload', + __( 'No payload given in `payload` parameter.', 'pronamic_ideal' ) + ); + } + + // Gateway. + $gateway = Plugin::get_gateway( $config_id ); + + if ( empty( $gateway ) ) { + return new WP_Error( + 'pronamic-pay-adyen-gateway-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not found gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + if ( ! isset( $gateway->client ) ) { + return new WP_Error( + 'pronamic-pay-adyen-client-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not found client in gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + // Client. + $payment_result_request = new PaymentResultRequest( $payload ); + + $payment_result_response = $gateway->client->get_payment_result( $payment_result_request ); + + $merchant_reference = $payment_result_response->get_merchant_reference(); + + // Payment. + $payment = get_pronamic_payment( $merchant_reference ); + + if ( empty( $payment ) ) { + return new WP_Error( + 'pronamic-pay-adyen-payment-not-found', + sprintf( + /* translators: %s: Adyen merchant reference */ + __( 'Could not found payment with ID `%s`.', 'pronamic_ideal' ), + $merchant_reference + ), + $payment_result_response + ); + } + + PaymentResultHelper::update_payment( $payment, $payment_result_response ); + + // Return payment result response. + return $payment_result_response->get_json(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/RedirectInformation.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/RedirectInformation.php new file mode 100644 index 00000000..0b5b8245 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/RedirectInformation.php @@ -0,0 +1,141 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Redirect information + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class RedirectInformation extends ResponseObject { + /** + * When the redirect URL must be accessed via POST, use this data to post to the redirect URL. + * + * @var object|null + */ + private $data; + + /** + * The web method that you must use to access the redirect URL. + * + * Possible values: GET, POST. + * + * @var string + */ + private $method; + + /** + * The URL, to which you must redirect a shopper to complete a payment + * + * @var string + */ + private $url; + + /** + * Construct redirect information. + * + * @param string $method Method. + * @param string $url URL. + */ + public function __construct( $method, $url ) { + $this->method = $method; + $this->url = $url; + } + + /** + * Get data. + * + * @return object|null + */ + public function get_data() { + return $this->data; + } + + /** + * Set data. + * + * @param object|null $data Data. + * @return void + */ + public function set_data( $data ) { + $this->data = $data; + } + + /** + * Get method. + * + * @return string + */ + public function get_method() { + return $this->method; + } + + /** + * Get URL. + * + * @return string + */ + public function get_url() { + return $this->url; + } + + /** + * Create redirect information from object. + * + * @param object $object Object. + * @return RedirectInformation + * @throws \JsonSchema\Exception\ValidationException Throws validation exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/redirect.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $redirect = new self( + $object->method, + $object->url + ); + + if ( isset( $object->data ) ) { + $redirect->set_data( $object->data ); + } + + return $redirect; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = Util::filter_null( + array( + 'method' => $this->get_method(), + 'url' => $this->get_url(), + ) + ); + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Request.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Request.php new file mode 100644 index 00000000..87c17afa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Request.php @@ -0,0 +1,27 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Request + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +abstract class Request { + /** + * Get JSON. + * + * @return object + */ + abstract public function get_json(); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ResponseObject.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ResponseObject.php new file mode 100644 index 00000000..bd69360a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ResponseObject.php @@ -0,0 +1,59 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Response object + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +abstract class ResponseObject { + /** + * Originale response object. + * + * @var object|null + */ + private $original_object; + + /** + * Get original object. + * + * @return object|null + */ + public function get_original_object() { + return $this->original_object; + } + + /** + * Set original object. + * + * @param object|null $object Object. + * @return void + */ + public function set_original_object( $object ) { + $this->original_object = $object; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + if ( null !== $this->original_object ) { + return $this->original_object; + } + + return (object) array(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ResultCode.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ResultCode.php new file mode 100644 index 00000000..640b4bbb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ResultCode.php @@ -0,0 +1,114 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Result code + * + * @link https://docs.adyen.com/developers/checkout/payment-result-codes + * + * @author Reüel van der Steege + * @version 1.0.0 + * @since 1.0.0 + */ +class ResultCode { + /** + * Authorized. + * + * The payment was successfully authorised. + * + * @var string + */ + const AUTHORIZED = 'Authorised'; + + /** + * Cancelled. + * + * The payment was cancelled (by either the shopper or + * your own system) before processing was completed. + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Error. + * + * There was an error when the payment was being processed. + * + * @var string + */ + const ERROR = 'Error'; + + /** + * Pending. + * + * It's not possible to obtain the final status of the payment at this time. + * This is common for payments with an asynchronous flow, such as Boleto, iDEAL, or Klarna. + * + * @var string + */ + const PENDING = 'Pending'; + + /** + * Received. + * + * This is part of the standard payment flow for methods such as SEPA Direct Debit, + * where it can take some time before the final status of the payment is known. + * + * @var string + */ + const RECEIVED = 'Received'; + + /** + * Redirect shopper. + * + * The shopper needs to be redirected to an external web page or app to complete the payment. + * + * @var string + */ + const REDIRECT_SHOPPER = 'RedirectShopper'; + + /** + * Refused. + * + * The payment was refused. + * + * @var string + */ + const REFUSED = 'Refused'; + + /** + * Transform Adyen result code to WordPress payment status. + * + * @param string|null $result_code Adyen result code. + * @return string|null WordPress payment status. + */ + public static function transform( $result_code ) { + switch ( $result_code ) { + case self::PENDING: + case self::RECEIVED: + case self::REDIRECT_SHOPPER: + return PaymentStatus::OPEN; + case self::CANCELLED: + return PaymentStatus::CANCELLED; + case self::ERROR: + case self::REFUSED: + return PaymentStatus::FAILURE; + case self::AUTHORIZED: + return PaymentStatus::SUCCESS; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Security.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Security.php new file mode 100644 index 00000000..030f2a45 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Security.php @@ -0,0 +1,102 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Title: Security + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 1.0.7 + * @since 1.0.7 + */ +class Security { + /** + * Indicator for the begin of an certificate + * + * @var string + */ + const CERTIFICATE_BEGIN = '-----BEGIN CERTIFICATE-----'; + + /** + * Indicator for the end of an certificate + * + * @var string + */ + const CERTIFICATE_END = '-----END CERTIFICATE-----'; + + /** + * Get the sha1 fingerprint from the specified certificate + * + * @param string $certificate Certificate. + * + * @return null|string Fingerprint or null on failure + */ + public static function get_sha_fingerprint( $certificate ) { + return self::get_fingerprint( $certificate, 'sha1' ); + } + + /** + * Get the fingerprint from the specified certificate + * + * @param string $certificate Certificate. + * @param null|string $hash Hash. + * @return null|string Fingerprint or null on failure. + */ + public static function get_fingerprint( $certificate, $hash = null ) { + // The openssl_x509_read() function will throw an warning if the supplied + // parameter cannot be coerced into an X509 certificate + // @codingStandardsIgnoreStart + $resource = @openssl_x509_read( $certificate ); + // @codingStandardsIgnoreEnd + + if ( false === $resource ) { + return null; + } + + $output = ''; + + $result = \openssl_x509_export( $resource, $output ); + + if ( false === $result ) { + return null; + } + + $output = \str_replace( self::CERTIFICATE_BEGIN, '', $output ); + $output = \str_replace( self::CERTIFICATE_END, '', $output ); + + $output = \strval( $output ); + + // Base64 decode. + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode + $fingerprint = \base64_decode( $output ); + + // Hash. + if ( null !== $hash ) { + $fingerprint = \hash( $hash, $fingerprint ); + } + + /* + * Uppercase + * + * Cannot find private certificate file with fingerprint: b4845cb5cbcee3e1e0afef2662552a2365960e72 + * (Note: Some acquirers only accept fingerprints in uppercase. Make the value of "KeyName" in your XML data uppercase.). + * https://www.ideal-checkout.nl/simulator/ + * + * @since 1.1.11 + */ + $fingerprint = \strtoupper( $fingerprint ); + + return $fingerprint; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ServiceException.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ServiceException.php new file mode 100644 index 00000000..2b7651f0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/ServiceException.php @@ -0,0 +1,122 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Exception; +use JsonSchema\Constraints\Constraint; +use JsonSchema\Exception\ValidationException; +use JsonSchema\Validator; + +/** + * Service exception + * + * @link https://docs.adyen.com/developers/api-reference/common-api/serviceexception + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class ServiceException extends Exception { + /** + * The HTTP response status code. + * + * @var string + */ + private $status; + + /** + * The Adyen code that is mapped to the error message. + * + * @var string + */ + private $error_code; + + /** + * The type of error that was encountered. + * + * @var string + */ + private $error_type; + + /** + * Construct service exception. + * + * @param string $status Status. + * @param string $error_code Error code. + * @param string $message Message. + * @param string $error_type Error type. + */ + public function __construct( $status, $error_code, $message, $error_type ) { + parent::__construct( $message, intval( $error_code ) ); + + $this->status = $status; + $this->error_code = $error_code; + $this->error_type = $error_type; + } + + /** + * Get status. + * + * @return string + */ + public function get_status() { + return $this->status; + } + + /** + * Get error code. + * + * @return string + */ + public function get_error_code() { + return $this->error_code; + } + + /** + * Get message. + * + * @return string + */ + public function get_message() { + return $this->getMessage(); + } + + /** + * Get error type. + * + * @return string + */ + public function get_error_type() { + return $this->error_type; + } + + /** + * Create service exception from object. + * + * @param object $object Object. + * @return ServiceException + * @throws ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_object( $object ) { + $validator = new Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/service-exception.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Adyen JSON object. + return new self( $object->status, $object->errorCode, $object->message, $object->errorType ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/SiteHealthController.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/SiteHealthController.php new file mode 100644 index 00000000..3103dd63 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/SiteHealthController.php @@ -0,0 +1,259 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use WP_Error; +use WP_REST_Request; + +/** + * Site Health controller + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.5 + */ +class SiteHealthController { + /** + * HTTP Basic authentication test username. + * + * @var string + */ + const HTTP_BASIC_AUTHENTICATION_TEST_USERNAME = 'test'; + + /** + * HTTP Basic authentication test password. + * + * @var string + */ + const HTTP_BASIC_AUTHENTICATION_TEST_PASSWORD = '1234'; + + /** + * Setup. + * + * @return void + */ + public function setup() { + add_filter( 'site_status_tests', array( $this, 'site_status_tests' ) ); + + $prefix = 'health-check-'; + $action = 'pronamic-pay-adyen-http-authorization-test'; + + add_action( 'wp_ajax_' . $prefix . $action, array( $this, 'wp_ajax_health_check_http_authorization_test' ) ); + + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + } + + /** + * Site status tests. + * + * @link https://make.wordpress.org/core/2019/04/25/site-health-check-in-5-2/ + * @param array>> $tests Tests. + * @return array>> + */ + public function site_status_tests( $tests ) { + $tests['async']['pronamic_pay_adyen_http_authorization_test'] = array( + 'label' => __( 'HTTP Authorization header test', 'pronamic_ideal' ), + 'test' => 'pronamic-pay-adyen-http-authorization-test', + ); + + return $tests; + } + + /** + * Get HTTP authorization header. + * + * @return string + */ + private function get_http_authorization_header() { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- Benign reason. + return 'Basic ' . base64_encode( self::HTTP_BASIC_AUTHENTICATION_TEST_USERNAME . ':' . self::HTTP_BASIC_AUTHENTICATION_TEST_PASSWORD ); + } + + /** + * Get HTTP authorization test. + * + * @return array> + */ + private function get_http_authorization_test() { + $result = array( + 'label' => __( 'HTTP Basic authentication is working', 'pronamic_ideal' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

    %s

    ', + __( 'HTTP Basic authentication is required to securely receive Adyen notifications.', 'pronamic_ideal' ) + ), + 'actions' => '', + 'test' => 'pronamic-pay-adyen-http-authorization-test', + ); + + $rest_url = \rest_url( Integration::REST_ROUTE_NAMESPACE . '/http-authorization-test' ); + + $request_authorization = $this->get_http_authorization_header(); + + $response = wp_remote_get( + $rest_url, + array( + 'headers' => array( + 'Authorization' => $request_authorization, + ), + ) + ); + + if ( $response instanceof \WP_Error ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'Could not reach HTTP Authorization header test endpoint.', 'pronamic_ideal' ); + + $result['description'] .= sprintf( + '

    %s

    ', + sprintf( + '%s %s', + __( 'Error', 'pronamic_ideal' ), + sprintf( + /* translators: %s: The error returned by the lookup. */ + __( 'Your site is unable to test the HTTP Authorization header, and returned the error: %s' ), + $response->get_error_message() + ) + ) + ); + + return $result; + } + + // Body. + $body = \wp_remote_retrieve_body( $response ); + + // Response. + $response_code = \wp_remote_retrieve_response_code( $response ); + $response_message = \wp_remote_retrieve_response_message( $response ); + + // Data. + $data = json_decode( $body ); + + // JSON error. + $json_error = json_last_error(); + + if ( \JSON_ERROR_NONE !== $json_error ) { + $result['status'] = 'critical'; + + $result['description'] .= \sprintf( + 'Could not JSON decode response, HTTP response: "%s %s", HTTP body length: "%d", JSON error: "%s".', + $response_code, + $response_message, + \strlen( $body ), + \json_last_error_msg() + ); + + return $result; + } + + // Object. + if ( ! \is_object( $data ) ) { + $result['status'] = 'critical'; + + $result['description'] .= \sprintf( + 'Could not JSON decode response to an object, HTTP response: "%s %s", HTTP body: "%s".', + $response_code, + $response_message, + $body + ); + + return $result; + } + + if ( ! property_exists( $data, 'authorization' ) ) { + $result['status'] = 'critical'; + + return $result; + } + + if ( $data->authorization !== $request_authorization ) { + $result['status'] = 'critical'; + + return $result; + } + + $result['status'] = 'good'; + + return $result; + } + + /** + * WordPress AJAX health check HTTP authorization test. + * + * @link https://github.com/WordPress/WordPress/blob/5.2.4/wp-admin/includes/class-wp-site-health.php#L1128-L1189 + * @link https://github.com/WordPress/WordPress/blob/5.2.4/wp-admin/includes/ajax-actions.php#L4865-L4883 + * @return void + */ + public function wp_ajax_health_check_http_authorization_test() { + check_ajax_referer( 'health-check-site-status' ); + + if ( ! current_user_can( 'view_site_health_checks' ) ) { + wp_send_json_error(); + } + + $result = $this->get_http_authorization_test(); + + wp_send_json_success( $result ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * @return void + */ + public function rest_api_init() { + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/http-authorization-test', + array( + 'methods' => 'GET', + 'callback' => array( $this, 'rest_api_http_authorization_test' ), + 'permission_callback' => '__return_true', + ) + ); + } + + /** + * REST API Adyen notifications handler. + * + * @link https://www.php.net/manual/en/features.http-auth.php + * @param WP_REST_Request $request Request. + * @return object + */ + public function rest_api_http_authorization_test( WP_REST_Request $request ) { + $data = array( + 'authorization' => $request->get_header( 'Authorization' ), + ); + + $server_keys = array( + 'HTTP_AUTHORIZATION', + 'PHP_AUTH_USER', + 'PHP_AUTH_PW', + 'AUTH_TYPE', + ); + + foreach ( $server_keys as $key ) { + if ( array_key_exists( $key, $_SERVER ) ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $data[ $key ] = wp_unslash( $_SERVER[ $key ] ); + } + } + + return (object) $data; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/TaxCategory.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/TaxCategory.php new file mode 100644 index 00000000..23cf8e1b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/TaxCategory.php @@ -0,0 +1,50 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +/** + * Tax category + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class TaxCategory { + /** + * High. + * + * @var string + */ + const HIGH = 'High'; + + /** + * Low. + * + * @var string + */ + const LOW = 'Low'; + + /** + * None. + * + * @var string + */ + const NONE = 'None'; + + /** + * Zero. + * + * @var string + */ + const ZERO = 'Zero'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Util.php new file mode 100644 index 00000000..4ee0cfa3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/Util.php @@ -0,0 +1,60 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Util + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class Util { + /** + * Filter null. + * + * @param array $array Array to filter null values from. + * @return array + */ + public static function filter_null( $array ) { + return array_filter( $array, array( __CLASS__, 'is_not_null' ) ); + } + + /** + * Check if value is not null. + * + * @param mixed $value Value. + * @return boolean True if value is not null, false otherwise. + */ + private static function is_not_null( $value ) { + return ( null !== $value ); + } + + /** + * Get payment locale. + * + * @param Payment $payment Payment. + * @return string + */ + public static function get_payment_locale( Payment $payment ) { + $locale = get_locale(); + + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + $locale = $customer->get_locale(); + } + + return (string) $locale; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/WebSdkGateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/WebSdkGateway.php new file mode 100644 index 00000000..a83be6a5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/src/WebSdkGateway.php @@ -0,0 +1,335 @@ + + * @copyright 2005-2019 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +namespace Pronamic\WordPress\Pay\Gateways\Adyen; + +use Exception; +use InvalidArgumentException; +use Locale; +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use WP_Error; + +/** + * Web SDK gateway + * + * @link https://github.com/adyenpayments/php/blob/master/generatepaymentform.php + * + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class WebSdkGateway extends AbstractGateway { + /** + * Web SDK version. + * + * @link https://docs.adyen.com/developers/checkout/web-sdk/release-notes-web-sdk + * + * @var string + */ + const SDK_VERSION = '1.9.2'; + + /** + * Constructs and initializes an Adyen gateway. + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + // Supported features. + $this->supports = array( + 'webhook_log', + 'webhook', + ); + } + + /** + * Get supported payment methods + * + * @see Core_Gateway::get_supported_payment_methods() + * + * @return array + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::BANCONTACT, + PaymentMethods::CREDIT_CARD, + PaymentMethods::DIRECT_DEBIT, + PaymentMethods::GIROPAY, + PaymentMethods::IDEAL, + PaymentMethods::MAESTRO, + PaymentMethods::SOFORT, + ); + } + + /** + * Start. + * + * @param Payment $payment Payment. + * @return void + */ + public function start( Payment $payment ) { + // Amount. + try { + $amount = AmountTransformer::transform( $payment->get_total_amount() ); + } catch ( InvalidArgumentException $e ) { + $this->error = new WP_Error( 'adyen_error', $e->getMessage() ); + + return; + } + + // Payment method type. + $payment_method_type = PaymentMethodType::transform( $payment->get_method() ); + + // Country. + $locale = Util::get_payment_locale( $payment ); + + $country_code = Locale::getRegion( $locale ); + + // Set country from billing address. + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + $country = $billing_address->get_country_code(); + + if ( ! empty( $country ) ) { + $country_code = $country; + } + } + + /* + * API Integration + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/payments + */ + $api_integration_payment_method_types = array( + PaymentMethodType::IDEAL, + PaymentMethodType::DIRECT_EBANKING, + ); + + if ( in_array( $payment_method_type, $api_integration_payment_method_types, true ) ) { + $payment_method = array( + 'type' => $payment_method_type, + ); + + if ( PaymentMethodType::IDEAL === $payment_method_type ) { + $payment_method['issuer'] = (string) $payment->get_issuer(); + } + + // API integration. + $payment_request = new PaymentRequest( + $amount, + $this->config->get_merchant_account(), + (string) $payment->get_id(), + $payment->get_return_url(), + new PaymentMethod( (object) $payment_method ) + ); + + $payment_request->set_country_code( $country_code ); + + PaymentRequestHelper::complement( $payment, $payment_request ); + + try { + $payment_response = $this->client->create_payment( $payment_request ); + } catch ( Exception $e ) { + $this->error = new WP_Error( 'adyen_error', $e->getMessage() ); + + return; + } + + $payment->set_transaction_id( $payment_response->get_psp_reference() ); + + $redirect = $payment_response->get_redirect(); + + if ( null !== $redirect ) { + $payment->set_action_url( $redirect->get_url() ); + } + + // Return early so SDK integration code will not be executed for API integration. + return; + } + + /** + * SDK Integration + * + * @link https://docs.adyen.com/api-explorer/#/PaymentSetupAndVerificationService/v41/paymentSession + */ + $payment_session_request = new PaymentSessionRequest( + $amount, + $this->config->get_merchant_account(), + (string) $payment->get_id(), + $payment->get_return_url(), + $country_code + ); + + PaymentRequestHelper::complement( $payment, $payment_session_request ); + + // Origin. + $origin = home_url(); + + $origin_url = wp_parse_url( home_url() ); + + if ( is_array( $origin_url ) && isset( $origin_url['scheme'], $origin_url['host'] ) ) { + $origin = sprintf( + '%s://%s', + $origin_url['scheme'], + $origin_url['host'] + ); + } + + $payment_session_request->set_origin( $origin ); + $payment_session_request->set_sdk_version( self::SDK_VERSION ); + + if ( null !== $payment_method_type ) { + $payment_session_request->set_allowed_payment_methods( array( $payment_method_type ) ); + } + + try { + $payment_session_response = $this->client->create_payment_session( $payment_session_request ); + } catch ( Exception $e ) { + $this->error = new WP_Error( 'adyen_error', $e->getMessage() ); + + return; + } + + $payment->set_meta( 'adyen_sdk_version', self::SDK_VERSION ); + $payment->set_meta( 'adyen_payment_session', $payment_session_response->get_payment_session() ); + + $payment->set_action_url( $payment->get_pay_redirect_url() ); + } + + /** + * Payment redirect. + * + * @param Payment $payment Payment. + * @return void + */ + public function payment_redirect( Payment $payment ) { + $sdk_version = $payment->get_meta( 'adyen_sdk_version' ); + $payment_session = $payment->get_meta( 'adyen_payment_session' ); + + if ( empty( $sdk_version ) || empty( $payment_session ) ) { + return; + } + + if ( empty( $payment->config_id ) ) { + return; + } + + $url = sprintf( + 'https://checkoutshopper-%s.adyen.com/checkoutshopper/assets/js/sdk/checkoutSDK.%s.min.js', + ( self::MODE_TEST === $payment->get_mode() ? 'test' : 'live' ), + $sdk_version + ); + + wp_register_script( + 'pronamic-pay-adyen-checkout', + $url, + array( + 'jquery', + ), + $sdk_version, + false + ); + + /** + * Config object. + * + * @link https://docs.adyen.com/checkout/web-sdk/ + * @link https://docs.adyen.com/checkout/web-sdk/customization/settings/ + * @link https://docs.adyen.com/checkout/web-sdk/customization/styling/#styling-the-card-fields + */ + $config_object = (object) array( + 'context' => ( self::MODE_TEST === $payment->get_mode() ? 'test' : 'live' ), + ); + + /** + * Filters the Adyen config object. + * + * @link https://github.com/wp-pay-gateways/adyen#pronamic_pay_adyen_config_object + * @link https://docs.adyen.com/checkout/web-sdk/ + * @link https://docs.adyen.com/checkout/web-sdk/customization/settings/ + * @link https://docs.adyen.com/checkout/web-sdk/customization/styling/#styling-the-card-fields + * + * @param object $config_object Adyen config object. + * + * @since 1.1 + */ + $config_object = apply_filters( 'pronamic_pay_adyen_config_object', $config_object ); + + wp_localize_script( + 'pronamic-pay-adyen-checkout', + 'pronamicPayAdyenCheckout', + array( + 'paymentsResultUrl' => rest_url( Integration::REST_ROUTE_NAMESPACE . '/payments/result/' . $payment->config_id ), + 'paymentReturnUrl' => $payment->get_return_url(), + 'paymentSession' => $payment_session, + 'configObject' => $config_object, + ) + ); + + // Add checkout head action. + add_action( 'pronamic_pay_adyen_checkout_head', array( $this, 'checkout_head' ) ); + + // No cache. + Core_Util::no_cache(); + + require __DIR__ . '/../views/checkout-web-sdk.php'; + + exit; + } + + /** + * Checkout head. + * + * @return void + */ + public function checkout_head() { + wp_print_styles( 'pronamic-pay-redirect' ); + + wp_print_scripts( 'pronamic-pay-adyen-checkout' ); + } + + /** + * Update status of the specified payment. + * + * @param Payment $payment Payment. + * + * @return void + */ + public function update_status( Payment $payment ) { + // Process payload on return. + if ( ! filter_has_var( INPUT_GET, 'payload' ) ) { + return; + } + + $payload = filter_input( INPUT_GET, 'payload', FILTER_SANITIZE_STRING ); + + $payment_result_request = new PaymentResultRequest( $payload ); + + try { + $payment_result_response = $this->client->get_payment_result( $payment_result_request ); + + PaymentResultHelper::update_payment( $payment, $payment_result_response ); + } catch ( Exception $e ) { + $note = sprintf( + /* translators: %s: exception message */ + __( 'Error getting payment result: %s', 'pronamic_ideal' ), + $e->getMessage() + ); + + $payment->add_note( $note ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/views/checkout-drop-in.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/views/checkout-drop-in.php new file mode 100644 index 00000000..6b7bff43 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/views/checkout-drop-in.php @@ -0,0 +1,48 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + + <?php esc_html_e( 'Checkout', 'pronamic_ideal' ); ?> + + + + + +
    +
    +
    +
    +
    + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/views/checkout-web-sdk.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/views/checkout-web-sdk.php new file mode 100644 index 00000000..e22f851b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/adyen/views/checkout-web-sdk.php @@ -0,0 +1,84 @@ + + * @copyright 2005-2019 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + + <?php esc_html_e( 'Checkout', 'pronamic_ideal' ); ?> + + + + + +
    +
    +
    +
    +
    + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Client.php new file mode 100644 index 00000000..73a5cfda --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Client.php @@ -0,0 +1,594 @@ +set_payment_server_url( self::GATEWAY_URL ); + + $this->requested_services = array(); + } + + /** + * Get the payment server URL + * + * @return string the payment server URL + */ + public function get_payment_server_url() { + return $this->payment_server_url; + } + + /** + * Set the payment server URL + * + * @param string $url an URL + */ + public function set_payment_server_url( $url ) { + $this->payment_server_url = $url; + } + + public function get_website_key() { + return $this->website_key; + } + + public function set_website_key( $website_key ) { + $this->website_key = $website_key; + } + + public function get_secret_key() { + return $this->secret_key; + } + + public function set_secret_key( $secret_key ) { + $this->secret_key = $secret_key; + } + + public function get_payment_method() { + return $this->payment_method; + } + + public function set_payment_method( $payment_method ) { + $this->payment_method = $payment_method; + } + + /** + * Get iDEAL issuer. + * + * @since 1.2.4 + * @return string + */ + public function get_ideal_issuer() { + return $this->ideal_issuer; + } + + /** + * Set iDEAL issuer. + * + * @since 1.2.4 + * + * @param string $issuer + */ + public function set_ideal_issuer( $issuer ) { + $this->ideal_issuer = $issuer; + } + + public function get_requested_services() { + return $this->requested_services; + } + + public function add_requested_service( $service ) { + $this->requested_services[] = $service; + } + + public function get_excluded_services() { + return $this->excluded_services; + } + + public function set_excluded_services( $service ) { + $this->excluded_services = $service; + } + + public function get_culture() { + return $this->culture; + } + + public function set_culture( $culture ) { + $this->culture = $culture; + } + + public function get_currency() { + return $this->currency; + } + + public function set_currency( $currency ) { + $this->currency = $currency; + } + + public function get_invoice_number() { + return $this->invoice_number; + } + + public function set_invoice_number( $invoice_number ) { + $this->invoice_number = $invoice_number; + } + + public function get_description() { + return $this->description; + } + + public function set_description( $description ) { + $this->description = $description; + } + + /** + * Get amount. + * + * @return int + */ + public function get_amount() { + return $this->amount; + } + + /** + * Set amount. + * + * @param int $amount Amount. + */ + public function set_amount( $amount ) { + $this->amount = $amount; + } + + /** + * Get return URL + * + * @return string + */ + public function get_return_url() { + return $this->return_url; + } + + /** + * Set return URL + * + * @param string $url Return URL. + */ + public function set_return_url( $url ) { + $this->return_url = $url; + } + + /** + * Get return reject URL + * + * @return string + */ + public function get_return_reject_url() { + return $this->return_reject_url; + } + + /** + * Set return reject URL + * + * @param string $url Return reject URL. + */ + public function set_return_reject_url( $url ) { + $this->return_reject_url = $url; + } + + /** + * Get return error URL + * + * @return string + */ + public function get_return_error_url() { + return $this->return_error_url; + } + + /** + * Set return error URL + * + * @param string $url Return error URL. + */ + public function set_return_error_url( $url ) { + $this->return_error_url = $url; + } + + /** + * Get return cancel URL + * + * @return string + */ + public function get_return_cancel_url() { + return $this->return_cancel_url; + } + + /** + * Set return cancel URL + * + * @param string $url Return cancel URL. + */ + public function set_return_cancel_url( $url ) { + $this->return_cancel_url = $url; + } + + /** + * Get push URL + * + * @return string + */ + public function get_push_url() { + return $this->push_url; + } + + /** + * Set push URL + * + * @param string $url Push URL. + */ + public function set_push_url( $url ) { + $this->push_url = $url; + } + + /** + * Get Pronamic payment ID + * + * @return string + */ + public function get_payment_id() { + return $this->payment_id; + } + + /** + * Set Pronamic payment ID + * + * @param string $payment_id Payment ID. + */ + public function set_payment_id( $payment_id ) { + $this->payment_id = $payment_id; + } + + /** + * Get issuers + * + * @since 1.2.4 + * @link http://support.buckaroo.nl/index.php/Service_iDEAL#iDEAL_banken_lijst_opvragen + * @return array + */ + public function get_issuers() { + $issuers = array(); + + $url = add_query_arg( 'op', 'TransactionRequestSpecification', self::GATEWAY_NVP_TEST_URL ); + + $data = array( + 'brq_websitekey' => $this->get_website_key(), + 'brq_services' => 'ideal', + 'brq_latestversiononly' => 'True', + ); + + $signature = Security::create_signature( $data, $this->get_secret_key() ); + + $data[ Parameters::SIGNATURE ] = $signature; + + $result = wp_remote_post( + $url, + array( + 'body' => http_build_query( $data ), + ) + ); + + $body = wp_remote_retrieve_body( $result ); + + wp_parse_str( $body, $data ); + + $data = Util::transform_flat_response( $data ); + + $error_msg = __( 'Unable to retrieve issuers from Buckaroo.', 'pronamic_ideal' ); + + if ( 200 !== wp_remote_retrieve_response_code( $result ) ) { + throw new \Exception( $error_msg ); + } + + if ( isset( $data['BRQ_APIRESULT'] ) && 'Fail' === $data['BRQ_APIRESULT'] ) { + if ( isset( $data['BRQ_APIERRORMESSAGE'] ) ) { + $error_msg = sprintf( '%s %s', $error_msg, $data['BRQ_APIERRORMESSAGE'] ); + } + + throw new \Exception( $error_msg ); + } + + if ( ! isset( $data['BRQ_SERVICES'] ) ) { + return $issuers; + } + + foreach ( $data['BRQ_SERVICES'] as $service ) { + if ( ! isset( $service['NAME'], $service['VERSION'], $service['ACTIONDESCRIPTION'] ) ) { + return $issuers; + } + + if ( PaymentMethods::IDEAL !== $service['NAME'] ) { + continue; + } + + foreach ( $service['ACTIONDESCRIPTION'] as $action ) { + if ( ! isset( $action['NAME'], $action['REQUESTPARAMETERS'] ) ) { + return $issuers; + } + + if ( 'Pay' !== $action['NAME'] ) { + continue; + } + + foreach ( $action['REQUESTPARAMETERS'] as $parameter ) { + + if ( ! isset( $parameter['NAME'], $parameter['LISTITEMDESCRIPTION'] ) ) { + return $issuers; + } + + if ( 'issuer' !== $parameter['NAME'] ) { + continue; + } + + foreach ( $parameter['LISTITEMDESCRIPTION'] as $issuer ) { + $issuers[ $issuer['VALUE'] ] = $issuer['DESCRIPTION']; + } + + break; + } + } + } + + return $issuers; + } + + /** + * Get HTML fields + * + * @since 1.1.1 + * @return string + */ + public function get_fields() { + // Description with HTML entities such as `&` decoded into `&`, to prevent invalid signature. + $description = $this->get_description(); + + $description = html_entity_decode( $description ); + + // Data. + $data = array( + Parameters::ADD_PRONAMIC_PAYMENT_ID => $this->get_payment_id(), + Parameters::WEBSITE_KEY => $this->get_website_key(), + Parameters::INVOICE_NUMBER => $this->get_invoice_number(), + Parameters::AMOUNT => number_format( $this->get_amount(), 2, '.', '' ), + Parameters::CURRENCY => $this->get_currency(), + Parameters::CULTURE => $this->get_culture(), + Parameters::DESCRIPTION => $description, + Parameters::PAYMENT_METHOD => $this->get_payment_method(), + Parameters::RETURN_URL => $this->get_return_url(), + Parameters::RETURN_REJECT_URL => $this->get_return_reject_url(), + Parameters::RETURN_ERROR_URL => $this->get_return_error_url(), + Parameters::RETURN_CANCEL_URL => $this->get_return_cancel_url(), + Parameters::PUSH_URL => $this->get_push_url(), + Parameters::PUSH_FAILURE_URL => $this->get_push_url(), + Parameters::REQUESTED_SERVICES => implode( ',', $this->get_requested_services() ), + Parameters::EXCLUDED_SERVICES => $this->get_excluded_services(), + Parameters::IDEAL_ISSUER => $this->get_ideal_issuer(), + ); + + $signature = Security::create_signature( $data, $this->get_secret_key() ); + + $data[ Parameters::SIGNATURE ] = $signature; + + return $data; + } + + /** + * Verify request Buckaroo + */ + public function verify_request( $data ) { + $result = false; + + $signature = Security::get_signature( $data ); + + $signature_check = Security::create_signature( $data, $this->get_secret_key() ); + + if ( 0 === strcasecmp( $signature, $signature_check ) ) { + $data = array_change_key_case( $data, CASE_LOWER ); + + $result = filter_var_array( + $data, + array( + Parameters::ADD_PRONAMIC_PAYMENT_ID => FILTER_SANITIZE_STRING, + Parameters::PAYMENT => FILTER_SANITIZE_STRING, + Parameters::PAYMENT_METHOD => FILTER_SANITIZE_STRING, + Parameters::STATUS_CODE => FILTER_VALIDATE_INT, + Parameters::STATUS_CODE_DETAIL => FILTER_SANITIZE_STRING, + Parameters::STATUS_MESSAGE => FILTER_SANITIZE_STRING, + Parameters::INVOICE_NUMBER => FILTER_SANITIZE_STRING, + Parameters::AMOUNT => FILTER_VALIDATE_FLOAT, + Parameters::CURRENCY => FILTER_SANITIZE_STRING, + Parameters::TIMESTAMP => FILTER_SANITIZE_STRING, + Parameters::SERVICE_IDEAL_CONSUMER_ISSUER => FILTER_SANITIZE_STRING, + Parameters::SERVICE_IDEAL_CONSUMER_NAME => FILTER_SANITIZE_STRING, + Parameters::SERVICE_IDEAL_CONSUMER_IBAN => FILTER_SANITIZE_STRING, + Parameters::SERVICE_IDEAL_CONSUMER_BIC => FILTER_SANITIZE_STRING, + Parameters::TRANSACTIONS => FILTER_SANITIZE_STRING, + ) + ); + } + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Config.php new file mode 100644 index 00000000..e299c839 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Config.php @@ -0,0 +1,81 @@ +website_key; + } + + /** + * Get secret key. + * + * @return string|null + */ + public function get_secret_key() { + return $this->secret_key; + } + + /** + * Get excluded services. + * + * @return string|null + */ + public function get_excluded_services() { + return $this->excluded_services; + } + + /** + * Get invoice number. + * + * @return string|null + */ + public function get_invoice_number() { + return $this->invoice_number; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Gateway.php new file mode 100644 index 00000000..df4ef9a9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Gateway.php @@ -0,0 +1,253 @@ +set_method( self::METHOD_HTML_FORM ); + + $this->client = new Client(); + $this->client->set_website_key( $config->get_website_key() ); + $this->client->set_secret_key( $config->get_secret_key() ); + $this->client->set_excluded_services( $config->get_excluded_services() ); + $this->client->set_invoice_number( $config->get_invoice_number() ); + $this->client->set_push_url( add_query_arg( 'buckaroo_push', '', home_url( '/' ) ) ); + + if ( self::MODE_TEST === $config->mode ) { + $this->client->set_payment_server_url( Client::GATEWAY_TEST_URL ); + } + } + + /** + * Get issuers. + * + * @since 1.2.4 + * @see Pronamic_WP_Pay_Gateway::get_issuers() + */ + public function get_issuers() { + $groups = array(); + + try { + $result = $this->client->get_issuers(); + + $groups[] = array( + 'options' => $result, + ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'buckaroo', $e->getMessage() ); + } + + return $groups; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + Core_PaymentMethods::BANK_TRANSFER, + Core_PaymentMethods::BANCONTACT, + Core_PaymentMethods::CREDIT_CARD, + Core_PaymentMethods::GIROPAY, + Core_PaymentMethods::IDEAL, + Core_PaymentMethods::PAYPAL, + Core_PaymentMethods::SOFORT, + ); + } + + /** + * Start + * + * @param Payment $payment Payment. + * + * @see Core_Gateway::start() + */ + public function start( Payment $payment ) { + $payment->set_action_url( $this->client->get_payment_server_url() ); + } + + /** + * Get output HTML + * + * @param Payment $payment Payment. + * + * @return string + * + * @see Core_Gateway::get_output_html() + * @since 1.1.1 + * @version 2.0.4 + */ + public function get_output_fields( Payment $payment ) { + $payment_method = $payment->get_method(); + + switch ( $payment_method ) { + case Core_PaymentMethods::IDEAL: + $this->client->set_payment_method( PaymentMethods::IDEAL ); + $this->client->set_ideal_issuer( $payment->get_issuer() ); + + break; + case Core_PaymentMethods::CREDIT_CARD: + $this->client->add_requested_service( PaymentMethods::AMERICAN_EXPRESS ); + $this->client->add_requested_service( PaymentMethods::MAESTRO ); + $this->client->add_requested_service( PaymentMethods::MASTERCARD ); + $this->client->add_requested_service( PaymentMethods::VISA ); + + break; + case Core_PaymentMethods::BANK_TRANSFER: + case Core_PaymentMethods::BANCONTACT: + case Core_PaymentMethods::MISTER_CASH: + case Core_PaymentMethods::GIROPAY: + case Core_PaymentMethods::PAYPAL: + case Core_PaymentMethods::SOFORT: + $this->client->set_payment_method( PaymentMethods::transform( $payment_method ) ); + + break; + default: + if ( '0' !== $payment_method ) { + // Leap of faith if the WordPress payment method could not transform to a Buckaroo method? + $this->client->set_payment_method( $payment_method ); + } + + break; + } + + // Locale. + $locale = ''; + + if ( null !== $payment->get_customer() ) { + $locale = $payment->get_customer()->get_locale(); + } + + // Buckaroo uses 'nl-NL' instead of 'nl_NL'. + $culture = str_replace( '_', '-', $locale ); + + $this->client->set_payment_id( $payment->get_id() ); + $this->client->set_culture( $culture ); + $this->client->set_currency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() ); + $this->client->set_description( $payment->get_description() ); + $this->client->set_amount( $payment->get_total_amount()->get_value() ); + $this->client->set_invoice_number( Util::get_invoice_number( $this->client->get_invoice_number(), $payment ) ); + $this->client->set_return_url( $payment->get_return_url() ); + $this->client->set_return_cancel_url( $payment->get_return_url() ); + $this->client->set_return_error_url( $payment->get_return_url() ); + $this->client->set_return_reject_url( $payment->get_return_url() ); + + return $this->client->get_fields(); + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $method = Server::get( 'REQUEST_METHOD', FILTER_SANITIZE_STRING ); + + $data = array(); + + switch ( $method ) { + case 'GET': + // phpcs:ignore WordPress.Security.NonceVerification.Recommended + $data = $_GET; + + break; + case 'POST': + // phpcs:ignore WordPress.Security.NonceVerification.Missing + $data = $_POST; + + break; + } + + $data = Util::urldecode( $data ); + + $data = stripslashes_deep( $data ); + + $data = $this->client->verify_request( $data ); + + if ( $data ) { + $payment->set_transaction_id( $data[ Parameters::PAYMENT ] ); + $payment->set_status( Statuses::transform( $data[ Parameters::STATUS_CODE ] ) ); + + // Consumer bank details. + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_name( $data[ Parameters::SERVICE_IDEAL_CONSUMER_NAME ] ); + $consumer_bank_details->set_iban( $data[ Parameters::SERVICE_IDEAL_CONSUMER_IBAN ] ); + $consumer_bank_details->set_bic( $data[ Parameters::SERVICE_IDEAL_CONSUMER_BIC ] ); + + $labels = array( + Parameters::PAYMENT => __( 'Payment', 'pronamic_ideal' ), + Parameters::PAYMENT_METHOD => __( 'Payment Method', 'pronamic_ideal' ), + Parameters::STATUS_CODE => __( 'Status Code', 'pronamic_ideal' ), + Parameters::STATUS_CODE_DETAIL => __( 'Status Code Detail', 'pronamic_ideal' ), + Parameters::STATUS_MESSAGE => __( 'Status Message', 'pronamic_ideal' ), + Parameters::INVOICE_NUMBER => __( 'Invoice Number', 'pronamic_ideal' ), + Parameters::AMOUNT => __( 'Amount', 'pronamic_ideal' ), + Parameters::CURRENCY => __( 'Currency', 'pronamic_ideal' ), + Parameters::TIMESTAMP => __( 'Timestamp', 'pronamic_ideal' ), + Parameters::SERVICE_IDEAL_CONSUMER_ISSUER => __( 'Service iDEAL Consumer Issuer', 'pronamic_ideal' ), + Parameters::SERVICE_IDEAL_CONSUMER_NAME => __( 'Service iDEAL Consumer Name', 'pronamic_ideal' ), + Parameters::SERVICE_IDEAL_CONSUMER_IBAN => __( 'Service iDEAL Consumer IBAN', 'pronamic_ideal' ), + Parameters::SERVICE_IDEAL_CONSUMER_BIC => __( 'Service iDEAL Consumer BIC', 'pronamic_ideal' ), + Parameters::TRANSACTIONS => __( 'Transactions', 'pronamic_ideal' ), + ); + + $note = ''; + + $note .= '

    '; + $note .= __( 'Buckaroo data:', 'pronamic_ideal' ); + $note .= '

    '; + + $note .= '
    '; + + foreach ( $labels as $key => $label ) { + if ( isset( $data[ $key ] ) ) { + $note .= sprintf( '
    %s
    ', esc_html( $label ) ); + $note .= sprintf( '
    %s
    ', esc_html( $data[ $key ] ) ); + } + } + + $note .= '
    '; + + $payment->add_note( $note ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Integration.php new file mode 100644 index 00000000..7984f5b2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Integration.php @@ -0,0 +1,149 @@ + 'buckaroo', + 'name' => 'Buckaroo - HTML', + 'url' => 'https://plaza.buckaroo.nl/', + 'product_url' => \__( 'http://www.buckaroo-payments.com', 'pronamic_ideal' ), + 'dashboard_url' => 'https://plaza.buckaroo.nl/', + 'provider' => 'buckaroo', + 'supports' => array( + 'webhook', + 'webhook_log', + 'webhook_no_config', + ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-buckaroo-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + + // Actions + $function = array( __NAMESPACE__ . '\Listener', 'listen' ); + + if ( ! has_action( 'wp_loaded', $function ) ) { + add_action( 'wp_loaded', $function ); + } + } + + public function get_settings_fields() { + $fields = array(); + + // Website Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_buckaroo_website_key', + 'title' => __( 'Website Key', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => __( 'Website key as mentioned in the Buckaroo dashboard on the page "Profile » Website".', 'pronamic_ideal' ), + ); + + // Secret Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_buckaroo_secret_key', + 'title' => __( 'Secret Key', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Secret key as mentioned in the Buckaroo dashboardb on the page "Configuration » Secret Key for Digital Signature".', 'pronamic_ideal' ), + ); + + // Excluded services. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_buckaroo_excluded_services', + 'title' => __( 'Excluded services', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: brq_exludedservices */ + __( 'This controls the Buckaroo %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'brq_exludedservices' ) + ), + ); + + // Invoice number. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_buckaroo_invoice_number', + 'title' => __( 'Invoice number', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: brq_invoicenumber */ + __( 'This controls the Buckaroo %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'brq_invoicenumber' ) + ), + 'description' => sprintf( + '%s
    %s', + /* translators: %s: {order_id} {payment_id} */ + sprintf( __( 'Available tags: %s', 'pronamic_ideal' ), sprintf( '%s %s', '{order_id}', '{payment_id}' ) ), + /* translators: %s: {payment_id} */ + sprintf( __( 'Default: %s', 'pronamic_ideal' ), '{payment_id}' ) + ), + ); + + // Push URL. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Push URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + 'value' => add_query_arg( 'buckaroo_push', '', home_url( '/' ) ), + 'readonly' => true, + 'tooltip' => __( 'The Push URL as sent with each transaction to receive automatic payment status updates on.', 'pronamic_ideal' ), + ); + + return $fields; + } + + public function get_config( $post_id ) { + $config = new Config(); + + $config->website_key = get_post_meta( $post_id, '_pronamic_gateway_buckaroo_website_key', true ); + $config->secret_key = get_post_meta( $post_id, '_pronamic_gateway_buckaroo_secret_key', true ); + $config->excluded_services = get_post_meta( $post_id, '_pronamic_gateway_buckaroo_excluded_services', true ); + $config->invoice_number = get_post_meta( $post_id, '_pronamic_gateway_buckaroo_invoice_number', true ); + $config->mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Listener.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Listener.php new file mode 100644 index 00000000..b0bc33c2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Listener.php @@ -0,0 +1,84 @@ +add_note( $note ); + + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Parameters.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Parameters.php new file mode 100644 index 00000000..c7fbe4ad --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Parameters.php @@ -0,0 +1,317 @@ + self::TRANSFER, + Core_PaymentMethods::BANCONTACT => self::BANCONTACT_MISTER_CASH, + Core_PaymentMethods::MISTER_CASH => self::BANCONTACT_MISTER_CASH, + Core_PaymentMethods::GIROPAY => self::GIROPAY, + Core_PaymentMethods::IDEAL => self::IDEAL, + Core_PaymentMethods::PAYPAL => self::PAYPAL, + Core_PaymentMethods::SOFORT => self::SOFORTUEBERWEISING, + ); + + /** + * Transform WordPress payment method to Buckaroo method. + * + * @since 1.1.6 + * + * @param string $payment_method WordPress payment method to transform to Buckaroo method. + * @param mixed $default Default payment method. + * + * @return string + */ + public static function transform( $payment_method, $default = null ) { + if ( ! is_scalar( $payment_method ) ) { + return null; + } + + if ( isset( self::$map[ $payment_method ] ) ) { + return self::$map[ $payment_method ]; + } + + return $default; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Security.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Security.php new file mode 100644 index 00000000..fe35d596 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Security.php @@ -0,0 +1,110 @@ + $value ) { + if ( Util::string_equals( $key, Parameters::SIGNATURE ) ) { + $result = $value; + + break; + } + } + + return $result; + } + + /** + * Filter the data for generating an signature + * + * @param array $data + * + * @return array + */ + public static function filter_data( $data ) { + $filter = array(); + + // List all parameters prefixed with brq_, add_ or cust_, except brq_signature + foreach ( $data as $key => $value ) { + if ( ! ( Util::string_starts_with( $key, 'brq_' ) || Util::string_starts_with( $key, 'add_' ) || Util::string_starts_with( $key, 'cust_' ) ) ) { + continue; + } + + if ( Util::string_equals( $key, Parameters::SIGNATURE ) ) { + continue; + } + + $filter[ $key ] = $value; + } + + return $filter; + } + + /** + * Sort the specified data array + * + * @param array $data + * + * @return array + */ + public static function sort( $data ) { + uksort( $data, 'strcasecmp' ); + + return $data; + } + + /** + * Create signature + * + * Please note: When verifying a received signature, first url-decode all the field values. + * A signature is always calculated over the non-encoded values (i.e The value “J.+de+Tester” should be decoded to “J. de Tester”). + * + * @param array $data + * @param string $secret_key + * + * @return string + */ + public static function create_signature( $data, $secret_key ) { + $string = ''; + + // 1. List all parameters prefixed with brq_, add_ or cust_, except brq_signature + $data = self::filter_data( $data ); + + // 2. Sort these parameters alphabetically on the parameter name + $data = self::sort( $data ); + + // 3. Concatenate all the parameters + foreach ( $data as $key => $value ) { + $string .= $key . '=' . $value; + } + + // 4. Add the pre-shared secret key at the end of the string + $string .= $secret_key; + + // 5. Calculate a SHA-1 hash over this string. + $hash = hash( 'sha1', $string ); + + // Return the hash in hexadecimal format + return $hash; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Statuses.php new file mode 100644 index 00000000..d06a4285 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/buckaroo/src/Statuses.php @@ -0,0 +1,127 @@ + $payment->get_order_id(), + '{payment_id}' => $payment->get_id(), + ); + + // Find and replace + $invoice_number = str_replace( + array_keys( $replacements ), + array_values( $replacements ), + $invoice_number, + $count + ); + + // Make sure there is an dynamic part in the order ID + if ( 0 === $count ) { + $invoice_number .= $payment->get_id(); + } + + return $invoice_number; + } + + /** + * Buckaroo check if the specified string is the specified key + * + * @param string $string + * @param string $value + * + * @return boolean true if match, false otherwise + */ + public static function string_equals( $string, $value ) { + return 0 === strcasecmp( $string, $value ); + } + + /** + * Buckaroo check if the key starts with an prefix + * + * @param string $string + * @param string $prefix + * + * @return boolean true if match, false otherwise + */ + public static function string_starts_with( $string, $prefix ) { + $string = substr( $string, 0, strlen( $prefix ) ); + + return 0 === strcasecmp( $string, $prefix ); + } + + /** + * URL decode array + * + * @param array $data + * + * @return array + */ + public static function urldecode( array $data ) { + return array_map( 'urldecode', $data ); + } + + /** + * Transform flat Buckaroo response into multidimensional array. + * + * @since 1.2.4 + * + * @param array $response + * + * @return array + */ + public static function transform_flat_response( $response = array() ) { + $return = array(); + + if ( is_array( $response ) ) { + foreach ( $response as $flat_key => $value ) { + unset( $response[ $flat_key ] ); + + $is_brq = ( 'BRQ_' === substr( $flat_key, 0, 4 ) ); + + // Remove 'BRQ_' from flat key (first part key will be prefixed with 'BRQ_') + if ( $is_brq ) { + $flat_key = substr_replace( $flat_key, '', 0, 4 ); + } + + $parts = explode( '_', $flat_key ); + + // Prefix first key with BRQ_ + if ( $is_brq && count( $parts ) > 0 ) { + $parts[0] = sprintf( 'BRQ_%s', $parts[0] ); + } + + $item =& $return; + + // Define key parts as array and set current item + foreach ( $parts as $key ) { + if ( ! isset( $item[ $key ] ) ) { + $item[ $key ] = array(); + } + + $item =& $item[ $key ]; + } + + // Set value of item + $item = $value; + } + } + + return $return; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Client.php new file mode 100644 index 00000000..f0157118 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Client.php @@ -0,0 +1,477 @@ +action_url; + } + + /** + * Set the action URL + * + * @param string $url Action URL. + */ + public function set_action_url( $url ) { + $this->action_url = $url; + } + + /** + * Get the currency numeric code + * + * @return string currency numeric code + */ + public function get_currency_numeric_code() { + return $this->currency_numeric_code; + } + + /** + * Set the currency code + * + * @param string $code Currency numeric code. + */ + public function set_currency_numeric_code( $code ) { + $this->currency_numeric_code = $code; + } + + /** + * Get storename + * + * @return string + */ + public function get_storename() { + return $this->storename; + } + + /** + * Set the storename + * + * @param string $storename Storename. + */ + public function set_storename( $storename ) { + $this->storename = $storename; + } + + /** + * Get normal return URL + * + * @return string + */ + public function get_return_url() { + return $this->return_url; + } + + /** + * Set the normal return URL + * + * LET OP! De URL mag geen parameters bevatten. + * + * @param string $return_url Return URL. + */ + public function set_return_url( $return_url ) { + $this->return_url = $return_url; + } + + /** + * Get amount + * + * @return float + */ + public function get_amount() { + return $this->amount; + } + + /** + * Set amount + * + * @param float $amount Amount. + */ + public function set_amount( $amount ) { + $this->amount = $amount; + } + + /** + * Get notification URL + * + * @return string + */ + public function get_notification_url() { + return $this->notification_url; + } + + /** + * Set notification URL + * + * @param string $notification_url Notification URL. + */ + public function set_notification_url( $notification_url ) { + $this->notification_url = $notification_url; + } + + /** + * Get language. + * + * @return string + */ + public function get_language() { + return $this->language; + } + + /** + * Set language. + * + * @param string $language Language. + */ + public function set_language( $language ) { + $this->language = $language; + } + + /** + * Set the payment method. + * + * @param string $payment_method Payment method. + */ + public function set_payment_method( $payment_method ) { + $this->payment_method = $payment_method; + } + + /** + * Get the payment method. + * + * @return string ANS128 listString comma separated list + */ + public function get_payment_method() { + return $this->payment_method; + } + + /** + * Get order ID + * + * @return string + */ + public function get_order_id() { + return $this->order_id; + } + + /** + * Set order ID + * + * @param string $order_id Order ID. + */ + public function set_order_id( $order_id ) { + $this->order_id = $order_id; + } + + /** + * Get payment ID + * + * @return int + */ + public function get_payment_id() { + return $this->payment_id; + } + + /** + * Set payment ID + * + * @param int $payment_id Payment ID. + */ + public function set_payment_id( $payment_id ) { + $this->payment_id = $payment_id; + } + + /** + * Get the transaction datetime. + * + * @param boolean $create_new Indicator for creating a new expire date. + * + * @return DateTime + */ + public function get_transaction_datetime( $create_new = false ) { + if ( null === $this->transaction_datetime || $create_new ) { + $this->transaction_datetime = new DateTime( null, new DateTimeZone( 'UTC' ) ); + } + + return $this->transaction_datetime; + } + + /** + * Set transaction datetime. + * + * @param DateTime $datetime Transaction date time. + */ + public function set_transaction_datetime( DateTime $datetime ) { + $this->transaction_datetime = $datetime; + } + + /** + * Get data + * + * @return array + */ + public function get_data() { + // Required fields for payment request. + $required_fields = array( + 'txntype' => 'sale', + // According the EMS documentation the timezone should be in `Area/Location` notation, but it seems like `UTC` is also working. + 'timezone' => 'UTC', + // In WordPress, PHP's `time()` will always return `UTC` and is the same as calling `current_time( 'timestamp', true )`. + 'txndatetime' => $this->get_transaction_datetime()->format( 'Y:m:d-H:i:s' ), + 'hash_algorithm' => 'SHA256', + 'storename' => $this->get_storename(), + 'mode' => 'payonly', + 'chargetotal' => number_format( ( $this->get_amount() / 100 ), 2, '.', '' ), + 'currency' => $this->get_currency_numeric_code(), + ); + + // Optional fields for payment request. + $optional_fields = array( + 'oid' => $this->get_order_id(), + 'language' => $this->get_language(), + 'paymentMethod' => $this->get_payment_method(), + 'responseFailURL' => $this->get_return_url(), + 'responseSuccessURL' => $this->get_return_url(), + 'transactionNotificationURL' => $this->get_notification_url(), + 'idealIssuerID' => $this->get_issuer_id(), + 'ems_notify_payment_id' => $this->get_payment_id(), + ); + + // @link http://briancray.com/2009/04/25/remove-null-values-php-arrays/ + $optional_fields = array_filter( $optional_fields ); + + // Data. + $data = $required_fields + $optional_fields; + + return $data; + } + + /** + * Get shared secret + * + * @return string + */ + public function get_secret() { + return $this->secret; + } + + /** + * Set shared secret. + * + * @param string $secret Secret. + * + * @return void + */ + public function set_secret( $secret ) { + $this->secret = $secret; + } + + /** + * Get hash + * + * @return string + */ + public function get_hash() { + $data = $this->get_data(); + $secret = $this->get_secret(); + + $values = array( + $data['storename'], + $data['txndatetime'], + $data['chargetotal'], + $data['currency'], + $secret, + ); + + return self::compute_hash( $values ); + } + + /** + * Compute hash + * + * @param array $values Values to compute hash for. + * + * @return string + */ + public static function compute_hash( $values ) { + $value = implode( '', $values ); + $value = bin2hex( $value ); + + return hash( self::HASH_ALGORITHM_SHA256, $value ); + } + + /** + * Get fields + * + * @since 1.0.0 + * @return array + */ + public function get_fields() { + $fields = $this->get_data(); + + $fields['hash'] = $this->get_hash(); + + return $fields; + } + + /** + * Set issuer ID. + * + * @param string $issuer_id Issuer ID. + */ + public function set_issuer_id( $issuer_id ) { + $this->issuer_id = $issuer_id; + } + + /** + * Get issuer ID. + * + * @return string + */ + public function get_issuer_id() { + return $this->issuer_id; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Config.php new file mode 100644 index 00000000..d5702f88 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Config.php @@ -0,0 +1,23 @@ +set_method( self::METHOD_HTML_FORM ); + + // Client. + $this->client = new Client(); + + $action_url = Client::ACTION_URL_PRODUCTION; + + if ( self::MODE_TEST === $config->mode ) { + $action_url = Client::ACTION_URL_TEST; + } + + $this->client->set_action_url( $action_url ); + $this->client->set_storename( $config->storename ); + $this->client->set_secret( $config->secret ); + } + + /** + * Get supported payment methods. + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + Core_PaymentMethods::BANCONTACT, + Core_PaymentMethods::IDEAL, + Core_PaymentMethods::PAYPAL, + Core_PaymentMethods::SOFORT, + ); + } + + /** + * Start + * + * @see Pronamic_WP_Pay_Gateway::start() + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + $payment->set_action_url( $this->client->get_action_url() ); + } + + /** + * Get the output HTML + * + * @param Payment $payment Payment. + * + * @return array + * + * @see Core_Gateway::get_output_html() + * @since 1.0.0 + * @version 2.0.4 + */ + public function get_output_fields( Payment $payment ) { + $this->client->set_payment_id( $payment->get_id() ); + $this->client->set_currency_numeric_code( $payment->get_total_amount()->get_currency()->get_numeric_code() ); + $this->client->set_order_id( $payment->format_string( $this->config->order_id ) ); + $this->client->set_return_url( home_url( '/' ) ); + $this->client->set_notification_url( home_url( '/' ) ); + $this->client->set_amount( $payment->get_total_amount()->get_minor_units() ); + $this->client->set_issuer_id( $payment->get_issuer() ); + + // Language. + if ( null !== $payment->get_customer() ) { + $this->client->set_language( $payment->get_customer()->get_locale() ); + } + + // Payment method. + $payment_method = PaymentMethods::transform( $payment->get_method() ); + + if ( null === $payment_method && '' !== $payment->get_method() ) { + // Leap of faith if the WordPress payment method could not transform to a EMS method? + $payment_method = $payment->get_method(); + } + + $this->client->set_payment_method( $payment_method ); + + return $this->client->get_fields(); + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $approval_code = filter_input( INPUT_POST, 'approval_code', FILTER_SANITIZE_STRING ); + + $input_hash = filter_input( INPUT_POST, 'response_hash' ); + + $hash_values = array( + $this->client->get_secret(), + $approval_code, + filter_input( INPUT_POST, 'chargetotal', FILTER_SANITIZE_STRING ), + filter_input( INPUT_POST, 'currency', FILTER_SANITIZE_STRING ), + filter_input( INPUT_POST, 'txndatetime', FILTER_SANITIZE_STRING ), + $this->client->get_storename(), + ); + + if ( filter_has_var( INPUT_POST, 'notification_hash' ) ) { + $input_hash = filter_input( INPUT_POST, 'notification_hash' ); + + $hash_values = array( + filter_input( INPUT_POST, 'chargetotal', FILTER_SANITIZE_STRING ), + $this->client->get_secret(), + filter_input( INPUT_POST, 'currency', FILTER_SANITIZE_STRING ), + filter_input( INPUT_POST, 'txndatetime', FILTER_SANITIZE_STRING ), + $this->client->get_storename(), + $approval_code, + ); + } + + $hash = Client::compute_hash( $hash_values ); + + // Check if the posted hash is equal to the calculated response or notification hash. + if ( 0 === strcasecmp( $input_hash, $hash ) ) { + $response_code = substr( $approval_code, 0, 1 ); + + switch ( $response_code ) { + case 'Y': + $status = PaymentStatus::SUCCESS; + + break; + case 'N': + $status = PaymentStatus::FAILURE; + + $fail_code = filter_input( INPUT_POST, 'fail_rc', FILTER_SANITIZE_NUMBER_INT ); + + if ( '5993' === $fail_code ) { + $status = PaymentStatus::CANCELLED; + } + + break; + + default: + $status = PaymentStatus::OPEN; + + break; + } + + // Set the status of the payment. + $payment->set_status( $status ); + + $labels = array( + 'approval_code' => __( 'Approval code', 'pronamic_ideal' ), + 'oid' => __( 'Order ID', 'pronamic_ideal' ), + 'refnumber' => _x( 'Reference number', 'creditcard', 'pronamic_ideal' ), + 'status' => __( 'Status', 'pronamic_ideal' ), + 'txndate_processed' => __( 'Time of transaction processing', 'pronamic_ideal' ), + 'tdate' => __( 'Identification for transaction', 'pronamic_ideal' ), + 'fail_reason' => __( 'Fail reason', 'pronamic_ideal' ), + 'response_hash' => __( 'Response hash', 'pronamic_ideal' ), + 'processor_response_code' => __( 'Processor response code', 'pronamic_ideal' ), + 'fail_rc' => __( 'Fail code', 'pronamic_ideal' ), + 'terminal_id' => __( 'Terminal ID', 'pronamic_ideal' ), + 'ccbin' => __( 'Creditcard issuing bank', 'pronamic_ideal' ), + 'cccountry' => __( 'Creditcard country', 'pronamic_ideal' ), + 'ccbrand' => __( 'Creditcard brand', 'pronamic_ideal' ), + ); + + $note = ''; + + $note .= '

    '; + $note .= __( 'EMS e-Commerce transaction data in response message:', 'pronamic_ideal' ); + $note .= '

    '; + + $note .= '
    '; + + foreach ( $labels as $key => $label ) { + if ( filter_has_var( INPUT_POST, $key ) ) { + $note .= sprintf( '
    %s
    ', esc_html( $label ) ); + $note .= sprintf( '
    %s
    ', esc_html( filter_input( INPUT_POST, $key, FILTER_SANITIZE_STRING ) ) ); + } + } + + $note .= '
    '; + + $payment->add_note( $note ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php new file mode 100644 index 00000000..0b5d1162 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Integration.php @@ -0,0 +1,149 @@ + 'ems-ecommerce', + 'name' => 'EMS e-Commerce', + 'provider' => 'ems', + 'product_url' => null, + 'dashboard_url' => array( + \__( 'test', 'pronamic_ideal' ) => 'https://test.ipg-online.com/vt/login', + \__( 'live', 'pronamic_ideal' ) => 'https://www.ipg-online.com/vt/login', + ), + 'supports' => array( + 'webhook', + 'webhook_log', + 'webhook_no_config', + ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-ems-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + + // Actions + $function = array( __NAMESPACE__ . '\Listener', 'listen' ); + + if ( ! has_action( 'wp_loaded', $function ) ) { + add_action( 'wp_loaded', $function ); + } + } + + public function get_settings_fields() { + $fields = array(); + + // Storename. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_UNSAFE_RAW, + 'meta_key' => '_pronamic_gateway_ems_ecommerce_storename', + 'title' => _x( 'Storename', 'ems', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + ); + + // Shared secret. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_UNSAFE_RAW, + 'meta_key' => '_pronamic_gateway_ems_ecommerce_secret', + 'title' => _x( 'Shared Secret', 'ems', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + ); + + // Purchase ID. + $fields[] = array( + 'section' => 'advanced', + 'filter' => array( + 'filter' => FILTER_SANITIZE_STRING, + 'flags' => FILTER_FLAG_NO_ENCODE_QUOTES, + ), + 'meta_key' => '_pronamic_gateway_ems_ecommerce_order_id', + 'title' => __( 'Order ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: {orderId} */ + __( 'The EMS e-Commerce %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'orderId' ) + ), + 'description' => sprintf( + '%s %s
    %s', + __( 'Available tags:', 'pronamic_ideal' ), + sprintf( + '%s %s', + '{order_id}', + '{payment_id}' + ), + sprintf( + /* translators: %s: {payment_id} */ + __( 'Default: %s', 'pronamic_ideal' ), + '{payment_id}' + ) + ), + ); + + // Notification URL. + $fields[] = array( + 'section' => 'feedback', + /* translators: Translate 'notification' the same as in the EMS e-Commerce dashboard. */ + 'title' => _x( 'Notification URL', 'EMS e-Commerce', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + 'value' => home_url( '/' ), + 'readonly' => true, + /* translators: Translate 'notification' the same as in the EMS e-Commerce dashboard. */ + 'tooltip' => _x( + 'The Notification URL as sent with each transaction to receive automatic payment status updates on.', + 'EMS e-Commerce', + 'pronamic_ideal' + ), + ); + + return $fields; + } + + public function get_config( $post_id ) { + $config = new Config(); + + $config->storename = get_post_meta( $post_id, '_pronamic_gateway_ems_ecommerce_storename', true ); + $config->secret = get_post_meta( $post_id, '_pronamic_gateway_ems_ecommerce_secret', true ); + $config->mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + $config->order_id = get_post_meta( $post_id, '_pronamic_gateway_ems_ecommerce_order_id', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php new file mode 100644 index 00000000..94cbc423 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/Listener.php @@ -0,0 +1,46 @@ +add_note( $note ); + + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/PaymentMethods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/PaymentMethods.php new file mode 100644 index 00000000..1255e97b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ems-e-commerce/src/PaymentMethods.php @@ -0,0 +1,101 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Icepay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Icepay; + +use Pronamic\WordPress\Pay\Payments\PaymentLineType; + +/** + * Product categories. + * + * @author Reüel van der Steege + * @version 2.0.5 + * @since 2.0.5 + */ +class DirectebankIssuers { + /** + * Issuer 'RETAIL'. + * + * @var string + */ + const RETAIL = 'RETAIL'; + + /** + * Issuer 'DIGITAL'. + * + * @var string + */ + const DIGITAL = 'DIGITAL'; + + /** + * Issuer 'ADULT'. + * + * @var string + */ + const ADULT = 'ADULT'; + + /** + * Transform Pronamic payment line type to Icepay Directebank issuer. + * + * @param string $type Pronamic payment line type. + * + * @return string + */ + public static function transform( $type ) { + switch ( $type ) { + case PaymentLineType::PHYSICAL: + return self::RETAIL; + + case PaymentLineType::DIGITAL: + case PaymentLineType::DISCOUNT: + case PaymentLineType::SHIPPING: + default: + return self::DIGITAL; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Gateway.php new file mode 100644 index 00000000..6dc091a1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Gateway.php @@ -0,0 +1,351 @@ +set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array(); + } + + /** + * Filter iDEAL + * + * @param array $method Payment method. + * + * @return bool + */ + private function filter_ideal( $method ) { + return is_array( $method ) && isset( $method['PaymentMethodCode'] ) && 'IDEAL' === $method['PaymentMethodCode']; + } + + /** + * Get issuers + * + * @see Pronamic_WP_Pay_Gateway::get_issuers() + */ + public function get_issuers() { + $groups = array(); + $issuers = array(); + + try { + $methods = Icepay_Api_Webservice::getInstance() + ->paymentmethodService() + ->setMerchantID( $this->config->merchant_id ) + ->setSecretCode( $this->config->secret_code ) + ->retrieveAllPaymentmethods() + ->asArray(); + } catch ( Exception $e ) { + return $groups; + } + + $ideal_methods = array_filter( $methods, array( $this, 'filter_ideal' ) ); + + if ( ! empty( $ideal_methods ) ) { + $issuers = Icepay_Api_Webservice::getInstance()->singleMethod() + ->loadFromArray( $methods ) + ->selectPaymentMethodByCode( 'IDEAL' ) + ->getIssuers(); + } + + if ( $issuers ) { + $options = array(); + + foreach ( $issuers as $issuer ) { + $options[ $issuer['IssuerKeyword'] ] = $issuer['Description']; + } + + $groups[] = array( + 'options' => $options, + ); + } + + return $groups; + } + + /** + * Get issuers + * + * @see Pronamic_WP_Pay_Gateway::get_issuers() + */ + public function get_credit_card_issuers() { + $groups = array(); + $issuers = array(); + + $method = new Icepay_Paymentmethod_Creditcard(); + + if ( isset( $method->_issuer ) ) { + $issuers = $method->_issuer; + } + + if ( $issuers ) { + $options = array(); + + foreach ( $issuers as $issuer ) { + switch ( $issuer ) { + case 'AMEX': + $name = _x( 'AMEX', 'Payment method name', 'pronamic_ideal' ); + + break; + case 'MASTER': + $name = _x( 'MASTER', 'Payment method name', 'pronamic_ideal' ); + + break; + case 'VISA': + $name = _x( 'VISA', 'Payment method name', 'pronamic_ideal' ); + + break; + default: + $name = $issuer; + + break; + } + + $options[ $issuer ] = $name; + } + + $groups[] = array( + 'options' => $options, + ); + } + + return $groups; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::IDEAL, + PaymentMethods::CREDIT_CARD, + PaymentMethods::DIRECT_DEBIT, + PaymentMethods::BANCONTACT, + PaymentMethods::SOFORT, + ); + } + + /** + * Start an transaction + * + * @see Core_Gateway::start() + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + try { + /* + * Order ID + * Your unique order number. + * This can be auto incremental number from your payments table + * + * Data type = String + * Max length = 10 + * Required = Yes + */ + + // Locale, country and language. + $locale = get_locale(); + $language = substr( $locale, 0, 2 ); + + if ( null !== $payment->get_customer() ) { + $locale = $payment->get_customer()->get_locale(); + + $language = strtoupper( $payment->get_customer()->get_language() ); + } + + $country = strtoupper( substr( $locale, 3, 2 ) ); + + // Set country from billing address. + if ( null !== $payment->get_billing_address() ) { + $country_code = $payment->get_billing_address()->get_country_code(); + + if ( ! empty( $country_code ) ) { + $country = $country_code; + } + } + + // Payment object. + $payment_object = new Icepay_PaymentObject(); + $payment_object + ->setAmount( $payment->get_total_amount()->get_minor_units() ) + ->setCountry( $country ) + ->setLanguage( $language ) + ->setReference( $payment->get_order_id() ) + ->setDescription( $payment->get_description() ) + ->setCurrency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() ) + ->setIssuer( $payment->get_issuer() ) + ->setOrderID( $payment->format_string( $this->config->order_id ) ); + + /* + * Payment method + * @since 1.2.0 + */ + $icepay_method = null; + + switch ( $payment->get_method() ) { + case PaymentMethods::CREDIT_CARD: + // @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/creditcard.php + $icepay_method = new Icepay_Paymentmethod_Creditcard(); + + break; + case PaymentMethods::DIRECT_DEBIT: + // @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/ddebit.php + $icepay_method = new Icepay_Paymentmethod_Ddebit(); + + break; + case PaymentMethods::IDEAL: + // @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/ideal.php + $icepay_method = new Icepay_Paymentmethod_Ideal(); + + break; + case PaymentMethods::BANCONTACT: + case PaymentMethods::MISTER_CASH: + // @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/mistercash.php + $icepay_method = new Icepay_Paymentmethod_Mistercash(); + + break; + case PaymentMethods::SOFORT: + // @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/directebank.php + $icepay_method = new Icepay_Paymentmethod_Directebank(); + + // Set issuer. + $issuer = 'DIGITAL'; + + $lines = $payment->get_lines(); + + if ( null !== $lines ) { + foreach ( $lines as $line ) { + $issuer = DirectebankIssuers::transform( $line->get_type() ); + + break; + } + } + + $payment_object->setIssuer( $issuer ); + } + + if ( isset( $icepay_method ) ) { + // @link https://github.com/icepay/icepay/blob/2.4.0/api/icepay_api_base.php#L342-L353 + $payment_object->setPaymentMethod( $icepay_method->getCode() ); + + // Force language 'NL' for unsupported languages (i.e. 'EN' for iDEAL). + if ( ! in_array( $language, $icepay_method->getSupportedLanguages(), true ) ) { + $payment_object->setLanguage( 'NL' ); + } + } + + // Protocol. + $protocol = is_ssl() ? 'https' : 'http'; + + // Basic mode. + $basicmode = Icepay_Basicmode::getInstance(); + $basicmode + ->setMerchantID( $this->config->merchant_id ) + ->setSecretCode( $this->config->secret_code ) + ->setProtocol( $protocol ) + ->setSuccessURL( $payment->get_return_url() ) + ->setErrorURL( $payment->get_return_url() ) + ->validatePayment( $payment_object ); + + // Action URL. + $payment->set_action_url( $basicmode->getURL() ); + } catch ( Exception $exception ) { + $this->error = new WP_Error( 'icepay_error', $exception->getMessage(), $exception ); + } + } + + /** + * Update the status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + // Get the Icepay Result and set the required fields. + $result = ( 'POST' === Server::get( 'REQUEST_METHOD' ) ? new Icepay_Postback() : new Icepay_Result() ); + + try { + $result + ->setMerchantID( $this->config->merchant_id ) + ->setSecretCode( $this->config->secret_code ); + + // Determine if the result can be validated. + if ( $result->validate() ) { + // What was the status response. + switch ( $result->getStatus() ) { + case Icepay_StatusCode::SUCCESS: + $payment->set_status( PaymentStatus::SUCCESS ); + + break; + case Icepay_StatusCode::OPEN: + $payment->set_status( PaymentStatus::OPEN ); + + break; + case Icepay_StatusCode::ERROR: + $status = PaymentStatus::FAILURE; + + $data = null; + + // Check if payment is cancelled. + if ( $result instanceof \Icepay_Postback ) { + $data = $result->getPostback(); + } else { + $data = $result->getResultData(); + } + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + if ( \is_object( $data ) && isset( $data->statusCode ) && 'Cancelled' === $data->statusCode ) { + $status = PaymentStatus::CANCELLED; + } + + $payment->set_status( $status ); + + break; + } + } + } catch ( Exception $exception ) { + $this->error = new WP_Error( 'icepay_error', $exception->getMessage(), $exception ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Integration.php new file mode 100644 index 00000000..037a6f22 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Integration.php @@ -0,0 +1,159 @@ + 'icepay-ideal', + 'name' => 'ICEPAY', + 'url' => 'https://icepay.com/', + 'product_url' => \__( 'https://icepay.com/nl/en/pricing-and-accounts/', 'pronamic_ideal' ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-icepay-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + 'dashboard_url' => 'https://portal.icepay.com/', + 'provider' => 'icepay', + 'supports' => array( + 'webhook', + 'webhook_log', + ), + ) + ); + + parent::__construct( $args ); + + // Actions + $function = array( __NAMESPACE__ . '\Listener', 'listen' ); + + if ( ! has_action( 'wp_loaded', $function ) ) { + add_action( 'wp_loaded', $function ); + } + } + + public function get_settings_fields() { + $fields = array(); + + // Merchant ID + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_icepay_merchant_id', + 'title' => _x( 'Merchant ID', 'icepay', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => __( 'Merchant ID as mentioned in the ICEPAY dashboard at the "My websites" page.', 'pronamic_ideal' ), + ); + + // Secret Code + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_icepay_secret_code', + 'title' => _x( 'Secret Code', 'icepay', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Secret Code as mentioned in the ICEPAY dashboard at the "My websites" page.', 'pronamic_ideal' ), + ); + + // Purchase ID + $fields[] = array( + 'section' => 'advanced', + 'filter' => array( + 'filter' => FILTER_SANITIZE_STRING, + 'flags' => FILTER_FLAG_NO_ENCODE_QUOTES, + ), + 'meta_key' => '_pronamic_gateway_icepay_order_id', + 'title' => __( 'Order ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: OrderID */ + __( 'The Icepay %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'OrderID' ) + ), + 'description' => sprintf( + '%s %s
    %s', + __( 'Available tags:', 'pronamic_ideal' ), + sprintf( + '%s %s', + '{order_id}', + '{payment_id}' + ), + sprintf( + /* translators: %s: {payment_id} */ + __( 'Default: %s', 'pronamic_ideal' ), + '{payment_id}' + ) + ), + ); + + // Thank you page URL + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Thank you page URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'value' => home_url( '/' ), + 'readonly' => true, + ); + + // Error page URL + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Error page URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'value' => home_url( '/' ), + 'readonly' => true, + ); + + // Postback URL + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Postback URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'value' => home_url( '/' ), + 'readonly' => true, + ); + + return $fields; + } + + public function get_config( $post_id ) { + $config = new Config(); + + $config->merchant_id = get_post_meta( $post_id, '_pronamic_gateway_icepay_merchant_id', true ); + $config->secret_code = get_post_meta( $post_id, '_pronamic_gateway_icepay_secret_code', true ); + $config->order_id = get_post_meta( $post_id, '_pronamic_gateway_icepay_order_id', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Listener.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Listener.php new file mode 100644 index 00000000..d62fabf0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/icepay/src/Listener.php @@ -0,0 +1,60 @@ +add_note( $note ); + + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php new file mode 100644 index 00000000..36fef232 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Client.php @@ -0,0 +1,374 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +use DOMDocument; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\AcquirerErrorResMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\AcquirerStatusReqMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\AcquirerStatusResMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\DirectoryRequestMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\DirectoryResponseMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\Message; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\RequestMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\TransactionRequestMessage; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\TransactionResponseMessage; +use SimpleXMLElement; +use WP_Error; +use XMLSecurityDSig; +use XMLSecurityKey; + +/** + * Title: iDEAL client + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.5 + * @since 1.0.0 + */ +class Client { + /** + * Acquirer URL + * + * @var string + */ + public $acquirer_url; + + /** + * Directory request URL + * + * @var string + */ + public $directory_request_url; + + /** + * Transaction request URL + * + * @var string + */ + public $transaction_request_url; + + /** + * Status request URL + * + * @var string + */ + public $status_request_url; + + /** + * Merchant ID + * + * @var string + */ + public $merchant_id; + + /** + * Sub ID + * + * @var string + */ + public $sub_id; + + /** + * Private certificate + * + * @var string + */ + public $private_certificate; + + /** + * Private key + * + * @var string + */ + public $private_key; + + /** + * Private key password + * + * @var string + */ + public $private_key_password; + + /** + * Set the acquirer URL + * + * @param string $url URL. + * @return void + */ + public function set_acquirer_url( $url ) { + $this->acquirer_url = $url; + + $this->directory_request_url = $url; + $this->transaction_request_url = $url; + $this->status_request_url = $url; + } + + /** + * Send an specific request message to an specific URL + * + * @param string $url URL. + * @param RequestMessage $message Message. + * @return DirectoryResponseMessage|TransactionResponseMessage|AcquirerStatusResMessage + * @throws \Exception Throws exception on error with private key when signing document. + */ + private function send_message( $url, RequestMessage $message ) { + // Sign. + $document = $message->get_document(); + $document = $this->sign_document( $document ); + + // Stringify. + $data = $document->saveXML(); + + /* + * Fix for a incorrect implementation at https://www.ideal-checkout.nl/simulator/. + * + * @since 1.1.11 + */ + if ( 'https://www.ideal-checkout.nl/simulator/' === $url ) { + $data = $document->C14N( true, false ); + } + + // Remote post. + $response = wp_remote_post( + $url, + array( + 'method' => 'POST', + 'headers' => array( + 'Content-Type' => 'text/xml; charset=' . Message::XML_ENCODING, + ), + 'body' => $data, + ) + ); + + // Handle response. + if ( $response instanceof WP_Error ) { + throw new \Exception( $response->get_error_message() ); + } + + if ( 200 !== wp_remote_retrieve_response_code( $response ) ) { + throw new \Exception( + sprintf( + /* translators: %s: response code */ + __( 'The response code (%s) from the iDEAL provider was incorrect.', 'pronamic_ideal' ), + wp_remote_retrieve_response_code( $response ) + ) + ); + } + + $body = wp_remote_retrieve_body( $response ); + + try { + $xml = Core_Util::simplexml_load_string( $body ); + } catch ( \InvalidArgumentException $e ) { + throw new \Exception( $e->getMessage() ); + } + + $result = $this->parse_document( $xml ); + + return $result; + } + + /** + * Parse the specified document and return parsed result + * + * @param SimpleXMLElement $document Document. + * @return DirectoryResponseMessage|TransactionResponseMessage|AcquirerStatusResMessage + * @throws \Exception Throws exception if response XML document can not be parsed. + */ + private function parse_document( SimpleXMLElement $document ) { + $name = $document->getName(); + + switch ( $name ) { + case AcquirerErrorResMessage::NAME: + $message = AcquirerErrorResMessage::parse( $document ); + + throw new \Exception( + sprintf( '%s. %s', $message->error->get_message(), $message->error->get_detail() ) + ); + case DirectoryResponseMessage::NAME: + return DirectoryResponseMessage::parse( $document ); + case TransactionResponseMessage::NAME: + return TransactionResponseMessage::parse( $document ); + case AcquirerStatusResMessage::NAME: + return AcquirerStatusResMessage::parse( $document ); + default: + throw new \Exception( + /* translators: %s: XML document element name */ + sprintf( __( 'Unknwon iDEAL message (%s)', 'pronamic_ideal' ), $name ) + ); + } + } + + /** + * Get directory of issuers + * + * @return null|Directory + */ + public function get_directory() { + $directory = null; + + $request_dir_message = new DirectoryRequestMessage(); + + $merchant = $request_dir_message->get_merchant(); + $merchant->set_id( $this->merchant_id ); + $merchant->set_sub_id( $this->sub_id ); + + $response_dir_message = $this->send_message( $this->directory_request_url, $request_dir_message ); + + if ( $response_dir_message instanceof DirectoryResponseMessage ) { + $directory = $response_dir_message->get_directory(); + } + + return $directory; + } + + /** + * Create transaction + * + * @param Transaction $transaction Transaction. + * @param string $return_url Return URL. + * @param string $issuer_id Issuer ID. + * @return TransactionResponseMessage + * @throws \Exception Throws exception on unexpected transaction request response. + */ + public function create_transaction( Transaction $transaction, $return_url, $issuer_id ) { + $message = new TransactionRequestMessage(); + + $merchant = $message->get_merchant(); + $merchant->set_id( $this->merchant_id ); + $merchant->set_sub_id( $this->sub_id ); + $merchant->set_return_url( $return_url ); + + $message->issuer = new Issuer(); + $message->issuer->set_id( $issuer_id ); + + $message->transaction = $transaction; + + $result = $this->send_message( $this->transaction_request_url, $message ); + + if ( ! ( $result instanceof TransactionResponseMessage ) ) { + throw new \Exception( 'Unexpected response for transaction request.' ); + } + + return $result; + } + + /** + * Get the status of the specified transaction ID + * + * @param string $transaction_id Transaction ID. + * @return TransactionResponseMessage + * @throws \Exception Throws exception on unexpected acquirer status response. + */ + public function get_status( $transaction_id ) { + $message = new AcquirerStatusReqMessage(); + + $merchant = $message->get_merchant(); + $merchant->set_id( $this->merchant_id ); + $merchant->set_sub_id( $this->sub_id ); + + $message->transaction = new Transaction(); + $message->transaction->set_id( $transaction_id ); + + $result = $this->send_message( $this->status_request_url, $message ); + + if ( ! ( $result instanceof AcquirerStatusResMessage ) ) { + throw new \Exception( 'Unexpected response for acquirer status request.' ); + } + + return $result; + } + + /** + * Sign the specified DOMDocument + * + * @link https://github.com/Maks3w/xmlseclibs/blob/v1.3.0/tests/xml-sign.phpt + * + * @param DOMDocument $document Document. + * @return DOMDocument + * @throws \Exception Can not load private key. + */ + private function sign_document( DOMDocument $document ) { + $dsig = new XMLSecurityDSig(); + + /* + * For canonicalization purposes the exclusive (9) algorithm must be used. + * + * @link http://pronamic.nl/wp-content/uploads/2012/12/iDEAL-Merchant-Integration-Guide-ENG-v3.3.1.pdf #page 30 + */ + $dsig->setCanonicalMethod( XMLSecurityDSig::EXC_C14N ); + + /* + * For hashing purposes the SHA-256 (11) algorithm must be used. + * + * @link http://pronamic.nl/wp-content/uploads/2012/12/iDEAL-Merchant-Integration-Guide-ENG-v3.3.1.pdf #page 30 + */ + $dsig->addReference( + $document, + XMLSecurityDSig::SHA256, + array( 'http://www.w3.org/2000/09/xmldsig#enveloped-signature' ), + array( + 'force_uri' => true, + ) + ); + + /* + * For signature purposes the RSAWithSHA 256 (12) algorithm must be used. + * + * @link http://pronamic.nl/wp-content/uploads/2012/12/iDEAL-Merchant-Integration-Guide-ENG-v3.3.1.pdf #page 31 + */ + $key = new XMLSecurityKey( + XMLSecurityKey::RSA_SHA256, + array( + 'type' => 'private', + ) + ); + + $key->passphrase = $this->private_key_password; + + $key->loadKey( $this->private_key ); + + /* + * Test if we can get an private key object, to prevent the following error: + * Warning: openssl_sign() [function.openssl-sign]: supplied key param cannot be coerced into a private key. + */ + $private_key = openssl_get_privatekey( $this->private_key, $this->private_key_password ); + + if ( false === $private_key ) { + throw new \Exception( 'Can not load private key' ); + } + + // Sign. + $dsig->sign( $key ); + + /* + * The public key must be referenced using a fingerprint of an X.509 certificate. The + * fingerprint must be calculated according to the following formula HEX(SHA-1(DER certificate)) (13). + * + * @link http://pronamic.nl/wp-content/uploads/2012/12/iDEAL-Merchant-Integration-Guide-ENG-v3.3.1.pdf #page 31 + */ + $fingerprint = Security::get_sha_fingerprint( $this->private_certificate ); + + if ( null === $fingerprint ) { + throw new \Exception( 'Unable to calculate fingerprint of private certificate.' ); + } + + $dsig->addKeyInfoAndName( $fingerprint ); + + // Add the signature. + $dsig->appendSignature( $document->documentElement ); + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Config.php new file mode 100644 index 00000000..ab03bb85 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Config.php @@ -0,0 +1,207 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Title: iDEAL Advanced config + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class Config extends GatewayConfig { + /** + * Merchant ID. + * + * @var string|null + */ + public $merchant_id; + + /** + * Sub ID. + * + * @var int|string|null + */ + public $sub_id = 0; + + /** + * Payment server URL. + * + * @var string|null + */ + public $payment_server_url; + + /** + * Private key password. + * + * @var string|null + */ + public $private_key_password; + + /** + * Private key. + * + * @var string|null + */ + public $private_key; + + /** + * Private certificate. + * + * @var string|null + */ + public $private_certificate; + + /** + * Purchase ID. + * + * @var string|null + */ + public $purchase_id; + + /** + * Get merchant ID. + * + * @return string|null + */ + public function get_merchant_id() { + return $this->merchant_id; + } + + /** + * Set merchant ID. + * + * @param string|null $merchant_id Merchant ID. + * @return void + */ + public function set_merchant_id( $merchant_id ) { + $this->merchant_id = $merchant_id; + } + + /** + * Get sub ID. + * + * @return int|string|null + */ + public function get_sub_id() { + return $this->sub_id; + } + + /** + * Set sub ID. + * + * @param int|string|null $sub_id Sub ID. + * @return void + */ + public function set_sub_id( $sub_id ) { + $this->sub_id = $sub_id; + } + + /** + * Get payment server URL. + * + * @return string|null + */ + public function get_payment_server_url() { + return $this->payment_server_url; + } + + /** + * Set payment server URL. + * + * @param string|null $payment_server_url Payment server URL. + * @return void + */ + public function set_payment_server_url( $payment_server_url ) { + $this->payment_server_url = $payment_server_url; + } + + /** + * Get private key password. + * + * @return string|null + */ + public function get_private_key_password() { + return $this->private_key_password; + } + + /** + * Set private key password. + * + * @param string|null $private_key_password Private key password. + * @return void + */ + public function set_private_key_password( $private_key_password ) { + $this->private_key_password = $private_key_password; + } + + /** + * Get private key. + * + * @return string|null + */ + public function get_private_key() { + return $this->private_key; + } + + /** + * Set private key. + * + * @param string|null $private_key Private key. + * @return void + */ + public function set_private_key( $private_key ) { + $this->private_key = $private_key; + } + + /** + * Get private certificate. + * + * @return string|null + */ + public function get_private_certificate() { + return $this->private_certificate; + } + + /** + * Set private certificate. + * + * @param string|null $private_certificate Private certificate. + * @return void + */ + public function set_private_certificate( $private_certificate ) { + $this->private_certificate = $private_certificate; + } + + /** + * Get purchase ID. + * + * @return string|null + */ + public function get_purchase_id() { + return $this->purchase_id; + } + + /** + * Set purchase ID. + * + * @param string|null $purchase_id Purchase ID. + * @return void + */ + public function set_purchase_id( $purchase_id ) { + $this->purchase_id = $purchase_id; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Country.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Country.php new file mode 100644 index 00000000..ea78c53a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Country.php @@ -0,0 +1,81 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: Country + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Country { + /** + * Country name. + * + * @var string + */ + private $name; + + /** + * Issuers for this country. + * + * @var array + */ + private $issuers; + + /** + * Constructs and initializes an country + */ + public function __construct() { + $this->issuers = array(); + } + + /** + * Get the country name. + * + * @return string + */ + public function get_name() { + return $this->name; + } + + /** + * Set the country name. + * + * @param string $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Add issuer to this country. + * + * @param Issuer $issuer Issuer. + * @return void + */ + public function add_issuer( Issuer $issuer ) { + $this->issuers[] = $issuer; + } + + /** + * Get the issuers within this country. + * + * @return array + */ + public function get_issuers() { + return $this->issuers; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Directory.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Directory.php new file mode 100644 index 00000000..cab68f77 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Directory.php @@ -0,0 +1,76 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +use Pronamic\WordPress\DateTime\DateTime; + +/** + * Title: Directory + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Directory { + /** + * The date the issuer list was modified + * + * @var DateTime + */ + private $date; + + /** + * The countries in this directory + * + * @var array + */ + private $countries; + + /** + * Constructs and initializes a directory + * + * @return void + */ + public function __construct() { + $this->countries = array(); + } + + /** + * Set the specified date + * + * @param DateTime $date Date. + * @return void + */ + public function set_date( DateTime $date ) { + $this->date = $date; + } + + /** + * Add the specified country to this directory + * + * @param Country $country Country. + * @return void + */ + public function add_country( Country $country ) { + $this->countries[] = $country; + } + + /** + * Get the countries within this directory + * + * @return array + */ + public function get_countries() { + return $this->countries; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Error.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Error.php new file mode 100644 index 00000000..fe2876c7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Error.php @@ -0,0 +1,167 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: iDEAL Advanced v3 error + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Error { + /** + * Code + * + * @var string + */ + private $code; + + /** + * Message + * + * @var string + */ + private $message; + + /** + * Detail + * + * @var string + */ + private $detail; + + /** + * Suggested action + * + * @var string + */ + private $suggested_action; + + /** + * Consumer message + * + * @var string + */ + private $consumer_message; + + /** + * Construct and initialize an error. + */ + public function __construct() { + } + + /** + * Get error code. + * + * @return string + */ + public function get_code() { + return $this->code; + } + + /** + * Set error code. + * + * @param string $code Error code. + * @return void + */ + public function set_code( $code ) { + $this->code = $code; + } + + /** + * Get error message. + * + * @return string + */ + public function get_message() { + return $this->message; + } + + /** + * Set error message. + * + * @param string $message Error message. + * @return void + */ + public function set_message( $message ) { + $this->message = $message; + } + + /** + * Get error detail. + * + * @return string + */ + public function get_detail() { + return $this->detail; + } + + /** + * Set error detail. + * + * @param string $detail Detail. + * @return void + */ + public function set_detail( $detail ) { + $this->detail = $detail; + } + + /** + * Get suggested action. + * + * @return string + */ + public function get_suggested_action() { + return $this->suggested_action; + } + + /** + * Set suggested action. + * + * @param string $suggested_action Suggested action. + * @return void + */ + public function set_suggested_action( $suggested_action ) { + $this->suggested_action = $suggested_action; + } + + /** + * Get consumer message. + * + * @return string + */ + public function get_consumer_message() { + return $this->consumer_message; + } + + /** + * Set consumer message. + * + * @param string $consumer_message Consumer message. + * @return void + */ + public function set_consumer_message( $consumer_message ) { + $this->consumer_message = $consumer_message; + } + + /** + * Create a string representation of this object. + * + * @return string + */ + public function __toString() { + return $this->code . ' ' . $this->message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php new file mode 100644 index 00000000..6ea632a4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Gateway.php @@ -0,0 +1,220 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Title: iDEAL Advanced v3+ gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.5 + * @since 1.0.0 + */ +class Gateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + protected $client; + + /** + * Constructs and initializes an iDEAL Advanced v3 gateway + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $client = new Client(); + + $client->set_acquirer_url( (string) $config->get_payment_server_url() ); + + $client->merchant_id = (string) $config->get_merchant_id(); + $client->sub_id = (string) $config->get_sub_id(); + $client->private_key = (string) $config->get_private_key(); + $client->private_key_password = (string) $config->get_private_key_password(); + $client->private_certificate = (string) $config->get_private_certificate(); + + $this->client = $client; + } + + /** + * Get issuers + * + * @see Core_Gateway::get_issuers() + * @return array|string>> + */ + public function get_issuers() { + $groups = array(); + + try { + $directory = $this->client->get_directory(); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'ideal_advanced_v3_error', $e->getMessage() ); + + return $groups; + } + + if ( null === $directory ) { + return $groups; + } + + foreach ( $directory->get_countries() as $country ) { + $issuers = array(); + + foreach ( $country->get_issuers() as $issuer ) { + $id = $issuer->get_id(); + $name = $issuer->get_name(); + + if ( null === $id || null === $name ) { + continue; + } + + $issuers[ $id ] = $name; + } + + $groups[] = array( + 'name' => $country->get_name(), + 'options' => $issuers, + ); + } + + return $groups; + } + + /** + * Get supported payment methods + * + * @see Core_Gateway::get_supported_payment_methods() + * @return array + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::IDEAL, + ); + } + + /** + * Is payment method required to start transaction? + * + * @see Core_Gateway::payment_method_is_required() + * @since 1.1.5 + */ + public function payment_method_is_required() { + return true; + } + + /** + * Start + * + * @see Pronamic_WP_Pay_Gateway::start() + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + // Purchase ID. + $purchase_id = $payment->format_string( $this->config->get_purchase_id() ); + + $payment->set_meta( 'purchase_id', $purchase_id ); + + // Transaction. + $transaction = new Transaction(); + $transaction->set_purchase_id( $purchase_id ); + $transaction->set_amount( $payment->get_total_amount()->get_value() ); + $transaction->set_currency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() ); + $transaction->set_expiration_period( 'PT30M' ); + $transaction->set_description( $payment->get_description() ); + $transaction->set_entrance_code( $payment->get_entrance_code() ); + + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + $transaction->set_language( $customer->get_language() ); + } + + // Create transaction. + $result = $this->client->create_transaction( $transaction, $payment->get_return_url(), (string) $payment->get_issuer() ); + + if ( null !== $result->issuer ) { + $authentication_url = $result->issuer->get_authentication_url(); + + if ( null !== $authentication_url ) { + $payment->set_action_url( $authentication_url ); + } + } + + if ( null !== $result->transaction ) { + $payment->set_transaction_id( $result->transaction->get_id() ); + } + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $transaction_id = (string) $payment->get_transaction_id(); + + // Try to retrieve payment status. + try { + $result = $this->client->get_status( $transaction_id ); + } catch ( \Exception $e ) { + $note = sprintf( + /* translators: %s: exception message */ + __( 'Error getting payment status: %s', 'pronamic_ideal' ), + $e->getMessage() + ); + + $payment->add_note( $note ); + + return; + } + + // Check transaction result. + if ( null === $result->transaction ) { + return; + } + + // Update payment with transaction data. + $transaction = $result->transaction; + + $payment->set_status( $transaction->get_status() ); + + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_name( $transaction->get_consumer_name() ); + $consumer_bank_details->set_iban( $transaction->get_consumer_iban() ); + $consumer_bank_details->set_bic( $transaction->get_consumer_bic() ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/IDeal.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/IDeal.php new file mode 100644 index 00000000..14207a13 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/IDeal.php @@ -0,0 +1,37 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: IDeal + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class IDeal { + /** + * Format the price according to the documentation + * + * @param float $amount Amount. + * @return string + */ + public static function format_amount( $amount ) { + /** + * The amount payable in euro (with a period (.) used as decimal separator). + * + * @link (page 18) http://pronamic.nl/wp-content/uploads/2012/12/iDEAL-Merchant-Integration-Guide-ENG-v3.3.1.pdf + */ + return number_format( $amount, 2, '.', '' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php new file mode 100644 index 00000000..16f21552 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Integration.php @@ -0,0 +1,667 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +use Pronamic\WordPress\Pay\Gateways\IDeal\AbstractIntegration; + +/** + * Title: iDEAL Advanced v3 integration + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.1 + * @since 2.0.0 + */ +class Integration extends AbstractIntegration { + /** + * Construct iDEAL Advanced v3 integration. + * + * @param array $args Arguments. + * @return void + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'id' => 'ideal-advanced-v3', + 'name' => 'iDEAL Advanced v3', + 'url' => \__( 'https://www.ideal.nl/en/', 'pronamic_ideal' ), + 'product_url' => \__( 'https://www.ideal.nl/en/', 'pronamic_ideal' ), + 'manual_url' => null, + 'dashboard_url' => null, + 'provider' => null, + 'acquirer_url' => null, + 'acquirer_test_url' => null, + 'supports' => array( + 'payment_status_request', + ), + ) + ); + + parent::__construct( $args ); + + // Acquirer URL. + $this->acquirer_url = $args['acquirer_url']; + $this->acquirer_test_url = $args['acquirer_test_url']; + + // Actions. + add_action( 'current_screen', array( $this, 'maybe_download_private_certificate' ) ); + add_action( 'current_screen', array( $this, 'maybe_download_private_key' ) ); + } + + /** + * Get settings fields. + * + * @return array>> + */ + public function get_settings_fields() { + $fields = parent::get_settings_fields(); + + /* + * Private Key and Certificate + */ + + // Private key and certificate information. + $fields[] = array( + 'section' => 'general', + 'title' => __( 'Private key and certificate', 'pronamic_ideal' ), + 'type' => 'description', + 'callback' => array( $this, 'field_security' ), + ); + + // Organization. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_organization', + 'title' => __( 'Organization', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => __( 'Organization name, e.g. Pronamic', 'pronamic_ideal' ), + ); + + // Organization Unit. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_organization_unit', + 'title' => __( 'Organization Unit', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => __( 'Organization unit, e.g. Administration', 'pronamic_ideal' ), + ); + + // Locality. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_locality', + 'title' => __( 'City', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => __( 'City, e.g. Amsterdam', 'pronamic_ideal' ), + ); + + // State or Province. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_state_or_province', + 'title' => __( 'State / province', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => __( 'State or province, e.g. Friesland', 'pronamic_ideal' ), + ); + + // Country. + $locale = \explode( '_', \get_locale() ); + + $locale = count( $locale ) > 1 ? $locale[1] : $locale[0]; + + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_country', + 'title' => __( 'Country', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => sprintf( + '%s %s (ISO-3166-1 alpha-2)', + __( '2 letter country code, e.g.', 'pronamic_ideal' ), + strtoupper( $locale ) + ), + 'size' => 2, + 'description' => sprintf( + '%s %s', + __( '2 letter country code, e.g.', 'pronamic_ideal' ), + strtoupper( $locale ) + ), + ); + + // Email Address. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_email', + 'title' => __( 'E-mail address', 'pronamic_ideal' ), + 'tooltip' => sprintf( + /* translators: %s: admin email */ + __( 'E-mail address, e.g. %s', 'pronamic_ideal' ), + (string) get_option( 'admin_email' ) + ), + 'type' => 'text', + ); + + // Number Days Valid. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_NUMBER_INT, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_number_days_valid', + 'title' => __( 'Number Days Valid', 'pronamic_ideal' ), + 'type' => 'text', + 'default' => 1825, + 'tooltip' => __( 'Number of days the generated certificate will be valid for, e.g. 1825 days for the maximum duration of 5 years.', 'pronamic_ideal' ), + ); + + // Private Key Password. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_ideal_private_key_password', + 'title' => __( 'Private Key Password', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'default' => wp_generate_password(), + 'tooltip' => __( 'A random password which will be used for the generation of the private key and certificate.', 'pronamic_ideal' ), + ); + + // Private Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_ideal_private_key', + 'title' => __( 'Private Key', 'pronamic_ideal' ), + 'type' => 'textarea', + 'callback' => array( $this, 'field_private_key' ), + 'classes' => array( 'code' ), + 'tooltip' => __( 'The private key is used for secure communication with the payment provider. If left empty, the private key will be generated using the given private key password.', 'pronamic_ideal' ), + ); + + // Private Certificate. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'group' => 'pk-cert', + 'meta_key' => '_pronamic_gateway_ideal_private_certificate', + 'title' => __( 'Private Certificate', 'pronamic_ideal' ), + 'type' => 'textarea', + 'callback' => array( $this, 'field_private_certificate' ), + 'classes' => array( 'code' ), + 'tooltip' => __( 'The certificate is used for secure communication with the payment provider. If left empty, the certificate will be generated using the private key and given organization details.', 'pronamic_ideal' ), + ); + + // Return. + return $fields; + } + + /** + * Field security + * + * @param array $field Field. + * @return void + */ + public function field_security( $field ) { + $post_id = (int) \get_the_ID(); + + $certificate = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_certificate', true ); + + ?> +

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

    + $field Field. + * @return void + */ + public function field_private_key( $field ) { + $post_id = (int) \get_the_ID(); + + $private_key = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key', true ); + $private_key_password = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key_password', true ); + $number_days_valid = get_post_meta( $post_id, '_pronamic_gateway_number_days_valid', true ); + + $filename = __( 'ideal.key', 'pronamic_ideal' ); + + if ( ! empty( $private_key_password ) && ! empty( $number_days_valid ) ) { + $command = sprintf( + 'openssl genrsa -aes128 -out %s -passout pass:%s 2048', + escapeshellarg( $filename ), + escapeshellarg( $private_key_password ) + ); + + ?> + +

    + + + %s

    ', + esc_html__( 'Leave empty and save the configuration to generate the private key or view the OpenSSL command.', 'pronamic_ideal' ) + ); + } + + ?> +

    + %s ', + esc_html__( 'Upload', 'pronamic_ideal' ), + '_pronamic_gateway_ideal_private_key_file' + ); + + ?> +

    + $field Field. + * @return void + */ + public function field_private_certificate( $field ) { + $post_id = (int) \get_the_ID(); + + $certificate = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_certificate', true ); + + $private_key_password = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key_password', true ); + $number_days_valid = get_post_meta( $post_id, '_pronamic_gateway_number_days_valid', true ); + + $filename_key = __( 'ideal.key', 'pronamic_ideal' ); + $filename_cer = __( 'ideal.cer', 'pronamic_ideal' ); + + // @link http://www.openssl.org/docs/apps/req.html + $subj_args = array( + 'C' => get_post_meta( $post_id, '_pronamic_gateway_country', true ), + 'ST' => get_post_meta( $post_id, '_pronamic_gateway_state_or_province', true ), + 'L' => get_post_meta( $post_id, '_pronamic_gateway_locality', true ), + 'O' => get_post_meta( $post_id, '_pronamic_gateway_organization', true ), + 'OU' => get_post_meta( $post_id, '_pronamic_gateway_organization_unit', true ), + 'CN' => get_post_meta( $post_id, '_pronamic_gateway_organization', true ), + 'emailAddress' => get_post_meta( $post_id, '_pronamic_gateway_email', true ), + ); + + $subj_args = array_filter( $subj_args ); + + $subj = ''; + + foreach ( $subj_args as $type => $value ) { + $subj .= '/' . $type . '=' . addslashes( $value ); + } + + if ( ! empty( $subj ) ) { + $command = trim( + sprintf( + 'openssl req -x509 -sha256 -new -key %s -passin pass:%s -days %s -out %s %s', + escapeshellarg( $filename_key ), + escapeshellarg( $private_key_password ), + escapeshellarg( $number_days_valid ), + escapeshellarg( $filename_cer ), + sprintf( '-subj %s', escapeshellarg( $subj ) ) + ) + ); + + ?> + +

    + + + %s

    ', + esc_html__( 'Leave empty and save the configuration to generate the certificate or view the OpenSSL command.', 'pronamic_ideal' ) + ); + } + + if ( ! empty( $certificate ) ) { + $fingerprint = (string) Security::get_sha_fingerprint( $certificate ); + $fingerprint = str_split( $fingerprint, 2 ); + $fingerprint = implode( ':', $fingerprint ); + + echo '
    '; + + echo '
    ', esc_html__( 'SHA Fingerprint', 'pronamic_ideal' ), '
    '; + echo '
    ', esc_html( $fingerprint ), '
    '; + + $info = openssl_x509_parse( $certificate ); + + if ( $info ) { + $date_format = __( 'M j, Y @ G:i', 'pronamic_ideal' ); + + if ( isset( $info['validFrom_time_t'] ) ) { + echo '
    ', esc_html__( 'Valid From', 'pronamic_ideal' ), '
    '; + echo '
    ', esc_html( date_i18n( $date_format, $info['validFrom_time_t'] ) ), '
    '; + } + + if ( isset( $info['validTo_time_t'] ) ) { + echo '
    ', esc_html__( 'Valid To', 'pronamic_ideal' ), '
    '; + echo '
    ', esc_html( date_i18n( $date_format, $info['validTo_time_t'] ) ), '
    '; + } + } + + echo '
    '; + } + + ?> +

    + %s ', + esc_html__( 'Upload', 'pronamic_ideal' ), + '_pronamic_gateway_ideal_private_certificate_file' + ); + + ?> +

    + '_pronamic_gateway_ideal_private_key', + '_pronamic_gateway_ideal_private_certificate_file' => '_pronamic_gateway_ideal_private_certificate', + ); + + foreach ( $files as $name => $meta_key ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated + if ( isset( $_FILES[ $name ] ) && UPLOAD_ERR_OK === $_FILES[ $name ]['error'] ) { + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $value = file_get_contents( $_FILES[ $name ]['tmp_name'] ); + + update_post_meta( $post_id, $meta_key, $value ); + } + } + + // Generate private key and certificate. + $private_key = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key', true ); + $private_key_password = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key_password', true ); + + if ( empty( $private_key_password ) ) { + // Without private key password we can't create private key and certifiate. + return; + } + + if ( ! in_array( 'aes-128-cbc', openssl_get_cipher_methods(), true ) ) { + // Without AES-128-CBC ciphter method we can't create private key and certificate. + return; + } + + $args = array( + 'digest_alg' => 'SHA256', + 'private_key_bits' => 2048, + 'private_key_type' => \OPENSSL_KEYTYPE_RSA, + 'encrypt_key' => true, + 'subjectKeyIdentifier' => 'hash', + 'authorityKeyIdentifier' => 'keyid:always,issuer:always', + 'basicConstraints' => 'CA:true', + ); + + // Private key. + $pkey = openssl_pkey_get_private( $private_key, $private_key_password ); + + if ( false === $pkey ) { + // If we can't open the private key we will create a new private key and certificate. + if ( defined( 'OPENSSL_CIPHER_AES_128_CBC' ) ) { + $args['encrypt_key_cipher'] = \OPENSSL_CIPHER_AES_128_CBC; + } elseif ( defined( 'OPENSSL_CIPHER_3DES' ) ) { + // @link https://www.pronamic.nl/wp-content/uploads/2011/12/iDEAL_Advanced_PHP_EN_V2.2.pdf + $args['encrypt_key_cipher'] = \OPENSSL_CIPHER_3DES; + } else { + // Unable to create private key without cipher. + return; + } + + $pkey = openssl_pkey_new( $args ); + + if ( false === $pkey ) { + return; + } + + // Export key. + $result = openssl_pkey_export( $pkey, $private_key, $private_key_password, $args ); + + if ( false === $result ) { + return; + } + + update_post_meta( $post_id, '_pronamic_gateway_ideal_private_key', $private_key ); + + // Delete private certificate since this is no longer valid. + delete_post_meta( $post_id, '_pronamic_gateway_ideal_private_certificate' ); + } + + // Certificate. + $private_certificate = get_post_meta( $post_id, '_pronamic_gateway_ideal_private_certificate', true ); + $number_days_valid = get_post_meta( $post_id, '_pronamic_gateway_number_days_valid', true ); + + if ( empty( $private_certificate ) ) { + $required_keys = array( + 'countryName', + 'stateOrProvinceName', + 'localityName', + 'organizationName', + 'commonName', + 'emailAddress', + ); + + $distinguished_name = array( + 'countryName' => get_post_meta( $post_id, '_pronamic_gateway_country', true ), + 'stateOrProvinceName' => get_post_meta( $post_id, '_pronamic_gateway_state_or_province', true ), + 'localityName' => get_post_meta( $post_id, '_pronamic_gateway_locality', true ), + 'organizationName' => get_post_meta( $post_id, '_pronamic_gateway_organization', true ), + 'organizationalUnitName' => get_post_meta( $post_id, '_pronamic_gateway_organization_unit', true ), + 'commonName' => get_post_meta( $post_id, '_pronamic_gateway_organization', true ), + 'emailAddress' => get_post_meta( $post_id, '_pronamic_gateway_email', true ), + ); + + $distinguished_name = array_filter( $distinguished_name ); + + /* + * Create certificate only if distinguished name contains all required elements + * + * @link http://stackoverflow.com/questions/13169588/how-to-check-if-multiple-array-keys-exists + */ + if ( count( array_intersect_key( array_flip( $required_keys ), $distinguished_name ) ) === count( $required_keys ) ) { + // If we can't open the private key we will create a new private key and certificate. + if ( defined( 'OPENSSL_CIPHER_AES_128_CBC' ) ) { + $args['encrypt_key_cipher'] = \OPENSSL_CIPHER_AES_128_CBC; + } elseif ( defined( 'OPENSSL_CIPHER_3DES' ) ) { + // @link https://www.pronamic.nl/wp-content/uploads/2011/12/iDEAL_Advanced_PHP_EN_V2.2.pdf + $args['encrypt_key_cipher'] = \OPENSSL_CIPHER_3DES; + } else { + // Unable to create private key without cipher. + return; + } + + $csr = openssl_csr_new( $distinguished_name, $pkey ); + + if ( false !== $csr ) { + $cert = openssl_csr_sign( $csr, null, $pkey, $number_days_valid, $args, time() ); + + if ( false !== $cert ) { + openssl_x509_export( $cert, $certificate ); + + update_post_meta( $post_id, '_pronamic_gateway_ideal_private_certificate', $certificate ); + } + } + } + } + } + + /** + * Get config. + * + * @param int $post_id Post ID. + * @return Config + */ + public function get_config( $post_id ) { + $mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + + $config = new Config(); + + $config->payment_server_url = $this->acquirer_url; + + if ( 'test' === $mode && null !== $this->acquirer_test_url ) { + $config->payment_server_url = $this->acquirer_test_url; + } + + $config->set_merchant_id( get_post_meta( $post_id, '_pronamic_gateway_ideal_merchant_id', true ) ); + $config->set_sub_id( get_post_meta( $post_id, '_pronamic_gateway_ideal_sub_id', true ) ); + $config->set_purchase_id( get_post_meta( $post_id, '_pronamic_gateway_ideal_purchase_id', true ) ); + + $config->set_private_key( get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key', true ) ); + $config->set_private_key_password( get_post_meta( $post_id, '_pronamic_gateway_ideal_private_key_password', true ) ); + $config->set_private_certificate( get_post_meta( $post_id, '_pronamic_gateway_ideal_private_certificate', true ) ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Issuer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Issuer.php new file mode 100644 index 00000000..b41eed59 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Issuer.php @@ -0,0 +1,108 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: Issuer + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Issuer { + /** + * ID of the issuer + * + * @var string|null + */ + private $id; + + /** + * Name of the issuer + * + * @var string|null + */ + private $name; + + /** + * Authentication URL + * + * @var string|null + */ + private $authentication_url; + + /** + * Constructs and initializes an issuer + * + * @return void + */ + public function __construct() { + } + + /** + * Get the ID of this issuer + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set the ID of this issuer + * + * @param string|null $id Issuer ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get the name of this issuer + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set the name of this issuer + * + * @param string|null $name Issuer name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get the name of this issuer + * + * @return string|null + */ + public function get_authentication_url() { + return $this->authentication_url; + } + + /** + * Set the name of this issuer + * + * @param string|null $authentication_url Authentication URL. + * @return void + */ + public function set_authentication_url( $authentication_url ) { + $this->authentication_url = $authentication_url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Merchant.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Merchant.php new file mode 100644 index 00000000..8e398301 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Merchant.php @@ -0,0 +1,108 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: Merchant + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Merchant { + /** + * ID of the merchant + * + * @var string + */ + private $id; + + /** + * Sub ID + * + * @var string + */ + private $sub_id; + + /** + * Return URL + * + * @var string + */ + private $return_url; + + /** + * Constructs and initializes an issuer + * + * @return void + */ + public function __construct() { + } + + /** + * Get the ID of this merchant + * + * @return string + */ + public function get_id() { + return $this->id; + } + + /** + * Set the ID of this merchant + * + * @param string $id Merchant ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get the ID of this merchant + * + * @return string + */ + public function get_sub_id() { + return $this->sub_id; + } + + /** + * Set the ID of this merchant + * + * @param string $sub_id Sub ID. + * @return void + */ + public function set_sub_id( $sub_id ) { + $this->sub_id = $sub_id; + } + + /** + * Get the return URL of this merchant + * + * @return string + */ + public function get_return_url() { + return $this->return_url; + } + + /** + * Set the ID of this merchant + * + * @param string $return_url Return URL. + * @return void + */ + public function set_return_url( $return_url ) { + $this->return_url = $return_url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Security.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Security.php new file mode 100644 index 00000000..51b3e289 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Security.php @@ -0,0 +1,111 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: Security + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class Security { + /** + * Indicator for the begin of an certificate + * + * @var string + */ + const CERTIFICATE_BEGIN = '-----BEGIN CERTIFICATE-----'; + + /** + * Indicator for the end of an certificate + * + * @var string + */ + const CERTIFICATE_END = '-----END CERTIFICATE-----'; + + /** + * Get the sha1 fingerprint from the specified certificate + * + * @param string $certificate Certificate. + * @return string|null Fingerprint or `null` on failure. + */ + public static function get_sha_fingerprint( $certificate ) { + return self::get_fingerprint( $certificate, 'sha1' ); + } + + /** + * Get the md5 fingerprint from the specified certificate + * + * @param string $certificate Certificate. + * @return string|null Fingerprint or `null` on failure. + */ + public static function get_md5_fingerprint( $certificate ) { + return self::get_fingerprint( $certificate, 'md5' ); + } + + /** + * Get the fingerprint from the specified certificate + * + * @param string $certificate Certificate. + * @param string|null $hash Hashing algorithm. + * @return string|null Fingerprint or `null` on failure. + */ + public static function get_fingerprint( $certificate, $hash = null ) { + $fingerprint = null; + + // The openssl_x509_read() function will throw an warning if the supplied + // parameter cannot be coerced into an X509 certificate + // @codingStandardsIgnoreStart + $resource = @openssl_x509_read( $certificate ); + // @codingStandardsIgnoreEnd + + if ( false === $resource ) { + return null; + } + + $output = null; + + $result = openssl_x509_export( $resource, $output ); + + if ( false === $result ) { + return null; + } + + $output = str_replace( self::CERTIFICATE_BEGIN, '', (string) $output ); + $output = str_replace( self::CERTIFICATE_END, '', $output ); + + // Base64 decode. + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode + $fingerprint = base64_decode( $output ); + + // Hash. + if ( null !== $hash ) { + $fingerprint = hash( $hash, $fingerprint ); + } + + /* + * Uppercase + * + * Cannot find private certificate file with fingerprint: b4845cb5cbcee3e1e0afef2662552a2365960e72 + * (Note: Some acquirers only accept fingerprints in uppercase. Make the value of "KeyName" in your XML data uppercase.). + * https://www.ideal-checkout.nl/simulator/ + * + * @since 1.1.11 + */ + $fingerprint = strtoupper( $fingerprint ); + + return $fingerprint; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Status.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Status.php new file mode 100644 index 00000000..89e8f510 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Status.php @@ -0,0 +1,57 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: Status + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Status { + /** + * Status indicator for success + * + * @var string + */ + const SUCCESS = 'Success'; + + /** + * Status indicator for cancelled + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Status indicator for expired + * + * @var string + */ + const EXPIRED = 'Expired'; + + /** + * Status indicator for failure + * + * @var string + */ + const FAILURE = 'Failure'; + + /** + * Status indicator for open + * + * @var string + */ + const OPEN = 'Open'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Transaction.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Transaction.php new file mode 100644 index 00000000..a521bc6b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/Transaction.php @@ -0,0 +1,371 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3; + +/** + * Title: Transaction + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Transaction { + /** + * Transaction ID + * + * @var string|null + */ + private $id; + + /** + * Purchase ID + * + * @var string|null + */ + private $purchase_id; + + /** + * Amount + * + * @var float|null + */ + private $amount; + + /** + * Currency + * + * @var string|null + */ + private $currency; + + /** + * Timeframe during which the transaction is allowed to take + * place. Notation PnYnMnDTnHnMnS, where every n + * indicates the number of years, months, days, hours, minutes + * and seconds respectively. E.g. PT1H indicates an expiration + * period of 1 hour. PT3M30S indicates a period of 3 and a half + * minutes. Maximum allowed is PT1H; minimum allowed is + * PT1M. + * + * @var string|null + */ + private $expiration_period; + + /** + * Language + * + * @var string|null + */ + private $language; + + /** + * Description + * + * @var string|null + */ + private $description; + + /** + * Mandatory code to identify the customer when he/she is + * redirected back to the merchantReturnURL + * + * @var string|null + */ + private $entrance_code; + + /** + * The status of this transaction + * + * @var string|null + */ + private $status; + + /** + * The consumer name + * + * @var string|null + */ + private $consumer_name; + + /** + * Consumer IBAN + * + * @var string|null + */ + private $consumer_iban; + + /** + * Consumer BIC + * + * @var string|null + */ + private $consumer_bic; + + /** + * Constructs and initializes an transaction + * + * @return void + */ + public function __construct() { + } + + /** + * Get the ID of this transaction + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set the ID of this transaction + * + * @param string|null $id Transaction ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get the purchase ID of this transaction + * + * The purchase number according to the online shop’s system + * + * @return string|null + */ + public function get_purchase_id() { + return $this->purchase_id; + } + + /** + * Set the purchase id of this transaction + * + * The purchase number according to the online shop’s system + * + * @param string|null $id Purchase ID. + * @return void + */ + public function set_purchase_id( $id ) { + $this->purchase_id = $id; + } + + /** + * Get the amount of this transaction + * + * @return float|null + */ + public function get_amount() { + return $this->amount; + } + + /** + * Set the amount of this transaction + * + * @param float|null $amount Amount. + * @return void + */ + public function set_amount( $amount ) { + $this->amount = $amount; + } + + /** + * Get the currency of this transaction + * + * @return string|null + */ + public function get_currency() { + return $this->currency; + } + + /** + * Set the currency of this transaction + * + * @param string|null $currency Currency. + * @return void + */ + public function set_currency( $currency ) { + $this->currency = $currency; + } + + /** + * Get the expiration period of this transaction + * + * @return string|null + */ + public function get_expiration_period() { + return $this->expiration_period; + } + + /** + * Set the expiration period of this transaction + * + * @param string|null $expiration_period Expiration period in date interval specification notation (e.g. `PT30M`). + * @return void + */ + public function set_expiration_period( $expiration_period ) { + $this->expiration_period = $expiration_period; + } + + /** + * Get the language of this transaction + * + * @return string|null + */ + public function get_language() { + return $this->language; + } + + /** + * Set the language of this transaction + * + * @param string|null $language Language. + * @return void + */ + public function set_language( $language ) { + $this->language = $language; + } + + /** + * Get the description of this transaction + * + * @return string|null + */ + public function get_description() { + return $this->description; + } + + /** + * Set the description of this transaction + * AN..max32 (AN = Alphanumerical, free text) + * + * @param string|null $description Description. + * @return void + */ + public function set_description( $description ) { + if ( null !== $description ) { + $description = substr( $description, 0, 32 ); + } + + $this->description = $description; + } + + /** + * Get the entrance code of this transaction + * + * A code determined by the online shop with which the purchase can be + * authenticated upon redirection to the online shop (see section 4.2.2 + * for details). + * + * @return string|null + */ + public function get_entrance_code() { + return $this->entrance_code; + } + + /** + * Set the entrance code + * ANS..max40 (ANS = Strictly alphanumerical (letters and numbers only)) + * + * A code determined by the online shop with which the purchase can be + * authenticated upon redirection to the online shop (see section 4.2.2 + * for details). + * + * @param string|null $entrance_code Entrance code. + * @return void + */ + public function set_entrance_code( $entrance_code ) { + if ( null !== $entrance_code ) { + $entrance_code = substr( $entrance_code, 0, 40 ); + } + + $this->entrance_code = $entrance_code; + } + + /** + * Get the status of this transaction + * + * @return string|null + */ + public function get_status() { + return $this->status; + } + + /** + * Set the status + * + * @param string|null $status Status. + * @return void + */ + public function set_status( $status ) { + $this->status = $status; + } + + /** + * Get the consumer name + * + * @return string|null + */ + public function get_consumer_name() { + return $this->consumer_name; + } + + /** + * Set the consumer name + * + * @param string|null $name Consumer name. + * @return void + */ + public function set_consumer_name( $name ) { + $this->consumer_name = $name; + } + + /** + * Get the consumer IBAN number + * + * @return string|null + */ + public function get_consumer_iban() { + return $this->consumer_iban; + } + + /** + * Set the consumer IBAN number + * + * @param string|null $iban Consumber IBAN. + * @return void + */ + public function set_consumer_iban( $iban ) { + $this->consumer_iban = $iban; + } + + /** + * Get the consumer BIC number + * + * @return string|null + */ + public function get_consumer_bic() { + return $this->consumer_bic; + } + + /** + * Set the consumer BIC number + * + * @param string|null $bic Consumer BIC. + * @return void + */ + public function set_consumer_bic( $bic ) { + $this->consumer_bic = $bic; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerErrorResMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerErrorResMessage.php new file mode 100644 index 00000000..a32be989 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerErrorResMessage.php @@ -0,0 +1,70 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Error; +use SimpleXMLElement; + +/** + * Title: iDEAL error response XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class AcquirerErrorResMessage extends ResponseMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'AcquirerErrorRes'; + + /** + * The error within this response message + * + * @var Error + */ + public $error; + + /** + * Constructs and initialize an error response message + */ + final public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Parse the specified XML into an directory response message object + * + * @param SimpleXMLElement $xml XML. + * @return AcquirerErrorResMessage + * @throws \Exception Throws exception on failed error parsing. + */ + public static function parse( SimpleXMLElement $xml ) { + $message = self::parse_create_date( $xml, new static() ); + + // Parse error. + $parser = new ErrorParser(); + + $error = $parser->parse( $xml->Error ); + + if ( null === $error ) { + throw new \Exception( 'Failed to parse error response.' ); + } + + $message->error = $error; + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusReqMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusReqMessage.php new file mode 100644 index 00000000..34d6bf4d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusReqMessage.php @@ -0,0 +1,82 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use DOMDocument; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Transaction; + +/** + * Title: iDEAL status request XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class AcquirerStatusReqMessage extends RequestMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'AcquirerStatusReq'; + + /** + * Transaction + * + * @var Transaction + */ + public $transaction; + + /** + * Constructs and initialize an status request message + */ + public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Get document + * + * @return DOMDocument + */ + public function get_document() { + $document = parent::get_document(); + + $document_element = $document->documentElement; + + if ( null !== $document_element ) { + // Merchant. + $merchant = $this->get_merchant(); + + $element = self::add_element( $document, $document_element, 'Merchant' ); + + self::add_elements( + $document, + $element, + array( + 'merchantID' => $merchant->get_id(), + 'subID' => $merchant->get_sub_id(), + ) + ); + + // Transaction. + $transaction = $this->transaction; + + $element = self::add_element( $document, $document_element, 'Transaction' ); + + self::add_element( $document, $element, 'transactionID', $transaction->get_id() ); + } + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusResMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusResMessage.php new file mode 100644 index 00000000..bd4866d1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/AcquirerStatusResMessage.php @@ -0,0 +1,60 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Transaction; +use SimpleXMLElement; + +/** + * Title: iDEAL status response XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class AcquirerStatusResMessage extends ResponseMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'AcquirerStatusRes'; + + /** + * Transaction + * + * @var Transaction + */ + public $transaction; + + /** + * Constructs and initialize an status response message + */ + final public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Parse the specified XML into an directory response message object + * + * @param SimpleXMLElement $xml XML. + * @return AcquirerStatusResMessage + */ + public static function parse( SimpleXMLElement $xml ) { + $message = self::parse_create_date( $xml, new static() ); + + $message->transaction = TransactionParser::parse( $xml->Transaction ); + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/CountryParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/CountryParser.php new file mode 100644 index 00000000..673aab53 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/CountryParser.php @@ -0,0 +1,52 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Country; +use SimpleXMLElement; + +/** + * Title: Issuer XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class CountryParser implements Parser { + /** + * Parse + * + * @param SimpleXMLElement $xml XML. + * @return Country + */ + public static function parse( SimpleXMLElement $xml ) { + $country = new Country(); + + // Name. + $name = Security::filter( $xml->countryNames ); + + if ( null !== $name ) { + $country->set_name( $name ); + } + + // Issuers. + foreach ( $xml->Issuer as $element ) { + $issuer = IssuerParser::parse( $element ); + + $country->add_issuer( $issuer ); + } + + return $country; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryParser.php new file mode 100644 index 00000000..17465e2f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryParser.php @@ -0,0 +1,54 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Directory; +use SimpleXMLElement; + +/** + * Title: Issuer XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class DirectoryParser implements Parser { + /** + * Parse + * + * @param SimpleXMLElement $xml XML. + * @return Directory + * @throws \Exception Throws exception on date error. + */ + public static function parse( SimpleXMLElement $xml ) { + $directory = new Directory(); + + // Date. + $timestamp = Security::filter( $xml->directoryDateTimestamp ); + + if ( null !== $timestamp ) { + $directory->set_date( new DateTime( $timestamp ) ); + } + + // Country. + foreach ( $xml->Country as $element ) { + $country = CountryParser::parse( $element ); + + $directory->add_country( $country ); + } + + return $directory; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryRequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryRequestMessage.php new file mode 100644 index 00000000..306cbf1f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryRequestMessage.php @@ -0,0 +1,66 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +/** + * Title: iDEAL directory request XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class DirectoryRequestMessage extends RequestMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'DirectoryReq'; + + /** + * Constructs and initialize a directory request message + */ + public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Get document + * + * @see \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML\RequestMessage::get_document() + */ + public function get_document() { + $document = parent::get_document(); + + // Merchant. + $merchant = $this->get_merchant(); + + $document_element = $document->documentElement; + + if ( null !== $document_element ) { + $element = self::add_element( $document, $document_element, 'Merchant' ); + + self::add_elements( + $document, + $element, + array( + 'merchantID' => $merchant->get_id(), + 'subID' => $merchant->get_sub_id(), + ) + ); + } + + // Return. + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryResponseMessage.php new file mode 100644 index 00000000..3b73e808 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/DirectoryResponseMessage.php @@ -0,0 +1,69 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Directory; +use SimpleXMLElement; + +/** + * Title: iDEAL directory response XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class DirectoryResponseMessage extends ResponseMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'DirectoryRes'; + + /** + * The directory + * + * @var Directory + */ + public $directory; + + /** + * Constructs and initialize an directory response message + */ + final public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Get the directory + * + * @return Directory + */ + public function get_directory() { + return $this->directory; + } + + /** + * Parse the specified XML into an directory response message object + * + * @param SimpleXMLElement $xml XML. + * @return DirectoryResponseMessage + */ + public static function parse( SimpleXMLElement $xml ) { + $message = self::parse_create_date( $xml, new static() ); + + $message->directory = DirectoryParser::parse( $xml->Directory ); + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/ErrorParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/ErrorParser.php new file mode 100644 index 00000000..56f076d7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/ErrorParser.php @@ -0,0 +1,77 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Error; +use Pronamic\WordPress\Pay\Core\XML\Security; +use SimpleXMLElement; + +/** + * Title: iDEAL Advanced v3 error parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class ErrorParser { + /** + * Parse the specified XML element into an acquirer error response + * + * @param SimpleXMLElement $xml XML. + * @return Error|null + */ + public function parse( SimpleXMLElement $xml ) { + if ( 'Error' !== $xml->getName() ) { + return null; + } + + $error = new Error(); + + // Error code. + $code = Security::filter( $xml->errorCode ); + + if ( null !== $code ) { + $error->set_code( $code ); + } + + // Message. + $message = Security::filter( $xml->errorMessage ); + + if ( null !== $message ) { + $error->set_message( $message ); + } + + // Detail. + $detail = Security::filter( $xml->errorDetail ); + + if ( null !== $detail ) { + $error->set_detail( $detail ); + } + + // Suggested action. + $suggested_action = Security::filter( $xml->suggestedAction ); + + if ( null !== $suggested_action ) { + $error->set_suggested_action( $suggested_action ); + } + + // Consumer message. + $consumer_message = Security::filter( $xml->consumerMessage ); + + if ( null !== $consumer_message ) { + $error->set_consumer_message( $consumer_message ); + } + + return $error; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/IssuerParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/IssuerParser.php new file mode 100644 index 00000000..f7c47712 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/IssuerParser.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Issuer; +use SimpleXMLElement; + +/** + * Title: Issuer XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class IssuerParser implements Parser { + /** + * Parse + * + * @param SimpleXMLElement $xml XML. + * @param Issuer $issuer Issuer. + * @return Issuer + */ + public static function parse( SimpleXMLElement $xml, $issuer = null ) { + if ( ! $issuer instanceof Issuer ) { + $issuer = new Issuer(); + } + + $issuer->set_id( Security::filter( $xml->issuerID ) ); + $issuer->set_name( Security::filter( $xml->issuerName ) ); + $issuer->set_authentication_url( Security::filter( $xml->issuerAuthenticationURL ) ); + + return $issuer; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/Message.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/Message.php new file mode 100644 index 00000000..da769fa0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/Message.php @@ -0,0 +1,146 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use DateTimeImmutable; +use DateTimeZone; +use DOMDocument; +use DOMNode; +use DOMText; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: iDEAL XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class Message { + /** + * The XML version of the iDEAL messages + * + * @var string + */ + const XML_VERSION = '1.0'; + + /** + * The XML encoding of the iDEAL messages + * + * @var string + */ + const XML_ENCODING = 'UTF-8'; + + /** + * The XML namespace of the iDEAL messages + * + * @var string + */ + const XML_NAMESPACE = 'http://www.idealdesk.com/ideal/messages/mer-acq/3.3.1'; + + /** + * The version of the iDEAL messages + * + * @var string + */ + const VERSION = '3.3.1'; + + /** + * The name of this message + * + * @var string + */ + private $name; + + /** + * The create date of this message + * + * @var DateTimeImmutable + */ + private $create_date; + + /** + * Constructs and initialize an message + * + * @param string $name Message name. + * @return void + * @throws \Exception Throws exception on date error. + */ + public function __construct( $name ) { + $this->name = $name; + $this->create_date = new DateTimeImmutable( 'now', new DateTimeZone( Plugin::TIMEZONE ) ); + } + + /** + * Get the name of this message + * + * @return string + */ + public function get_name() { + return $this->name; + } + + /** + * Get the create date + * + * @return DateTimeImmutable + */ + public function get_create_date() { + return $this->create_date; + } + + /** + * Set the create date + * + * @param DateTimeImmutable $create_date Date created. + * @return void + */ + public function set_create_date( DateTimeImmutable $create_date ) { + $this->create_date = $create_date; + } + + /** + * Create and add an element with the specified name and value to the specified parent + * + * @param DOMDocument $document Document. + * @param DOMNode $parent Parent. + * @param string $name Element name. + * @param string|null $value Element text value. + * @return \DOMElement + */ + public static function add_element( DOMDocument $document, DOMNode $parent, $name, $value = null ) { + $element = $document->createElement( $name ); + + if ( null !== $value ) { + $element->appendChild( new DOMText( $value ) ); + } + + $parent->appendChild( $element ); + + return $element; + } + + /** + * Add the specified elements to the parent node + * + * @param DOMDocument $document Document. + * @param DOMNode $parent Parent. + * @param array $elements Elements to add. + * @return void + */ + public static function add_elements( DOMDocument $document, DOMNode $parent, array $elements = array() ) { + foreach ( $elements as $name => $value ) { + self::add_element( $document, $parent, $name, $value ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/Parser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/Parser.php new file mode 100644 index 00000000..1df35816 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/Parser.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use SimpleXMLElement; + +/** + * Title: XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +interface Parser { + /** + * Parse the specified XML element + * + * @param SimpleXMLElement $xml XML. + * @return mixed + */ + public static function parse( SimpleXMLElement $xml ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/RequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/RequestMessage.php new file mode 100644 index 00000000..0eb56b21 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/RequestMessage.php @@ -0,0 +1,96 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use DOMDocument; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Merchant; + +/** + * Title: iDEAL request XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +abstract class RequestMessage extends Message { + /** + * Merchant + * + * @var Merchant + */ + private $merchant; + + /** + * Constructs and initialize an request message + * + * @param string $name Name. + */ + public function __construct( $name ) { + parent::__construct( $name ); + + $this->merchant = new Merchant(); + } + + /** + * Get the merchant + * + * @return Merchant + */ + public function get_merchant() { + return $this->merchant; + } + + /** + * Get the DOM document + * + * @return DOMDocument + */ + public function get_document() { + $document = new DOMDocument( parent::XML_VERSION, parent::XML_ENCODING ); + + /* + * We can't disable preserve white space and format the output + * this is causing 'Invalid electronic signature' errors. + * + * $document->preserveWhiteSpace = true; + * $document->formatOutput = true; + */ + + // Root. + $root = $document->createElementNS( parent::XML_NAMESPACE, $this->get_name() ); + $root->setAttribute( 'version', parent::VERSION ); + + $document->appendChild( $root ); + + // Create date timestamp. + // Using DateTime::ISO8601 won't work, this is giving an error. + $timestamp = $this->get_create_date()->format( 'Y-m-d\TH:i:s.000\Z' ); + + $element = $document->createElement( 'createDateTimestamp', $timestamp ); + + $root->appendChild( $element ); + + return $document; + } + + /** + * Create a string representation + * + * @return string + */ + public function __toString() { + $document = $this->get_document(); + + return (string) $document->saveXML(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/ResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/ResponseMessage.php new file mode 100644 index 00000000..ea7f55c1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/ResponseMessage.php @@ -0,0 +1,43 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use DateTimeImmutable; +use SimpleXMLElement; + +/** + * Title: iDEAL response XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +abstract class ResponseMessage extends Message { + /** + * Parse the specified XML into a response message object + * + * @param SimpleXMLElement $xml XML. + * @param static $message Message. + * @return static + * @throws \Exception Throws exception on date error. + */ + public static function parse_create_date( SimpleXMLElement $xml, $message ) { + if ( ! empty( $xml->createDateTimestamp ) ) { + $date = new DateTimeImmutable( (string) $xml->createDateTimestamp ); + + $message->set_create_date( $date ); + } + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionParser.php new file mode 100644 index 00000000..12fdce92 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionParser.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Transaction; +use SimpleXMLElement; + +/** + * Title: Transaction XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class TransactionParser implements Parser { + /** + * Parse the specified XML element into an iDEAL transaction object + * + * @param SimpleXMLElement $xml XML. + * @param Transaction $transaction Transaction. + * + * @return Transaction + */ + public static function parse( SimpleXMLElement $xml, Transaction $transaction = null ) { + if ( ! $transaction instanceof Transaction ) { + $transaction = new Transaction(); + } + + $transaction->set_id( Security::filter( $xml->transactionID ) ); + $transaction->set_purchase_id( Security::filter( $xml->purchaseID ) ); + $transaction->set_status( Security::filter( $xml->status ) ); + $transaction->set_consumer_name( Security::filter( $xml->consumerName ) ); + $transaction->set_consumer_iban( Security::filter( $xml->consumerIBAN ) ); + $transaction->set_consumer_bic( Security::filter( $xml->consumerBIC ) ); + + return $transaction; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionRequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionRequestMessage.php new file mode 100644 index 00000000..bec462ba --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionRequestMessage.php @@ -0,0 +1,126 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use DOMDocument; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\IDeal; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Issuer; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Transaction; + +/** + * Title: iDEAL transaction request XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.1 + */ +class TransactionRequestMessage extends RequestMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'AcquirerTrxReq'; + + /** + * Issuer + * + * @var Issuer + */ + public $issuer; + + /** + * Transaction + * + * @var Transaction + */ + public $transaction; + + /** + * Constructs and initializes an transaction request message + */ + public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Get document + * + * @see RequestMessage::get_document() + * @return DOMDocument + * @throws \Exception Throws exception if no transaction amount has been set. + */ + public function get_document() { + $document = parent::get_document(); + + $document_element = $document->documentElement; + + if ( null !== $document_element ) { + // Issuer. + $issuer = $this->issuer; + + $element = self::add_element( $document, $document_element, 'Issuer' ); + + self::add_elements( + $document, + $element, + array( + 'issuerID' => $issuer->get_id(), + ) + ); + + // Merchant. + $merchant = $this->get_merchant(); + + $element = self::add_element( $document, $document_element, 'Merchant' ); + + self::add_elements( + $document, + $element, + array( + 'merchantID' => $merchant->get_id(), + 'subID' => $merchant->get_sub_id(), + 'merchantReturnURL' => $merchant->get_return_url(), + ) + ); + + // Transaction. + $transaction = $this->transaction; + + $element = self::add_element( $document, $document_element, 'Transaction' ); + + $amount = $transaction->get_amount(); + + if ( null === $amount ) { + throw new \Exception( 'Required iDEAL transaction amount has not been set.' ); + } + + self::add_elements( + $document, + $element, + array( + 'purchaseID' => $transaction->get_purchase_id(), + 'amount' => IDeal::format_amount( $amount ), + 'currency' => $transaction->get_currency(), + 'expirationPeriod' => $transaction->get_expiration_period(), + 'language' => $transaction->get_language(), + 'description' => $transaction->get_description(), + 'entranceCode' => $transaction->get_entrance_code(), + ) + ); + } + + // Return. + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionResponseMessage.php new file mode 100644 index 00000000..ca0df452 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-advanced-v3/src/XML/TransactionResponseMessage.php @@ -0,0 +1,69 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\XML; + +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Issuer; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Transaction; +use SimpleXMLElement; + +/** + * Title: iDEAL transaction response XML message + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + */ +class TransactionResponseMessage extends ResponseMessage { + /** + * The document element name + * + * @var string + */ + const NAME = 'AcquirerTrxRes'; + + /** + * Issuer. + * + * @var Issuer|null + */ + public $issuer; + + /** + * Transaction. + * + * @var Transaction|null + */ + public $transaction; + + /** + * Constructs and initialize an directory response message + */ + final public function __construct() { + parent::__construct( self::NAME ); + } + + /** + * Parse the specified XML into an directory response message object + * + * @param SimpleXMLElement $xml XML. + * @return TransactionResponseMessage + */ + public static function parse( SimpleXMLElement $xml ) { + $message = self::parse_create_date( $xml, new static() ); + + $message->issuer = IssuerParser::parse( $xml->Issuer ); + $message->transaction = TransactionParser::parse( $xml->Transaction ); + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Client.php new file mode 100644 index 00000000..76ce0974 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Client.php @@ -0,0 +1,624 @@ +items = new Items(); + + $this->forbidden_characters = array(); + + $this->set_payment_type( self::PAYMENT_TYPE_IDEAL ); + $this->set_expire_date_format( self::DATE_EXPIRE_FORMAT ); + $this->set_expire_date_modifier( self::EXPIRE_DATE_MODIFIER ); + $this->set_forbidden_characters( self::FORBIDDEN_CHARACHTERS ); + } + + /** + * Get the payment server URL + * + * @return string + */ + public function get_payment_server_url() { + return $this->payment_server_url; + } + + /** + * Set the payment server URL + * + * @param string $url Payment server URL. + */ + public function set_payment_server_url( $url ) { + $this->payment_server_url = $url; + } + + /** + * Get the merchant ID. + * + * @return string + */ + public function get_merchant_id() { + return $this->merchant_id; + } + + /** + * Set the merchant ID. + * + * @param string $merchant_id Merchant ID. + */ + public function set_merchant_id( $merchant_id ) { + $this->merchant_id = $merchant_id; + } + + /** + * Get the sub id + * + * @return string Sub id + */ + public function get_sub_id() { + return $this->sub_id; + } + + /** + * Set the sub id + * + * @param string $sub_id Sub ID. + */ + public function set_sub_id( $sub_id ) { + $this->sub_id = $sub_id; + } + + /** + * Get the hash key + * + * @return string Hash key + */ + public function get_hash_key() { + return $this->hash_key; + } + + /** + * Set the hash key + * N..max50 + * + * @param string $hash_key Hash key. + */ + public function set_hash_key( $hash_key ) { + $this->hash_key = $hash_key; + } + + /** + * Get the purchase id + * + * @return string Purchase id + */ + public function get_purchase_id() { + return $this->purchase_id; + } + + /** + * Set the purchase id + * AN..max16 (AN = Alphanumeric, free text) + * + * @param string $purchase_id Purchase ID. + */ + public function set_purchase_id( $purchase_id ) { + $this->purchase_id = substr( $purchase_id, 0, 16 ); + } + + /** + * Get the language + * + * @return string Language + */ + public function get_language() { + return $this->language; + } + + /** + * Set the language + * + * @param string $language Language. + */ + public function set_language( $language ) { + $this->language = $language; + } + + /** + * Get the description + * + * @return string Description + */ + public function get_description() { + return $this->description; + } + + /** + * Set the description + * AN..max32 (AN = Alphanumeric, free text) + * + * @param string $description Description. + */ + public function set_description( $description ) { + $this->description = DataHelper::an32( $description ); + } + + /** + * Get the currency + * + * @return string Currency + */ + public function get_currency() { + return $this->currency; + } + + /** + * Set the currency + * + * @param string $currency Currency. + */ + public function set_currency( $currency ) { + $this->currency = $currency; + } + + /** + * Get the payment type + * + * @return string Payment type + */ + public function get_payment_type() { + return $this->payment_type; + } + + /** + * Set the payment type + * AN..max10 + * + * @param string $payment_type Payment type. + */ + public function set_payment_type( $payment_type ) { + $this->payment_type = $payment_type; + } + + /** + * Get the expire date + * + * @param boolean $create_new Indicator for creating a new expire date. + * + * @return DateTime + */ + public function get_expire_date( $create_new = false ) { + if ( null === $this->expire_date || $create_new ) { + $this->expire_date = new DateTime( null, new DateTimeZone( Plugin::TIMEZONE ) ); + $this->expire_date->modify( $this->expire_date_modifier ); + } + + return $this->expire_date; + } + + /** + * Get the expire date format + * + * @return string the expire date format + */ + public function get_expire_date_format() { + return $this->expire_date_format; + } + + /** + * Set the expire date formnat + * + * @param string $expire_date_format Expire date format. + */ + public function set_expire_date_format( $expire_date_format ) { + $this->expire_date_format = $expire_date_format; + } + + /** + * Get the expire date modifier + * + * @return string Expire date modifier + */ + public function get_expire_date_modifier() { + return $this->expire_date_modifier; + } + + /** + * Set the expire date modifier + * + * @param string $expire_date_modifier Expire date modifier. + */ + public function set_expire_date_modifier( $expire_date_modifier ) { + $this->expire_date_modifier = $expire_date_modifier; + } + + /** + * Set the expire date + * + * @param DateTime $date Expire date. + */ + public function set_expire_date( DateTime $date ) { + $this->expire_date = $date; + } + + /** + * Get the forbidden characters + * + * @return array + */ + public function get_forbidden_characters() { + return $this->forbidden_characters; + } + + /** + * Set the forbidden characters + * + * @param mixed $characters Array or string with forbidden characters. + * + * @throws InvalidArgumentException Passed characters is not an array or string. + */ + public function set_forbidden_characters( $characters ) { + if ( ! is_array( $characters ) && ! is_string( $characters ) ) { + throw new InvalidArgumentException( 'Invalid characters argument.' ); + } + + if ( is_string( $characters ) ) { + $characters = str_split( $characters ); + } + + $this->forbidden_characters = $characters; + } + + /** + * Get the success URL + * + * @return string URL + */ + public function get_success_url() { + return $this->success_url; + } + + /** + * Set the success URL + * + * @param string $url Success URL. + */ + public function set_success_url( $url ) { + $this->success_url = $url; + } + + /** + * Get the cancel URL + * + * @return string Cancel URL + */ + public function get_cancel_url() { + return $this->cancel_url; + } + + /** + * Set the cancel URL + * + * @param string $url Cancel URL. + */ + public function set_cancel_url( $url ) { + $this->cancel_url = $url; + } + + /** + * Get the error URL + * + * @return string Error URL + */ + public function get_error_url() { + return $this->error_url; + } + + /** + * Set the error URL + * + * @param string $url Error URL. + */ + public function set_error_url( $url ) { + $this->error_url = $url; + } + + /** + * Get the items + * + * @return Items + */ + public function get_items() { + return $this->items; + } + + /** + * Set the items + * + * @param Items $items Items. + */ + public function set_items( Items $items ) { + $this->items = $items; + } + + /** + * Calculate the total amount of all items + * + * @return Money + */ + public function get_amount() { + return $this->items->get_amount(); + } + + /** + * Create hash string + */ + public function create_hash_string() { + $string = array(); + + // SHA1 hashcode, used only with the hashcode approach (Chapter 4). + $string[] = $this->get_hash_key(); + + // Your AcceptorID is provided in the registration process, also known as merchant id. + $string[] = $this->get_merchant_id(); + + // Provided in the registration process, value is normally '0' (zero). + $string[] = $this->get_sub_id(); + + // Total amount of transaction. + $string[] = intval( $this->get_amount()->get_cents() ); + + // The online shop's unique order number, also known as purchase id. + $string[] = $this->get_purchase_id(); + + // ?? Fixed value = ideal + $string[] = $this->get_payment_type(); + + // yyyy-MMddTHH:mm:ss.SSS Z Time at which the transaction expires (maximum of 1 hour later). + // The consumer has time until then to pay with iDEAL. + $string[] = $this->get_expire_date()->format( $this->get_expire_date_format() ); + + // Iterate through the items and concat. + foreach ( $this->get_items() as $item ) { + // Article number. is 1 for the first product, 2 for the second, etc. + // N.B. Note that for every product type the parameters + // itemNumber, itemDescription, itemQuantity and itemPrice are mandatory. + $string[] = $item->get_number(); + + // Description of article . + $string[] = $item->get_description(); + + // Number of items of article that the consumer wants to buy. + $string[] = $item->get_quantity(); + + // Price of article in whole eurocents. + $string[] = intval( $item->get_price()->get_cents() ); + } + + $concat_string = implode( '', $string ); + + // The characters "\t", "\n", "\r", " " (spaces) may not exist in the string. + $forbidden_characters = $this->get_forbidden_characters(); + $concat_string = str_replace( $forbidden_characters, '', $concat_string ); + + // Delete special HTML entities. + $concat_string = html_entity_decode( $concat_string, ENT_COMPAT, 'UTF-8' ); + + return $concat_string; + } + + /** + * Create hash + * + * @return string Hash + */ + public function create_hash() { + return sha1( $this->create_hash_string() ); + } + + /** + * Get the iDEAL HTML fields + * + * @since 1.1.1 + * @return array + */ + public function get_fields() { + $fields = array(); + + $fields['merchantID'] = $this->get_merchant_id(); + $fields['subID'] = $this->get_sub_id(); + + $fields['amount'] = intval( $this->get_amount()->get_cents() ); + $fields['purchaseID'] = $this->get_purchase_id(); + $fields['language'] = $this->get_language(); + $fields['currency'] = $this->get_currency(); + $fields['description'] = $this->get_description(); + $fields['hash'] = $this->create_hash(); + $fields['paymentType'] = $this->get_payment_type(); + $fields['validUntil'] = $this->get_expire_date()->format( $this->get_expire_date_format() ); + + $serial_number = 1; + foreach ( $this->get_items() as $item ) { + $fields[ 'itemNumber' . $serial_number ] = $item->get_number(); + $fields[ 'itemDescription' . $serial_number ] = $item->get_description(); + $fields[ 'itemQuantity' . $serial_number ] = $item->get_quantity(); + $fields[ 'itemPrice' . $serial_number ] = intval( $item->get_price()->get_cents() ); + + $serial_number ++; + } + + $fields['urlCancel'] = $this->get_cancel_url(); + $fields['urlSuccess'] = $this->get_success_url(); + $fields['urlError'] = $this->get_error_url(); + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Config.php new file mode 100644 index 00000000..7c415bc2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Config.php @@ -0,0 +1,31 @@ +url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/DataHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/DataHelper.php new file mode 100644 index 00000000..1aefb654 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/DataHelper.php @@ -0,0 +1,119 @@ + Naast A-Z, a-z en 0-9 is alleen de spatie nog een geaccepteerd teken binnen AN. + * > + * > Andere karakters zijn niet toegestaan. Het is met name belangrijk dat er geen html tags in voorkomen.: + * + * @var array + */ + private static $characters_an = array( 'A-Z', 'a-z', '0-9', ' ' ); + + /** + * Strictly alphanumerical (letters and numbers only) + * + * @var array + */ + private static $characters_ans = array( 'A-Z', 'a-z', '0-9' ); + + /** + * Numerical + * + * @var array + */ + private static $characters_n = array( '0-9' ); + + /** + * Filter the specified characters from the string + * + * @param array $characters + * @param string $string + * @param int $max + * + * @return string + */ + private static function filter( array $characters, $string, $max = null ) { + $pattern = '#[^' . implode( $characters ) . ']#'; + + $string = preg_replace( $pattern, '', $string ); + + if ( isset( $max ) ) { + $string = substr( $string, 0, $max ); + } + + return $string; + } + + /** + * Alphanumerical, free text + * + * @param string $string + * @param string $max + * + * @return string + */ + public static function an( $string, $max = null ) { + return self::filter( self::$characters_an, $string, $max ); + } + + public static function an16( $string ) { + return self::an( $string, 16 ); + } + + public static function an32( $string ) { + return self::an( $string, 32 ); + } + + /** + * Strictly alphanumerical (letters and numbers only) + * + * @param string $string + * @param string $max + * + * @return string + */ + public static function ans( $string, $max = null ) { + return self::filter( self::$characters_ans, $string, $max ); + } + + public static function ans16( $string ) { + return self::ans( $string, 16 ); + } + + public static function ans32( $string ) { + return self::ans( $string, 32 ); + } + + /** + * Strictly alphanumerical (numbers only) + * + * @param string $string + * @param string $max + * + * @return string + */ + public static function n( $string, $max = null ) { + return self::filter( self::$characters_n, $string, $max ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Gateway.php new file mode 100644 index 00000000..1ee2179f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Gateway.php @@ -0,0 +1,124 @@ +set_method( self::METHOD_HTML_FORM ); + + // Supported features. + $this->supports = array(); + + // Client. + $this->client = new Client(); + + $this->client->set_payment_server_url( $config->get_payment_server_url() ); + $this->client->set_merchant_id( $config->merchant_id ); + $this->client->set_sub_id( $config->sub_id ); + $this->client->set_hash_key( $config->hash_key ); + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::IDEAL, + ); + } + + /** + * Start an transaction with the specified data + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + $payment->set_action_url( $this->client->get_payment_server_url() ); + + // Purchase ID. + $purchase_id = $payment->format_string( $this->config->purchase_id ); + + $payment->set_meta( 'purchase_id', $purchase_id ); + } + + /** + * Get output HTML + * + * @param Payment $payment Payment. + * + * @return array + * @since 1.1.1 + * @version 2.0.5 + */ + public function get_output_fields( Payment $payment ) { + // General. + $this->client->set_currency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() ); + $this->client->set_purchase_id( (string) $payment->get_meta( 'purchase_id' ) ); + $this->client->set_description( $payment->get_description() ); + + if ( null !== $payment->get_customer() ) { + $this->client->set_language( $payment->get_customer()->get_language() ); + } + + // Items. + $items = new Items(); + + $items->add_item( new Item( 1, $payment->get_description(), 1, $payment->get_total_amount() ) ); + + $this->client->set_items( $items ); + + // URLs. + $this->client->set_cancel_url( add_query_arg( 'status', Statuses::CANCELLED, $payment->get_return_url() ) ); + $this->client->set_success_url( add_query_arg( 'status', Statuses::SUCCESS, $payment->get_return_url() ) ); + $this->client->set_error_url( add_query_arg( 'status', Statuses::FAILURE, $payment->get_return_url() ) ); + + return $this->client->get_fields(); + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + if ( ! filter_has_var( INPUT_GET, 'status' ) ) { + return; + } + + $status = filter_input( INPUT_GET, 'status', FILTER_SANITIZE_STRING ); + + // Update payment status. + $payment->set_status( $status ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Integration.php new file mode 100644 index 00000000..07777246 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Integration.php @@ -0,0 +1,130 @@ + 'ideal-basic', + 'name' => 'iDEAL Basic', + 'url' => \__( 'https://www.ideal.nl/en/', 'pronamic_ideal' ), + 'product_url' => \__( 'https://www.ideal.nl/en/', 'pronamic_ideal' ), + 'manual_url' => null, + 'dashboard_url' => null, + 'provider' => null, + 'acquirer_url' => null, + 'acquirer_test_url' => null, + 'deprecated' => false, + 'supports' => array( + 'webhook', + 'webhook_log', + ), + ) + ); + + parent::__construct( $args ); + + // Acquirer URL. + $this->acquirer_url = $args['acquirer_url']; + $this->acquirer_test_url = $args['acquirer_test_url']; + + // Actions. + $function = array( __NAMESPACE__ . '\Listener', 'listen' ); + + if ( ! has_action( 'wp_loaded', $function ) ) { + add_action( 'wp_loaded', $function ); + } + } + + public function get_settings_fields() { + $fields = parent::get_settings_fields(); + + // Hash Key + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ideal_hash_key', + 'title' => __( 'Hash Key', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Hash key (also known as: key or secret key) as mentioned in the payment provider dashboard.', 'pronamic_ideal' ), + 'methods' => array( 'ideal-basic' ), + ); + + // XML Notification URL. + $fields[] = array( + 'section' => 'feedback', + /* translators: Translate 'XML notification URL' the same as in the iDEAL Basic dashboard. */ + 'title' => _x( 'XML Notification URL', 'iDEAL Basic dashboard', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'value' => add_query_arg( + array( + 'gateway' => 'IDealBasic', + 'xml_notification' => 'true', + ), + site_url( '/' ) + ), + 'methods' => array( 'ideal-basic' ), + 'readonly' => true, + 'size' => 200, + /* translators: Translate 'XML notification URL' the same as in the iDEAL Basic dashboard. */ + 'tooltip' => _x( + 'Copy the XML notification URL to the payment provider dashboard to receive automatic transaction status updates.', + 'iDEAL Basic dashboard', + 'pronamic_ideal' + ), + ); + + // Return fields. + return $fields; + } + + public function get_config( $post_id ) { + $mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + + $config = new Config(); + + $config->url = $this->acquirer_url; + + if ( 'test' === $mode && null !== $this->acquirer_test_url ) { + $config->url = $this->acquirer_test_url; + } + + $config->merchant_id = get_post_meta( $post_id, '_pronamic_gateway_ideal_merchant_id', true ); + $config->sub_id = get_post_meta( $post_id, '_pronamic_gateway_ideal_sub_id', true ); + $config->hash_key = get_post_meta( $post_id, '_pronamic_gateway_ideal_hash_key', true ); + $config->purchase_id = get_post_meta( $post_id, '_pronamic_gateway_ideal_purchase_id', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Item.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Item.php new file mode 100644 index 00000000..c3ce6907 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Item.php @@ -0,0 +1,100 @@ +number = $number; + $this->description = $description; + $this->quantity = $quantity; + $this->price = $price; + } + + /** + * Get the number / identifier of this item + * + * @return string + */ + public function get_number() { + return $this->number; + } + + /** + * Get the description of this item + * + * @return string + */ + public function get_description() { + return $this->description; + } + + /** + * Get the quantity of this item + * + * @return int + */ + public function get_quantity() { + return $this->quantity; + } + + /** + * Get the price of this item + * + * @return Money + */ + public function get_price() { + return $this->price; + } + + /** + * Get the amount + * + * @return float + */ + public function get_amount() { + return $this->price->get_value() * $this->quantity; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Items.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Items.php new file mode 100644 index 00000000..40ab3457 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Items.php @@ -0,0 +1,77 @@ +items = array(); + } + + /** + * Get iterator + * + * @see IteratorAggregate::getIterator() + */ + // @codingStandardsIgnoreStart + // Function name "getIterator" is in camel caps format, try 'get_iterator' + public function getIterator() { + // @codingStandardsIgnoreEnd + return new ArrayIterator( $this->items ); + } + + /** + * Add item + * + * @param Item $item Item. + */ + public function add_item( Item $item ) { + $this->items[] = $item; + } + + /** + * Calculate the total amount of all items + */ + public function get_amount() { + $amount = 0; + + $use_bcmath = extension_loaded( 'bcmath' ); + + foreach ( $this->items as $item ) { + if ( $use_bcmath ) { + // Use non-locale aware float value. + // @link http://php.net/sprintf. + $item_amount = sprintf( '%F', $item->get_amount() ); + + $amount = bcadd( $amount, $item_amount, 8 ); + } else { + $amount += $item->get_amount(); + } + } + + return new Money( $amount ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Listener.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Listener.php new file mode 100644 index 00000000..c8592132 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Listener.php @@ -0,0 +1,52 @@ +get_purchase_id() ); + + if ( null !== $payment ) { + // Add note. + $note = sprintf( + /* translators: %s: payment provider name */ + __( 'Webhook requested by %s.', 'pronamic_ideal' ), + __( 'iDEAL Basic', 'pronamic_ideal' ) + ); + + $payment->add_note( $note ); + + $payment->set_status( $notification->get_status() ); + $payment->set_transaction_id( $notification->get_transaction_id() ); + + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Notification.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Notification.php new file mode 100644 index 00000000..993fe466 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Notification.php @@ -0,0 +1,124 @@ +date; + } + + /** + * Set the date of this notification + * + * @param DateTime $date + */ + public function set_date( DateTime $date ) { + $this->date = $date; + } + + /** + * Get the transaction ID + * + * @return string + */ + public function get_transaction_id() { + return $this->transaction_id; + } + + /** + * Set the transaction ID + * + * @param string $transaction_id + */ + public function set_transaction_id( $transaction_id ) { + $this->transaction_id = $transaction_id; + } + + /** + * Get the purchase ID + * + * @return string + */ + public function get_purchase_id() { + return $this->purchase_id; + } + + /** + * Set the purchase ID + * + * @param string $purchase_id + */ + public function set_purchase_id( $purchase_id ) { + $this->purchase_id = $purchase_id; + } + + /** + * Get the status + * + * @return string + */ + public function get_status() { + return $this->status; + } + + /** + * Set the status + * + * @param string $status + */ + public function set_status( $status ) { + $this->status = $status; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Util.php new file mode 100644 index 00000000..01d47b3d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal-basic/src/Util.php @@ -0,0 +1,38 @@ +createDateTimeStamp ) { + $notification->set_date( new DateTime( Security::filter( $xml->createDateTimeStamp ) ) ); + } + + if ( $xml->transactionID ) { + $notification->set_transaction_id( Security::filter( $xml->transactionID ) ); + } + + if ( $xml->purchaseID ) { + $notification->set_purchase_id( Security::filter( $xml->purchaseID ) ); + } + + if ( $xml->status ) { + $notification->set_status( Security::filter( $xml->status ) ); + } + + return $notification; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php new file mode 100644 index 00000000..3c2a7a0d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal/src/AbstractIntegration.php @@ -0,0 +1,91 @@ + 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ideal_merchant_id', + 'title' => __( 'Merchant ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => sprintf( + '%s %s.', + __( 'Merchant ID (or Acceptant ID)', 'pronamic_ideal' ), + __( 'as mentioned in the payment provider dashboard', 'pronamic_ideal' ) + ), + ); + + // Sub ID + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ideal_sub_id', + 'name' => 'subId', + 'id' => 'pronamic_ideal_sub_id', + 'title' => __( 'Sub ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'small-text', 'code' ), + 'default' => '0', + 'description' => sprintf( + /* translators: %s: 0 */ + __( 'Default: %s', 'pronamic_ideal' ), + 0 + ), + 'tooltip' => sprintf( + '%s %s.', + __( 'Sub ID', 'pronamic_ideal' ), + __( 'as mentioned in the payment provider dashboard', 'pronamic_ideal' ) + ), + ); + + // Purchase ID + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ideal_purchase_id', + 'title' => __( 'Purchase ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: purchaseID */ + __( 'The iDEAL %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'purchaseID' ) + ), + 'description' => sprintf( + '%s %s
    %s', + __( 'Available tags:', 'pronamic_ideal' ), + sprintf( + '%s %s', + '{order_id}', + '{payment_id}' + ), + sprintf( + /* translators: %s: {payment_id} */ + __( 'Default: %s', 'pronamic_ideal' ), + '{payment_id}' + ) + ), + ); + + // Return fields + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal/src/Statuses.php new file mode 100644 index 00000000..d0932986 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ideal/src/Statuses.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use WP_Error; + +/** + * Title: ING Kassa Compleet client + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class Client { + /** + * ING Kasse Compleet API endpoint URL + * + * @var string url + */ + const API_URL = 'https://api.kassacompleet.nl/v1/'; + + /** + * API Key + * + * @var string + */ + private $api_key; + + /** + * Error + * + * @var WP_Error + */ + private $error; + + /** + * Constructs and initalize an ING Kassa Compleet client object + * + * @param string $api_key API key. + */ + public function __construct( $api_key ) { + $this->api_key = $api_key; + } + + /** + * Error + * + * @return WP_Error + */ + public function get_error() { + return $this->error; + } + + /** + * Send request with the specified action and parameters + * + * @param string $endpoint API endpoint. + * @param string $method HTTP method to use for request. + * @param array $data Data to send. + * + * @return array|WP_Error + */ + private function send_request( $endpoint, $method = 'POST', array $data = array() ) { + $url = self::API_URL . $endpoint; + + $headers = array( + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + 'Authorization' => 'Basic ' . base64_encode( $this->api_key . ':' ), + ); + + if ( is_array( $data ) && ! empty( $data ) ) { + $data = wp_json_encode( $data ); + + $headers['Content-Type'] = 'application/json'; + } + + $return = wp_remote_request( + $url, + array( + 'method' => $method, + 'headers' => $headers, + 'body' => $data, + ) + ); + + return $return; + } + + /** + * Create order. + * + * @param OrderRequest $request Order request. + * + * @return array|mixed|object|null + */ + public function create_order( OrderRequest $request ) { + $result = null; + + $data = $request->get_array(); + + $response = $this->send_request( 'orders/', 'POST', $data ); + + if ( $response instanceof WP_Error ) { + $this->error = $response; + + return $result; + } + + $response_code = wp_remote_retrieve_response_code( $response ); + + $body = wp_remote_retrieve_body( $response ); + + // NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit. + $ing_result = json_decode( $body ); + + if ( 201 === $response_code ) { + if ( $ing_result && 'error' === $ing_result->status ) { + $error_msg = $ing_result->transactions[0]->reason; + $error = $ing_result->transactions[0]; + } else { + $result = $ing_result; + } + } else { + $error_msg = ''; + $error = ''; + + if ( $ing_result ) { + $error_msg = $ing_result->error->value; + $error = $ing_result->error; + } + + if ( 401 === $response_code ) { + // The default error message for an unauthorized API call does not mention the API key in any way. + $error_msg .= ' Please check the API key.'; + } + } + + if ( isset( $error_msg, $error ) ) { + $this->error = new WP_Error( 'ing_kassa_compleet_error', $error_msg, $error ); + } + + return $result; + } + + /** + * Get order. + * + * @param string $order_id Order ID. + * + * @return array|mixed|object|null + */ + public function get_order( $order_id ) { + $result = null; + + $response = $this->send_request( 'orders/' . $order_id . '/', 'GET' ); + + if ( $response instanceof WP_Error ) { + $this->error = $response; + + return $result; + } + + $response_code = wp_remote_retrieve_response_code( $response ); + + if ( 200 === $response_code ) { + $body = wp_remote_retrieve_body( $response ); + + // NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit. + $result = json_decode( $body ); + } + + return $result; + } + + /** + * Get issuers. + * + * @return array|bool + */ + public function get_issuers() { + $issuers = false; + + $response = $this->send_request( 'ideal/issuers/', 'GET' ); + + if ( $response instanceof WP_Error ) { + $this->error = $response; + + return $issuers; + } + + $response_code = wp_remote_retrieve_response_code( $response ); + + if ( 200 === $response_code ) { + $body = wp_remote_retrieve_body( $response ); + + // NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit. + $result = json_decode( $body ); + + if ( null !== $result ) { + $issuers = array(); + + foreach ( $result as $issuer ) { + $id = Security::filter( $issuer->id ); + $name = Security::filter( $issuer->name ); + + $issuers[ $id ] = $name; + } + } + } else { + $body = wp_remote_retrieve_body( $response ); + + $ing_result = json_decode( $body ); + + $error_msg = $ing_result->error->value; + + if ( 401 === $response_code ) { + // An unauthorized API call has nothing to do with the browser of the user in our case, remove to prevent confusion. + $error_msg = str_replace( "You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.", '', $error_msg ); + + // The default error message for an unauthorized API call does not mention the API key in any way. + $error_msg .= ' Please check the API key.'; + } + + $this->error = new WP_Error( 'ing_kassa_compleet_error', $error_msg, $ing_result->error ); + } + + return $issuers; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Config.php new file mode 100644 index 00000000..1e63f5e3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Config.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Title: ING Kassa Compleet config + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.0 + */ +class Config extends GatewayConfig { + /** + * Api key. + * + * @var string + */ + public $api_key; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Gateway.php new file mode 100644 index 00000000..4493caed --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Gateway.php @@ -0,0 +1,203 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods as Core_PaymentMethods; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Title: ING Kassa Compleet + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class Gateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + protected $client; + + /** + * Constructs and initializes an ING Kassa Compleet gateway + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $this->client = new Client( $config->api_key ); + } + + /** + * Get issuers + * + * @see Core_Gateway::get_issuers() + */ + public function get_issuers() { + $groups = array(); + + $result = $this->client->get_issuers(); + + if ( is_array( $result ) ) { + $groups[] = array( + 'options' => $result, + ); + } + + $error = $this->client->get_error(); + + if ( is_wp_error( $error ) ) { + $this->error = $error; + } + + return $groups; + } + + /** + * Get supported payment methods + * + * @see Core_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + Core_PaymentMethods::BANCONTACT, + Core_PaymentMethods::BANK_TRANSFER, + Core_PaymentMethods::CREDIT_CARD, + Core_PaymentMethods::IDEAL, + Core_PaymentMethods::PAYCONIQ, + Core_PaymentMethods::PAYPAL, + Core_PaymentMethods::SOFORT, + ); + } + + /** + * Start + * + * @param Payment $payment Payment. + * + * @see Core_Gateway::start() + */ + public function start( Payment $payment ) { + $request = new OrderRequest(); + + $request->currency = $payment->get_total_amount()->get_currency()->get_alphabetic_code(); + $request->amount = $payment->get_total_amount()->get_cents(); + $request->merchant_order_id = $payment->get_order_id(); + $request->description = $payment->get_description(); + $request->return_url = $payment->get_return_url(); + + // To make the 'Test' meta box work, set payment method to iDEAL if an issuer_id has been set. + $issuer = $payment->get_issuer(); + + $payment_method = $payment->get_method(); + + if ( Core_PaymentMethods::IDEAL === $payment_method ) { + $request->issuer = $issuer; + } + + $request->method = PaymentMethods::transform( $payment_method ); + + $order = $this->client->create_order( $request ); + + if ( $order ) { + $payment->set_transaction_id( $order->id ); + + // Set action URL to order pay URL. + if ( isset( $order->order_url ) ) { + $payment->set_action_url( $order->order_url ); + } + + // Set action URL to transction payment URL (only if payment method is set). + if ( isset( $order->transactions[0]->payment_url ) ) { + $payment->set_action_url( $order->transactions[0]->payment_url ); + } + + // Bank transfer instructions. + if ( Core_PaymentMethods::BANK_TRANSFER === $payment_method && isset( $order->transactions[0]->id ) ) { + $payment->set_action_url( + \sprintf( + 'https://api.kassacompleet.nl/pay/%s/completed/', + esc_html( $order->transactions[0]->id ) + ) + ); + } + } + + $error = $this->client->get_error(); + + if ( is_wp_error( $error ) ) { + $this->error = $error; + } + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $transaction_id = $payment->get_transaction_id(); + + if ( empty( $transaction_id ) ) { + return; + } + + $order = $this->client->get_order( $transaction_id ); + + if ( ! is_object( $order ) ) { + return; + } + + $payment->set_status( Statuses::transform( $order->status ) ); + + if ( isset( $order->transactions[0]->payment_method_details ) ) { + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + } + + $details = $order->transactions[0]->payment_method_details; + + if ( isset( $details->consumer_name ) ) { + $consumer_bank_details->set_name( $details->consumer_name ); + } + + if ( isset( $details->consumer_iban ) ) { + $consumer_bank_details->set_iban( $details->consumer_iban ); + } + } + + $error = $this->client->get_error(); + + if ( is_wp_error( $error ) ) { + $this->error = $error; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php new file mode 100644 index 00000000..f6181dac --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Integration.php @@ -0,0 +1,128 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; + +/** + * Title: ING Kassa Compleet integration + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class Integration extends AbstractGatewayIntegration { + /** + * Construct ING Kassa Compleet integration. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'id' => 'ing-kassa-compleet', + 'name' => 'ING - Kassa Compleet', + 'provider' => 'ing', + 'product_url' => 'https://www.ing.nl/zakelijk/betalen/geld-ontvangen/kassa-compleet/', + 'dashboard_url' => 'https://portal.kassacompleet.nl/', + 'supports' => array( + 'payment_status_request', + 'webhook', + 'webhook_log', + ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-ing-kassa-compleet-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + + // Actions. + $function = array( __NAMESPACE__ . '\Listener', 'listen' ); + + if ( ! has_action( 'wp_loaded', $function ) ) { + add_action( 'wp_loaded', $function ); + } + } + + /** + * Get settings fields. + * + * @return array + */ + public function get_settings_fields() { + $fields = array(); + + // API Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ing_kassa_compleet_api_key', + 'title' => _x( 'API Key', 'ing_kassa_compleet', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + '%s %s.', + __( 'API key', 'pronamic_ideal' ), + sprintf( + /* translators: %s: ING Kassa Compleet */ + __( 'as mentioned in the %s dashboard', 'pronamic_ideal' ), + __( 'ING Kassa Compleet', 'pronamic_ideal' ) + ) + ), + ); + + // Webhook URL. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Webhook URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + 'value' => add_query_arg( 'ing_kassa_compleet_webhook', '', home_url( '/' ) ), + 'readonly' => true, + 'tooltip' => sprintf( + /* translators: %s: ING Kassa Compleet */ + __( 'Copy the Webhook URL to the %s dashboard to receive automatic transaction status updates.', 'pronamic_ideal' ), + __( 'ING Kassa Compleet', 'pronamic_ideal' ) + ), + ); + + return $fields; + } + /** + * Get config with specified post ID. + * + * @param int $post_id Post ID. + * + * @return Config|null + */ + public function get_config( $post_id ) { + $config = new Config(); + + $config->api_key = $this->get_meta( $post_id, 'ing_kassa_compleet_api_key' ); + $config->mode = $this->get_meta( $post_id, 'mode' ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php new file mode 100644 index 00000000..da8286fd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Listener.php @@ -0,0 +1,59 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * Title: ING Kassa Compleet listener + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.0.1 + */ +class Listener { + /** + * Listen to ING Kassa Compleet webhook requests. + */ + public static function listen() { + if ( ! filter_has_var( INPUT_GET, 'ing_kassa_compleet_webhook' ) ) { + return; + } + + $data = json_decode( file_get_contents( 'php://input' ) ); + + if ( is_object( $data ) && isset( $data->order_id ) ) { + $payment = get_pronamic_payment_by_transaction_id( $data->order_id ); + + if ( null === $payment ) { + return; + } + + // Add note. + $note = sprintf( + /* translators: %s: ING */ + __( 'Webhook requested by %s.', 'pronamic_ideal' ), + __( 'ING', 'pronamic_ideal' ) + ); + + $payment->add_note( $note ); + + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment, false ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/OrderRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/OrderRequest.php new file mode 100644 index 00000000..b3565258 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/OrderRequest.php @@ -0,0 +1,113 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +/** + * Title: ING Kassa Compleet order request + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class OrderRequest { + /** + * Amount in cents + * + * @var float + */ + public $amount; + + /** + * ISO 4217 currency code + * + * @link https://en.wikipedia.org/wiki/ISO_4217 + * + * @var string + */ + public $currency; + + /** + * Issuer. + * + * @var string + */ + public $issuer; + + /** + * Method. + * + * @var string + */ + public $method; + + /** + * Merchant order ID. + * + * @var string + */ + public $merchant_order_id; + + /** + * Description. + * + * @var string + */ + public $description; + + /** + * Return URL. + * + * @var string + */ + public $return_url; + + /** + * Get array. + * + * @return array + */ + public function get_array() { + $array = array( + 'amount' => $this->amount, + 'currency' => $this->currency, + 'description' => $this->description, + 'return_url' => $this->return_url, + 'transactions' => array(), + ); + + // Array filter will remove values NULL, FALSE and empty strings (''). + $array = array_filter( $array ); + + if ( null !== $this->method ) { + // Add payment method. + $payment_method = array( + 'payment_method' => $this->method, + ); + + // Add payment method details. + switch ( $this->method ) { + case PaymentMethods::IDEAL: + $payment_method['payment_method_details'] = array( + 'issuer_id' => $this->issuer, + ); + + break; + } + + $array['transactions'] = array( $payment_method ); + } + + return $array; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/PaymentMethods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/PaymentMethods.php new file mode 100644 index 00000000..224e2967 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/PaymentMethods.php @@ -0,0 +1,125 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\Core\PaymentMethods as Core_PaymentMethods; + +/** + * Title: ING Kassa Compleet payment methods + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class PaymentMethods { + /** + * Constant for the Bancontact method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-psp/tags/1.0/ing-php/src/Order/Transaction/PaymentMethod.php#L11 + * @var string + */ + const BANCONTACT = 'bancontact'; + + /** + * Constant for the Banktransfer method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-kassa-compleet/tags/1.0.6/ingkassacompleet.php#L339 + * @var string + */ + const BANK_TRANSFER = 'bank-transfer'; + + /** + * Constant for the Cash on Delivery method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-kassa-compleet/tags/1.0.6/ingkassacompleet.php#L463 + * @var string + */ + const CASH_ON_DELIVERY = 'cash-on-delivery'; + + /** + * Constant for the CreditCard method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-kassa-compleet/tags/1.0.6/ingkassacompleet.php#L219 + * @var string + */ + const CREDIT_CARD = 'credit-card'; + + /** + * Constant for the iDEAL payment method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-kassa-compleet/tags/1.0.6/ingkassacompleet.php#L109 + * @var string + */ + const IDEAL = 'ideal'; + + /** + * Constant for the Payconiq method. + * + * @var string + */ + const PAYCONIQ = 'payconiq'; + + /** + * Constant for the PayPal method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-psp/tags/1.2/ing-php/src/Order/Transaction/PaymentMethod.php#L21 + * @var string + */ + const PAYPAL = 'paypal'; + + /** + * Constant for the SOFORT method. + * + * @link https://plugins.trac.wordpress.org/browser/ing-psp/tags/1.0/ing-php/src/Order/Transaction/PaymentMethod.php#L11 + * @var string + */ + const SOFORT = 'sofort'; + + /** + * Transform WordPress payment method to ING Kassa Compleet method. + * + * @since 1.0.5 + * + * @param string $payment_method WordPress payment method. + * + * @return string + */ + public static function transform( $payment_method ) { + switch ( $payment_method ) { + case Core_PaymentMethods::BANCONTACT: + return self::BANCONTACT; + + case Core_PaymentMethods::BANK_TRANSFER: + return self::BANK_TRANSFER; + + case Core_PaymentMethods::CREDIT_CARD: + return self::CREDIT_CARD; + + case Core_PaymentMethods::IDEAL: + return self::IDEAL; + + case Core_PaymentMethods::PAYCONIQ: + return self::PAYCONIQ; + + case Core_PaymentMethods::PAYPAL: + return self::PAYPAL; + + case Core_PaymentMethods::SOFORT: + return self::SOFORT; + + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Statuses.php new file mode 100644 index 00000000..e71c9e85 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ing-kassa-compleet/src/Statuses.php @@ -0,0 +1,97 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet + */ + +namespace Pronamic\WordPress\Pay\Gateways\ING\KassaCompleet; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_Statuses; + +/** + * Title: ING Kassa Compleet statuses constants + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.3 + * @since 1.0.0 + */ +class Statuses { + /** + * Completed + * + * @var string + */ + const COMPLETED = 'completed'; + + /** + * Error + * + * @since 1.0.5 + * @var string + */ + const ERROR = 'error'; + + /** + * Pending + * + * @var string + */ + const PENDING = 'pending'; + + /** + * Processing + * + * @var string + */ + const PROCESSING = 'processing'; + + // @todo verify cancelled status + /** + * Cancelled + * + * @var string + */ + const CANCELLED = 'cancelled'; + + /** + * Success + * + * @var string + */ + const SUCCESS = 'Success'; + + /** + * Transform an ING Kassa Compleet status to a global status + * + * @param string $status ING Kassa Compleet status to transform. + * + * @return string|null + */ + public static function transform( $status ) { + switch ( $status ) { + case self::ERROR: + return Core_Statuses::FAILURE; + + case self::PENDING: + case self::PROCESSING: + return Core_Statuses::OPEN; + + case self::CANCELLED: + return Core_Statuses::CANCELLED; + + case self::COMPLETED: + case self::SUCCESS: + return Core_Statuses::SUCCESS; + + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/dist/mollie-wp-admin-fresh-base.svgo-min.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/dist/mollie-wp-admin-fresh-base.svgo-min.svg new file mode 100644 index 00000000..5ffb4681 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/dist/mollie-wp-admin-fresh-base.svgo-min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/dist/mollie.min.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/dist/mollie.min.svg new file mode 100644 index 00000000..ef0204cf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/dist/mollie.min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/src/mollie-wp-admin-fresh-base.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/src/mollie-wp-admin-fresh-base.svg new file mode 100644 index 00000000..5ffb4681 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/src/mollie-wp-admin-fresh-base.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/src/mollie.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/src/mollie.svg new file mode 100644 index 00000000..c35c3310 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/images/src/mollie.svg @@ -0,0 +1,12 @@ + + + + icon + Created with Sketch. + + + + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/amount.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/amount.json new file mode 100644 index 00000000..e1ad1291 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/amount.json @@ -0,0 +1,18 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Mollie amount.", + "type": "object", + "required": [ + "currency", + "value" + ], + "properties": { + "currency": { + "type": "string" + }, + "value": { + "type": "string" + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/chargeback.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/chargeback.json new file mode 100644 index 00000000..89191046 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/chargeback.json @@ -0,0 +1,30 @@ +{ + "$id": "https://github.com/wp-pay-gateways/mollie/blob/master/json-schemas/chargeback.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Mollie chargeback.", + "type": "object", + "properties": { + "resource": { + "description": "Indicates the response contains a chargeback object. Will always contain chargeback for this endpoint.", + "type": "string", + "const": "chargeback" + }, + "id": { + "description": "The chargeback’s unique identifier.", + "type": "string" + }, + "amount": { + "$ref": "amount.json" + }, + "createdAt": { + "description": "The date and time the chargeback was issued, in ISO 8601 format.", + "type": "string" + } + }, + "required": [ + "resource", + "id", + "amount", + "createdAt" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/payment-details.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/payment-details.json new file mode 100644 index 00000000..d6373070 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/payment-details.json @@ -0,0 +1,8 @@ +{ + "$id": "https://github.com/wp-pay-gateways/mollie/blob/master/json-schemas/payment-details.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Mollie payment method specific details.", + "type": "object", + "properties": {}, + "required": [] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/payment.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/payment.json new file mode 100644 index 00000000..5625ee4a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/json-schemas/payment.json @@ -0,0 +1,70 @@ +{ + "$id": "https://github.com/wp-pay-gateways/mollie/blob/master/json-schemas/payment.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Mollie payment.", + "type": "object", + "properties": { + "resource": { + "description": "Indicates the response contains a payment object. Will always contain `payment` for this endpoint.", + "type": "string", + "const": "payment" + }, + "id": { + "description": "The identifier uniquely referring to this payment.", + "type": "string" + }, + "mode": { + "description": "The mode used to create this payment.", + "type": "string", + "enum": ["live", "test"] + }, + "createdAt": { + "description": "The payment’s date and time of creation, in ISO 8601 format.", + "type": "string" + }, + "status": { + "description": "The payment’s status.", + "type": "string" + }, + "profileId": { + "description": "The identifier referring to the profile this payment was created on.", + "type": "string" + }, + "customerId": { + "description": "If a customer was specified upon payment creation, the customer’s token will be available here as well.", + "type": "string" + }, + "sequenceType": { + "description": "Indicates which type of payment this is in a recurring sequence.", + "type": "string", + "enum": ["oneoff", "first", "recurring"] + }, + "mandateId": { + "description": "If the payment is a first or recurring payment, this field will hold the ID of the mandate.", + "type": "string" + }, + "_links": { + "type": "object" + }, + "details": { + "description": "If the payment has been created with a `method`, or if the customer selected a method in the payment method selection screen, a `details` object becomes available on the payment object. This object contains detail fields specific to the selected payment method.", + "type": "object" + } + }, + "required": [ + "resource", + "id", + "mode", + "createdAt", + "status", + "amount", + "description", + "redirectUrl", + "method", + "metadata", + "locale", + "profileId", + "sequenceType", + "_links" + ] +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Admin.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Admin.php new file mode 100644 index 00000000..9417a507 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Admin.php @@ -0,0 +1,314 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie admin + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.9 + * @since 1.0.0 + */ +class Admin { + /** + * Construct and intialize Mollie admin. + */ + public function __construct() { + /** + * Initialize. + */ + add_action( 'admin_init', array( $this, 'admin_init' ) ); + + /** + * Menu. + * + * @link https://metabox.io/create-hidden-admin-page/ + */ + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + + /** + * Meta boxes. + */ + add_action( 'add_meta_boxes', array( $this, 'add_payment_meta_box' ), 10, 2 ); + add_action( 'add_meta_boxes', array( $this, 'add_subscription_meta_box' ), 10, 2 ); + } + + /** + * Admin init. + * + * @return void + */ + public function admin_init() { + if ( ! \current_user_can( 'manage_options' ) ) { + return; + } + + $function = array( __CLASS__, 'user_profile' ); + + if ( ! has_action( 'show_user_profile', $function ) ) { + add_action( 'show_user_profile', $function ); + } + + if ( ! has_action( 'edit_user_profile', $function ) ) { + add_action( 'edit_user_profile', $function ); + } + } + + /** + * Get menu icon URL. + * + * @link https://developer.wordpress.org/reference/functions/add_menu_page/ + * @return string + * @throws \Exception Throws exception when retrieving menu icon fails. + */ + private function get_menu_icon_url() { + /** + * Icon URL. + * + * Pass a base64-encoded SVG using a data URI, which will be colored to match the color scheme. + * This should begin with 'data:image/svg+xml;base64,'. + * + * We use a SVG image with default fill color #A0A5AA from the default admin color scheme: + * https://github.com/WordPress/WordPress/blob/5.2/wp-includes/general-template.php#L4135-L4145 + * + * The advantage of this is that users with the default admin color scheme do not see the repaint: + * https://github.com/WordPress/WordPress/blob/5.2/wp-admin/js/svg-painter.js + * + * @link https://developer.wordpress.org/reference/functions/add_menu_page/ + */ + $file = __DIR__ . '/../images/dist/mollie-wp-admin-fresh-base.svgo-min.svg'; + + if ( ! \is_readable( $file ) ) { + throw new \Exception( + \sprintf( + 'Could not read WordPress admin menu icon from file: %s.', + $file + ) + ); + } + + $svg = \file_get_contents( $file, true ); + + if ( false === $svg ) { + throw new \Exception( + \sprintf( + 'Could not read WordPress admin menu icon from file: %s.', + $file + ) + ); + } + + $icon_url = \sprintf( + 'data:image/svg+xml;base64,%s', + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + \base64_encode( $svg ) + ); + + return $icon_url; + } + + /** + * Admin menu. + * + * @return void + */ + public function admin_menu() { + try { + $menu_icon_url = $this->get_menu_icon_url(); + } catch ( \Exception $e ) { + // @todo Log. + + /** + * If retrieving the menu icon URL fails we will + * fallback to the WordPress money dashicon. + * + * @link https://developer.wordpress.org/resource/dashicons/#money + */ + $menu_icon_url = 'dashicons-money'; + } + + add_menu_page( + __( 'Mollie', 'pronamic_ideal' ), + __( 'Mollie', 'pronamic_ideal' ), + 'manage_options', + 'pronamic_pay_mollie', + array( $this, 'page_mollie' ), + $menu_icon_url + ); + + add_submenu_page( + 'pronamic_pay_mollie', + __( 'Mollie Profiles', 'pronamic_ideal' ), + __( 'Profiles', 'pronamic_ideal' ), + 'manage_options', + 'pronamic_pay_mollie_profiles', + array( $this, 'page_mollie_profiles' ) + ); + + add_submenu_page( + 'pronamic_pay_mollie', + __( 'Mollie Customers', 'pronamic_ideal' ), + __( 'Customers', 'pronamic_ideal' ), + 'manage_options', + 'pronamic_pay_mollie_customers', + array( $this, 'page_mollie_customers' ) + ); + + add_submenu_page( + 'pronamic_pay_mollie', + __( 'Mollie Payments', 'pronamic_ideal' ), + __( 'Payments', 'pronamic_ideal' ), + 'manage_options', + 'pronamic_pay_mollie_payments', + array( $this, 'page_mollie_payments' ) + ); + + /** + * Remove menu page. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/plugin.php#L1708-L1729 + * @link https://wordpress.stackexchange.com/questions/135692/creating-a-wordpress-admin-page-without-a-menu-for-a-plugin + * @link https://stackoverflow.com/questions/3902760/how-do-you-add-a-wordpress-admin-page-without-adding-it-to-the-menu + */ + remove_menu_page( 'pronamic_pay_mollie' ); + } + + /** + * Page Mollie. + * + * @return void + */ + public function page_mollie() { + include __DIR__ . '/../views/page-mollie.php'; + } + + /** + * Page Mollie profiles. + * + * @return void + */ + public function page_mollie_profiles() { + if ( filter_has_var( INPUT_GET, 'id' ) ) { + include __DIR__ . '/../views/page-profile.php'; + + return; + } + + include __DIR__ . '/../views/page-profiles.php'; + } + + /** + * Page Mollie customers. + * + * @return void + */ + public function page_mollie_customers() { + if ( filter_has_var( INPUT_GET, 'id' ) ) { + include __DIR__ . '/../views/page-customer.php'; + + return; + } + + include __DIR__ . '/../views/page-customers.php'; + } + + /** + * Page Mollie payments. + * + * @return void + */ + public function page_mollie_payments() { + if ( filter_has_var( INPUT_GET, 'id' ) ) { + include __DIR__ . '/../views/page-payment.php'; + + return; + } + + include __DIR__ . '/../views/page-payments.php'; + } + + /** + * User profile. + * + * @since 1.1.6 + * @link https://github.com/WordPress/WordPress/blob/4.5.2/wp-admin/user-edit.php#L578-L600 + * @param \WP_User $user WordPress user. + * @return void + */ + public static function user_profile( $user ) { + include __DIR__ . '/../views/user-profile.php'; + } + + /** + * Add payment meta box. + * + * @link https://developer.wordpress.org/reference/functions/add_meta_box/ + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/meta-boxes.php#L1541-L1549 + * @param string $post_type Post type. + * @param \WP_Post $post Post object. + * @return void + */ + public function add_payment_meta_box( $post_type, $post ) { + if ( 'pronamic_payment' !== $post_type ) { + return; + } + + $transaction_id = \get_post_meta( $post->ID, '_pronamic_payment_transaction_id', true ); + + if ( 'tr_' !== \substr( $transaction_id, 0, 3 ) ) { + return; + } + + \add_meta_box( + 'pronamic_pay_mollie_payment', + \__( 'Mollie', 'pronamic_ideal' ), + function( $post ) { + include __DIR__ . '/../views/meta-box-payment.php'; + }, + $post_type, + 'side' + ); + } + + /** + * Add subscription meta box. + * + * @link https://developer.wordpress.org/reference/functions/add_meta_box/ + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/meta-boxes.php#L1541-L1549 + * @param string $post_type Post type. + * @param \WP_Post $post Post object. + * @return void + */ + public function add_subscription_meta_box( $post_type, $post ) { + if ( 'pronamic_pay_subscr' !== $post_type ) { + return; + } + + $mollie_customer_id = \get_post_meta( $post->ID, '_pronamic_subscription_mollie_customer_id', true ); + + if ( empty( $mollie_customer_id ) ) { + return; + } + + \add_meta_box( + 'pronamic_pay_mollie_subscription', + \__( 'Mollie', 'pronamic_ideal' ), + function( $post ) { + include __DIR__ . '/../views/meta-box-subscription.php'; + }, + $post_type, + 'side' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Amount.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Amount.php new file mode 100644 index 00000000..0a21d381 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Amount.php @@ -0,0 +1,140 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use InvalidArgumentException; +use stdClass; +use JsonSchema\Constraints\Constraint; +use JsonSchema\Validator; + +/** + * Amount + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class Amount { + /** + * Currency. + * + * @var string + */ + private $currency; + + /** + * Amount value. + * + * @var string + */ + private $value; + + /** + * Construct an amount. + * + * @param string $currency Currency code (ISO 4217). + * @param string $value Amount formatted with correct number of decimals for currency. + */ + public function __construct( $currency, $value ) { + $this->currency = $currency; + $this->value = $value; + } + + /** + * Get currency. + * + * @return string + */ + public function get_currency() { + return $this->currency; + } + + /** + * Get amount. + * + * @return string + */ + public function get_value() { + return $this->value; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + return (object) array( + 'currency' => $this->get_currency(), + 'value' => $this->get_value(), + ); + } + + /** + * Create amount from object. + * + * @param stdClass $object Object. + * + * @return Amount + * @throws InvalidArgumentException Throws invalid argument exception when object does not contains the required properties. + */ + public static function from_object( stdClass $object ) { + if ( ! isset( $object->currency ) ) { + throw new InvalidArgumentException( 'Object must contain `currency` property.' ); + } + + if ( ! isset( $object->value ) ) { + throw new InvalidArgumentException( 'Object must contain `value` property.' ); + } + + return new self( + $object->currency, + $object->value + ); + } + + /** + * Create amount from JSON string. + * + * @param object $json JSON object. + * + * @return Amount + * + * @throws InvalidArgumentException Throws invalid argument exception when input JSON is not an object. + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + $validator = new Validator(); + + $validator->validate( + $json, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/amount.json' ), + ), + Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $json ); + } + + /** + * Create string representation of amount. + * + * @return string + */ + public function __toString() { + return sprintf( '%1$s %2$s', $this->get_currency(), $this->get_value() ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/AmountTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/AmountTransformer.php new file mode 100644 index 00000000..458a9ae3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/AmountTransformer.php @@ -0,0 +1,44 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\Money\Money; + +/** + * Amount transformer + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class AmountTransformer { + /** + * Transform Pronamic money to Mollie amount. + * + * @param Money $money Pronamic money to convert. + * @return Amount + * @throws \InvalidArgumentException Throws exception on invalid alphabetic currency code in given money object. + */ + public static function transform( Money $money ) { + $alphabetic_code = $money->get_currency()->get_alphabetic_code(); + + if ( null === $alphabetic_code ) { + throw new \InvalidArgumentException( 'Alphabetic currency code is required to transform money to Mollie amount object.' ); + } + + $amount = new Amount( + \strval( $alphabetic_code ), + $money->format() + ); + + return $amount; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/BaseResource.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/BaseResource.php new file mode 100644 index 00000000..34458ea9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/BaseResource.php @@ -0,0 +1,46 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Base Resource + * + * @link https://github.com/mollie/mollie-api-php/blob/v2.25.0/src/Resources/BaseResource.php + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +abstract class BaseResource { + /** + * The resource unique identifier. + * + * @var string + */ + private $id; + + /** + * Construct base resource. + * + * @param string $id Identifier. + */ + public function __construct( $id ) { + $this->id = $id; + } + + /** + * Get identifier. + * + * @return string + */ + public function get_id() { + return $this->id; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CLI.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CLI.php new file mode 100644 index 00000000..ec1abda5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CLI.php @@ -0,0 +1,253 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: CLI + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + * @link https://github.com/woocommerce/woocommerce/blob/3.9.0/includes/class-wc-cli.php + */ +class CLI { + /** + * Customer data store. + * + * @var CustomerDataStore + */ + protected $customer_data_store; + + /** + * Profile data store. + * + * @var ProfileDataStore + */ + protected $profile_data_store; + + /** + * Construct CLI. + */ + public function __construct() { + \WP_CLI::add_command( + 'pronamic-pay mollie organizations synchronize', + function( $args, $assoc_args ) { + $this->wp_cli_organizations_synchronize( $args, $assoc_args ); + }, + array( + 'shortdesc' => 'Synchronize Mollie organizations to WordPress (not implemented yet).', + ) + ); + + \WP_CLI::add_command( + 'pronamic-pay mollie customers synchronize', + function( $args, $assoc_args ) { + $this->wp_cli_customers_synchronize( $args, $assoc_args ); + }, + array( + 'shortdesc' => 'Synchronize Mollie customers to WordPress.', + ) + ); + + \WP_CLI::add_command( + 'pronamic-pay mollie customers connect-wp-users', + function( $args, $assoc_args ) { + $this->wp_cli_customers_connect_wp_users( $args, $assoc_args ); + }, + array( + 'shortdesc' => 'Connect Mollie customers to WordPress users by email.', + ) + ); + + // Data Stores. + $this->profile_data_store = new ProfileDataStore(); + $this->customer_data_store = new CustomerDataStore(); + } + + /** + * CLI organizations synchronize. + * + * @link https://docs.mollie.com/reference/v2/organizations-api/current-organization + * @param array $args Arguments. + * @param array $assoc_args Associative arguments. + * @return void + */ + public function wp_cli_organizations_synchronize( $args, $assoc_args ) { + \WP_CLI::error( 'Command not implemented yet.' ); + } + + /** + * CLI customers synchronize. + * + * @link https://docs.mollie.com/reference/v2/customers-api/list-customers + * @param array $args Arguments. + * @param array $assoc_args Associative arguments. + * @return void + */ + public function wp_cli_customers_synchronize( $args, $assoc_args ) { + global $post; + global $wpdb; + + $query = new \WP_Query( + array( + 'post_type' => 'pronamic_gateway', + 'post_status' => 'publish', + 'nopaging' => true, + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Slow query allowed on CLI. + 'meta_query' => array( + array( + 'key' => '_pronamic_gateway_id', + 'value' => 'mollie', + ), + array( + 'key' => '_pronamic_gateway_mollie_api_key', + 'compare' => 'EXISTS', + ), + ), + ) + ); + + if ( $query->have_posts() ) { + while ( $query->have_posts() ) { + $query->the_post(); + + $api_key = get_post_meta( $post->ID, '_pronamic_gateway_mollie_api_key', true ); + + \WP_CLI::log( $post->post_title ); + \WP_CLI::log( $api_key ); + \WP_CLI::log( '' ); + + $client = new Client( $api_key ); + + $urls = array( + 'https://api.mollie.com/v2/customers?limit=250', + ); + + $profile = Profile::from_object( $client->get_current_profile() ); + + $profile_id = $this->profile_data_store->save_profile( + $profile, + array( + 'api_key_live' => ( 'live_' === substr( $api_key, 0, 5 ) ) ? $api_key : null, + 'api_key_test' => ( 'test_' === substr( $api_key, 0, 5 ) ) ? $api_key : null, + ), + array( + 'api_key_live' => '%s', + 'api_key_test' => '%s', + ) + ); + + while ( ! empty( $urls ) ) { + $url = (string) array_shift( $urls ); + + \WP_CLI::log( $url ); + + $response = $client->send_request( $url ); + + if ( isset( $response->count ) ) { + \WP_CLI::log( + \sprintf( + 'Found %d customer(s).', + $response->count + ) + ); + } + + if ( \property_exists( $response, '_embedded' ) && isset( $response->_embedded->customers ) ) { + \WP_CLI\Utils\format_items( + 'table', + $response->_embedded->customers, + array( + 'id', + 'mode', + 'name', + 'email', + 'locale', + ) + ); + + foreach ( $response->_embedded->customers as $object ) { + $customer = Customer::from_object( $object ); + + $customer_id = $this->customer_data_store->save_customer( + $customer, + array( + 'profile_id' => $profile_id, + ), + array( + 'profile_id' => '%d', + ) + ); + } + } + + if ( \property_exists( $response, '_links' ) && isset( $response->_links->next->href ) ) { + $urls[] = $response->_links->next->href; + } + } + } + + \wp_reset_postdata(); + } + } + + /** + * CLI connect Mollie customers to WordPress users. + * + * @link https://docs.mollie.com/reference/v2/customers-api/list-customers + * @link https://make.wordpress.org/cli/handbook/internal-api/wp-cli-add-command/ + * @link https://developer.wordpress.org/reference/classes/wpdb/query/ + * @param array $args Arguments. + * @param array $assoc_args Associative arguments. + * @return void + */ + public function wp_cli_customers_connect_wp_users( $args, $assoc_args ) { + global $wpdb; + + $query = " + INSERT IGNORE INTO $wpdb->pronamic_pay_mollie_customer_users ( + customer_id, + user_id + ) + SELECT + mollie_customer.id AS mollie_customer_id, + wp_user.ID AS wp_user_id + FROM + $wpdb->pronamic_pay_mollie_customers AS mollie_customer + INNER JOIN + $wpdb->users AS wp_user + ON mollie_customer.email = wp_user.user_email + ; + "; + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Prepare is OK. + $result = $wpdb->query( $query ); + + if ( false === $result ) { + \WP_CLI::error( + sprintf( + 'Database error: %s.', + $wpdb->last_error + ) + ); + } + + \WP_CLI::log( + sprintf( + 'Connected %d users and Mollie customers.', + $result + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Chargeback.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Chargeback.php new file mode 100644 index 00000000..81edcdf1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Chargeback.php @@ -0,0 +1,88 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use DateTimeInterface; + +/** + * Chargeback + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class Chargeback extends BaseResource { + /** + * The amount charged back by the consumer. + * + * @var Amount + */ + private $amount; + + /** + * The date and time the chargeback was issued. + * + * @var DateTimeInterface + */ + private $created_at; + + /** + * Construct chargeback. + * + * @param string $id Identifier. + * @param Amount $amount Amount. + * @param DateTimeInterface $created_at Created at. + */ + public function __construct( $id, Amount $amount, DateTimeInterface $created_at ) { + parent::__construct( $id ); + + $this->amount = $amount; + $this->created_at = $created_at; + } + + /** + * Get created at. + * + * @return DateTimeInterface + */ + public function get_created_at() { + return $this->created_at; + } + + /** + * Create chargeback from JSON. + * + * @link https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback + * @param object $json JSON object. + * @return Chargeback + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $json, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/chargeback.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $chargeback = new Chargeback( + $json->id, + Amount::from_json( $json->amount ), + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + new \DateTimeImmutable( $json->createdAt ) + ); + + return $chargeback; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Client.php new file mode 100644 index 00000000..1ff9eb3e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Client.php @@ -0,0 +1,477 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Facades\Http; + +/** + * Title: Mollie + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.4 + * @since 1.0.0 + */ +class Client { + /** + * Mollie API endpoint URL + * + * @var string + */ + const API_URL = 'https://api.mollie.com/v2/'; + + /** + * Mollie API Key ID + * + * @var string + */ + private $api_key; + + /** + * Constructs and initializes an Mollie client object + * + * @param string $api_key Mollie API key. + */ + public function __construct( $api_key ) { + $this->api_key = $api_key; + } + + /** + * Send request with the specified action and parameters + * + * @param string $url URL. + * @param string $method HTTP method to use. + * @param array $data Request data. + * @return object + * @throws Error Throws Error when Mollie error occurs. + * @throws \Exception Throws exception when error occurs. + */ + public function send_request( $url, $method = 'GET', array $data = array() ) { + // Request. + $response = Http::request( + $url, + array( + 'method' => $method, + 'headers' => array( + 'Authorization' => 'Bearer ' . $this->api_key, + ), + 'body' => $data, + ) + ); + + $data = $response->json(); + + // Object. + if ( ! \is_object( $data ) ) { + $code = $response->status(); + + throw new \Exception( + \sprintf( 'Could not JSON decode Mollie response to an object (HTTP Status Code: %s).', $code ), + \intval( $code ) + ); + } + + // Mollie error from JSON response. + if ( isset( $data->status, $data->title, $data->detail ) ) { + throw new Error( + $data->status, + $data->title, + $data->detail + ); + } + + return $data; + } + + /** + * Get URL. + * + * @param string $endpoint URL endpoint. + * @return string + */ + public function get_url( $endpoint ) { + $url = self::API_URL . $endpoint; + + return $url; + } + + /** + * Send request to endpoint. + * + * @param string $endpoint Endpoint. + * @param string $method HTTP method to use. + * @param array $data Request data. + * @return object + */ + public function send_request_to_endpoint( $endpoint, $method = 'GET', array $data = array() ) { + return $this->send_request( $this->get_url( $endpoint ), $method, $data ); + } + + /** + * Get profile. + * + * @param string $profile Mollie profile ID. + * @return object + * @throws Error Throws Error when Mollie error occurs. + */ + public function get_profile( $profile ) { + return $this->send_request_to_endpoint( 'profiles/' . $profile, 'GET' ); + } + + /** + * Get current profile. + * + * @return object + * @throws Error Throws Error when Mollie error occurs. + */ + public function get_current_profile() { + return $this->get_profile( 'me' ); + } + + /** + * Create payment. + * + * @param PaymentRequest $request Payment request. + * @return object + */ + public function create_payment( PaymentRequest $request ) { + return $this->send_request_to_endpoint( 'payments', 'POST', $request->get_array() ); + } + + /** + * Get payments. + * + * @return bool|object + */ + public function get_payments() { + return $this->send_request_to_endpoint( 'payments', 'GET' ); + } + + /** + * Get payment. + * + * @param string $payment_id Mollie payment ID. + * @param array $parameters Parameters. + * @return Payment + * @throws \InvalidArgumentException Throws exception on empty payment ID argument. + */ + public function get_payment( $payment_id, $parameters = array() ) { + if ( empty( $payment_id ) ) { + throw new \InvalidArgumentException( 'Mollie payment ID can not be empty string.' ); + } + + $object = $this->send_request_to_endpoint( 'payments/' . $payment_id, 'GET', $parameters ); + + $payment = Payment::from_json( $object ); + + return $payment; + } + + /** + * Get issuers + * + * @return array + */ + public function get_issuers() { + $response = $this->send_request_to_endpoint( 'methods/ideal?include=issuers', 'GET' ); + + $issuers = array(); + + if ( isset( $response->issuers ) ) { + foreach ( $response->issuers as $issuer ) { + $id = Security::filter( $issuer->id ); + $name = Security::filter( $issuer->name ); + + if ( null === $id || null === $name ) { + continue; + } + + $issuers[ $id ] = $name; + } + } + + return $issuers; + } + + /** + * Get payment methods + * + * @param string $sequence_type Sequence type. + * + * @return array + * @throws \Exception Throws exception for methods on failed request or invalid response. + */ + public function get_payment_methods( $sequence_type = '' ) { + $data = array( + 'includeWallets' => Methods::APPLE_PAY, + ); + + if ( '' !== $sequence_type ) { + $data['sequenceType'] = $sequence_type; + } + + $response = $this->send_request_to_endpoint( 'methods', 'GET', $data ); + + $payment_methods = array(); + + if ( ! isset( $response->_embedded ) ) { + throw new \Exception( 'No embedded data in Mollie response.' ); + } + + if ( isset( $response->_embedded->methods ) ) { + foreach ( $response->_embedded->methods as $payment_method ) { + $id = Security::filter( $payment_method->id ); + $name = Security::filter( $payment_method->description ); + + if ( null === $id || null === $name ) { + continue; + } + + $payment_methods[ $id ] = $name; + } + } + + return $payment_methods; + } + + /** + * Create customer. + * + * @param Customer $customer Customer. + * @return Customer + * @throws Error Throws Error when Mollie error occurs. + * @since 1.1.6 + */ + public function create_customer( Customer $customer ) { + $response = $this->send_request_to_endpoint( + 'customers', + 'POST', + $customer->get_array() + ); + + if ( \property_exists( $response, 'id' ) ) { + $customer->set_id( $response->id ); + } + + return $customer; + } + + /** + * Get customer. + * + * @param string $customer_id Mollie customer ID. + * + * @return null|object + * @throws \InvalidArgumentException Throws exception on empty customer ID argument. + * @throws Error Throws Error when Mollie error occurs. + */ + public function get_customer( $customer_id ) { + if ( empty( $customer_id ) ) { + throw new \InvalidArgumentException( 'Mollie customer ID can not be empty string.' ); + } + + try { + return $this->send_request_to_endpoint( 'customers/' . $customer_id, 'GET' ); + } catch ( Error $error ) { + if ( 404 === $error->get_status() ) { + return null; + } + + throw $error; + } + } + + /** + * Create mandate. + * + * @param string $customer_id Customer ID. + * @param BankAccountDetails $consumer_bank_details Consumer bank details. + * @return object + * @throws Error Throws Error when Mollie error occurs. + * @since unreleased + */ + public function create_mandate( $customer_id, BankAccountDetails $consumer_bank_details ) { + $response = $this->send_request_to_endpoint( + 'customers/' . $customer_id . '/mandates', + 'POST', + array( + 'method' => Methods::DIRECT_DEBIT, + 'consumerName' => $consumer_bank_details->get_name(), + 'consumerAccount' => $consumer_bank_details->get_iban(), + ) + ); + + return $response; + } + + /** + * Get mandate. + * + * @param string $mandate_id Mollie mandate ID. + * @param string $customer_id Mollie customer ID. + * @return object + * @throws \InvalidArgumentException Throws exception on empty mandate ID argument. + */ + public function get_mandate( $mandate_id, $customer_id ) { + if ( '' === $mandate_id ) { + throw new \InvalidArgumentException( 'Mollie mandate ID can not be empty string.' ); + } + + if ( '' === $customer_id ) { + throw new \InvalidArgumentException( 'Mollie customer ID can not be empty string.' ); + } + + return $this->send_request_to_endpoint( 'customers/' . $customer_id . '/mandates/' . $mandate_id, 'GET' ); + } + + /** + * Get mandates for customer. + * + * @param string $customer_id Mollie customer ID. + * @return object + * @throws \InvalidArgumentException Throws exception on empty customer ID argument. + */ + public function get_mandates( $customer_id ) { + if ( '' === $customer_id ) { + throw new \InvalidArgumentException( 'Mollie customer ID can not be empty string.' ); + } + + return $this->send_request_to_endpoint( 'customers/' . $customer_id . '/mandates?limit=250', 'GET' ); + } + + /** + * Is there a valid mandate for customer? + * + * @param string $customer_id Mollie customer ID. + * @param string|null $payment_method Payment method to find mandates for. + * @param string|null $search Search. + * + * @return string|bool + * @throws \Exception Throws exception for mandates on failed request or invalid response. + */ + public function has_valid_mandate( $customer_id, $payment_method = null, $search = null ) { + $mandates = $this->get_mandates( $customer_id ); + + $mollie_method = Methods::transform( $payment_method ); + + if ( ! isset( $mandates->_embedded ) ) { + throw new \Exception( 'No embedded data in Mollie response.' ); + } + + foreach ( $mandates->_embedded->mandates as $mandate ) { + if ( null !== $mollie_method && $mollie_method !== $mandate->method ) { + continue; + } + + // Search consumer account or card number. + if ( null !== $search ) { + switch ( $mollie_method ) { + case Methods::DIRECT_DEBIT: + case Methods::PAYPAL: + if ( $search !== $mandate->details->consumerAccount ) { + continue 2; + } + + break; + case Methods::CREDITCARD: + if ( $search !== $mandate->details->cardNumber ) { + continue 2; + } + + break; + } + } + + if ( 'valid' === $mandate->status ) { + return $mandate->id; + } + } + + return false; + } + + /** + * Get formatted date and time of first valid mandate. + * + * @param string $customer_id Mollie customer ID. + * @param string $payment_method Payment method. + * + * @return null|DateTime + * @throws \Exception Throws exception for mandates on failed request or invalid response. + */ + public function get_first_valid_mandate_datetime( $customer_id, $payment_method = null ) { + $mandates = $this->get_mandates( $customer_id ); + + $mollie_method = Methods::transform( $payment_method ); + + if ( ! isset( $mandates->_embedded ) ) { + throw new \Exception( 'No embedded data in Mollie response.' ); + } + + foreach ( $mandates->_embedded->mandates as $mandate ) { + if ( $mollie_method !== $mandate->method ) { + continue; + } + + if ( 'valid' !== $mandate->status ) { + continue; + } + + if ( ! isset( $valid_mandates ) ) { + $valid_mandates = array(); + } + + // @codingStandardsIgnoreStart + $valid_mandates[ $mandate->createdAt ] = $mandate; + // @codingStandardsIgnoreEnd + } + + if ( isset( $valid_mandates ) ) { + ksort( $valid_mandates ); + + $mandate = array_shift( $valid_mandates ); + + // @codingStandardsIgnoreStart + $create_date = new DateTime( $mandate->createdAt ); + // @codingStandardsIgnoreEnd + + return $create_date; + } + + return null; + } + + /** + * Get payment chargebacks. + * + * @param string $payment_id Mollie payment ID. + * @param array $parameters Parameters. + * @return array + */ + public function get_payment_chargebacks( $payment_id, $parameters ) { + $object = $this->send_request_to_endpoint( 'payments/' . $payment_id . '/chargebacks', 'GET', $parameters ); + + $chargebacks = array(); + + if ( \property_exists( $object, '_embedded' ) && \property_exists( $object->_embedded, 'chargebacks' ) ) { + foreach ( $object->_embedded->chargebacks as $chargeback_object ) { + $chargebacks[] = Chargeback::from_json( $chargeback_object ); + } + } + + return $chargebacks; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Config.php new file mode 100644 index 00000000..e4c3b727 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Config.php @@ -0,0 +1,59 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Title: Mollie config + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.9 + * @since 1.0.0 + */ +class Config extends GatewayConfig { + /** + * ID. + * + * @var int + */ + public $id; + + /** + * API key. + * + * @var string|null + */ + public $api_key; + + /** + * Bank transfer due date days. + * + * @var string|null + */ + public $due_date_days; + + /** + * Function to check for test API key. + * + * @return bool True if test mode, false otherwise. + */ + public function is_test_mode() { + if ( null === $this->api_key ) { + return false; + } + + return ( 'test_' === substr( $this->api_key, 0, 5 ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Customer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Customer.php new file mode 100644 index 00000000..6b3a6910 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Customer.php @@ -0,0 +1,212 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Mollie customer + * + * @link https://docs.mollie.com/reference/v2/customers-api/create-customer + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class Customer { + /** + * ID. + * + * @var string|null + */ + private $id; + + /** + * Mode. + * + * @var string|null + */ + private $mode; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * Email. + * + * @var string|null + */ + private $email; + + /** + * Locale. + * + * @var string|null + */ + public $locale; + + /** + * Construct Mollie customer. + * + * @param string|null $id Mollie customer ID. + */ + public function __construct( $id = null ) { + $this->set_id( $id ); + } + + /** + * Get ID. + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set ID. + * + * @param string|null $id ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get mode. + * + * @return string|null + */ + public function get_mode() { + return $this->mode; + } + + /** + * Set mode. + * + * @param string|null $mode Mode. + * @return void + */ + public function set_mode( $mode ) { + $this->mode = $mode; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get email. + * + * @return string|null + */ + public function get_email() { + return $this->email; + } + + /** + * Set email. + * + * @param string|null $email Email. + * @return void + */ + public function set_email( $email ) { + $this->email = $email; + } + + /** + * Get locale. + * + * @return string|null + */ + public function get_locale() { + return $this->locale; + } + + /** + * Set locale. + * + * @param string|null $locale Locale. + * @return void + */ + public function set_locale( $locale ) { + $this->locale = $locale; + } + + /** + * Get array. + * + * @return array + */ + public function get_array() { + $array = array( + 'name' => $this->get_name(), + 'email' => $this->get_email(), + 'locale' => $this->get_locale(), + ); + + /* + * Array filter will remove values NULL, FALSE and empty strings ('') + */ + $array = array_filter( $array ); + + return $array; + } + + /** + * Create customer from object. + * + * @param object $object Object. + * @return Customer + */ + public static function from_object( $object ) { + $customer = new self(); + + if ( property_exists( $object, 'id' ) ) { + $customer->set_id( $object->id ); + } + + if ( property_exists( $object, 'mode' ) ) { + $customer->set_mode( $object->mode ); + } + + if ( property_exists( $object, 'name' ) ) { + $customer->set_name( $object->name ); + } + + if ( property_exists( $object, 'email' ) ) { + $customer->set_email( $object->email ); + } + + if ( property_exists( $object, 'locale' ) ) { + $customer->set_locale( $object->locale ); + } + + return $customer; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CustomerDataStore.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CustomerDataStore.php new file mode 100644 index 00000000..82004103 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CustomerDataStore.php @@ -0,0 +1,251 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie customer data store + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class CustomerDataStore { + /** + * Get or insert customer. + * + * @param Customer $customer Customer. + * @param array $data Data. + * @param array $format Format. + * @return int + * @throws \Exception Throws exception if Mollie customer ID could not be retrieved from existing customer. + */ + public function get_or_insert_customer( Customer $customer, $data = array(), $format = array() ) { + $customer_data = $this->get_customer( $customer ); + + if ( null !== $customer_data ) { + if ( ! \property_exists( $customer_data, 'id' ) ) { + throw new \Exception( 'Unable to get Mollie customer ID for existing customer.' ); + } + + return $customer_data->id; + } + + return $this->insert_customer( $customer, $data, $format ); + } + + /** + * Get customer data for specified Mollie customer. + * + * @param Customer $customer Mollie customer. + * @return object|null + */ + public function get_customer( Customer $customer ) { + global $wpdb; + + $id = $customer->get_id(); + + if ( null === $id ) { + return null; + } + + $data = $wpdb->get_row( + $wpdb->prepare( + " + SELECT + * + FROM + $wpdb->pronamic_pay_mollie_customers + WHERE + mollie_id = %s + LIMIT + 1 + ; + ", + $id + ) + ); + + return $data; + } + + /** + * Insert Mollie customer. + * + * @param Customer $customer Customer. + * @param array $data Data. + * @param array $format Format. + * @return int + * @throws \Exception Throws exception on error. + */ + public function insert_customer( Customer $customer, $data = array(), $format = array() ) { + global $wpdb; + + $mollie_id = $customer->get_id(); + + if ( empty( $mollie_id ) ) { + throw new \Exception( 'Can not insert Mollie customer with empty ID.' ); + } + + $data['mollie_id'] = $mollie_id; + $format['mollie_id'] = '%s'; + + $data['test_mode'] = ( 'test' === $customer->get_mode() ); + $format['test_mode'] = '%d'; + + $data['email'] = $customer->get_email(); + $format['email'] = '%s'; + + $result = $wpdb->insert( + $wpdb->pronamic_pay_mollie_customers, + $data, + $format + ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Could not insert Mollie customer ID: %s, error: %s.', + $mollie_id, + $wpdb->last_error + ) + ); + } + + $id = $wpdb->insert_id; + + return $id; + } + + /** + * Update Mollie customer. + * + * @param Customer $customer Customer. + * @param array $data Data. + * @param array $format Format. + * @return int The number of rows updated. + * @throws \Exception Throws exception on error. + */ + public function update_customer( Customer $customer, $data = array(), $format = array() ) { + global $wpdb; + + $mollie_id = $customer->get_id(); + + if ( empty( $mollie_id ) ) { + throw new \Exception( 'Can not update Mollie customer with empty ID.' ); + } + + $data['test_mode'] = ( 'test' === $customer->get_mode() ); + $format['test_mode'] = '%d'; + + $data['email'] = $customer->get_email(); + $format['email'] = '%s'; + + $result = $wpdb->update( + $wpdb->pronamic_pay_mollie_customers, + $data, + array( + 'mollie_id' => $mollie_id, + ), + $format, + array( + 'mollie_id' => '%s', + ) + ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Could not update Mollie customer ID: %s, error: %s.', + $mollie_id, + $wpdb->last_error + ) + ); + } + + return $result; + } + + /** + * Save Mollie customer. + * + * @param Customer $customer Customer. + * @param array $data Data. + * @param array $format Format. + * @return int + * @throws \Exception Throws exception if unable to update existing customer. + */ + public function save_customer( Customer $customer, $data = array(), $format = array() ) { + $customer_data = $this->get_customer( $customer ); + + if ( null !== $customer_data ) { + if ( ! \property_exists( $customer_data, 'id' ) ) { + throw new \Exception( 'Can not update Mollie customer without ID.' ); + } + + $this->update_customer( $customer, $data, $format ); + + return $customer_data->id; + } + + return $this->insert_customer( $customer, $data, $format ); + } + + /** + * Connect Mollie customer to WordPress user. + * + * @param Customer $customer Mollie customer. + * @param \WP_User $user WordPress user. + * @return int Number of rows affected. + * @throws \Exception Throws exception on error. + */ + public function connect_mollie_customer_to_wp_user( $customer, \WP_User $user ) { + global $wpdb; + + $result = $wpdb->query( + $wpdb->prepare( + " + INSERT IGNORE INTO $wpdb->pronamic_pay_mollie_customer_users ( + customer_id, + user_id + ) + SELECT + mollie_customer.id AS mollie_customer_id, + wp_user.ID AS wp_user_id + FROM + $wpdb->pronamic_pay_mollie_customers AS mollie_customer + JOIN + $wpdb->users AS wp_user + WHERE + mollie_customer.mollie_id = %s + AND + wp_user.ID = %d + ; + ", + $customer->get_id(), + $user->ID + ) + ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Database error: %s.', + $wpdb->last_error + ) + ); + } + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CustomerQuery.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CustomerQuery.php new file mode 100644 index 00000000..642030bd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/CustomerQuery.php @@ -0,0 +1,79 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie customer query + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class CustomerQuery { + /** + * Query arguments. + * + * @var array + */ + private $args; + + /** + * Construct customer query. + * + * @param array $args Query arguments. + */ + public function __construct( $args = array() ) { + $this->args = \wp_parse_args( + $args, + array( + 'user_id' => null, + 'organization_id' => null, + ) + ); + } + + /** + * Get customers. + * + * @return array + */ + public function get_customers() { + global $wpdb; + + $where = '1 = 1'; + + if ( array_key_exists( 'user_id', $this->args ) ) { + $where .= $wpdb->prepare( ' AND mollie_customer_user.user_id = %d', $this->args['user_id'] ); + } + + $query = " + SELECT + mollie_customer.mollie_id, + mollie_customer.test_mode, + mollie_customer.name, + mollie_customer.email + FROM + $wpdb->pronamic_pay_mollie_customer_users AS mollie_customer_user + INNER JOIN + $wpdb->pronamic_pay_mollie_customers AS mollie_customer + ON mollie_customer_user.customer_id = mollie_customer.id + WHERE + $where + ; + "; + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Query is prepared. + return $wpdb->get_results( $query ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Error.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Error.php new file mode 100644 index 00000000..52a76526 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Error.php @@ -0,0 +1,90 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Mollie error + * + * @link https://docs.mollie.com/guides/handling-errors + * @author Remco Tolsma + * @version 2.0.9 + * @since 2.0.9 + */ +class Error extends \Exception { + /** + * Status. + * + * @var int + */ + private $status; + + /** + * Title. + * + * @var string + */ + private $title; + + /** + * Detail. + * + * @var string + */ + public $detail; + + /** + * Construct Mollie error. + * + * @param int $status Status. + * @param string $title Title. + * @param string $detail Detail. + */ + public function __construct( $status, $title, $detail ) { + $message = sprintf( + '%s - %s', + $title, + $detail + ); + + parent::__construct( $message, $status ); + + $this->status = $status; + $this->title = $title; + $this->detail = $detail; + } + + /** + * Get status. + * + * @return int + */ + public function get_status() { + return $this->status; + } + + /** + * Get title. + * + * @return string + */ + public function get_title() { + return $this->title; + } + + /** + * Get title. + * + * @return string + */ + public function get_detail() { + return $this->detail; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Gateway.php new file mode 100644 index 00000000..16e509dc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Gateway.php @@ -0,0 +1,1079 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Banks\BankTransferDetails; +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\FailureReason; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; + +/** + * Title: Mollie + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.4 + * @since 1.1.0 + */ +class Gateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + protected $client; + + /** + * Config + * + * @var Config + */ + protected $config; + + /** + * Profile data store. + * + * @var ProfileDataStore + */ + private $profile_data_store; + + /** + * Customer data store. + * + * @var CustomerDataStore + */ + private $customer_data_store; + + /** + * Constructs and initializes an Mollie gateway + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + 'recurring_direct_debit', + 'recurring_credit_card', + 'recurring', + 'webhook', + 'webhook_log', + 'webhook_no_config', + ); + + // Client. + $this->client = new Client( (string) $config->api_key ); + + // Data Stores. + $this->profile_data_store = new ProfileDataStore(); + $this->customer_data_store = new CustomerDataStore(); + + // Actions. + add_action( 'pronamic_payment_status_update', array( $this, 'copy_customer_id_to_wp_user' ), 99, 1 ); + } + + /** + * Get issuers + * + * @see Core_Gateway::get_issuers() + * @return array>> + */ + public function get_issuers() { + $groups = array(); + + try { + $result = $this->client->get_issuers(); + + $groups[] = array( + 'options' => $result, + ); + } catch ( Error $e ) { + // Catch Mollie error. + $error = new \WP_Error( + 'mollie_error', + sprintf( '%1$s (%2$s) - %3$s', $e->get_title(), $e->getCode(), $e->get_detail() ) + ); + + $this->set_error( $error ); + } catch ( \Exception $e ) { + // Catch exceptions. + $error = new \WP_Error( 'mollie_error', $e->getMessage() ); + + $this->set_error( $error ); + } + + return $groups; + } + + /** + * Get available payment methods. + * + * @see Core_Gateway::get_available_payment_methods() + * @return array + */ + public function get_available_payment_methods() { + $payment_methods = array(); + + // Set sequence types to get payment methods for. + $sequence_types = array( Sequence::ONE_OFF, Sequence::RECURRING, Sequence::FIRST ); + + $results = array(); + + foreach ( $sequence_types as $sequence_type ) { + // Get active payment methods for Mollie account. + try { + $result = $this->client->get_payment_methods( $sequence_type ); + } catch ( Error $e ) { + // Catch Mollie error. + $error = new \WP_Error( + 'mollie_error', + sprintf( '%1$s (%2$s) - %3$s', $e->get_title(), $e->getCode(), $e->get_detail() ) + ); + + $this->set_error( $error ); + + break; + } catch ( \Exception $e ) { + // Catch exceptions. + $error = new \WP_Error( 'mollie_error', $e->getMessage() ); + + $this->set_error( $error ); + + break; + } + + if ( Sequence::FIRST === $sequence_type ) { + foreach ( $result as $method => $title ) { + unset( $result[ $method ] ); + + // Get WordPress payment method for direct debit method. + $method = Methods::transform_gateway_method( $method ); + $payment_method = array_search( $method, PaymentMethods::get_recurring_methods(), true ); + + if ( $payment_method ) { + $results[ $payment_method ] = $title; + } + } + } + + if ( is_array( $result ) ) { + $results = array_merge( $results, $result ); + } + } + + // Transform to WordPress payment methods. + foreach ( $results as $method => $title ) { + $method = (string) $method; + + $payment_method = Methods::transform_gateway_method( $method ); + + if ( PaymentMethods::is_recurring_method( $method ) ) { + $payment_method = $method; + } + + if ( null !== $payment_method ) { + $payment_methods[] = (string) $payment_method; + } + } + + $payment_methods = array_unique( $payment_methods ); + + return $payment_methods; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + * @return array + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::APPLE_PAY, + PaymentMethods::BANCONTACT, + PaymentMethods::BANK_TRANSFER, + PaymentMethods::BELFIUS, + PaymentMethods::CREDIT_CARD, + PaymentMethods::DIRECT_DEBIT, + PaymentMethods::DIRECT_DEBIT_BANCONTACT, + PaymentMethods::DIRECT_DEBIT_IDEAL, + PaymentMethods::DIRECT_DEBIT_SOFORT, + PaymentMethods::EPS, + PaymentMethods::GIROPAY, + PaymentMethods::IDEAL, + PaymentMethods::KBC, + PaymentMethods::PAYPAL, + PaymentMethods::PRZELEWY24, + PaymentMethods::SOFORT, + ); + } + + /** + * Get webhook URL for Mollie. + * + * @return string|null + */ + public function get_webhook_url() { + $url = \rest_url( Integration::REST_ROUTE_NAMESPACE . '/webhook' ); + + $host = wp_parse_url( $url, PHP_URL_HOST ); + + if ( is_array( $host ) ) { + // Parsing failure. + $host = ''; + } + + if ( 'localhost' === $host ) { + // Mollie doesn't allow localhost. + return null; + } elseif ( '.dev' === substr( $host, -4 ) ) { + // Mollie doesn't allow the .dev TLD. + return null; + } elseif ( '.local' === substr( $host, -6 ) ) { + // Mollie doesn't allow the .local TLD. + return null; + } elseif ( '.test' === substr( $host, -5 ) ) { + // Mollie doesn't allow the .test TLD. + return null; + } + + return $url; + } + + /** + * Start + * + * @see Pronamic_WP_Pay_Gateway::start() + * @param Payment $payment Payment. + * @return void + * @throws \Exception Throws exception on error creating Mollie customer for payment. + */ + public function start( Payment $payment ) { + $request = new PaymentRequest( + AmountTransformer::transform( $payment->get_total_amount() ), + (string) $payment->get_description() + ); + + $request->redirect_url = $payment->get_return_url(); + $request->webhook_url = $this->get_webhook_url(); + + // Locale. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + $request->locale = LocaleHelper::transform( $customer->get_locale() ); + } + + // Customer ID. + $customer_id = $this->get_customer_id_for_payment( $payment ); + + if ( null === $customer_id ) { + $customer_id = $this->create_customer_for_payment( $payment ); + } + + if ( null !== $customer_id ) { + $request->customer_id = $customer_id; + } + + // Payment method. + $payment_method = $payment->get_method(); + + // Recurring payment method. + $subscription = $payment->get_subscription(); + + $is_recurring_method = ( $subscription && PaymentMethods::is_recurring_method( (string) $payment_method ) ); + + // Consumer bank details. + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( PaymentMethods::DIRECT_DEBIT === $payment_method && null !== $consumer_bank_details ) { + $consumer_name = $consumer_bank_details->get_name(); + $consumer_iban = $consumer_bank_details->get_iban(); + + $request->consumer_name = $consumer_name; + $request->consumer_account = $consumer_iban; + + // Check if one-off SEPA Direct Debit can be used, otherwise short circuit payment. + if ( null !== $customer_id ) { + // Find or create mandate. + $mandate_id = $this->client->has_valid_mandate( $customer_id, PaymentMethods::DIRECT_DEBIT, $consumer_iban ); + + if ( false === $mandate_id ) { + $mandate = $this->client->create_mandate( $customer_id, $consumer_bank_details ); + + if ( ! \property_exists( $mandate, 'id' ) ) { + throw new \Exception( 'Missing mandate ID.' ); + } + + $mandate_id = $mandate->id; + } + + // Charge immediately on-demand. + $request->set_sequence_type( Sequence::RECURRING ); + $request->set_mandate_id( (string) $mandate_id ); + + $is_recurring_method = true; + + $payment->recurring = true; + } + } + + if ( false === $is_recurring_method && null !== $payment_method ) { + // Always use 'direct debit mandate via iDEAL/Bancontact/Sofort' payment methods as recurring method. + $is_recurring_method = PaymentMethods::is_direct_debit_method( $payment_method ); + + // Check for non-recurring methods for subscription payments. + if ( false === $is_recurring_method && null !== $payment->get_periods() ) { + $direct_debit_methods = PaymentMethods::get_direct_debit_methods(); + + $is_recurring_method = \in_array( $payment_method, $direct_debit_methods, true ); + } + } + + if ( $is_recurring_method ) { + $request->sequence_type = $payment->get_recurring() ? Sequence::RECURRING : Sequence::FIRST; + + if ( Sequence::FIRST === $request->sequence_type ) { + $payment_method = PaymentMethods::get_first_payment_method( $payment_method ); + } + + if ( Sequence::RECURRING === $request->sequence_type ) { + // Use mandate from subscription. + if ( $subscription && empty( $request->mandate_id ) ) { + $subscription_mandate_id = $subscription->get_meta( 'mollie_mandate_id' ); + + if ( false !== $subscription_mandate_id ) { + $request->set_mandate_id( $subscription_mandate_id ); + } + } + + // Use credit card for recurring Apple Pay payments. + if ( PaymentMethods::APPLE_PAY === $payment_method ) { + $payment_method = PaymentMethods::CREDIT_CARD; + } + + $direct_debit_methods = PaymentMethods::get_direct_debit_methods(); + + $recurring_method = \array_search( $payment_method, $direct_debit_methods, true ); + + if ( false !== $recurring_method ) { + $payment_method = $recurring_method; + } + + $payment->set_action_url( $payment->get_return_url() ); + } + } + + // Leap of faith if the WordPress payment method could not transform to a Mollie method? + $request->method = Methods::transform( $payment_method, $payment_method ); + + /** + * Metadata. + * + * Provide any data you like, for example a string or a JSON object. + * We will save the data alongside the payment. Whenever you fetch + * the payment with our API, we’ll also include the metadata. You + * can use up to approximately 1kB. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @link https://en.wikipedia.org/wiki/Metadata + */ + $metadata = null; + + /** + * Filters the Mollie metadata. + * + * @since 2.2.0 + * + * @param mixed $metadata Metadata. + * @param Payment $payment Payment. + */ + $metadata = \apply_filters( 'pronamic_pay_mollie_payment_metadata', $metadata, $payment ); + + $request->set_metadata( $metadata ); + + // Issuer. + if ( Methods::IDEAL === $request->method ) { + $request->issuer = $payment->get_issuer(); + } + + // Billing email. + $billing_email = $payment->get_email(); + + /** + * Filters the Mollie payment billing email used for bank transfer payment instructions. + * + * @since 2.2.0 + * + * @param string|null $billing_email Billing email. + * @param Payment $payment Payment. + */ + $billing_email = \apply_filters( 'pronamic_pay_mollie_payment_billing_email', $billing_email, $payment ); + + $request->set_billing_email( $billing_email ); + + // Due date. + if ( ! empty( $this->config->due_date_days ) ) { + try { + $due_date = new DateTime( sprintf( '+%s days', $this->config->due_date_days ) ); + } catch ( \Exception $e ) { + $due_date = null; + } + + $request->set_due_date( $due_date ); + } + + // Create payment. + $result = $this->client->create_payment( $request ); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + + // Set transaction ID. + if ( isset( $result->id ) ) { + $payment->set_transaction_id( $result->id ); + } + + // Set expiry date. + if ( isset( $result->expiresAt ) ) { + try { + $expires_at = new DateTime( $result->expiresAt ); + } catch ( \Exception $e ) { + $expires_at = null; + } + + $payment->set_expiry_date( $expires_at ); + } + + // Set status. + if ( isset( $result->status ) ) { + $payment->set_status( Statuses::transform( $result->status ) ); + } + + // Set bank transfer recipient details. + if ( isset( $result->details ) ) { + $bank_transfer_recipient_details = $payment->get_bank_transfer_recipient_details(); + + if ( null === $bank_transfer_recipient_details ) { + $bank_transfer_recipient_details = new BankTransferDetails(); + + $payment->set_bank_transfer_recipient_details( $bank_transfer_recipient_details ); + } + + $bank_details = $bank_transfer_recipient_details->get_bank_account(); + + if ( null === $bank_details ) { + $bank_details = new BankAccountDetails(); + + $bank_transfer_recipient_details->set_bank_account( $bank_details ); + } + + $details = $result->details; + + if ( isset( $details->bankName ) ) { + /** + * Set `bankName` as bank details name, as result "Stichting Mollie Payments" + * is not the name of a bank, but the account holder name. + */ + $bank_details->set_name( $details->bankName ); + } + + if ( isset( $details->bankAccount ) ) { + $bank_details->set_iban( $details->bankAccount ); + } + + if ( isset( $details->bankBic ) ) { + $bank_details->set_bic( $details->bankBic ); + } + + if ( isset( $details->transferReference ) ) { + $bank_transfer_recipient_details->set_reference( $details->transferReference ); + } + } + + // Handle links. + if ( isset( $result->_links ) ) { + $links = $result->_links; + + // Action URL. + if ( isset( $links->checkout->href ) ) { + $payment->set_action_url( $links->checkout->href ); + } + + // Change payment state URL. + if ( isset( $links->changePaymentState->href ) ) { + $payment->set_meta( 'mollie_change_payment_state_url', $links->changePaymentState->href ); + } + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + * @return void + */ + public function update_status( Payment $payment ) { + $transaction_id = $payment->get_transaction_id(); + + if ( null === $transaction_id ) { + return; + } + + $mollie_payment = $this->client->get_payment( $transaction_id ); + + $payment->set_status( Statuses::transform( $mollie_payment->get_status() ) ); + + /** + * Mollie profile. + */ + $mollie_profile = new Profile(); + + $mollie_profile->set_id( $mollie_payment->get_profile_id() ); + + $profile_internal_id = $this->profile_data_store->get_or_insert_profile( $mollie_profile ); + + /** + * If the Mollie payment contains a customer ID we will try to connect + * this Mollie customer ID the WordPress user and subscription. + * This can be usefull in case when a WordPress user is created after + * a succesfull payment. + * + * @link https://www.gravityforms.com/add-ons/user-registration/ + */ + $mollie_customer_id = $mollie_payment->get_customer_id(); + + if ( null !== $mollie_customer_id ) { + $mollie_customer = new Customer( $mollie_customer_id ); + + $customer_internal_id = $this->customer_data_store->get_or_insert_customer( + $mollie_customer, + array( + 'profile_id' => $profile_internal_id, + ), + array( + 'profile_id' => '%s', + ) + ); + + // Meta. + $customer_id = $payment->get_meta( 'mollie_customer_id' ); + + if ( empty( $customer_id ) ) { + $payment->set_meta( 'mollie_customer_id', $mollie_customer->get_id() ); + } + + // Customer. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + // Connect to user. + $user_id = $customer->get_user_id(); + + if ( null !== $user_id ) { + $user = \get_user_by( 'id', $user_id ); + + if ( false !== $user ) { + $this->customer_data_store->connect_mollie_customer_to_wp_user( $mollie_customer, $user ); + } + } + } + + // Subscription. + $subscription = $payment->get_subscription(); + + if ( null !== $subscription ) { + $customer_id = $subscription->get_meta( 'mollie_customer_id' ); + + if ( empty( $customer_id ) ) { + $subscription->set_meta( 'mollie_customer_id', $mollie_customer->get_id() ); + } + + // Update mandate in subscription meta. + $mollie_mandate_id = $mollie_payment->get_mandate_id(); + + if ( null !== $mollie_mandate_id ) { + $mandate_id = $subscription->get_meta( 'mollie_mandate_id' ); + + // Only update if no mandate has been set yet or if payment succeeded. + if ( empty( $mandate_id ) || PaymentStatus::SUCCESS === $payment->get_status() ) { + $this->update_subscription_mandate( $subscription, $mollie_mandate_id, $payment->get_method() ); + } + } + } + } + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + $mollie_payment_details = $mollie_payment->get_details(); + + if ( null !== $mollie_payment_details ) { + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + } + + if ( isset( $mollie_payment_details->consumerName ) ) { + $consumer_bank_details->set_name( $mollie_payment_details->consumerName ); + } + + if ( isset( $mollie_payment_details->cardHolder ) ) { + $consumer_bank_details->set_name( $mollie_payment_details->cardHolder ); + } + + if ( isset( $mollie_payment_details->cardNumber ) ) { + // The last four digits of the card number. + $consumer_bank_details->set_account_number( $mollie_payment_details->cardNumber ); + } + + if ( isset( $mollie_payment_details->cardCountryCode ) ) { + // The ISO 3166-1 alpha-2 country code of the country the card was issued in. + $consumer_bank_details->set_country( $mollie_payment_details->cardCountryCode ); + } + + if ( isset( $mollie_payment_details->consumerAccount ) ) { + switch ( $mollie_payment->get_method() ) { + case Methods::BELFIUS: + case Methods::DIRECT_DEBIT: + case Methods::IDEAL: + case Methods::KBC: + case Methods::SOFORT: + $consumer_bank_details->set_iban( $mollie_payment_details->consumerAccount ); + + break; + case Methods::BANCONTACT: + case Methods::BANKTRANSFER: + case Methods::PAYPAL: + default: + $consumer_bank_details->set_account_number( $mollie_payment_details->consumerAccount ); + + break; + } + } + + if ( isset( $mollie_payment_details->consumerBic ) ) { + $consumer_bank_details->set_bic( $mollie_payment_details->consumerBic ); + } + + /* + * Failure reason. + */ + $failure_reason = $payment->get_failure_reason(); + + if ( null === $failure_reason ) { + $failure_reason = new FailureReason(); + + $payment->set_failure_reason( $failure_reason ); + } + + // SEPA Direct Debit. + if ( isset( $mollie_payment_details->bankReasonCode ) ) { + $failure_reason->set_code( $mollie_payment_details->bankReasonCode ); + } + + if ( isset( $mollie_payment_details->bankReason ) ) { + $failure_reason->set_message( $mollie_payment_details->bankReason ); + } + + // Credit card. + if ( isset( $mollie_payment_details->failureReason ) ) { + $failure_reason->set_code( $mollie_payment_details->failureReason ); + } + + if ( isset( $mollie_payment_details->failureMessage ) ) { + $failure_reason->set_message( $mollie_payment_details->failureMessage ); + } + } + + $links = $mollie_payment->get_links(); + + // Change payment state URL. + if ( \property_exists( $links, 'changePaymentState' ) ) { + $payment->set_meta( 'mollie_change_payment_state_url', $links->changePaymentState->href ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + + if ( $mollie_payment->has_chargebacks() ) { + $mollie_chargebacks = $this->client->get_payment_chargebacks( + $mollie_payment->get_id(), + array( 'limit' => 1 ) + ); + + $mollie_chargeback = \reset( $mollie_chargebacks ); + + if ( false !== $mollie_chargeback ) { + $subscriptions = array_filter( + $payment->get_subscriptions(), + function( $subscription ) { + return SubscriptionStatus::ACTIVE === $subscription->get_status(); + } + ); + + foreach ( $subscriptions as $subscription ) { + if ( $mollie_chargeback->get_created_at() > $subscription->get_activated_at() ) { + $subscription->set_status( SubscriptionStatus::ON_HOLD ); + + $subscription->add_note( + \sprintf( + /* translators: 1: Mollie chargeback ID, 2: Mollie payment ID */ + \__( 'Subscription put on hold due to chargeback `%1$s` of payment `%2$s`.', 'pronamic_ideal' ), + \esc_html( $mollie_chargeback->get_id() ), + \esc_html( $mollie_payment->get_id() ) + ) + ); + + $subscription->save(); + } + } + } + } + } + + /** + * Update subscription mandate. + * + * @param Subscription $subscription Subscription. + * @param string $mandate_id Mollie mandate ID. + * @param string|null $payment_method Payment method. + * @return void + * @throws \Exception Throws exception if subscription note could not be added. + */ + public function update_subscription_mandate( Subscription $subscription, $mandate_id, $payment_method = null ) { + $customer_id = (string) $subscription->get_meta( 'mollie_customer_id' ); + + $mandate = $this->client->get_mandate( $mandate_id, $customer_id ); + + if ( ! \is_object( $mandate ) ) { + return; + } + + // Update mandate. + $old_mandate_id = $subscription->get_meta( 'mollie_mandate_id' ); + + $subscription->set_meta( 'mollie_mandate_id', $mandate_id ); + + if ( ! empty( $old_mandate_id ) && $old_mandate_id !== $mandate_id ) { + $note = \sprintf( + /* translators: 1: old mandate ID, 2: new mandate ID */ + \__( 'Mandate for subscription changed from "%1$s" to "%2$s".', 'pronamic_ideal' ), + \esc_html( $old_mandate_id ), + \esc_html( $mandate_id ) + ); + + $subscription->add_note( $note ); + } + + // Update payment method. + $old_method = $subscription->payment_method; + $new_method = ( null === $payment_method && \property_exists( $mandate, 'method' ) ? Methods::transform_gateway_method( $mandate->method ) : $payment_method ); + + // `Direct Debit` is not a recurring method, use `Direct Debit (mandate via ...)` instead. + if ( PaymentMethods::DIRECT_DEBIT === $new_method ) { + $new_method = PaymentMethods::DIRECT_DEBIT_IDEAL; + + // Use `Direct Debit (mandate via Bancontact)` if consumer account starts with `BE`. + if ( \property_exists( $mandate, 'details' ) && 'BE' === \substr( $mandate->details->consumerAccount, 0, 2 ) ) { + $new_method = PaymentMethods::DIRECT_DEBIT_BANCONTACT; + } + } + + if ( ! empty( $old_method ) && $old_method !== $new_method ) { + $subscription->payment_method = $new_method; + + // Add note. + $note = \sprintf( + /* translators: 1: old payment method, 2: new payment method */ + \__( 'Payment method for subscription changed from "%1$s" to "%2$s".', 'pronamic_ideal' ), + \esc_html( (string) PaymentMethods::get_name( $old_method ) ), + \esc_html( (string) PaymentMethods::get_name( $new_method ) ) + ); + + $subscription->add_note( $note ); + } + + $subscription->save(); + } + + /** + * Get Mollie customer ID for payment. + * + * @param Payment $payment Payment. + * @return string|null + */ + public function get_customer_id_for_payment( Payment $payment ) { + $customer_ids = $this->get_customer_ids_for_payment( $payment ); + + $customer_id = $this->get_first_existing_customer_id( $customer_ids ); + + return $customer_id; + } + + /** + * Get Mollie customers for the specified payment. + * + * @param Payment $payment Payment. + * @return array + */ + private function get_customer_ids_for_payment( Payment $payment ) { + $customer_ids = array(); + + // Customer ID from subscription meta. + $subscription = $payment->get_subscription(); + + if ( null !== $subscription ) { + $customer_id = $this->get_customer_id_for_subscription( $subscription ); + + if ( null !== $customer_id ) { + $customer_ids[] = $customer_id; + } + } + + // Customer ID from WordPress user. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + $user_id = $customer->get_user_id(); + + if ( ! empty( $user_id ) ) { + $user_customer_ids = $this->get_customer_ids_for_user( $user_id ); + + $customer_ids = \array_merge( $customer_ids, $user_customer_ids ); + } + } + + return $customer_ids; + } + + /** + * Get Mollie customers for the specified WordPress user ID. + * + * @param int $user_id WordPress user ID. + * @return array + */ + public function get_customer_ids_for_user( $user_id ) { + $customer_query = new CustomerQuery( + array( + 'user_id' => $user_id, + ) + ); + + $customers = $customer_query->get_customers(); + + $customer_ids = wp_list_pluck( $customers, 'mollie_id' ); + + return $customer_ids; + } + + /** + * Get customer ID for subscription. + * + * @param Subscription $subscription Subscription. + * @return string|null + */ + private function get_customer_id_for_subscription( Subscription $subscription ) { + $customer_id = $subscription->get_meta( 'mollie_customer_id' ); + + if ( empty( $customer_id ) ) { + // Try to get (legacy) customer ID from first payment. + $first_payment = $subscription->get_first_payment(); + + if ( null !== $first_payment ) { + $customer_id = $first_payment->get_meta( 'mollie_customer_id' ); + } + } + + if ( empty( $customer_id ) ) { + return null; + } + + return $customer_id; + } + + /** + * Get first existing customer from customers list. + * + * @param array $customer_ids Customers. + * @return string|null + * @throws Error Throws error on Mollie error. + */ + private function get_first_existing_customer_id( $customer_ids ) { + $customer_ids = \array_filter( $customer_ids ); + + $customer_ids = \array_unique( $customer_ids ); + + foreach ( $customer_ids as $customer_id ) { + try { + $customer = $this->client->get_customer( $customer_id ); + } catch ( Error $error ) { + // Check for status 410 ("Gone - The customer is no longer available"). + if ( 410 === $error->get_status() ) { + continue; + } + + throw $error; + } + + if ( null !== $customer ) { + return $customer_id; + } + } + + return null; + } + + /** + * Create customer for payment. + * + * @param Payment $payment Payment. + * @return string|null + * @throws Error Throws Error when Mollie error occurs. + * @throws \Exception Throws exception when error in customer data store occurs. + */ + private function create_customer_for_payment( Payment $payment ) { + $mollie_customer = new Customer(); + $mollie_customer->set_mode( $this->config->is_test_mode() ? 'test' : 'live' ); + $mollie_customer->set_email( $payment->get_email() ); + + $pronamic_customer = $payment->get_customer(); + + if ( null !== $pronamic_customer ) { + // Name. + $name = (string) $pronamic_customer->get_name(); + + if ( '' !== $name ) { + $mollie_customer->set_name( $name ); + } + + // Locale. + $locale = $pronamic_customer->get_locale(); + + if ( null !== $locale ) { + $mollie_customer->set_locale( LocaleHelper::transform( $locale ) ); + } + } + + // Try to get name from consumer bank details. + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $mollie_customer->get_name() && null !== $consumer_bank_details ) { + $name = $consumer_bank_details->get_name(); + + if ( null !== $name ) { + $mollie_customer->set_name( $name ); + } + } + + // Create customer. + $mollie_customer = $this->client->create_customer( $mollie_customer ); + + $customer_id = $this->customer_data_store->insert_customer( $mollie_customer ); + + // Connect to user. + if ( null !== $pronamic_customer ) { + $user_id = $pronamic_customer->get_user_id(); + + if ( null !== $user_id ) { + $user = \get_user_by( 'id', $user_id ); + + if ( false !== $user ) { + $this->customer_data_store->connect_mollie_customer_to_wp_user( $mollie_customer, $user ); + } + } + } + + // Store customer ID in subscription meta. + $subscription = $payment->get_subscription(); + + if ( null !== $subscription ) { + $subscription->set_meta( 'mollie_customer_id', $mollie_customer->get_id() ); + } + + return $mollie_customer->get_id(); + } + + /** + * Copy Mollie customer ID from subscription meta to WordPress user meta. + * + * @param Payment $payment Payment. + * @return void + */ + public function copy_customer_id_to_wp_user( Payment $payment ) { + if ( $this->config->id !== $payment->config_id ) { + return; + } + + // Subscription. + $subscription = $payment->get_subscription(); + + // Customer. + $customer = $payment->get_customer(); + + if ( null === $customer && null !== $subscription ) { + $customer = $subscription->get_customer(); + } + + if ( null === $customer ) { + return; + } + + // WordPress user. + $user_id = $customer->get_user_id(); + + if ( null === $user_id ) { + return; + } + + $user = \get_user_by( 'id', $user_id ); + + if ( false === $user ) { + return; + } + + // Customer IDs. + $customer_ids = array(); + + // Payment. + $customer_ids[] = $payment->get_meta( 'mollie_customer_id' ); + + // Subscription. + if ( null !== $subscription ) { + $customer_ids[] = $subscription->get_meta( 'mollie_customer_id' ); + } + + // Connect. + $customer_ids = \array_filter( $customer_ids ); + $customer_ids = \array_unique( $customer_ids ); + + foreach ( $customer_ids as $customer_id ) { + $customer = new Customer( $customer_id ); + + $this->customer_data_store->get_or_insert_customer( $customer ); + + $this->customer_data_store->connect_mollie_customer_to_wp_user( $customer, $user ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Install.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Install.php new file mode 100644 index 00000000..fb4313dc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Install.php @@ -0,0 +1,451 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie install. + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class Install { + /** + * Integration. + * + * @var Integration + */ + private $integration; + + /** + * Construct install. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-woocommerce.php#L368 + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-wc-install.php#L1568 + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-wc-install.php#L153-L166 + * @param Integration $integration Integration. + */ + public function __construct( Integration $integration ) { + $this->integration = $integration; + + add_action( 'init', array( $this, 'check_version' ), 5 ); + } + + /** + * Check version. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-wc-install.php#L168-L178 + * @return void + */ + public function check_version() { + $version_option = $this->integration->get_version_option(); + $version = $this->integration->get_version(); + + if ( null === $version_option || null === $version ) { + return; + } + + $version_option = \strval( $version_option ); + $version = \strval( $version ); + + if ( version_compare( $version_option, $version, '<' ) ) { + $this->install(); + } + } + + /** + * Install. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-wc-install.php#L272-L306 + * @return void + */ + public function install() { + $this->create_tables(); + $this->add_foreign_keys(); + $this->convert_user_meta(); + + $this->integration->update_version_option(); + } + + /** + * Create tables. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-wc-install.php#L630-L720 + * @return void + */ + private function create_tables() { + global $wpdb; + + /** + * Requirements. + */ + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + /** + * Table options. + * + * In MySQL 5.6, InnoDB is the default MySQL storage engine. Unless you + * have configured a different default storage engine, issuing a + * CREATE TABLE statement without an ENGINE= clause creates an InnoDB + * table. + * + * @link https://dev.mysql.com/doc/refman/5.6/en/innodb-introduction.html + * + * If a storage engine is specified that is not available, MySQL uses + * the default engine instead. Normally, this is MyISAM. For example, + * if a table definition includes the ENGINE=INNODB option but the MySQL + * server does not support INNODB tables, the table is created as a + * MyISAM table. + * + * @link https://dev.mysql.com/doc/refman/5.6/en/create-table.html + */ + $table_options = 'ENGINE=InnoDB ' . $wpdb->get_charset_collate(); + + /** + * Queries. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/schema.php + */ + $queries = " + CREATE TABLE $wpdb->pronamic_pay_mollie_organizations ( + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + mollie_id varchar(16) NOT NULL, + name varchar(128) DEFAULT NULL, + email varchar(100) DEFAULT NULL, + PRIMARY KEY ( id ), + UNIQUE KEY mollie_id ( mollie_id ) + ) $table_options; + CREATE TABLE $wpdb->pronamic_pay_mollie_profiles ( + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + mollie_id varchar(16) NOT NULL, + organization_id bigint(20) unsigned DEFAULT NULL, + name varchar(128) DEFAULT NULL, + email varchar(100) DEFAULT NULL, + api_key_test varchar(35) DEFAULT NULL, + api_key_live varchar(35) DEFAULT NULL, + PRIMARY KEY ( id ), + UNIQUE KEY mollie_id ( mollie_id ), + KEY organization_id ( organization_id ) + ) $table_options; + CREATE TABLE $wpdb->pronamic_pay_mollie_customers ( + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + mollie_id varchar(16) NOT NULL, + organization_id bigint(20) unsigned DEFAULT NULL, + profile_id bigint(20) unsigned DEFAULT NULL, + test_mode tinyint(1) NOT NULL, + email varchar(100) DEFAULT NULL, + name varchar(255) DEFAULT NULL, + PRIMARY KEY ( id ), + UNIQUE KEY mollie_id ( mollie_id ), + KEY organization_id ( organization_id ), + KEY profile_id ( profile_id ), + KEY test_mode ( test_mode ), + KEY email ( email ) + ) $table_options; + CREATE TABLE $wpdb->pronamic_pay_mollie_customer_users ( + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + customer_id bigint(20) unsigned NOT NULL, + user_id bigint(20) unsigned NOT NULL, + PRIMARY KEY ( id ), + UNIQUE KEY customer_user ( customer_id, user_id ) + ) $table_options; + "; + + /** + * Execute. + * + * @link https://developer.wordpress.org/reference/functions/dbdelta/ + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/upgrade.php#L2538-L2915 + */ + \dbDelta( $queries ); + } + + /** + * Add foreign keys. + * + * @return void + */ + private function add_foreign_keys() { + global $wpdb; + + /** + * Foreign keys. + * + * @link https://core.trac.wordpress.org/ticket/19207 + * @link https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html + */ + $data = array( + (object) array( + 'table' => $wpdb->pronamic_pay_mollie_profiles, + 'name' => 'fk_profile_organization_id', + 'query' => " + ALTER TABLE $wpdb->pronamic_pay_mollie_profiles + ADD CONSTRAINT fk_profile_organization_id + FOREIGN KEY ( organization_id ) + REFERENCES $wpdb->pronamic_pay_mollie_organizations ( id ) + ON DELETE RESTRICT + ON UPDATE RESTRICT + ; + ", + ), + (object) array( + 'table' => $wpdb->pronamic_pay_mollie_customers, + 'name' => 'fk_customer_organization_id', + 'query' => " + ALTER TABLE $wpdb->pronamic_pay_mollie_customers + ADD CONSTRAINT fk_customer_organization_id + FOREIGN KEY ( organization_id ) + REFERENCES $wpdb->pronamic_pay_mollie_organizations ( id ) + ON DELETE RESTRICT + ON UPDATE RESTRICT + ; + ", + ), + (object) array( + 'table' => $wpdb->pronamic_pay_mollie_customers, + 'name' => 'fk_customer_profile_id', + 'query' => " + ALTER TABLE $wpdb->pronamic_pay_mollie_customers + ADD CONSTRAINT fk_customer_profile_id + FOREIGN KEY ( profile_id ) + REFERENCES $wpdb->pronamic_pay_mollie_profiles ( id ) + ON DELETE RESTRICT + ON UPDATE RESTRICT + ; + ", + ), + (object) array( + 'table' => $wpdb->pronamic_pay_mollie_customer_users, + 'name' => 'fk_customer_id', + 'query' => " + ALTER TABLE $wpdb->pronamic_pay_mollie_customer_users + ADD CONSTRAINT fk_customer_id + FOREIGN KEY customer_id ( customer_id ) + REFERENCES $wpdb->pronamic_pay_mollie_customers ( id ) + ON DELETE RESTRICT + ON UPDATE RESTRICT + ; + ", + ), + (object) array( + 'table' => $wpdb->pronamic_pay_mollie_customer_users, + 'name' => 'fk_customer_user_id', + 'query' => " + ALTER TABLE $wpdb->pronamic_pay_mollie_customer_users + ADD CONSTRAINT fk_customer_user_id + FOREIGN KEY user_id ( user_id ) + REFERENCES $wpdb->users ( id ) + ON DELETE CASCADE + ON UPDATE CASCADE + ; + ", + ), + ); + + foreach ( $data as $item ) { + try { + $this->add_foreign_key( $item ); + } catch ( \Exception $e ) { + // Foreign keys are not strictly required. + continue; + } + } + } + + /** + * Add specified foreign key. + * + * @param object $item Foreign key data. + * @return void + * @throws \Exception Throws exception when adding foreign key fails. + * @throws \InvalidArgumentException Throws invalid argument exception if item misses required `table`, `name` or `query` property. + */ + private function add_foreign_key( $item ) { + global $wpdb; + + if ( ! \property_exists( $item, 'table' ) ) { + throw new \InvalidArgumentException( 'Foreign key item must contain `table` property.' ); + } + + if ( ! \property_exists( $item, 'name' ) ) { + throw new \InvalidArgumentException( 'Foreign key item must contain `name` property.' ); + } + + if ( ! \property_exists( $item, 'query' ) ) { + throw new \InvalidArgumentException( 'Foreign key item must contain `query` property.' ); + } + + /** + * Suppress errors. + * + * We suppress errors because adding foreign keys to for example + * a `$wpdb->users` MyISAM table will trigger the following error: + * + * "Error in query (1005): Can't create table '●●●●●●●●. # Sql-●●●●●●●●●●' (errno: 150)" + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-includes/wp-db.php#L1544-L1559 + */ + $suppress_errors = $wpdb->suppress_errors( true ); + + /** + * Check if foreign key exists + * + * @link https://github.com/woocommerce/woocommerce/blob/3.9.0/includes/class-wc-install.php#L663-L681 + */ + $result = $wpdb->get_var( + $wpdb->prepare( + " + SELECT COUNT(*) + FROM information_schema.TABLE_CONSTRAINTS + WHERE CONSTRAINT_SCHEMA = %s + AND CONSTRAINT_NAME = %s + AND CONSTRAINT_TYPE = 'FOREIGN KEY' + AND TABLE_NAME = %s + ", + $wpdb->dbname, + $item->name, + $item->table + ) + ); + + if ( null === $result ) { + throw new \Exception( + \sprintf( + 'Could not count foreign keys: %s, database error: %s.', + $item->name, + $wpdb->last_error + ) + ); + } + + $number_constraints = \intval( $result ); + + if ( 0 === $number_constraints ) { + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Query is prepared. + $result = $wpdb->query( $item->query ); + + $wpdb->suppress_errors( $suppress_errors ); + + if ( false === $result ) { + throw new \Exception( + \sprintf( + 'Could not add foreign key: %s, database error: %s.', + $item->name, + $wpdb->last_error + ) + ); + } + } + + $wpdb->suppress_errors( $suppress_errors ); + } + + /** + * Convert user meta. + * + * @return void + * @throws \Exception Throws exception when database update query fails. + */ + private function convert_user_meta() { + global $wpdb; + + $query = " + INSERT IGNORE INTO $wpdb->pronamic_pay_mollie_customers ( + mollie_id, + test_mode + ) + SELECT + meta_value AS mollie_id, + '_pronamic_pay_mollie_customer_id_test' = meta_key AS test_mode + FROM + $wpdb->usermeta + WHERE + meta_key IN ( + '_pronamic_pay_mollie_customer_id', + '_pronamic_pay_mollie_customer_id_test' + ) + AND + meta_value != '' + ; + "; + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Query is prepared. + $result = $wpdb->query( $query ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Could not convert user meta, database error: %s.', + $wpdb->last_error + ) + ); + } + + /** + * Collate caluse. + * + * Force a specific collate to fix: + * "Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and + * (utf8mb4_unicode_520_ci,IMPLICIT) for operation '='. ". + * + * @link https://dev.mysql.com/doc/refman/8.0/en/charset-collate.html + */ + $collate_clause = ''; + + if ( ! empty( $wpdb->collate ) ) { + $collate_clause = \sprintf( + 'COLLATE %s', + $wpdb->collate + ); + } + + $query = " + INSERT IGNORE INTO $wpdb->pronamic_pay_mollie_customer_users ( + customer_id, + user_id + ) + SELECT + mollie_customer.id AS mollie_customer_id, + wp_user.ID AS wp_user_id + FROM + $wpdb->pronamic_pay_mollie_customers AS mollie_customer + INNER JOIN + $wpdb->usermeta AS wp_user_meta + ON wp_user_meta.meta_value = mollie_customer.mollie_id $collate_clause + INNER JOIN + $wpdb->users AS wp_user + ON wp_user_meta.user_id = wp_user.ID + WHERE + wp_user_meta.meta_key IN ( + '_pronamic_pay_mollie_customer_id', + '_pronamic_pay_mollie_customer_id_test' + ) + AND + wp_user_meta.meta_value != '' + ; + "; + + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Query is prepared. + $result = $wpdb->query( $query ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Could not convert user meta, database error: %s.', + $wpdb->last_error + ) + ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Integration.php new file mode 100644 index 00000000..cd6c0548 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Integration.php @@ -0,0 +1,345 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Subscriptions\Subscription as CoreSubscription; + +/** + * Title: Mollie integration + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.4 + * @since 1.0.0 + */ +class Integration extends AbstractGatewayIntegration { + /** + * REST route namespace. + * + * @var string + */ + const REST_ROUTE_NAMESPACE = 'pronamic-pay/mollie/v1'; + + /** + * Register URL. + * + * @var string + */ + public $register_url; + + /** + * Construct and intialize Mollie integration. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'id' => 'mollie', + 'name' => 'Mollie', + 'version' => '2.1.0', + 'url' => 'http://www.mollie.com/en/', + 'product_url' => \__( 'https://www.mollie.com/en/pricing', 'pronamic_ideal' ), + 'dashboard_url' => 'https://www.mollie.com/dashboard/', + 'provider' => 'mollie', + 'supports' => array( + 'payment_status_request', + 'recurring_direct_debit', + 'recurring_credit_card', + 'recurring', + 'webhook', + 'webhook_log', + 'webhook_no_config', + ), + 'version_option_name' => 'pronamic_pay_mollie_version', + 'db_version_option_name' => 'pronamic_pay_mollie_db_version', + ) + ); + + parent::__construct( $args ); + + // Filters. + $function = array( $this, 'next_payment_delivery_date' ); + + if ( ! \has_filter( 'pronamic_pay_subscription_next_payment_delivery_date', $function ) ) { + \add_filter( 'pronamic_pay_subscription_next_payment_delivery_date', $function, 10, 2 ); + } + + add_filter( 'pronamic_payment_provider_url_mollie', array( $this, 'payment_provider_url' ), 10, 2 ); + + // Tables. + $this->register_tables(); + + /** + * Install. + */ + new Install( $this ); + + /** + * Admin + */ + if ( \is_admin() ) { + new Admin(); + } + + /** + * CLI. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.9.0/includes/class-woocommerce.php#L453-L455 + */ + if ( defined( 'WP_CLI' ) && WP_CLI ) { + new CLI(); + } + } + + /** + * Setup gateway integration. + * + * @return void + */ + public function setup() { + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // Webhook controller. + $webhook_controller = new WebhookController(); + + $webhook_controller->setup(); + } + + /** + * Register tables. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-includes/wp-db.php#L894-L937 + * @return void + */ + private function register_tables() { + global $wpdb; + + /** + * Tables. + */ + $wpdb->pronamic_pay_mollie_organizations = $wpdb->base_prefix . 'pronamic_pay_mollie_organizations'; + $wpdb->pronamic_pay_mollie_profiles = $wpdb->base_prefix . 'pronamic_pay_mollie_profiles'; + $wpdb->pronamic_pay_mollie_customers = $wpdb->base_prefix . 'pronamic_pay_mollie_customers'; + $wpdb->pronamic_pay_mollie_customer_users = $wpdb->base_prefix . 'pronamic_pay_mollie_customer_users'; + } + + /** + * Get settings fields. + * + * @return array>> + */ + public function get_settings_fields() { + $fields = array(); + + // API Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_mollie_api_key', + 'title' => _x( 'API Key', 'mollie', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'API key as mentioned in the payment provider dashboard', 'pronamic_ideal' ), + ); + + // Due date days. + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_NUMBER_INT, + 'meta_key' => '_pronamic_gateway_mollie_due_date_days', + 'title' => _x( 'Due date days', 'mollie', 'pronamic_ideal' ), + 'type' => 'number', + 'min' => 1, + 'max' => 100, + 'classes' => array( 'regular-text' ), + 'tooltip' => __( 'Number of days after which a bank transfer payment expires.', 'pronamic_ideal' ), + 'description' => sprintf( + /* translators: 1: 1, 2: 100, 3: 12 */ + __( 'Minimum %1$s and maximum %2$s days. Default: %3$s days.', 'pronamic_ideal' ), + sprintf( '%s', '1' ), + sprintf( '%s', '100' ), + sprintf( '%s', '12' ) + ), + ); + + // Webhook. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Webhook URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + 'value' => rest_url( self::REST_ROUTE_NAMESPACE . '/webhook' ), + 'readonly' => true, + 'tooltip' => __( 'The Webhook URL as sent with each transaction to receive automatic payment status updates on.', 'pronamic_ideal' ), + ); + + return $fields; + } + + /** + * Save post. + * + * @link https://developer.wordpress.org/reference/functions/get_post_meta/ + * @param int $post_id Post ID. + * @return void + */ + public function save_post( $post_id ) { + $api_key = get_post_meta( $post_id, '_pronamic_gateway_mollie_api_key', true ); + + if ( ! is_string( $api_key ) ) { + return; + } + + $api_key_prefix = substr( $api_key, 0, 4 ); + + switch ( $api_key_prefix ) { + case 'live': + update_post_meta( $post_id, '_pronamic_gateway_mode', Gateway::MODE_LIVE ); + + return; + case 'test': + update_post_meta( $post_id, '_pronamic_gateway_mode', Gateway::MODE_TEST ); + + return; + } + } + + /** + * Payment provider URL. + * + * @param string|null $url Payment provider URL. + * @param Payment $payment Payment. + * @return string|null + */ + public function payment_provider_url( $url, Payment $payment ) { + $transaction_id = $payment->get_transaction_id(); + + if ( null === $transaction_id ) { + return $url; + } + + return sprintf( + 'https://www.mollie.com/dashboard/payments/%s', + $transaction_id + ); + } + /** + * Get configuration by post ID. + * + * @param int $post_id Post ID. + * @return Config + */ + public function get_config( $post_id ) { + $config = new Config(); + + $config->id = intval( $post_id ); + $config->api_key = $this->get_meta( $post_id, 'mollie_api_key' ); + $config->mode = $this->get_meta( $post_id, 'mode' ); + $config->due_date_days = $this->get_meta( $post_id, 'mollie_due_date_days' ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } + + /** + * Next payment delivery date. + * + * @param DateTime $next_payment_delivery_date Next payment delivery date. + * @param CoreSubscription $subscription Subscription. + * @return DateTime + */ + public function next_payment_delivery_date( DateTime $next_payment_delivery_date, CoreSubscription $subscription ) { + $config_id = $subscription->get_config_id(); + + if ( null === $config_id ) { + return $next_payment_delivery_date; + } + + // Check gateway. + $gateway_id = \get_post_meta( $config_id, '_pronamic_gateway_id', true ); + + if ( 'mollie' !== $gateway_id ) { + return $next_payment_delivery_date; + } + + // Check direct debit payment method. + $method = $subscription->payment_method; + + if ( null === $method ) { + return $next_payment_delivery_date; + } + + if ( ! PaymentMethods::is_direct_debit_method( $method ) ) { + return $next_payment_delivery_date; + } + + // Base delivery date on next payment date. + $next_payment_date = $subscription->get_next_payment_date(); + + if ( null === $next_payment_date ) { + return $next_payment_delivery_date; + } + + $next_payment_delivery_date = clone $next_payment_date; + + // Textual representation of the day of the week, Sunday through Saturday. + $day_of_week = $next_payment_delivery_date->format( 'l' ); + + /* + * Subtract days from next payment date for earlier delivery. + * + * @link https://help.mollie.com/hc/en-us/articles/115000785649-When-are-direct-debit-payments-processed-and-paid-out- + * @link https://help.mollie.com/hc/en-us/articles/115002540294-What-are-the-payment-methods-processing-times- + */ + switch ( $day_of_week ) { + case 'Monday': + $next_payment_delivery_date->modify( '-3 days' ); + + break; + case 'Saturday': + $next_payment_delivery_date->modify( '-2 days' ); + + break; + case 'Sunday': + $next_payment_delivery_date->modify( '-3 days' ); + + break; + default: + $next_payment_delivery_date->modify( '-1 day' ); + + break; + } + + $next_payment_delivery_date->setTime( 0, 0, 0 ); + + return $next_payment_delivery_date; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/LocaleHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/LocaleHelper.php new file mode 100644 index 00000000..04fd2acf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/LocaleHelper.php @@ -0,0 +1,89 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie locale helper + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.9 + * @since 1.0.0 + */ +class LocaleHelper { + /** + * Get Mollie locale by the specified WordPress locale. + * + * @param string|null $locale Locale string (en_US) to transform to Mollie locale. + * @return string|null + */ + public static function transform( $locale ) { + if ( ! \is_string( $locale ) ) { + return null; + } + + /** + * Supported locales. + * + * @var array + */ + $supported = array( + Locales::EN_US, + Locales::NL_NL, + Locales::NL_BE, + Locales::FR_FR, + Locales::FR_BE, + Locales::DE_DE, + Locales::DE_AT, + Locales::DE_CH, + Locales::ES_ES, + Locales::CA_ES, + Locales::PT_PT, + Locales::IT_IT, + Locales::NB_NO, + Locales::SV_SE, + Locales::FI_FI, + Locales::DA_DK, + Locales::IS_IS, + Locales::HU_HU, + Locales::PL_PL, + Locales::LV_LV, + Locales::LT_LT, + ); + + // Lowercase. + $locale = \strtolower( $locale ); + + // Is supported? + $supported_lowercase = \array_map( 'strtolower', $supported ); + + $search = \array_search( $locale, $supported_lowercase, true ); + + // Locale not supported. + if ( false === $search ) { + return null; + } + + /** + * As with all internal PHP functions as of 5.3.0, `array_search()` + * returns `NULL` if invalid parameters are passed to it. + * + * @link https://www.php.net/array_search + */ + if ( \array_key_exists( $search, $supported ) ) { + return $supported[ $search ]; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Locales.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Locales.php new file mode 100644 index 00000000..f0227a7a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Locales.php @@ -0,0 +1,170 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie locales + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.0.0 + */ +class Locales { + /** + * English (US). + * + * @var string + */ + const EN_US = 'en_US'; + + /** + * Dutch (Netherlands). + * + * @var string + */ + const NL_NL = 'nl_NL'; + + /** + * Dutch (Belgium). + * + * @var string + */ + const NL_BE = 'nl_BE'; + + /** + * French (France). + * + * @var string + */ + const FR_FR = 'fr_FR'; + + /** + * French (Belgium). + * + * @var string + */ + const FR_BE = 'fr_BE'; + + /** + * German (Germany). + * + * @var string + */ + const DE_DE = 'de_DE'; + + /** + * German (Austria). + * + * @var string + */ + const DE_AT = 'de_AT'; + + /** + * German (Switzerland). + * + * @var string + */ + const DE_CH = 'de_CH'; + + /** + * Spanish (Spain). + * + * @var string + */ + const ES_ES = 'es_ES'; + + /** + * Catalan (Spain). + * + * @var string + */ + const CA_ES = 'ca_ES'; + + /** + * Portuguese (Portugal). + * + * @var string + */ + const PT_PT = 'pt_PT'; + + /** + * Italian (Italy). + * + * @var string + */ + const IT_IT = 'it_IT'; + + /** + * Norwegian (Norway). + * + * @var string + */ + const NB_NO = 'nb_NO'; + + /** + * Swedish (Sweden). + * + * @var string + */ + const SV_SE = 'sv_SE'; + + /** + * Finish (Finland). + * + * @var string + */ + const FI_FI = 'fi_FI'; + + /** + * Danish (Denmark). + * + * @var string + */ + const DA_DK = 'da_DK'; + + /** + * Icelandic (Iceland). + * + * @var string + */ + const IS_IS = 'is_IS'; + + /** + * Hungarian (Hungary). + * + * @var string + */ + const HU_HU = 'hu_HU'; + + /** + * Polish (Poland). + * + * @var string + */ + const PL_PL = 'pl_PL'; + + /** + * Latvian (Latvia). + * + * @var string + */ + const LV_LV = 'lv_LV'; + + /** + * Lithuanian (Lithuania). + * + * @var string + */ + const LT_LT = 'lt_LT'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Methods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Methods.php new file mode 100644 index 00000000..347d77ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Methods.php @@ -0,0 +1,205 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: Mollie methods + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.9 + * @since 1.0.0 + */ +class Methods { + /** + * Constant for the Apple Pay method. + * + * @var string + */ + const APPLE_PAY = 'applepay'; + + /** + * Constant for the Bancontact method. + * + * @var string + */ + const BANCONTACT = 'bancontact'; + + /** + * Constant for the iDEAL method. + * + * @var string + */ + const IDEAL = 'ideal'; + + /** + * Constant for the Credit Card method. + * + * @var string + */ + const CREDITCARD = 'creditcard'; + + /** + * Constant for the Direct Debit method. + * + * @var string + */ + const DIRECT_DEBIT = 'directdebit'; + + /** + * Constant for the Sofort method. + * + * @var string + */ + const SOFORT = 'sofort'; + + /** + * Constant for the Bank transfer method. + * + * @var string + */ + const BANKTRANSFER = 'banktransfer'; + + /** + * Constant for the EPS method. + * + * @var string + */ + const EPS = 'eps'; + + /** + * Constant for the Giropay method. + * + * @var string + */ + const GIROPAY = 'giropay'; + + /** + * Constant for the PayPal method. + * + * @var string + */ + const PAYPAL = 'paypal'; + + /** + * Constant for the Paysafecard method. + * + * @var string + */ + const PAYSAFECARD = 'paysafecard'; + + /** + * Constant for the Gift cards method. + * + * @link https://www.mollie.com/en/giftcards + * @since 1.1.10 + * @var string + */ + const PODIUMCADEAUKAART = 'podiumcadeaukaart'; + + /** + * Constant for the Przelewy24 method. + * + * @var string + */ + const PRZELEWY24 = 'przelewy24'; + + /** + * Constant for the KBC/CBC Payment Button method. + * + * @link https://www.mollie.com/en/kbccbc + * @since 1.1.10 + * @var string + */ + const KBC = 'kbc'; + + /** + * Constant for the Belfius Direct Net method. + * + * @link https://www.mollie.com/en/belfiusdirectnet + * @since 1.1.10 + * @var string + */ + const BELFIUS = 'belfius'; + + /** + * Payments methods map. + * + * @var array + */ + private static $map = array( + PaymentMethods::APPLE_PAY => self::APPLE_PAY, + PaymentMethods::BANCONTACT => self::BANCONTACT, + PaymentMethods::BANK_TRANSFER => self::BANKTRANSFER, + PaymentMethods::CREDIT_CARD => self::CREDITCARD, + PaymentMethods::DIRECT_DEBIT => self::DIRECT_DEBIT, + PaymentMethods::DIRECT_DEBIT_BANCONTACT => self::DIRECT_DEBIT, + PaymentMethods::DIRECT_DEBIT_IDEAL => self::DIRECT_DEBIT, + PaymentMethods::DIRECT_DEBIT_SOFORT => self::DIRECT_DEBIT, + PaymentMethods::EPS => self::EPS, + PaymentMethods::GIROPAY => self::GIROPAY, + PaymentMethods::PAYPAL => self::PAYPAL, + PaymentMethods::PRZELEWY24 => self::PRZELEWY24, + PaymentMethods::SOFORT => self::SOFORT, + PaymentMethods::IDEAL => self::IDEAL, + PaymentMethods::KBC => self::KBC, + PaymentMethods::BELFIUS => self::BELFIUS, + ); + + /** + * Transform WordPress payment method to Mollie method. + * + * @since 1.1.6 + * + * @param string|null $payment_method Payment method. + * @param mixed $default Default payment method. + * @return string|null + */ + public static function transform( $payment_method, $default = null ) { + if ( ! \is_scalar( $payment_method ) ) { + return null; + } + + if ( isset( self::$map[ $payment_method ] ) ) { + return self::$map[ $payment_method ]; + } + + if ( ! empty( $default ) ) { + return $default; + } + + return null; + } + + /** + * Transform Mollie method to WordPress payment method. + * + * @param string|null $method Mollie method. + * @return string|null + */ + public static function transform_gateway_method( $method ) { + if ( ! \is_scalar( $method ) ) { + return null; + } + + $payment_method = \array_search( $method, self::$map, true ); + + if ( false === $payment_method ) { + return null; + } + + return \strval( $payment_method ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Payment.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Payment.php new file mode 100644 index 00000000..1a2a38e4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Payment.php @@ -0,0 +1,330 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use DateTimeInterface; + +/** + * Payment + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class Payment extends BaseResource { + /** + * The payment’s status. + * + * @var string + */ + private $status; + + /** + * The payment method used for this payment, either forced on creation by specifying the method parameter, or chosen by the customer on our payment method selection screen. + * + * @var string|null + */ + private $method; + + /** + * The identifier referring to the profile this payment was created on. + * + * @var string + */ + private $profile_id; + + /** + * If a customer was specified upon payment creation, the customer’s token will be available here as well. + * + * @var string|null + */ + private $customer_id; + + /** + * If the payment is a first or recurring payment, this field will hold the ID of the mandate. + * + * @var string|null + */ + private $mandate_id; + + /** + * Payment method specific details. + * + * @var PaymentDetails|null + */ + private $details; + + /** + * The mode used to create this payment. Mode determines whether a payment is real (live mode) or a test payment. + * + * @var string + */ + private $mode; + + /** + * The payment’s date and time of creation, in ISO 8601 format. + * + * @var DateTimeInterface + */ + private $created_at; + + /** + * The amount of the payment, e.g. {"currency":"EUR", "value":"100.00"} for a €100.00 payment. + * + * @var Amount + */ + private $amount; + + /** + * A short description of the payment. The description is visible in the Dashboard and will be shown on the customer’s bank or card statement when possible. + * + * @var string + */ + private $description; + + /** + * The URL your customer will be redirected to after completing or canceling the payment process. + * + * @var string|null + */ + private $redirect_url; + + /** + * The optional metadata you provided upon payment creation. Metadata can for example be used to link an order to a payment. + * + * @var string + */ + private $metadata; + + /** + * The customer’s locale, either forced on creation by specifying the `locale` parameter, or detected by us during checkout. Will be a full locale, for example `nl_NL`. + * + * @var string + */ + private $locale; + + /** + * Indicates which type of payment this is in a recurring sequence. + * Set to `first` for first payments that allow the customer to agree to automatic recurring charges taking place on their account in the future. + * Set to `recurring` for payments where the customer’s card is charged automatically. + * Set to `oneoff` by default, which indicates the payment is a regular non-recurring payment. + * + * @var string + */ + private $sequence_type; + + /** + * For bank transfer payments, the `_links` object will contain some additional URL objects relevant to the payment. + * + * @var object + */ + private $links; + + /** + * Construct payment. + * + * @param string $id Identifier. + * @param string $mode Mode. + * @param DateTimeInterface $created_at Created at. + * @param string $status Status. + * @param Amount $amount Amount. + * @param string $description Description. + * @param string|null $redirect_url Redirect URL. + * @param string|null $method Method. + * @param string $metadata Metadata. + * @param string $locale Locale. + * @param string $profile_id Profile ID. + * @param string $sequence_type Sequence type. + * @param object $links Links. + */ + public function __construct( $id, $mode, DateTimeInterface $created_at, $status, Amount $amount, $description, $redirect_url, $method, $metadata, $locale, $profile_id, $sequence_type, $links ) { + parent::__construct( $id ); + + $this->mode = $mode; + $this->created_at = $created_at; + $this->status = $status; + $this->amount = $amount; + $this->description = $description; + $this->redirect_url = $redirect_url; + $this->method = $method; + $this->metadata = $metadata; + $this->locale = $locale; + $this->profile_id = $profile_id; + $this->sequence_type = $sequence_type; + $this->links = $links; + } + + /** + * Get status. + * + * @return string + */ + public function get_status() { + return $this->status; + } + + /** + * Get method. + * + * @return string|null + */ + public function get_method() { + return $this->method; + } + + /** + * Get profile ID. + * + * @return string + */ + public function get_profile_id() { + return $this->profile_id; + } + + /** + * Get customer ID. + * + * @return string|null + */ + public function get_customer_id() { + return $this->customer_id; + } + + /** + * Set customer ID. + * + * @param string|null $customer_id Customer ID. + * @return void + */ + public function set_customer_id( $customer_id ) { + $this->customer_id = $customer_id; + } + + /** + * Get mandate ID. + * + * @return string|null + */ + public function get_mandate_id() { + return $this->mandate_id; + } + + /** + * Set mandate ID. + * + * @param string|null $mandate_id Mandate ID. + * @return void + */ + public function set_mandate_id( $mandate_id ) { + $this->mandate_id = $mandate_id; + } + + /** + * Has chargebacks. + * + * @link https://github.com/mollie/mollie-api-php/blob/v2.24.0/src/Resources/Payment.php#L358-L366 + * @return bool True if payment has chargebacks, false otherwise. + */ + public function has_chargebacks() { + return ! empty( $this->links->chargebacks ); + } + + /** + * Get payment method specific details. + * + * @return PaymentDetails|null + */ + public function get_details() { + return $this->details; + } + + /** + * Set payment method specific details. + * + * @param PaymentDetails|null $details Details. + * @return void + */ + public function set_details( PaymentDetails $details = null ) { + $this->details = $details; + } + + /** + * Get links. + * + * @return object + */ + public function get_links() { + return $this->links; + } + + /** + * Set links. + * + * @param object $links Links. + * @return void + */ + public function set_links( $links ) { + $this->links = $links; + } + + /** + * Create payment from JSON. + * + * @link https://docs.mollie.com/reference/v2/payments-api/get-payment + * @param object $json JSON object. + * @return Payment + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $json, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + $payment = new Payment( + $json->id, + $json->mode, + new \DateTimeImmutable( $json->createdAt ), + $json->status, + Amount::from_json( $json->amount ), + $json->description, + $json->redirectUrl, + $json->method, + $json->metadata, + $json->locale, + $json->profileId, + $json->sequenceType, + $json->_links + ); + + if ( \property_exists( $json, 'customerId' ) ) { + $payment->set_customer_id( $json->customerId ); + } + + if ( \property_exists( $json, 'mandateId' ) ) { + $payment->set_mandate_id( $json->mandateId ); + } + + if ( \property_exists( $json, 'details' ) ) { + $payment->set_details( PaymentDetails::from_json( (string) $payment->get_method(), $json->details ) ); + } + + // phpcs:enable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Mollie JSON object. + + return $payment; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/PaymentDetails.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/PaymentDetails.php new file mode 100644 index 00000000..3c8e1d75 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/PaymentDetails.php @@ -0,0 +1,53 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Payment Details + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class PaymentDetails { + /** + * Create payment detailsfrom JSON. + * + * @link https://docs.mollie.com/reference/v2/payments-api/get-payment + * @param string $method Payment method. + * @param object|null $json JSON object. + * @return PaymentDetails|null + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $method, $json ) { + if ( null === $json ) { + return null; + } + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $json, + (object) array( + '$ref' => 'file://' . realpath( __DIR__ . '/../json-schemas/payment-details.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $details = new PaymentDetails(); + + foreach ( $json as $key => $value ) { + $details->{$key} = $value; + } + + return $details; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/PaymentRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/PaymentRequest.php new file mode 100644 index 00000000..e101d599 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/PaymentRequest.php @@ -0,0 +1,338 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie payment request + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.4 + * @since 1.0.0 + */ +class PaymentRequest { + /** + * The amount in EURO that you want to charge, e.g. `{"currency":"EUR", "value":"100.00"}` + * if you would want to charge € 100,00. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var Amount + */ + public $amount; + + /** + * The description of the payment you're creating. This will be shown to the consumer on their + * card or bank statement when possible. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var string + */ + public $description; + + /** + * The URL the consumer will be redirected to after the payment process. It could make sense + * for the redirectURL to contain a unique identifier – like your order ID – so you can show + * the right page referencing the order when the consumer returns. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var string|null + */ + public $redirect_url; + + /** + * Use this parameter to set a wehook URL for this payment only. Mollie will ignore any webhook + * set in your website profile for this payment. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var string|null + */ + public $webhook_url; + + /** + * Normally, a payment method selection screen is shown. However, when using this parameter, + * your customer will skip the selection screen and will be sent directly to the chosen payment + * method. The parameter enables you to fully integrate the payment method selection into your + * website, however note Mollie's country based conversion optimization is lost. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var string|null + */ + public $method; + + /** + * Provide any data you like in JSON notation, and we will save the data alongside the payment. + * Whenever you fetch the payment with our API, we'll also include the metadata. You can use up + * to 1kB of JSON. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @link https://en.wikipedia.org/wiki/Metadata + * @var mixed|null + */ + private $metadata; + + /** + * Allow you to preset the language to be used in the payment screens shown to the consumer. + * When this parameter is not provided, the browser language will be used instead (which is + * usually more accurate). + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var string|null + */ + public $locale; + + /** + * Payment method specific parameters + */ + + /** + * An iDEAL issuer ID, for example ideal_INGNL2A. The returned payment URL will deep-link into + * the specific banking website (ING Bank, in this example). For a list of issuers, refer to the + * Issuers API. + * + * @link https://www.mollie.com/nl/docs/reference/payments/create + * @var string|null + */ + public $issuer; + + /** + * Billing email. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @var string|null + */ + private $billing_email; + + /** + * The date the payment should expire, in YYYY-MM-DD format. Please note: the minimum date + * is tomorrow and the maximum date is 100 days after tomorrow. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @var \DateTimeInterface|null + */ + private $due_date; + + /** + * Customer ID for Mollie checkout. + * + * @link https://www.mollie.com/nl/docs/checkout + * @var string|null + */ + public $customer_id; + + /** + * Sequence type for Mollie Recurring. + * + * @link https://docs.mollie.com/payments/recurring#:~:text=sequenceType + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment#:~:text=sequenceType + * @since 1.1.9 + * @var string|null + */ + public $sequence_type; + + /** + * Mandate ID. + * + * When creating recurring payments, the ID of a specific Mandate may be + * supplied to indicate which of the consumer’s accounts should be + * credited. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment#:~:text=mandateId + * @link https://docs.mollie.com/reference/v2/payments-api/get-payment#:~:text=mandateId + * @since unreleased + * @var string|null + */ + public $mandate_id; + + /** + * Consumer name for SEPA Direct Debit. + * + * Beneficiary name of the account holder. Only available if one-off payments are enabled + * on your account. Will pre-fill the beneficiary name in the checkout screen if present. + * + * @var string|null + */ + public $consumer_name; + + /** + * Consumer account for SEPA Direct Debit. + * + * IBAN of the account holder. Only available if one-off payments are enabled on your account. + * Will pre-fill the IBAN in the checkout screen if present. + * + * @var string|null + */ + public $consumer_account; + + /** + * Create Mollie payment request object. + * + * @param Amount $amount The amount that you want to charge. + * @param string $description The description of the payment you’re creating. + */ + public function __construct( $amount, $description ) { + $this->amount = $amount; + $this->description = $description; + } + + /** + * Get due date. + * + * @return null|\DateTimeInterface + */ + public function get_due_date() { + return $this->due_date; + } + + /** + * Set due date. + * + * @param null|\DateTimeInterface $due_date Due date. + * @return void + */ + public function set_due_date( $due_date ) { + $this->due_date = $due_date; + } + + /** + * Get billing email. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @return string|null + */ + public function get_billing_email() { + return $this->billing_email; + } + + /** + * Set billing email. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @param string|null $email Billing email. + * @return void + */ + public function set_billing_email( $email = null ) { + $this->billing_email = $email; + } + + /** + * Get sequence type. + * + * @return string|null + */ + public function get_sequence_type() { + return $this->sequence_type; + } + + /** + * Set sequence type. + * + * @param string|null $sequence_type Sequence type. + * @return void + */ + public function set_sequence_type( $sequence_type = null ) { + $this->sequence_type = $sequence_type; + } + + /** + * Get mandate ID. + * + * When creating recurring payments, the ID of a specific Mandate may be + * supplied to indicate which of the consumer’s accounts should be + * credited. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment#:~:text=mandateId + * @link https://docs.mollie.com/reference/v2/payments-api/get-payment#:~:text=mandateId + * @return string|null + */ + public function get_mandate_id() { + return $this->mandate_id; + } + + /** + * Set mandate ID. + * + * When creating recurring payments, the ID of a specific Mandate may be + * supplied to indicate which of the consumer’s accounts should be + * credited. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment#:~:text=mandateId + * @link https://docs.mollie.com/reference/v2/payments-api/get-payment#:~:text=mandateId + * @param string|null $mandate_id Mandate ID. + * @return void + */ + public function set_mandate_id( $mandate_id = null ) { + $this->mandate_id = $mandate_id; + } + + /** + * Get metadata. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @link https://en.wikipedia.org/wiki/Metadata + * @return mixed + */ + public function get_metadata() { + return $this->metadata; + } + + /** + * Set metadata. + * + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @link https://en.wikipedia.org/wiki/Metadata + * @param mixed $metadata Metadata. + * @return void + */ + public function set_metadata( $metadata = null ) { + $this->metadata = $metadata; + } + + /** + * Get array of this Mollie payment request object. + * + * @return array + */ + public function get_array() { + // Due date. + $due_date = $this->get_due_date(); + + if ( null !== $due_date ) { + $due_date = $due_date->format( 'Y-m-d' ); + } + + $array = array( + 'amount' => $this->amount->get_json(), + 'description' => $this->description, + 'method' => $this->method, + 'redirectUrl' => $this->redirect_url, + 'metadata' => $this->metadata, + 'locale' => $this->locale, + 'webhookUrl' => $this->webhook_url, + 'consumerName' => $this->consumer_name, + 'consumerAccount' => $this->consumer_account, + 'issuer' => $this->issuer, + 'billingEmail' => $this->billing_email, + 'dueDate' => $due_date, + 'sequenceType' => $this->sequence_type, + 'customerId' => $this->customer_id, + 'mandateId' => $this->mandate_id, + ); + + /* + * Array filter will remove values NULL, FALSE and empty strings ('') + */ + $array = array_filter( $array ); + + return $array; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Profile.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Profile.php new file mode 100644 index 00000000..50e050a6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Profile.php @@ -0,0 +1,153 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Mollie profile. + * + * @link https://docs.mollie.com/reference/v2/profiles-api/create-profile + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class Profile { + /** + * ID. + * + * @var string|null + */ + private $id; + + /** + * Mode. + * + * @var string|null + */ + private $mode; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * Email. + * + * @var string|null + */ + private $email; + + /** + * Get ID. + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set ID. + * + * @param string|null $id ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get mode. + * + * @return string|null + */ + public function get_mode() { + return $this->mode; + } + + /** + * Set mode. + * + * @param string|null $mode Mode. + * @return void + */ + public function set_mode( $mode ) { + $this->mode = $mode; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get email. + * + * @return string|null + */ + public function get_email() { + return $this->email; + } + + /** + * Set email. + * + * @param string|null $email Email. + * @return void + */ + public function set_email( $email ) { + $this->email = $email; + } + + /** + * Create profile from object. + * + * @param object $object Object. + * @return Profile + */ + public static function from_object( $object ) { + $profile = new self(); + + if ( property_exists( $object, 'id' ) ) { + $profile->set_id( $object->id ); + } + + if ( property_exists( $object, 'mode' ) ) { + $profile->set_mode( $object->mode ); + } + + if ( property_exists( $object, 'name' ) ) { + $profile->set_name( $object->name ); + } + + if ( property_exists( $object, 'email' ) ) { + $profile->set_email( $object->email ); + } + + return $profile; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/ProfileDataStore.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/ProfileDataStore.php new file mode 100644 index 00000000..e2a5e618 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/ProfileDataStore.php @@ -0,0 +1,203 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie profile data store + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class ProfileDataStore { + /** + * Get or insert profile. + * + * @param Profile $profile Profile. + * @param array $data Data. + * @param array $format Format. + * @return int + * @throws \Exception Throws exception if Mollie profile ID could not be retrieved from existing profile. + */ + public function get_or_insert_profile( Profile $profile, $data = array(), $format = array() ) { + $profile_data = $this->get_profile( $profile ); + + if ( null !== $profile_data ) { + if ( ! \property_exists( $profile_data, 'id' ) ) { + throw new \Exception( 'Unable to get Mollie profile ID for existing profile.' ); + } + + return $profile_data->id; + } + + return $this->insert_profile( $profile, $data, $format ); + } + + /** + * Get profile data for specified Mollie profile. + * + * @param Profile $profile Profile. + * @return object|null + */ + public function get_profile( Profile $profile ) { + global $wpdb; + + $id = $profile->get_id(); + + if ( null === $id ) { + return null; + } + + $data = $wpdb->get_row( + $wpdb->prepare( + " + SELECT + * + FROM + $wpdb->pronamic_pay_mollie_profiles + WHERE + mollie_id = %s + LIMIT + 1 + ; + ", + $id + ) + ); + + return $data; + } + + /** + * Insert Mollie profile. + * + * @param Profile $profile Profile. + * @param array $data Data. + * @param array $format Format. + * @return int + * @throws \Exception Throws exception on error. + */ + public function insert_profile( Profile $profile, $data = array(), $format = array() ) { + global $wpdb; + + $mollie_id = $profile->get_id(); + + if ( empty( $mollie_id ) ) { + throw new \Exception( 'Can not insert Mollie profile with empty ID.' ); + } + + $data['mollie_id'] = $mollie_id; + $format['mollie_id'] = '%s'; + + $data['email'] = $profile->get_email(); + $format['email'] = '%s'; + + $data['name'] = $profile->get_name(); + $format['name'] = '%s'; + + $result = $wpdb->insert( + $wpdb->pronamic_pay_mollie_profiles, + $data, + $format + ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Could not insert Mollie profile ID: %s, error: %s.', + $mollie_id, + $wpdb->last_error + ) + ); + } + + $id = $wpdb->insert_id; + + return $id; + } + + /** + * Update Mollie profile. + * + * @param Profile $profile Profile. + * @param array $data Data. + * @param array $format Format. + * @return int The number of rows updated. + * @throws \Exception Throws exception on error. + */ + public function update_profile( Profile $profile, $data = array(), $format = array() ) { + global $wpdb; + + $mollie_id = $profile->get_id(); + + if ( empty( $mollie_id ) ) { + throw new \Exception( 'Can not update Mollie profile with empty ID.' ); + } + + $data['email'] = $profile->get_email(); + $format['email'] = '%s'; + + $data['name'] = $profile->get_name(); + $format['name'] = '%s'; + + $result = $wpdb->update( + $wpdb->pronamic_pay_mollie_profiles, + $data, + array( + 'mollie_id' => $mollie_id, + ), + $format, + array( + 'mollie_id' => '%s', + ) + ); + + if ( false === $result ) { + throw new \Exception( + sprintf( + 'Could not update Mollie profile ID: %s, error: %s.', + $mollie_id, + $wpdb->last_error + ) + ); + } + + return $result; + } + + /** + * Save Mollie profile. + * + * @param Profile $profile Profile. + * @param array $data Data. + * @param array $format Format. + * @return int + * @throws \Exception Throws exception if unable to update existing profile. + */ + public function save_profile( Profile $profile, $data = array(), $format = array() ) { + $profile_data = $this->get_profile( $profile ); + + if ( null !== $profile_data ) { + if ( ! \property_exists( $profile_data, 'id' ) ) { + throw new \Exception( 'Can not update Mollie profile without ID.' ); + } + + $this->update_profile( $profile, $data, $format ); + + return $profile_data->id; + } + + return $this->insert_profile( $profile, $data, $format ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Sequence.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Sequence.php new file mode 100644 index 00000000..39fc26c9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Sequence.php @@ -0,0 +1,51 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Title: Mollie sequence + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 1.1.9 + */ +class Sequence { + /** + * Constant for one-off payment. + * + * @var string + */ + const ONE_OFF = 'oneoff'; + + /** + * Constant for the first payment. + * + * @var string + */ + const FIRST = 'first'; + + /** + * Constant for recurring payments. + * + * @var string + */ + const RECURRING = 'recurring'; + + /** + * Constant for subscription payments. + * + * @var string + */ + const SUBSCRIPTION = 'subscription'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Statuses.php new file mode 100644 index 00000000..d6ad6f96 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/Statuses.php @@ -0,0 +1,102 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Title: Mollie statuses constants + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @link https://docs.mollie.com/payments/status-changes + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.0.0 + */ +class Statuses { + /** + * Authorized. + * + * @var string + */ + const AUTHORIZED = 'authorized'; + + /** + * Open. + * + * @var string + */ + const OPEN = 'open'; + + /** + * Canceled. + * + * @var string + */ + const CANCELED = 'canceled'; + + /** + * Paid. + * + * @var string + */ + const PAID = 'paid'; + + /** + * Expired. + * + * @var string + */ + const EXPIRED = 'expired'; + + /** + * Failed. + * + * @since 2.0.3 + * @var string + */ + const FAILED = 'failed'; + + /** + * Pending. + * + * @var string + */ + const PENDING = 'pending'; + + /** + * Transform an Mollie state to an more global status. + * + * @param string $status Mollie status. + * + * @return string|null Pay status. + */ + public static function transform( $status ) { + switch ( $status ) { + case self::PENDING: + case self::OPEN: + return PaymentStatus::OPEN; + case self::CANCELED: + return PaymentStatus::CANCELLED; + case self::PAID: + return PaymentStatus::SUCCESS; + case self::EXPIRED: + return PaymentStatus::EXPIRED; + case self::FAILED: + return PaymentStatus::FAILURE; + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/WebhookController.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/WebhookController.php new file mode 100644 index 00000000..ba27821f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/src/WebhookController.php @@ -0,0 +1,142 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\Pay\Plugin; +use WP_Error; + +/** + * Webhook controller + * + * @link https://docs.mollie.com/guides/webhooks + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class WebhookController { + /** + * Setup. + * + * @return void + */ + public function setup() { + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + + add_action( 'wp_loaded', array( $this, 'wp_loaded' ) ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * + * @return void + */ + public function rest_api_init() { + register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/webhook', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_mollie_webhook' ), + 'args' => array( + 'id' => array( + 'required' => true, + ), + ), + 'permission_callback' => '__return_true', + ) + ); + } + + /** + * REST API Mollie webhook handler. + * + * @param \WP_REST_Request $request Request. + * @return object + */ + public function rest_api_mollie_webhook( \WP_REST_Request $request ) { + $id = $request->get_param( 'id' ); + + /** + * Result. + * + * @link https://developer.wordpress.org/reference/functions/wp_send_json_success/ + */ + $response = \rest_ensure_response( + array( + 'success' => true, + 'id' => $id, + ) + ); + + if ( ! ( $response instanceof WP_Error ) ) { + $response->add_link( 'self', rest_url( $request->get_route() ) ); + } + + $payment = null; + + if ( ! empty( $id ) ) { + $payment = \get_pronamic_payment_by_transaction_id( $id ); + } + + if ( null === $payment ) { + /** + * How to handle unknown IDs? + * + * To not leak any information to malicious third parties, it is recommended + * to return a 200 OK response even if the ID is not known to your system. + * + * @link https://docs.mollie.com/guides/webhooks#how-to-handle-unknown-ids + */ + return $response; + } + + // Add note. + $note = \sprintf( + /* translators: %s: payment provider name */ + \__( 'Webhook requested by %s.', 'pronamic_ideal' ), + \__( 'Mollie', 'pronamic_ideal' ) + ); + + $payment->add_note( $note ); + + // Log webhook request. + \do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment, false ); + + return $response; + } + + /** + * WordPress loaded, check for deprecated webhook call. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-includes/rest-api.php#L277-L309 + * @return void + */ + public function wp_loaded() { + if ( ! filter_has_var( INPUT_GET, 'mollie_webhook' ) ) { + return; + } + + if ( ! filter_has_var( INPUT_POST, 'id' ) ) { + return; + } + + \rest_get_server()->serve_request( '/pronamic-pay/mollie/v1/webhook' ); + + exit; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/meta-box-payment.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/meta-box-payment.php new file mode 100644 index 00000000..743af5bb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/meta-box-payment.php @@ -0,0 +1,83 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + * + * @since 1.1.6 + * @link https://github.com/WordPress/WordPress/blob/4.5.2/wp-admin/user-edit.php#L578-L600 + */ + +$payment = \get_pronamic_payment( $post->ID ); + +// Check valid payment. +if ( null === $payment ) { + return; +} + +$mollie_payment_id = $payment->get_transaction_id(); +$mollie_customer_id = $payment->get_meta( 'mollie_customer_id' ); + +?> +

    + 'pronamic_pay_mollie_payments', + 'id' => $mollie_payment_id, + ), + \admin_url( 'admin.php' ) + ); + + echo \wp_kses( + \sprintf( + /* translators: %s: Mollie payment ID anchor. */ + \__( 'Payment: %s', 'pronamic_ideal' ), + \sprintf( + '%s', + \esc_url( $payment_url ), + \esc_html( (string) $mollie_payment_id ) + ) + ), + array( + 'a' => array( + 'href' => true, + ), + ) + ); + + if ( $mollie_customer_id ) { + $customer_url = \add_query_arg( + array( + 'page' => 'pronamic_pay_mollie_customers', + 'id' => $mollie_customer_id, + ), + \admin_url( 'admin.php' ) + ); + + echo '
    '; + + echo \wp_kses( + \sprintf( + /* translators: %s: Mollie customer ID anchor. */ + \__( 'Customer: %s', 'pronamic_ideal' ), + \sprintf( + '%s', + \esc_url( $customer_url ), + \esc_html( $mollie_customer_id ) + ) + ), + array( + 'a' => array( + 'href' => true, + ), + ) + ); + } + + ?> +

    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php new file mode 100644 index 00000000..36ead92c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/meta-box-subscription.php @@ -0,0 +1,76 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + * + * @since 1.1.6 + * @link https://github.com/WordPress/WordPress/blob/4.5.2/wp-admin/user-edit.php#L578-L600 + */ + +$subscription = \get_pronamic_subscription( $post->ID ); + +if ( null === $subscription ) : + return; +endif; + +$mollie_customer_id = $subscription->get_meta( 'mollie_customer_id' ); + +?> +

    + 'pronamic_pay_mollie_customers', + 'id' => $mollie_customer_id, + ), + \admin_url( 'admin.php' ) + ); + + echo \wp_kses( + \sprintf( + /* translators: %s: Mollie customer ID anchor. */ + \__( 'Customer: %s', 'pronamic_ideal' ), + \sprintf( + '%s', + \esc_url( $customer_url ), + \esc_html( (string) $mollie_customer_id ) + ) + ), + array( + 'a' => array( + 'href' => true, + ), + ) + ); + + ?> +

    + +get_meta( 'mollie_mandate_id' ); + +if ( ! empty( $mandate_id ) ) : + + ?> + +

    + +

    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-customer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-customer.php new file mode 100644 index 00000000..4f252858 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-customer.php @@ -0,0 +1,469 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +/** + * Valid global. + * + * @see Pronamic\WordPress\Pay\Gateways\Mollie\Admin::page_mollie_customers() + * @psalm-suppress InvalidGlobal + */ +global $wpdb; + +$mollie_customer_id = \filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); + +$mollie_customer_data = $wpdb->get_row( + $wpdb->prepare( + " + SELECT + mollie_customer.*, + IF ( mollie_customer.test_mode, mollie_profile.api_key_test, mollie_profile.api_key_live ) AS api_key + FROM + $wpdb->pronamic_pay_mollie_customers AS mollie_customer + LEFT JOIN + $wpdb->pronamic_pay_mollie_profiles AS mollie_profile + ON mollie_customer.profile_id = mollie_profile.id + WHERE + mollie_customer.mollie_id = %s + LIMIT + 1 + ; + ", + $mollie_customer_id + ) +); + +$mollie_customer = null; + +$mollie_customer_mandates = null; + +if ( $mollie_customer_data->api_key ) { + $client = new Client( $mollie_customer_data->api_key ); + + /** + * Customer. + * + * @link https://docs.mollie.com/reference/v2/customers-api/get-customer + */ + $mollie_customer = $client->get_customer( $mollie_customer_id ); + + /** + * Mandates. + * + * @link https://docs.mollie.com/reference/v2/mandates-api/list-mandates + */ + $response = $client->get_mandates( $mollie_customer_id ); + + $mollie_customer_mandates = $response->_embedded->mandates; +} + +/** + * WordPress user. + */ +$users = $wpdb->get_results( + $wpdb->prepare( + " + SELECT + user.* + FROM + $wpdb->pronamic_pay_mollie_customer_users AS mollie_customer_user + INNER JOIN + $wpdb->users AS user + ON mollie_customer_user.user_id = user.ID + WHERE + mollie_customer_user.customer_id = %d + ; + ", + $mollie_customer_data->id + ) +); + +?> +
    +

    + +

    + %s', + $mollie_customer_id + ) + ), + array( + 'code' => array(), + ) + ); + + ?> +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + id ); ?> +
    + test_mode ? \esc_html_e( 'Test', 'pronamic_ideal' ) : \esc_html_e( 'Live', 'pronamic_ideal' ); ?> +
    + name ); ?> +
    + email ) { + printf( + '%s', + esc_attr( 'mailto:' . $mollie_customer_data->email ), + esc_html( $mollie_customer_data->email ) + ); + } + + ?> +
    + locale ) { + printf( + '%s', + esc_html( $mollie_customer->locale ) + ); + } + + ?> +
    + %s', + \esc_url( $mollie_link ), + \esc_html( $mollie_link ) + ); + + ?> +
    + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + id ); ?> + + mode ) { + case 'test': + \esc_html_e( 'Test', 'pronamic_ideal' ); + + break; + case 'live': + \esc_html_e( 'Live', 'pronamic_ideal' ); + + break; + default: + echo \esc_html( $mandate->mode ); + + break; + } + + ?> + + status ) { + case 'pending': + \esc_html_e( 'Pending', 'pronamic_ideal' ); + + break; + case 'valid': + \esc_html_e( 'Valid', 'pronamic_ideal' ); + + break; + default: + echo \esc_html( $mandate->status ); + + break; + } + + ?> + + method ) { + case 'creditcard': + \esc_html_e( 'Credit Card', 'pronamic_ideal' ); + + break; + case 'directdebit': + \esc_html_e( 'Direct Debit', 'pronamic_ideal' ); + + break; + default: + echo \esc_html( $mandate->method ); + + break; + } + + ?> + + method ) { + case 'creditcard': + ?> +
    + + details->cardHolder ) ) : ?> + +
    +
    + details->cardHolder ); ?> +
    + + + + details->cardNumber ) ) : ?> + +
    +
    + details->cardNumber ); ?> +
    + + + + details->cardLabel ) ) : ?> + +
    +
    + details->cardLabel ); ?> +
    + + + + details->cardFingerprint ) ) : ?> + +
    +
    + details->cardFingerprint ); ?> +
    + + + + details->cardExpiryDate ) ) : ?> + +
    +
    + details->cardExpiryDate ); ?> +
    + + +
    + +
    + + details->consumerName ) ) : ?> + +
    +
    + details->consumerName ); ?> +
    + + + + details->consumerAccount ) ) : ?> + +
    +
    + details->consumerAccount ); ?> +
    + + + + details->consumerBic ) ) : ?> + +
    +
    + details->consumerBic ); ?> +
    + + +
    + +
    details, \JSON_PRETTY_PRINT ) ); ?>
    + +
    + mandateReference ); + + ?> + + signatureDate ); + + echo \esc_html( $signature_date->format( 'd-m-Y' ) ); + + ?> + + createdAt ); + + echo \esc_html( $created_on->format( 'd-m-Y H:i:s' ) ); + + ?> +
    + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + +
    + ID ); ?> + + %s', + esc_attr( 'mailto:' . $user->user_email ), + esc_html( $user->user_email ) + ); + + ?> + + display_name ); ?> +
    + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-customers.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-customers.php new file mode 100644 index 00000000..d58f3694 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-customers.php @@ -0,0 +1,15 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +?> +
    +

    + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-mollie.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-mollie.php new file mode 100644 index 00000000..4aeb2dc8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-mollie.php @@ -0,0 +1,15 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +?> +
    +

    + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-payment.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-payment.php new file mode 100644 index 00000000..820001c3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-payment.php @@ -0,0 +1,135 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +use Pronamic\WordPress\Pay\Admin\AdminPaymentPostType; + +$mollie_payment_id = \filter_input( INPUT_GET, 'id', FILTER_SANITIZE_STRING ); + +$payment = \get_pronamic_payment_by_transaction_id( $mollie_payment_id ); + +if ( null !== $payment ) { + $api_key = \get_post_meta( (int) $payment->get_config_id(), '_pronamic_gateway_mollie_api_key', true ); + + $client = new Client( (string) $api_key ); + + /** + * Payment. + * + * @link https://docs.mollie.com/reference/v2/payments-api/get-payment + */ + $mollie_payment = $client->get_payment( + $mollie_payment_id, + array( + 'embed' => 'chargebacks,refunds', + ) + ); +} + +?> +
    +

    + +

    + %s', + $mollie_payment_id + ) + ), + array( + 'code' => array(), + ) + ); + + ?> +

    + + + + + + + + + + + + + + + get_meta( 'mollie_change_payment_state_url' ); + + if ( ! empty( $url ) ) : + + ?> + + + + + + + + + + + + + + + +
    + +
    + %s', + \esc_url( $mollie_link ), + \esc_html( $mollie_link ) + ); + + ?> +
    + %3$s', + \esc_url( $url ), + \esc_attr( \__( 'Change Payment State', 'pronamic_ideal' ) ), + \esc_html( $url ) + ); + + ?> +
    + get_id() + ); + + ?> +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-payments.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-payments.php new file mode 100644 index 00000000..0a949e2f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-payments.php @@ -0,0 +1,17 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +?> +
    +

    + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-profile.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-profile.php new file mode 100644 index 00000000..6bead162 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-profile.php @@ -0,0 +1,17 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +?> +
    +

    + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-profiles.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-profiles.php new file mode 100644 index 00000000..0ea25b84 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/page-profiles.php @@ -0,0 +1,17 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Mollie + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +?> +
    +

    + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/user-profile.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/user-profile.php new file mode 100644 index 00000000..f72df4fb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/mollie/views/user-profile.php @@ -0,0 +1,117 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + * + * @since 1.1.6 + * @link https://github.com/WordPress/WordPress/blob/4.5.2/wp-admin/user-edit.php#L578-L600 + */ + +namespace Pronamic\WordPress\Pay\Gateways\Mollie; + +if ( ! isset( $user ) ) { + return; +} + +$customer_query = new CustomerQuery( + array( + 'user_id' => $user->ID, + ) +); + +$customers = $customer_query->get_customers(); + +if ( empty( $customers ) ) { + return; +} + +?> +

    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + 'pronamic_pay_mollie_customers', + 'id' => $customer->mollie_id, + ), + \admin_url( 'admin.php' ) + ); + + \printf( + '%s', + \esc_url( $url ), + \esc_html( $customer->mollie_id ) + ); + + ?> + + test_mode ? \esc_html_e( 'Yes', 'pronamic_ideal' ) : \esc_html_e( 'No', 'pronamic_ideal' ); ?> + + name ) ? '—' : \esc_html( $customer->name ); ?> + + email ) ? esc_html( '—' ) : \sprintf( + '%s', + esc_attr( 'mailto:' . $customer->email ), + esc_html( $customer->email ) + ); + + ?> +
    + +

    + +

    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Client.php new file mode 100644 index 00000000..f8c212ca --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Client.php @@ -0,0 +1,180 @@ +api_url = MultiSafepay::API_PRODUCTION_URL; + } + + /** + * Parse XML. + * + * @param SimpleXMLElement $xml XML to parse. + * + * @return bool|DirectTransactionResponseMessage|RedirectTransactionResponseMessage|StatusResponseMessage + */ + private function parse_xml( $xml ) { + switch ( $xml->getName() ) { + case IDealIssuersRequestMessage::NAME: + return IDealIssuersResponseMessage::parse( $xml ); + + case GatewaysRequestMessage::NAME: + return GatewaysResponseMessage::parse( $xml ); + + case DirectTransactionRequestMessage::NAME: + return DirectTransactionResponseMessage::parse( $xml ); + + case RedirectTransactionRequestMessage::NAME: + return RedirectTransactionResponseMessage::parse( $xml ); + + case StatusRequestMessage::NAME: + return StatusResponseMessage::parse( $xml ); + } + + return false; + } + + /** + * Request. + * + * @param string $message Message. + * + * @return bool|DirectTransactionResponseMessage|RedirectTransactionResponseMessage|StatusResponseMessage + */ + private function request( $message ) { + $result = Core_Util::remote_get_body( + $this->api_url, + 200, + array( + 'method' => 'POST', + 'body' => (string) $message, + ) + ); + + if ( is_wp_error( $result ) ) { + throw new \Exception( $result->get_error_message() ); + } + + $xml = Core_Util::simplexml_load_string( $result ); + + $return = $this->parse_xml( $xml ); + + if ( is_object( $return ) && isset( $return->result ) && 'error' === $return->result ) { + throw new \Exception( $xml->error->description ); + } + + return $return; + } + + /** + * Get iDEAL issuers + * + * @param Merchant $merchant Merchant. + * + * @since 1.2.0 + */ + public function get_ideal_issuers( $merchant ) { + $return = false; + + $request = new IDealIssuersRequestMessage( $merchant ); + + $response = $this->request( $request ); + + if ( $response ) { + $return = $response->issuers; + } + + return $return; + } + + /** + * Get gateways. + * + * @param Merchant $merchant Merchant. + * @param Customer $customer Customer. + * + * @since 1.2.0 + */ + public function get_gateways( $merchant, $customer ) { + $return = false; + + $request = new GatewaysRequestMessage( $merchant, $customer ); + + $response = $this->request( $request ); + + if ( $response ) { + $return = $response->gateways; + } + + return $return; + } + + /** + * Start transaction + * + * @param array $message Message. + */ + public function start_transaction( $message ) { + $return = false; + + $response = $this->request( $message ); + + if ( $response ) { + $return = $response; + } + + return $return; + } + + /** + * Get status + * + * @param array $message Message. + */ + public function get_status( $message ) { + $return = false; + + $response = $this->request( $message ); + + if ( $response ) { + $return = $response; + } + + return $return; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Config.php new file mode 100644 index 00000000..19a7d21f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Config.php @@ -0,0 +1,24 @@ +set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $this->client = new Client(); + + $this->client->api_url = $config->api_url; + } + + /** + * Get iDEAL issuers + * + * @see Core_Gateway::get_issuers() + * @since 1.2.0 + */ + public function get_issuers() { + $groups = array(); + + // Merchant. + $merchant = new Merchant(); + $merchant->account = $this->config->account_id; + $merchant->site_id = $this->config->site_id; + $merchant->site_secure_code = $this->config->site_code; + + $result = $this->client->get_ideal_issuers( $merchant ); + + if ( $result ) { + $groups[] = array( + 'options' => $result, + ); + } + + return $groups; + } + + /** + * Get credit card issuers + * + * @see Core_Gateway::get_credit_card_issuers() + */ + public function get_credit_card_issuers() { + $groups[] = array( + 'options' => array( + Methods::AMEX => _x( 'AMEX', 'Payment method name', 'pronamic_ideal' ), + Methods::MAESTRO => _x( 'Maestro', 'Payment method name', 'pronamic_ideal' ), + Methods::MASTERCARD => _x( 'MASTER', 'Payment method name', 'pronamic_ideal' ), + Methods::VISA => _x( 'VISA', 'Payment method name', 'pronamic_ideal' ), + ), + ); + + return $groups; + } + + /** + * Get payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_payment_methods() + */ + public function get_available_payment_methods() { + $payment_methods = array(); + + // Merchant. + $merchant = new Merchant(); + $merchant->account = $this->config->account_id; + $merchant->site_id = $this->config->site_id; + $merchant->site_secure_code = $this->config->site_code; + + // Customer. + $customer = new Customer(); + + // Get gateways. + try { + $result = $this->client->get_gateways( $merchant, $customer ); + } catch ( \Exception $e ) { + $error = new \WP_Error( 'multisafepay_error', $e->getMessage() ); + + $this->set_error( $error ); + + return $payment_methods; + } + + if ( false === $result ) { + return $payment_methods; + } + + foreach ( $result as $method => $title ) { + $payment_method = Methods::transform_gateway_method( $method ); + + if ( $payment_method ) { + $payment_methods[] = $payment_method; + } + } + + return $payment_methods; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::ALIPAY, + PaymentMethods::BANCONTACT, + PaymentMethods::BANK_TRANSFER, + PaymentMethods::BELFIUS, + PaymentMethods::CREDIT_CARD, + PaymentMethods::DIRECT_DEBIT, + PaymentMethods::IDEAL, + PaymentMethods::IDEALQR, + PaymentMethods::IN3, + PaymentMethods::GIROPAY, + PaymentMethods::KBC, + PaymentMethods::PAYPAL, + PaymentMethods::SANTANDER, + PaymentMethods::SOFORT, + ); + } + + /** + * Start payment. + * + * @param Payment $payment Payment object. + */ + public function start( Payment $payment ) { + $payment_method = $payment->get_method(); + + $transaction_description = $payment->get_description(); + + if ( empty( $transaction_description ) ) { + $transaction_description = $payment->get_id(); + } + + // Merchant. + $merchant = new Merchant(); + $merchant->account = $this->config->account_id; + $merchant->site_id = $this->config->site_id; + $merchant->site_secure_code = $this->config->site_code; + $merchant->notification_url = $payment->get_return_url(); + $merchant->redirect_url = $payment->get_return_url(); + $merchant->cancel_url = $payment->get_return_url(); + $merchant->close_window = 'false'; + + // Customer. + $customer = new Customer(); + $customer->ip_address = Server::get( 'REMOTE_ADDR', FILTER_VALIDATE_IP ); + $customer->forwarded_ip = Server::get( 'HTTP_X_FORWARDED_FOR', FILTER_VALIDATE_IP ); + + if ( null !== $payment->get_customer() ) { + $name = $payment->get_customer()->get_name(); + + if ( null !== $name ) { + $customer->first_name = $name->get_first_name(); + $customer->last_name = $name->get_last_name(); + } + + $customer->locale = $payment->get_customer()->get_locale(); + $customer->email = $payment->get_customer()->get_email(); + } + + // Transaction. + $transaction = new Transaction(); + $transaction->id = uniqid(); + $transaction->currency = $payment->get_total_amount()->get_currency()->get_alphabetic_code(); + $transaction->amount = $payment->get_total_amount()->get_cents(); + $transaction->description = $transaction_description; + + switch ( $payment_method ) { + case PaymentMethods::IDEAL: + $transaction->gateway = Methods::IDEAL; + + $issuer = $payment->get_issuer(); + + if ( empty( $issuer ) ) { + $message = new RedirectTransactionRequestMessage( $merchant, $customer, $transaction ); + } else { + $gateway_info = new GatewayInfo(); + + $gateway_info->issuer_id = $issuer; + + $message = new DirectTransactionRequestMessage( $merchant, $customer, $transaction, $gateway_info ); + } + + break; + case PaymentMethods::CREDIT_CARD: + $gateway = Methods::transform( $payment_method ); + + $issuer = $payment->get_issuer(); + + if ( empty( $issuer ) ) { + if ( $gateway ) { + $transaction->gateway = $gateway; + } + } else { + $transaction->gateway = $issuer; + } + + $message = new RedirectTransactionRequestMessage( $merchant, $customer, $transaction ); + + break; + default: + $gateway = Methods::transform( $payment_method ); + + if ( $gateway ) { + $transaction->gateway = $gateway; + } + + if ( ! isset( $transaction->gateway ) && ! empty( $payment_method ) ) { + // Leap of faith if the WordPress payment method could not transform to a Mollie method? + $transaction->gateway = $payment_method; + } + + $message = new RedirectTransactionRequestMessage( $merchant, $customer, $transaction ); + } + + $signature = Signature::generate( $transaction->amount, $transaction->currency, $merchant->account, $merchant->site_id, $transaction->id ); + + $message->signature = $signature; + + try { + $response = $this->client->start_transaction( $message ); + } catch ( \Exception $e ) { + $error = new \WP_Error( 'multisafepay_error', $e->getMessage() ); + + $this->set_error( $error ); + + return; + } + + if ( false !== $response ) { + $transaction = $response->transaction; + + $payment->set_transaction_id( $transaction->id ); + + if ( isset( $transaction->payment_url ) ) { + $payment->set_action_url( $transaction->payment_url ); + } + + if ( isset( $response->gateway_info->redirect_url ) ) { + $payment->set_action_url( $response->gateway_info->redirect_url ); + } + } + } + + /** + * Update status. + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $merchant = new Merchant(); + + $merchant->account = $this->config->account_id; + $merchant->site_id = $this->config->site_id; + $merchant->site_secure_code = $this->config->site_code; + + $message = new StatusRequestMessage( $merchant, $payment->get_transaction_id() ); + + try { + $result = $this->client->get_status( $message ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'multisafepay_error', $e->getMessage() ); + + return; + } + + if ( false === $result ) { + return; + } + + // Status. + $status = Statuses::transform( $result->ewallet->status ); + + $payment->set_status( $status ); + + // Consumer bank details. + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_name( $result->payment_details->account_holder_name ); + $consumer_bank_details->set_iban( $result->payment_details->account_iban ); + $consumer_bank_details->set_bic( $result->payment_details->account_bic ); + $consumer_bank_details->set_account_number( $result->payment_details->account_id ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/GatewayInfo.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/GatewayInfo.php new file mode 100644 index 00000000..023fa2e2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/GatewayInfo.php @@ -0,0 +1,21 @@ + 'multisafepay-connect', + 'name' => 'MultiSafepay - Connect', + 'url' => 'http://www.multisafepay.com/', + 'product_url' => \__( 'http://www.multisafepay.com/', 'pronamic_ideal' ), + 'dashboard_url' => 'https://merchant.multisafepay.com/', + 'provider' => 'multisafepay', + 'supports' => array( + 'payment_status_request', + 'webhook', + 'webhook_no_config', + ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-multisafepay-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + + + // Filters. + $function = array( WooCommerce::class, 'woocommerce_available_payment_gateways' ); + + if ( ! \has_filter( 'woocommerce_available_payment_gateways', $function ) ) { + \add_filter( 'woocommerce_available_payment_gateways', $function, 10 ); + } + } + + public function get_settings_fields() { + $fields = array(); + + // Account ID + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_multisafepay_account_id', + 'title' => __( 'Account ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => sprintf( + '%s %s.', + __( 'Account ID', 'pronamic_ideal' ), + /* translators: %s: payment provider name */ + sprintf( __( 'as mentioned in the %s dashboard', 'pronamic_ideal' ), __( 'MultiSafepay', 'pronamic_ideal' ) ) + ), + ); + + // Site ID + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_multisafepay_site_id', + 'title' => __( 'Site ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => sprintf( + '%s %s.', + __( 'Site ID', 'pronamic_ideal' ), + /* translators: %s: payment provider name */ + sprintf( __( 'as mentioned in the %s dashboard', 'pronamic_ideal' ), __( 'MultiSafepay', 'pronamic_ideal' ) ) + ), + ); + + // Site Security Code + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_multisafepay_site_code', + 'title' => __( 'Site Security Code', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => sprintf( + '%s %s.', + __( 'Site Security Code', 'pronamic_ideal' ), + /* translators: %s: payment provider name */ + sprintf( __( 'as mentioned in the %s dashboard', 'pronamic_ideal' ), __( 'MultiSafepay', 'pronamic_ideal' ) ) + ), + ); + + return $fields; + } + + /** + * Get config. + * + * @param $post_id + * + * @return Config + */ + public function get_config( $post_id ) { + $config = new Config(); + + $config->mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + $config->account_id = get_post_meta( $post_id, '_pronamic_gateway_multisafepay_account_id', true ); + $config->site_id = get_post_meta( $post_id, '_pronamic_gateway_multisafepay_site_id', true ); + $config->site_code = get_post_meta( $post_id, '_pronamic_gateway_multisafepay_site_code', true ); + + if ( Gateway::MODE_TEST === $config->mode ) { + $config->api_url = MultiSafepay::API_TEST_URL; + } else { + $config->api_url = MultiSafepay::API_PRODUCTION_URL; + } + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Merchant.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Merchant.php new file mode 100644 index 00000000..7239aae3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/Merchant.php @@ -0,0 +1,29 @@ + self::ALIPAY, + PaymentMethods::BANCONTACT => self::BANCONTACT, + PaymentMethods::BANK_TRANSFER => self::BANK_TRANSFER, + PaymentMethods::BELFIUS => self::BELFIUS, + PaymentMethods::DIRECT_DEBIT => self::DIRECT_DEBIT, + PaymentMethods::GIROPAY => self::GIROPAY, + PaymentMethods::IDEAL => self::IDEAL, + PaymentMethods::IDEALQR => self::IDEALQR, + PaymentMethods::IN3 => self::IN3, + PaymentMethods::KBC => self::KBC, + PaymentMethods::PAYPAL => self::PAYPAL, + PaymentMethods::SANTANDER => self::SANTANDER, + PaymentMethods::SOFORT => self::SOFORT, + ); + + /** + * Transform WordPress payment method to MultiSafepay method. + * + * @since unreleased + * + * @param string $payment_method Payment method. + * @param mixed $default Default payment method. + * + * @return string + */ + public static function transform( $payment_method, $default = null ) { + if ( ! is_scalar( $payment_method ) ) { + return null; + } + + if ( isset( self::$map[ $payment_method ] ) ) { + return self::$map[ $payment_method ]; + } + + return $default; + } + + /** + * Transform MultiSafepay method to WordPress payment method. + * + * @since unreleased + * + * @param string $method Mollie method. + * + * @return string + */ + public static function transform_gateway_method( $method ) { + if ( ! is_scalar( $method ) ) { + return null; + } + + $payment_method = array_search( $method, self::$map, true ); + + if ( ! $payment_method ) { + return null; + } + + return $payment_method; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/MultiSafepay.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/MultiSafepay.php new file mode 100644 index 00000000..f7c7fb68 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/MultiSafepay.php @@ -0,0 +1,28 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\MultiSafepay; + +use Pronamic\WordPress\Money\Money; + +/** + * WooCommerce. + * + * @author Reüel van der Steege + * @since 2.2.0 + * @version 2.2.0 + */ +class WooCommerce { + /** + * Filter WooCommerce available payment gateways. + * + * @param array $gateways Available gateways. + * @return array + */ + public static function woocommerce_available_payment_gateways( $gateways ) { + // Do not filter gateways in admin. + if ( \is_admin() ) { + return $gateways; + } + + // Check Santander gateway. + $santander_id = 'pronamic_pay_santander'; + + if ( \array_key_exists( $santander_id, $gateways ) ) { + // Check MultiSafepay gateway. + $gateway = $gateways[ $santander_id ]; + + $gateway_id = \get_post_meta( (int) $gateway->settings['config_id'], '_pronamic_gateway_id', true ); + + $total = new Money( \WC()->cart->get_total( 'raw' ) ); + + // Unset gateway if cart amount minimum not met. + if ( 'multisafepay-connect' === $gateway_id && $total->get_value() < 250 ) { + unset( $gateways[ $santander_id ] ); + } + } + + return $gateways; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/DirectTransactionRequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/DirectTransactionRequestMessage.php new file mode 100644 index 00000000..9383b1ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/DirectTransactionRequestMessage.php @@ -0,0 +1,140 @@ +merchant = $merchant; + $this->customer = $customer; + $this->transaction = $transaction; + $this->gateway_info = $gateway_info; + } + + /** + * Get document + * + * @see Pronamic_Gateways_IDealAdvancedV3_XML_RequestMessage::get_document() + */ + public function get_document() { + $document = parent::get_document(); + + // Merchant. + $merchant = XML_Util::add_element( $document, $document->documentElement, 'merchant' ); + + XML_Util::add_elements( + $document, + $merchant, + array( + 'account' => $this->merchant->account, + 'site_id' => $this->merchant->site_id, + 'site_secure_code' => $this->merchant->site_secure_code, + 'notification_url' => $this->merchant->notification_url, + 'redirect_url' => $this->merchant->redirect_url, + 'cancel_url' => $this->merchant->cancel_url, + 'close_window' => $this->merchant->close_window, + ) + ); + + // Customer. + $customer = XML_Util::add_element( $document, $document->documentElement, 'customer' ); + + XML_Util::add_elements( + $document, + $customer, + array( + 'locale' => $this->customer->locale, + 'ipaddress' => $this->customer->ip_address, + 'forwardedip' => $this->customer->forwarded_ip, + 'firstname' => $this->customer->first_name, + 'lastname' => $this->customer->last_name, + 'address1' => $this->customer->address_1, + 'address2' => $this->customer->address_2, + 'housenumber' => $this->customer->house_number, + 'zipcode' => $this->customer->zip_code, + 'city' => $this->customer->city, + 'country' => $this->customer->country, + 'phone' => $this->customer->phone, + 'email' => $this->customer->email, + ) + ); + + // Transaction. + $transaction = XML_Util::add_element( $document, $document->documentElement, 'transaction' ); + + XML_Util::add_elements( + $document, + $transaction, + array( + 'id' => $this->transaction->id, + 'currency' => $this->transaction->currency, + 'amount' => $this->transaction->amount, + 'description' => $this->transaction->description, + 'var1' => $this->transaction->var1, + 'var2' => $this->transaction->var2, + 'var3' => $this->transaction->var3, + 'items' => $this->transaction->items, + 'manual' => $this->transaction->manual, + 'gateway' => $this->transaction->gateway, + 'daysactive' => $this->transaction->days_active, + ) + ); + + // Gateway info. + if ( $this->gateway_info ) { + $gateway_info = XML_Util::add_element( $document, $document->documentElement, 'gatewayinfo' ); + + XML_Util::add_elements( + $document, + $gateway_info, + array( + 'issuerid' => $this->gateway_info->issuer_id, + ) + ); + } + + // Signature. + XML_Util::add_element( $document, $document->documentElement, 'signature', $this->signature ); + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/DirectTransactionResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/DirectTransactionResponseMessage.php new file mode 100644 index 00000000..78a0f6f2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/DirectTransactionResponseMessage.php @@ -0,0 +1,68 @@ +result = Security::filter( $xml['result'] ); + + // Transaction + $message->transaction = TransactionParser::parse( $xml->transaction ); + + // Gateway info + if ( $xml->gatewayinfo ) { + $message->gateway_info = new GatewayInfo(); + $message->gateway_info->redirect_url = Security::filter( $xml->gatewayinfo->redirecturl ); + $message->gateway_info->ext_var = Security::filter( $xml->gatewayinfo->extvar ); + $message->gateway_info->issuer_id = Security::filter( $xml->gatewayinfo->issuerid ); + } + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/GatewaysRequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/GatewaysRequestMessage.php new file mode 100644 index 00000000..eb2bb53a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/GatewaysRequestMessage.php @@ -0,0 +1,75 @@ +merchant = $merchant; + $this->customer = $customer; + } + + /** + * Get document + * + * @see Pronamic_Gateways_IDealAdvancedV3_XML_RequestMessage::get_document() + */ + public function get_document() { + $document = parent::get_document(); + + // Merchant. + $merchant = XML_Util::add_element( $document, $document->documentElement, 'merchant' ); + + XML_Util::add_elements( + $document, + $merchant, + array( + 'account' => $this->merchant->account, + 'site_id' => $this->merchant->site_id, + 'site_secure_code' => $this->merchant->site_secure_code, + ) + ); + + // Customer. + $customer = XML_Util::add_element( $document, $document->documentElement, 'customer' ); + + XML_Util::add_elements( + $document, + $customer, + array( + 'country' => $this->customer->country, + 'locale' => $this->customer->locale, + ) + ); + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/GatewaysResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/GatewaysResponseMessage.php new file mode 100644 index 00000000..5afd2b8a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/GatewaysResponseMessage.php @@ -0,0 +1,47 @@ +gateways = array(); + + foreach ( $xml->gateways->gateway as $gateway ) { + $id = Security::filter( $gateway->id ); + $description = Security::filter( $gateway->description ); + + $message->gateways[ $id ] = $description; + } + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/IDealIssuersRequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/IDealIssuersRequestMessage.php new file mode 100644 index 00000000..b22c247b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/IDealIssuersRequestMessage.php @@ -0,0 +1,67 @@ +merchant = $merchant; + } + + /** + * Get document + * + * @see Pronamic_Gateways_IDealAdvancedV3_XML_RequestMessage::get_document() + */ + public function get_document() { + $document = parent::get_document(); + + // Merchant. + $merchant = XML_Util::add_element( $document, $document->documentElement, 'merchant' ); + + XML_Util::add_elements( + $document, + $merchant, + array( + 'account' => $this->merchant->account, + 'site_id' => $this->merchant->site_id, + 'site_secure_code' => $this->merchant->site_secure_code, + ) + ); + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/IDealIssuersResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/IDealIssuersResponseMessage.php new file mode 100644 index 00000000..197d92ad --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/IDealIssuersResponseMessage.php @@ -0,0 +1,40 @@ +issuers = array(); + + foreach ( $xml->issuers->issuer as $issuer ) { + $code = Security::filter( $issuer->code ); + $description = Security::filter( $issuer->description ); + + $message->issuers[ $code ] = $description; + } + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/Message.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/Message.php new file mode 100644 index 00000000..1360e65a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/Message.php @@ -0,0 +1,54 @@ +name = $name; + } + + /** + * Get the name of this message + * + * @return string + */ + public function get_name() { + return $this->name; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionRequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionRequestMessage.php new file mode 100644 index 00000000..ace5744e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionRequestMessage.php @@ -0,0 +1,117 @@ +merchant = $merchant; + $this->customer = $customer; + $this->transaction = $transaction; + } + + /** + * Get document + * + * @see Pronamic_Gateways_IDealAdvancedV3_XML_RequestMessage::get_document() + */ + public function get_document() { + $document = parent::get_document(); + + // Merchant. + $merchant = XML_Util::add_element( $document, $document->documentElement, 'merchant' ); + + XML_Util::add_elements( + $document, + $merchant, + array( + 'account' => $this->merchant->account, + 'site_id' => $this->merchant->site_id, + 'site_secure_code' => $this->merchant->site_secure_code, + 'notification_url' => $this->merchant->notification_url, + 'redirect_url' => $this->merchant->redirect_url, + 'cancel_url' => $this->merchant->cancel_url, + 'close_window' => $this->merchant->close_window, + ) + ); + + // Customer. + $customer = XML_Util::add_element( $document, $document->documentElement, 'customer' ); + + XML_Util::add_elements( + $document, + $customer, + array( + 'locale' => $this->customer->locale, + 'ipaddress' => $this->customer->ip_address, + 'forwardedip' => $this->customer->forwarded_ip, + 'firstname' => $this->customer->first_name, + 'lastname' => $this->customer->last_name, + 'address1' => $this->customer->address_1, + 'address2' => $this->customer->address_2, + 'housenumber' => $this->customer->house_number, + 'zipcode' => $this->customer->zip_code, + 'city' => $this->customer->city, + 'country' => $this->customer->country, + 'phone' => $this->customer->phone, + 'email' => $this->customer->email, + ) + ); + + // Transaction. + $transaction = XML_Util::add_element( $document, $document->documentElement, 'transaction' ); + + XML_Util::add_elements( + $document, + $transaction, + array( + 'id' => $this->transaction->id, + 'currency' => $this->transaction->currency, + 'amount' => $this->transaction->amount, + 'description' => $this->transaction->description, + 'var1' => $this->transaction->var1, + 'var2' => $this->transaction->var2, + 'var3' => $this->transaction->var3, + 'items' => $this->transaction->items, + 'manual' => $this->transaction->manual, + 'gateway' => $this->transaction->gateway, + 'daysactive' => $this->transaction->days_active, + ) + ); + + // Signature. + XML_Util::add_element( $document, $document->documentElement, 'signature', $this->signature ); + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionResponseMessage.php new file mode 100644 index 00000000..081b2b99 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RedirectTransactionResponseMessage.php @@ -0,0 +1,48 @@ +result = Security::filter( $xml['result'] ); + $message->transaction = TransactionParser::parse( $xml->transaction ); + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RequestMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RequestMessage.php new file mode 100644 index 00000000..b1dabda9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/RequestMessage.php @@ -0,0 +1,73 @@ +preserveWhiteSpace = true; + $document->formatOutput = true; + + // Root. + $root = $document->createElement( $this->get_name() ); + + $document->appendChild( $root ); + + return $document; + } + + /** + * Create a string representation + * + * @return string + */ + public function __toString() { + $document = $this->get_document(); + + return $document->saveXML(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/ResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/ResponseMessage.php new file mode 100644 index 00000000..370f4c5f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/ResponseMessage.php @@ -0,0 +1,17 @@ +merchant = $merchant; + $this->transaction_id = $transaction_id; + } + + /** + * Get document + * + * @see Pronamic_Gateways_IDealAdvancedV3_XML_RequestMessage::get_document() + */ + public function get_document() { + $document = parent::get_document(); + + // Merchant. + $merchant = XML_Util::add_element( $document, $document->documentElement, 'merchant' ); + + XML_Util::add_elements( + $document, + $merchant, + array( + 'account' => $this->merchant->account, + 'site_id' => $this->merchant->site_id, + 'site_secure_code' => $this->merchant->site_secure_code, + ) + ); + + // Transaction. + $transaction = XML_Util::add_element( $document, $document->documentElement, 'transaction' ); + + XML_Util::add_elements( + $document, + $transaction, + array( + 'id' => $this->transaction_id, + ) + ); + + return $document; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/StatusResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/StatusResponseMessage.php new file mode 100644 index 00000000..8c05bd12 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/StatusResponseMessage.php @@ -0,0 +1,130 @@ +result = Security::filter( $xml['result'] ); + + // E-wallet + if ( $xml->ewallet ) { + $ewallet = new stdClass(); + + $ewallet->id = Security::filter( $xml->ewallet->id ); + $ewallet->status = Security::filter( $xml->ewallet->status ); + $ewallet->created = Security::filter( $xml->ewallet->created ); + $ewallet->modified = Security::filter( $xml->ewallet->modified ); + $ewallet->reason_code = Security::filter( $xml->ewallet->reasoncode ); + $ewallet->reason = Security::filter( $xml->ewallet->reason ); + + $message->ewallet = $ewallet; + } + + // Customer + if ( $xml->customer ) { + $customer = new stdClass(); + + $customer->currency = Security::filter( $xml->customer->currency ); + $customer->amount = Security::filter( $xml->customer->amount ); + $customer->exchange_rate = Security::filter( $xml->customer->exchange_rate ); + $customer->first_name = Security::filter( $xml->customer->firstname ); + $customer->last_name = Security::filter( $xml->customer->lastname ); + $customer->last_name = Security::filter( $xml->customer->lastname ); + $customer->city = Security::filter( $xml->customer->city ); + $customer->state = Security::filter( $xml->customer->state ); + $customer->country = Security::filter( $xml->customer->country ); + + $message->customer = $customer; + } + + // Transaction + if ( $xml->transaction ) { + $transaction = new stdClass(); + + $transaction->id = Security::filter( $xml->transaction->id ); + $transaction->currency = Security::filter( $xml->transaction->currency ); + $transaction->amount = Security::filter( $xml->transaction->amount ); + $transaction->description = Security::filter( $xml->transaction->description ); + $transaction->var1 = Security::filter( $xml->transaction->var1 ); + $transaction->var2 = Security::filter( $xml->transaction->var2 ); + $transaction->var3 = Security::filter( $xml->transaction->var3 ); + $transaction->items = Security::filter( $xml->transaction->items ); + + $message->transaction = $transaction; + } + + // Payment details + if ( $xml->paymentdetails ) { + $payment_details = new stdClass(); + + $payment_details->type = Security::filter( $xml->paymentdetails->type ); + $payment_details->account_iban = Security::filter( $xml->paymentdetails->accountiban ); + $payment_details->account_bic = Security::filter( $xml->paymentdetails->accountbic ); + $payment_details->account_id = Security::filter( $xml->paymentdetails->accountid ); + $payment_details->account_holder_name = Security::filter( $xml->paymentdetails->accountholdername ); + $payment_details->external_transaction_id = Security::filter( $xml->paymentdetails->externaltransactionid ); + + $message->payment_details = $payment_details; + } + + return $message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/TransactionParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/TransactionParser.php new file mode 100644 index 00000000..d17d596d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/multisafepay/src/XML/TransactionParser.php @@ -0,0 +1,35 @@ +id = Security::filter( $xml->id ); + $transaction->payment_url = Security::filter( $xml->payment_url ); + + return $transaction; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/data/calculations-parameters-sha-in.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/data/calculations-parameters-sha-in.txt new file mode 100644 index 00000000..c95db929 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/data/calculations-parameters-sha-in.txt @@ -0,0 +1,323 @@ +ACCEPTANCE +ACCEPTURL +ADDMATCH +ADDRMATCH +AIACTIONNUMBER +AIAGIATA +AIAIRNAME +AIAIRTAX +AIBOOKIND*XX* +AICARRIER*XX* +AICHDET +AICLASS*XX* +AICONJTI +AIDEPTCODE +AIDESTCITY*XX* +AIDESTCITYL*XX* +AIEXTRAPASNAME*XX* +AIEYCD +AIFLDATE*XX* +AIFLNUM*XX* +AIGLNUM +AIINVOICE +AIIRST +AIORCITY*XX* +AIORCITYL*XX* +AIPASNAME +AIPROJNUM +AISTOPOV*XX* +AITIDATE +AITINUM +AITINUML*XX* +AITYPCH +AIVATAMNT +AIVATAPPL +ALIAS +ALIASOPERATION +ALIASPERSISTEDAFTERUSE +ALIASUSAGE +ALLOWCORRECTION +AMOUNT +AMOUNT*XX* +AMOUNTHTVA +AMOUNTTVA +ARP_TRN +BACKURL +BATCHID +BGCOLOR +BLVERNUM +BIC +BIN +BRAND +BRANDVISUAL +BUTTONBGCOLOR +BUTTONTXTCOLOR +CANCELURL +CARDNO +CATALOGURL +CAVV_3D +CAVVALGORITHM_3D +CERTID +CHECK_AAV +CIVILITY +CN +COM +COMPLUS +CONVCCY +COSTCENTER +COSTCODE +CREDITCODE +CREDITDEBIT +CUID +CURRENCY +CVC +CVCFLAG +DATA +DATATYPE +DATEIN +DATEOUT +DBXML +DCC_COMMPERC +DCC_CONVAMOUNT +DCC_CONVCCY +DCC_EXCHRATE +DCC_EXCHRATETS +DCC_INDICATOR +DCC_MARGINPERC +DCC_REF +DCC_SOURCE +DCC_VALID +DECLINEURL +DELIVERYDATE +DEVICE +DISCOUNTRATE +DISPLAYMODE +ECI +ECI_3D +ECOM_BILLTO_COMPANY +ECOM_BILLTO_POSTAL_CITY +ECOM_BILLTO_POSTAL_COUNTRYCODE +ECOM_BILLTO_POSTAL_COUNTY +ECOM_BILLTO_POSTAL_NAME_FIRST +ECOM_BILLTO_POSTAL_NAME_LAST +ECOM_BILLTO_POSTAL_NAME_PREFIX +ECOM_BILLTO_POSTAL_POSTALCODE +ECOM_BILLTO_POSTAL_STREET_LINE1 +ECOM_BILLTO_POSTAL_STREET_LINE2 +ECOM_BILLTO_POSTAL_STREET_LINE3 +ECOM_BILLTO_POSTAL_STREET_NUMBER +ECOM_BILLTO_TELECOM_MOBILE_NUMBER +ECOM_BILLTO_TELECOM_PHONE_NUMBER +ECOM_CONSUMERID +ECOM_CONSUMER_GENDER +ECOM_CONSUMEROGID +ECOM_CONSUMERORDERID +ECOM_CONSUMERUSERALIAS +ECOM_CONSUMERUSERPWD +ECOM_CONSUMERUSERID +ECOM_ESTIMATEDDELIVERYDATE +ECOM_ESTIMATEDELIVERYDATE +ECOM_PAYMENT_CARD_EXPDATE_MONTH +ECOM_PAYMENT_CARD_EXPDATE_YEAR +ECOM_PAYMENT_CARD_NAME +ECOM_PAYMENT_CARD_VERIFICATION +ECOM_SHIPMETHOD +ECOM_SHIPMETHODDETAILS +ECOM_SHIPMETHODSPEED +ECOM_SHIPMETHODTYPE +ECOM_SHIPTO_COMPANY +ECOM_SHIPTO_DOB +ECOM_SHIPTO_ONLINE_EMAIL +ECOM_SHIPTO_POSTAL_CITY +ECOM_SHIPTO_POSTAL_COUNTRYCODE +ECOM_SHIPTO_POSTAL_COUNTY +ECOM_SHIPTO_POSTAL_NAME_FIRST +ECOM_SHIPTO_POSTAL_NAME_LAST +ECOM_SHIPTO_POSTAL_NAME_PREFIX +ECOM_SHIPTO_POSTAL_POSTALCODE +ECOM_SHIPTO_POSTAL_STATE +ECOM_SHIPTO_POSTAL_STREET_LINE1 +ECOM_SHIPTO_POSTAL_STREET_LINE2 +ECOM_SHIPTO_POSTAL_STREET_NUMBER +ECOM_SHIPTO_TELECOM_FAX_NUMBER +ECOM_SHIPTO_TELECOM_MOBILE_NUMBER +ECOM_SHIPTO_TELECOM_PHONE_NUMBER +ECOM_SHIPTO_TVA +ED +EMAIL +EXCEPTIONURL +EXCLPMLIST +EXECUTIONDATE*XX* +FACEXCL*XX* +FACTOTAL*XX* +FIRSTCALL +FLAG3D +FONTTYPE +FORCECODE1 +FORCECODE2 +FORCECODEHASH +FORCEPROCESS +FORCETP +FP_ACTIV +GENERIC_BL +GIROPAY_ACCOUNT_NUMBER +GIROPAY_BLZ +GIROPAY_OWNER_NAME +GLOBORDERID +GUID +HDFONTTYPE +HDTBLBGCOLOR +HDTBLTXTCOLOR +HEIGHTFRAME +HOMEURL +HTTP_ACCEPT +HTTP_USER_AGENT +INCLUDE_BIN +INCLUDE_COUNTRIES +INITIAL_REC_TRN +INVDATE +INVDISCOUNT +INVLEVEL +INVORDERID +ISSUERID +IST_MOBILE +ITEM_COUNT +ITEMATTRIBUTES*XX* +ITEMCATEGORY*XX* +ITEMCOMMENTS*XX* +ITEMDESC*XX* +ITEMDISCOUNT*XX* +ITEMFDMPRODUCTCATEG*XX* +ITEMID*XX* +ITEMNAME*XX* +ITEMPRICE*XX* +ITEMQUANT*XX* +ITEMQUANTORIG*XX* +ITEMUNITOFMEASURE*XX* +ITEMVAT*XX* +ITEMVATCODE*XX* +ITEMWEIGHT*XX* +LANGUAGE +LEVEL1AUTHCPC +LIDEXCL*XX* +LIMITCLIENTSCRIPTUSAGE +LINE_REF +LINE_REF1 +LINE_REF2 +LINE_REF3 +LINE_REF4 +LINE_REF5 +LINE_REF6 +LIST_BIN +LIST_COUNTRIES +LOGO +MANDATEID +MAXITEMQUANT*XX* +MERCHANTID +MODE +MTIME +MVER +NETAMOUNT +OPERATION +ORDERID +ORDERSHIPCOST +ORDERSHIPMETH +ORDERSHIPTAX +ORDERSHIPTAXCODE +ORIG +OR_INVORDERID +OR_ORDERID +OWNERADDRESS +OWNERADDRESS2 +OWNERCTY +OWNERTELNO +OWNERTELNO2 +OWNERTOWN +OWNERZIP +PAIDAMOUNT +PARAMPLUS +PARAMVAR +PAYID +PAYMETHOD +PM +PMLIST +PMLISTPMLISTTYPE +PMLISTTYPE +PMLISTTYPEPMLIST +PMTYPE +POPUP +POST +PSPID +PSWD +RECIPIENTACCOUNTNUMBER +RECIPIENTDOB +RECIPIENTLASTNAME +RECIPIENTZIP +REF +REFER +REFID +REFKIND +REF_CUSTOMERID +REF_CUSTOMERREF +REGISTRED +REMOTE_ADDR +REQGENFIELDS +RNPOFFERT +RTIMEOUT +RTIMEOUTREQUESTEDTIMEOUT +SCORINGCLIENT +SEQUENCETYPE +SETT_BATCH +SID +SIGNDATE +STATUS_3D +SUBSCRIPTION_ID +SUB_AM +SUB_AMOUNT +SUB_COM +SUB_COMMENT +SUB_CUR +SUB_ENDDATE +SUB_ORDERID +SUB_PERIOD_MOMENT +SUB_PERIOD_MOMENT_M +SUB_PERIOD_MOMENT_WW +SUB_PERIOD_NUMBER +SUB_PERIOD_NUMBER_D +SUB_PERIOD_NUMBER_M +SUB_PERIOD_NUMBER_WW +SUB_PERIOD_UNIT +SUB_STARTDATE +SUB_STATUS +TAAL +TAXINCLUDED*XX* +TBLBGCOLOR +TBLTXTCOLOR +TID +TITLE +TOTALAMOUNT +TP +TRACK2 +TXTBADDR2 +TXTCOLOR +TXTOKEN +TXTOKENTXTOKENPAYPAL +TXSHIPPING +TXSHIPPINGLOCATIONPROFILE +TXURL +TXVERIFIER +TYPE_COUNTRY +UCAF_AUTHENTICATION_DATA +UCAF_PAYMENT_CARD_CVC2 +UCAF_PAYMENT_CARD_EXPDATE_MONTH +UCAF_PAYMENT_CARD_EXPDATE_YEAR +UCAF_PAYMENT_CARD_NUMBER +USERID +USERTYPE +VERSION +WBTU_MSISDN +WBTU_ORDERID +WEIGHTUNIT +WIN3DS +WITHROOT +XDL diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/data/calculations-parameters-sha-out.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/data/calculations-parameters-sha-out.txt new file mode 100644 index 00000000..9675fe57 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/data/calculations-parameters-sha-out.txt @@ -0,0 +1,62 @@ +AAVADDRESS +AAVCHECK +AAVMAIL +AAVNAME +AAVPHONE +AAVZIP +ACCEPTANCE +ALIAS +AMOUNT +BIC +BIN +BRAND +CARDNO +CCCTY +CN +COLLECTOR_BIC +COLLECTOR_IBAN +COMPLUS +CREATION_STATUS +CREDITDEBIT +CURRENCY +CVCCHECK +DCC_COMMPERCENTAGE +DCC_CONVAMOUNT +DCC_CONVCCY +DCC_EXCHRATE +DCC_EXCHRATESOURCE +DCC_EXCHRATETS +DCC_INDICATOR +DCC_MARGINPERCENTAGE +DCC_VALIDHOURS +DEVICEID +DIGESTCARDNO +ECI +ED +EMAIL +ENCCARDNO +FXAMOUNT +FXCURRENCY +IP +IPCTY +MANDATEID +MOBILEMODE +NBREMAILUSAGE +NBRIPUSAGE +NBRIPUSAGE_ALLTX +NBRUSAGE +NCERROR +ORDERID +PAYID +PAYIDSUB +PAYMENT_REFERENCE +PM +SCO_CATEGORY +SCORING +SEQUENCETYPE +SIGNDATE +STATUS +SUBBRAND +SUBSCRIPTION_ID +TRXDATE +VC diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php new file mode 100644 index 00000000..43931f54 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/AbstractIntegration.php @@ -0,0 +1,35 @@ + null, + 'name' => null, + 'url' => 'https://secure.ogone.com/', + 'product_url' => \__( 'https://payment-services.ingenico.com/nl/en', 'pronamic_ideal' ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-ingenico-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + 'dashboard_url' => 'https://secure.ogone.com/', + 'provider' => 'ogone', + 'supports' => array( + 'webhook', + 'webhook_log', + ), + ) + ); + + parent::__construct( $args ); + + // Actions. + $function = array( __NAMESPACE__ . '\Listener', 'listen' ); + + if ( ! has_action( 'wp_loaded', $function ) ) { + add_action( 'wp_loaded', $function ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Brands.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Brands.php new file mode 100644 index 00000000..1bd3d066 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Brands.php @@ -0,0 +1,114 @@ +set_form_action_url( $this->get_default_form_action_url() ); + } + + /** + * Get the default Ogone e-Commerce form action URL. + * + * @since 1.2.9 + * @return string + */ + protected function get_default_form_action_url() { + $is_utf8 = strcasecmp( get_bloginfo( 'charset' ), 'UTF-8' ) === 0; + + if ( $is_utf8 ) { + return 'https://secure.ogone.com/ncol/prod/orderstandard_utf8.asp'; + } + + return 'https://secure.ogone.com/ncol/prod/orderstandard.asp'; + } + + /** + * Get the Ogone e-Commerce form action URL. + * + * @since 1.2.9 + * @return string + */ + public function get_form_action_url() { + return $this->form_action_url; + } + + /** + * Set the Ogone e-Commerce form action URL. + * + * @since 1.2.9 + * + * @param string $url Ogone e-Commerce form action URL. + */ + public function set_form_action_url( $url ) { + $this->form_action_url = $url; + } + + /** + * Get Ogone payment server URL. + * + * @return string + * @deprecated deprecated since version 1.2.9, use get_form_action_url() instead. + */ + public function get_payment_server_url() { + return $this->get_form_action_url(); + } + + /** + * Get Direct Query URL. + * + * @since 1.3.2 + * @return string + */ + public function get_direct_query_url() { + if ( Core_Gateway::MODE_TEST === $this->mode ) { + return 'https://secure.ogone.com/ncol/test/querydirect.asp'; + } + + return 'https://secure.ogone.com/ncol/prod/querydirect.asp'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Data.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Data.php new file mode 100644 index 00000000..c8ebf241 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Data.php @@ -0,0 +1,67 @@ +fields = array(); + } + + /** + * Get all the fields + * + * @return array + */ + public function get_fields() { + return $this->fields; + } + + /** + * Get field by the specifiek name + * + * @param string $name + */ + public function get_field( $name ) { + $value = null; + + if ( isset( $this->fields[ $name ] ) ) { + $value = $this->fields[ $name ]; + } + + return $value; + } + + /** + * Set field + * + * @param string $name + * @param string $value + * + * @return Data + */ + public function set_field( $name, $value ) { + $this->fields[ $name ] = $value; + + return $this; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataCreditCardHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataCreditCardHelper.php new file mode 100644 index 00000000..6118c985 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataCreditCardHelper.php @@ -0,0 +1,50 @@ +set_field( 'CARDNO', $number ); + } + + /** + * Set expiration date. + * + * @param DateTime $date Expiration date. + * + * @return DataCreditCardHelper + */ + public function set_expiration_date( DateTime $date ) { + return $this->set_field( 'ED', $date->format( Ingenico::EXPIRATION_DATE_FORMAT ) ); + } + + /** + * Set security code. + * + * @param string $security_code Security code. + * + * @return DataCreditCardHelper + */ + public function set_security_code( $security_code ) { + return $this->set_field( 'CVC', $security_code ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataCustomerHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataCustomerHelper.php new file mode 100644 index 00000000..7ae9bb8c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataCustomerHelper.php @@ -0,0 +1,95 @@ +set_field( 'CN', $name ); + } + + /** + * Set customer email address. + * + * @param string $email Email address. + * + * @return DataCustomerHelper + */ + public function set_email( $email ) { + return $this->set_field( 'EMAIL', $email ); + } + + /** + * Set customer street name and number. + * + * @param string $address Street name and house number. + * + * @return DataCustomerHelper + */ + public function set_address( $address ) { + return $this->set_field( 'OWNERADDRESS', $address ); + } + + /** + * Set customer postcode or ZIP code. + * + * @param string $zip ZIP. + * + * @return DataCustomerHelper + */ + public function set_zip( $zip ) { + return $this->set_field( 'OWNERZIP', $zip ); + } + + /** + * Set customer town/city/... + * + * @param string $town Town. + * + * @return DataCustomerHelper + */ + public function set_town( $town ) { + return $this->set_field( 'OWNERTOWN', $town ); + } + + /** + * Set customer country. + * + * @param string $country Country. + * + * @return DataCustomerHelper + */ + public function set_country( $country ) { + return $this->set_field( 'OWNERCTY', $country ); + } + + /** + * Set customer telephone number. + * + * @param string $number Telephone number. + * + * @return DataCustomerHelper + */ + public function set_telephone_number( $number ) { + return $this->set_field( 'OWNERTELNO', $number ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataGeneralHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataGeneralHelper.php new file mode 100644 index 00000000..afda6905 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataGeneralHelper.php @@ -0,0 +1,180 @@ +set_field( 'ALIAS', $alias ); + } + + /** + * Set alias usage. + * + * @param string $alias_usage Alias usage. + * + * @return DataGeneralHelper + */ + public function set_alias_usage( $alias_usage ) { + return $this->set_field( 'ALIASUSAGE', $alias_usage ); + } + + /** + * Set PSP ID + * + * @param int $number PSP ID. + * + * @return DataGeneralHelper + */ + public function set_psp_id( $number ) { + return $this->set_field( 'PSPID', $number ); + } + + /** + * Set order ID + * + * @param string $order_id Order ID. + * + * @return DataGeneralHelper + */ + public function set_order_id( $order_id ) { + return $this->set_field( 'ORDERID', $order_id ); + } + + /** + * Set order description + * AN..max32 (AN = Alphanumeric, free text) + * + * @param string $description Description. + * + * @return DataGeneralHelper + */ + public function set_order_description( $description ) { + return $this->set_field( 'COM', $description ); + } + + /** + * Set amount + * + * @param float $amount Amount in cents. + * + * @return DataGeneralHelper + */ + public function set_amount( $amount ) { + return $this->set_field( 'AMOUNT', $amount ); + } + + /** + * Set currency + * + * @param string $currency Currency. + * + * @return DataGeneralHelper + */ + public function set_currency( $currency ) { + return $this->set_field( 'CURRENCY', $currency ); + } + + /** + * Set customer name + * + * @deprecated since 1.3.0 + * + * @param string $name Customer name. + * + * @return DataGeneralHelper + */ + public function set_customer_name( $name ) { + return $this->set_field( 'CN', $name ); + } + + /** + * Set email address + * + * @deprecated since 1.3.0 + * + * @param string $email Email address. + * + * @return DataGeneralHelper + */ + public function set_email( $email ) { + return $this->set_field( 'EMAIL', $email ); + } + + /** + * Set language + * + * @param string $language Language. + * + * @return DataGeneralHelper + */ + public function set_language( $language ) { + return $this->set_field( 'LANGUAGE', $language ); + } + + /** + * Set payment method + * + * @param string $payment_method Payment method. + * + * @return DataGeneralHelper + */ + public function set_payment_method( $payment_method ) { + return $this->set_field( 'PM', $payment_method ); + } + + /** + * Set payment methods list + * + * @param string $list Payment method list. + * + * @return DataGeneralHelper + */ + public function set_payment_methods_list( $list ) { + return $this->set_field( 'PMLIST', $list ); + } + + /** + * Set brand of a credit/debit/purchasing card + * + * If you send the BRAND field without sending a value in the PM field (‘CreditCard’ or ‘Purchasing Card’), + * the BRAND value will not be taken into account. + * + * @param string $brand Brand of card. + * + * @return DataGeneralHelper + */ + public function set_brand( $brand ) { + return $this->set_field( 'BRAND', $brand ); + } + + /** + * Set PARAMPLUS feedback parameters + * + * @link https://payment-services.ingenico.com/int/en/ogone/support/guides/integration%20guides/e-commerce/transaction-feedback#feedbackparameters_variablefeedbackparameters + * @since 1.2.6 + * + * @param string $param_plus `PARAMPLUS` parameter value. + * + * @return DataGeneralHelper + */ + public function set_param_plus( $param_plus ) { + return $this->set_field( 'PARAMPLUS', $param_plus ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataHelper.php new file mode 100644 index 00000000..2b6459d5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataHelper.php @@ -0,0 +1,45 @@ +data = $data; + } + + /** + * Set field + * + * @param string $name Name. + * @param string $value Value. + * + * @return mixed + */ + public function set_field( $name, $value ) { + $this->data->set_field( $name, $value ); + + return $this; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataUrlHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataUrlHelper.php new file mode 100644 index 00000000..9707e6e2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DataUrlHelper.php @@ -0,0 +1,81 @@ +set_field( Parameters::ACCEPT_URL, $url ); + } + + /** + * Set cancel URL + * + * URL of the web page to show the customer when he cancels the payment. + * + * @param string $url + */ + public function set_cancel_url( $url ) { + return $this->set_field( Parameters::CANCEL_URL, $url ); + } + + /** + * Set exception URL + * + * URL of the web page to show the customer when the payment result is uncertain. + * + * @param string $url + */ + public function set_exception_url( $url ) { + return $this->set_field( Parameters::EXCEPTION_URL, $url ); + } + + /** + * Set decline URL + * + * URL of the web page to show the customer when the acquirer rejects the authorisation more + * than the maximum of authorised tries (10 by default, but can be changed in the technical + * information page). + * + * @param string $url + */ + public function set_decline_url( $url ) { + return $this->set_field( Parameters::DECLINE_URL, $url ); + } + + /** + * Set home URL + * + * @param string $url + */ + public function set_home_url( $url ) { + return $this->set_field( 'home', $url ); + } + + /** + * Set back URL + * + * @param string $url + */ + public function set_back_url( $url ) { + return $this->set_field( 'backurl', $url ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink.php new file mode 100644 index 00000000..2f0ae78b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink.php @@ -0,0 +1,50 @@ +api_url = DirectLink::API_PRODUCTION_URL; + } + + /** + * Order direct + * + * @param array $data Data. + * + * @return bool|OrderResponse + * @throws \Exception Throws exception if DirectLink request fails. + */ + public function order_direct( array $data = array() ) { + $result = Util::remote_get_body( + $this->api_url, + 200, + array( + 'method' => 'POST', + 'sslverify' => false, + 'body' => $data, + ) + ); + + if ( $result instanceof \WP_Error ) { + throw new \Exception( + \sprintf( + 'Ogone DirectLink HTTP request failed: %s.', + $result->get_error_message() + ) + ); + } + + $xml = Util::simplexml_load_string( $result ); + + $order_response = OrderResponseParser::parse( $xml ); + + if ( ! empty( $order_response->nc_error ) ) { + $ogone_error = new Error( + Security::filter( $order_response->nc_error ), + Security::filter( $order_response->nc_error_plus ) + ); + + throw new \Exception( (string) $ogone_error ); + } + + return $order_response; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Config.php new file mode 100644 index 00000000..ebe0cd32 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Config.php @@ -0,0 +1,32 @@ +api_url = DirectLink::API_PRODUCTION_URL; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/DataHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/DataHelper.php new file mode 100644 index 00000000..d9e6e9d2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/DataHelper.php @@ -0,0 +1,59 @@ +data = $data; + } + + /** + * Set user id + * + * @param string $user_id User ID. + * + * @return DataHelper + */ + public function set_user_id( $user_id ) { + $this->data->set_field( 'USERID', $user_id ); + + return $this; + } + + /** + * Set password + * + * @param string $password Password. + * + * @return DataHelper + */ + public function set_password( $password ) { + $this->data->set_field( 'PSWD', $password ); + + return $this; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Gateway.php new file mode 100644 index 00000000..2e8261d3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Gateway.php @@ -0,0 +1,216 @@ +set_method( self::METHOD_HTTP_REDIRECT ); + + $this->client = new Client(); + $this->client->psp_id = $config->psp_id; + $this->client->sha_in = $config->sha_in_pass_phrase; + $this->client->user_id = $config->user_id; + $this->client->password = $config->password; + $this->client->api_url = $config->api_url; + } + + /** + * Start + * + * @param Payment $payment Payment. + * + * @see Pronamic_WP_Pay_Gateway::start() + * + * @throws \Exception Throws exception if DirectLink request fails. + */ + public function start( Payment $payment ) { + $ogone_data = new Data(); + + // General. + $ogone_data_general = new DataGeneralHelper( $ogone_data ); + + $ogone_data_general + ->set_psp_id( $this->client->psp_id ) + ->set_order_id( $payment->format_string( $this->config->order_id ) ) + ->set_order_description( $payment->get_description() ) + ->set_param_plus( 'payment_id=' . $payment->get_id() ) + ->set_currency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() ) + ->set_amount( $payment->get_total_amount()->get_cents() ); + + // Alias. + if ( $this->config->alias_enabled ) { + $alias = uniqid(); + + $payment->set_meta( 'ogone_alias', $alias ); + + $ogone_data_general->set_alias( $alias ); + } + + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + // Localised language. + $ogone_data_general->set_language( $customer->get_locale() ); + } + + // Customer. + $ogone_data_customer = new DataCustomerHelper( $ogone_data ); + + if ( null !== $customer ) { + $name = $customer->get_name(); + + if ( null !== $name ) { + $ogone_data_customer->set_name( strval( $name ) ); + } + + $ogone_data_customer->set_email( $customer->get_email() ); + } + + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + $ogone_data_customer + ->set_address( $billing_address->get_line_1() ) + ->set_zip( $billing_address->get_postal_code() ) + ->set_town( $billing_address->get_city() ) + ->set_country( $billing_address->get_country_code() ) + ->set_telephone_number( $billing_address->get_phone() ); + } + + // DirectLink. + $ogone_data_directlink = new DataHelper( $ogone_data ); + + $ogone_data_directlink + ->set_user_id( $this->client->user_id ) + ->set_password( $this->client->password ); + + // Credit card. + $ogone_data_credit_card = new DataCreditCardHelper( $ogone_data ); + + $credit_card = $payment->get_credit_card(); + + if ( $credit_card ) { + $ogone_data_credit_card + ->set_number( $credit_card->get_number() ) + ->set_expiration_date( $credit_card->get_expiration_date() ) + ->set_security_code( $credit_card->get_security_code() ); + } + + $ogone_data->set_field( 'OPERATION', 'SAL' ); + + // 3-D Secure + if ( $this->config->enabled_3d_secure ) { + $secure_data_helper = new SecureDataHelper( $ogone_data ); + + $secure_data_helper + ->set_3d_secure_flag( true ) + ->set_http_accept( Server::get( 'HTTP_ACCEPT' ) ) + ->set_http_user_agent( Server::get( 'HTTP_USER_AGENT' ) ) + ->set_window( 'MAINW' ); + + $ogone_data->set_field( 'ACCEPTURL', $payment->get_return_url() ); + $ogone_data->set_field( 'DECLINEURL', $payment->get_return_url() ); + $ogone_data->set_field( 'EXCEPTIONURL', $payment->get_return_url() ); + $ogone_data->set_field( 'COMPLUS', '' ); + } + + // Signature. + $calculation_fields = Security::get_calculations_parameters_in(); + + $fields = Security::get_calculation_fields( $calculation_fields, $ogone_data->get_fields() ); + + $signature = Security::get_signature( $fields, $this->config->sha_in_pass_phrase, $this->config->hash_algorithm ); + + $ogone_data->set_field( 'SHASIGN', $signature ); + + // Order. + $result = $this->client->order_direct( $ogone_data->get_fields() ); + + $payment->set_transaction_id( $result->pay_id ); + $payment->set_action_url( $payment->get_return_url() ); + $payment->set_status( Statuses::transform( $result->status ) ); + + if ( ! empty( $result->html_answer ) ) { + $payment->set_meta( 'ogone_directlink_html_answer', $result->html_answer ); + $payment->set_action_url( $payment->get_pay_redirect_url() ); + } + } + + /** + * Payment redirect. + * + * @param Payment $payment Payment. + * + * @return void + */ + public function payment_redirect( Payment $payment ) { + $html_answer = $payment->get_meta( 'ogone_directlink_html_answer' ); + + if ( ! empty( $html_answer ) ) { + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $html_answer; + + exit; + } + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $data = Security::get_request_data(); + + $data = array_change_key_case( $data, CASE_UPPER ); + + $calculation_fields = Security::get_calculations_parameters_out(); + + $fields = Security::get_calculation_fields( $calculation_fields, $data ); + + $signature = $data['SHASIGN']; + $signature_out = Security::get_signature( $fields, $this->config->sha_out_pass_phrase, $this->config->hash_algorithm ); + + if ( 0 === strcasecmp( $signature, $signature_out ) ) { + $status = Statuses::transform( $data[ Parameters::STATUS ] ); + + $payment->set_status( $status ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Integration.php new file mode 100644 index 00000000..0d7d407f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/Integration.php @@ -0,0 +1,73 @@ + 'ogone-directlink', + 'name' => 'Ingenico/Ogone - DirectLink', + ) + ); + + parent::__construct( $args ); + } + + public function get_settings_fields() { + return Settings::get_settings_fields( 'directlink' ); + } + + public function get_config( $post_id ) { + $config = new Config(); + + $config->mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + $config->psp_id = get_post_meta( $post_id, '_pronamic_gateway_ogone_psp_id', true ); + $config->hash_algorithm = get_post_meta( $post_id, '_pronamic_gateway_ogone_hash_algorithm', true ); + $config->sha_out_pass_phrase = get_post_meta( $post_id, '_pronamic_gateway_ogone_sha_out_pass_phrase', true ); + $config->user_id = get_post_meta( $post_id, '_pronamic_gateway_ogone_user_id', true ); + $config->password = get_post_meta( $post_id, '_pronamic_gateway_ogone_password', true ); + $config->sha_in_pass_phrase = get_post_meta( $post_id, '_pronamic_gateway_ogone_directlink_sha_in_pass_phrase', true ); + $config->enabled_3d_secure = get_post_meta( $post_id, '_pronamic_gateway_ogone_3d_secure_enabled', true ); + $config->order_id = get_post_meta( $post_id, '_pronamic_gateway_ogone_order_id', true ); + $config->alias_enabled = get_post_meta( $post_id, '_pronamic_gateway_ogone_alias_enabled', true ); + $config->alias_usage = get_post_meta( $post_id, '_pronamic_gateway_ogone_alias_usage', true ); + + // API URL + $is_utf8 = strcasecmp( get_bloginfo( 'charset' ), 'UTF-8' ) === 0; + + switch ( $config->mode ) { + case Gateway::MODE_TEST: + if ( $is_utf8 ) { + $config->api_url = DirectLink::API_TEST_UTF8_URL; + } else { + $config->api_url = DirectLink::API_TEST_URL; + } + + break; + default: + if ( $is_utf8 ) { + $config->api_url = DirectLink::API_PRODUCTION_UTF8_URL; + } else { + $config->api_url = DirectLink::API_PRODUCTION_URL; + } + } + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/OrderResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/OrderResponse.php new file mode 100644 index 00000000..cdeba078 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/DirectLink/OrderResponse.php @@ -0,0 +1,46 @@ +code = $code; + $this->explanation = $explanation; + } + + // @todo getters and setters + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + return $this->code . ' ' . $this->explanation; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Ingenico.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Ingenico.php new file mode 100644 index 00000000..2269065a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Ingenico.php @@ -0,0 +1,43 @@ +add_note( __( 'Webhook requested.', 'pronamic_ideal' ) ); + + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + // Update payment. + Plugin::update_payment( $payment ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Client.php new file mode 100644 index 00000000..4af8ec0c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Client.php @@ -0,0 +1,371 @@ +data = new Data(); + $this->data->set_field( Parameters::PSPID, $psp_id ); + + $this->hash_algorithm = Ingenico::SHA_1; + } + + /** + * Get the payment server URL + * + * @return the payment server URL + */ + public function get_payment_server_url() { + return $this->payment_server_url; + } + + /** + * Set the payment server URL + * + * @param string $url Payment server URL. + */ + public function set_payment_server_url( $url ) { + $this->payment_server_url = $url; + } + + /** + * Get the Direct Query URL. + * + * @return string + */ + public function get_direct_query_url() { + return $this->direct_query_url; + } + + /** + * Set the Direct Query URL. + * + * @param string $url Direct query URL. + */ + public function set_direct_query_url( $url ) { + $this->direct_query_url = $url; + } + + /** + * Get hash algorithm + * + * @return string + */ + public function get_hash_algorithm() { + return $this->hash_algorithm; + } + + /** + * Set hash algorithm + * + * @param string $hash_algorithm Hashing algorithm. + */ + public function set_hash_algorithm( $hash_algorithm ) { + $this->hash_algorithm = $hash_algorithm; + } + + /** + * Get password phrase IN + * + * @return string + */ + public function get_pass_phrase_in() { + return $this->pass_phrase_in; + } + + /** + * Set password phrase IN + * + * @param string $pass_phrase_in Pass phrase IN. + */ + public function set_pass_phrase_in( $pass_phrase_in ) { + $this->pass_phrase_in = $pass_phrase_in; + } + + /** + * Get password phrase OUT + * + * @return string + */ + public function get_pass_phrase_out() { + return $this->pass_phrase_out; + } + + /** + * Set password phrase OUT + * + * @param string $pass_phrase_out Pass phrase OUT. + */ + public function set_pass_phrase_out( $pass_phrase_out ) { + $this->pass_phrase_out = $pass_phrase_out; + } + + /** + * Get API user ID. + * + * @return string + */ + public function get_user_id() { + return $this->user_id; + } + + /** + * Set API user ID. + * + * @param string $user_id API user ID. + */ + public function set_user_id( $user_id ) { + $this->user_id = $user_id; + } + + /** + * Get API user password. + * + * @return string + */ + public function get_password() { + return $this->password; + } + + /** + * Set API user password. + * + * @param string $password API user password. + */ + public function set_password( $password ) { + $this->password = $password; + } + + /** + * Get data + * + * @return Data + */ + public function get_data() { + return $this->data; + } + + /** + * Get signature IN + * + * @return string + */ + public function get_signature_in() { + $calculation_fields = Security::get_calculations_parameters_in(); + + $fields = Security::get_calculation_fields( $calculation_fields, $this->data->get_fields() ); + + return Security::get_signature( $fields, $this->get_pass_phrase_in(), $this->hash_algorithm ); + } + + /** + * Get signature OUT + * + * @param array $fields Fields to calculate signature for. + * + * @return string + */ + public function get_signature_out( $fields ) { + $calculation_fields = Security::get_calculations_parameters_out(); + + $fields = Security::get_calculation_fields( $calculation_fields, $fields ); + + return Security::get_signature( $fields, $this->get_pass_phrase_out(), $this->hash_algorithm ); + } + + /** + * Get fields + * + * @since 1.2.1 + * @return array + */ + public function get_fields() { + Security::sign_data( $this->data, $this->get_pass_phrase_in(), $this->hash_algorithm ); + + return $this->data->get_fields(); + } + + /** + * Get order status + * + * @param string $order_id Order ID. + * + * @return string|null + * @throws \Exception Throw exception on error in retrieving order status. + */ + public function get_order_status( $order_id ) { + $return = null; + + // API user ID and password. + $user_id = $this->get_user_id(); + $password = $this->get_password(); + + if ( '' === $user_id || '' === $password ) { + return $return; + } + + $result = Util::remote_get_body( + $this->get_direct_query_url(), + 200, + array( + 'method' => 'POST', + 'body' => array( + Parameters::ORDERID => $order_id, + Parameters::PSPID => $this->data->get_field( Parameters::PSPID ), + Parameters::USER_ID => $user_id, + Parameters::PASSWORD => $password, + ), + 'timeout' => 30, + ) + ); + + if ( $result instanceof \WP_Error ) { + throw new \Exception( sprintf( 'Could not get order status for order ID %s.', $order_id ) ); + } + + $xml = Util::simplexml_load_string( $result ); + + $order_response = OrderResponseParser::parse( $xml ); + + if ( ! empty( $order_response->nc_error ) ) { + $ogone_error = new Error( + XML_Security::filter( $order_response->nc_error ), + XML_Security::filter( $order_response->nc_error_plus ) + ); + + throw new \Exception( + \sprintf( + '%s
    %s', + sprintf( 'Could not get order status for order ID %s.', $order_id ), + (string) $ogone_error + ) + ); + } + + $status = XML_Security::filter( $order_response->status ); + + $return = Statuses::transform( $status ); + + return $return; + } + + /** + * Verify request + * + * @param array $data Request data. + */ + public function verify_request( $data ) { + $result = false; + + $data = array_change_key_case( $data, CASE_UPPER ); + + if ( isset( $data['SHASIGN'] ) ) { + $signature = $data['SHASIGN']; + + $signature_out = $this->get_signature_out( $data ); + + if ( 0 === strcasecmp( $signature, $signature_out ) ) { + $result = filter_var_array( + $data, + array( + Parameters::ORDERID => FILTER_SANITIZE_STRING, + Parameters::AMOUNT => FILTER_VALIDATE_FLOAT, + Parameters::CURRENCY => FILTER_SANITIZE_STRING, + 'PM' => FILTER_SANITIZE_STRING, + 'ACCEPTANCE' => FILTER_SANITIZE_STRING, + 'STATUS' => FILTER_VALIDATE_INT, + 'CARDNO' => FILTER_SANITIZE_STRING, + 'PAYID' => FILTER_VALIDATE_INT, + 'NCERROR' => FILTER_SANITIZE_STRING, + 'BRAND' => FILTER_SANITIZE_STRING, + 'SHASIGN' => FILTER_SANITIZE_STRING, + ) + ); + } + } + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Config.php new file mode 100644 index 00000000..a35212cf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Config.php @@ -0,0 +1,61 @@ +set_method( self::METHOD_HTML_FORM ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $this->client = new Client( $this->config->psp_id ); + + $this->client->set_payment_server_url( $config->get_form_action_url() ); + $this->client->set_direct_query_url( $config->get_direct_query_url() ); + $this->client->set_pass_phrase_in( $config->sha_in_pass_phrase ); + $this->client->set_pass_phrase_out( $config->sha_out_pass_phrase ); + $this->client->set_user_id( $config->user_id ); + $this->client->set_password( $config->password ); + + if ( ! empty( $config->hash_algorithm ) ) { + $this->client->set_hash_algorithm( $config->hash_algorithm ); + } + } + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + Core_PaymentMethods::IDEAL, + Core_PaymentMethods::CREDIT_CARD, + Core_PaymentMethods::BANCONTACT, + ); + } + + /** + * Start + * + * @see Pronamic_WP_Pay_Gateway::start() + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + $payment->set_action_url( $this->client->get_payment_server_url() ); + + if ( $this->config->alias_enabled ) { + $alias = uniqid(); + + $payment->set_meta( 'ogone_alias', $alias ); + } + } + + /** + * Get output fields + * + * @param Payment $payment Payment. + * + * @return array + * @since 1.2.1 + * @version 2.0.4 + * @see Core_Gateway::get_output_html() + */ + public function get_output_fields( Payment $payment ) { + $ogone_data = $this->client->get_data(); + + // General. + $ogone_data_general = new DataGeneralHelper( $ogone_data ); + + $ogone_data_general + ->set_order_id( $payment->format_string( $this->config->order_id ) ) + ->set_order_description( $payment->get_description() ) + ->set_param_plus( 'payment_id=' . $payment->get_id() ) + ->set_currency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() ) + ->set_amount( $payment->get_total_amount()->get_minor_units() ); + + // Alias. + $alias = $payment->get_meta( 'ogone_alias' ); + + if ( $this->config->alias_enabled && false !== $alias ) { + $ogone_data_general->set_alias( $alias ) + ->set_alias_usage( $this->config->alias_usage ); + } + + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + // Localised language. + $ogone_data_general->set_language( $customer->get_locale() ); + } + + // Customer. + $ogone_data_customer = new DataCustomerHelper( $ogone_data ); + + if ( null !== $customer ) { + $name = $customer->get_name(); + + if ( null !== $name ) { + $ogone_data_customer->set_name( strval( $name ) ); + } + + $ogone_data_customer->set_email( $customer->get_email() ); + } + + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + $ogone_data_customer + ->set_address( $billing_address->get_line_1() ) + ->set_zip( $billing_address->get_postal_code() ) + ->set_town( $billing_address->get_city() ) + ->set_country( $billing_address->get_country_code() ) + ->set_telephone_number( $billing_address->get_phone() ); + } + + /* + * Payment method. + * + * @link https://github.com/wp-pay-gateways/ogone/wiki/Brands + */ + switch ( $payment->get_method() ) { + case Core_PaymentMethods::CREDIT_CARD: + /* + * Set credit card payment method. + * @since 1.2.3 + */ + $ogone_data_general + ->set_payment_method( PaymentMethods::CREDIT_CARD ); + + break; + case Core_PaymentMethods::IDEAL: + /* + * Set iDEAL payment method. + * @since 1.2.3 + */ + $ogone_data_general + ->set_brand( Brands::IDEAL ) + ->set_payment_method( PaymentMethods::IDEAL ); + + break; + case Core_PaymentMethods::BANCONTACT: + case Core_PaymentMethods::MISTER_CASH: + $ogone_data_general + ->set_brand( Brands::BCMC ) + ->set_payment_method( PaymentMethods::CREDIT_CARD ); + + break; + } + + // Parameter Variable. + $param_var = Util::get_param_var( $this->config->param_var ); + + if ( ! empty( $param_var ) ) { + $ogone_data->set_field( 'PARAMVAR', $param_var ); + } + + // Template Page. + $template_page = $this->config->template_page; + + if ( ! empty( $template_page ) ) { + $ogone_data->set_field( 'TP', $template_page ); + } + + // URLs. + $ogone_url_helper = new DataUrlHelper( $ogone_data ); + + $ogone_url_helper + ->set_accept_url( add_query_arg( 'status', 'accept', $payment->get_return_url() ) ) + ->set_cancel_url( add_query_arg( 'status', 'cancel', $payment->get_return_url() ) ) + ->set_decline_url( add_query_arg( 'status', 'decline', $payment->get_return_url() ) ) + ->set_exception_url( add_query_arg( 'status', 'exception', $payment->get_return_url() ) ); + + return $this->client->get_fields(); + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $data = Security::get_request_data(); + + $data = $this->client->verify_request( $data ); + + if ( false !== $data ) { + $status = Statuses::transform( $data[ Parameters::STATUS ] ); + + $payment->set_status( $status ); + + $this->update_status_payment_note( $payment, $data ); + + return; + } + + // Get order status with direct query. + $order_id = $payment->format_string( $this->config->order_id ); + + try { + $status = $this->client->get_order_status( $order_id ); + } catch ( \Exception $e ) { + $payment->add_note( $e->getMessage() ); + + return; + } + + if ( null !== $status ) { + $payment->set_status( $status ); + } + } + + /** + * Update status payment note + * + * @param Payment $payment Payment. + * @param array $data Data. + */ + private function update_status_payment_note( Payment $payment, $data ) { + $labels = array( + 'STATUS' => __( 'Status', 'pronamic_ideal' ), + 'ORDERID' => __( 'Order ID', 'pronamic_ideal' ), + 'CURRENCY' => __( 'Currency', 'pronamic_ideal' ), + 'AMOUNT' => __( 'Amount', 'pronamic_ideal' ), + 'PM' => __( 'Payment Method', 'pronamic_ideal' ), + 'ACCEPTANCE' => __( 'Acceptance', 'pronamic_ideal' ), + 'CARDNO' => __( 'Card Number', 'pronamic_ideal' ), + 'ED' => __( 'End Date', 'pronamic_ideal' ), + 'CN' => __( 'Customer Name', 'pronamic_ideal' ), + 'TRXDATE' => __( 'Transaction Date', 'pronamic_ideal' ), + 'PAYID' => __( 'Pay ID', 'pronamic_ideal' ), + 'NCERROR' => __( 'NC Error', 'pronamic_ideal' ), + 'BRAND' => __( 'Brand', 'pronamic_ideal' ), + 'IP' => __( 'IP', 'pronamic_ideal' ), + 'SHASIGN' => __( 'SHA Signature', 'pronamic_ideal' ), + ); + + $note = ''; + + $note .= '

    '; + $note .= __( 'Ogone transaction data in response message:', 'pronamic_ideal' ); + $note .= '

    '; + + $note .= '
    '; + + foreach ( $labels as $key => $label ) { + if ( isset( $data[ $key ] ) && '' !== $data[ $key ] ) { + $note .= sprintf( '
    %s
    ', esc_html( $label ) ); + $note .= sprintf( '
    %s
    ', esc_html( $data[ $key ] ) ); + } + } + + $note .= '
    '; + + $payment->add_note( $note ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Integration.php new file mode 100644 index 00000000..5e2c21e8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/Integration.php @@ -0,0 +1,68 @@ + 'ogone-orderstandard', + 'name' => 'Ingenico/Ogone - e-Commerce', + ) + ); + + parent::__construct( $args ); + } + + /** + * Get settings fields. + * + * @return array + */ + public function get_settings_fields() { + return Settings::get_settings_fields( 'standard' ); + } + + public function get_config( $post_id ) { + $mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + + $config_class = ( Gateway::MODE_TEST === $mode ) ? __NAMESPACE__ . '\TestConfig' : __NAMESPACE__ . '\Config'; + + $config = new $config_class(); + + $form_action_url = get_post_meta( $post_id, '_pronamic_gateway_ogone_form_action_url', true ); + + if ( '' !== $form_action_url ) { + $config->set_form_action_url( $form_action_url ); + } + + $config->mode = $mode; + $config->psp_id = get_post_meta( $post_id, '_pronamic_gateway_ogone_psp_id', true ); + $config->hash_algorithm = get_post_meta( $post_id, '_pronamic_gateway_ogone_hash_algorithm', true ); + $config->sha_in_pass_phrase = get_post_meta( $post_id, '_pronamic_gateway_ogone_sha_in_pass_phrase', true ); + $config->sha_out_pass_phrase = get_post_meta( $post_id, '_pronamic_gateway_ogone_sha_out_pass_phrase', true ); + $config->user_id = get_post_meta( $post_id, '_pronamic_gateway_ogone_user_id', true ); + $config->password = get_post_meta( $post_id, '_pronamic_gateway_ogone_password', true ); + $config->order_id = get_post_meta( $post_id, '_pronamic_gateway_ogone_order_id', true ); + $config->param_var = get_post_meta( $post_id, '_pronamic_gateway_ogone_param_var', true ); + $config->template_page = get_post_meta( $post_id, '_pronamic_gateway_ogone_template_page', true ); + $config->alias_enabled = get_post_meta( $post_id, '_pronamic_gateway_ogone_alias_enabled', true ); + $config->alias_usage = get_post_meta( $post_id, '_pronamic_gateway_ogone_alias_usage', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/TestConfig.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/TestConfig.php new file mode 100644 index 00000000..5900b031 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/OrderStandard/TestConfig.php @@ -0,0 +1,31 @@ +list = $list; + } + + /** + * Add payment method + * + * @param string $payment_method + */ + public function add_payment_method( $payment_method ) { + $this->list[] = $payment_method; + } + + /** + * Create a string representation of this payment methods list + * + * List of selected payment methods and/or card brands to show on the payment page. Separated by a semi-colon. + * + * @return string + */ + public function __toString() { + return implode( ';', $this->list ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/SecureDataHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/SecureDataHelper.php new file mode 100644 index 00000000..4e24eb33 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/SecureDataHelper.php @@ -0,0 +1,83 @@ +data = $data; + } + + /** + * Set 3-D Secure flag + * + * @param string $flag 3-D Secure flag. + * + * @return SecureDataHelper + */ + public function set_3d_secure_flag( $flag ) { + $this->data->set_field( 'FLAG3D', $flag ? 'Y' : 'N' ); + + return $this; + } + + /** + * Set HTTP Accept + * + * @param string $http_accept HTTP accept. + * + * @return SecureDataHelper + */ + public function set_http_accept( $http_accept ) { + $this->data->set_field( 'HTTP_ACCEPT', $http_accept ); + + return $this; + } + + /** + * Set HTTP User-Agent + * + * @param string $user_agent User agent. + * + * @return SecureDataHelper + */ + public function set_http_user_agent( $user_agent ) { + $this->data->set_field( 'HTTP_USER_AGENT', $user_agent ); + + return $this; + } + + /** + * Set window + * + * @param string $window Window. + * + * @return SecureDataHelper + */ + public function set_window( $window ) { + $this->data->set_field( 'WIN3DS', $window ); + + return $this; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Security.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Security.php new file mode 100644 index 00000000..23f6706f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Security.php @@ -0,0 +1,157 @@ + $value ) { + $value = (string) $value; + + // Use of empty will fail, value can be string '0'. + if ( strlen( $value ) > 0 ) { + $name = strtoupper( $name ); + + $string .= $name . '=' . $value . $passphrase; + } + } + + // Hash. + $result = hash( $hash_algorithm, $string ); + + // String to uppercase. + $result = strtoupper( $result ); + + return $result; + } + + /** + * Sign data. + * + * @param Data $data Data. + * @param string $pass_phrase Pass phrase. + * @param string $hash_algorithm Hashing algorithm. + */ + public static function sign_data( Data $data, $pass_phrase, $hash_algorithm ) { + $calculation_fields = self::get_calculations_parameters_in(); + + $fields = self::get_calculation_fields( $calculation_fields, $data->get_fields() ); + + $signature = self::get_signature( $fields, $pass_phrase, $hash_algorithm ); + + $data->set_field( 'SHASign', $signature ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Settings.php new file mode 100644 index 00000000..d7d5a515 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Settings.php @@ -0,0 +1,280 @@ + 'general', + 'type' => 'html', + 'html' => __( 'Account details are provided by the payment provider after registration. These settings need to match with the payment provider dashboard.', 'pronamic_ideal' ), + ); + + // PSPID. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_psp_id', + 'title' => __( 'PSPID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => __( 'PSPID as mentioned in the payment provider dashboard.', 'pronamic_ideal' ), + ); + + // API user ID. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_user_id', + 'title' => __( 'API user ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'User ID of the API user in the payment provider dashboard: Configuration » Users', 'pronamic_ideal' ), + ); + + // API user password. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_password', + 'title' => __( 'API user password', 'pronamic_ideal' ), + 'type' => 'password', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Password of the API user in the payment provider dashboard: Configuration » Users', 'pronamic_ideal' ), + ); + + if ( 'standard' === $type ) { + // SHA-IN Pass phrase. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_sha_in_pass_phrase', + 'title' => __( 'SHA-IN Pass phrase', 'pronamic_ideal' ), + 'type' => 'password', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'SHA-IN pass phrase as mentioned in the payment provider dashboard: Configuration » Technical information » Data and origin verification.', 'pronamic_ideal' ), + ); + } + + if ( 'directlink' === $type ) { + // SHA-IN Pass phrase. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_directlink_sha_in_pass_phrase', + 'title' => __( 'SHA-IN Pass phrase', 'pronamic_ideal' ), + 'type' => 'password', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'SHA-IN pass phrase as mentioned in the payment provider dashboard: Configuration » Technical information » Data and origin verification.', 'pronamic_ideal' ), + ); + } + + // SHA-OUT Pass phrase. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_sha_out_pass_phrase', + 'title' => __( 'SHA-OUT Pass phrase', 'pronamic_ideal' ), + 'type' => 'password', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'SHA-OUT pass phrase as mentioned in the payment provider dashboard: Configuration » Technical information » Transaction feedback.', 'pronamic_ideal' ), + ); + + // Hash algorithm. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_hash_algorithm', + 'title' => __( 'Hash algorithm', 'pronamic_ideal' ), + 'type' => 'optgroup', + 'tooltip' => 'Hash algorithm as mentioned in the payment provider dashboard: Configuration » Technical information', + 'options' => array( + Ingenico::SHA_1 => __( 'SHA-1', 'pronamic_ideal' ), + Ingenico::SHA_256 => __( 'SHA-256', 'pronamic_ideal' ), + Ingenico::SHA_512 => __( 'SHA-512', 'pronamic_ideal' ), + ), + 'default' => Ingenico::SHA_1, + ); + + if ( 'directlink' === $type ) { + // 3-D Secure + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_VALIDATE_BOOLEAN, + 'meta_key' => '_pronamic_gateway_ogone_3d_secure_enabled', + 'title' => __( '3-D Secure', 'pronamic_ideal' ), + 'type' => 'checkbox', + 'label' => __( 'Enable 3-D Secure protocol', 'pronamic_ideal' ), + ); + } + + /* + * Advanced settings + */ + + $fields[] = array( + 'section' => 'advanced', + 'type' => 'html', + 'html' => __( 'Optional settings for advanced usage only.', 'pronamic_ideal' ), + ); + + // Form Action URL. + if ( 'standard' === $type ) { + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_form_action_url', + 'title' => __( 'Form Action URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'With this setting you can override the default Ingenico e-Commerce form action URL to the payment processing page.', 'pronamic_ideal' ), + ); + } + + // Order ID. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_order_id', + 'title' => __( 'Order ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: ORDERID */ + __( 'The Ingenico %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'ORDERID' ) + ), + 'description' => sprintf( + '%s
    %s', + sprintf( + /* translators: %s: {order_id} {payment_id} */ + __( 'Available tags: %s', 'pronamic_ideal' ), + sprintf( '%s %s', '{order_id}', '{payment_id}' ) + ), + sprintf( + /* translators: %s: {payment_id} */ + __( 'Default: %s', 'pronamic_ideal' ), + '{payment_id}' + ) + ), + ); + + // Parameter Variable. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_param_var', + 'title' => __( 'Parameter Variable', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: PARAMVAR */ + __( 'The Ingenico %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'PARAMVAR' ) + ), + 'description' => sprintf( + /* translators: %s: {site_url} {home_url} */ + __( 'Available tags: %s', 'pronamic_ideal' ), + sprintf( '%s %s', '{site_url}', '{home_url}' ) + ), + ); + + // Alias. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_VALIDATE_BOOLEAN, + 'meta_key' => '_pronamic_gateway_ogone_alias_enabled', + 'title' => __( 'Alias', 'pronamic_ideal' ), + 'type' => 'checkbox', + 'label' => __( 'Enable alias registration', 'pronamic_ideal' ), + 'tooltip' => __( 'Enable alias creation as reference for batch payments. Requires the Alias Manager option (`REQ1`) to be enabled for the Ingenico account.', 'pronamic_ideal' ), + ); + + // Alias usage. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_alias_usage', + 'title' => __( 'Alias Usage', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: ALIASUSAGE */ + __( 'The Ingenico %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'ALIASUSAGE' ) + ), + 'description' => __( 'Description on payment page of how aliases are used.', 'pronamic_ideal' ), + ); + + // Template Page. + $fields[] = array( + 'section' => 'advanced', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_ogone_template_page', + 'title' => __( 'Template Page', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => sprintf( + /* translators: %s: TP */ + __( 'The Ingenico %s parameter.', 'pronamic_ideal' ), + sprintf( '%s', 'TP' ) + ), + ); + + /* + * Transaction feedback - Direct HTTP server-to-server request URLs + */ + $fields[] = array( + 'section' => 'feedback', + 'type' => 'html', + 'html' => __( 'The URLs below need to be copied to the payment provider dashboard to receive automatic transaction status updates.', 'pronamic_ideal' ), + ); + + // URL accepted, on hold or uncertain. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'URL accepted, on hold or uncertain', 'pronamic_ideal' ), + 'type' => 'text', + 'value' => site_url( '/' ), + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Direct HTTP server-to-server request URL for payment statuses accepted, on hold or uncertain".', 'pronamic_ideal' ), + 'readonly' => true, + ); + + // URL cancel or deny. + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'URL cancel or deny', 'pronamic_ideal' ), + 'type' => 'text', + 'value' => site_url( '/' ), + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Direct HTTP server-to-server request URL for payment statuses "cancelled by the client" or "too many rejections by the acquirer".', 'pronamic_ideal' ), + 'readonly' => true, + ); + + // Return fields. + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Statuses.php new file mode 100644 index 00000000..af2efd0f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/ogone/src/Statuses.php @@ -0,0 +1,337 @@ +order_id = Security::filter( $xml['orderID'] ); + $order_response->pay_id = Security::filter( $xml['PAYID'] ); + $order_response->nc_status = Security::filter( $xml[ Parameters::NC_STATUS ] ); + $order_response->nc_error = Security::filter( $xml[ Parameters::NC_ERROR ] ); + $order_response->nc_error_plus = Security::filter( $xml[ Parameters::NC_ERROR_PLUS ] ); + $order_response->acceptance = Security::filter( $xml['ACCEPTANCE'] ); + $order_response->status = Security::filter( $xml[ Parameters::STATUS ] ); + $order_response->eci = Security::filter( $xml['ECI'] ); + $order_response->amount = Security::filter( $xml[ Parameters::AMOUNT ] ); + $order_response->currency = Security::filter( $xml[ Parameters::CURRENCY ] ); + $order_response->pm = Security::filter( $xml['PM'] ); + $order_response->brand = Security::filter( $xml['BRAND'] ); + + if ( $xml->HTML_ANSWER ) { + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode + $order_response->html_answer = base64_decode( Security::filter( $xml->HTML_ANSWER ) ); + } + + return $order_response; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/.jshintignore b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/.jshintignore new file mode 100644 index 00000000..ce9e0a51 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/.jshintignore @@ -0,0 +1,4 @@ +build/**/* +node_modules/**/* +vendor/**/* +wordpress/**/* diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/error.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/error.json new file mode 100644 index 00000000..f1bb1efb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/error.json @@ -0,0 +1,20 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OmniKassa 2.0 error.", + "type": "object", + "required": [ + "errorCode" + ], + "properties": { + "errorCode": { + "type": ["number", "string"] + }, + "errorMessage": { + "type": "string" + }, + "consumerMessage": { + "type": "string" + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/money.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/money.json new file mode 100644 index 00000000..a8c0ec2c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/money.json @@ -0,0 +1,18 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OmniKassa 2.0 money.", + "type": "object", + "required": [ + "currency", + "amount" + ], + "properties": { + "currency": { + "type": "string" + }, + "amount": { + "type": ["number", "string"] + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/notification.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/notification.json new file mode 100644 index 00000000..129099eb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/notification.json @@ -0,0 +1,36 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OmniKassa 2.0 notification message.", + "type": "object", + "required": [ + "authentication", + "expiry", + "eventName", + "poiId", + "signature" + ], + "properties": { + "authentication": { + "type": "string", + "description": "The token that can be used to do the status pull." + }, + "expiry": { + "type": "string", + "format": "date-time", + "description": "The validity period of the token, in the ISO-8601 format (yyyy- MM-ddTHH: mm: ss.SSSZZ)." + }, + "eventName": { + "type": "string", + "description": "The type of notification. For the time being this is always: merchant.order.status.changed." + }, + "poiId": { + "type": ["number", "string"], + "description": "Identification of the webshop (point of interaction), seen from ROK. This is relevant if several webshops use the same webhook URL." + }, + "signature": { + "type": "string", + "description": "The signature of the message, see heading signature for details.." + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-announce-response.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-announce-response.json new file mode 100644 index 00000000..096ff27a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-announce-response.json @@ -0,0 +1,20 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OmniKassa 2.0 order announce response.", + "type": "object", + "required": [ + "omnikassaOrderId", + "redirectUrl" + ], + "properties": { + "omnikassaOrderId": { + "type": "string", + "description": "The unique ID that Rabo Omnikassa assigned to this order. This ID can be later used to look up the order status that is communicated using the webhook notification mechanism." + }, + "redirectUrl": { + "type": "string", + "description": "The URL to which the browser of the consumer must be redirected to. This URL points to the payment pages of Rabo Omnikassa." + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-result.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-result.json new file mode 100644 index 00000000..0cd66e1b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-result.json @@ -0,0 +1,48 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OmniKassa 2.0 order result.", + "type": "object", + "required": [ + "merchantOrderId", + "omnikassaOrderId", + "poiId", + "orderStatus", + "orderStatusDateTime", + "errorCode", + "paidAmount" + ], + "properties": { + "merchantOrderId": { + "type": "string", + "description": "OrderId as delivered during the Order Announce." + }, + "omnikassaOrderId": { + "type": "string", + "description": "The unique id that the omnikassa has assigned to this order." + }, + "poiId": { + "type": ["number", "string"], + "description": "Unique identification of the webshop (point of interaction), seen from ROK. This is relevant if several webshops use the same webhook URL." + }, + "orderStatus": { + "type": "string", + "description": "The status of the order. See chapter 'Consumer returns at the webshop' for an overview of the possible statuses." + }, + "orderStatusDateTime": { + "type": "string", + "format": "date-time", + "description": "The moment this status is reached." + }, + "errorCode": { + "type": "string", + "description": "Future field, for now: always empty." + }, + "paidAmount": { + "$ref": "money.json" + }, + "totalAmount": { + "$ref": "money.json" + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-results.json b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-results.json new file mode 100644 index 00000000..558e183f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/json-schemas/order-results.json @@ -0,0 +1,28 @@ +{ + "$id": "https://example.com/person.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OmniKassa 2.0 order results.", + "type": "object", + "required": [ + "moreOrderResultsAvailable", + "orderResults", + "signature" + ], + "properties": { + "moreOrderResultsAvailable": { + "type": "boolean", + "description": "Indication if there are more order results available than in this message. In that case, a status pull call can be made (with the same notification token). This can be repeated until the result is false." + }, + "orderResults": { + "type": "array", + "description": "An array containing the results per order", + "items": { + "$ref": "order-result.json" + } + }, + "signature": { + "type": "string", + "description": "The signature of the message, see heading signature for details." + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Address.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Address.php new file mode 100644 index 00000000..6ecfc111 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Address.php @@ -0,0 +1,354 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Address + * + * @author Remco Tolsma + * @version 2.1.10 + * @since 2.0.2 + */ +class Address implements \JsonSerializable { + /** + * First name. + * + * @var string|null + */ + private $first_name; + + /** + * Insert or second name. + * + * @var string|null + */ + private $middle_name; + + /** + * Surname. + * + * @var string + */ + private $last_name; + + /** + * Street. + * + * Note: In case of payment via Visa, Mastercard, V PAY, + * Bancontact and Maestro the street name will be + * truncated to 50 characters. + * + * @var string + */ + private $street; + + /** + * House number. + * + * Note: In case of payment via Visa, Mastercard, V PAY, + * Bancontact and Maestro the houseNumber concatenated + * with houseNumberAddition (see below) will be + * truncated to 10 characters. + * + * @var string|null + */ + private $house_number; + + /** + * House number additions. + * + * @var string|null + */ + private $house_number_addition; + + /** + * Postal code. + * + * @var string + */ + private $postal_code; + + /** + * City. + * + * @var string + */ + private $city; + + /** + * Country code, ISO 3166-1 alpha-2. + * + * @var string + */ + private $country_code; + + /** + * Construct address. + * + * @param string $last_name Last name. + * @param string $street Street. + * @param string $postal_code Postal code. + * @param string $city City. + * @param string $country_code Country code. + * @return void + */ + public function __construct( $last_name, $street, $postal_code, $city, $country_code ) { + $this->set_last_name( $last_name ); + $this->set_street( $street ); + $this->set_postal_code( $postal_code ); + $this->set_city( $city ); + $this->set_country_code( $country_code ); + } + + /** + * Get first name. + * + * @return string|null + */ + public function get_first_name() { + return $this->first_name; + } + + /** + * Set first name. + * + * @param string|null $first_name First name. + * @return void + */ + public function set_first_name( $first_name ) { + DataHelper::validate_null_or_an( $first_name, 50, 'Address.firstName' ); + + $this->first_name = $first_name; + } + + /** + * Get middle name. + * + * @return string|null + */ + public function get_middle_name() { + return $this->middle_name; + } + + /** + * Set middle name. + * + * @param string|null $middle_name Middle name. + * @return void + */ + public function set_middle_name( $middle_name ) { + DataHelper::validate_null_or_an( $middle_name, 20, 'Address.middleName' ); + + $this->middle_name = $middle_name; + } + + /** + * Get last name. + * + * @return string + */ + public function get_last_name() { + return $this->last_name; + } + + /** + * Set last name. + * + * @param string $last_name Last name. + * @return void + */ + public function set_last_name( $last_name ) { + DataHelper::validate_an( $last_name, 50, 'Address.lastName' ); + + $this->last_name = $last_name; + } + + /** + * Get street. + * + * @return string + */ + public function get_street() { + return $this->street; + } + + /** + * Set street. + * + * @param string $street Street. + * @return void + */ + public function set_street( $street ) { + DataHelper::validate_an( $street, 100, 'Address.street' ); + + $this->street = $street; + } + + /** + * Get house number. + * + * @return string|null + */ + public function get_house_number() { + return $this->house_number; + } + + /** + * Set house number. + * + * @param string|null $house_number House number. + * @return void + */ + public function set_house_number( $house_number ) { + DataHelper::validate_null_or_an( $house_number, 100, 'Address.houseNumber' ); + + $this->house_number = $house_number; + } + + /** + * Get house number addition. + * + * @return string|null + */ + public function get_house_number_addition() { + return $this->house_number_addition; + } + + /** + * Set house number addition. + * + * @param string|null $house_number_addition House number addition. + * @return void + */ + public function set_house_number_addition( $house_number_addition ) { + DataHelper::validate_null_or_an( $house_number_addition, 6, 'Address.houseNumberAddition' ); + + $this->house_number_addition = $house_number_addition; + } + + /** + * Get postal code. + * + * @return string + */ + public function get_postal_code() { + return $this->postal_code; + } + + /** + * Set postal code. + * + * @param string $postal_code Postal code. + * @return void + */ + public function set_postal_code( $postal_code ) { + DataHelper::validate_an( $postal_code, 10, 'Address.postalCode' ); + + $this->postal_code = $postal_code; + } + + /** + * Get city. + * + * @return string + */ + public function get_city() { + return $this->city; + } + + /** + * Set city. + * + * @param string $city City. + * @return void + */ + public function set_city( $city ) { + DataHelper::validate_an( $city, 40, 'Address.city' ); + + $this->city = $city; + } + + /** + * Get country code. + * + * @return string + */ + public function get_country_code() { + return $this->country_code; + } + + /** + * Set country code. + * + * @param string $country_code Country code. + * @return void + */ + public function set_country_code( $country_code ) { + DataHelper::validate_an( $country_code, 2, 'Address.countryCode' ); + + $this->country_code = $country_code; + } + + /** + * Get JSON. + * + * @return object + */ + public function jsonSerialize() { + $object = (object) array(); + + $object->firstName = $this->first_name; + $object->middleName = $this->middle_name; + $object->lastName = $this->last_name; + $object->street = $this->street; + + if ( null !== $this->house_number ) { + $object->houseNumber = $this->house_number; + } + + if ( null !== $this->house_number_addition ) { + $object->houseNumberAddition = $this->house_number_addition; + } + + $object->postalCode = $this->postal_code; + $object->city = $this->city; + $object->countryCode = $this->country_code; + + return $object; + } + + /** + * Get signature fields. + * + * @param array $fields Fields. + * @return array + */ + public function get_signature_fields( $fields = array() ) { + $fields[] = (string) $this->first_name; + $fields[] = (string) $this->middle_name; + $fields[] = $this->last_name; + $fields[] = $this->street; + + if ( null !== $this->house_number ) { + $fields[] = $this->house_number; + } + + if ( null !== $this->house_number_addition ) { + $fields[] = $this->house_number_addition; + } + + $fields[] = $this->postal_code; + $fields[] = $this->city; + $fields[] = $this->country_code; + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/AddressTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/AddressTransformer.php new file mode 100644 index 00000000..bdc20807 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/AddressTransformer.php @@ -0,0 +1,73 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Address as PronamicAddress; + +/** + * Address transformer + * + * @author Remco Tolsma + * @version 2.1.9 + * @since 2.0.2 + */ +class AddressTransformer { + /** + * Transform Pronamic address to OmniKassa 2.0 address. + * + * @param PronamicAddress|null $pronamic_address Pronamic address to convert. + * @return Address|null + */ + public static function transform( PronamicAddress $pronamic_address = null ) { + if ( null === $pronamic_address ) { + return null; + } + + $name = $pronamic_address->get_name(); + + $last_name = null === $name ? null : $name->get_last_name(); + $street = $pronamic_address->get_street_name(); + $postal_code = $pronamic_address->get_postal_code(); + $city = $pronamic_address->get_city(); + $country_code = $pronamic_address->get_country_code(); + + // Use line 1 as street if address splitting failed, + // for example when no house number is given. + if ( null === $street ) { + $street = $pronamic_address->get_line_1(); + } + + if ( ! isset( $last_name, $street, $postal_code, $city, $country_code ) ) { + return null; + } + + // New address. + $address = new Address( $last_name, $street, $postal_code, $city, $country_code ); + + if ( null !== $name ) { + $first_name = $name->get_first_name(); + $middle_name = $name->get_middle_name(); + + if ( null !== $first_name ) { + $address->set_first_name( $first_name ); + } + + if ( null !== $middle_name ) { + $address->set_middle_name( $middle_name ); + } + } + + $address->set_house_number( $pronamic_address->get_house_number_base() ); + $address->set_house_number_addition( $pronamic_address->get_house_number_addition() ); + + return $address; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Client.php new file mode 100644 index 00000000..c354446c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Client.php @@ -0,0 +1,263 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Facades\Http; + +/** + * Client. + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 1.0.0 + */ +class Client { + /** + * URL OmniKassa API. + * + * @var string + */ + const URL_PRODUCTION = 'https://betalen.rabobank.nl/omnikassa-api/'; + + /** + * URL OmniKassa sandbox API. + * + * @var string + */ + const URL_SANDBOX = 'https://betalen.rabobank.nl/omnikassa-api-sandbox/'; + + /** + * Error + * + * @var \WP_Error + */ + private $error; + + /** + * The URL. + * + * @var string + */ + private $url; + + /** + * Refresh token. + * + * @var string + */ + private $refresh_token; + + /** + * Signing key. + * + * @var string + */ + private $signing_key; + + /** + * Error. + * + * @return \WP_Error + */ + public function get_error() { + return $this->error; + } + + /** + * Get the URL. + * + * @return string + */ + public function get_url() { + return $this->url; + } + + /** + * Set the action URL + * + * @param string $url URL. + * @return void + */ + public function set_url( $url ) { + $this->url = $url; + } + + /** + * Get refresh token. + * + * @return string + */ + public function get_refresh_token() { + return $this->refresh_token; + } + + /** + * Set refresh token. + * + * @param string $refresh_token Refresh token. + * @return void + */ + public function set_refresh_token( $refresh_token ) { + $this->refresh_token = $refresh_token; + } + + /** + * Get signing key. + * + * @return string + */ + public function get_signing_key() { + return $this->signing_key; + } + + /** + * Set signing key. + * + * @param string $signing_key Signing key. + * @return void + */ + public function set_signing_key( $signing_key ) { + $this->signing_key = $signing_key; + } + + /** + * Request URL with specified method, token. + * + * @param string $method HTTP request method. + * @param string $endpoint URL endpoint to request. + * @param string $token Authorization token. + * @param object|null $object Object. + * @return object + * @throws \Exception Throws exception when Rabobank OmniKassa 2.0 response is not what we expect. + */ + private function request( $method, $endpoint, $token, $object = null ) { + // URL. + $url = $this->get_url() . $endpoint; + + /* + * Arguments. + * + * The `timeout` argument is intentionally increased from the WordPress + * default `5` seconds to `30`. This is mainly important for AfterPay + * order announcements requests, but it can't hurt for other requests. + * It is probably better to wait a little longer for an answer than + * having timeout issues while starting a payment or requesting a + * payment status. The value can also be adjusted via the + * `pronamic_pay_omnikassa_2_request_args` filter. + */ + $args = array( + 'method' => $method, + 'headers' => array( + 'Authorization' => 'Bearer ' . $token, + ), + 'timeout' => 30, + ); + + if ( null !== $object ) { + $args['headers']['Content-Type'] = 'application/json'; + + $args['body'] = \wp_json_encode( $object ); + } + + $args = \apply_filters( 'pronamic_pay_omnikassa_2_request_args', $args ); + + /** + * Build cURL command for debug purposes. + * + * @link https://curl.haxx.se/ + */ + + // phpcs:disable SlevomatCodingStandard.Variables.UnusedVariable.UnusedVariable, VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + + $curl = ''; + + $tab = "\t"; + $eol = ' \\' . \PHP_EOL; + + $curl .= \sprintf( 'curl --request %s %s', $method, \escapeshellarg( $url ) ) . $eol; + $curl .= $tab . \sprintf( '--header %s', \escapeshellarg( 'Authorization: Bearer ' . $token ) ) . $eol; + $curl .= $tab . \sprintf( '--header %s', \escapeshellarg( 'Content-Type: application/json' ) ) . $eol; + $curl .= $tab . \sprintf( '--data %s', \escapeshellarg( \strval( \wp_json_encode( $object ) ) ) ) . $eol; + $curl .= $tab . \sprintf( + '--user-agent %s', + \escapeshellarg( 'WordPress/' . \get_bloginfo( 'version' ) . '; ' . \get_bloginfo( 'url' ) ) + ) . $eol; + $curl .= $tab . '--verbose'; + + // phpcs:enable + + // Request. + $response = Http::request( $url, $args ); + + $data = $response->json(); + + // Object. + if ( ! \is_object( $data ) ) { + throw new \Exception( + \sprintf( + 'Could not JSON decode OmniKassa 2.0 response to an object, HTTP response: "%s %s", HTTP body length: "%d".', + $response->status(), + $response->message(), + \strlen( $response->body() ) + ), + \intval( $response->status() ) + ); + } + + // Error. + if ( isset( $data->errorCode ) ) { + $error = Error::from_object( $data ); + + throw $error; + } + + // Ok. + return $data; + } + + /** + * Get access token. + * + * @return object + */ + public function get_access_token_data() { + return $this->request( 'GET', 'gatekeeper/refresh', $this->get_refresh_token() ); + } + + /** + * Order announce. + * + * @param Config $config Config. + * @param Order $order Order. + * @return OrderAnnounceResponse + */ + public function order_announce( $config, Order $order ) { + $result = $this->request( 'POST', 'order/server/api/v2/order', $config->access_token, $order ); + + return OrderAnnounceResponse::from_object( $result ); + } + + /** + * Get order results by the notification token. + * + * @param string $notification_token Notification token. + * @return OrderResults + */ + public function get_order_results( $notification_token ) { + $result = $this->request( + 'GET', + 'order/server/api/events/results/merchant.order.status.changed', + $notification_token + ); + + return OrderResults::from_object( $result ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Config.php new file mode 100644 index 00000000..9fee6547 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Config.php @@ -0,0 +1,77 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Config + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 1.0.0 + */ +class Config extends GatewayConfig { + /** + * Post ID. + * + * @var int + */ + public $post_id; + + /** + * Refresh token. + * + * @var string + */ + public $refresh_token; + + /** + * Signing key. + * + * @var string + */ + public $signing_key; + + /** + * Access token. + * + * @var string + */ + public $access_token; + + /** + * Access token valid until. + * + * @var string + */ + public $access_token_valid_until; + + /** + * Order ID. + * + * @var string + */ + public $order_id; + + /** + * Check if access token is valid. + * + * @return bool True if valid, false otherwise. + */ + public function is_access_token_valid() { + if ( empty( $this->access_token ) ) { + return false; + } + + return \strtotime( $this->access_token_valid_until ) > \time(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/CustomerInformation.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/CustomerInformation.php new file mode 100644 index 00000000..afcdc86d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/CustomerInformation.php @@ -0,0 +1,164 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use DateTimeInterface; + +/** + * Customer information. + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 2.0.2 + */ +class CustomerInformation implements \JsonSerializable { + /** + * The e-mailadress of the consumer. + * + * @var string|null + */ + private $email_address; + + /** + * The date of birth of the consumer. + * + * @var DateTimeInterface|null + */ + private $date_of_birth; + + /** + * The gender of the consumer. + * + * @var string|null + */ + private $gender; + + /** + * The initials of the consumer. + * + * @var string|null + */ + private $initials; + + /** + * The consumer's telephone number. + * + * @var string|null + */ + private $telephone_number; + + /** + * Set the e-mailadress of the consumer. + * + * @param string|null $email_address E-mailadress of the consumer. + * @return void + */ + public function set_email_address( $email_address ) { + $this->email_address = $email_address; + } + + /** + * Set date of birth. + * + * @param DateTimeInterface|null $date_of_birth Date of birth. + * @return void + */ + public function set_date_of_birth( DateTimeInterface $date_of_birth = null ) { + $this->date_of_birth = $date_of_birth; + } + + /** + * Set gender. + * + * @param string|null $gender Gender. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when gender is not null, 'F' or 'M'. + */ + public function set_gender( $gender ) { + if ( ! \in_array( $gender, array( null, 'F', 'M' ), true ) ) { + throw new \InvalidArgumentException( + \sprintf( + 'Gender "%s" must be equal to `null`, "F" or "M".', + (string) $gender + ) + ); + } + + $this->gender = $gender; + } + + /** + * Set initials. + * + * @param string|null $initials Initials. + * @return void + */ + public function set_initials( $initials ) { + $this->initials = $initials; + } + + /** + * Set telephone number. + * + * @param string|null $telephone_number Telephone number. + * @return void + */ + public function set_telephone_number( $telephone_number ) { + $this->telephone_number = $telephone_number; + } + + /** + * Get JSON. + * + * @return object + */ + public function jsonSerialize() { + $object = (object) array(); + + if ( null !== $this->email_address ) { + $object->emailAddress = $this->email_address; + } + + if ( null !== $this->date_of_birth ) { + $object->dateOfBirth = $this->date_of_birth->format( 'd-m-Y' ); + } + + if ( null !== $this->gender ) { + $object->gender = $this->gender; + } + + if ( null !== $this->initials ) { + $object->initials = $this->initials; + } + + if ( null !== $this->telephone_number ) { + $object->telephoneNumber = $this->telephone_number; + } + + return $object; + } + + /** + * Get signature fields. + * + * @param array $fields Fields. + * @return array + */ + public function get_signature_fields( $fields = array() ) { + $fields[] = (string) $this->email_address; + $fields[] = ( null === $this->date_of_birth ) ? '' : $this->date_of_birth->format( 'd-m-Y' ); + $fields[] = (string) $this->gender; + $fields[] = (string) $this->initials; + $fields[] = (string) $this->telephone_number; + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/DataHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/DataHelper.php new file mode 100644 index 00000000..75989818 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/DataHelper.php @@ -0,0 +1,156 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Data helper + * + * @link https://github.com/wp-pay-gateways/ideal-basic/blob/2.0.0/src/DataHelper.php + * @author Remco Tolsma + * @version 2.1.9 + * @since 2.0.2 + */ +class DataHelper { + /** + * Strictly alphanumerical (letters and numbers only). + * + * The OmniKassa 2.0 document is not very clear about spaces, these are not allowd in AN (Strictly). + * If a space is used in a AN (Strictly) field this will result in for examploe the following error: + * `merchantOrderId should only contain alphanumeric characters`. + * + * @var array + */ + private static $characters_ans = array( 'A-Z', 'a-z', '0-9' ); + + /** + * Validate AN..$max. + * + * @param string $value Value to validate. + * @param int $max Max length of value. + * @param string $field Field name. + * @return true + * @throws \InvalidArgumentException Throws invalid argument exception when string is longer then max length. + */ + public static function validate_an( $value, $max, $field ) { + if ( \mb_strlen( $value, 'UTF-8' ) > $max ) { + throw new \InvalidArgumentException( + \sprintf( + 'Field `%s` value "%s" can not be longer then `%d`.', + $field, + $value, + $max + ) + ); + } + + /** + * HTML tags are not allowed. + * + * @link https://stackoverflow.com/questions/5732758/detect-html-tags-in-a-string + */ + + // phpcs:ignore WordPress.WP.AlternativeFunctions.strip_tags_strip_tags -- We don't want the `trim` in `wp_strip_all_tags`. + if ( \strip_tags( $value ) !== $value ) { + throw new \InvalidArgumentException( + \sprintf( + 'Field `%s` cannot contain HTML tags: `%s`.', + $field, + $value + ) + ); + } + + return true; + } + + /** + * Validate AN(Strictly)..Max nn. + * + * @param string $value Value to validate. + * @param int $max Max length of value. + * @param string $field Field name. + * @return true + * @throws \InvalidArgumentException Throws invalid argument exception when string is not alphanumeric characters. + * @throws \Exception Throws exception when PCRE regex execution results in error. + */ + public static function validate_ans( $value, $max, $field ) { + $pattern = '#[^' . \implode( self::$characters_ans ) . ']#'; + + $result = \preg_match( $pattern, $value ); + + if ( false === $result ) { + throw new \Exception( + 'PCRE regex execution error.', + \preg_last_error() + ); + } + + if ( 1 === $result ) { + throw new \InvalidArgumentException( + \sprintf( + 'Field `%s` must consists strictly of alphanumeric characters: `%s`.', + $field, + $value + ) + ); + } + + return self::validate_an( $value, $max, $field ); + } + + /** + * Validate null or AN..$max. + * + * @param string|null $value Value to validate. + * @param int $max Max length of value. + * @param string $field Field name. + * @return true + * @throws \InvalidArgumentException Throws invalid argument exception when value is not null and longer then max + * length. + */ + public static function validate_null_or_an( $value, $max, $field ) { + if ( null === $value ) { + return true; + } + + return self::validate_an( $value, $max, $field ); + } + + /** + * Sanitize string to the specified length. + * + * @param string $string String. + * @param int $length Length. + * @return string + */ + public static function sanitize_an( $string, $length ) { + /** + * HTML tags are not allowed. + * + * @link https://stackoverflow.com/questions/5732758/detect-html-tags-in-a-string + */ + + // phpcs:ignore WordPress.WP.AlternativeFunctions.strip_tags_strip_tags -- We don't want the `trim` in `wp_strip_all_tags`. + $sanitized = \strip_tags( $string ); + + /** + * In version `2.1.6` of this library we used the `mb_strimwidth` + * function, unfortunately this function is not alwys available. + * Therefor we now use the `mb_substr`, WordPress is shipped + * with a compat function. + * + * @link https://github.com/WordPress/WordPress/blob/5.0/wp-includes/compat.php#L44-L217 + */ + $sanitized = \mb_substr( $sanitized, 0, $length ); + + return $sanitized; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Error.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Error.php new file mode 100644 index 00000000..e505e068 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Error.php @@ -0,0 +1,161 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Error + * + * @author Remco Tolsma + * @version 2.1.10 + * @since 2.0.2 + */ +class Error extends \Exception { + /** + * Error code. + * + * @var int + */ + private $error_code; + + /** + * Error message. + * + * @var string|null + */ + private $error_message; + + /** + * Consumer message. + * + * @var string|null + */ + private $consumer_message; + + /** + * Construct error. + * + * @param int $error_code Error code. + * @param string $message Consumer or error message. + */ + public function __construct( $error_code, $message ) { + parent::__construct( $message, $error_code ); + + $this->error_code = $error_code; + } + + /** + * Get error code. + * + * @return int + */ + public function get_error_code() { + return $this->error_code; + } + + /** + * Get error message. + * + * @return string|null + */ + public function get_error_message() { + return $this->error_message; + } + + /** + * Set error message. + * + * @param string|null $error_message Error message. + * @return void + */ + public function set_error_message( $error_message ) { + $this->error_message = $error_message; + } + + /** + * Get consumer message. + * + * @return string|null + */ + public function get_consumer_message() { + return $this->consumer_message; + } + + /** + * Set consumer message. + * + * @param string|null $consumer_message Consumer message. + * @return void + */ + public function set_consumer_message( $consumer_message ) { + $this->consumer_message = $consumer_message; + } + + /** + * Create error from object. + * + * @param object $object Object. + * @return Error + * @throws \InvalidArgumentException Throws invalid argument exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + if ( ! isset( $object->errorCode ) ) { + throw new \InvalidArgumentException( 'Object must contain `errorCode` property.' ); + } + + $error_code = $object->errorCode; + $error_message = null; + $consumer_message = null; + + $message = \strval( $error_code ); + + if ( isset( $object->errorMessage ) ) { + $error_message = $object->errorMessage; + + $message = $error_message; + } + + if ( isset( $object->consumerMessage ) ) { + $consumer_message = $object->consumerMessage; + + $message = $consumer_message; + } + + $error = new self( $error_code, $message ); + + $error->set_error_message( $error_message ); + $error->set_consumer_message( $consumer_message ); + + return $error; + } + + /** + * Create error from JSON string. + * + * @param string $json JSON string. + * @return Error + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $data = \json_decode( $json ); + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $data, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/error.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php new file mode 100644 index 00000000..a6fb40fc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Gateway.php @@ -0,0 +1,382 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Gateway + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 1.0.0 + */ +class Gateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + private $client; + + /** + * Constructs and initializes an OmniKassa 2.0 gateway. + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'webhook_log', + ); + + // Client. + $this->client = new Client(); + + $url = Client::URL_PRODUCTION; + + if ( self::MODE_TEST === $config->mode ) { + $url = Client::URL_SANDBOX; + } + + $this->client->set_url( $url ); + $this->client->set_refresh_token( $config->refresh_token ); + $this->client->set_signing_key( $config->signing_key ); + } + + /** + * Get supported payment methods. + * + * @see \Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + * @return array + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::AFTERPAY, + PaymentMethods::BANCONTACT, + PaymentMethods::CREDIT_CARD, + PaymentMethods::IDEAL, + PaymentMethods::MAESTRO, + PaymentMethods::PAYPAL, + ); + } + + /** + * Start. + * + * @param Payment $payment Payment. + * @return void + * @throws \Exception Throws exception when payment could not start at Rabobank OmniKassa 2.0. + * @see Core_Gateway::start() + */ + public function start( Payment $payment ) { + // Merchant order ID. + $merchant_order_id = $payment->format_string( $this->config->order_id ); + + $payment->set_meta( 'omnikassa_2_merchant_order_id', $merchant_order_id ); + + // New order. + $merchant_return_url = $payment->get_return_url(); + $merchant_return_url = \apply_filters( 'pronamic_pay_omnikassa_2_merchant_return_url', $merchant_return_url ); + + $order = new Order( + $merchant_order_id, + MoneyTransformer::transform( $payment->get_total_amount() ), + $merchant_return_url + ); + + // Shipping address. + $order->set_shipping_detail( AddressTransformer::transform( $payment->get_shipping_address() ) ); + + // Billing address. + $order->set_billing_detail( AddressTransformer::transform( $payment->get_billing_address() ) ); + + // Customer information. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + // Language. + $language = $customer->get_language(); + + if ( null !== $language ) { + $order->set_language( \strtoupper( $language ) ); + } + + // Customer information. + $customer_information = new CustomerInformation(); + + $customer_information->set_email_address( $customer->get_email() ); + $customer_information->set_date_of_birth( $customer->get_birth_date() ); + $customer_information->set_gender( Gender::transform( $customer->get_gender() ) ); + $customer_information->set_telephone_number( $customer->get_phone() ); + + $name = $customer->get_name(); + + if ( null !== $name ) { + $customer_information->set_initials( $name->get_initials() ); + } + + $order->set_customer_information( $customer_information ); + } + + // Payment brand. + $payment_brand = PaymentBrands::transform( $payment->get_method() ); + + $order->set_payment_brand( $payment_brand ); + + if ( null !== $payment_brand ) { + // Payment brand force should only be set if payment brand is not empty. + $order->set_payment_brand_force( PaymentBrandForce::FORCE_ONCE ); + } + + // Description. + $description = $payment->get_description(); + + if ( null !== $description ) { + $order->set_description( DataHelper::sanitize_an( $description, 35 ) ); + } + + // Lines. + $lines = $payment->get_lines(); + + if ( null !== $lines ) { + $order_items = $order->new_items(); + + $i = 1; + + foreach ( $lines as $line ) { + $name = \sprintf( + /* translators: %s: item index */ + \__( 'Item %s', 'pronamic_ideal' ), + $i++ + ); + + $line_name = $line->get_name(); + + if ( null !== $line_name && '' !== $line_name ) { + $name = $line_name; + } + + $unit_price = $line->get_unit_price(); + + if ( null === $unit_price ) { + $unit_price = new TaxedMoney(); + } + + $item = $order_items->new_item( + DataHelper::sanitize_an( $name, 50 ), + (int) $line->get_quantity(), + // The amount in cents, including VAT, of the item each, see below for more details. + MoneyTransformer::transform( $unit_price ), + ProductCategories::transform( $line->get_type() ) + ); + + $item->set_id( $line->get_id() ); + + // Description. + $description = $line->get_description(); + + if ( empty( $description ) && PaymentBrands::AFTERPAY === $payment_brand ) { + /* + * The `OrderItem.description` field is documentated as `0..1` (optional), + * but for AfterPay payments it is required. + * + * @link https://github.com/wp-pay-gateways/omnikassa-2/tree/feature/post-pay/documentation#error-5024 + */ + $description = $name; + } + + if ( null !== $description ) { + $description = DataHelper::sanitize_an( $description, 100 ); + } + + $item->set_description( $description ); + + $tax_amount = $unit_price->get_tax_amount(); + + if ( null !== $tax_amount ) { + // The VAT of the item each, see below for more details. + $item->set_tax( MoneyTransformer::transform( $tax_amount ) ); + } + } + } + + // Maybe update access token. + $this->maybe_update_access_token(); + + // Announce order. + $response = $this->client->order_announce( $this->config, $order ); + + $payment->set_transaction_id( $response->get_omnikassa_order_id() ); + $payment->set_action_url( $response->get_redirect_url() ); + } + + /** + * Update status of the specified payment. + * + * @param Payment $payment Payment. + * @return void + */ + public function update_status( Payment $payment ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, SlevomatCodingStandard.Variables.DisallowSuperGlobalVariable.DisallowedSuperGlobalVariable + if ( ! ReturnParameters::contains( $_GET ) ) { + return; + } + + // phpcs:ignore WordPress.Security.NonceVerification.Recommended, SlevomatCodingStandard.Variables.DisallowSuperGlobalVariable.DisallowedSuperGlobalVariable + $parameters = ReturnParameters::from_array( $_GET ); + + // Note. + $note_values = array( + 'order_id' => $parameters->get_order_id(), + 'status' => $parameters->get_status(), + 'signature' => (string) $parameters->get_signature(), + 'valid' => $parameters->is_valid( $this->config->signing_key ) ? 'true' : 'false', + ); + + $note = ''; + + $note .= '

    '; + $note .= \__( 'OmniKassa 2.0 return URL requested:', 'pronamic_ideal' ); + $note .= '

    '; + + $note .= '
    '; + + foreach ( $note_values as $key => $value ) { + $note .= \sprintf( '
    %s
    ', \esc_html( $key ) ); + $note .= \sprintf( '
    %s
    ', \esc_html( $value ) ); + } + + $note .= '
    '; + + $payment->add_note( $note ); + + // Validate. + if ( ! $parameters->is_valid( $this->config->signing_key ) ) { + return; + } + + // Status. + $pronamic_status = Statuses::transform( $parameters->get_status() ); + + if ( null !== $pronamic_status ) { + $payment->set_status( $pronamic_status ); + } + } + + /** + * Handle notification. + * + * @param Notification $notification Notification. + * @return void + */ + public function handle_notification( Notification $notification ) { + if ( ! $notification->is_valid( $this->config->signing_key ) ) { + return; + } + + switch ( $notification->get_event_name() ) { + case 'merchant.order.status.changed': + $this->handle_merchant_order_status_changed( $notification ); + } + } + + /** + * Handle `merchant.order.status.changed` event. + * + * @param Notification $notification Notification. + * @return void + */ + private function handle_merchant_order_status_changed( Notification $notification ) { + do { + // Catch (authorization) errors. + try { + $order_results = $this->client->get_order_results( $notification->get_authentication() ); + } catch ( \Exception $e ) { + return; + } + + if ( ! $order_results->is_valid( $this->config->signing_key ) ) { + return; + } + + foreach ( $order_results as $order_result ) { + $pronamic_status = Statuses::transform( $order_result->get_order_status() ); + + $payment = \get_pronamic_payment_by_transaction_id( $order_result->get_omnikassa_order_id() ); + + // Log webhook request. + \do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + if ( empty( $payment ) ) { + continue; + } + + if ( null !== $pronamic_status ) { + $payment->set_status( $pronamic_status ); + } + + // Note. + $note = \sprintf( + '

    %s

    %s
    ', + \__( 'OmniKassa 2.0 webhook URL requested:', 'pronamic_ideal' ), + (string) \wp_json_encode( $order_result, \JSON_PRETTY_PRINT ) + ); + + $payment->add_note( $note ); + + $payment->save(); + } + } while ( $order_results->more_available() ); + } + + /** + * Maybe update access token. + * + * @return void + */ + private function maybe_update_access_token() { + if ( $this->config->is_access_token_valid() ) { + return; + } + + $data = $this->client->get_access_token_data(); + + if ( isset( $data->token ) ) { + $this->config->access_token = $data->token; + + \update_post_meta( $this->config->post_id, '_pronamic_gateway_omnikassa_2_access_token', $data->token ); + } + + /* + * @codingStandardsIgnoreStart + * + * Ignore coding standards because of sniff WordPress.NamingConventions.ValidVariableName.NotSnakeCaseMemberVar + */ + if ( isset( $data->validUntil ) ) { + $this->config->access_token_valid_until = $data->validUntil; + + \update_post_meta( + $this->config->post_id, + '_pronamic_gateway_omnikassa_2_access_token_valid_until', + $data->validUntil + ); + } + // @codingStandardsIgnoreEnd + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Gender.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Gender.php new file mode 100644 index 00000000..4fb11078 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Gender.php @@ -0,0 +1,54 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Gender as Core_Gender; + +/** + * Gender. + * + * @author Remco Tolsma + * @since 2.1.0 + * @version 2.0.4 + */ +class Gender { + /** + * Female. + * + * @var string + */ + const FEMALE = 'F'; + + /** + * Male. + * + * @var string + */ + const MALE = 'M'; + + /** + * Transform WordPress pay gender to OmniKassa gender. + * + * @param string|null $gender WordPress pay gender. + * @return string|null + */ + public static function transform( $gender ) { + switch ( $gender ) { + case Core_Gender::FEMALE: + return self::FEMALE; + case Core_Gender::MALE: + return self::MALE; + case Core_Gender::OTHER: + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Integration.php new file mode 100644 index 00000000..508e48bd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Integration.php @@ -0,0 +1,301 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; + +/** + * Integration + * + * @author Remco Tolsma + * @version 2.3.0 + * @since 1.0.0 + */ +class Integration extends AbstractGatewayIntegration { + /** + * REST route namespace. + * + * @var string + */ + const REST_ROUTE_NAMESPACE = 'pronamic-pay/omnikassa-2/v1'; + + /** + * Construct OmniKassa 2.0 integration. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = \wp_parse_args( + $args, + array( + 'id' => 'rabobank-omnikassa-2', + 'name' => 'Rabobank - OmniKassa 2.0', + 'product_url' => 'https://www.rabobank.nl/bedrijven/betalen/geld-ontvangen/rabo-omnikassa/', + 'dashboard_url' => 'https://bankieren.rabobank.nl/omnikassa-dashboard/', + 'provider' => 'rabobank', + 'supports' => array( + 'webhook', + 'webhook_log', + ), + 'manual_url' => \__( + 'https://www.pronamic.eu/support/how-to-connect-rabo-omnikassa-2-0-with-wordpress-via-pronamic-pay/', + 'pronamic_ideal' + ), + ) + ); + + parent::__construct( $args ); + + /** + * Save post. + * + * @link https://github.com/WordPress/WordPress/blob/5.0/wp-includes/post.php#L3724-L3736 + * @var callable $delete_access_token_meta_function + */ + $delete_access_token_meta_function = array( $this, 'delete_access_token_meta' ); + + if ( ! \has_action( 'save_post_pronamic_gateway', $delete_access_token_meta_function ) ) { + \add_action( 'save_post_pronamic_gateway', $delete_access_token_meta_function ); + } + + /** + * Admin notices. + * + * @link https://github.com/WordPress/WordPress/blob/5.0/wp-admin/admin-header.php#L259-L264 + * @var callable $admin_notices_function + */ + $admin_notices_function = array( $this, 'admin_notice_tld_test' ); + + if ( ! \has_action( 'admin_notices', $admin_notices_function ) ) { + \add_action( 'admin_notices', $admin_notices_function ); + } + } + + /** + * Setup gateway integration. + * + * @return void + */ + public function setup() { + // Check if dependencies are met and integration is active. + if ( ! $this->is_active() ) { + return; + } + + // Webhook controller. + $webhook_controller = new WebhookController(); + + $webhook_controller->setup(); + } + + /** + * Admin notice TLD .test. + * + * @link https://github.com/WordPress/WordPress/blob/5.0/wp-admin/admin-header.php#L259-L264 + * @link https://developer.wordpress.org/reference/hooks/admin_notices/ + * @link https://developer.wordpress.org/reference/functions/get_current_screen/ + * @return void + */ + public function admin_notice_tld_test() { + if ( \has_filter( 'pronamic_pay_omnikassa_2_merchant_return_url' ) ) { + return; + } + + $screen = \get_current_screen(); + + if ( null === $screen ) { + return; + } + + if ( 'pronamic_gateway' !== $screen->id ) { + return; + } + + $host = \wp_parse_url( \home_url( '/' ), \PHP_URL_HOST ); + + if ( \is_array( $host ) ) { + return; + } + + if ( '.test' !== \substr( $host, -5 ) ) { + return; + } + + $post_id = \get_the_ID(); + + if ( empty( $post_id ) ) { + return; + } + + $gateway_id = \get_post_meta( $post_id, '_pronamic_gateway_id', true ); + + if ( 'rabobank-omnikassa-2' !== $gateway_id ) { + return; + } + + $class = 'notice notice-error'; + $message = \sprintf( + /* translators: 1: Pronamic Pay, 2: Documentation link, 3: .test */ + \__( + '%1$s — OmniKassa 2 does not accept payments from %3$s environments.', + 'pronamic_ideal' + ), + \sprintf( + '%s', + \__( 'Pronamic Pay', 'pronamic_ideal' ) + ), + 'https://github.com/wp-pay-gateways/omnikassa-2/tree/develop/documentation#merchantreturnurl-is-not-a-valid-web-address', + '.test' + ); + + \printf( + '

    %2$s

    ', + \esc_attr( $class ), + \wp_kses( + $message, + array( + 'a' => array( + 'href' => true, + ), + 'code' => array(), + 'strong' => array(), + ) + ) + ); + } + + /** + * Get settings fields. + * + * @return array>> + */ + public function get_settings_fields() { + $fields = array(); + + // Refresh Token. + $fields[] = array( + 'section' => 'general', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_omnikassa_2_refresh_token', + 'title' => \_x( 'Refresh Token', 'omnikassa', 'pronamic_ideal' ), + 'type' => 'textarea', + 'classes' => array( 'code' ), + ); + + // Signing Key. + $fields[] = array( + 'section' => 'general', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_omnikassa_2_signing_key', + 'title' => \_x( 'Signing Key', 'omnikassa', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + ); + + // Purchase ID. + $code_field = \sprintf( '%s', 'merchantOrderId' ); + + $fields[] = array( + 'section' => 'advanced', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_omnikassa_2_order_id', + 'title' => \__( 'Order ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => \sprintf( + /* translators: %s: merchantOrderId */ + \__( 'This setting defines the OmniKassa 2.0 %s field.', 'pronamic_ideal' ), + $code_field + ), + 'description' => \sprintf( + '%s
    %s %s
    %s', + \sprintf( + /* translators: %s: merchantOrderId */ + \__( + 'The OmniKassa 2.0 %s field must consist strictly of 24 alphanumeric characters, other characters, such as ".", "@", " " (space), etc. are not allowed.', + 'pronamic_ideal' + ), + $code_field + ), + \__( 'Available tags:', 'pronamic_ideal' ), + \sprintf( + '%s %s', + '{order_id}', + '{payment_id}' + ), + \sprintf( + /* translators: %s: default code */ + \__( 'Default: %s', 'pronamic_ideal' ), + '{payment_id}' + ) + ), + ); + + // Webhook. + $fields[] = array( + 'section' => 'feedback', + 'title' => \__( 'Webhook URL', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'large-text', 'code' ), + 'value' => \rest_url( self::REST_ROUTE_NAMESPACE . '/webhook' ), + 'readonly' => true, + 'tooltip' => \__( + 'The Webhook URL as sent with each transaction to receive automatic payment status updates on.', + 'pronamic_ideal' + ), + ); + + return $fields; + } + + /** + * Get configuration by post ID. + * + * @param int $post_id Post ID. + * @return Config + */ + public function get_config( $post_id ) { + $config = new Config(); + + $config->post_id = \intval( $post_id ); + $config->mode = $this->get_meta( $post_id, 'mode' ); + $config->refresh_token = $this->get_meta( $post_id, 'omnikassa_2_refresh_token' ); + $config->signing_key = $this->get_meta( $post_id, 'omnikassa_2_signing_key' ); + $config->access_token = $this->get_meta( $post_id, 'omnikassa_2_access_token' ); + $config->access_token_valid_until = $this->get_meta( $post_id, 'omnikassa_2_access_token_valid_until' ); + $config->order_id = $this->get_meta( $post_id, 'omnikassa_2_order_id' ); + + return $config; + } + + /** + * Delete access token meta for the specified post ID. + * + * @link https://github.com/WordPress/WordPress/blob/5.0/wp-includes/post.php#L3724-L3736 + * @link https://codex.wordpress.org/Function_Reference/delete_post_meta + * @param int $post_id Post ID. + * @return void + */ + public static function delete_access_token_meta( $post_id ) { + \delete_post_meta( $post_id, '_pronamic_gateway_omnikassa_2_access_token' ); + \delete_post_meta( $post_id, '_pronamic_gateway_omnikassa_2_access_token_valid_until' ); + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Message.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Message.php new file mode 100644 index 00000000..d19c67e5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Message.php @@ -0,0 +1,80 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Message + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 2.0.2 + */ +abstract class Message implements Signable { + /** + * Signature. + * + * @var string|null + */ + private $signature; + + /** + * Get signature. + * + * @return string|null + */ + public function get_signature() { + return $this->signature; + } + + /** + * Set signature. + * + * @param string|null $signature Signature. + * @return void + */ + protected function set_signature( $signature ) { + $this->signature = $signature; + } + + /** + * Sign this message with specified signing key. + * + * @param string $signing_key Signing key. + * @return void + */ + public function sign( $signing_key ) { + $signature = Security::get_signature( $this, $signing_key ); + + $this->set_signature( $signature ); + } + + /** + * Check if this message is valid. + * + * @param string $signing_key Signing key. + * @return bool True if valid, false otherwise. + */ + public function is_valid( $signing_key ) { + $signature_a = Security::get_signature( $this, $signing_key ); + + if ( empty( $signature_a ) ) { + return false; + } + + $signature_b = $this->get_signature(); + + if ( empty( $signature_b ) ) { + return false; + } + + return Security::validate_signature( $signature_a, $signature_b ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Money.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Money.php new file mode 100644 index 00000000..4ef9f1fd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Money.php @@ -0,0 +1,130 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Money + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 2.0.2 + */ +class Money implements \JsonSerializable { + /** + * Currency. + * + * @var string + */ + private $currency; + + /** + * Amount. + * + * @var int + */ + private $amount; + + /** + * Construct Money. + * + * @param string $currency Currency. + * @param int $amount Amount in cents. + */ + public function __construct( $currency, $amount ) { + $this->currency = $currency; + $this->amount = $amount; + } + + /** + * Get currency. + * + * @return string + */ + public function get_currency() { + return $this->currency; + } + + /** + * Get amount. + * + * @return int + */ + public function get_amount() { + return $this->amount; + } + + /** + * Get JSON. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'currency' => $this->get_currency(), + 'amount' => $this->get_amount(), + ); + } + + /** + * Create money from object. + * + * @param \stdClass $object Object. + * @return Money + * @throws \InvalidArgumentException Throws invalid argument exception when object does not contains the required properties. + */ + public static function from_object( \stdClass $object ) { + if ( ! isset( $object->currency ) ) { + throw new \InvalidArgumentException( 'Object must contain `currency` property.' ); + } + + if ( ! isset( $object->amount ) ) { + throw new \InvalidArgumentException( 'Object must contain `amount` property.' ); + } + + return new self( $object->currency, $object->amount ); + } + + /** + * Create money from JSON string. + * + * @param string $json JSON string. + * @return Money + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $data = \json_decode( $json ); + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $data, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/json-schema-money.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $data ); + } + + /** + * Get signature fields. + * + * @param array $fields Fields. + * @return array + */ + public function get_signature_fields( $fields = array() ) { + $fields[] = $this->get_currency(); + $fields[] = \strval( $this->get_amount() ); + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/MoneyTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/MoneyTransformer.php new file mode 100644 index 00000000..93334df3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/MoneyTransformer.php @@ -0,0 +1,46 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Money\Money as PronamicMoney; + +/** + * Money transformer + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 2.0.2 + */ +class MoneyTransformer { + /** + * Transform Pronamic money to OmniKassa 2.0 money. + * + * @param PronamicMoney $pronamic_money Pronamic money to convert. + * @return Money + * @throws \InvalidArgumentException Throws exception on invalid alphabetic currency code in given Pronamic money object. + */ + public static function transform( PronamicMoney $pronamic_money ) { + $alphabetic_code = $pronamic_money->get_currency()->get_alphabetic_code(); + + if ( null === $alphabetic_code ) { + throw new \InvalidArgumentException( + 'Alphabetic currency code is required to transform Pronamic money to OmniKassa 2.0 amount object.' + ); + } + + $money = new Money( + \strval( $alphabetic_code ), + \intval( $pronamic_money->get_minor_units() ) + ); + + return $money; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Notification.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Notification.php new file mode 100644 index 00000000..cb02aff8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Notification.php @@ -0,0 +1,193 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Notification + * + * @author Remco Tolsma + * @version 2.1.10 + * @since 2.0.2 + */ +class Notification extends ResponseMessage { + /** + * The token that can be used to do the status pull. + * + * @var string + */ + private $authentication; + + /** + * The validity period of the token, in the ISO-8601 format (yyyy- MM-ddTHH: mm: ss.SSSZZ). + * + * @var string + */ + private $expiry; + + /** + * The type of notification. For the time being this is always: `merchant.order.status.changed`. + * + * @var string + */ + private $event_name; + + /** + * Identification of the webshop (point of interaction), seen from ROK. This is relevant if several webshops + * use the same webhook URL. + * + * @var int|string + */ + private $poi_id; + + /** + * Construct notification message. + * + * @param string $authentication Authentication. + * @param string $expiry Expiry. + * @param string $event_name Event name. + * @param int|string $poi_id POI ID. + * @param string $signature Signature. + */ + public function __construct( $authentication, $expiry, $event_name, $poi_id, $signature ) { + parent::__construct( $signature ); + + $this->authentication = $authentication; + $this->expiry = $expiry; + $this->event_name = $event_name; + $this->poi_id = $poi_id; + } + + /** + * Get authentication. + * + * @return string + */ + public function get_authentication() { + return $this->authentication; + } + + /** + * Get expiry. + * + * @return string + */ + public function get_expiry() { + return $this->expiry; + } + + /** + * Check if this notice (authentication token) is expired. + * + * @return bool True if notice authentication token is epxired, false otherwise. + */ + public function is_expired() { + $timestamp = \strtotime( $this->get_expiry() ); + + if ( false === $timestamp ) { + return true; + } + + return $timestamp > \time(); + } + + /** + * Get event name. + * + * @return string + */ + public function get_event_name() { + return $this->event_name; + } + + /** + * Get point of interaction ID. + * + * @return int|string + */ + public function get_poi_id() { + return $this->poi_id; + } + + /** + * Get signature fields. + * + * @return array + */ + public function get_signature_fields() { + return array( + $this->get_authentication(), + $this->get_expiry(), + $this->get_event_name(), + \strval( $this->get_poi_id() ), + ); + } + + /** + * Create notification from object. + * + * @param \stdClass $object Object. + * @return Notification + * @throws \InvalidArgumentException Throws invalid argument exception when object does not contains the required + * properties. + */ + public static function from_object( \stdClass $object ) { + if ( ! isset( $object->signature ) ) { + throw new \InvalidArgumentException( 'Object must contain `signature` property.' ); + } + + if ( ! isset( $object->authentication ) ) { + throw new \InvalidArgumentException( 'Object must contain `authentication` property.' ); + } + + if ( ! isset( $object->expiry ) ) { + throw new \InvalidArgumentException( 'Object must contain `expiry` property.' ); + } + + if ( ! isset( $object->eventName ) ) { + throw new \InvalidArgumentException( 'Object must contain `eventName` property.' ); + } + + if ( ! isset( $object->poiId ) ) { + throw new \InvalidArgumentException( 'Object must contain `poiId` property.' ); + } + + return new self( + $object->authentication, + $object->expiry, + $object->eventName, + $object->poiId, + $object->signature + ); + } + + /** + * Create notification from JSON string. + * + * @param string $json JSON string. + * @return Notification + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $data = \json_decode( $json ); + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $data, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/notification.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Order.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Order.php new file mode 100644 index 00000000..6d7bb508 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Order.php @@ -0,0 +1,419 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use DateTime; + +/** + * Order + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 1.0.0 + */ +class Order extends Message implements \JsonSerializable { + /** + * ISO 8601 standard Date / time on which the order is announced at ROK. + * As a rule, this is the current date / time. + * + * This field is mandatory and provides protection against so-called + * replay (playback) attacks + * + * @var DateTime + */ + private $timestamp; + + /** + * Generated by Merchant. If your webshop wants to use AfterPay, this field must be unique. + * + * @var string + */ + private $merchant_order_id; + + /** + * Description of the order. + * + * @var string|null + */ + private $description; + + /** + * The order items. + * + * @var OrderItems|null + */ + private $order_items; + + /** + * Amount. + * + * @var Money + */ + private $amount; + + /** + * The shipping address. + * + * @var Address|null + */ + private $shipping_detail; + + /** + * The billing address. + * + * @var Address|null + */ + private $billing_detail; + + /** + * The customer information. + * + * @var CustomerInformation|null + */ + private $customer_information; + + /** + * Language. + * + * ISO 639-1 standard. Not Case sensitive. + * + * @var string|null + */ + private $language; + + /** + * Merchant return URL. + * + * The URL to which the consumer's browser will be sent after the payment. + * + * @var string + */ + private $merchant_return_url; + + /** + * Payment brand. + * + * This field is optional and is used to enforce a specific + * payment method with the consumer instead of the consumer + * selecting a payment method on the payment method selection + * page. + * + * Valid values are: + * • IDEAL + * • AFTERPAY + * • PAYPAL + * • MASTERCARD + * • VISA + * • BANCONTACT + * • MAESTRO + * • V_PAY + * • CARDS + * + * The CARDS value ensures that the consumer can choose + * between payment methods: MASTERCARD, VISA, BANCONTACT, + * MAESTRO and V_PAY + * + * @var string|null + */ + private $payment_brand; + + /** + * Payment brand force. + * + * This field should only be delivered if the paymentBrand field (see + * above) is also specified. This field can be used to send or, after + * a failed payment, the consumer can or can not select another payment + * method to still pay the payment. + * + * Valid values are: + * • FORCE_ONCE + * • FORCE_ALWAYS + * + * In the case of FORCE_ONCE, the indicated paymentBrand is only + * enforced on the first transaction. If this fails, the consumer + * can still choose another payment method. When FORCE_ALWAYS is + * chosen, the consumer can not choose another payment method. + * + * @var string|null + */ + private $payment_brand_force; + + /** + * Construct order. + * + * @param string $merchant_order_id Merchant order ID. + * @param Money $amount Amount. + * @param string $merchant_return_url Merchant return URL. + * @return void + */ + public function __construct( $merchant_order_id, $amount, $merchant_return_url ) { + $this->set_timestamp( new DateTime() ); + $this->set_merchant_order_id( $merchant_order_id ); + $this->set_amount( $amount ); + $this->set_merchant_return_url( $merchant_return_url ); + } + + /** + * Set timestamp. + * + * @param DateTime $timestamp Timestamp. + * @return void + */ + public function set_timestamp( DateTime $timestamp ) { + $this->timestamp = $timestamp; + } + + /** + * Get merchant order ID. + * + * @return string + */ + public function get_merchant_order_id() { + return $this->merchant_order_id; + } + + /** + * Set merchant order ID. + * + * Generated by Merchant. If you want your webshop to use AfterPay, this field must be unique. + * If the ID contains more than 24 characters, the extra characters are removed after the 24th character. + * + * @param string $merchant_order_id Merchant order ID. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 10`. + */ + public function set_merchant_order_id( $merchant_order_id ) { + DataHelper::validate_ans( $merchant_order_id, 24, 'Order.merchantOrderId' ); + + $this->merchant_order_id = $merchant_order_id; + } + + /** + * Set amount. + * + * @param Money $amount Amount. + * @return void + */ + public function set_amount( Money $amount ) { + $this->amount = $amount; + } + + /** + * Set merchant return URL. + * + * The URL to which the consumer's browser will be sent after the payment. + * + * @param string $url Merchant return URL. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 1024`. + */ + public function set_merchant_return_url( $url ) { + DataHelper::validate_an( $url, 1024, 'Order.merchantReturnURL' ); + + $this->merchant_return_url = $url; + } + + /** + * Set description. + * + * @param string|null $description Description. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 35`. + */ + public function set_description( $description ) { + DataHelper::validate_null_or_an( $description, 35, 'Order.description' ); + + $this->description = $description; + } + + /** + * Set language. + * + * @param string|null $language Language (ISO 3166-1 alpha-2). + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..2`. + */ + public function set_language( $language ) { + DataHelper::validate_null_or_an( $language, 2, 'Order.language' ); + + $this->language = $language; + } + + /** + * Set payment brand. + * + * @param string|null $payment_brand Payment brand. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..50`. + */ + public function set_payment_brand( $payment_brand ) { + DataHelper::validate_null_or_an( $payment_brand, 50, 'Order.paymentBrand' ); + + $this->payment_brand = $payment_brand; + } + + /** + * Set payment brand force. + * + * @param string|null $payment_brand_force Payment brand force. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..50`. + */ + public function set_payment_brand_force( $payment_brand_force ) { + DataHelper::validate_null_or_an( $payment_brand_force, 50, 'Order.paymentBrandForce' ); + + $this->payment_brand_force = $payment_brand_force; + } + + /** + * Create and set new order items. + * + * @return OrderItems + */ + public function new_items() { + $this->order_items = new OrderItems(); + + return $this->order_items; + } + + /** + * Set order items. + * + * @param OrderItems|null $order_items Order items. + * @return void + */ + public function set_order_items( OrderItems $order_items = null ) { + $this->order_items = $order_items; + } + + /** + * Set shipping detail. + * + * @param Address|null $shipping_detail Shipping address details. + * @return void + */ + public function set_shipping_detail( Address $shipping_detail = null ) { + $this->shipping_detail = $shipping_detail; + } + + /** + * Set billing detail. + * + * @param Address|null $billing_detail Billing address details. + * @return void + */ + public function set_billing_detail( Address $billing_detail = null ) { + $this->billing_detail = $billing_detail; + } + + /** + * Set customer information. + * + * @param CustomerInformation $customer_information Customer information. + * @return void + */ + public function set_customer_information( CustomerInformation $customer_information ) { + $this->customer_information = $customer_information; + } + + /** + * Get JSON object. + * + * @return object + */ + public function jsonSerialize() { + $object = (object) array(); + + $object->timestamp = $this->timestamp->format( \DATE_ATOM ); + $object->merchantOrderId = $this->merchant_order_id; + + if ( null !== $this->description ) { + $object->description = $this->description; + } + + if ( null !== $this->order_items ) { + $object->orderItems = $this->order_items; + } + + $object->amount = $this->amount; + + if ( null !== $this->shipping_detail ) { + $object->shippingDetail = $this->shipping_detail; + } + + if ( null !== $this->billing_detail ) { + $object->billingDetail = $this->billing_detail; + } + + if ( null !== $this->customer_information ) { + $object->customerInformation = $this->customer_information; + } + + if ( null !== $this->language ) { + $object->language = $this->language; + } + + $object->merchantReturnURL = $this->merchant_return_url; + + if ( null !== $this->payment_brand ) { + $object->paymentBrand = $this->payment_brand; + } + + if ( null !== $this->payment_brand_force ) { + $object->paymentBrandForce = $this->payment_brand_force; + } + + return $object; + } + + /** + * Get signature fields. + * + * @param array $fields Fields. + * @return array + */ + public function get_signature_fields( $fields = array() ) { + $fields[] = $this->timestamp->format( \DATE_ATOM ); + $fields[] = $this->merchant_order_id; + + $fields = $this->amount->get_signature_fields( $fields ); + + $fields[] = \strval( (string) $this->language ); + $fields[] = \strval( (string) $this->description ); + $fields[] = $this->merchant_return_url; + + if ( null !== $this->order_items ) { + $fields = $this->order_items->get_signature_fields( $fields ); + } + + if ( null !== $this->shipping_detail ) { + $fields = $this->shipping_detail->get_signature_fields( $fields ); + } + + if ( null !== $this->payment_brand ) { + $fields[] = $this->payment_brand; + } + + if ( null !== $this->payment_brand_force ) { + $fields[] = $this->payment_brand_force; + } + + if ( null !== $this->customer_information ) { + $fields = $this->customer_information->get_signature_fields( $fields ); + } + + if ( null !== $this->billing_detail ) { + $fields = $this->billing_detail->get_signature_fields( $fields ); + } + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderAnnounceResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderAnnounceResponse.php new file mode 100644 index 00000000..c53ef8cc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderAnnounceResponse.php @@ -0,0 +1,116 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Order announce response + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 2.0.2 + */ +class OrderAnnounceResponse extends ResponseMessage { + /** + * OmniKassa order ID. + * + * @var string + */ + private $omnikassa_order_id; + + /** + * Redirect URL. + * + * @var string + */ + private $redirect_url; + + /** + * Construct notification message. + * + * @param string $omnikassa_order_id OmniKassa order ID. + * @param string $redirect_url Redirect URL. + */ + public function __construct( $omnikassa_order_id, $redirect_url ) { + parent::__construct(); + + $this->omnikassa_order_id = $omnikassa_order_id; + $this->redirect_url = $redirect_url; + } + + /** + * Get OmniKassa order ID. + * + * @return string + */ + public function get_omnikassa_order_id() { + return $this->omnikassa_order_id; + } + + /** + * Get redirect URL. + * + * @return string + */ + public function get_redirect_url() { + return $this->redirect_url; + } + + /** + * Get signature fields. + * + * @return array + */ + public function get_signature_fields() { + return array(); + } + + /** + * Create notification from object. + * + * @param object $object Object. + * @return OrderAnnounceResponse + * @throws \InvalidArgumentException Throws invalid argument exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + if ( ! isset( $object->omnikassaOrderId ) ) { + throw new \InvalidArgumentException( 'Object must contain `omnikassaOrderId` property.' ); + } + + if ( ! isset( $object->redirectUrl ) ) { + throw new \InvalidArgumentException( 'Object must contain `redirectUrl` property.' ); + } + + return new self( $object->omnikassaOrderId, $object->redirectUrl ); + } + + /** + * Create order announce response from JSON string. + * + * @param string $json JSON string. + * @return OrderAnnounceResponse + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $data = \json_decode( $json ); + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $data, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/order-announce-response.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderItem.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderItem.php new file mode 100644 index 00000000..1a1d60ef --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderItem.php @@ -0,0 +1,299 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Order item. + * + * @author Reüel van der Steege + * @version 2.1.10 + * @since 2.0.3 + */ +class OrderItem implements \JsonSerializable { + /** + * Item id. + * + * @var string|null + */ + private $id; + + /** + * Item name (required). + * + * @var string + */ + private $name; + + /** + * Description. + * + * @var string|null + */ + private $description; + + /** + * Quantity (required). + * + * @var int + */ + private $quantity; + + /** + * Amount (required). + * + * @var Money + */ + private $amount; + + /** + * Tax. + * + * @var Money|null + */ + private $tax; + + /** + * Category; physical or digital (required). + * + * @var string + */ + private $category; + + /** + * VAT category. + * + * @var string|null + */ + private $vat_category; + + /** + * Construct order result. + * + * @param string $name Name. + * @param int $quantity Quantity. + * @param Money $amount Amount. + * @param string $category Category. + * @throws \InvalidArgumentException Throws invalid argument exception when arguments are invalid. + */ + public function __construct( $name, $quantity, Money $amount, $category ) { + $this->set_name( $name ); + $this->quantity = $quantity; + $this->amount = $amount; + $this->set_category( $category ); + } + + /** + * Get item ID. + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set item ID. + * + * @param string|null $id ID. + * @return void + */ + public function set_id( $id = null ) { + $this->id = $id; + } + + /** + * Get item name. + * + * @return string + */ + public function get_name() { + return $this->name; + } + + /** + * Set item name. + * + * @param string $name Name. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 50`. + */ + public function set_name( $name ) { + DataHelper::validate_an( $name, 50, 'OrderItems.name' ); + + $this->name = $name; + } + + /** + * Get item description. + * + * @return string|null + */ + public function get_description() { + return $this->description; + } + + /** + * Set item description. + * + * @param string|null $description Description. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 100`. + */ + public function set_description( $description ) { + DataHelper::validate_null_or_an( $description, 100, 'OrderItems.description' ); + + $this->description = $description; + } + + /** + * Get quantity. + * + * @return int + */ + public function get_quantity() { + return $this->quantity; + } + + /** + * Get amount. + * + * @return Money + */ + public function get_amount() { + return $this->amount; + } + + /** + * Get tax. + * + * @return Money|null + */ + public function get_tax() { + return $this->tax; + } + + /** + * Set tax. + * + * @param Money|null $tax Tax. + * @return void + */ + public function set_tax( Money $tax = null ) { + $this->tax = $tax; + } + + /** + * Get category. + * + * @return string + */ + public function get_category() { + return $this->category; + } + + /** + * Set category. + * + * @param string $category Product category: PHYSICAL or DIGITAL. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when value does not apply to format `AN..max 8`. + */ + public function set_category( $category ) { + DataHelper::validate_an( $category, 8, 'OrderItems.category' ); + + $this->category = $category; + } + + /** + * Get VAT category. + * + * @return string|null + */ + public function get_vat_category() { + return $this->vat_category; + } + + /** + * Set VAT category. + * + * @param string|null $vat_category VAT category. + * @return void + */ + public function set_vat_category( $vat_category ) { + $this->vat_category = $vat_category; + } + + /** + * Get JSON. + * + * @return object + */ + public function jsonSerialize() { + $object = (object) array(); + + if ( null !== $this->id ) { + $object->id = $this->id; + } + + $object->name = $this->name; + + if ( null !== $this->description ) { + $object->description = $this->description; + } + + $object->quantity = $this->quantity; + $object->amount = $this->amount; + + if ( null !== $this->tax ) { + $object->tax = $this->tax; + } + + $object->category = $this->category; + + if ( null !== $this->vat_category ) { + $object->vatCategory = $this->vat_category; + } + + return $object; + } + + /** + * Get signature fields. + * + * @param array $fields Fields. + * @return array + */ + public function get_signature_fields( $fields = array() ) { + if ( null !== $this->id ) { + $fields[] = $this->id; + } + + $fields[] = $this->name; + $fields[] = \strval( (string) $this->description ); + $fields[] = \strval( $this->quantity ); + + $fields = $this->amount->get_signature_fields( $fields ); + + if ( null === $this->tax ) { + $fields[] = ''; + } else { + $fields = $this->tax->get_signature_fields( $fields ); + } + + $fields[] = $this->category; + + if ( null !== $this->vat_category ) { + $fields[] = $this->vat_category; + } + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderItems.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderItems.php new file mode 100644 index 00000000..3ce160d1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderItems.php @@ -0,0 +1,107 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Order items. + * + * @author Reüel van der Steege + * @version 2.1.8 + * @since 2.0.3 + */ +class OrderItems implements \JsonSerializable { + /** + * Order items. + * + * @var array + */ + private $order_items; + + /** + * Construct order results message. + * + * @param array $items Order items. + */ + public function __construct( $items = null ) { + if ( \is_array( $items ) ) { + foreach ( $items as $item ) { + $this->add_item( $item ); + } + } + } + + /** + * Create and add new order item. + * + * @param string $name Name. + * @param int $quantity Quantity. + * @param Money $amount Amount. + * @param string $category Category. + * @return OrderItem + * @throws \InvalidArgumentException Throws invalid argument exception when arguments are invalid. + */ + public function new_item( $name, $quantity, Money $amount, $category ) { + $item = new OrderItem( $name, $quantity, $amount, $category ); + + $this->add_item( $item ); + + return $item; + } + + /** + * Add order item. + * + * @param OrderItem $item Order item. + * @return void + */ + public function add_item( OrderItem $item ) { + $this->order_items[] = $item; + } + + /** + * Get order items. + * + * @return array + */ + public function get_order_items() { + return $this->order_items; + } + + /** + * Get JSON. + * + * @return array|null + */ + public function jsonSerialize() { + $data = \array_map( + static function( OrderItem $item ) { + return $item; + }, + $this->get_order_items() + ); + + return $data; + } + + /** + * Get signature fields. + * + * @param array $fields Fields. + * @return array + */ + public function get_signature_fields( $fields = array() ) { + foreach ( $this->get_order_items() as $item ) { + $fields = $item->get_signature_fields( $fields ); + } + + return $fields; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderResult.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderResult.php new file mode 100644 index 00000000..c1dcc17c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderResult.php @@ -0,0 +1,274 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Order result + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 2.0.2 + */ +class OrderResult implements \JsonSerializable { + /** + * OrderId as delivered during the Order Announce. + * + * @var string + */ + private $merchant_order_id; + + /** + * The unique id that the omnikassa has assigned to this order. + * + * @var string + */ + private $omnikassa_order_id; + + /** + * Unique identification of the webshop (point of interaction), seen from ROK. + * This is relevant if several webshops use the same webhook URL. + * + * @var int|string + */ + private $poi_id; + + /** + * The status of the order. See chapter "Consumer returns at the webshop" for an overview of the possible statuses. + * + * @var string + */ + private $order_status; + + /** + * The moment this status is reached. + * + * @var string + */ + private $order_status_datetime; + + /** + * Future field, for now: always empty. + * + * @var string + */ + private $error_code; + + /** + * Paid amount. + * + * @var Money + */ + private $paid_amount; + + /** + * Total amount. + * + * @var Money + */ + private $total_amount; + + /** + * Construct order result. + * + * @param string $merchant_order_id Merchant order ID. + * @param string $omnikassa_order_id OmniKassa order ID. + * @param int|string $poi_id Point of interaction ID. + * @param string $order_status Order status. + * @param string $order_status_datetime Order status datetime. + * @param string $error_code Error code. + * @param Money $paid_amount Paid amount. + * @param Money $total_amount Total amount. + */ + public function __construct( + $merchant_order_id, + $omnikassa_order_id, + $poi_id, + $order_status, + $order_status_datetime, + $error_code, + Money $paid_amount, + Money $total_amount + ) { + $this->merchant_order_id = $merchant_order_id; + $this->omnikassa_order_id = $omnikassa_order_id; + $this->poi_id = $poi_id; + $this->order_status = $order_status; + $this->order_status_datetime = $order_status_datetime; + $this->error_code = $error_code; + $this->paid_amount = $paid_amount; + $this->total_amount = $total_amount; + } + + /** + * Get merchant order ID. + * + * @return string + */ + public function get_merchant_order_id() { + return $this->merchant_order_id; + } + + /** + * Get OmniKassa order ID. + * + * @return string + */ + public function get_omnikassa_order_id() { + return $this->omnikassa_order_id; + } + + /** + * Get point of interaction ID. + * + * @return int|string + */ + public function get_poi_id() { + return $this->poi_id; + } + + /** + * Get order status. + * + * @return string + */ + public function get_order_status() { + return $this->order_status; + } + + /** + * Get order status datetime. + * + * @return string + */ + public function get_order_status_datetime() { + return $this->order_status_datetime; + } + + /** + * Get error code. + * + * @return string + */ + public function get_error_code() { + return $this->error_code; + } + + /** + * Get paid amount. + * + * @return Money + */ + public function get_paid_amount() { + return $this->paid_amount; + } + + /** + * Get total amount. + * + * @return Money + */ + public function get_total_amount() { + return $this->total_amount; + } + + /** + * Get JSON. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'merchantOrderId' => $this->get_merchant_order_id(), + 'omnikassaOrderId' => $this->get_omnikassa_order_id(), + 'poiId' => $this->get_poi_id(), + 'orderStatus' => $this->get_order_status(), + 'orderStatusDateTime' => $this->get_order_status_datetime(), + 'errorCode' => $this->get_error_code(), + 'paidAmount' => $this->get_paid_amount(), + 'totalAmount' => $this->get_total_amount(), + ); + } + + /** + * Create order result from object. + * + * @param \stdClass $object Object. + * @return OrderResult + * @throws \InvalidArgumentException Throws invalid argument exception when object does not contains the required properties. + */ + public static function from_object( \stdClass $object ) { + if ( ! isset( $object->merchantOrderId ) ) { + throw new \InvalidArgumentException( 'Object must contain `merchantOrderId` property.' ); + } + + if ( ! isset( $object->omnikassaOrderId ) ) { + throw new \InvalidArgumentException( 'Object must contain `omnikassaOrderId` property.' ); + } + + if ( ! isset( $object->poiId ) ) { + throw new \InvalidArgumentException( 'Object must contain `poiId` property.' ); + } + + if ( ! isset( $object->orderStatus ) ) { + throw new \InvalidArgumentException( 'Object must contain `orderStatus` property.' ); + } + + if ( ! isset( $object->orderStatusDateTime ) ) { + throw new \InvalidArgumentException( 'Object must contain `orderStatusDateTime` property.' ); + } + + if ( ! isset( $object->errorCode ) ) { + throw new \InvalidArgumentException( 'Object must contain `errorCode` property.' ); + } + + if ( ! isset( $object->paidAmount ) ) { + throw new \InvalidArgumentException( 'Object must contain `paidAmount` property.' ); + } + + if ( ! isset( $object->totalAmount ) ) { + throw new \InvalidArgumentException( 'Object must contain `totalAmount` property.' ); + } + + return new self( + $object->merchantOrderId, + $object->omnikassaOrderId, + $object->poiId, + $object->orderStatus, + $object->orderStatusDateTime, + $object->errorCode, + Money::from_object( $object->paidAmount ), + Money::from_object( $object->totalAmount ) + ); + } + + /** + * Create notification from JSON string. + * + * @param string $json JSON string. + * @return OrderResult + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $data = \json_decode( $json ); + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $data, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/json-schema-order-result.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderResults.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderResults.php new file mode 100644 index 00000000..4e344f54 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/OrderResults.php @@ -0,0 +1,148 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Order results. + * + * @author Remco Tolsma + * @version 2.1.10 + * @since 1.0.0 + * @implements \IteratorAggregate + */ +class OrderResults extends ResponseMessage implements \IteratorAggregate { + /** + * More order results available flag. + * + * @var bool + */ + private $more_available; + + /** + * Order results. + * + * @var array + */ + private $order_results; + + /** + * Construct order results message. + * + * @param bool $more_available True if more order results available, false oterwise. + * @param array $order_results Order results. + * @param string $signature Signature. + */ + public function __construct( $more_available, array $order_results, $signature ) { + parent::__construct( $signature ); + + $this->more_available = $more_available; + $this->order_results = $order_results; + } + + /** + * More available. + * + * @return bool True if more order results available, false oterwise. + */ + public function more_available() { + return $this->more_available; + } + + /** + * Get signature data. + * + * @return array + */ + public function get_signature_fields() { + $fields = array(); + + $fields[] = $this->more_available() ? 'true' : 'false'; + + foreach ( $this->order_results as $order_result ) { + $fields[] = $order_result->get_merchant_order_id(); + $fields[] = $order_result->get_omnikassa_order_id(); + $fields[] = \strval( $order_result->get_poi_id() ); + $fields[] = $order_result->get_order_status(); + $fields[] = $order_result->get_order_status_datetime(); + $fields[] = $order_result->get_error_code(); + + $fields = $order_result->get_paid_amount()->get_signature_fields( $fields ); + $fields = $order_result->get_total_amount()->get_signature_fields( $fields ); + } + + return $fields; + } + + /** + * Get iterator. + * + * @return \ArrayIterator + */ + public function getIterator() { + return new \ArrayIterator( $this->order_results ); + } + + /** + * Create order results from object. + * + * @param object $object Object. + * @return OrderResults + * @throws \InvalidArgumentException Throws invalid argument exception when object does not contains the required properties. + */ + public static function from_object( $object ) { + if ( ! isset( $object->signature ) ) { + throw new \InvalidArgumentException( 'Object must contain `signature` property.' ); + } + + if ( ! isset( $object->moreOrderResultsAvailable ) ) { + throw new \InvalidArgumentException( 'Object must contain `moreOrderResultsAvailable` property.' ); + } + + if ( ! isset( $object->orderResults ) ) { + throw new \InvalidArgumentException( 'Object must contain `orderResults` property.' ); + } + + if ( ! \is_array( $object->orderResults ) ) { + throw new \InvalidArgumentException( 'The `orderResults` property must be an array.' ); + } + + $order_results = array(); + + foreach ( $object->orderResults as $o ) { + $order_results[] = OrderResult::from_object( $o ); + } + + return new self( $object->moreOrderResultsAvailable, $order_results, $object->signature ); + } + + /** + * Create notification from JSON string. + * + * @param string $json JSON string. + * @return OrderResults + * @throws \JsonSchema\Exception\ValidationException Throws JSON schema validation exception when JSON is invalid. + */ + public static function from_json( $json ) { + $data = \json_decode( $json ); + + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $data, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/order-results.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + return self::from_object( $data ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/PaymentBrandForce.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/PaymentBrandForce.php new file mode 100644 index 00000000..4c45bcd0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/PaymentBrandForce.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Payment brand force. + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.0.0 + */ +class PaymentBrandForce { + /** + * In the case of FORCE_ONCE, the indicated paymentBrand is only enforced on the first + * transaction. If this fails, the consumer can still choose another payment method. + * + * @var string + */ + const FORCE_ONCE = 'FORCE_ONCE'; + + /** + * When FORCE_ALWAYS is chosen, the consumer can not choose another payment method. + * + * @var string + */ + const FORCE_ALWAYS = 'FORCE_ALWAYS'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/PaymentBrands.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/PaymentBrands.php new file mode 100644 index 00000000..0a8f50d2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/PaymentBrands.php @@ -0,0 +1,125 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Payment brands. + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 1.0.0 + */ +class PaymentBrands { + /** + * Payment brand 'IDEAL'. + * + * @var string + */ + const IDEAL = 'IDEAL'; + + /** + * Payment brand 'AFTERPAY'. + * + * @var string + */ + const AFTERPAY = 'AFTERPAY'; + + /** + * Payment brand 'PAYPAL'. + * + * @var string + */ + const PAYPAL = 'PAYPAL'; + + /** + * Payment brand 'MASTERCARD'. + * + * @var string + */ + const MASTERCARD = 'MASTERCARD'; + + /** + * Payment brand 'VISA'. + * + * @var string + */ + const VISA = 'VISA'; + + /** + * Payment brand 'BANCONTACT'. + * + * @var string + */ + const BANCONTACT = 'BANCONTACT'; + + /** + * Payment brand 'MAESTRO'. + * + * @var string + */ + const MAESTRO = 'MAESTRO'; + + /** + * Payment brand 'V_PAY'. + * + * @var string + */ + const V_PAY = 'V_PAY'; + + /** + * Payment brand 'CARDS'. + * + * The CARDS value ensures that the consumer can choose between payment methods: + * MASTERCARD, VISA, BANCONTACT, MAESTRO and V_PAY. + * + * Dutch: De waarde CARDS zorgt ervoor dat de consument kan kiezen uit de betaalmethoden: + * MASTERCARD, VISA, BANCONTACT, MAESTRO en V_PAY. + * + * @var string + */ + const CARDS = 'CARDS'; + + /** + * Map payment methods to payment brands. + * + * @var array + */ + private static $map = array( + PaymentMethods::AFTERPAY => self::AFTERPAY, + PaymentMethods::BANCONTACT => self::BANCONTACT, + PaymentMethods::CREDIT_CARD => self::CARDS, + PaymentMethods::IDEAL => self::IDEAL, + PaymentMethods::MAESTRO => self::MAESTRO, + PaymentMethods::PAYPAL => self::PAYPAL, + ); + + /** + * Transform WordPress payment method to OmniKassa method. + * + * @since 1.0.0 + * @param string|null $payment_method Payment method. + * @param string $default Default payment method. + * @return string|null + */ + public static function transform( $payment_method, $default = null ) { + if ( ! \is_scalar( $payment_method ) ) { + return null; + } + + if ( isset( self::$map[ $payment_method ] ) ) { + return self::$map[ $payment_method ]; + } + + return $default; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ProductCategories.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ProductCategories.php new file mode 100644 index 00000000..cf049349 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ProductCategories.php @@ -0,0 +1,54 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Payments\PaymentLineType; + +/** + * Product categories. + * + * @author Reüel van der Steege + * @version 2.1.8 + * @since 2.0.4 + */ +class ProductCategories { + /** + * Product category 'PHYSICAL'. + * + * @var string + */ + const PHYSICAL = 'PHYSICAL'; + + /** + * Product category 'DIGITAL'. + * + * @var string + */ + const DIGITAL = 'DIGITAL'; + + /** + * Transform Pronamic payment line type to OmniKassa 2.0 product category. + * + * @param string $type Pronamic payment line type. + * @return string + */ + public static function transform( $type ) { + switch ( $type ) { + case PaymentLineType::PHYSICAL: + return self::PHYSICAL; + case PaymentLineType::DIGITAL: + case PaymentLineType::DISCOUNT: + case PaymentLineType::SHIPPING: + default: + return self::DIGITAL; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ResponseMessage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ResponseMessage.php new file mode 100644 index 00000000..2691a809 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ResponseMessage.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Response message + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 2.0.2 + */ +abstract class ResponseMessage extends Message { + /** + * Construct message. + * + * @param string|null $signature Signature. + */ + public function __construct( $signature = null ) { + $this->set_signature( $signature ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ReturnParameters.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ReturnParameters.php new file mode 100644 index 00000000..d278ed06 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/ReturnParameters.php @@ -0,0 +1,121 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Return parameters + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 2.0.2 + */ +class ReturnParameters extends ResponseMessage { + /** + * The "merchantOrderId" as used in the Order announce. + * + * @var string + */ + private $order_id; + + /** + * The status of the order, see below for more details. + * + * @var string + */ + private $status; + + /** + * Construct return parameters object. + * + * @param string $order_id Order ID. + * @param string $status Status. + * @param string $signature Signature. + */ + public function __construct( $order_id, $status, $signature ) { + parent::__construct( $signature ); + + $this->order_id = $order_id; + $this->status = $status; + } + + /** + * Get order ID. + * + * @return string + */ + public function get_order_id() { + return $this->order_id; + } + + /** + * Get status. + * + * @return string + */ + public function get_status() { + return $this->status; + } + + /** + * Get signature data. + * + * The signature is calculated in the same way as other signatures. In this case, the two fields (in order: order_id, status) are used as input. + * + * @return array + */ + public function get_signature_fields() { + return array( + $this->get_order_id(), + $this->get_status(), + ); + } + + /** + * Check if data array contains return parameters. + * + * @param array $data Data array. + * @return bool True if array contains return parameters, false otherwise. + */ + public static function contains( array $data ) { + $result = ( + \array_key_exists( 'order_id', $data ) + && + \array_key_exists( 'status', $data ) + && + \array_key_exists( 'signature', $data ) + ); + + return $result; + } + + /** + * Get return parameters from the specifieid data array. + * + * @param array $data Data array. + * @return ReturnParameters + * @throws \InvalidArgumentException Throws invalid argument exception when array does not contains the required keys. + */ + public static function from_array( array $data ) { + if ( ! \array_key_exists( 'order_id', $data ) ) { + throw new \InvalidArgumentException( 'Data array must contain `order_id` field.' ); + } + + if ( ! \array_key_exists( 'status', $data ) ) { + throw new \InvalidArgumentException( 'Data array must contain `status` field.' ); + } + + if ( ! \array_key_exists( 'signature', $data ) ) { + throw new \InvalidArgumentException( 'Data array must contain `signature` field.' ); + } + + return new self( $data['order_id'], $data['status'], $data['signature'] ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Security.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Security.php new file mode 100644 index 00000000..c23873f7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Security.php @@ -0,0 +1,87 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Security + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 1.0.0 + */ +class Security { + /** + * Get signature fields combined. + * + * @param array $fields Fields. + * @return string + */ + public static function get_signature_fields_combined( $fields ) { + return \implode( ',', $fields ); + } + + /** + * Calculdate signature for specific data. + * + * @param Signable $signable Signable object. + * @param string $signing_key Signing Key. + * @return string + * @throws \InvalidArgumentException Signing key is invalid. + */ + public static function get_signature( Signable $signable, $signing_key ) { + if ( empty( $signing_key ) ) { + throw new \InvalidArgumentException( + \sprintf( + 'Signing key "%s" is empty.', + $signing_key + ) + ); + } + + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode + $decoded_signing_key = \base64_decode( $signing_key, true ); + + if ( false === $decoded_signing_key ) { + throw new \InvalidArgumentException( + \sprintf( + 'Signing key "%s" contains character from outside the base64 alphabet.', + $signing_key + ) + ); + } + + $fields = $signable->get_signature_fields(); + + $combined = self::get_signature_fields_combined( $fields ); + + $signature = \hash_hmac( 'sha512', $combined, $decoded_signing_key ); + + return $signature; + } + + /** + * Validate signature. + * + * @param string $signature_a Signature A. + * @param string $signature_b Signature B. + * @return bool True if valid, false otherwise. + */ + public static function validate_signature( $signature_a, $signature_b ) { + if ( empty( $signature_a ) || empty( $signature_b ) ) { + // Empty signature string or null from calculation. + return false; + } + + $result = ( 0 === \strcasecmp( $signature_a, $signature_b ) ); + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Signable.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Signable.php new file mode 100644 index 00000000..c6a9ae71 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Signable.php @@ -0,0 +1,27 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * Signable + * + * @author Remco Tolsma + * @version 2.1.8 + * @since 1.0.0 + */ +interface Signable { + /** + * Get signature fields. + * + * @return array + */ + public function get_signature_fields(); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Statuses.php new file mode 100644 index 00000000..1209ac75 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/Statuses.php @@ -0,0 +1,71 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Statuses + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.0.0 + */ +class Statuses { + /** + * Cancelled. + * + * @var string + */ + const CANCELLED = 'CANCELLED'; + + /** + * Completed. + * + * @var string + */ + const COMPLETED = 'COMPLETED'; + + /** + * Expired. + * + * @var string + */ + const EXPIRED = 'EXPIRED'; + + /** + * In progress. + * + * @var string + */ + const IN_PROGRESS = 'IN_PROGRESS'; + + /** + * Transform an OmniKassa 2.0 status to Pronamic Pay status. + * + * @param string $status OmniKassa 2.0 status. + * @return string|null + */ + public static function transform( $status ) { + switch ( $status ) { + case self::CANCELLED: + return PaymentStatus::CANCELLED; + case self::COMPLETED: + return PaymentStatus::SUCCESS; + case self::EXPIRED: + return PaymentStatus::EXPIRED; + case self::IN_PROGRESS: + return PaymentStatus::OPEN; + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/VatCategories.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/VatCategories.php new file mode 100644 index 00000000..a475a026 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/VatCategories.php @@ -0,0 +1,48 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +/** + * VAT categories. + * + * @author Reüel van der Steege + * @version 2.1.8 + * @since 2.0.4 + */ +class VatCategories { + /** + * Category 'Hoog'. + * + * @var string + */ + const HIGH = '1'; + + /** + * Category 'Laag'. + * + * @var string + */ + const LOW = '2'; + + /** + * Category 'Nul (0%)'. + * + * @var string + */ + const ZERO = '3'; + + /** + * Category 'Geen (vrijgesteld van btw)'. + * + * @var int + */ + const EXEMPTED = '4'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/WebhookController.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/WebhookController.php new file mode 100644 index 00000000..deea46a8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/omnikassa-2/src/WebhookController.php @@ -0,0 +1,128 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\OmniKassa2 + */ + +namespace Pronamic\WordPress\Pay\Gateways\OmniKassa2; + +use Pronamic\WordPress\Pay\GatewayPostType; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Webhook controller + * + * @author Remco Tolsma + * @version 2.3.0 + * @since 2.3.0 + */ +class WebhookController { + /** + * Setup. + * + * @return void + */ + public function setup() { + \add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + + \add_action( 'wp_loaded', array( $this, 'wp_loaded' ) ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * @return void + */ + public function rest_api_init() { + \register_rest_route( + Integration::REST_ROUTE_NAMESPACE, + '/webhook', + array( + 'methods' => 'POST', + 'callback' => array( $this, 'rest_api_omnikassa_2_webhook' ), + 'permission_callback' => '__return_true', + ) + ); + } + + /** + * REST API OmniKassa 2.0 webhook handler. + * + * @param \WP_REST_Request $request Request. + * @return object + */ + public function rest_api_omnikassa_2_webhook( \WP_REST_Request $request ) { + // Input. + $json = $request->get_body(); + + try { + $notification = Notification::from_json( $json ); + } catch ( \JsonSchema\Exception\ValidationException $e ) { + // Invalid input data. + return new \WP_Error( + 'rest_omnikassa_2_notification_invalid', + \__( 'Invalid OmniKassa 2.0 notification.', 'pronamic_ideal ' ), + array( + 'status' => 400, + 'notification' => $json, + ) + ); + } + + // Query. + $query = new \WP_Query( + array( + 'post_type' => GatewayPostType::POST_TYPE, + 'post_status' => 'publish', + 'nopaging' => true, + 'meta_query' => array( + array( + 'key' => '_pronamic_gateway_id', + 'value' => 'rabobank-omnikassa-2', + ), + ), + ) + ); + + foreach ( $query->posts as $post ) { + $gateway = Plugin::get_gateway( $post->ID ); + + if ( $gateway instanceof Gateway ) { + try { + $gateway->handle_notification( $notification ); + } catch ( \Exception $e ) { + continue; + } + } + } + + // Response. + $response = new \WP_REST_Response( array( 'success' => true ) ); + + $response->add_link( 'self', \rest_url( $request->get_route() ) ); + + return $response; + } + + /** + * WordPress loaded, check for deprecated webhook call. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-includes/rest-api.php#L277-L309 + * @return void + */ + public function wp_loaded() { + if ( ! \filter_has_var( \INPUT_GET, 'omnikassa2_webhook' ) ) { + return; + } + + \rest_get_server()->serve_request( '/pronamic-pay/omnikassa-2/v1/webhook' ); + + exit; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Client.php new file mode 100644 index 00000000..2742d382 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Client.php @@ -0,0 +1,242 @@ +token = $token; + $this->service_id = $service_id; + } + + /** + * Get Pay.nl API URL. + * + * @param string $version Version. + * @param string $namespace Namespace. + * @param string $method Method. + * @param string $output Output. + * @param array $parameters Parameters. + * + * @return string + */ + private function get_url( $version, $namespace, $method, $output, $parameters = array() ) { + return add_query_arg( + rawurlencode_deep( $parameters ), + sprintf( + self::API_URL, + $version, + $namespace, + $method, + $output + ) + ); + } + + /** + * Send request to the specified URL. + * + * @param string $version Version. + * @param string $namespace Namespace. + * @param string $method Method. + * @param string $output Output. + * @param array $parameters Parameters. + * + * @return null|array|stdClass Response object or null if request failed. + */ + private function send_request( $version, $namespace, $method, $output, $parameters = array() ) { + $url = $this->get_url( $version, $namespace, $method, $output, $parameters ); + + $response = wp_remote_get( $url ); + + if ( is_wp_error( $response ) ) { + throw new \Exception( __( 'Unknown response from Pay.nl.', 'pronamic_ideal' ) ); + } + + // Body. + $body = wp_remote_retrieve_body( $response ); + + $result = json_decode( $body ); + + // Result is array. + if ( is_array( $result ) ) { + return $result; + } + + // Result is object + // NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit. + if ( ! is_object( $result ) ) { + throw new \Exception( __( 'Unknown response from Pay.nl error.', 'pronamic_ideal' ) ); + } + + // Error. + if ( isset( $result->request->errorId, $result->request->errorMessage ) && ! empty( $result->request->errorId ) ) { + $pay_nl_error = new PayNL_Error( $result->request->errorId, $result->request->errorMessage ); + + throw new \Exception( (string) $pay_nl_error ); + } + + // Check result (v3). + if ( isset( $result->status, $result->error ) && ! filter_var( $result->status, FILTER_VALIDATE_BOOLEAN ) && ! empty( $result->error ) ) { + throw new \Exception( $result->error ); + } + + // Check result (v4). + if ( isset( $result->request, $result->request->result ) && '1' !== $result->request->result ) { + throw new \Exception( __( 'Unknown Pay.nl error.', 'pronamic_ideal' ) ); + } + + // Return result. + return $result; + } + + /** + * Transaction start + * + * @param float $amount Transaction amount. + * @param string $ip_address IP address. + * @param string $finish_url Finish URL. + * @param array $request_param Request parameters. + * + * @return null|stdClass + * + * @link https://admin.pay.nl/docpanel/api/Transaction/start/4 + */ + public function transaction_start( $amount, $ip_address, $finish_url, $request_param = array() ) { + $parameters = array_merge( + $request_param, + array( + 'token' => $this->token, + 'serviceId' => $this->service_id, + 'amount' => $amount, + 'ipAddress' => $ip_address, + 'finishUrl' => $finish_url, + ) + ); + + // Request. + $result = $this->send_request( 'v4', 'Transaction', 'start', 'json', $parameters ); + + if ( is_array( $result ) ) { + return null; + } + + // Return result. + return $result; + } + + /** + * Transaction info. + * + * @param string $transaction_id Transaction ID. + * + * @link https://admin.pay.nl/docpanel/api/Transaction/info/4 + * + * @return null|array|stdClass + */ + public function transaction_info( $transaction_id ) { + // Request. + $result = $this->send_request( + 'v4', + 'Transaction', + 'info', + 'json', + array( + 'token' => $this->token, + 'transactionId' => $transaction_id, + ) + ); + + // Return result. + return $result; + } + + /** + * Get issuers + * + * @return array|bool + */ + public function get_issuers() { + // Request. + $result = $this->send_request( + 'v4', + 'Transaction', + 'getService', + 'json', + array( + 'token' => $this->token, + 'serviceId' => $this->service_id, + 'paymentMethodId' => Methods::IDEAL, + ) + ); + + if ( ! is_object( $result ) ) { + return false; + } + + // Country option list. + if ( ! isset( $result->countryOptionList ) ) { + throw new \Exception( __( 'Unknown Pay.nl error.', 'pronamic_ideal' ) ); + } + + // Ok. + $issuers = array(); + + foreach ( $result->countryOptionList as $countries ) { + foreach ( $countries->paymentOptionList as $payment_method ) { + if ( Methods::IDEAL !== $payment_method->id ) { + continue; + } + + foreach ( $payment_method->paymentOptionSubList as $issuer ) { + $id = Security::filter( $issuer->id ); + $name = Security::filter( $issuer->name ); + + $issuers[ $id ] = $name; + } + } + } + + return $issuers; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Config.php new file mode 100644 index 00000000..faca4820 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Config.php @@ -0,0 +1,21 @@ +id = $id; + $this->message = $message; + } + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + return $this->id . ' - ' . $this->message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Gateway.php new file mode 100644 index 00000000..72ded162 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Gateway.php @@ -0,0 +1,263 @@ +set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $this->client = new Client( $config->token, $config->service_id ); + } + + /** + * Get issuers + * + * @see Pronamic_WP_Pay_Gateway::get_issuers() + */ + public function get_issuers() { + $groups = array(); + + try { + $result = $this->client->get_issuers(); + + if ( is_array( $result ) ) { + $groups[] = array( + 'options' => $result, + ); + } + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'pay_nl_error', $e->getMessage() ); + + return $groups; + } + + return $groups; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::AFTERPAY, + PaymentMethods::BANCONTACT, + PaymentMethods::BANK_TRANSFER, + PaymentMethods::CREDIT_CARD, + PaymentMethods::FOCUM, + PaymentMethods::GIROPAY, + PaymentMethods::IDEAL, + PaymentMethods::IN3, + PaymentMethods::KLARNA_PAY_LATER, + PaymentMethods::MAESTRO, + PaymentMethods::PAYPAL, + PaymentMethods::SOFORT, + ); + } + + /** + * Start. + * + * @see Core_Gateway::start() + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + $payment_method = $payment->get_method(); + + /* + * New transaction request. + * @link https://www.pay.nl/docs/developers.php#transactions + */ + $customer = $payment->get_customer(); + $billing_address = $payment->get_billing_address(); + $shipping_address = $payment->get_shipping_address(); + + // Payment lines. + $order_data = array(); + + if ( null !== $payment->get_lines() ) { + foreach ( $payment->get_lines() as $line ) { + $price = null; + + if ( null !== $line->get_unit_price() ) { + $price = $line->get_unit_price()->get_including_tax()->get_cents(); + } + + $order_data[] = array( + 'productId' => $line->get_id(), + 'productType' => ProductTypes::transform( $line->get_type() ), + 'description' => $line->get_name(), + 'price' => $price, + 'quantity' => $line->get_quantity(), + ); + } + } + + // End user. + $end_user = array(); + + // End user - Address. + if ( null !== $shipping_address ) { + $end_user['address'] = array( + 'streetName' => $shipping_address->get_street_name(), + 'streetNumber' => $shipping_address->get_house_number_base(), + 'streetNumberExtension' => $shipping_address->get_house_number_addition(), + 'zipCode' => $shipping_address->get_postal_code(), + 'city' => $shipping_address->get_city(), + 'countryCode' => $shipping_address->get_country_code(), + ); + } + + // End user - Invoice address. + if ( null !== $billing_address ) { + $end_user['invoiceAddress'] = array( + 'streetName' => $billing_address->get_street_name(), + 'streetNumber' => $billing_address->get_house_number_base(), + 'streetNumberExtension' => $billing_address->get_house_number_addition(), + 'zipCode' => $billing_address->get_postal_code(), + 'city' => $billing_address->get_city(), + 'countryCode' => $billing_address->get_country_code(), + ); + } + + // Request. + $request = array( + // Transaction. + 'transaction' => array( + 'currency' => $payment->get_total_amount()->get_currency()->get_alphabetic_code(), + 'description' => $payment->get_description(), + ), + + // End user. + 'enduser' => $end_user, + + // Sale data. + 'saleData' => array( + 'invoiceDate' => $payment->get_date()->format( 'd-m-Y' ), + 'deliveryDate' => $payment->get_date()->format( 'd-m-Y' ), + 'orderData' => $order_data, + ), + ); + + // Payment method. + $method = Methods::transform( $payment_method ); + + if ( null !== $method ) { + $request['paymentOptionId'] = $method; + } + + if ( null !== $payment->get_customer() ) { + $enduser = array( + 'gender' => $customer->get_gender(), + 'phoneNumber' => $customer->get_phone(), + 'emailAddress' => $customer->get_email(), + 'language' => $customer->get_language(), + ); + + $invoice_address = array( + 'gender' => $customer->get_gender(), + ); + + // Set name from customer. + if ( null !== $customer->get_name() ) { + $first_name = \substr( (string) $customer->get_name()->get_first_name(), 0, 32 ); + $last_name = \substr( (string) $customer->get_name()->get_last_name(), 0, 32 ); + + $enduser['initials'] = $first_name; + $enduser['lastName'] = $last_name; + + $invoice_address['initials'] = $first_name; + $invoice_address['lastName'] = $last_name; + } + + // Set date of birth. + if ( $customer->get_birth_date() instanceof \DateTime ) { + $enduser['dob'] = $customer->get_birth_date()->format( 'dmY' ); + } + + $request['enduser'] = array_merge( $request['enduser'], $enduser ); + + $request['enduser']['invoiceAddress'] = array_merge( $request['enduser']['invoiceAddress'], $invoice_address ); + } + + // Check payment method. + if ( null === $request['paymentOptionId'] && ! empty( $payment_method ) ) { + // Leap of faith if the WordPress payment method could not transform to a Pay.nl method? + $request['paymentOptionId'] = $payment_method; + } + + // Set payment method specific parameters. + if ( PaymentMethods::IDEAL === $payment_method ) { + $request['paymentOptionSubId'] = $payment->get_issuer(); + } + + // Start transaction. + $result = $this->client->transaction_start( + $payment->get_total_amount()->get_minor_units(), + Util::get_ip_address(), + $payment->get_return_url(), + $request + ); + + // Update gateway results in payment. + $payment->set_transaction_id( $result->transaction->transactionId ); + $payment->set_action_url( $result->transaction->paymentURL ); + } + + /** + * Update status of the specified payment. + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + try { + // Get transaction info. + $result = $this->client->transaction_info( $payment->get_transaction_id() ); + } catch ( \Exception $e ) { + return; + } + + if ( is_object( $result ) && isset( $result->paymentDetails ) ) { + $status = Statuses::transform( $result->paymentDetails->state ); + + // Update payment status. + $payment->set_status( $status ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Integration.php new file mode 100644 index 00000000..1bb82633 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Integration.php @@ -0,0 +1,104 @@ + 'pay_nl', + 'name' => 'Pay.nl', + 'url' => 'https://www.pay.nl/', + 'product_url' => 'http://www.pay.nl/', + 'dashboard_url' => 'https://admin.pay.nl/', + 'register_url' => 'https://www.pay.nl/registreren/?id=M-7393-3100', + 'provider' => 'pay_nl', + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-pay-nl-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + } + + /** + * Get settings fields. + * + * @return array + */ + public function get_settings_fields() { + $fields = array(); + + // Intro. + $fields[] = array( + 'section' => 'general', + 'type' => 'html', + 'html' => sprintf( + /* translators: 1: payment provider name */ + __( 'Account details are provided by %1$s after registration. These settings need to match with the %1$s dashboard.', 'pronamic_ideal' ), + __( 'Pay.nl', 'pronamic_ideal' ) + ), + ); + + // Token. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_pay_nl_token', + 'title' => __( 'Token', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Token as mentioned at Merchant » Company data (Connection) in the payment provider dashboard.', 'pronamic_ideal' ), + ); + + // Service ID. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_pay_nl_service_id', + 'title' => __( 'Service ID', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Service ID as mentioned at Manage » Services in the payment provider dashboard.', 'pronamic_ideal' ), + ); + + // Return fields. + return $fields; + } + + public function get_config( $post_id ) { + $config = new Config(); + + $config->token = get_post_meta( $post_id, '_pronamic_gateway_pay_nl_token', true ); + $config->service_id = get_post_meta( $post_id, '_pronamic_gateway_pay_nl_service_id', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Methods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Methods.php new file mode 100644 index 00000000..e9dc0660 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/Methods.php @@ -0,0 +1,183 @@ + € 100 method. + * + * @var string + */ + const BILLINK_HIGH = '1675'; + + /** + * Constant for the Capayable Achteraf Betalen method. + * + * @var string + */ + const CAPAYABLE = '1744'; + + /** + * Constant for the Credit Card method. + * + * @var string + */ + const CREDITCARD = '706'; + + /** + * Constant for the Focum method. + * + * @var string + */ + const FOCUM = '1702'; + + /** + * Constant for the Giropay method. + * + * @var string + */ + const GIROPAY = '694'; + + /** + * Constant for the iDEAL method. + * + * @var string + */ + const IDEAL = '10'; + + /** + * Constant for the In3 (Gesprek betalen) method. + * + * @var string + */ + const IN3 = '1813'; + + /** + * Constant for the Klarna method. + * + * @var string + */ + const KLARNA_PAY_LATER = '1717'; + + /** + * Constant for the Maestro method. + * + * @var string + */ + const MAESTRO = '712'; + + /** + * Constant for the PayPal method. + * + * @var string + */ + const PAYPAL = '138'; + + /** + * Constant for the Paysafecard method. + * + * @var string + */ + const PAYSAFECARD = '553'; + + /** + * Constant for the Sofort (Digital Services) method. + * + * 559 = Sofortbanking eCommerce (fysieke producten) + * 577 = Sofortbanking Digital services + * 595 = Sofortbanking High risk + * + * @link https://admin.pay.nl/data/payment_profiles + * + * @var string + */ + const SOFORT = '577'; + + /** + * Payments methods map. + * + * @var array + */ + private static $map = array( + PaymentMethods::AFTERPAY => self::AFTERPAY, + PaymentMethods::BANCONTACT => self::BANCONTACT, + PaymentMethods::BANK_TRANSFER => self::BANKTRANSFER, + PaymentMethods::CREDIT_CARD => self::CREDITCARD, + PaymentMethods::FOCUM => self::FOCUM, + PaymentMethods::GIROPAY => self::GIROPAY, + PaymentMethods::IDEAL => self::IDEAL, + PaymentMethods::IN3 => self::IN3, + PaymentMethods::KLARNA_PAY_LATER => self::KLARNA_PAY_LATER, + PaymentMethods::MISTER_CASH => self::BANCONTACT, + PaymentMethods::MAESTRO => self::MAESTRO, + PaymentMethods::PAYPAL => self::PAYPAL, + PaymentMethods::SOFORT => self::SOFORT, + ); + + /** + * Transform WordPress payment method to Pay.nl method. + * + * @param mixed $payment_method Payment method. + * + * @return null|string + */ + public static function transform( $payment_method ) { + if ( ! is_scalar( $payment_method ) ) { + return null; + } + + if ( isset( self::$map[ $payment_method ] ) ) { + return self::$map[ $payment_method ]; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/OutputOptions.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/OutputOptions.php new file mode 100644 index 00000000..35a447da --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/pay-nl/src/OutputOptions.php @@ -0,0 +1,58 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Adyen + */ + +add_filter( + 'pronamic_pay_gateways', + function( $gateways ) { + $gateways[] = new \Pronamic\WordPress\Pay\Gateways\Payvision\Integration(); + + return $gateways; + } +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/readme.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/readme.txt new file mode 100644 index 00000000..e36ed0e3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/readme.txt @@ -0,0 +1,9 @@ +=== Pronamic Pay Payvision Add-On === +Contributors: pronamic, remcotolsma +Tags: pronamic, pay, payvision, add-on +Requires at least: 4.7 +Tested up to: 5.1 +Requires PHP: 5.3 +Stable tag: 1.0.0 + +Extend the Pronamic Pay plugin with the Payvision gateway to receive payments with Payvision through a variety of WordPress plugins. diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/BankDetails.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/BankDetails.php new file mode 100644 index 00000000..009d1b5c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/BankDetails.php @@ -0,0 +1,57 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Bank Details + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class BankDetails implements \JsonSerializable { + /** + * Issuer ID. + * + * @var string|null + */ + private $issuer_id; + + /** + * Get issuer ID. + * + * @return string|null + */ + public function get_issuer_id() { + return $this->issuer_id; + } + + /** + * Set issuer ID. + * + * @param string|null $issuer_id Issuer ID. + * @return void + */ + public function set_issuer_id( $issuer_id ) { + $this->issuer_id = $issuer_id; + } + + /** + * JSON serialize. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'issuerId' => $this->issuer_id, + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/BrandId.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/BrandId.php new file mode 100644 index 00000000..de235f8e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/BrandId.php @@ -0,0 +1,100 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Brand ID + * + * @link https://developers.acehubpaymentservices.com/v3.3/reference#brands + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class BrandId { + /** + * VISA. + * + * @var string + */ + const VISA = '1010'; + + /** + * American Express. + * + * @var string + */ + const AMERICAN_EXPRESS = '1030'; + + /** + * Maestro. + * + * @var string + */ + const MAESTRO = '1050'; + + /** + * Bancontact (BCMC = Bancontact / Mister Cash). + * + * @var string + */ + const BCMC = '1210'; + + /** + * IDeal. + * + * @var string + */ + const IDEAL = '3010'; + + /** + * PayPal. + * + * @var string + */ + const PAYPAL = '4010'; + + /** + * AfterPay. + * + * @var string + */ + const AFTERPAY = '5020'; + + /** + * From core. + * + * @param string|null $method Method. + * @return string|null + */ + public static function from_core( $method ) { + switch ( $method ) { + case PaymentMethods::AFTERPAY: + return self::AFTERPAY; + + case PaymentMethods::BANCONTACT: + return self::BCMC; + + case PaymentMethods::IDEAL: + return self::IDEAL; + + case PaymentMethods::PAYPAL: + return self::PAYPAL; + + case PaymentMethods::MAESTRO: + return self::MAESTRO; + + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Client.php new file mode 100644 index 00000000..cdfe9b89 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Client.php @@ -0,0 +1,82 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +use Pronamic\WordPress\Pay\Facades\Http; + +/** + * Payvision client + * + * @link https://github.com/payvisionpayments/php/blob/master/generatepaymentform.php + * @author Remco Tolsma + * @version 1.0.5 + * @since 1.0.0 + */ +class Client { + /** + * Config. + * + * @var Config + */ + private $config; + + /** + * Constructs and initializes an Payvision client object. + * + * @param Config $config Payvision config. + */ + public function __construct( Config $config ) { + $this->config = $config; + } + + /** + * Send request with the specified action and parameters + * + * @param string $method Payvision API method. + * @param string $path Path. + * @param object|string[]|string|false $request Request object. + * @return object + * @throws \Exception Throws exception when error occurs. + */ + public function send_request( $method, $path, $request = null ) { + // Request. + $authorization = 'Basic ' . \base64_encode( $this->config->get_username() . ':' . $this->config->get_password() ); + + $response = Http::request( + $this->config->get_endpoint_url( $path ), + array( + 'method' => $method, + 'headers' => array( + 'Authorization' => $authorization, + 'Content-Type' => 'application/json', + ), + 'body' => $request, + ) + ); + + $data = $response->json(); + + // Object. + if ( ! \is_object( $data ) ) { + throw new \Exception( + \sprintf( + 'Could not JSON decode Payvision response to an object, HTTP response: "%s %s", HTTP body: "%s".', + $response_code, + $response_message, + $body + ), + \intval( $response_code ) + ); + } + + return $data; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Config.php new file mode 100644 index 00000000..9532b553 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Config.php @@ -0,0 +1,133 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Config + * + * @author Remco Tolsma + * @version 1.1.1 + * @since 1.0.0 + */ +class Config extends GatewayConfig implements \JsonSerializable { + /** + * Business Id. + * + * @var string + */ + private $business_id; + + /** + * User. + * + * @var string + */ + private $username; + + /** + * Password. + * + * @var string + */ + private $password; + + /** + * Store ID. + * + * @var string + */ + private $store_id; + + /** + * Construct config object. + * + * @param string $mode Mode. + * @param string $business_id Business Id. + * @param string $username Username. + * @param string $password Password. + * @param string $store_id Store ID. + */ + public function __construct( $mode, $business_id, $username, $password, $store_id ) { + $this->mode = $mode; + $this->business_id = $business_id; + $this->username = $username; + $this->password = $password; + $this->store_id = $store_id; + } + + /** + * Get business ID. + * + * @return string + */ + public function get_business_id() { + return $this->business_id; + } + + /** + * Get username. + * + * @return string + */ + public function get_username() { + return $this->username; + } + + /** + * Get password. + * + * @return string + */ + public function get_password() { + return $this->password; + } + + /** + * Get store ID. + * + * @return string + */ + public function get_store_id() { + return $this->store_id; + } + + /** + * Get endpoint URL. + * + * @link https://developers.acehubpaymentservices.com/docs/service-endpoints-and-headers + * @param string $path Path. + * @return string + */ + public function get_endpoint_url( $path ) { + if ( Gateway::MODE_TEST === $this->mode ) { + return SystemAddress::STAGING_SYSTEM . $path; + } + + return SystemAddress::LIVE_SYSTEM . $path; + } + + /** + * JSON serialize. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'mode' => $this->mode, + 'business_id' => $this->business_id, + 'username' => $this->username, + 'password' => $this->password, + 'store_id' => $this->store_id, + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Error.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Error.php new file mode 100644 index 00000000..576c4786 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Error.php @@ -0,0 +1,93 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Error + * + * @link https://developers.acehubpaymentservices.com/v3.3/reference#payment-3-1 + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Error extends \Exception { + /** + * Detailed message. + * + * A more detailed error message when available. If not available, contains the same as error.message. + * + * @var string + */ + private $detailed_message; + + /** + * Construct and initialize payment response + * + * @param int $code Code. + * @param string $message Message. + * @param string $detailed_message Detailed message. + * @return void + */ + public function __construct( $code, $message, $detailed_message ) { + parent::__construct( $message, $code ); + + $this->detailed_message = $detailed_message; + } + + /** + * From JSON. + * + * @param object $object Object. + * @return self + * @throws \JsonSchema\Exception\ValidationException Throws exception when JSON is not valid. + */ + public static function from_json( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/error.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + /* phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase */ + return new self( $object->code, $object->message, $object->detailedMessage ); + } + + /** + * Get code. + * + * @return int|string + */ + public function get_code() { + return $this->getCode(); + } + + /** + * Get message. + * + * @return string + */ + public function get_message() { + return $this->getMessage(); + } + + /** + * Get detailed message. + * + * @return string + */ + public function get_detailed_message() { + return $this->detailed_message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Gateway.php new file mode 100644 index 00000000..8fe79927 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Gateway.php @@ -0,0 +1,208 @@ + + * @copyright 2005-2019 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Gateway + * + * @link https://github.com/payvisionpayments/php/blob/master/generatepaymentform.php + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Gateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + private $client; + + /** + * Constructs and initializes an Payvision gateway. + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $this->client = new Client( $config ); + } + + /** + * Get issuers + * + * @see Core_Gateway::get_issuers() + * @return array>> + */ + public function get_issuers() { + return array( + array( + 'options' => array( + IssuerIdIDeal::ABN_AMRO => \__( 'ABN Amro', 'pronamic_ideal' ), + IssuerIdIDeal::RABOBANK => \__( 'Rabobank', 'pronamic_ideal' ), + IssuerIdIDeal::ING => \__( 'ING', 'pronamic_ideal' ), + IssuerIdIDeal::SNS => \__( 'SNS Bank', 'pronamic_ideal' ), + IssuerIdIDeal::ASN => \__( 'ASN Bank', 'pronamic_ideal' ), + IssuerIdIDeal::REGIOBANK => \__( 'RegioBank', 'pronamic_ideal' ), + IssuerIdIDeal::TRIODOS => \__( 'Triodos Bank', 'pronamic_ideal' ), + IssuerIdIDeal::KNAB => \__( 'Knab', 'pronamic_ideal' ), + IssuerIdIDeal::VAN_LANSCHOT_BANKIERS => \__( 'Van Lanschot Bankiers', 'pronamic_ideal' ), + IssuerIdIDeal::BUNQ => \__( 'Bunq', 'pronamic_ideal' ), + IssuerIdIDeal::MONEYOU => \__( 'Moneyou', 'pronamic_ideal' ), + IssuerIdIDeal::HANDELSBANKEN => \__( 'Handelsbanken', 'pronamic_ideal' ), + ), + ), + ); + } + + /** + * Get supported payment methods + * + * @see Core_Gateway::get_supported_payment_methods() + * @return array + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::IDEAL, + ); + } + + /** + * Is payment method required to start transaction? + * + * @see Core_Gateway::payment_method_is_required() + * @return true + */ + public function payment_method_is_required() { + return true; + } + + /** + * Start. + * + * @param Payment $payment Payment. + * @return void + * @throws \InvalidArgumentException Throws exception if payment ID or currency is empty. + */ + public function start( Payment $payment ) { + $header = new RequestHeader( $this->config->get_business_id() ); + + $payment_id = $payment->get_id(); + + if ( null === $payment_id ) { + throw new \InvalidArgumentException( 'Can not start payment with empty ID.' ); + } + + $currency_code = $payment->get_total_amount()->get_currency()->get_alphabetic_code(); + + if ( null === $currency_code ) { + throw new \InvalidArgumentException( 'Can not start payment with empty currency code.' ); + } + + $tracking_code = TrackingCode::from_id( $payment_id ); + + $transaction = new Transaction( + $this->config->get_store_id(), + $payment->get_total_amount()->get_value(), + $currency_code, + $tracking_code + ); + + $transaction->set_purchase_id( \strval( $payment->get_id() ) ); + $transaction->set_return_url( $payment->get_return_url() ); + $transaction->set_brand_id( BrandId::from_core( $payment->get_method() ) ); + + $payment_request = new PaymentRequest( $header, $transaction ); + + // iDEAL. + if ( BrandId::IDEAL === $transaction->get_brand_id() ) { + $bank = new BankDetails(); + + $bank->set_issuer_id( $payment->get_issuer() ); + + $payment_request->set_bank( $bank ); + } + + $payment->set_meta( 'payvision_business_id', $this->config->get_business_id() ); + $payment->set_meta( 'payvision_tracking_code', \strval( $tracking_code ) ); + + // Create payment. + $object = $this->client->send_request( 'POST', '/gateway/v3/payments', \wp_json_encode( $payment_request ) ); + + $payment_response = PaymentResponse::from_json( $object ); + + $error = $payment_response->get_error(); + + if ( null !== $error ) { + throw $error; + } + + if ( null !== $payment_response->redirect ) { + if ( null !== $payment_response->redirect->url ) { + $payment->set_action_url( $payment_response->redirect->url ); + } + } + + if ( null !== $payment_response->transaction ) { + $payment->set_transaction_id( $payment_response->transaction->id ); + } + } + + /** + * Update status of the specified payment. + * + * @param Payment $payment Payment. + * @return void + */ + public function update_status( Payment $payment ) { + $id = $payment->get_transaction_id(); + + // Get payment. + $object = $this->client->send_request( + 'GET', + '/gateway/v3/payments/' . $id, + array( + 'businessId' => $payment->get_meta( 'payvision_business_id' ), + ) + ); + + $response = PaymentResponse::from_json( $object ); + + // Update payment status. + $result_code = $response->get_result(); + + $status = ResultCode::to_core( $result_code ); + + if ( null !== $status ) { + $payment->set_status( $status ); + } + + // Add error as note. + $error = $response->get_error(); + + if ( null !== $error ) { + $payment->add_note( \sprintf( '%s: %s', $error->get_code(), $error->get_message() ) ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Integration.php new file mode 100644 index 00000000..87674c0c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Integration.php @@ -0,0 +1,159 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; + +/** + * Integration + * + * @author Remco Tolsma + * @version 1.1.2 + * @since 1.0.0 + */ +class Integration extends AbstractGatewayIntegration { + /** + * REST route namespace. + * + * @var string + */ + const REST_ROUTE_NAMESPACE = 'pronamic-pay/payvision/v1'; + + /** + * Construct Payvision integration. + * + * @param array> $args Arguments. + */ + public function __construct( $args = array() ) { + $args = \wp_parse_args( + $args, + array( + 'id' => 'payvision', + 'name' => 'Payvision', + 'provider' => 'payvision', + 'url' => \__( 'https://www.payvision.com/', 'pronamic_ideal' ), + 'product_url' => \__( 'https://www.payvision.com/', 'pronamic_ideal' ), + 'dashboard_url' => 'https://tools.payvisionservices.com/acecontrol/dashboard', + 'manual_url' => \__( + 'https://www.pronamic.eu/manuals/using-payvision-pronamic-pay/', + 'pronamic_ideal' + ), + 'supports' => array(), + ) + ); + + parent::__construct( $args ); + } + + /** + * Setup. + */ + public function setup() { + \add_filter( 'pronamic_gateway_configuration_display_value_' . $this->get_id(), array( $this, 'gateway_configuration_display_value' ), 10, 2 ); + } + + /** + * Gateway configuration display value. + * + * @param string $display_value Display value. + * @param int $post_id Gateway configuration post ID. + * @return string + */ + public function gateway_configuration_display_value( $display_value, $post_id ) { + $config = $this->get_config( $post_id ); + + return $config->get_business_id(); + } + + /** + * Get settings fields. + * + * @return array>> + */ + public function get_settings_fields() { + $fields = array(); + + // Business Id. + $fields[] = array( + 'section' => 'general', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_payvision_business_id', + 'title' => \_x( 'Business Id', 'payvision', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => \__( + 'A Merchant connecting to the platform is identified by its Business ID (“businessId”).', + 'pronamic_ideal' + ), + ); + + // User. + $fields[] = array( + 'section' => 'general', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_payvision_username', + 'title' => \_x( 'User', 'payvision', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + ); + + // Password. + $fields[] = array( + 'section' => 'general', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_payvision_password', + 'title' => \_x( 'Password', 'payvision', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + ); + + // Store Id. + $fields[] = array( + 'section' => 'general', + 'filter' => \FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_payvision_store_id', + 'title' => \_x( 'Store ID', 'payvision', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + ); + + // Return fields. + return $fields; + } + + /** + * Get configuration by post ID. + * + * @param int $post_id Post ID. + * @return Config + */ + public function get_config( $post_id ) { + $mode = $this->get_meta( $post_id, 'mode' ); + $business_id = $this->get_meta( $post_id, 'payvision_business_id' ); + $username = $this->get_meta( $post_id, 'payvision_username' ); + $password = $this->get_meta( $post_id, 'payvision_password' ); + $store_id = $this->get_meta( $post_id, 'payvision_store_id' ); + + return new Config( $mode, $business_id, $username, $password, $store_id ); + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + $config = $this->get_config( $post_id ); + + return new Gateway( $config ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/IssuerIdIDeal.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/IssuerIdIDeal.php new file mode 100644 index 00000000..2affd42b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/IssuerIdIDeal.php @@ -0,0 +1,105 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Issuer ID iDEAL + * + * @link https://developers.acehubpaymentservices.com/v3.3/reference#issuer-id-ideal + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class IssuerIdIDeal { + /** + * ABN Amro. + * + * @var string + */ + const ABN_AMRO = '10'; + + /** + * Rabobank. + * + * @var string + */ + const RABOBANK = '20'; + + /** + * ING. + * + * @var string + */ + const ING = '30'; + + /** + * SNS. + * + * @var string + */ + const SNS = '40'; + + /** + * ASN. + * + * @var string + */ + const ASN = '50'; + + /** + * RegioBank. + * + * @var string + */ + const REGIOBANK = '60'; + + /** + * Triodos. + * + * @var string + */ + const TRIODOS = '70'; + + /** + * Knab. + * + * @var string + */ + const KNAB = '80'; + + /** + * Van Lanschot Bankiers. + * + * @var string + */ + const VAN_LANSCHOT_BANKIERS = '100'; + + /** + * Bunq. + * + * @var string + */ + const BUNQ = '110'; + + /** + * Moneyou. + * + * @var string + */ + const MONEYOU = '120'; + + /** + * Handelsbanken. + * + * @var string + */ + const HANDELSBANKEN = '130'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/PaymentRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/PaymentRequest.php new file mode 100644 index 00000000..e22e6f4e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/PaymentRequest.php @@ -0,0 +1,78 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Payment Request + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentRequest implements \JsonSerializable { + /** + * Header. + * + * @var RequestHeader + */ + private $header; + + /** + * Transaction. + * + * @var Transaction + */ + private $transaction; + + /** + * Bank. + * + * @var BankDetails|null + */ + private $bank; + + /** + * Construct and initialize payment request + * + * @param RequestHeader $header Header. + * @param Transaction $transaction Transaction. + */ + public function __construct( RequestHeader $header, Transaction $transaction ) { + $this->header = $header; + $this->transaction = $transaction; + } + + /** + * Set bank. + * + * @param BankDetails|null $bank Bank. + * @return void + */ + public function set_bank( BankDetails $bank = null ) { + $this->bank = $bank; + } + + /** + * JSON serialize. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'action' => 'payment', + 'header' => $this->header, + 'body' => (object) array( + 'transaction' => $this->transaction, + 'bank' => $this->bank, + ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/PaymentResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/PaymentResponse.php new file mode 100644 index 00000000..d9e62e33 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/PaymentResponse.php @@ -0,0 +1,157 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Payment Response + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class PaymentResponse { + /** + * Redirect. + * + * @var RedirectDetails|null + */ + public $redirect; + + /** + * Transaction. + * + * @var TransactionResponse|null + */ + public $transaction; + + /** + * The result of the payment. + * + * @link https://developers.acehubpaymentservices.com/v3.3/reference#result-codes-2 + * @var int + */ + private $result; + + /** + * A short description of the result. + * + * @var string + */ + private $description; + + /** + * Header. + * + * @var ResponseHeader + */ + private $header; + + /** + * Error. + * + * @var Error|null + */ + private $error; + + /** + * Construct and initialize payment response + * + * @param int $result Result. + * @param string $description Description. + * @param ResponseHeader $header Header. + */ + public function __construct( $result, $description, $header ) { + $this->result = $result; + $this->description = $description; + $this->header = $header; + } + + /** + * From JSON. + * + * @param object $object Object. + * @return self + * @throws \JsonSchema\Exception\ValidationException Throws exception when JSON is not valid. + */ + public static function from_json( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/payment-response.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $response = new self( $object->result, $object->description, ResponseHeader::from_json( $object->header ) ); + + if ( \property_exists( $object->body, 'transaction' ) ) { + $response->transaction = TransactionResponse::from_json( $object->body->transaction ); + } + + if ( \property_exists( $object->body, 'redirect' ) ) { + $response->redirect = RedirectDetails::from_json( $object->body->redirect ); + } + + if ( \property_exists( $object->body, 'error' ) ) { + $response->set_error( Error::from_json( $object->body->error ) ); + } + + return $response; + } + + /** + * Get result. + * + * @return int + */ + public function get_result() { + return $this->result; + } + + /** + * Get description. + * + * @return string + */ + public function get_description() { + return $this->description; + } + + /** + * Get header. + * + * @return ResponseHeader + */ + public function get_header() { + return $this->header; + } + + /** + * Get error. + * + * @return Error|null + */ + public function get_error() { + return $this->error; + } + + /** + * Set error. + * + * @param Error|null $error Error. + * @return void + */ + public function set_error( Error $error = null ) { + $this->error = $error; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/RedirectDetails.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/RedirectDetails.php new file mode 100644 index 00000000..6b5f2711 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/RedirectDetails.php @@ -0,0 +1,66 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Redirect Details + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class RedirectDetails { + /** + * POST or GET (depends on brand used). The default value is POST. + * + * @var string|null + */ + public $method; + + /** + * URL including the query string to which your customer is redirected (depends on brand used). + * + * @var string|null + */ + public $url; + + /** + * From JSON. + * + * @link https://github.com/WordPress/wp-notify/blob/develop/includes/JsonUnserializable.php + * @param object $object Object. + * @return self + * @throws \JsonSchema\Exception\ValidationException Throws exception when JSON is not valid. + */ + public static function from_json( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/redirect.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + $redirect = new self(); + + if ( \property_exists( $object, 'method' ) ) { + $redirect->method = $object->method; + } + + if ( \property_exists( $object, 'url' ) ) { + $redirect->url = $object->url; + } + + return $redirect; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/RequestHeader.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/RequestHeader.php new file mode 100644 index 00000000..ba30460c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/RequestHeader.php @@ -0,0 +1,47 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Request Header + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class RequestHeader implements \JsonSerializable { + /** + * Business ID. + * + * @var string + */ + private $business_id; + + /** + * Construct and initialize request header. + * + * @param string $business_id Business ID. + */ + public function __construct( $business_id ) { + $this->business_id = $business_id; + } + + /** + * JSON serialize. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'businessId' => $this->business_id, + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/ResponseHeader.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/ResponseHeader.php new file mode 100644 index 00000000..ab47165c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/ResponseHeader.php @@ -0,0 +1,68 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Response Header + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class ResponseHeader { + /** + * The combined date and time in UTC (ISO8601). + * + * @var string + */ + private $request_timestamp; + + /** + * Construct and initialize request header. + * + * @param string $timestamp Request timestamp. + */ + public function __construct( $timestamp ) { + $this->request_timestamp = $timestamp; + } + + /** + * From JSON. + * + * @link https://github.com/WordPress/wp-notify/blob/develop/includes/JsonUnserializable.php + * @param object $object Object. + * @return self + * @throws \JsonSchema\Exception\ValidationException Throws exception when JSON is not valid. + */ + public static function from_json( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/response-header.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + /* phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase */ + return new self( $object->requestTimestamp ); + } + + /** + * Get request timestamp. + * + * @return string + */ + public function get_request_timestamp() { + return $this->request_timestamp; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/ResultCode.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/ResultCode.php new file mode 100644 index 00000000..b9d13d62 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/ResultCode.php @@ -0,0 +1,117 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Result Code + * + * @link https://developers.acehubpaymentservices.com/reference#result-codes-2 + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class ResultCode { + /** + * Customer processing error. + * + * Error or cancellation of customer at supplier. For example, the customer + * abandoned their transaction at the supplier. + * + * @var int + */ + const CUSTOMER_ERROR = -10; + + /** + * Declined. + * + * Declines, etc. In these cases the processing was performed correctly, + * but the end-result for the customer is not. + * + * @var int + */ + const DECLINED = -4; + + /** + * Failed. + * + * The transaction failed because of a processing error at Payvision. + * + * @var int + */ + const FAILED = -2; + + /** + * Ok. + * + * The transaction was processed successfully. + * + * @var int + */ + const OK = 0; + + /** + * Waiting. + * + * The transaction was initiated successfully, but a payment was not yet made by the + * customer or not yet confirmed by the bank. Occurs for brands for which customers + * have to make a payment separately (like Boletos) or where the bank does not + * immediately confirm a payment (like SEPA). + * + * @var int + */ + const WAITING = 1; + + /** + * Pending. + * + * Pending transaction, the payment was initiated and waiting for the customer to + * complete the payment at the bank or payment processor. + * + * @var int + */ + const PENDING = 2; + + /** + * Timeout. + * + * The payment timeout expired before the customer completed the payment. + * + * @var int + */ + const TIMEOUT = 4; + + /** + * Transform Payvision result code to WordPress payment status. + * + * @param int|null $result_code Payvision result code. + * @return string|null WordPress payment status. + */ + public static function to_core( $result_code ) { + switch ( $result_code ) { + case self::CUSTOMER_ERROR: + return PaymentStatus::CANCELLED; + case self::DECLINED: + case self::FAILED: + return PaymentStatus::FAILURE; + case self::TIMEOUT: + return PaymentStatus::EXPIRED; + case self::PENDING: + case self::WAITING: + return PaymentStatus::OPEN; + case self::OK: + return PaymentStatus::SUCCESS; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/SystemAddress.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/SystemAddress.php new file mode 100644 index 00000000..709de508 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/SystemAddress.php @@ -0,0 +1,35 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * System Address + * + * @link https://developers.acehubpaymentservices.com/docs/service-endpoints-and-headers + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class SystemAddress { + /** + * Staging system (used for merchant integration tests). + * + * @var string + */ + const STAGING_SYSTEM = 'https://stagconnect.acehubpaymentservices.com'; + + /** + * Live system (used for live transaction processing). + * + * @var string + */ + const LIVE_SYSTEM = 'https://connect.acehubpaymentservices.com'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/TrackingCode.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/TrackingCode.php new file mode 100644 index 00000000..a428b9f7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/TrackingCode.php @@ -0,0 +1,73 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Tracking Code + * + * @link https://developers.acehubpaymentservices.com/v3.3/reference#payment-3-1 + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class TrackingCode implements \JsonSerializable { + /** + * Code. + * + * Your Unique Transaction Reference. Minimum length: 8 characters. + * + * @var string + */ + private $code; + + /** + * Construct and initialize tracking code. + * + * @param string $code Code. + * @return void + * @throws \InvalidArgumentException Throws exception if length of code is less than 8 characters. + */ + public function __construct( $code ) { + if ( \strlen( $code ) < 8 ) { + throw new \InvalidArgumentException( 'Minimum length: 8 characters.' ); + } + + $this->code = $code; + } + + /** + * From ID. + * + * @param string|int $id ID. + * @return self + */ + public static function from_id( $id ) { + return new self( \sprintf( '%08s', $id ) ); + } + + /** + * JSON serialize. + * + * @return string + */ + public function jsonSerialize() { + return $this->code; + } + + /** + * To string. + * + * @return string + */ + public function __toString() { + return $this->code; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Transaction.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Transaction.php new file mode 100644 index 00000000..7d5ae237 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/Transaction.php @@ -0,0 +1,153 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Transaction + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class Transaction implements \JsonSerializable { + /** + * Store ID. + * + * @var string + */ + private $store_id; + + /** + * Amount. + * + * @var string|float + */ + private $amount; + + /** + * Currency code. + * + * @var string + */ + private $currency_code; + + /** + * Tracking code. + * + * @var TrackingCode + */ + private $tracking_code; + + /** + * Brand ID. + * + * Identifies the transaction payment brand. Mandatory for all transactions, except for card transactions when your configuration allows the presence of the card block to be enough. See brand list. + * + * @var string|null + */ + private $brand_id; + + /** + * Purchase ID. + * + * @var string|null + */ + private $purchase_id; + + /** + * Return URL. + * + * @var string|null + */ + private $return_url; + + /** + * Construct and initialize request header. + * + * @param string $store_id Store ID. + * @param string|float $amount Amount. + * @param string $currency_code Currency code. + * @param TrackingCode $tracking_code Tracking code. + */ + public function __construct( $store_id, $amount, $currency_code, $tracking_code ) { + $this->store_id = $store_id; + $this->amount = $amount; + $this->currency_code = $currency_code; + $this->tracking_code = $tracking_code; + } + + /** + * Get brand ID. + * + * @return string|null + */ + public function get_brand_id() { + return $this->brand_id; + } + + /** + * Set brand ID. + * + * @param string|null $brand_id Brand ID. + * @return void + */ + public function set_brand_id( $brand_id ) { + $this->brand_id = $brand_id; + } + + /** + * Set purchase ID. + * + * @param string|null $purchase_id Purchase ID. + * @return void + */ + public function set_purchase_id( $purchase_id ) { + $this->purchase_id = $purchase_id; + } + + /** + * Set return URL. + * + * @param string|null $return_url Return URL. + * @return void + */ + public function set_return_url( $return_url ) { + $this->return_url = $return_url; + } + + /** + * JSON serialize. + * + * @return object + */ + public function jsonSerialize() { + $data = array( + 'storeId' => $this->store_id, + 'amount' => $this->amount, + 'currencyCode' => $this->currency_code, + 'trackingCode' => $this->tracking_code, + ); + + if ( null !== $this->brand_id ) { + $data['brandId'] = $this->brand_id; + } + + if ( null !== $this->purchase_id ) { + $data['purchaseId'] = $this->purchase_id; + } + + if ( null !== $this->return_url ) { + $data['returnUrl'] = $this->return_url; + } + + return (object) $data; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/TransactionResponse.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/TransactionResponse.php new file mode 100644 index 00000000..17e04284 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/payvision/src/TransactionResponse.php @@ -0,0 +1,142 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Payvision + */ + +namespace Pronamic\WordPress\Pay\Gateways\Payvision; + +/** + * Transaction Response + * + * @author Remco Tolsma + * @version 1.0.0 + * @since 1.0.0 + */ +class TransactionResponse { + /** + * Unique transaction ID given to each transaction. + * + * @var string + */ + public $id; + + /** + * Action. + * + * Actual action performed. In case a separate capture is NOT possible, the transaction will be interpreted and performed as a payment transaction and cannot be cancelled, but can be refunded and with result=0 considered as a “successful payment". + * + * @var string + */ + private $action; + + /** + * Your unique transaction reference. + * + * @var string + */ + private $tracking_code; + + /** + * Amount of the transaction. + * + * @var string|float|int + */ + private $amount; + + /** + * Currency code of the amount of the transaction. + * + * @var string + */ + private $currency_code; + + /** + * Construct and initialize transaction response. + * + * @param string $action Action. + * @param string $id ID. + * @param string $tracking_code Tracking code. + * @param string|float|int $amount Amount. + * @param string $currency_code Currency code. + */ + public function __construct( $action, $id, $tracking_code, $amount, $currency_code ) { + $this->action = $action; + $this->id = $id; + $this->tracking_code = $tracking_code; + $this->amount = $amount; + $this->currency_code = $currency_code; + } + + /** + * From JSON. + * + * @link https://github.com/WordPress/wp-notify/blob/develop/includes/JsonUnserializable.php + * @param object $object Object. + * @return self + * @throws \JsonSchema\Exception\ValidationException Throws exception when JSON is not valid. + */ + public static function from_json( $object ) { + $validator = new \JsonSchema\Validator(); + + $validator->validate( + $object, + (object) array( + '$ref' => 'file://' . \realpath( __DIR__ . '/../json-schemas/transaction-response.json' ), + ), + \JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS + ); + + /* phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase */ + return new self( $object->action, $object->id, $object->trackingCode, $object->amount, $object->currencyCode ); + } + + /** + * Get action. + * + * @return string + */ + public function get_action() { + return $this->action; + } + + /** + * Get id. + * + * @return string + */ + public function get_id() { + return $this->id; + } + + /** + * Get tracking code. + * + * @return string + */ + public function get_tracking_code() { + return $this->tracking_code; + } + + /** + * Get amount. + * + * @return string|float|int + */ + public function get_amount() { + return $this->amount; + } + + /** + * Get currency code. + * + * @return string + */ + public function get_currency_code() { + return $this->currency_code; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/CancelReservationRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/CancelReservationRequest.php new file mode 100644 index 00000000..0176aeb1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/CancelReservationRequest.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow cancel reservation request + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.1 + */ +class CancelReservationRequest extends Request { + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array( + $this->get_parameter( 'trxid' ), + + /* + * Indien er geen gebruik wordt gemaakt van de shopid dan kunt u deze weglaten uit de berekening. + */ + $this->get_parameter( 'shopid' ), + + $this->get_parameter( 'merchantid' ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Client.php new file mode 100644 index 00000000..3c43b0bf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Client.php @@ -0,0 +1,329 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Gateways\Sisow\XML\ErrorParser; +use Pronamic\WordPress\Pay\Gateways\Sisow\XML\InvoiceParser; +use Pronamic\WordPress\Pay\Gateways\Sisow\XML\MerchantParser; +use Pronamic\WordPress\Pay\Gateways\Sisow\XML\ReservationParser; +use Pronamic\WordPress\Pay\Gateways\Sisow\XML\TransactionParser; +use SimpleXMLElement; + +/** + * Title: Sisow + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class Client { + /** + * Sisow REST API endpoint URL. + * + * @var string + */ + const API_URL = 'https://www.sisow.nl/Sisow/iDeal/RestHandler.ashx'; + + /** + * Sisow merchant ID. + * + * @var string + */ + private $merchant_id; + + /** + * Sisow merchant key. + * + * @var string + */ + private $merchant_key; + + /** + * Indicator to use test mode or not. + * + * @var boolean + */ + private $test_mode; + + /** + * Constructs and initializes a Sisow client object. + * + * @param string $merchant_id Merchant ID. + * @param string $merchant_key Merchant key. + */ + public function __construct( $merchant_id, $merchant_key ) { + $this->merchant_id = $merchant_id; + $this->merchant_key = $merchant_key; + } + + /** + * Set test mode. + * + * @param boolean $test_mode True if test mode, false otherwise. + */ + public function set_test_mode( $test_mode ) { + $this->test_mode = $test_mode; + } + + /** + * Send request with the specified action and parameters. + * + * @param string $method Method. + * @param Request|null $request Request. + * + * @return false|SimpleXMLElement + */ + private function send_request( $method, Request $request = null ) { + $url = self::API_URL . '/' . $method; + + if ( null !== $request ) { + $request->sign( $this->merchant_key ); + } + + $result = Core_Util::remote_get_body( + $url, + 200, + array( + 'method' => 'POST', + 'body' => ( null === $request ) ? null : $request->get_parameters(), + ) + ); + + if ( ! is_string( $result ) ) { + return false; + } + + // XML. + $xml = Core_Util::simplexml_load_string( $result ); + + return $xml; + } + + /** + * Parse the specified document and return parsed result. + * + * @param SimpleXMLElement $document Document. + * + * @return Invoice|Merchant|Reservation|Transaction|Error + * @throws \Exception Throws exception on unknown Sisow message. + */ + private function parse_document( SimpleXMLElement $document ) { + $name = $document->getName(); + + switch ( $name ) { + case 'cancelreservationresponse': + $reservation = ReservationParser::parse( $document->reservation ); + + return $reservation; + case 'checkmerchantresponse': + $merchant = MerchantParser::parse( $document->merchant ); + + return $merchant; + case 'errorresponse': + $sisow_error = ErrorParser::parse( $document->error ); + + $message = sprintf( '%s: %s', $sisow_error->code, $sisow_error->message ); + + throw new \Exception( $message ); + case 'invoiceresponse': + $invoice = InvoiceParser::parse( $document->invoice ); + + return $invoice; + case 'statusresponse': + case 'transactionrequest': + $transaction = TransactionParser::parse( $document->transaction ); + + return $transaction; + default: + throw new \Exception( + /* translators: %s: XML document element name */ + sprintf( __( 'Unknwon Sisow message (%s)', 'pronamic_ideal' ), $name ) + ); + } + } + + /** + * Get directory. + * + * @return array|false + */ + public function get_directory() { + if ( $this->test_mode ) { + return array( + '99' => __( 'Sisow Bank (test)', 'pronamic_ideal' ), + ); + } + + // Request. + $result = $this->send_request( RequestMethods::DIRECTORY_REQUEST ); + + if ( false === $result ) { + return false; + } + + // Parse. + $directory = array(); + + foreach ( $result->directory->issuer as $issuer ) { + $id = (string) $issuer->issuerid; + $name = (string) $issuer->issuername; + + $directory[ $id ] = $name; + } + + return $directory; + } + + /** + * Get merchant. + * + * @param MerchantRequest $merchant_request Merchant request. + * + * @return Merchant|bool + */ + public function get_merchant( MerchantRequest $merchant_request ) { + // Request. + $response = $this->send_request( RequestMethods::CHECK_MERCHANT_REQUEST, $merchant_request ); + + if ( false === $response ) { + return false; + } + + // Parse. + $message = $this->parse_document( $response ); + + if ( $message instanceof Merchant ) { + return $message; + } + + return false; + } + + /** + * Create an transaction with the specified parameters. + * + * @param TransactionRequest $request Transaction request. + * + * @return Transaction|false + * + * @throws \Exception Throws exception on transaction error. + */ + public function create_transaction( TransactionRequest $request ) { + // Request. + $response = $this->send_request( RequestMethods::TRANSACTION_REQUEST, $request ); + + if ( false === $response ) { + return false; + } + + // Parse. + $message = $this->parse_document( $response ); + + if ( $message instanceof Transaction ) { + return $message; + } + + return false; + } + + /** + * Create invoice for reservation payment. + * + * @param InvoiceRequest $request Invoice request. + * + * @return Invoice|false + * + * @throws \Exception Throws exception on error. + */ + public function create_invoice( InvoiceRequest $request ) { + // Request. + $response = $this->send_request( RequestMethods::INVOICE_REQUEST, $request ); + + if ( false === $response ) { + return false; + } + + // Parse. + $message = $this->parse_document( $response ); + + if ( $message instanceof Invoice ) { + return $message; + } + + return false; + } + + /** + * Cancel reservation payment. + * + * @param CancelReservationRequest $request Reservation cancellation request. + * + * @return Reservation|false + * + * @throws \Exception Throws exception on error. + */ + public function cancel_reservation( CancelReservationRequest $request ) { + $request->set_parameter( 'shopid', null ); + + // Request. + $response = $this->send_request( RequestMethods::CANCEL_RESERVATION_REQUEST, $request ); + + if ( false === $response ) { + return false; + } + + // Parse. + $message = $this->parse_document( $response ); + + if ( $message instanceof Reservation ) { + return $message; + } + + return false; + } + + /** + * Get the status of the specified transaction ID. + * + * @param StatusRequest $request Status request object. + * + * @return Transaction|false + * + * @throws \InvalidArgumentException Throws exception on invalid transaction ID. + */ + public function get_status( StatusRequest $request ) { + $transaction_id = $request->get_parameter( 'trxid' ); + + if ( empty( $transaction_id ) ) { + throw new \InvalidArgumentException( 'Invalid transction ID.' ); + } + + // Request. + $response = $this->send_request( RequestMethods::STATUS_REQUEST, $request ); + + if ( false === $response ) { + return false; + } + + // Parse. + $message = $this->parse_document( $response ); + + if ( $message instanceof Transaction ) { + return $message; + } + + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Config.php new file mode 100644 index 00000000..c208a804 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Config.php @@ -0,0 +1,46 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Title: Sisow config + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class Config extends GatewayConfig { + /** + * Merchant ID. + * + * @var string + */ + public $merchant_id; + + /** + * Merchant key. + * + * @var string + */ + public $merchant_key; + + /** + * Shop ID. + * + * @var string + */ + public $shop_id; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Error.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Error.php new file mode 100644 index 00000000..8bcce081 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Error.php @@ -0,0 +1,57 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow error + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class Error { + /** + * Sisow error code. + * + * @var string + */ + public $code; + + /** + * Sisow error message. + * + * @var string + */ + public $message; + + /** + * Constructs and initializes an Sisow error object. + * + * @param string $code Code. + * @param string $message Message. + */ + public function __construct( $code, $message ) { + $this->code = $code; + $this->message = $message; + } + + /** + * Create an string representation of this object. + * + * @return string + */ + public function __toString() { + return $this->code . ' ' . $this->message; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Gateway.php new file mode 100644 index 00000000..b5215793 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Gateway.php @@ -0,0 +1,524 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_Statuses; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentLineType; + +/** + * Title: Sisow gateway + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class Gateway extends Core_Gateway { + /** + * Client. + * + * @var Client + */ + protected $client; + + /** + * Constructs and initialize an Sisow gateway + * + * @param Config $config Config. + */ + public function __construct( Config $config ) { + parent::__construct( $config ); + + $this->set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + 'reservation_payments', + ); + + // Client. + $this->client = new Client( $config->merchant_id, $config->merchant_key ); + $this->client->set_test_mode( self::MODE_TEST === $config->mode ); + } + + /** + * Get issuers + * + * @see Core_Gateway::get_issuers() + */ + public function get_issuers() { + $groups = array(); + + $result = $this->client->get_directory(); + + if ( $result ) { + $groups[] = array( + 'options' => $result, + ); + } + + return $groups; + } + + /** + * Get available payment methods. + * + * @see Core_Gateway::get_available_payment_methods() + */ + public function get_available_payment_methods() { + if ( self::MODE_TEST === $this->config->mode ) { + return null; + } + + $payment_methods = array(); + + // Merchant request. + $request = new MerchantRequest( $this->config->merchant_id ); + + // Get merchant. + try { + $result = $this->client->get_merchant( $request ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'sisow_error', $e->getMessage() ); + + return $payment_methods; + } + + foreach ( $result->payments as $method ) { + // Transform to WordPress payment methods. + $payment_method = Methods::transform_gateway_method( $method ); + + if ( $payment_method ) { + $payment_methods[] = $payment_method; + } + } + + /** + * Add active payment methods which are not returned by Sisow in merchant response. + * + * @link https://github.com/wp-pay-gateways/sisow/issues/1 + */ + if ( false !== \array_search( PaymentMethods::IDEAL, $payment_methods, true ) ) { + $payment_methods[] = PaymentMethods::BANCONTACT; + $payment_methods[] = PaymentMethods::BANK_TRANSFER; + $payment_methods[] = PaymentMethods::BELFIUS; + $payment_methods[] = PaymentMethods::BUNQ; + $payment_methods[] = PaymentMethods::EPS; + $payment_methods[] = PaymentMethods::GIROPAY; + $payment_methods[] = PaymentMethods::KBC; + $payment_methods[] = PaymentMethods::SOFORT; + + $payment_methods = \array_unique( $payment_methods ); + + // Renumber keys. + $payment_methods = \array_values( $payment_methods ); + } + + return $payment_methods; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::AFTERPAY, + PaymentMethods::BANK_TRANSFER, + PaymentMethods::BANCONTACT, + PaymentMethods::BELFIUS, + PaymentMethods::BILLINK, + PaymentMethods::BUNQ, + PaymentMethods::CAPAYABLE, + PaymentMethods::IN3, + PaymentMethods::CREDIT_CARD, + PaymentMethods::FOCUM, + PaymentMethods::GIROPAY, + PaymentMethods::IDEAL, + PaymentMethods::IDEALQR, + PaymentMethods::KLARNA_PAY_LATER, + PaymentMethods::PAYPAL, + PaymentMethods::SOFORT, + ); + } + + /** + * Is payment method required to start transaction? + * + * @see Core_Gateway::payment_method_is_required() + */ + public function payment_method_is_required() { + return true; + } + + /** + * Start + * + * @param Payment $payment Payment. + * + * @throws \Exception Throws exception on transaction error. + * @see Core_Gateway::start() + */ + public function start( Payment $payment ) { + // Order and purchase ID. + $order_id = $payment->get_order_id(); + $purchase_id = strval( empty( $order_id ) ? $payment->get_id() : $order_id ); + + // Maximum length for purchase ID is 16 characters, otherwise an error will occur: + // ideal_sisow_error - purchaseid too long (16). + $purchase_id = substr( $purchase_id, 0, 16 ); + + // New transaction request. + $request = new TransactionRequest( + $this->config->merchant_id, + $this->config->shop_id + ); + + $request->merge_parameters( + array( + 'payment' => Methods::transform( $payment->get_method(), $payment->get_method() ), + 'purchaseid' => substr( $purchase_id, 0, 16 ), + 'entrancecode' => $payment->get_entrance_code(), + 'amount' => $payment->get_total_amount()->get_cents(), + 'description' => substr( $payment->get_description(), 0, 32 ), + 'testmode' => ( self::MODE_TEST === $this->config->mode ) ? 'true' : 'false', + 'returnurl' => $payment->get_return_url(), + 'cancelurl' => $payment->get_return_url(), + 'notifyurl' => $payment->get_return_url(), + 'callbackurl' => $payment->get_return_url(), + // Other parameters. + 'issuerid' => $payment->get_issuer(), + 'billing_mail' => $payment->get_email(), + ) + ); + + // Payment method. + $this->set_payment_method( null === $payment->get_method() ? PaymentMethods::IDEAL : $payment->get_method() ); + + // Additional parameters for payment method. + if ( PaymentMethods::IDEALQR === $payment->get_method() ) { + $request->set_parameter( 'qrcode', 'true' ); + } + + // Customer. + if ( null !== $payment->get_customer() ) { + $customer = $payment->get_customer(); + + $request->merge_parameters( + array( + 'ipaddress' => $customer->get_ip_address(), + 'gender' => $customer->get_gender(), + ) + ); + + if ( null !== $customer->get_locale() ) { + /* + * @link https://github.com/wp-pay-gateways/sisow/tree/feature/post-pay/documentation#parameter-locale + */ + $sisow_locale = strtoupper( substr( $customer->get_locale(), -2 ) ); + + $request->set_parameter( 'locale', $sisow_locale ); + } + + if ( null !== $customer->get_birth_date() ) { + $request->set_parameter( 'birthdate', $customer->get_birth_date()->format( 'dmY' ) ); + } + } + + // Billing address. + if ( null !== $payment->get_billing_address() ) { + $address = $payment->get_billing_address(); + + if ( null !== $address->get_name() ) { + $name = $address->get_name(); + + $request->merge_parameters( + array( + 'billing_firstname' => $name->get_first_name(), + 'billing_lastname' => $name->get_last_name(), + ) + ); + + // Remove accents from first name for AfterPay. + if ( PaymentMethods::AFTERPAY === $payment->get_method() ) { + $request->set_parameter( 'billing_firstname', remove_accents( $name->get_first_name() ) ); + } + } + + $request->merge_parameters( + array( + 'billing_mail' => $address->get_email(), + 'billing_company' => $address->get_company_name(), + 'billing_coc' => $address->get_coc_number(), + 'billing_address1' => $address->get_line_1(), + 'billing_address2' => $address->get_line_2(), + 'billing_zip' => $address->get_postal_code(), + 'billing_city' => $address->get_city(), + 'billing_country' => $address->get_country_name(), + 'billing_countrycode' => $address->get_country_code(), + 'billing_phone' => $address->get_phone(), + ) + ); + } + + // Shipping address. + if ( null !== $payment->get_shipping_address() ) { + $address = $payment->get_shipping_address(); + + if ( null !== $address->get_name() ) { + $name = $address->get_name(); + + $request->merge_parameters( + array( + 'shipping_firstname' => $name->get_first_name(), + 'shipping_lastname' => $name->get_last_name(), + ) + ); + } + + $request->merge_parameters( + array( + 'shipping_mail' => $address->get_email(), + 'shipping_company' => $address->get_company_name(), + 'shipping_address1' => $address->get_line_1(), + 'shipping_address2' => $address->get_line_2(), + 'shipping_zip' => $address->get_postal_code(), + 'shipping_city' => $address->get_city(), + 'shipping_country' => $address->get_country_name(), + 'shipping_countrycode' => $address->get_country_code(), + 'shipping_phone' => $address->get_phone(), + ) + ); + } + + // Lines. + $lines = $payment->get_lines(); + + if ( null !== $lines ) { + $x = 1; + + foreach ( $lines as $line ) { + // Product ID. + $product_id = $line->get_id(); + + switch ( $line->get_type() ) { + case PaymentLineType::SHIPPING: + $product_id = 'shipping'; + + break; + case PaymentLineType::FEE: + $product_id = 'paymentfee'; + + break; + } + + // Price. + $unit_price = null; + + if ( null !== $line->get_unit_price() ) { + $unit_price = $line->get_unit_price()->get_excluding_tax()->get_cents(); + } + + // Request parameters. + $request->merge_parameters( + array( + 'product_id_' . $x => $product_id, + 'product_description_' . $x => $line->get_name(), + 'product_quantity_' . $x => $line->get_quantity(), + 'product_netprice_' . $x => $unit_price, + 'product_total_' . $x => $line->get_total_amount()->get_including_tax()->get_cents(), + 'product_nettotal_' . $x => $line->get_total_amount()->get_excluding_tax()->get_cents(), + ) + ); + + // Tax request parameters. + $tax_amount = $line->get_tax_amount(); + + if ( null !== $tax_amount ) { + $request->set_parameter( 'product_tax_' . $x, $tax_amount->get_minor_units() ); + } + + $tax_percentage = $line->get_total_amount()->get_tax_percentage(); + + if ( null !== $tax_percentage ) { + $request->set_parameter( 'product_taxrate_' . $x, $tax_percentage * 100 ); + } + + $x++; + } + } + + // Create transaction. + $result = $this->client->create_transaction( $request ); + + if ( false !== $result ) { + $payment->set_transaction_id( $result->id ); + $payment->set_action_url( $result->issuer_url ); + } + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + $transaction_id = $payment->get_transaction_id(); + $merchant_id = $this->config->merchant_id; + + // Process notify and callback requests for payments without transaction ID. + if ( empty( $transaction_id ) && Core_Util::input_has_vars( \INPUT_GET, array( 'trxid', 'ec', 'status', 'sha1' ) ) ) { + $transaction_id = \filter_input( \INPUT_GET, 'trxid' ); + $entrance_code = \filter_input( \INPUT_GET, 'ec' ); + $status = \filter_input( \INPUT_GET, 'status' ); + $signature = \filter_input( \INPUT_GET, 'sha1' ); + + $notify = new NotifyRequest( $transaction_id, $entrance_code, $status, $merchant_id ); + + // Set status if signature validates. + if ( $notify->get_signature( $this->config->merchant_key ) === $signature ) { + $payment->set_status( Statuses::transform( $status ) ); + } + + return; + } + + // Status request. + $request = new StatusRequest( + $transaction_id, + $merchant_id, + $this->config->shop_id + ); + + try { + $result = $this->client->get_status( $request ); + + if ( false === $result ) { + return; + } + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'sisow_error', $e->getMessage() ); + + return; + } + + // Set status. + $payment->set_status( Statuses::transform( $result->status ) ); + + // Set consumer details. + $consumer_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_details ) { + $consumer_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_details ); + } + + $consumer_details->set_name( $result->consumer_name ); + $consumer_details->set_account_number( $result->consumer_account ); + $consumer_details->set_city( $result->consumer_city ); + $consumer_details->set_iban( $result->consumer_iban ); + $consumer_details->set_bic( $result->consumer_bic ); + } + + /** + * Create invoice. + * + * @param Payment $payment Payment. + * + * @return bool + */ + public function create_invoice( $payment ) { + $transaction_id = $payment->get_transaction_id(); + + if ( empty( $transaction_id ) ) { + return false; + } + + // Invoice request. + $request = new InvoiceRequest( + $this->config->merchant_id, + $this->config->shop_id + ); + + $request->set_parameter( 'trxid', $transaction_id ); + + // Create invoice. + try { + $result = $this->client->create_invoice( $request ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'sisow_error', $e->getMessage() ); + + return false; + } + + if ( $result instanceof \Pronamic\WordPress\Pay\Gateways\Sisow\Invoice ) { + $payment->set_status( Core_Statuses::SUCCESS ); + + $payment->save(); + + return true; + } + + return false; + } + + /** + * Cancel reservation. + * + * @param Payment $payment Payment. + * + * @return bool + */ + public function cancel_reservation( $payment ) { + $transaction_id = $payment->get_transaction_id(); + + if ( empty( $transaction_id ) ) { + return false; + } + + // Cancel reservation request. + $request = new CancelReservationRequest( + $this->config->merchant_id, + $this->config->shop_id + ); + + $request->set_parameter( 'trxid', $transaction_id ); + + // Cancel reservation. + try { + $result = $this->client->cancel_reservation( $request ); + } catch ( \Exception $e ) { + $this->error = new \WP_Error( 'sisow_error', $e->getMessage() ); + + return false; + } + + if ( isset( $result->status ) ) { + $payment->set_status( Statuses::transform( $result->status ) ); + + $payment->save(); + + return true; + } + + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Integration.php new file mode 100644 index 00000000..cd6b57c0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Integration.php @@ -0,0 +1,174 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\AbstractGatewayIntegration; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Title: Sisow integration + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class Integration extends AbstractGatewayIntegration { + /** + * Construct Sisow integration. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'id' => 'sisow-ideal', + 'name' => 'Sisow', + 'url' => 'https://www.sisow.nl/', + 'product_url' => 'https://www.sisow.nl/epay-online-betaalmogelijkheden/epay-informatie', + 'dashboard_url' => 'https://www.sisow.nl/Sisow/iDeal/Login.aspx', + 'register_url' => 'https://www.sisow.nl/Sisow/iDeal/Aanmelden.aspx?r=120872', + 'provider' => 'sisow', + 'supports' => array( + 'webhook', + 'webhook_log', + 'webhook_no_config', + ), + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-sisow-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + + /** + * Filter Pronamic Pay return should redirect. + * + * @link https://github.com/wp-pay/core/blob/2.2.7/src/Plugin.php#L435-L436 + */ + \add_filter( 'pronamic_pay_return_should_redirect', array( $this, 'return_should_redirect' ), 10, 2 ); + } + + /** + * Filter whether or not to redirect when handling return. + * + * @param bool $should_redirect Whether or not to redirect. + * @param Payment $payment Payment. + * + * @return bool + */ + public function return_should_redirect( $should_redirect, Payment $payment ) { + // Check if the request is a callback request. + if ( filter_has_var( \INPUT_GET, 'callback' ) && filter_input( \INPUT_GET, 'callback', \FILTER_VALIDATE_BOOLEAN ) ) { + $should_redirect = false; + } + + // Check if the request is a notify request. + if ( filter_has_var( \INPUT_GET, 'notify' ) && filter_input( \INPUT_GET, 'notify', \FILTER_VALIDATE_BOOLEAN ) ) { + // Log webhook request. + do_action( 'pronamic_pay_webhook_log_payment', $payment ); + + $should_redirect = false; + } + + return $should_redirect; + } + + /** + * Get settings fields. + * + * @return array + */ + public function get_settings_fields() { + $fields = array(); + + // Intro. + $fields[] = array( + 'section' => 'general', + 'type' => 'html', + 'html' => sprintf( + /* translators: %s: Sisow */ + __( 'Account details are provided by %1$s after registration. These settings need to match with the %1$s dashboard.', 'pronamic_ideal' ), + __( 'Sisow', 'pronamic_ideal' ) + ), + ); + + // Merchant ID. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'methods' => array( 'sisow' ), + 'meta_key' => '_pronamic_gateway_sisow_merchant_id', + 'title' => _x( 'Merchant ID', 'sisow', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'code' ), + 'tooltip' => __( 'Merchant ID as mentioned at My Profile in the Sisow dashboard.', 'pronamic_ideal' ), + ); + + // Merchant Key. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'methods' => array( 'sisow' ), + 'meta_key' => '_pronamic_gateway_sisow_merchant_key', + 'title' => _x( 'Merchant Key', 'sisow', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Merchant Key as mentioned at My Profile in the Sisow dashboard.', 'pronamic_ideal' ), + ); + + // Shop ID. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'methods' => array( 'sisow' ), + 'meta_key' => '_pronamic_gateway_sisow_shop_id', + 'title' => _x( 'Shop ID', 'sisow', 'pronamic_ideal' ), + 'type' => 'text', + 'classes' => array( 'regular-text', 'code' ), + 'tooltip' => __( 'Shop ID as mentioned at My Profile in the Sisow dashboard.', 'pronamic_ideal' ), + /* translators: %s: 0 */ + 'description' => sprintf( __( 'Default: %s', 'pronamic_ideal' ), 0 ), + 'default' => 0, + ); + + return $fields; + } + + /** + * Get configuration. + * + * @param int $post_id Post ID. + * @return Config + */ + public function get_config( $post_id ) { + $config = new Config(); + + $config->merchant_id = $this->get_meta( $post_id, 'sisow_merchant_id' ); + $config->merchant_key = $this->get_meta( $post_id, 'sisow_merchant_key' ); + $config->shop_id = $this->get_meta( $post_id, 'sisow_shop_id' ); + $config->mode = $this->get_meta( $post_id, 'mode' ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Invoice.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Invoice.php new file mode 100644 index 00000000..9332573a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Invoice.php @@ -0,0 +1,52 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow invoice + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.1 + */ +class Invoice { + /** + * Invoice number. + * + * @var string + */ + public $invoiceno; + + /** + * Document ID. + * + * @var string + */ + public $documentid; + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + return implode( + ' ', + array( + $this->invoiceno, + $this->documentid, + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/InvoiceRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/InvoiceRequest.php new file mode 100644 index 00000000..bba150f8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/InvoiceRequest.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow invoice request + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.1 + */ +class InvoiceRequest extends Request { + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array( + $this->get_parameter( 'trxid' ), + + /* + * Indien er geen gebruik wordt gemaakt van de shopid dan kunt u deze weglaten uit de berekening. + */ + $this->get_parameter( 'shopid' ), + + $this->get_parameter( 'merchantid' ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Merchant.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Merchant.php new file mode 100644 index 00000000..0617f6df --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Merchant.php @@ -0,0 +1,57 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow merchant + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.2 + * @since 2.0.2 + */ +class Merchant { + /** + * Merchant ID. + * + * @var string + */ + public $merchant_id; + + /** + * Payment methods. + * + * @var array + */ + public $payments; + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + $pieces = array( + $this->merchant_id, + implode( ', ', $this->payments ), + ); + + $pieces = array_map( 'trim', $pieces ); + + $pieces = array_filter( $pieces ); + + $string = implode( PHP_EOL, $pieces ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/MerchantRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/MerchantRequest.php new file mode 100644 index 00000000..dc0cd9a4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/MerchantRequest.php @@ -0,0 +1,34 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow check merchant request + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.2 + * @since 2.0.2 + */ +class MerchantRequest extends Request { + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array( + $this->get_parameter( 'merchantid' ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Methods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Methods.php new file mode 100644 index 00000000..b8f2cb9b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Methods.php @@ -0,0 +1,237 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +/** + * Title: iDEAL Sisow payment methods + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.0.0 + */ +class Methods { + /** + * Indicator for 'AfterPay' payment. + * + * @var string + * @since 2.1.0 + */ + const AFTERPAY = 'afterpay'; + + /** + * Indicator for 'Belfius' payment + * + * @var string + */ + const BELFIUS = 'belfius'; + + /** + * Indicator for 'Billink' payment + * + * @var string + */ + const BILLINK = 'billink'; + + /** + * Indicator for 'iDEAL' payment + * + * @var string + */ + const IDEAL = 'ideal'; + + /** + * Indicator for 'iDEAL QR' payment + * + * @var string + */ + const IDEALQR = 'idealqr'; + + /** + * Indicator for 'bunq' payment + * + * @var string + * @since unreleased + */ + const BUNQ = 'bunq'; + + /** + * Indicator for 'Capayable' payment. + * + * @var string + * @since 2.1.0 + */ + const CAPAYABLE = 'capayable'; + + /** + * Indicator for 'Creditcard' payment + * + * @var string + * @since 1.1.2 + */ + const CREDIT_CARD = 'creditcard'; + + /** + * Indicator for 'Achteraf betalen' payment + * + * @var string + */ + const ECARE = 'ecare'; + + /** + * Indicator for 'Digitale acceptgiro' payment + * + * @var string + */ + const EBILL = 'ebill'; + + /** + * Indicator for 'Focum' payment. + * + * @var string + * @since 2.1.0 + */ + const FOCUM = 'focum'; + + /** + * Indicator for 'Giropay' payment + * + * @var string + */ + const GIROPAY = 'giropay'; + + /** + * Indicator for 'Klarna Factuur' payment. + * + * @var string + * @since 2.1.0 + */ + const KLARNA = 'klarna'; + + /** + * Indicator for 'Bank/giro betaling' payment + * + * @var string + */ + const OVERBOEKING = 'overboeking'; + + /** + * Indicator for 'SofortBanking/DIRECTebanking' payment + * + * @var string + */ + const SOFORT = 'sofort'; + + /** + * Indicator for 'Bancontact/MisterCash' payment + * + * @var string + */ + const MISTER_CASH = 'mistercash'; + + /** + * Indicator for 'PayPal Express Checkout' payment + * + * @var string + */ + const PAYPAL_EXPRESS_CHECKOUT = 'paypalec'; + + /** + * Indicator for 'Webshop Giftcard' payment + * + * @var string + */ + const WEBSHOP_GIFTCARD = 'webshop'; + + /** + * Indicator for 'Fijn Cadeaukaart' payment + * + * @var string + */ + const FIJNCADEAU = 'fijncadeau'; + + /** + * Indicator for 'Podium Cadeaukaart' payment + * + * @var string + */ + const PODIUM_CADEAUKAART = 'podium'; + + /** + * Payments methods map. + * + * @var array + */ + private static $map = array( + PaymentMethods::AFTERPAY => self::AFTERPAY, + PaymentMethods::BANCONTACT => self::MISTER_CASH, + PaymentMethods::BANK_TRANSFER => self::OVERBOEKING, + PaymentMethods::BELFIUS => self::BELFIUS, + PaymentMethods::BILLINK => self::BILLINK, + PaymentMethods::BUNQ => self::BUNQ, + PaymentMethods::IN3 => self::CAPAYABLE, + PaymentMethods::CREDIT_CARD => self::CREDIT_CARD, + PaymentMethods::FOCUM => self::FOCUM, + PaymentMethods::GIROPAY => self::GIROPAY, + PaymentMethods::IDEAL => self::IDEAL, + PaymentMethods::IDEALQR => self::IDEALQR, + PaymentMethods::KLARNA_PAY_LATER => self::KLARNA, + PaymentMethods::MISTER_CASH => self::MISTER_CASH, + PaymentMethods::PAYPAL => self::PAYPAL_EXPRESS_CHECKOUT, + PaymentMethods::SOFORT => self::SOFORT, + ); + + /** + * Transform WordPress payment method to Sisow method. + * + * @param mixed $payment_method Payment method. + * @param string|null $default Value to return if method could not be transformed. + * @return string|null + */ + public static function transform( $payment_method, $default = null ) { + if ( ! is_scalar( $payment_method ) ) { + return null; + } + + if ( isset( self::$map[ $payment_method ] ) ) { + return self::$map[ $payment_method ]; + } + + return $default; + } + + /** + * Transform Sisow method to WordPress payment method. + * + * @since unreleased + * + * @param string $method Sisow method. + * + * @return string + */ + public static function transform_gateway_method( $method ) { + if ( ! is_scalar( $method ) ) { + return null; + } + + $payment_method = array_search( $method, self::$map, true ); + + if ( ! $payment_method ) { + return null; + } + + return $payment_method; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/NotifyRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/NotifyRequest.php new file mode 100644 index 00000000..6b359908 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/NotifyRequest.php @@ -0,0 +1,60 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow notify return request + * Description: + * Copyright: Copyright (c) 2019 + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.4 + * @since 2.0.4 + */ +class NotifyRequest extends Request { + /** + * Constructor. + * + * @param string $transaction_id Transaction ID. + * @param string $entrance_code Entrance code. + * @param string $status Status. + * @param string $merchant_id Merchant ID. + */ + public function __construct( $transaction_id, $entrance_code, $status, $merchant_id ) { + parent::__construct( $merchant_id ); + + $this->set_parameter( 'trxid', $transaction_id ); + $this->set_parameter( 'ec', $entrance_code ); + $this->set_parameter( 'status', $status ); + } + + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array( + // Transaction ID. + $this->get_parameter( 'trxid' ), + + // Entrance code. + $this->get_parameter( 'ec' ), + + // Status. + $this->get_parameter( 'status' ), + + // Merchant ID. + $this->get_parameter( 'merchantid' ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Request.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Request.php new file mode 100644 index 00000000..8afeea5f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Request.php @@ -0,0 +1,124 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Core\Util as Pay_Util; +use Pronamic\WordPress\Pay\Payments\Items; + +/** + * Title: iDEAL Sisow transaction request + * Description: + * Copyright: Copyright (c) 2015 + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class Request { + /** + * Parameters. + * + * @var array + */ + private $parameters = array(); + + /** + * Construct request. + * + * @param string $merchant_id Merchant ID. + * @param string|null $shop_id Shop ID. + */ + public function __construct( $merchant_id, $shop_id = null ) { + $this->set_parameter( 'merchantid', $merchant_id ); + $this->set_parameter( 'shopid', $shop_id ); + } + + /** + * Get parameter. + * + * @param string $parameter Parameter. + * @return string|null + */ + public function get_parameter( $parameter ) { + if ( isset( $this->parameters[ $parameter ] ) ) { + return $this->parameters[ $parameter ]; + } + + return null; + } + + /** + * Set parameter. + * + * @param string $parameter Parameter. + * @param string|null $value Value. + */ + public function set_parameter( $parameter, $value ) { + $this->parameters[ $parameter ] = $value; + } + + /** + * Get parameters. + * + * @return array + */ + public function get_parameters() { + return $this->parameters; + } + + /** + * Merge parameters. + * + * @param array $parameters Parameters. + */ + public function merge_parameters( $parameters ) { + $this->parameters = array_merge( $this->parameters, $parameters ); + } + + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array(); + } + + /** + * Get signature. + * + * @param string $merchant_key Merchant key. + * @return string + */ + public function get_signature( $merchant_key ) { + $data = $this->get_signature_data(); + + $data[] = $merchant_key; + + $string = implode( '', $data ); + + $signature = sha1( $string ); + + return $signature; + } + + /** + * Sign this request with the specified merchant key. + * + * @param string $merchant_key Merchant key. + */ + public function sign( $merchant_key ) { + $signature = $this->get_signature( $merchant_key ); + + $this->set_parameter( 'sha1', $signature ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/RequestMethods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/RequestMethods.php new file mode 100644 index 00000000..5a0ce3b9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/RequestMethods.php @@ -0,0 +1,65 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: iDEAL Sisow methods + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class RequestMethods { + /** + * Indicator for a cancel reservation request + * + * @var string + */ + const CANCEL_RESERVATION_REQUEST = 'CancelReservationRequest'; + + /** + * Indicator for a merchant check request + * + * @var string + */ + const CHECK_MERCHANT_REQUEST = 'CheckMerchantRequest'; + + /** + * Indicator for a directory request + * + * @var string + */ + const DIRECTORY_REQUEST = 'DirectoryRequest'; + + /** + * Indicator for a invoice request + * + * @var string + */ + const INVOICE_REQUEST = 'InvoiceRequest'; + + /** + * Indicator for a status request + * + * @var string + */ + const STATUS_REQUEST = 'StatusRequest'; + + /** + * Indicator for a transaction request + * + * @var string + */ + const TRANSACTION_REQUEST = 'TransactionRequest'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Reservation.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Reservation.php new file mode 100644 index 00000000..2bfd6a48 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Reservation.php @@ -0,0 +1,39 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow reservation + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.1 + */ +class Reservation { + /** + * The status of the transaction + * + * @var string + */ + public $status; + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + return $this->status; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/StatusRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/StatusRequest.php new file mode 100644 index 00000000..01ce05b9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/StatusRequest.php @@ -0,0 +1,56 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Core\Util as Pay_Util; +use Pronamic\WordPress\Pay\Payments\Items; + +/** + * Status request + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class StatusRequest extends Request { + /** + * Constructs status request object. + * + * @param string $transaction_id Transaction ID. + * @param string $merchant_id Merchant ID. + * @param string|null $shop_id Shop ID. + */ + public function __construct( $transaction_id, $merchant_id, $shop_id = null ) { + parent::__construct( $merchant_id, $shop_id ); + + $this->set_parameter( 'trxid', $transaction_id ); + } + + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array( + $this->get_parameter( 'trxid' ), + + /* + * Indien er geen gebruik wordt gemaakt van de shopid dan kunt u deze weglaten uit de berekening. + */ + $this->get_parameter( 'shopid' ), + + $this->get_parameter( 'merchantid' ), + + $this->get_parameter( 'merchantkey' ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Statuses.php new file mode 100644 index 00000000..45ac3f9e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Statuses.php @@ -0,0 +1,125 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus as Core_Statuses; + +/** + * Title: Sisow statuses constants + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.4 + * @since 2.0.1 + */ +class Statuses { + /** + * Open. + * + * @var string + */ + const OPEN = 'Open'; + + /** + * Pending. + * + * @var string + */ + const PENDING = 'Pending'; + + /** + * Reservation. + * + * @var string + */ + const RESERVATION = 'Reservation'; + + /** + * Paid. + * + * @var string + */ + const SUCCESS = 'Success'; + + /** + * Cancelled. + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Expired. + * + * @var string + */ + const EXPIRED = 'Expired'; + + /** + * Denied. + * + * @var string + */ + const DENIED = 'Denied'; + + /** + * Failure. + * + * @var string + */ + const FAILURE = 'Failure'; + + /** + * Reversed. + * + * @var string + */ + const REVERSED = 'Reversed'; + + /** + * Transform an Sisow state to a more global status. + * + * @param string $status Sisow status. + * + * @return string|null Pay status. + */ + public static function transform( $status ) { + switch ( $status ) { + case self::PENDING: + case self::OPEN: + return Core_Statuses::OPEN; + + case self::RESERVATION: + return Core_Statuses::RESERVED; + + case self::SUCCESS: + return Core_Statuses::SUCCESS; + + case self::CANCELLED: + return Core_Statuses::CANCELLED; + + case self::EXPIRED: + return Core_Statuses::EXPIRED; + + case self::DENIED: + case self::FAILURE: + return Core_Statuses::FAILURE; + + case self::REVERSED: + return Core_Statuses::REFUNDED; + + default: + return null; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Transaction.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Transaction.php new file mode 100644 index 00000000..54899b40 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Transaction.php @@ -0,0 +1,139 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +use Pronamic\WordPress\DateTime\DateTime; + +/** + * Title: iDEAL Sisow error + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class Transaction { + /** + * Transaction ID + * + * @var string + */ + public $id; + + /** + * The status of the transaction + * + * @var string + */ + public $status; + + /** + * The amount of the transaction + * + * @var float + */ + public $amount; + + /** + * Purchase ID + * + * @var string + */ + public $purchase_id; + + /** + * Description + * + * @var string + */ + public $description; + + /** + * Entrance code + * + * @var string + */ + public $entrance_code; + + /** + * Issuer ID + * + * @var string + */ + public $issuer_id; + + /** + * Timestamp + * + * @var DateTime + */ + public $timestamp; + + /** + * Consumer name + * + * @var string + */ + public $consumer_name; + + /** + * Consumer account + * + * @var string + */ + public $consumer_account; + + /** + * Consumer city + * + * @var string + */ + public $consumer_city; + + /** + * Consumer IBAN + * + * @var string + */ + public $consumer_iban; + + /** + * Consumer BIC + * + * @var string + */ + public $consumer_bic; + + /** + * Issuer URL + * + * @var string + */ + public $issuer_url; + + /** + * Constructs and initializes an Sisow error object + */ + public function __construct() { + + } + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + return $this->id . ' ' . $this->issuer_url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/TransactionRequest.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/TransactionRequest.php new file mode 100644 index 00000000..ca0c89ed --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/TransactionRequest.php @@ -0,0 +1,49 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: iDEAL Sisow transaction request + * Description: + * Copyright: Copyright (c) 2015 + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class TransactionRequest extends Request { + /** + * Get signature data. + * + * @return array + */ + public function get_signature_data() { + return array( + $this->get_parameter( 'purchaseid' ), + + /* + * Wordt er geen gebruik gemaakt van de entrancecode dan dient er twee keer de purchaseid te worden opgenomen, u krijgt dan onderstaande volgorde. + * purchaseid/purchaseid/amount/shopid/merchantid/merchantkey + */ + null !== $this->get_parameter( 'entrancecode' ) ? $this->get_parameter( 'entrancecode' ) : $this->get_parameter( 'purchaseid' ), + + $this->get_parameter( 'amount' ), + + /* + * Indien er geen gebruik wordt gemaakt van de shopid dan kunt u deze weglaten uit de berekening. + */ + $this->get_parameter( 'shopid' ), + + $this->get_parameter( 'merchantid' ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Util.php new file mode 100644 index 00000000..521db0ce --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/Util.php @@ -0,0 +1,108 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow; + +/** + * Title: Sisow utility class + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class Util { + /** + * Holds the unallowed character pattern. + * + * @var string|null + */ + private static $pattern; + + /** + * Get unallowed character pattern. + * + * Karakterset + * + * @link http://pronamic.nl/wp-content/uploads/2013/02/sisow-rest-api-v3.2.1.pdf + * + * Hieronder de tabel toegestane karakters. + * + * Karakter(s) Omschrijving + * A-Z Hoofdletters + * a-z Kleine letters + * 0-9 Cijfers + * = Is/gelijk + * Spatie + * % Procent + * * Asterisk + * + Plus + * - Min + * . Punt + * / Slash + * & Ampersand + * @ Apestaart + * " Dubbel quote + * ' Enkele quote + * : Dubbele punt + * ; Punt komma + * ? Vraagteken + * ( Haakje openen + * ) Haakje sluiten + * $ Dollar + */ + public static function get_pattern() { + if ( null === self::$pattern ) { + $characters = array( + 'A-Z', + 'a-z', + '0-9', + '=', + ' ', + '%', + '*', + '+', + '-', + '.', + '/', + '&', + '@', + '"', + '\'', + ':', + ';', + '?', + '(', + ')', + '$', + ); + + /* + * We use a # as a regex delimiter instead of a / so we don't have to escape the slash. + * @link http://stackoverflow.com/q/12239424 + */ + self::$pattern = '#[^' . implode( $characters ) . ']#'; + } + + return self::$pattern; + } + + /** + * Filter all Sisow unallowed charachters. + * + * @param string $string String to filter. + * @return mixed + */ + public static function filter( $string ) { + return preg_replace( self::get_pattern(), '', $string ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/ErrorParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/ErrorParser.php new file mode 100644 index 00000000..df4320f4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/ErrorParser.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\Sisow\Error as Sisow_Error; +use SimpleXMLElement; + +/** + * Title: Error XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +class ErrorParser implements Parser { + /** + * Parse the specified XML element. + * + * @param SimpleXMLElement $xml XML element to parse. + */ + public static function parse( SimpleXMLElement $xml ) { + $error = new Sisow_Error( + Security::filter( $xml->errorcode ), + Security::filter( $xml->errormessage ) + ); + + return $error; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/InvoiceParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/InvoiceParser.php new file mode 100644 index 00000000..1048bf4a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/InvoiceParser.php @@ -0,0 +1,48 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\Sisow\Invoice; +use SimpleXMLElement; + +/** + * Reservation parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.1 + */ +class InvoiceParser implements Parser { + /** + * Parse XML element. + * + * @param SimpleXMLElement $xml XML element to parse. + * + * @return Invoice + */ + public static function parse( SimpleXMLElement $xml ) { + $invoice = new Invoice(); + + if ( isset( $xml->invoiceno ) ) { + $invoice->invoiceno = Security::filter( $xml->invoiceno ); + } + + if ( isset( $xml->documentid ) ) { + $invoice->documentid = Security::filter( $xml->documentid ); + } + + return $invoice; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/MerchantParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/MerchantParser.php new file mode 100644 index 00000000..5590123d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/MerchantParser.php @@ -0,0 +1,48 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\Sisow\Merchant; +use SimpleXMLElement; + +/** + * Merchant parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.2 + * @since 2.0.2 + */ +class MerchantParser implements Parser { + /** + * Parse XML element. + * + * @param SimpleXMLElement $xml XML element to parse. + * + * @return Merchant + */ + public static function parse( SimpleXMLElement $xml ) { + $merchant = new Merchant(); + + if ( isset( $xml->merchantid ) ) { + $merchant->merchant_id = Security::filter( $xml->merchantid ); + } + + if ( isset( $xml->payments->payment ) ) { + $merchant->payments = (array) $xml->payments->payment; + } + + return $merchant; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/Parser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/Parser.php new file mode 100644 index 00000000..9779d080 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/Parser.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow\XML; + +use SimpleXMLElement; + +/** + * Title: XML parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.0.0 + */ +interface Parser { + /** + * Parse the specified XML element. + * + * @param SimpleXMLElement $xml XML element to parse. + */ + public static function parse( SimpleXMLElement $xml ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/ReservationParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/ReservationParser.php new file mode 100644 index 00000000..b6f96bc7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/ReservationParser.php @@ -0,0 +1,44 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow\XML; + +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\Sisow\Reservation; +use SimpleXMLElement; + +/** + * Reservation parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.1 + * @since 2.0.1 + */ +class ReservationParser implements Parser { + /** + * Parse XML element. + * + * @param SimpleXMLElement $xml XML element to parse. + * + * @return Reservation + */ + public static function parse( SimpleXMLElement $xml ) { + $reservation = new Reservation(); + + if ( isset( $xml->status ) ) { + $reservation->status = Security::filter( $xml->status ); + } + + return $reservation; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/TransactionParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/TransactionParser.php new file mode 100644 index 00000000..3581b1f7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/sisow/src/XML/TransactionParser.php @@ -0,0 +1,99 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Gateways\Sisow\XML; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Core\Util; +use Pronamic\WordPress\Pay\Core\XML\Security; +use Pronamic\WordPress\Pay\Gateways\Sisow\Transaction; +use SimpleXMLElement; + +/** + * Transaction parser + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.4 + * @since 1.0.0 + */ +class TransactionParser implements Parser { + /** + * Parse XML element. + * + * @param SimpleXMLElement $xml XML element to parse. + * @return Transaction + */ + public static function parse( SimpleXMLElement $xml ) { + $transaction = new Transaction(); + + // Transaction request. + if ( isset( $xml->trxid ) ) { + $transaction->id = Security::filter( $xml->trxid ); + } + + if ( isset( $xml->issuerurl ) ) { + $transaction->issuer_url = urldecode( Security::filter( $xml->issuerurl ) ); + } + + // Status response. + if ( isset( $xml->status ) ) { + $transaction->status = Security::filter( $xml->status ); + } + + if ( isset( $xml->amount ) ) { + $transaction->amount = Util::cents_to_amount( Security::filter( $xml->amount ) ); + } + + if ( isset( $xml->purchaseid ) ) { + $transaction->purchase_id = Security::filter( $xml->purchaseid ); + } + + if ( isset( $xml->description ) ) { + $transaction->description = Security::filter( $xml->description ); + } + + if ( isset( $xml->entrancecode ) ) { + $transaction->entrance_code = Security::filter( $xml->entrancecode ); + } + + if ( isset( $xml->issuerid ) ) { + $transaction->issuer_id = Security::filter( $xml->issuerid ); + } + + if ( isset( $xml->timestamp ) ) { + $transaction->timestamp = new DateTime( Security::filter( $xml->timestamp ) ); + } + + if ( isset( $xml->consumername ) ) { + $transaction->consumer_name = Security::filter( $xml->consumername ); + } + + if ( isset( $xml->consumeraccount ) ) { + $transaction->consumer_account = Security::filter( $xml->consumeraccount ); + } + + if ( isset( $xml->consumercity ) ) { + $transaction->consumer_city = Security::filter( $xml->consumercity ); + } + + if ( isset( $xml->consumeriban ) ) { + $transaction->consumer_iban = Security::filter( $xml->consumeriban ); + } + + if ( isset( $xml->consumerbic ) ) { + $transaction->consumer_bic = Security::filter( $xml->consumerbic ); + } + + return $transaction; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Client.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Client.php new file mode 100644 index 00000000..79b012a8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Client.php @@ -0,0 +1,194 @@ +get_array() ); + + $data = self::remote_get( $url ); + + if ( false !== $data ) { + $status = strtok( $data, self::TOKEN ); + + if ( self::STATUS_OK === $status ) { + $result = new stdClass(); + + $result->status = $status; + $result->transaction_id = strtok( self::TOKEN ); + $result->url = strtok( self::TOKEN ); + + return $result; + } else { + $code = $status; + $description = substr( $data, 7 ); + + $error = new Error( $code, $description ); + + throw new \Exception( 'targetpay', (string) $error ); + } + } + } + + /** + * Check status + * + * @param string $rtlo + * @param string $transaction_id + * @param string $once + * @param string $test + * + * @return null|Status + */ + public function check_status( $rtlo, $transaction_id, $once, $test ) { + $result = null; + + $url = Util::build_url( + self::URL_CHECK_TRANSACTION, + array( + 'rtlo' => $rtlo, + 'trxid' => $transaction_id, + 'once' => Util::boolean_to_numeric( $once ), + 'test' => Util::boolean_to_numeric( $test ), + ) + ); + + $data = self::remote_get( $url ); + + if ( false !== $data ) { + $result = StatusStringParser::parse( $data ); + } + + return $result; + } + + /** + * Get issuers + * + * @return array + */ + public function get_issuers() { + $issuers = false; + + $url = self::URL_ISSUERS_XML; + + $data = self::remote_get( $url ); + + if ( false !== $data ) { + $xml = Util::simplexml_load_string( $data ); + + $issuers = array(); + + foreach ( $xml->issuer as $xml_issuer ) { + $id = Security::filter( $xml_issuer['id'] ); + $name = Security::filter( $xml_issuer ); + + $issuers[ $id ] = $name; + } + } + + return $issuers; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Config.php new file mode 100644 index 00000000..4fee2cfe --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Config.php @@ -0,0 +1,19 @@ +code = $code; + $this->description = $description; + } + + /** + * Get code. + * + * @return string + */ + public function get_code() { + return $this->code; + } + + /** + * Set code. + * + * @param string $code Code. + */ + public function set_code( $code ) { + $this->code = $code; + } + + /** + * Get description. + * + * @return string + */ + public function get_description() { + return $this->description; + } + + /** + * Set description. + * + * @param string $description Description. + */ + public function set_description( $description ) { + $this->description = $description; + } + + /** + * Create an string representation of this TargetPay error object. + * + * @return string + */ + public function __toString() { + return $this->get_code() . ' ' . $this->get_description(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Gateway.php new file mode 100644 index 00000000..38d2f8c1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Gateway.php @@ -0,0 +1,138 @@ +set_method( self::METHOD_HTTP_REDIRECT ); + + // Supported features. + $this->supports = array( + 'payment_status_request', + ); + + // Client. + $this->client = new Client(); + } + + /** + * Get issuers + * + * @see Pronamic_WP_Pay_Gateway::get_issuers() + */ + public function get_issuers() { + $groups = array(); + + $result = $this->client->get_issuers(); + + if ( $result ) { + $groups[] = array( + 'options' => $result, + ); + } + + return $groups; + } + + /** + * Get supported payment methods + * + * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods() + */ + public function get_supported_payment_methods() { + return array( + PaymentMethods::IDEAL, + ); + } + + /** + * Start + * + * @see Core_Gateway::start() + * + * @param Payment $payment Payment. + */ + public function start( Payment $payment ) { + $parameters = new IDealStartParameters(); + $parameters->rtlo = $this->config->layoutcode; + $parameters->bank = $payment->get_issuer(); + $parameters->description = $payment->get_description(); + $parameters->amount = $payment->get_total_amount()->get_cents(); + $parameters->return_url = $payment->get_return_url(); + $parameters->report_url = $payment->get_return_url(); + $parameters->cinfo_in_callback = 1; + + $result = $this->client->start_transaction( $parameters ); + + if ( $result ) { + $payment->set_action_url( $result->url ); + $payment->set_transaction_id( $result->transaction_id ); + } + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + */ + public function update_status( Payment $payment ) { + // Get transaction status. + $status = $this->client->check_status( + $this->config->layoutcode, + $payment->get_transaction_id(), + false, + self::MODE_TEST === $this->config->mode + ); + + if ( ! $status ) { + return; + } + + // Update payment status. + $payment->set_status( Statuses::transform( $status->code ) ); + + // Set payment consumer details. + if ( Statuses::OK === $status->code ) { + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_name( $status->account_name ); + $consumer_bank_details->set_account_number( $status->account_number ); + $consumer_bank_details->set_city( $status->account_city ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/IDealStartParameters.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/IDealStartParameters.php new file mode 100644 index 00000000..ccf05aaf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/IDealStartParameters.php @@ -0,0 +1,52 @@ +bank; + $array['cinfo_in_callback'] = Core_Util::boolean_to_numeric( $this->cinfo_in_callback ); + + return $array; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Integration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Integration.php new file mode 100644 index 00000000..aa6ba053 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Integration.php @@ -0,0 +1,89 @@ + 'targetpay-ideal', + 'name' => 'TargetPay - iDEAL', + 'product_url' => \__( 'https://www.targetpay.com/info/ideal?setlang=en', 'pronamic_ideal' ), + 'dashboard_url' => 'https://www.targetpay.com/login', + 'provider' => 'targetpay', + 'manual_url' => \__( 'https://www.pronamic.eu/support/how-to-connect-targetpay-with-wordpress-via-pronamic-pay/', 'pronamic_ideal' ), + ) + ); + + parent::__construct( $args ); + } + + /** + * Get settings fields. + * + * @return array + */ + public function get_settings_fields() { + $fields = array(); + + // Intro. + $fields[] = array( + 'section' => 'general', + 'type' => 'html', + 'html' => sprintf( + /* translators: 1: TargetPay */ + __( 'Account details are provided by %1$s after registration. These settings need to match with the %1$s dashboard.', 'pronamic_ideal' ), + __( 'TargetPay', 'pronamic_ideal' ) + ), + ); + + // Layout Code. + $fields[] = array( + 'section' => 'general', + 'filter' => FILTER_SANITIZE_STRING, + 'meta_key' => '_pronamic_gateway_targetpay_layoutcode', + 'title' => __( 'Layout Code', 'pronamic_ideal' ), + 'type' => 'text', + 'tooltip' => __( 'Layout code as mentioned at Sub accounts in the TargetPay dashboard.', 'pronamic_ideal' ), + ); + + return $fields; + } + + public function get_config( $post_id ) { + $config = new Config(); + + $config->layoutcode = get_post_meta( $post_id, '_pronamic_gateway_targetpay_layoutcode', true ); + $config->mode = get_post_meta( $post_id, '_pronamic_gateway_mode', true ); + + return $config; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * @return Gateway + */ + public function get_gateway( $post_id ) { + return new Gateway( $this->get_config( $post_id ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/SofortClient.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/SofortClient.php new file mode 100644 index 00000000..0610033b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/SofortClient.php @@ -0,0 +1,52 @@ +user_ip; + $array['type'] = $this->type; + + return $array; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/StartParameters.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/StartParameters.php new file mode 100644 index 00000000..7d1a134b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/StartParameters.php @@ -0,0 +1,100 @@ + $this->rtlo, + 'description' => $this->description, + 'amount' => $this->amount, + 'country' => $this->country, + 'lang' => $this->language, + 'returnurl' => $this->return_url, + 'reporturl' => $this->report_url, + ); + } + + /** + * Get iterator + * + * @return ArrayIterator + */ + public function getIterator() { + return new ArrayIterator( $this->get_array() ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Status.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Status.php new file mode 100644 index 00000000..9367b56a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Status.php @@ -0,0 +1,68 @@ +code . ' ' . $this->description; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/StatusStringParser.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/StatusStringParser.php new file mode 100644 index 00000000..a8b2ab52 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/StatusStringParser.php @@ -0,0 +1,84 @@ +code = substr( $string, 0, $position_space ); + + $position_description = $position_space + 1; + if ( false !== $position_pipe ) { + $length = $position_pipe - $position_description; + + $status->description = substr( $string, $position_description, $length ); + } else { + $status->description = substr( $string, $position_description ); + } + + if ( false !== $position_pipe ) { + $extra = substr( $string, $position_pipe + 1 ); + + /* + * @link https://www.targetpay.com/info/directdebit-docu + * + * The response of the ideal/check call will be: + * 00000 OK|accountnumber|accountname|accountcity + * You may use accountnumber and accountname as input for the cbank and cname parameters + */ + $status->account_number = strtok( $extra, self::TOKEN ); + $status->account_name = strtok( self::TOKEN ); + $status->account_city = strtok( self::TOKEN ); + } + } + + return $status; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Statuses.php new file mode 100644 index 00000000..fff8645d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay-gateways/targetpay/src/Statuses.php @@ -0,0 +1,113 @@ + -1.99) + * + * Doesn't throw any errors (`NaN`s become 0) but this may change in future + */ + var unformat = lib.unformat = lib.parse = function(value, decimal) { + // Recursively unformat arrays: + if (isArray(value)) { + return map(value, function(val) { + return unformat(val, decimal); + }); + } + + // Fails silently (need decent errors): + value = value || 0; + + // Return the value as-is if it's already a number: + if (typeof value === "number") return value; + + // Default decimal point comes from settings, but could be set to eg. "," in opts: + decimal = decimal || lib.settings.number.decimal; + + // Build regex to strip out everything except digits, decimal point and minus sign: + var regex = new RegExp("[^0-9-" + decimal + "]", ["g"]), + unformatted = parseFloat( + ("" + value) + .replace(/\((.*)\)/, "-$1") // replace bracketed values with negatives + .replace(regex, '') // strip out any cruft + .replace(decimal, '.') // make sure decimal point is standard + ); + + // This will fail silently which may cause trouble, let's wait and see: + return !isNaN(unformatted) ? unformatted : 0; + }; + + + /** + * Implementation of toFixed() that treats floats more like decimals + * + * Fixes binary rounding issues (eg. (0.615).toFixed(2) === "0.61") that present + * problems for accounting- and finance-related software. + */ + var toFixed = lib.toFixed = function(value, precision) { + precision = checkPrecision(precision, lib.settings.number.precision); + var power = Math.pow(10, precision); + + // Multiply up by precision, round accurately, then divide and use native toFixed(): + return (Math.round(lib.unformat(value) * power) / power).toFixed(precision); + }; + + + /** + * Format a number, with comma-separated thousands and custom precision/decimal places + * Alias: `accounting.format()` + * + * Localise by overriding the precision and thousand / decimal separators + * 2nd parameter `precision` can be an object matching `settings.number` + */ + var formatNumber = lib.formatNumber = lib.format = function(number, precision, thousand, decimal) { + // Resursively format arrays: + if (isArray(number)) { + return map(number, function(val) { + return formatNumber(val, precision, thousand, decimal); + }); + } + + // Clean up number: + number = unformat(number); + + // Build options object from second param (if object) or all params, extending defaults: + var opts = defaults( + (isObject(precision) ? precision : { + precision : precision, + thousand : thousand, + decimal : decimal + }), + lib.settings.number + ), + + // Clean up precision + usePrecision = checkPrecision(opts.precision), + + // Do some calc: + negative = number < 0 ? "-" : "", + base = parseInt(toFixed(Math.abs(number || 0), usePrecision), 10) + "", + mod = base.length > 3 ? base.length % 3 : 0; + + // Format the number: + return negative + (mod ? base.substr(0, mod) + opts.thousand : "") + base.substr(mod).replace(/(\d{3})(?=\d)/g, "$1" + opts.thousand) + (usePrecision ? opts.decimal + toFixed(Math.abs(number), usePrecision).split('.')[1] : ""); + }; + + + /** + * Format a number into currency + * + * Usage: accounting.formatMoney(number, symbol, precision, thousandsSep, decimalSep, format) + * defaults: (0, "$", 2, ",", ".", "%s%v") + * + * Localise by overriding the symbol, precision, thousand / decimal separators and format + * Second param can be an object matching `settings.currency` which is the easiest way. + * + * To do: tidy up the parameters + */ + var formatMoney = lib.formatMoney = function(number, symbol, precision, thousand, decimal, format) { + // Resursively format arrays: + if (isArray(number)) { + return map(number, function(val){ + return formatMoney(val, symbol, precision, thousand, decimal, format); + }); + } + + // Clean up number: + number = unformat(number); + + // Build options object from second param (if object) or all params, extending defaults: + var opts = defaults( + (isObject(symbol) ? symbol : { + symbol : symbol, + precision : precision, + thousand : thousand, + decimal : decimal, + format : format + }), + lib.settings.currency + ), + + // Check format (returns object with pos, neg and zero): + formats = checkCurrencyFormat(opts.format), + + // Choose which format to use for this value: + useFormat = number > 0 ? formats.pos : number < 0 ? formats.neg : formats.zero; + + // Return with currency symbol added: + return useFormat.replace('%s', opts.symbol).replace('%v', formatNumber(Math.abs(number), checkPrecision(opts.precision), opts.thousand, opts.decimal)); + }; + + + /** + * Format a list of numbers into an accounting column, padding with whitespace + * to line up currency symbols, thousand separators and decimals places + * + * List should be an array of numbers + * Second parameter can be an object containing keys that match the params + * + * Returns array of accouting-formatted number strings of same length + * + * NB: `white-space:pre` CSS rule is required on the list container to prevent + * browsers from collapsing the whitespace in the output strings. + */ + lib.formatColumn = function(list, symbol, precision, thousand, decimal, format) { + if (!list) return []; + + // Build options object from second param (if object) or all params, extending defaults: + var opts = defaults( + (isObject(symbol) ? symbol : { + symbol : symbol, + precision : precision, + thousand : thousand, + decimal : decimal, + format : format + }), + lib.settings.currency + ), + + // Check format (returns object with pos, neg and zero), only need pos for now: + formats = checkCurrencyFormat(opts.format), + + // Whether to pad at start of string or after currency symbol: + padAfterSymbol = formats.pos.indexOf("%s") < formats.pos.indexOf("%v") ? true : false, + + // Store value for the length of the longest string in the column: + maxLength = 0, + + // Format the list according to options, store the length of the longest string: + formatted = map(list, function(val, i) { + if (isArray(val)) { + // Recursively format columns if list is a multi-dimensional array: + return lib.formatColumn(val, opts); + } else { + // Clean up the value + val = unformat(val); + + // Choose which format to use for this value (pos, neg or zero): + var useFormat = val > 0 ? formats.pos : val < 0 ? formats.neg : formats.zero, + + // Format this value, push into formatted list and save the length: + fVal = useFormat.replace('%s', opts.symbol).replace('%v', formatNumber(Math.abs(val), checkPrecision(opts.precision), opts.thousand, opts.decimal)); + + if (fVal.length > maxLength) maxLength = fVal.length; + return fVal; + } + }); + + // Pad each number in the list and send back the column of numbers: + return map(formatted, function(val, i) { + // Only if this is a string (not a nested array, which would have already been padded): + if (isString(val) && val.length < maxLength) { + // Depending on symbol position, pad after symbol or at index 0: + return padAfterSymbol ? val.replace(opts.symbol, opts.symbol+(new Array(maxLength - val.length + 1).join(" "))) : (new Array(maxLength - val.length + 1).join(" ")) + val; + } + return val; + }); + }; + + + /* --- Module Definition --- */ + + // Export accounting for CommonJS. If being loaded as an AMD module, define it as such. + // Otherwise, just add `accounting` to the global object + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = lib; + } + exports.accounting = lib; + } else if (typeof define === 'function' && define.amd) { + // Return the library as an AMD module: + define([], function() { + return lib; + }); + } else { + // Use accounting.noConflict to restore `accounting` back to its original value. + // Returns a reference to the library's `accounting` object; + // e.g. `var numbers = accounting.noConflict();` + lib.noConflict = (function(oldAccounting) { + return function() { + // Reset the value of the root's `accounting` variable: + root.accounting = oldAccounting; + // Delete the noConflict method: + lib.noConflict = undefined; + // Return reference to the library to re-assign it: + return lib; + }; + })(root.accounting); + + // Declare `fx` on the root (global/window) object: + root['accounting'] = lib; + } + + // Root will be `window` in browser or `global` on the server: +}(this)); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/accounting/accounting.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/accounting/accounting.min.js new file mode 100644 index 00000000..544b7301 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/accounting/accounting.min.js @@ -0,0 +1 @@ +!function(n){var f={version:"0.4.1",settings:{currency:{symbol:"$",format:"%s%v",decimal:".",thousand:",",precision:2,grouping:3},number:{precision:0,grouping:3,thousand:",",decimal:"."}}},i=Array.prototype.map,r=Array.isArray,e=Object.prototype.toString;function p(n){return!!(""===n||n&&n.charCodeAt&&n.substr)}function l(n){return r?r(n):"[object Array]"===e.call(n)}function m(n){return n&&"[object Object]"===e.call(n)}function d(n,r){var e;for(e in n=n||{},r=r||{})r.hasOwnProperty(e)&&null==n[e]&&(n[e]=r[e]);return n}function g(n,r,e){var t,o,a=[];if(!n)return a;if(i&&n.map===i)return n.map(r,e);for(t=0,o=n.length;ts&&(s=e.length),e}),function(n,r){return p(n)&&n.length=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return valuemax?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + + // Cache the prototype hasOwnProperty for faster access + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM + // operation produces the same effect as detach, i.e. removing the element + // without touching its jQuery data. + + // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+. + + if (!$.fn.detach) { + $.fn.detach = function() { + return this.each(function() { + if (this.parentNode) { + this.parentNode.removeChild( this ); + } + }); + }; + } + + /////////////////////////////////////////////////////////////////////////// + // The Canvas object is a wrapper around an HTML5 tag. + // + // @constructor + // @param {string} cls List of classes to apply to the canvas. + // @param {element} container Element onto which to append the canvas. + // + // Requiring a container is a little iffy, but unfortunately canvas + // operations don't work unless the canvas is attached to the DOM. + + function Canvas(cls, container) { + + var element = container.children("." + cls)[0]; + + if (element == null) { + + element = document.createElement("canvas"); + element.className = cls; + + $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) + .appendTo(container); + + // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas + + if (!element.getContext) { + if (window.G_vmlCanvasManager) { + element = window.G_vmlCanvasManager.initElement(element); + } else { + throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); + } + } + } + + this.element = element; + + var context = this.context = element.getContext("2d"); + + // Determine the screen's ratio of physical to device-independent + // pixels. This is the ratio between the canvas width that the browser + // advertises and the number of pixels actually present in that space. + + // The iPhone 4, for example, has a device-independent width of 320px, + // but its screen is actually 640px wide. It therefore has a pixel + // ratio of 2, while most normal devices have a ratio of 1. + + var devicePixelRatio = window.devicePixelRatio || 1, + backingStoreRatio = + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + + this.pixelRatio = devicePixelRatio / backingStoreRatio; + + // Size the canvas to match the internal dimensions of its container + + this.resize(container.width(), container.height()); + + // Collection of HTML div layers for text overlaid onto the canvas + + this.textContainer = null; + this.text = {}; + + // Cache of text fragments and metrics, so we can avoid expensively + // re-calculating them when the plot is re-rendered in a loop. + + this._textCache = {}; + } + + // Resizes the canvas to the given dimensions. + // + // @param {number} width New width of the canvas, in pixels. + // @param {number} width New height of the canvas, in pixels. + + Canvas.prototype.resize = function(width, height) { + + if (width <= 0 || height <= 0) { + throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); + } + + var element = this.element, + context = this.context, + pixelRatio = this.pixelRatio; + + // Resize the canvas, increasing its density based on the display's + // pixel ratio; basically giving it more pixels without increasing the + // size of its element, to take advantage of the fact that retina + // displays have that many more pixels in the same advertised space. + + // Resizing should reset the state (excanvas seems to be buggy though) + + if (this.width != width) { + element.width = width * pixelRatio; + element.style.width = width + "px"; + this.width = width; + } + + if (this.height != height) { + element.height = height * pixelRatio; + element.style.height = height + "px"; + this.height = height; + } + + // Save the context, so we can reset in case we get replotted. The + // restore ensure that we're really back at the initial state, and + // should be safe even if we haven't saved the initial state yet. + + context.restore(); + context.save(); + + // Scale the coordinate space to match the display density; so even though we + // may have twice as many pixels, we still want lines and other drawing to + // appear at the same size; the extra pixels will just make them crisper. + + context.scale(pixelRatio, pixelRatio); + }; + + // Clears the entire canvas area, not including any overlaid HTML text + + Canvas.prototype.clear = function() { + this.context.clearRect(0, 0, this.width, this.height); + }; + + // Finishes rendering the canvas, including managing the text overlay. + + Canvas.prototype.render = function() { + + var cache = this._textCache; + + // For each text layer, add elements marked as active that haven't + // already been rendered, and remove those that are no longer active. + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + + var layer = this.getTextLayer(layerKey), + layerCache = cache[layerKey]; + + layer.hide(); + + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var positions = styleCache[key].positions; + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + if (!position.rendered) { + layer.append(position.element); + position.rendered = true; + } + } else { + positions.splice(i--, 1); + if (position.rendered) { + position.element.detach(); + } + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + + layer.show(); + } + } + }; + + // Creates (if necessary) and returns the text overlay container. + // + // @param {string} classes String of space-separated CSS classes used to + // uniquely identify the text layer. + // @return {object} The jQuery-wrapped text-layer div. + + Canvas.prototype.getTextLayer = function(classes) { + + var layer = this.text[classes]; + + // Create the text layer if it doesn't exist + + if (layer == null) { + + // Create the text layer container, if it doesn't exist + + if (this.textContainer == null) { + this.textContainer = $("
    ") + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + 'font-size': "smaller", + color: "#545454" + }) + .insertAfter(this.element); + } + + layer = this.text[classes] = $("
    ") + .addClass(classes) + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0 + }) + .appendTo(this.textContainer); + } + + return layer; + }; + + // Creates (if necessary) and returns a text info object. + // + // The object looks like this: + // + // { + // width: Width of the text's wrapper div. + // height: Height of the text's wrapper div. + // element: The jQuery-wrapped HTML div containing the text. + // positions: Array of positions at which this text is drawn. + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // rendered: Flag indicating whether the text is currently visible. + // element: The jQuery-wrapped HTML div containing the text. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + // + // Each position after the first receives a clone of the original element. + // + // The idea is that that the width, height, and general 'identity' of the + // text is constant no matter where it is placed; the placements are a + // secondary property. + // + // Canvas maintains a cache of recently-used text info objects; getTextInfo + // either returns the cached element or creates a new entry. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {string} text Text string to retrieve info for. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @return {object} a text info object. + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number or such + + text = "" + text; + + // If the font is a font-spec object, generate a CSS font definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + // If we can't find a matching element in our cache, create a new one + + if (info == null) { + + var element = $("
    ").html(text) + .css({ + position: "absolute", + 'max-width': width, + top: -9999 + }) + .appendTo(this.getTextLayer(layer)); + + if (typeof font === "object") { + element.css({ + font: textStyle, + color: font.color + }); + } else if (typeof font === "string") { + element.addClass(font); + } + + info = styleCache[text] = { + width: element.outerWidth(true), + height: element.outerHeight(true), + element: element, + positions: [] + }; + + element.detach(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + // + // The text isn't drawn immediately; it is marked as rendering, which will + // result in its addition to the canvas on the next render pass. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number} x X coordinate at which to draw the text. + // @param {number} y Y coordinate at which to draw the text. + // @param {string} text Text string to draw. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @param {string=} halign Horizontal alignment of the text; either "left", + // "center" or "right". + // @param {string=} valign Vertical alignment of the text; either "top", + // "middle" or "bottom". + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions; + + // Tweak the div's position to match the text's alignment + + if (halign == "center") { + x -= info.width / 2; + } else if (halign == "right") { + x -= info.width; + } + + if (valign == "middle") { + y -= info.height / 2; + } else if (valign == "bottom") { + y -= info.height; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + // For the very first position we'll re-use the original element, + // while for subsequent ones we'll clone it. + + position = { + active: true, + rendered: false, + element: positions.length ? info.element.clone() : info.element, + x: x, + y: y + }; + + positions.push(position); + + // Move the element to its final position within the container + + position.element.css({ + top: Math.round(y), + left: Math.round(x), + 'text-align': halign // In case the text wraps + }); + }; + + // Removes one or more text strings from the canvas text overlay. + // + // If no parameters are given, all text within the layer is removed. + // + // Note that the text is not immediately removed; it is simply marked as + // inactive, which will result in its removal on the next render pass. + // This avoids the performance penalty for 'clear and redraw' behavior, + // where we potentially get rid of all text on a layer, but will likely + // add back most or all of it later, as when redrawing axes, for example. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number=} x X coordinate of the text. + // @param {number=} y Y coordinate of the text. + // @param {string=} text Text string to remove. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which the text is rotated, in degrees. + // Angle is currently unused, it will be implemented in the future. + + Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { + if (text == null) { + var layerCache = this._textCache[layer]; + if (layerCache != null) { + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + var positions = styleCache[key].positions; + for (var i = 0, position; position = positions[i]; i++) { + position.active = false; + } + } + } + } + } + } + } else { + var positions = this.getTextInfo(layer, text, font, angle).positions; + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = false; + } + } + } + }; + + /////////////////////////////////////////////////////////////////////////// + // The top-level container for the entire plot. + + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85, // set to 0 to avoid background + sorted: null // default to no legend sorting + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null // number or [number, "unit"] + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + // Omit 'zero', so we can later default its value to + // match that of the 'fill' option. + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // "left", "right", or "center" + horizontal: false, + zero: true + }, + shadowSize: 3, + highlightColor: null + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + margin: 0, // distance from the canvas edge to the grid + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + interaction: { + redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow + }, + hooks: {} + }, + surface = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + processOffset: [], + drawBackground: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return surface.element; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10) + }; + }; + plot.shutdown = shutdown; + plot.destroy = function () { + shutdown(); + placeholder.removeData("plot").empty(); + + series = []; + options = null; + surface = null; + overlay = null; + eventHolder = null; + ctx = null; + octx = null; + xaxes = []; + yaxes = []; + hooks = null; + highlights = []; + plot = null; + }; + plot.resize = function () { + var width = placeholder.width(), + height = placeholder.height(); + surface.resize(width, height); + overlay.resize(width, height); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + + // References to key classes, allowing plugins to modify them + + var classes = { + Canvas: Canvas + }; + + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot, classes); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + + $.extend(true, options, opts); + + // $.extend merges arrays, rather than replacing them. When less + // colors are provided than the size of the default palette, we + // end up with those colors plus the remaining defaults, which is + // not expected behavior; avoid it by replacing them here. + + if (opts && opts.colors) { + options.colors = opts.colors; + } + + if (options.xaxis.color == null) + options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + if (options.yaxis.color == null) + options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility + options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; + if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility + options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // Fill in defaults for axis options, including any unspecified + // font-spec fields, if a font-spec was provided. + + // If no x/y axis options were provided, create one of each anyway, + // since the rest of the code assumes that they exist. + + var i, axisOptions, axisCount, + fontSize = placeholder.css("font-size"), + fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13, + fontDefaults = { + style: placeholder.css("font-style"), + size: Math.round(0.8 * fontSizeDefault), + variant: placeholder.css("font-variant"), + weight: placeholder.css("font-weight"), + family: placeholder.css("font-family") + }; + + axisCount = options.xaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.xaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.xaxis, axisOptions); + options.xaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } + } + } + + axisCount = options.yaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.yaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.yaxis, axisOptions); + options.yaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } + } + } + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + // Override the inherit to allow the axis to auto-scale + if (options.x2axis.min == null) { + options.xaxes[1].min = null; + } + if (options.x2axis.max == null) { + options.xaxes[1].max = null; + } + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + // Override the inherit to allow the axis to auto-scale + if (options.y2axis.min == null) { + options.yaxes[1].min = null; + } + if (options.y2axis.max == null) { + options.yaxes[1].max = null; + } + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + if (options.highlightColor != null) + options.series.highlightColor = options.highlightColor; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + + var neededColors = series.length, maxIndex = -1, i; + + // Subtract the number of series that already have fixed colors or + // color indexes from the number that we still need to generate. + + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + neededColors--; + if (typeof sc == "number" && sc > maxIndex) { + maxIndex = sc; + } + } + } + + // If any of the series have fixed color indexes, then we need to + // generate at least as many colors as the highest index. + + if (neededColors <= maxIndex) { + neededColors = maxIndex + 1; + } + + // Generate all the colors, using first the option colors and then + // variations on those colors once they're exhausted. + + var c, colors = [], colorPool = options.colors, + colorPoolSize = colorPool.length, variation = 0; + + for (i = 0; i < neededColors; i++) { + + c = $.color.parse(colorPool[i % colorPoolSize] || "#666"); + + // Each time we exhaust the colors in the pool we adjust + // a scaling factor used to produce more variations on + // those colors. The factor alternates negative/positive + // to produce lighter/darker colors. + + // Reset the variation after every few cycles, or else + // it will end up producing only white or black colors. + + if (i % colorPoolSize == 0 && i) { + if (variation >= 0) { + if (variation < 0.5) { + variation = -variation - 0.2; + } else variation = 0; + } else variation = -variation; + } + + colors[i] = c.scale('rgb', 1 + variation); + } + + // Finalize the series options, filling in their colors + + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // If nothing was provided for lines.zero, default it to match + // lines.fill, since areas by default should extend to zero. + + if (s.lines.zero == null) { + s.lines.zero = !!s.lines.fill; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p, + data, format; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + data = s.data; + format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); + format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + var insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.autoscale !== false) { + if (f.x) { + updateAxis(s.xaxis, val, val); + } + if (f.y) { + updateAxis(s.yaxis, val, val); + } + } + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points; + ps = s.datapoints.pointsize; + format = s.datapoints.format; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta; + + switch (s.bars.align) { + case "left": + delta = 0; + break; + case "right": + delta = -s.bars.barWidth; + break; + default: + delta = -s.bars.barWidth / 2; + } + + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function setupCanvases() { + + // Make sure the placeholder is clear of everything except canvases + // from a previous plot in this container that we'll try to re-use. + + placeholder.css("padding", 0) // padding messes up the positioning + .children().filter(function(){ + return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base'); + }).remove(); + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + surface = new Canvas("flot-base", placeholder); + overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features + + ctx = surface.context; + octx = overlay.context; + + // define which element we're listening for events on + eventHolder = $(overlay.element).unbind(); + + // If we're re-using a plot object, shut down the old one + + var existing = placeholder.data("plot"); + + if (existing) { + existing.shutdown(); + overlay.clear(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + + // Use bind, rather than .mouseleave, because we officially + // still support jQuery 1.2.6, which doesn't define a shortcut + // for mouseenter or mouseleave. This was a bug/oversight that + // was fixed somewhere around 1.3.x. We can return to using + // .mouseleave when we drop support for 1.2.6. + + eventHolder.bind("mouseleave", onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + + var opts = axis.options, + ticks = axis.ticks || [], + labelWidth = opts.labelWidth || 0, + labelHeight = opts.labelHeight || 0, + maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null), + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = opts.font || "flot-tick-label tickLabel"; + + for (var i = 0; i < ticks.length; ++i) { + + var t = ticks[i]; + + if (!t.label) + continue; + + var info = surface.getTextInfo(layer, t.label, font, null, maxWidth); + + labelWidth = Math.max(labelWidth, info.width); + labelHeight = Math.max(labelHeight, info.height); + } + + axis.labelWidth = opts.labelWidth || labelWidth; + axis.labelHeight = opts.labelHeight || labelHeight; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset; this first phase only looks at one + // dimension per axis, the other dimension depends on the + // other axes so will have to wait + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + isXAxis = axis.direction === "x", + tickLength = axis.options.tickLength, + axisMargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + innermost = true, + outermost = true, + first = true, + found = false; + + // Determine the axis's position in its direction and on its side + + $.each(isXAxis ? xaxes : yaxes, function(i, a) { + if (a && (a.show || a.reserveSpace)) { + if (a === axis) { + found = true; + } else if (a.options.position === pos) { + if (found) { + outermost = false; + } else { + innermost = false; + } + } + if (!found) { + first = false; + } + } + }); + + // The outermost axis on each side has no margin + + if (outermost) { + axisMargin = 0; + } + + // The ticks for the first axis in each direction stretch across + + if (tickLength == null) { + tickLength = first ? "full" : 5; + } + + if (!isNaN(+tickLength)) + padding += +tickLength; + + if (isXAxis) { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axisMargin; + axis.box = { top: surface.height - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axisMargin, height: lh }; + plotOffset.top += lh + axisMargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axisMargin, width: lw }; + plotOffset.left += lw + axisMargin; + } + else { + plotOffset.right += lw + axisMargin; + axis.box = { left: surface.width - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // now that all axis boxes have been placed in one + // dimension, we can set the remaining dimension coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left - axis.labelWidth / 2; + axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; + } + else { + axis.box.top = plotOffset.top - axis.labelHeight / 2; + axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; + } + } + + function adjustLayoutForThingsStickingOut() { + // possibly adjust plot offset to ensure everything stays + // inside the canvas and isn't clipped off + + var minMargin = options.grid.minBorderMargin, + axis, i; + + // check stuff from the plot (FIXME: this should just read + // a value from the series, otherwise it's impossible to + // customize) + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); + } + + var margins = { + left: minMargin, + right: minMargin, + top: minMargin, + bottom: minMargin + }; + + // check axis labels, note we don't check the actual + // labels but instead use the overall width/height to not + // jump as much around with replots + $.each(allAxes(), function (_, axis) { + if (axis.reserveSpace && axis.ticks && axis.ticks.length) { + if (axis.direction === "x") { + margins.left = Math.max(margins.left, axis.labelWidth / 2); + margins.right = Math.max(margins.right, axis.labelWidth / 2); + } else { + margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2); + margins.top = Math.max(margins.top, axis.labelHeight / 2); + } + } + }); + + plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left)); + plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right)); + plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top)); + plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom)); + } + + function setupGrid() { + var i, axes = allAxes(), showGrid = options.grid.show; + + // Initialize the plot's offset from the edge of the canvas + + for (var a in plotOffset) { + var margin = options.grid.margin || 0; + plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0; + } + + executeHooks(hooks.processOffset, [plotOffset]); + + // If the grid is visible, add its border width to the offset + + for (var a in plotOffset) { + if(typeof(options.grid.borderWidth) == "object") { + plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; + } + else { + plotOffset[a] += showGrid ? options.grid.borderWidth : 0; + } + } + + $.each(axes, function (_, axis) { + var axisOpts = axis.options; + axis.show = axisOpts.show == null ? axis.used : axisOpts.show; + axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace; + setRange(axis); + }); + + if (showGrid) { + + var allocatedAxes = $.grep(axes, function (axis) { + return axis.show || axis.reserveSpace; + }); + + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions calculated, we can compute the + // axis bounding boxes, start from the outside + // (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + adjustLayoutForThingsStickingOut(); + + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + } + + plotWidth = surface.width - plotOffset.left - plotOffset.right; + plotHeight = surface.height - plotOffset.bottom - plotOffset.top; + + // now we got the proper plot dimensions, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (showGrid) { + drawAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height); + + var delta = (axis.max - axis.min) / noTicks, + dec = -Math.floor(Math.log(delta) / Math.LN10), + maxDec = opts.tickDecimals; + + if (maxDec != null && dec > maxDec) { + dec = maxDec; + } + + var magn = Math.pow(10, -dec), + norm = delta / magn, // norm is between 1.0 and 10.0 + size; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) { + size = opts.minTickSize; + } + + axis.delta = delta; + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + // Time mode was moved to a plug-in in 0.8, and since so many people use it + // we'll add an especially friendly reminder to make sure they included it. + + if (opts.mode == "time" && !axis.tickGenerator) { + throw new Error("Time mode requires the flot.time plugin."); + } + + // Flot supports base-10 axes; any other mode else is handled by a plug-in, + // like flot.time.js. + + if (!axis.tickGenerator) { + + axis.tickGenerator = function (axis) { + + var ticks = [], + start = floorInBase(axis.min, axis.tickSize), + i = 0, + v = Number.NaN, + prev; + + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + axis.tickFormatter = function (value, axis) { + + var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; + var formatted = "" + Math.round(value * factor) / factor; + + // If tickDecimals was specified, ensure that we have exactly that + // much precision; otherwise default to the value's own precision. + + if (axis.tickDecimals != null) { + var decimal = formatted.indexOf("."); + var precision = decimal == -1 ? 0 : formatted.length - decimal - 1; + if (precision < axis.tickDecimals) { + return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); + } + } + + return formatted; + }; + } + + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = axis.tickGenerator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + axis.tickGenerator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (!axis.mode && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1), + ts = axis.tickGenerator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks(axis); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + + surface.clear(); + + executeHooks(hooks.drawBackground, [ctx]); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) { + drawGrid(); + } + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) { + drawGrid(); + } + + surface.render(); + + // A draw implies that either the axes or data have changed, so we + // should probably update the overlay highlights as well. + + triggerRedrawOverlay(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (var i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i, axes, bw, bc; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + var xequal = xrange.from === xrange.to, + yequal = yrange.from === yrange.to; + + if (xequal && yequal) { + continue; + } + + // then draw + xrange.from = Math.floor(xrange.axis.p2c(xrange.from)); + xrange.to = Math.floor(xrange.axis.p2c(xrange.to)); + yrange.from = Math.floor(yrange.axis.p2c(yrange.from)); + yrange.to = Math.floor(yrange.axis.p2c(yrange.to)); + + if (xequal || yequal) { + var lineWidth = m.lineWidth || options.grid.markingsLineWidth, + subPixel = lineWidth % 2 ? 0.5 : 0; + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = lineWidth; + if (xequal) { + ctx.moveTo(xrange.to + subPixel, yrange.from); + ctx.lineTo(xrange.to + subPixel, yrange.to); + } else { + ctx.moveTo(xrange.from, yrange.to + subPixel); + ctx.lineTo(xrange.to, yrange.to + subPixel); + } + ctx.stroke(); + } else { + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + axes = allAxes(); + bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue; + + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.strokeStyle = axis.options.color; + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth + 1; + else + yoff = plotHeight + 1; + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") { + y = Math.floor(y) + 0.5; + } else { + x = Math.floor(x) + 0.5; + } + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + + ctx.strokeStyle = axis.options.tickColor; + + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (isNaN(v) || v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" + && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0) + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + // If either borderWidth or borderColor is an object, then draw the border + // line by line instead of as one rectangle + bc = options.grid.borderColor; + if(typeof bw == "object" || typeof bc == "object") { + if (typeof bw !== "object") { + bw = {top: bw, right: bw, bottom: bw, left: bw}; + } + if (typeof bc !== "object") { + bc = {top: bc, right: bc, bottom: bc, left: bc}; + } + + if (bw.top > 0) { + ctx.strokeStyle = bc.top; + ctx.lineWidth = bw.top; + ctx.beginPath(); + ctx.moveTo(0 - bw.left, 0 - bw.top/2); + ctx.lineTo(plotWidth, 0 - bw.top/2); + ctx.stroke(); + } + + if (bw.right > 0) { + ctx.strokeStyle = bc.right; + ctx.lineWidth = bw.right; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top); + ctx.lineTo(plotWidth + bw.right / 2, plotHeight); + ctx.stroke(); + } + + if (bw.bottom > 0) { + ctx.strokeStyle = bc.bottom; + ctx.lineWidth = bw.bottom; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2); + ctx.lineTo(0, plotHeight + bw.bottom / 2); + ctx.stroke(); + } + + if (bw.left > 0) { + ctx.strokeStyle = bc.left; + ctx.lineWidth = bw.left; + ctx.beginPath(); + ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom); + ctx.lineTo(0- bw.left/2, 0); + ctx.stroke(); + } + } + else { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + } + + ctx.restore(); + } + + function drawAxisLabels() { + + $.each(allAxes(), function (_, axis) { + var box = axis.box, + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = axis.options.font || "flot-tick-label tickLabel", + tick, x, y, halign, valign; + + // Remove text before checking for axis.show and ticks.length; + // otherwise plugins, like flot-tickrotor, that draw their own + // tick labels will end up with both theirs and the defaults. + + surface.removeText(layer); + + if (!axis.show || axis.ticks.length == 0) + return; + + for (var i = 0; i < axis.ticks.length; ++i) { + + tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + if (axis.direction == "x") { + halign = "center"; + x = plotOffset.left + axis.p2c(tick.v); + if (axis.position == "bottom") { + y = box.top + box.padding; + } else { + y = box.top + box.height - box.padding; + valign = "bottom"; + } + } else { + valign = "middle"; + y = plotOffset.top + axis.p2c(tick.v); + if (axis.position == "left") { + x = box.left + box.width - box.padding; + halign = "right"; + } else { + x = box.left + box.padding; + } + } + + surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); + } + }); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + + // If the user sets the line width to 0, we change it to a very + // small value. A line width of 0 seems to force the default of 1. + // Doing the conditional here allows the shadow setting to still be + // optional even with a lineWidth of 0. + + if( lw == 0 ) + lw = 0.0001; + + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.fillStyle = fillStyleCallback(bottom, top); + c.fillRect(left, top, right - left, bottom - top) + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom); + if (drawLeft) + c.lineTo(left, top); + else + c.moveTo(left, top); + if (drawTop) + c.lineTo(right, top); + else + c.moveTo(right, top); + if (drawRight) + c.lineTo(right, bottom); + else + c.moveTo(right, bottom); + if (drawBottom) + c.lineTo(left, bottom); + else + c.moveTo(left, bottom); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + + var barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } + + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + + if (options.legend.container != null) { + $(options.legend.container).html(""); + } else { + placeholder.find(".legend").remove(); + } + + if (!options.legend.show) { + return; + } + + var fragments = [], entries = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + + // Build a list of legend entries, with each having a label and a color + + for (var i = 0; i < series.length; ++i) { + s = series[i]; + if (s.label) { + label = lf ? lf(s.label, s) : s.label; + if (label) { + entries.push({ + label: label, + color: s.color + }); + } + } + } + + // Sort the legend using either the default or a custom comparator + + if (options.legend.sorted) { + if ($.isFunction(options.legend.sorted)) { + entries.sort(options.legend.sorted); + } else if (options.legend.sorted == "reverse") { + entries.reverse(); + } else { + var ascending = options.legend.sorted != "descending"; + entries.sort(function(a, b) { + return a.label == b.label ? 0 : ( + (a.label < b.label) != ascending ? 1 : -1 // Logical XOR + ); + }); + } + } + + // Generate markup for the list of entries, in their final order + + for (var i = 0; i < entries.length; ++i) { + + var entry = entries[i]; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push(''); + fragments.push(''); + rowStarted = true; + } + + fragments.push( + '
    ' + + '' + entry.label + '' + ); + } + + if (rowStarted) + fragments.push(''); + + if (fragments.length == 0) + return; + + var table = '' + fragments.join("") + '
    '; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('
    ' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
    ').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('
    ').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j, ps; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + ps = s.datapoints.pointsize; + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + + var barLeft, barRight; + + switch (s.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -s.bars.barWidth; + break; + default: + barLeft = -s.bars.barWidth / 2; + } + + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + var t = options.interaction.redrawOverlayInterval; + if (t == -1) { // skip event queue + drawOverlay(); + return; + } + + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, t); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + overlay.clear(); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + return; + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis, + highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = highlightColor; + var radius = 1.5 * pointRadius; + x = axisx.p2c(x); + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), + fillStyle = highlightColor, + barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } + + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = highlightColor; + + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness); + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + // Add the plot function to the top level of the jQuery object + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.8.3"; + + $.plot.plugins = []; + + // Also add the plot function as a chainable property + + $.fn.plot = function(data, options) { + return this.each(function() { + $.plot(this, data, options); + }); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.min.js new file mode 100644 index 00000000..a31c843b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.min.js @@ -0,0 +1 @@ +!function(a){a.color={},a.color.make=function(t,i,e,o){var n={};return n.r=t||0,n.g=i||0,n.b=e||0,n.a=null!=o?o:1,n.add=function(t,i){for(var e=0;et.datamax&&e!=p&&(t.datamax=e)}for(q.each(A(),function(t,i){i.datamin=u,i.datamax=d,i.used=!1}),t=0;ti.max||("x"==i.direction?(a="center",o=w.left+i.p2c(e.v),"bottom"==i.position?n=l.top+l.padding:(n=l.top+l.height-l.padding,r="bottom")):(r="middle",n=w.top+i.p2c(e.v),"left"==i.position?(o=l.left+l.width-l.padding,a="right"):o=l.left+l.padding),d.addText(c,o,n,e.label,h,null,null,a,r))}),function(){null!=S.legend.container?q(S.legend.container).html(""):x.find(".legend").remove();if(!S.legend.show)return;for(var t,i,e=[],o=[],n=!1,a=S.legend.labelFormatter,r=0;r"),e.push(""),n=!0),e.push('
    '+s.label+"")}n&&e.push("");if(0==e.length)return;var c=''+e.join("")+"
    ";if(null!=S.legend.container)q(S.legend.container).html(c);else{var h="",f=S.legend.position,u=S.legend.margin;null==u[0]&&(u=[u,u]),"n"==f.charAt(0)?h+="top:"+(u[1]+w.top)+"px;":"s"==f.charAt(0)&&(h+="bottom:"+(u[1]+w.bottom)+"px;"),"e"==f.charAt(1)?h+="right:"+(u[0]+w.right)+"px;":"w"==f.charAt(1)&&(h+="left:"+(u[0]+w.left)+"px;");var d=q('
    '+c.replace('style="','style="position:absolute;'+h+";")+"
    ").appendTo(x);if(0!=S.legend.backgroundOpacity){var p=S.legend.backgroundColor;null==p&&((p=(p=S.grid.backgroundColor)&&"string"==typeof p?q.color.parse(p):q.color.extract(d,"background-color")).a=1,p=p.toString());var m=d.children();q('
    ').prependTo(d).css("opacity",S.legend.backgroundOpacity)}}}()}function s(){d.clear(),I(W.drawBackground,[y]);var t=S.grid;t.show&&t.backgroundColor&&(y.save(),y.translate(w.left,w.top),y.fillStyle=Y(S.grid.backgroundColor,T,0,"rgba(255, 255, 255, 0)"),y.fillRect(0,0,M,T),y.restore()),t.show&&!t.aboveData&&u();for(var i=0;ir.axis.max||l.tol.axis.max)){r.from=Math.max(r.from,r.axis.min),r.to=Math.min(r.to,r.axis.max),l.from=Math.max(l.from,l.axis.min),l.to=Math.min(l.to,l.axis.max);var s=r.from===r.to,c=l.from===l.to;if(!s||!c)if(r.from=Math.floor(r.axis.p2c(r.from)),r.to=Math.floor(r.axis.p2c(r.to)),l.from=Math.floor(l.axis.p2c(l.from)),l.to=Math.floor(l.axis.p2c(l.to)),s||c){var h=a.lineWidth||S.grid.markingsLineWidth,f=h%2?.5:0;y.beginPath(),y.strokeStyle=a.color||S.grid.markingsColor,y.lineWidth=h,s?(y.moveTo(r.to+f,l.from),y.lineTo(r.to+f,l.to)):(y.moveTo(r.from,l.to+f),y.lineTo(r.to,l.to+f)),y.stroke()}else y.fillStyle=a.color||S.grid.markingsColor,y.fillRect(r.from,l.to,r.to-r.from,l.from-l.to)}}i=A(),e=S.grid.borderWidth;for(var u=0;ug.max||"full"==v&&("object"==typeof e&&0n.max){if(d>n.max)continue;h=(n.max-f)/(d-f)*(u-h)+h,f=n.max}else if(f<=d&&d>n.max){if(f>n.max)continue;u=(n.max-f)/(d-f)*(u-h)+h,d=n.max}if(h<=u&&ho.max){if(u>o.max)continue;f=(o.max-h)/(u-h)*(d-f)+f,h=o.max}else if(h<=u&&u>o.max){if(h>o.max)continue;d=(o.max-h)/(u-h)*(d-f)+f,u=o.max}h==l&&f==s||y.moveTo(o.p2c(h)+i,n.p2c(f)+e),l=u,s=d,y.lineTo(o.p2c(u)+i,n.p2c(d)+e)}}y.stroke()}y.save(),y.translate(w.left,w.top),y.lineJoin="round";var e=t.lines.lineWidth,o=t.shadowSize;if(0o.length+n);){var f=o[(r+=n)-n],u=o[r-n+s],d=o[r],p=o[r+s];if(l){if(0i.max){if(d>i.max)continue;u=(i.max-f)/(d-f)*(p-u)+u,f=i.max}else if(f<=d&&d>i.max){if(f>i.max)continue;p=(i.max-f)/(d-f)*(p-u)+u,d=i.max}if(l||(y.beginPath(),y.moveTo(i.p2c(f),e.p2c(a)),l=!0),u>=e.max&&p>=e.max)y.lineTo(i.p2c(f),e.p2c(e.max)),y.lineTo(i.p2c(d),e.p2c(e.max));else if(u<=e.min&&p<=e.min)y.lineTo(i.p2c(f),e.p2c(e.min)),y.lineTo(i.p2c(d),e.p2c(e.min));else{var m=f,x=d;u<=p&&u=e.min?(f=(e.min-u)/(p-u)*(d-f)+f,u=e.min):p<=u&&p=e.min&&(d=(e.min-u)/(p-u)*(d-f)+f,p=e.min),p<=u&&u>e.max&&p<=e.max?(f=(e.max-u)/(p-u)*(d-f)+f,u=e.max):u<=p&&p>e.max&&u<=e.max&&(d=(e.max-u)/(p-u)*(d-f)+f,p=e.max),f!=m&&y.lineTo(i.p2c(m),e.p2c(u)),y.lineTo(i.p2c(f),e.p2c(u)),y.lineTo(i.p2c(d),e.p2c(p)),d!=x&&(y.lineTo(i.p2c(d),e.p2c(p)),y.lineTo(i.p2c(x),e.p2c(p)))}}}}(t.datapoints,t.xaxis,t.yaxis));0a.max||ur.max||(y.beginPath(),f=a.p2c(f),u=r.p2c(u)+o,"circle"==l?y.arc(f,u,i,0,n?Math.PI:2*Math.PI,!1):l(y,f,u,i,n),y.closePath(),e&&(y.fillStyle=e,y.fill()),y.stroke())}}y.save(),y.translate(w.left,w.top);var e=t.points.lineWidth,o=t.shadowSize,n=t.points.radius,a=t.points.symbol;0==e&&(e=1e-4);if(0r.max||pl.max||(fr.max&&(u=r.max,x=!1),dl.max&&(p=l.max,g=!1),f=r.p2c(f),d=l.p2c(d),u=r.p2c(u),p=l.p2c(p),a&&(s.fillStyle=a(d,p),s.fillRect(f,p,u-f,d-p)),0=Math.min(T,g)&&b+w<=p&&p<=b+M:g+w<=d&&d<=g+M&&p>=Math.min(T,b)&&p<=Math.max(T,b))&&(s=[o,n/a])}}}return s?(o=s[0],n=s[1],a=C[o].datapoints.pointsize,{datapoint:C[o].datapoints.points.slice(n*a,(n+1)*a),dataIndex:n,series:C[o],seriesIndex:o}):null}(n,a,e);if(l&&(l.pageX=parseInt(l.series.xaxis.p2c(l.datapoint[0])+o.left+w.left,10),l.pageY=parseInt(l.series.yaxis.p2c(l.datapoint[1])+o.top+w.top,10)),S.grid.autoHighlight){for(var s=0;sn.max||oa.max)){var l=t.points.radius+t.points.lineWidth/2;c.lineWidth=l,c.strokeStyle=r;var s=1.5*l;e=n.p2c(e),o=a.p2c(o),c.beginPath(),"circle"==t.points.symbol?c.arc(e,o,s,0,2*Math.PI,!1):t.points.symbol(c,e,o,s,!1),c.closePath(),c.stroke()}}function X(t,i){var e,o="string"==typeof t.highlightColor?t.highlightColor:q.color.parse(t.color).scale("a",.5).toString(),n=o;switch(t.bars.align){case"left":e=0;break;case"right":e=-t.bars.barWidth;break;default:e=-t.bars.barWidth/2}c.lineWidth=t.bars.lineWidth,c.strokeStyle=o,k(i[0],i[1],i[2]||0,e,e+t.bars.barWidth,function(){return n},t.xaxis,t.yaxis,c,t.bars.horizontal,t.bars.lineWidth)}function Y(t,i,e,o){if("string"==typeof t)return t;for(var n=y.createLinearGradient(0,e,0,i),a=0,r=t.colors.length;a").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),i=this.text[t]=q("
    ").addClass(t).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),i},Q.prototype.getTextInfo=function(t,i,e,o,n){var a,r,l,s;if(i=""+i,a="object"==typeof e?e.style+" "+e.variant+" "+e.weight+" "+e.size+"px/"+e.lineHeight+"px "+e.family:e,null==(r=this._textCache[t])&&(r=this._textCache[t]={}),null==(l=r[a])&&(l=r[a]={}),null==(s=l[i])){var c=q("
    ").html(i).css({position:"absolute","max-width":n,top:-9999}).appendTo(this.getTextLayer(t));"object"==typeof e?c.css({font:a,color:e.color}):"string"==typeof e&&c.addClass(e),s=l[i]={width:c.outerWidth(!0),height:c.outerHeight(!0),element:c,positions:[]},c.detach()}return s},Q.prototype.addText=function(t,i,e,o,n,a,r,l,s){var c=this.getTextInfo(t,o,n,a,r),h=c.positions;"center"==l?i-=c.width/2:"right"==l&&(i-=c.width),"middle"==s?e-=c.height/2:"bottom"==s&&(e-=c.height);for(var f,u=0;f=h[u];u++)if(f.x==i&&f.y==e)return void(f.active=!0);f={active:!0,rendered:!1,element:h.length?c.element.clone():c.element,x:i,y:e},h.push(f),f.element.css({top:Math.round(e),left:Math.round(i),"text-align":l})},Q.prototype.removeText=function(t,i,e,o,n,a){if(null==o){var r=this._textCache[t];if(null!=r)for(var l in r)if(d.call(r,l)){var s=r[l];for(var c in s)if(d.call(s,c))for(var h=s[c].positions,f=0;u=h[f];f++)u.active=!1}}else{var u;for(h=this.getTextInfo(t,o,n,a).positions,f=0;u=h[f];f++)u.x==i&&u.y==e&&(u.active=!1)}},q.plot=function(t,i,e){return new o(q(t),i,e,q.plot.plugins)},q.plot.version="0.8.3",q.plot.plugins=[],q.fn.plot=function(t,i){return this.each(function(){q.plot(this,t,i)})}}(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.resize.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.resize.js new file mode 100644 index 00000000..8a626dda --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.resize.js @@ -0,0 +1,59 @@ +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*/ + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this); + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.resize.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.resize.min.js new file mode 100644 index 00000000..cb385031 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.resize.min.js @@ -0,0 +1 @@ +!function(o,s,u){var h,m=[],l=o.resize=o.extend(o.resize,{}),c=!1,i="setTimeout",d="resize",f=d+"-special-event",g="pendingDelay",n="activeDelay",a="throttleWindow";function v(e){!0===c&&(c=e||1);for(var t=m.length-1;0<=t;t--){var i=o(m[t]);if(i[0]==s||i.is(":visible")){var n=i.width(),a=i.height(),r=i.data(f);!r||n===r.w&&a===r.h||(i.trigger(d,[r.w=n,r.h=a]),c=e||!0)}else(r=i.data(f)).w=0,r.h=0}null!==h&&(c&&(null==e||e-c<1e3)?h=s.requestAnimationFrame(v):(h=setTimeout(v,l[g]),c=!1))}l[g]=200,l[n]=20,l[a]=!0,o.event.special[d]={setup:function(){if(!l[a]&&this[i])return!1;var e=o(this);m.push(this),e.data(f,{w:e.width(),h:e.height()}),1===m.length&&(h=u,v())},teardown:function(){if(!l[a]&&this[i])return!1;for(var e=o(this),t=m.length-1;0<=t;t--)if(m[t]==this){m.splice(t,1);break}e.removeData(f),m.length||(c?cancelAnimationFrame(h):clearTimeout(h),h=null)},add:function(e){if(!l[a]&&this[i])return!1;var r;function t(e,t,i){var n=o(this),a=n.data(f)||{};a.w=t!==u?t:n.width(),a.h=i!==u?i:n.height(),r.apply(this,arguments)}if(o.isFunction(e))return r=e,t;r=e.handler,e.handler=t}},s.requestAnimationFrame||(s.requestAnimationFrame=s.webkitRequestAnimationFrame||s.mozRequestAnimationFrame||s.oRequestAnimationFrame||s.msRequestAnimationFrame||function(e,t){return s.setTimeout(function(){e((new Date).getTime())},l[n])}),s.cancelAnimationFrame||(s.cancelAnimationFrame=s.webkitCancelRequestAnimationFrame||s.mozCancelRequestAnimationFrame||s.oCancelRequestAnimationFrame||s.msCancelRequestAnimationFrame||clearTimeout)}(jQuery,this),jQuery.plot.plugins.push({init:function(t){function i(){var e=t.getPlaceholder();0!=e.width()&&0!=e.height()&&(t.resize(),t.setupGrid(),t.draw())}t.hooks.bindEvents.push(function(e,t){e.getPlaceholder().resize(i)}),t.hooks.shutdown.push(function(e,t){e.getPlaceholder().unbind("resize",i)})},options:{},name:"resize",version:"1.0"}); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.time.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.time.js new file mode 100644 index 00000000..34c1d121 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.time.js @@ -0,0 +1,432 @@ +/* Pretty handling of time axes. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +Set axis.mode to "time" to enable. See the section "Time series data" in +API.txt for details. + +*/ + +(function($) { + + var options = { + xaxis: { + timezone: null, // "browser" for local to the client or timezone for timezone-js + timeformat: null, // format string to use + twelveHourClock: false, // 12 or 24 time in time mode + monthNames: null // list of names of months + } + }; + + // round to nearby lower multiple of base + + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + + // Returns a string with the date d formatted according to fmt. + // A subset of the Open Group's strftime format is supported. + + function formatDate(d, fmt, monthNames, dayNames) { + + if (typeof d.strftime == "function") { + return d.strftime(fmt); + } + + var leftPad = function(n, pad) { + n = "" + n; + pad = "" + (pad == null ? "0" : pad); + return n.length == 1 ? pad + n : n; + }; + + var r = []; + var escape = false; + var hours = d.getHours(); + var isAM = hours < 12; + + if (monthNames == null) { + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + } + + if (dayNames == null) { + dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + } + + var hours12; + + if (hours > 12) { + hours12 = hours - 12; + } else if (hours == 0) { + hours12 = 12; + } else { + hours12 = hours; + } + + for (var i = 0; i < fmt.length; ++i) { + + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'a': c = "" + dayNames[d.getDay()]; break; + case 'b': c = "" + monthNames[d.getMonth()]; break; + case 'd': c = leftPad(d.getDate()); break; + case 'e': c = leftPad(d.getDate(), " "); break; + case 'h': // For back-compat with 0.7; remove in 1.0 + case 'H': c = leftPad(hours); break; + case 'I': c = leftPad(hours12); break; + case 'l': c = leftPad(hours12, " "); break; + case 'm': c = leftPad(d.getMonth() + 1); break; + case 'M': c = leftPad(d.getMinutes()); break; + // quarters not in Open Group's strftime specification + case 'q': + c = "" + (Math.floor(d.getMonth() / 3) + 1); break; + case 'S': c = leftPad(d.getSeconds()); break; + case 'y': c = leftPad(d.getFullYear() % 100); break; + case 'Y': c = "" + d.getFullYear(); break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case 'w': c = "" + d.getDay(); break; + } + r.push(c); + escape = false; + } else { + if (c == "%") { + escape = true; + } else { + r.push(c); + } + } + } + + return r.join(""); + } + + // To have a consistent view of time-based data independent of which time + // zone the client happens to be in we need a date-like object independent + // of time zones. This is done through a wrapper that only calls the UTC + // versions of the accessor methods. + + function makeUtcWrapper(d) { + + function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) { + sourceObj[sourceMethod] = function() { + return targetObj[targetMethod].apply(targetObj, arguments); + }; + }; + + var utc = { + date: d + }; + + // support strftime, if found + + if (d.strftime != undefined) { + addProxyMethod(utc, "strftime", d, "strftime"); + } + + addProxyMethod(utc, "getTime", d, "getTime"); + addProxyMethod(utc, "setTime", d, "setTime"); + + var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"]; + + for (var p = 0; p < props.length; p++) { + addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]); + addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]); + } + + return utc; + }; + + // select time zone strategy. This returns a date-like object tied to the + // desired timezone + + function dateGenerator(ts, opts) { + if (opts.timezone == "browser") { + return new Date(ts); + } else if (!opts.timezone || opts.timezone == "utc") { + return makeUtcWrapper(new Date(ts)); + } else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") { + var d = new timezoneJS.Date(); + // timezone-js is fickle, so be sure to set the time zone before + // setting the time. + d.setTimezone(opts.timezone); + d.setTime(ts); + return d; + } else { + return makeUtcWrapper(new Date(ts)); + } + } + + // map of app. size of time units in milliseconds + + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "quarter": 3 * 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + + var baseSpec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"] + ]; + + // we don't know which variant(s) we'll need yet, but generating both is + // cheap + + var specMonths = baseSpec.concat([[3, "month"], [6, "month"], + [1, "year"]]); + var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"], + [1, "year"]]); + + function init(plot) { + plot.hooks.processOptions.push(function (plot, options) { + $.each(plot.getAxes(), function(axisName, axis) { + + var opts = axis.options; + + if (opts.mode == "time") { + axis.tickGenerator = function(axis) { + + var ticks = []; + var d = dateGenerator(axis.min, opts); + var minSize = 0; + + // make quarter use a possibility if quarters are + // mentioned in either of these options + + var spec = (opts.tickSize && opts.tickSize[1] === + "quarter") || + (opts.minTickSize && opts.minTickSize[1] === + "quarter") ? specQuarters : specMonths; + + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") { + minSize = opts.tickSize; + } else { + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + } + + for (var i = 0; i < spec.length - 1; ++i) { + if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) { + break; + } + } + + var size = spec[i][0]; + var unit = spec[i][1]; + + // special-case the possibility of several years + + if (unit == "year") { + + // if given a minTickSize in years, just use it, + // ensuring that it's an integer + + if (opts.minTickSize != null && opts.minTickSize[1] == "year") { + size = Math.floor(opts.minTickSize[0]); + } else { + + var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10)); + var norm = (axis.delta / timeUnitSize.year) / magn; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + } + + // minimum size for years is 1 + + if (size < 1) { + size = 1; + } + } + + axis.tickSize = opts.tickSize || [size, unit]; + var tickSize = axis.tickSize[0]; + unit = axis.tickSize[1]; + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") { + d.setSeconds(floorInBase(d.getSeconds(), tickSize)); + } else if (unit == "minute") { + d.setMinutes(floorInBase(d.getMinutes(), tickSize)); + } else if (unit == "hour") { + d.setHours(floorInBase(d.getHours(), tickSize)); + } else if (unit == "month") { + d.setMonth(floorInBase(d.getMonth(), tickSize)); + } else if (unit == "quarter") { + d.setMonth(3 * floorInBase(d.getMonth() / 3, + tickSize)); + } else if (unit == "year") { + d.setFullYear(floorInBase(d.getFullYear(), tickSize)); + } + + // reset smaller components + + d.setMilliseconds(0); + + if (step >= timeUnitSize.minute) { + d.setSeconds(0); + } + if (step >= timeUnitSize.hour) { + d.setMinutes(0); + } + if (step >= timeUnitSize.day) { + d.setHours(0); + } + if (step >= timeUnitSize.day * 4) { + d.setDate(1); + } + if (step >= timeUnitSize.month * 2) { + d.setMonth(floorInBase(d.getMonth(), 3)); + } + if (step >= timeUnitSize.quarter * 2) { + d.setMonth(floorInBase(d.getMonth(), 6)); + } + if (step >= timeUnitSize.year) { + d.setMonth(0); + } + + var carry = 0; + var v = Number.NaN; + var prev; + + do { + + prev = v; + v = d.getTime(); + ticks.push(v); + + if (unit == "month" || unit == "quarter") { + if (tickSize < 1) { + + // a bit complicated - we'll divide the + // month/quarter up but we need to take + // care of fractions so we don't end up in + // the middle of a day + + d.setDate(1); + var start = d.getTime(); + d.setMonth(d.getMonth() + + (unit == "quarter" ? 3 : 1)); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getHours(); + d.setHours(0); + } else { + d.setMonth(d.getMonth() + + tickSize * (unit == "quarter" ? 3 : 1)); + } + } else if (unit == "year") { + d.setFullYear(d.getFullYear() + tickSize); + } else { + d.setTime(v + step); + } + } while (v < axis.max && v != prev); + + return ticks; + }; + + axis.tickFormatter = function (v, axis) { + + var d = dateGenerator(v, axis.options); + + // first check global format + + if (opts.timeformat != null) { + return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames); + } + + // possibly use quarters if quarters are mentioned in + // any of these places + + var useQuarters = (axis.options.tickSize && + axis.options.tickSize[1] == "quarter") || + (axis.options.minTickSize && + axis.options.minTickSize[1] == "quarter"); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + var hourCode = (opts.twelveHourClock) ? "%I" : "%H"; + var fmt; + + if (t < timeUnitSize.minute) { + fmt = hourCode + ":%M:%S" + suffix; + } else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) { + fmt = hourCode + ":%M" + suffix; + } else { + fmt = "%b %d " + hourCode + ":%M" + suffix; + } + } else if (t < timeUnitSize.month) { + fmt = "%b %d"; + } else if ((useQuarters && t < timeUnitSize.quarter) || + (!useQuarters && t < timeUnitSize.year)) { + if (span < timeUnitSize.year) { + fmt = "%b"; + } else { + fmt = "%b %Y"; + } + } else if (useQuarters && t < timeUnitSize.year) { + if (span < timeUnitSize.year) { + fmt = "Q%q"; + } else { + fmt = "Q%q %Y"; + } + } else { + fmt = "%Y"; + } + + var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames); + + return rt; + }; + } + }); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'time', + version: '1.0' + }); + + // Time-axis support used to be in Flot core, which exposed the + // formatDate function on the plot object. Various plugins depend + // on the function, so we need to re-expose it here. + + $.plot.formatDate = formatDate; + $.plot.dateGenerator = dateGenerator; + +})(jQuery); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.time.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.time.min.js new file mode 100644 index 00000000..50482e0a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/flot/jquery.flot.time.min.js @@ -0,0 +1 @@ +!function(n){function S(e,t){return t*Math.floor(e/t)}function u(e,t,n,r){if("function"==typeof e.strftime)return e.strftime(t);function a(e,t){return t=""+(null==t?"0":t),1==(e=""+e).length?t+e:e}var i,o=[],s=!1,u=e.getHours(),c=u<12;null==n&&(n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),null==r&&(r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),i=12=r);++i);var o=a[i][0],s=a[i][1];if("year"==s){if(null!=d.minTickSize&&"year"==d.minTickSize[1])o=Math.floor(d.minTickSize[0]);else{var u=Math.pow(10,Math.floor(Math.log(e.delta/z.year)/Math.LN10)),c=e.delta/z.year/u;o=c<1.5?1:c<3?2:c<7.5?5:10,o*=u}o<1&&(o=1)}e.tickSize=d.tickSize||[o,s];var m=e.tickSize[0];s=e.tickSize[1];var l=m*z[s];"second"==s?n.setSeconds(S(n.getSeconds(),m)):"minute"==s?n.setMinutes(S(n.getMinutes(),m)):"hour"==s?n.setHours(S(n.getHours(),m)):"month"==s?n.setMonth(S(n.getMonth(),m)):"quarter"==s?n.setMonth(3*S(n.getMonth()/3,m)):"year"==s&&n.setFullYear(S(n.getFullYear(),m)),n.setMilliseconds(0),z.minute<=l&&n.setSeconds(0),z.hour<=l&&n.setMinutes(0),z.day<=l&&n.setHours(0),4*z.day<=l&&n.setDate(1),2*z.month<=l&&n.setMonth(S(n.getMonth(),3)),2*z.quarter<=l&&n.setMonth(S(n.getMonth(),6)),z.year<=l&&n.setMonth(0);var h,f=0,k=Number.NaN;do{if(h=k,k=n.getTime(),t.push(k),"month"==s||"quarter"==s)if(m<1){n.setDate(1);var M=n.getTime();n.setMonth(n.getMonth()+("quarter"==s?3:1));var g=n.getTime();n.setTime(k+f*z.hour+(g-M)*m),f=n.getHours(),n.setHours(0)}else n.setMonth(n.getMonth()+m*("quarter"==s?3:1));else"year"==s?n.setFullYear(n.getFullYear()+m):n.setTime(k+l)}while(k= 0) { + timeoutDuration = 1; + break; + } +} + +function microtaskDebounce(fn) { + var called = false; + return function () { + if (called) { + return; + } + called = true; + window.Promise.resolve().then(function () { + called = false; + fn(); + }); + }; +} + +function taskDebounce(fn) { + var scheduled = false; + return function () { + if (!scheduled) { + scheduled = true; + setTimeout(function () { + scheduled = false; + fn(); + }, timeoutDuration); + } + }; +} + +var supportsMicroTasks = isBrowser$1 && window.Promise; + +/** +* Create a debounced version of a method, that's asynchronously deferred +* but called in the minimum time possible. +* +* @method +* @memberof Popper.Utils +* @argument {Function} fn +* @returns {Function} +*/ +var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; + +/** + * Check if the given variable is a function + * @method + * @memberof Popper.Utils + * @argument {Any} functionToCheck - variable to check + * @returns {Boolean} answer to: is a function? + */ +function isFunction(functionToCheck) { + var getType = {}; + return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; +} + +/** + * Get CSS computed property of the given element + * @method + * @memberof Popper.Utils + * @argument {Eement} element + * @argument {String} property + */ +function getStyleComputedProperty(element, property) { + if (element.nodeType !== 1) { + return []; + } + // NOTE: 1 DOM access here + var window = element.ownerDocument.defaultView; + var css = window.getComputedStyle(element, null); + return property ? css[property] : css; +} + +/** + * Returns the parentNode or the host of the element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} parent + */ +function getParentNode(element) { + if (element.nodeName === 'HTML') { + return element; + } + return element.parentNode || element.host; +} + +/** + * Returns the scrolling parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} scroll parent + */ +function getScrollParent(element) { + // Return body, `getScroll` will take care to get the correct `scrollTop` from it + if (!element) { + return document.body; + } + + switch (element.nodeName) { + case 'HTML': + case 'BODY': + return element.ownerDocument.body; + case '#document': + return element.body; + } + + // Firefox want us to check `-x` and `-y` variations as well + + var _getStyleComputedProp = getStyleComputedProperty(element), + overflow = _getStyleComputedProp.overflow, + overflowX = _getStyleComputedProp.overflowX, + overflowY = _getStyleComputedProp.overflowY; + + if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { + return element; + } + + return getScrollParent(getParentNode(element)); +} + +var isIE11 = isBrowser$1 && !!(window.MSInputMethodContext && document.documentMode); +var isIE10 = isBrowser$1 && /MSIE 10/.test(navigator.userAgent); + +/** + * Determines if the browser is Internet Explorer + * @method + * @memberof Popper.Utils + * @param {Number} version to check + * @returns {Boolean} isIE + */ +function isIE$1(version) { + if (version === 11) { + return isIE11; + } + if (version === 10) { + return isIE10; + } + return isIE11 || isIE10; +} + +/** + * Returns the offset parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} offset parent + */ +function getOffsetParent(element) { + if (!element) { + return document.documentElement; + } + + var noOffsetParent = isIE$1(10) ? document.body : null; + + // NOTE: 1 DOM access here + var offsetParent = element.offsetParent || null; + // Skip hidden elements which don't have an offsetParent + while (offsetParent === noOffsetParent && element.nextElementSibling) { + offsetParent = (element = element.nextElementSibling).offsetParent; + } + + var nodeName = offsetParent && offsetParent.nodeName; + + if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { + return element ? element.ownerDocument.documentElement : document.documentElement; + } + + // .offsetParent will return the closest TH, TD or TABLE in case + // no offsetParent is present, I hate this job... + if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { + return getOffsetParent(offsetParent); + } + + return offsetParent; +} + +function isOffsetContainer(element) { + var nodeName = element.nodeName; + + if (nodeName === 'BODY') { + return false; + } + return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; +} + +/** + * Finds the root node (document, shadowDOM root) of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} node + * @returns {Element} root node + */ +function getRoot(node) { + if (node.parentNode !== null) { + return getRoot(node.parentNode); + } + + return node; +} + +/** + * Finds the offset parent common to the two provided nodes + * @method + * @memberof Popper.Utils + * @argument {Element} element1 + * @argument {Element} element2 + * @returns {Element} common offset parent + */ +function findCommonOffsetParent(element1, element2) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { + return document.documentElement; + } + + // Here we make sure to give as "start" the element that comes first in the DOM + var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; + var start = order ? element1 : element2; + var end = order ? element2 : element1; + + // Get common ancestor container + var range = document.createRange(); + range.setStart(start, 0); + range.setEnd(end, 0); + var commonAncestorContainer = range.commonAncestorContainer; + + // Both nodes are inside #document + + if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { + if (isOffsetContainer(commonAncestorContainer)) { + return commonAncestorContainer; + } + + return getOffsetParent(commonAncestorContainer); + } + + // one of the nodes is inside shadowDOM, find which one + var element1root = getRoot(element1); + if (element1root.host) { + return findCommonOffsetParent(element1root.host, element2); + } else { + return findCommonOffsetParent(element1, getRoot(element2).host); + } +} + +/** + * Gets the scroll value of the given element in the given side (top and left) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {String} side `top` or `left` + * @returns {number} amount of scrolled pixels + */ +function getScroll(element) { + var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; + + var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; + var nodeName = element.nodeName; + + if (nodeName === 'BODY' || nodeName === 'HTML') { + var html = element.ownerDocument.documentElement; + var scrollingElement = element.ownerDocument.scrollingElement || html; + return scrollingElement[upperSide]; + } + + return element[upperSide]; +} + +/* + * Sum or subtract the element scroll values (left and top) from a given rect object + * @method + * @memberof Popper.Utils + * @param {Object} rect - Rect object you want to change + * @param {HTMLElement} element - The element from the function reads the scroll values + * @param {Boolean} subtract - set to true if you want to subtract the scroll values + * @return {Object} rect - The modifier rect object + */ +function includeScroll(rect, element) { + var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + var modifier = subtract ? -1 : 1; + rect.top += scrollTop * modifier; + rect.bottom += scrollTop * modifier; + rect.left += scrollLeft * modifier; + rect.right += scrollLeft * modifier; + return rect; +} + +/* + * Helper to detect borders of a given element + * @method + * @memberof Popper.Utils + * @param {CSSStyleDeclaration} styles + * Result of `getStyleComputedProperty` on the given element + * @param {String} axis - `x` or `y` + * @return {number} borders - The borders size of the given axis + */ + +function getBordersSize(styles, axis) { + var sideA = axis === 'x' ? 'Left' : 'Top'; + var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; + + return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10); +} + +function getSize(axis, body, html, computedStyle) { + return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE$1(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); +} + +function getWindowSizes(document) { + var body = document.body; + var html = document.documentElement; + var computedStyle = isIE$1(10) && getComputedStyle(html); + + return { + height: getSize('Height', body, html, computedStyle), + width: getSize('Width', body, html, computedStyle) + }; +} + +var classCallCheck = function classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + +var defineProperty = function defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +}; + +var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; +}; + +/** + * Given element offsets, generate an output similar to getBoundingClientRect + * @method + * @memberof Popper.Utils + * @argument {Object} offsets + * @returns {Object} ClientRect like output + */ +function getClientRect(offsets) { + return _extends({}, offsets, { + right: offsets.left + offsets.width, + bottom: offsets.top + offsets.height + }); +} + +/** + * Get bounding client rect of given element + * @method + * @memberof Popper.Utils + * @param {HTMLElement} element + * @return {Object} client rect + */ +function getBoundingClientRect(element) { + var rect = {}; + + // IE10 10 FIX: Please, don't ask, the element isn't + // considered in DOM in some circumstances... + // This isn't reproducible in IE10 compatibility mode of IE11 + try { + if (isIE$1(10)) { + rect = element.getBoundingClientRect(); + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + rect.top += scrollTop; + rect.left += scrollLeft; + rect.bottom += scrollTop; + rect.right += scrollLeft; + } else { + rect = element.getBoundingClientRect(); + } + } catch (e) {} + + var result = { + left: rect.left, + top: rect.top, + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + + // subtract scrollbar size from sizes + var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; + var width = sizes.width || element.clientWidth || result.right - result.left; + var height = sizes.height || element.clientHeight || result.bottom - result.top; + + var horizScrollbar = element.offsetWidth - width; + var vertScrollbar = element.offsetHeight - height; + + // if an hypothetical scrollbar is detected, we must be sure it's not a `border` + // we make this check conditional for performance reasons + if (horizScrollbar || vertScrollbar) { + var styles = getStyleComputedProperty(element); + horizScrollbar -= getBordersSize(styles, 'x'); + vertScrollbar -= getBordersSize(styles, 'y'); + + result.width -= horizScrollbar; + result.height -= vertScrollbar; + } + + return getClientRect(result); +} + +function getOffsetRectRelativeToArbitraryNode(children, parent) { + var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var isIE10 = isIE$1(10); + var isHTML = parent.nodeName === 'HTML'; + var childrenRect = getBoundingClientRect(children); + var parentRect = getBoundingClientRect(parent); + var scrollParent = getScrollParent(children); + + var styles = getStyleComputedProperty(parent); + var borderTopWidth = parseFloat(styles.borderTopWidth, 10); + var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10); + + // In cases where the parent is fixed, we must ignore negative scroll in offset calc + if (fixedPosition && isHTML) { + parentRect.top = Math.max(parentRect.top, 0); + parentRect.left = Math.max(parentRect.left, 0); + } + var offsets = getClientRect({ + top: childrenRect.top - parentRect.top - borderTopWidth, + left: childrenRect.left - parentRect.left - borderLeftWidth, + width: childrenRect.width, + height: childrenRect.height + }); + offsets.marginTop = 0; + offsets.marginLeft = 0; + + // Subtract margins of documentElement in case it's being used as parent + // we do this only on HTML because it's the only element that behaves + // differently when margins are applied to it. The margins are included in + // the box of the documentElement, in the other cases not. + if (!isIE10 && isHTML) { + var marginTop = parseFloat(styles.marginTop, 10); + var marginLeft = parseFloat(styles.marginLeft, 10); + + offsets.top -= borderTopWidth - marginTop; + offsets.bottom -= borderTopWidth - marginTop; + offsets.left -= borderLeftWidth - marginLeft; + offsets.right -= borderLeftWidth - marginLeft; + + // Attach marginTop and marginLeft because in some circumstances we may need them + offsets.marginTop = marginTop; + offsets.marginLeft = marginLeft; + } + + if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { + offsets = includeScroll(offsets, parent); + } + + return offsets; +} + +function getViewportOffsetRectRelativeToArtbitraryNode(element) { + var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var html = element.ownerDocument.documentElement; + var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); + var width = Math.max(html.clientWidth, window.innerWidth || 0); + var height = Math.max(html.clientHeight, window.innerHeight || 0); + + var scrollTop = !excludeScroll ? getScroll(html) : 0; + var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; + + var offset = { + top: scrollTop - relativeOffset.top + relativeOffset.marginTop, + left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, + width: width, + height: height + }; + + return getClientRect(offset); +} + +/** + * Check if the given element is fixed or is inside a fixed parent + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {Element} customContainer + * @returns {Boolean} answer to "isFixed?" + */ +function isFixed(element) { + var nodeName = element.nodeName; + if (nodeName === 'BODY' || nodeName === 'HTML') { + return false; + } + if (getStyleComputedProperty(element, 'position') === 'fixed') { + return true; + } + return isFixed(getParentNode(element)); +} + +/** + * Finds the first parent of an element that has a transformed property defined + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} first transformed parent or documentElement + */ + +function getFixedPositionOffsetParent(element) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element || !element.parentElement || isIE$1()) { + return document.documentElement; + } + var el = element.parentElement; + while (el && getStyleComputedProperty(el, 'transform') === 'none') { + el = el.parentElement; + } + return el || document.documentElement; +} + +/** + * Computed the boundaries limits and return them + * @method + * @memberof Popper.Utils + * @param {HTMLElement} popper + * @param {HTMLElement} reference + * @param {number} padding + * @param {HTMLElement} boundariesElement - Element used to define the boundaries + * @param {Boolean} fixedPosition - Is in fixed position mode + * @returns {Object} Coordinates of the boundaries + */ +function getBoundaries(popper, reference, padding, boundariesElement) { + var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + // NOTE: 1 DOM access here + + var boundaries = { top: 0, left: 0 }; + var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference); + + // Handle viewport case + if (boundariesElement === 'viewport') { + boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); + } else { + // Handle other cases based on DOM element used as boundaries + var boundariesNode = void 0; + if (boundariesElement === 'scrollParent') { + boundariesNode = getScrollParent(getParentNode(reference)); + if (boundariesNode.nodeName === 'BODY') { + boundariesNode = popper.ownerDocument.documentElement; + } + } else if (boundariesElement === 'window') { + boundariesNode = popper.ownerDocument.documentElement; + } else { + boundariesNode = boundariesElement; + } + + var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); + + // In case of HTML, we need a different computation + if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { + var _getWindowSizes = getWindowSizes(popper.ownerDocument), + height = _getWindowSizes.height, + width = _getWindowSizes.width; + + boundaries.top += offsets.top - offsets.marginTop; + boundaries.bottom = height + offsets.top; + boundaries.left += offsets.left - offsets.marginLeft; + boundaries.right = width + offsets.left; + } else { + // for all the other DOM elements, this one is good + boundaries = offsets; + } + } + + // Add paddings + padding = padding || 0; + var isPaddingNumber = typeof padding === 'number'; + boundaries.left += isPaddingNumber ? padding : padding.left || 0; + boundaries.top += isPaddingNumber ? padding : padding.top || 0; + boundaries.right -= isPaddingNumber ? padding : padding.right || 0; + boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; + + return boundaries; +} + +function getArea(_ref) { + var width = _ref.width, + height = _ref.height; + + return width * height; +} + +/** + * Utility used to transform the `auto` placement to the placement with more + * available space. + * @method + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { + var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + + if (placement.indexOf('auto') === -1) { + return placement; + } + + var boundaries = getBoundaries(popper, reference, padding, boundariesElement); + + var rects = { + top: { + width: boundaries.width, + height: refRect.top - boundaries.top + }, + right: { + width: boundaries.right - refRect.right, + height: boundaries.height + }, + bottom: { + width: boundaries.width, + height: boundaries.bottom - refRect.bottom + }, + left: { + width: refRect.left - boundaries.left, + height: boundaries.height + } + }; + + var sortedAreas = Object.keys(rects).map(function (key) { + return _extends({ + key: key + }, rects[key], { + area: getArea(rects[key]) + }); + }).sort(function (a, b) { + return b.area - a.area; + }); + + var filteredAreas = sortedAreas.filter(function (_ref2) { + var width = _ref2.width, + height = _ref2.height; + return width >= popper.clientWidth && height >= popper.clientHeight; + }); + + var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; + + var variation = placement.split('-')[1]; + + return computedPlacement + (variation ? '-' + variation : ''); +} + +/** + * Get offsets to the reference element + * @method + * @memberof Popper.Utils + * @param {Object} state + * @param {Element} popper - the popper element + * @param {Element} reference - the reference element (the popper will be relative to this) + * @param {Element} fixedPosition - is in fixed position mode + * @returns {Object} An object containing the offsets which will be applied to the popper + */ +function getReferenceOffsets(state, popper, reference) { + var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + + var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference); + return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); +} + +/** + * Get the outer sizes of the given element (offset size + margins) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Object} object containing width and height properties + */ +function getOuterSizes(element) { + var window = element.ownerDocument.defaultView; + var styles = window.getComputedStyle(element); + var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0); + var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0); + var result = { + width: element.offsetWidth + y, + height: element.offsetHeight + x + }; + return result; +} + +/** + * Get the opposite placement of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement + * @returns {String} flipped placement + */ +function getOppositePlacement(placement) { + var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); +} + +/** + * Get offsets to the popper + * @method + * @memberof Popper.Utils + * @param {Object} position - CSS position the Popper will get applied + * @param {HTMLElement} popper - the popper element + * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) + * @param {String} placement - one of the valid placement options + * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper + */ +function getPopperOffsets(popper, referenceOffsets, placement) { + placement = placement.split('-')[0]; + + // Get popper node sizes + var popperRect = getOuterSizes(popper); + + // Add position, width and height to our offsets object + var popperOffsets = { + width: popperRect.width, + height: popperRect.height + }; + + // depending by the popper placement we have to compute its offsets slightly differently + var isHoriz = ['right', 'left'].indexOf(placement) !== -1; + var mainSide = isHoriz ? 'top' : 'left'; + var secondarySide = isHoriz ? 'left' : 'top'; + var measurement = isHoriz ? 'height' : 'width'; + var secondaryMeasurement = !isHoriz ? 'height' : 'width'; + + popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; + if (placement === secondarySide) { + popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; + } else { + popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; + } + + return popperOffsets; +} + +/** + * Mimics the `find` method of Array + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ +function find(arr, check) { + // use native find if supported + if (Array.prototype.find) { + return arr.find(check); + } + + // use `filter` to obtain the same behavior of `find` + return arr.filter(check)[0]; +} + +/** + * Return the index of the matching object + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ +function findIndex(arr, prop, value) { + // use native findIndex if supported + if (Array.prototype.findIndex) { + return arr.findIndex(function (cur) { + return cur[prop] === value; + }); + } + + // use `find` + `indexOf` if `findIndex` isn't supported + var match = find(arr, function (obj) { + return obj[prop] === value; + }); + return arr.indexOf(match); +} + +/** + * Loop trough the list of modifiers and run them in order, + * each of them will then edit the data object. + * @method + * @memberof Popper.Utils + * @param {dataObject} data + * @param {Array} modifiers + * @param {String} ends - Optional modifier name used as stopper + * @returns {dataObject} + */ +function runModifiers(modifiers, data, ends) { + var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); + + modifiersToRun.forEach(function (modifier) { + if (modifier['function']) { + // eslint-disable-line dot-notation + console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); + } + var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation + if (modifier.enabled && isFunction(fn)) { + // Add properties to offsets to make them a complete clientRect object + // we do this before each modifier to make sure the previous one doesn't + // mess with these values + data.offsets.popper = getClientRect(data.offsets.popper); + data.offsets.reference = getClientRect(data.offsets.reference); + + data = fn(data, modifier); + } + }); + + return data; +} + +/** + * Updates the position of the popper, computing the new offsets and applying + * the new style.
    + * Prefer `scheduleUpdate` over `update` because of performance reasons. + * @method + * @memberof Popper + */ +function update() { + // if popper is destroyed, don't perform any further update + if (this.state.isDestroyed) { + return; + } + + var data = { + instance: this, + styles: {}, + arrowStyles: {}, + attributes: {}, + flipped: false, + offsets: {} + }; + + // compute reference element offsets + data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); + + // store the computed placement inside `originalPlacement` + data.originalPlacement = data.placement; + + data.positionFixed = this.options.positionFixed; + + // compute the popper offsets + data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); + + data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; + + // run the modifiers + data = runModifiers(this.modifiers, data); + + // the first `update` will call `onCreate` callback + // the other ones will call `onUpdate` callback + if (!this.state.isCreated) { + this.state.isCreated = true; + this.options.onCreate(data); + } else { + this.options.onUpdate(data); + } +} + +/** + * Helper used to know if the given modifier is enabled. + * @method + * @memberof Popper.Utils + * @returns {Boolean} + */ +function isModifierEnabled(modifiers, modifierName) { + return modifiers.some(function (_ref) { + var name = _ref.name, + enabled = _ref.enabled; + return enabled && name === modifierName; + }); +} + +/** + * Get the prefixed supported property name + * @method + * @memberof Popper.Utils + * @argument {String} property (camelCase) + * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) + */ +function getSupportedPropertyName(property) { + var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; + var upperProp = property.charAt(0).toUpperCase() + property.slice(1); + + for (var i = 0; i < prefixes.length; i++) { + var prefix = prefixes[i]; + var toCheck = prefix ? '' + prefix + upperProp : property; + if (typeof document.body.style[toCheck] !== 'undefined') { + return toCheck; + } + } + return null; +} + +/** + * Destroys the popper. + * @method + * @memberof Popper + */ +function destroy() { + this.state.isDestroyed = true; + + // touch DOM only if `applyStyle` modifier is enabled + if (isModifierEnabled(this.modifiers, 'applyStyle')) { + this.popper.removeAttribute('x-placement'); + this.popper.style.position = ''; + this.popper.style.top = ''; + this.popper.style.left = ''; + this.popper.style.right = ''; + this.popper.style.bottom = ''; + this.popper.style.willChange = ''; + this.popper.style[getSupportedPropertyName('transform')] = ''; + } + + this.disableEventListeners(); + + // remove the popper if user explicity asked for the deletion on destroy + // do not use `remove` because IE11 doesn't support it + if (this.options.removeOnDestroy) { + this.popper.parentNode.removeChild(this.popper); + } + return this; +} + +/** + * Get the window associated with the element + * @argument {Element} element + * @returns {Window} + */ +function getWindow(element) { + var ownerDocument = element.ownerDocument; + return ownerDocument ? ownerDocument.defaultView : window; +} + +function attachToScrollParents(scrollParent, event, callback, scrollParents) { + var isBody = scrollParent.nodeName === 'BODY'; + var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; + target.addEventListener(event, callback, { passive: true }); + + if (!isBody) { + attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); + } + scrollParents.push(target); +} + +/** + * Setup needed event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ +function setupEventListeners(reference, options, state, updateBound) { + // Resize event listener on window + state.updateBound = updateBound; + getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); + + // Scroll event listener on scroll parents + var scrollElement = getScrollParent(reference); + attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); + state.scrollElement = scrollElement; + state.eventsEnabled = true; + + return state; +} + +/** + * It will add resize/scroll events and start recalculating + * position of the popper element when they are triggered. + * @method + * @memberof Popper + */ +function enableEventListeners() { + if (!this.state.eventsEnabled) { + this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); + } +} + +/** + * Remove event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ +function removeEventListeners(reference, state) { + // Remove resize event listener on window + getWindow(reference).removeEventListener('resize', state.updateBound); + + // Remove scroll event listener on scroll parents + state.scrollParents.forEach(function (target) { + target.removeEventListener('scroll', state.updateBound); + }); + + // Reset state + state.updateBound = null; + state.scrollParents = []; + state.scrollElement = null; + state.eventsEnabled = false; + return state; +} + +/** + * It will remove resize/scroll events and won't recalculate popper position + * when they are triggered. It also won't trigger `onUpdate` callback anymore, + * unless you call `update` method manually. + * @method + * @memberof Popper + */ +function disableEventListeners() { + if (this.state.eventsEnabled) { + cancelAnimationFrame(this.scheduleUpdate); + this.state = removeEventListeners(this.reference, this.state); + } +} + +/** + * Tells if a given input is a number + * @method + * @memberof Popper.Utils + * @param {*} input to check + * @return {Boolean} + */ +function isNumeric(n) { + return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); +} + +/** + * Set the style to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the style to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ +function setStyles(element, styles) { + Object.keys(styles).forEach(function (prop) { + var unit = ''; + // add unit if the value is numeric and is one of the following + if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { + unit = 'px'; + } + element.style[prop] = styles[prop] + unit; + }); +} + +/** + * Set the attributes to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the attributes to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ +function setAttributes(element, attributes) { + Object.keys(attributes).forEach(function (prop) { + var value = attributes[prop]; + if (value !== false) { + element.setAttribute(prop, attributes[prop]); + } else { + element.removeAttribute(prop); + } + }); +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} data.styles - List of style properties - values to apply to popper element + * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The same data object + */ +function applyStyle(data) { + // any property present in `data.styles` will be applied to the popper, + // in this way we can make the 3rd party modifiers add custom styles to it + // Be aware, modifiers could override the properties defined in the previous + // lines of this modifier! + setStyles(data.instance.popper, data.styles); + + // any property present in `data.attributes` will be applied to the popper, + // they will be set as HTML attributes of the element + setAttributes(data.instance.popper, data.attributes); + + // if arrowElement is defined and arrowStyles has some properties + if (data.arrowElement && Object.keys(data.arrowStyles).length) { + setStyles(data.arrowElement, data.arrowStyles); + } + + return data; +} + +/** + * Set the x-placement attribute before everything else because it could be used + * to add margins to the popper margins needs to be calculated to get the + * correct popper offsets. + * @method + * @memberof Popper.modifiers + * @param {HTMLElement} reference - The reference element used to position the popper + * @param {HTMLElement} popper - The HTML element used as popper + * @param {Object} options - Popper.js options + */ +function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { + // compute reference element offsets + var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); + + popper.setAttribute('x-placement', placement); + + // Apply `position` to popper before anything else because + // without the position applied we can't guarantee correct computations + setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' }); + + return options; +} + +/** + * @function + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by `update` method + * @argument {Boolean} shouldRound - If the offsets should be rounded at all + * @returns {Object} The popper's position offsets rounded + * + * The tale of pixel-perfect positioning. It's still not 100% perfect, but as + * good as it can be within reason. + * Discussion here: https://github.com/FezVrasta/popper.js/pull/715 + * + * Low DPI screens cause a popper to be blurry if not using full pixels (Safari + * as well on High DPI screens). + * + * Firefox prefers no rounding for positioning and does not have blurriness on + * high DPI screens. + * + * Only horizontal placement and left/right values need to be considered. + */ +function getRoundedOffsets(data, shouldRound) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var round = Math.round; + var floor = Math.floor; + var noRound = function noRound(v) { + return v; + }; + + var popperWidth = round(popper.width); + var referenceWidth = round(reference.width); + + var isVertical = ['left', 'right'].indexOf(data.placement) !== -1; + var isVariation = data.placement.indexOf('-') !== -1; + var sameWidthParity = referenceWidth % 2 === popperWidth % 2; + var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1; + + var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor; + var verticalToInteger = !shouldRound ? noRound : round; + + return { + left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left), + top: verticalToInteger(popper.top), + bottom: verticalToInteger(popper.bottom), + right: horizontalToInteger(popper.right) + }; +} + +var isFirefox = isBrowser$1 && /Firefox/i.test(navigator.userAgent); + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function computeStyle(data, options) { + var x = options.x, + y = options.y; + var popper = data.offsets.popper; + + // Remove this legacy support in Popper.js v2 + + var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'applyStyle'; + }).gpuAcceleration; + if (legacyGpuAccelerationOption !== undefined) { + console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); + } + var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; + + var offsetParent = getOffsetParent(data.instance.popper); + var offsetParentRect = getBoundingClientRect(offsetParent); + + // Styles + var styles = { + position: popper.position + }; + + var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox); + + var sideA = x === 'bottom' ? 'top' : 'bottom'; + var sideB = y === 'right' ? 'left' : 'right'; + + // if gpuAcceleration is set to `true` and transform is supported, + // we use `translate3d` to apply the position to the popper we + // automatically use the supported prefixed version if needed + var prefixedProperty = getSupportedPropertyName('transform'); + + // now, let's make a step back and look at this code closely (wtf?) + // If the content of the popper grows once it's been positioned, it + // may happen that the popper gets misplaced because of the new content + // overflowing its reference element + // To avoid this problem, we provide two options (x and y), which allow + // the consumer to define the offset origin. + // If we position a popper on top of a reference element, we can set + // `x` to `top` to make the popper grow towards its top instead of + // its bottom. + var left = void 0, + top = void 0; + if (sideA === 'bottom') { + // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar) + // and not the bottom of the html element + if (offsetParent.nodeName === 'HTML') { + top = -offsetParent.clientHeight + offsets.bottom; + } else { + top = -offsetParentRect.height + offsets.bottom; + } + } else { + top = offsets.top; + } + if (sideB === 'right') { + if (offsetParent.nodeName === 'HTML') { + left = -offsetParent.clientWidth + offsets.right; + } else { + left = -offsetParentRect.width + offsets.right; + } + } else { + left = offsets.left; + } + if (gpuAcceleration && prefixedProperty) { + styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; + styles[sideA] = 0; + styles[sideB] = 0; + styles.willChange = 'transform'; + } else { + // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties + var invertTop = sideA === 'bottom' ? -1 : 1; + var invertLeft = sideB === 'right' ? -1 : 1; + styles[sideA] = top * invertTop; + styles[sideB] = left * invertLeft; + styles.willChange = sideA + ', ' + sideB; + } + + // Attributes + var attributes = { + 'x-placement': data.placement + }; + + // Update `data` attributes, styles and arrowStyles + data.attributes = _extends({}, attributes, data.attributes); + data.styles = _extends({}, styles, data.styles); + data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles); + + return data; +} + +/** + * Helper used to know if the given modifier depends from another one.
    + * It checks if the needed modifier is listed and enabled. + * @method + * @memberof Popper.Utils + * @param {Array} modifiers - list of modifiers + * @param {String} requestingName - name of requesting modifier + * @param {String} requestedName - name of requested modifier + * @returns {Boolean} + */ +function isModifierRequired(modifiers, requestingName, requestedName) { + var requesting = find(modifiers, function (_ref) { + var name = _ref.name; + return name === requestingName; + }); + + var isRequired = !!requesting && modifiers.some(function (modifier) { + return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; + }); + + if (!isRequired) { + var _requesting = '`' + requestingName + '`'; + var requested = '`' + requestedName + '`'; + console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); + } + return isRequired; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function arrow(data, options) { + var _data$offsets$arrow; + + // arrow depends on keepTogether in order to work + if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { + return data; + } + + var arrowElement = options.element; + + // if arrowElement is a string, suppose it's a CSS selector + if (typeof arrowElement === 'string') { + arrowElement = data.instance.popper.querySelector(arrowElement); + + // if arrowElement is not found, don't run the modifier + if (!arrowElement) { + return data; + } + } else { + // if the arrowElement isn't a query selector we must check that the + // provided DOM node is child of its popper node + if (!data.instance.popper.contains(arrowElement)) { + console.warn('WARNING: `arrow.element` must be child of its popper element!'); + return data; + } + } + + var placement = data.placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isVertical = ['left', 'right'].indexOf(placement) !== -1; + + var len = isVertical ? 'height' : 'width'; + var sideCapitalized = isVertical ? 'Top' : 'Left'; + var side = sideCapitalized.toLowerCase(); + var altSide = isVertical ? 'left' : 'top'; + var opSide = isVertical ? 'bottom' : 'right'; + var arrowElementSize = getOuterSizes(arrowElement)[len]; + + // + // extends keepTogether behavior making sure the popper and its + // reference have enough pixels in conjunction + // + + // top/left side + if (reference[opSide] - arrowElementSize < popper[side]) { + data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); + } + // bottom/right side + if (reference[side] + arrowElementSize > popper[opSide]) { + data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; + } + data.offsets.popper = getClientRect(data.offsets.popper); + + // compute center of the popper + var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; + + // Compute the sideValue using the updated popper offsets + // take popper margin in account because we don't have this info available + var css = getStyleComputedProperty(data.instance.popper); + var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10); + var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10); + var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; + + // prevent arrowElement from being placed not contiguously to its popper + sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); + + data.arrowElement = arrowElement; + data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); + + return data; +} + +/** + * Get the opposite placement variation of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement variation + * @returns {String} flipped placement variation + */ +function getOppositeVariation(variation) { + if (variation === 'end') { + return 'start'; + } else if (variation === 'start') { + return 'end'; + } + return variation; +} + +/** + * List of accepted placements to use as values of the `placement` option.
    + * Valid placements are: + * - `auto` + * - `top` + * - `right` + * - `bottom` + * - `left` + * + * Each placement can have a variation from this list: + * - `-start` + * - `-end` + * + * Variations are interpreted easily if you think of them as the left to right + * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` + * is right.
    + * Vertically (`left` and `right`), `start` is top and `end` is bottom. + * + * Some valid examples are: + * - `top-end` (on top of reference, right aligned) + * - `right-start` (on right of reference, top aligned) + * - `bottom` (on bottom, centered) + * - `auto-end` (on the side with more space available, alignment depends by placement) + * + * @static + * @type {Array} + * @enum {String} + * @readonly + * @method placements + * @memberof Popper + */ +var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; + +// Get rid of `auto` `auto-start` and `auto-end` +var validPlacements = placements.slice(3); + +/** + * Given an initial placement, returns all the subsequent placements + * clockwise (or counter-clockwise). + * + * @method + * @memberof Popper.Utils + * @argument {String} placement - A valid placement (it accepts variations) + * @argument {Boolean} counter - Set to true to walk the placements counterclockwise + * @returns {Array} placements including their variations + */ +function clockwise(placement) { + var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var index = validPlacements.indexOf(placement); + var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); + return counter ? arr.reverse() : arr; +} + +var BEHAVIORS = { + FLIP: 'flip', + CLOCKWISE: 'clockwise', + COUNTERCLOCKWISE: 'counterclockwise' +}; + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function flip(data, options) { + // if `inner` modifier is enabled, we can't use the `flip` modifier + if (isModifierEnabled(data.instance.modifiers, 'inner')) { + return data; + } + + if (data.flipped && data.placement === data.originalPlacement) { + // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides + return data; + } + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); + + var placement = data.placement.split('-')[0]; + var placementOpposite = getOppositePlacement(placement); + var variation = data.placement.split('-')[1] || ''; + + var flipOrder = []; + + switch (options.behavior) { + case BEHAVIORS.FLIP: + flipOrder = [placement, placementOpposite]; + break; + case BEHAVIORS.CLOCKWISE: + flipOrder = clockwise(placement); + break; + case BEHAVIORS.COUNTERCLOCKWISE: + flipOrder = clockwise(placement, true); + break; + default: + flipOrder = options.behavior; + } + + flipOrder.forEach(function (step, index) { + if (placement !== step || flipOrder.length === index + 1) { + return data; + } + + placement = data.placement.split('-')[0]; + placementOpposite = getOppositePlacement(placement); + + var popperOffsets = data.offsets.popper; + var refOffsets = data.offsets.reference; + + // using floor because the reference offsets may contain decimals we are not going to consider here + var floor = Math.floor; + var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); + + var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); + var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); + var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); + var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); + + var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; + + // flip the variation if required + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); + + if (overlapsRef || overflowsBoundaries || flippedVariation) { + // this boolean to detect any flip loop + data.flipped = true; + + if (overlapsRef || overflowsBoundaries) { + placement = flipOrder[index + 1]; + } + + if (flippedVariation) { + variation = getOppositeVariation(variation); + } + + data.placement = placement + (variation ? '-' + variation : ''); + + // this object contains `position`, we want to preserve it along with + // any additional property we may add in the future + data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); + + data = runModifiers(data.instance.modifiers, data, 'flip'); + } + }); + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function keepTogether(data) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var placement = data.placement.split('-')[0]; + var floor = Math.floor; + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + var side = isVertical ? 'right' : 'bottom'; + var opSide = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + if (popper[side] < floor(reference[opSide])) { + data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; + } + if (popper[opSide] > floor(reference[side])) { + data.offsets.popper[opSide] = floor(reference[side]); + } + + return data; +} + +/** + * Converts a string containing value + unit into a px value number + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} str - Value + unit string + * @argument {String} measurement - `height` or `width` + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @returns {Number|String} + * Value in pixels, or original string if no values were extracted + */ +function toValue(str, measurement, popperOffsets, referenceOffsets) { + // separate value from unit + var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); + var value = +split[1]; + var unit = split[2]; + + // If it's not a number it's an operator, I guess + if (!value) { + return str; + } + + if (unit.indexOf('%') === 0) { + var element = void 0; + switch (unit) { + case '%p': + element = popperOffsets; + break; + case '%': + case '%r': + default: + element = referenceOffsets; + } + + var rect = getClientRect(element); + return rect[measurement] / 100 * value; + } else if (unit === 'vh' || unit === 'vw') { + // if is a vh or vw, we calculate the size based on the viewport + var size = void 0; + if (unit === 'vh') { + size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); + } else { + size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + } + return size / 100 * value; + } else { + // if is an explicit pixel unit, we get rid of the unit and keep the value + // if is an implicit unit, it's px, and we return just the value + return value; + } +} + +/** + * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} offset + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @argument {String} basePlacement + * @returns {Array} a two cells array with x and y offsets in numbers + */ +function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { + var offsets = [0, 0]; + + // Use height if placement is left or right and index is 0 otherwise use width + // in this way the first offset will use an axis and the second one + // will use the other one + var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; + + // Split the offset string to obtain a list of values and operands + // The regex addresses values with the plus or minus sign in front (+10, -20, etc) + var fragments = offset.split(/(\+|\-)/).map(function (frag) { + return frag.trim(); + }); + + // Detect if the offset string contains a pair of values or a single one + // they could be separated by comma or space + var divider = fragments.indexOf(find(fragments, function (frag) { + return frag.search(/,|\s/) !== -1; + })); + + if (fragments[divider] && fragments[divider].indexOf(',') === -1) { + console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); + } + + // If divider is found, we divide the list of values and operands to divide + // them by ofset X and Y. + var splitRegex = /\s*,\s*|\s+/; + var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; + + // Convert the values with units to absolute pixels to allow our computations + ops = ops.map(function (op, index) { + // Most of the units rely on the orientation of the popper + var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; + var mergeWithPrevious = false; + return op + // This aggregates any `+` or `-` sign that aren't considered operators + // e.g.: 10 + +5 => [10, +, +5] + .reduce(function (a, b) { + if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { + a[a.length - 1] = b; + mergeWithPrevious = true; + return a; + } else if (mergeWithPrevious) { + a[a.length - 1] += b; + mergeWithPrevious = false; + return a; + } else { + return a.concat(b); + } + }, []) + // Here we convert the string values into number values (in px) + .map(function (str) { + return toValue(str, measurement, popperOffsets, referenceOffsets); + }); + }); + + // Loop trough the offsets arrays and execute the operations + ops.forEach(function (op, index) { + op.forEach(function (frag, index2) { + if (isNumeric(frag)) { + offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); + } + }); + }); + return offsets; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @argument {Number|String} options.offset=0 + * The offset value as described in the modifier description + * @returns {Object} The data object, properly modified + */ +function offset(data, _ref) { + var offset = _ref.offset; + var placement = data.placement, + _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var basePlacement = placement.split('-')[0]; + + var offsets = void 0; + if (isNumeric(+offset)) { + offsets = [+offset, 0]; + } else { + offsets = parseOffset(offset, popper, reference, basePlacement); + } + + if (basePlacement === 'left') { + popper.top += offsets[0]; + popper.left -= offsets[1]; + } else if (basePlacement === 'right') { + popper.top += offsets[0]; + popper.left += offsets[1]; + } else if (basePlacement === 'top') { + popper.left += offsets[0]; + popper.top -= offsets[1]; + } else if (basePlacement === 'bottom') { + popper.left += offsets[0]; + popper.top += offsets[1]; + } + + data.popper = popper; + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function preventOverflow(data, options) { + var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); + + // If offsetParent is the reference element, we really want to + // go one step up and use the next offsetParent as reference to + // avoid to make this modifier completely useless and look like broken + if (data.instance.reference === boundariesElement) { + boundariesElement = getOffsetParent(boundariesElement); + } + + // NOTE: DOM access here + // resets the popper's position so that the document size can be calculated excluding + // the size of the popper element itself + var transformProp = getSupportedPropertyName('transform'); + var popperStyles = data.instance.popper.style; // assignment to help minification + var top = popperStyles.top, + left = popperStyles.left, + transform = popperStyles[transformProp]; + + popperStyles.top = ''; + popperStyles.left = ''; + popperStyles[transformProp] = ''; + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); + + // NOTE: DOM access here + // restores the original style properties after the offsets have been computed + popperStyles.top = top; + popperStyles.left = left; + popperStyles[transformProp] = transform; + + options.boundaries = boundaries; + + var order = options.priority; + var popper = data.offsets.popper; + + var check = { + primary: function primary(placement) { + var value = popper[placement]; + if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { + value = Math.max(popper[placement], boundaries[placement]); + } + return defineProperty({}, placement, value); + }, + secondary: function secondary(placement) { + var mainSide = placement === 'right' ? 'left' : 'top'; + var value = popper[mainSide]; + if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { + value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); + } + return defineProperty({}, mainSide, value); + } + }; + + order.forEach(function (placement) { + var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; + popper = _extends({}, popper, check[side](placement)); + }); + + data.offsets.popper = popper; + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function shift(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var shiftvariation = placement.split('-')[1]; + + // if shift shiftvariation is specified, run the modifier + if (shiftvariation) { + var _data$offsets = data.offsets, + reference = _data$offsets.reference, + popper = _data$offsets.popper; + + var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; + var side = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + var shiftOffsets = { + start: defineProperty({}, side, reference[side]), + end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) + }; + + data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]); + } + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function hide(data) { + if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { + return data; + } + + var refRect = data.offsets.reference; + var bound = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'preventOverflow'; + }).boundaries; + + if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === true) { + return data; + } + + data.hide = true; + data.attributes['x-out-of-boundaries'] = ''; + } else { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === false) { + return data; + } + + data.hide = false; + data.attributes['x-out-of-boundaries'] = false; + } + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function inner(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; + + var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; + + popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); + + data.placement = getOppositePlacement(placement); + data.offsets.popper = getClientRect(popper); + + return data; +} + +/** + * Modifier function, each modifier can have a function of this type assigned + * to its `fn` property.
    + * These functions will be called on each update, this means that you must + * make sure they are performant enough to avoid performance bottlenecks. + * + * @function ModifierFn + * @argument {dataObject} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {dataObject} The data object, properly modified + */ + +/** + * Modifiers are plugins used to alter the behavior of your poppers.
    + * Popper.js uses a set of 9 modifiers to provide all the basic functionalities + * needed by the library. + * + * Usually you don't want to override the `order`, `fn` and `onLoad` props. + * All the other properties are configurations that could be tweaked. + * @namespace modifiers + */ +var modifiers = { + /** + * Modifier used to shift the popper on the start or end of its reference + * element.
    + * It will read the variation of the `placement` property.
    + * It can be one either `-end` or `-start`. + * @memberof modifiers + * @inner + */ + shift: { + /** @prop {number} order=100 - Index used to define the order of execution */ + order: 100, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: shift + }, + + /** + * The `offset` modifier can shift your popper on both its axis. + * + * It accepts the following units: + * - `px` or unit-less, interpreted as pixels + * - `%` or `%r`, percentage relative to the length of the reference element + * - `%p`, percentage relative to the length of the popper element + * - `vw`, CSS viewport width unit + * - `vh`, CSS viewport height unit + * + * For length is intended the main axis relative to the placement of the popper.
    + * This means that if the placement is `top` or `bottom`, the length will be the + * `width`. In case of `left` or `right`, it will be the `height`. + * + * You can provide a single value (as `Number` or `String`), or a pair of values + * as `String` divided by a comma or one (or more) white spaces.
    + * The latter is a deprecated method because it leads to confusion and will be + * removed in v2.
    + * Additionally, it accepts additions and subtractions between different units. + * Note that multiplications and divisions aren't supported. + * + * Valid examples are: + * ``` + * 10 + * '10%' + * '10, 10' + * '10%, 10' + * '10 + 10%' + * '10 - 5vh + 3%' + * '-10px + 5vh, 5px - 6%' + * ``` + * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap + * > with their reference element, unfortunately, you will have to disable the `flip` modifier. + * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). + * + * @memberof modifiers + * @inner + */ + offset: { + /** @prop {number} order=200 - Index used to define the order of execution */ + order: 200, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: offset, + /** @prop {Number|String} offset=0 + * The offset value as described in the modifier description + */ + offset: 0 + }, + + /** + * Modifier used to prevent the popper from being positioned outside the boundary. + * + * A scenario exists where the reference itself is not within the boundaries.
    + * We can say it has "escaped the boundaries" — or just "escaped".
    + * In this case we need to decide whether the popper should either: + * + * - detach from the reference and remain "trapped" in the boundaries, or + * - if it should ignore the boundary and "escape with its reference" + * + * When `escapeWithReference` is set to`true` and reference is completely + * outside its boundaries, the popper will overflow (or completely leave) + * the boundaries in order to remain attached to the edge of the reference. + * + * @memberof modifiers + * @inner + */ + preventOverflow: { + /** @prop {number} order=300 - Index used to define the order of execution */ + order: 300, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: preventOverflow, + /** + * @prop {Array} [priority=['left','right','top','bottom']] + * Popper will try to prevent overflow following these priorities by default, + * then, it could overflow on the left and on top of the `boundariesElement` + */ + priority: ['left', 'right', 'top', 'bottom'], + /** + * @prop {number} padding=5 + * Amount of pixel used to define a minimum distance between the boundaries + * and the popper. This makes sure the popper always has a little padding + * between the edges of its container + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='scrollParent' + * Boundaries used by the modifier. Can be `scrollParent`, `window`, + * `viewport` or any DOM element. + */ + boundariesElement: 'scrollParent' + }, + + /** + * Modifier used to make sure the reference and its popper stay near each other + * without leaving any gap between the two. Especially useful when the arrow is + * enabled and you want to ensure that it points to its reference element. + * It cares only about the first axis. You can still have poppers with margin + * between the popper and its reference element. + * @memberof modifiers + * @inner + */ + keepTogether: { + /** @prop {number} order=400 - Index used to define the order of execution */ + order: 400, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: keepTogether + }, + + /** + * This modifier is used to move the `arrowElement` of the popper to make + * sure it is positioned between the reference element and its popper element. + * It will read the outer size of the `arrowElement` node to detect how many + * pixels of conjunction are needed. + * + * It has no effect if no `arrowElement` is provided. + * @memberof modifiers + * @inner + */ + arrow: { + /** @prop {number} order=500 - Index used to define the order of execution */ + order: 500, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: arrow, + /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ + element: '[x-arrow]' + }, + + /** + * Modifier used to flip the popper's placement when it starts to overlap its + * reference element. + * + * Requires the `preventOverflow` modifier before it in order to work. + * + * **NOTE:** this modifier will interrupt the current update cycle and will + * restart it if it detects the need to flip the placement. + * @memberof modifiers + * @inner + */ + flip: { + /** @prop {number} order=600 - Index used to define the order of execution */ + order: 600, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: flip, + /** + * @prop {String|Array} behavior='flip' + * The behavior used to change the popper's placement. It can be one of + * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid + * placements (with optional variations) + */ + behavior: 'flip', + /** + * @prop {number} padding=5 + * The popper will flip if it hits the edges of the `boundariesElement` + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='viewport' + * The element which will define the boundaries of the popper position. + * The popper will never be placed outside of the defined boundaries + * (except if `keepTogether` is enabled) + */ + boundariesElement: 'viewport' + }, + + /** + * Modifier used to make the popper flow toward the inner of the reference element. + * By default, when this modifier is disabled, the popper will be placed outside + * the reference element. + * @memberof modifiers + * @inner + */ + inner: { + /** @prop {number} order=700 - Index used to define the order of execution */ + order: 700, + /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ + enabled: false, + /** @prop {ModifierFn} */ + fn: inner + }, + + /** + * Modifier used to hide the popper when its reference element is outside of the + * popper boundaries. It will set a `x-out-of-boundaries` attribute which can + * be used to hide with a CSS selector the popper when its reference is + * out of boundaries. + * + * Requires the `preventOverflow` modifier before it in order to work. + * @memberof modifiers + * @inner + */ + hide: { + /** @prop {number} order=800 - Index used to define the order of execution */ + order: 800, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: hide + }, + + /** + * Computes the style that will be applied to the popper element to gets + * properly positioned. + * + * Note that this modifier will not touch the DOM, it just prepares the styles + * so that `applyStyle` modifier can apply it. This separation is useful + * in case you need to replace `applyStyle` with a custom implementation. + * + * This modifier has `850` as `order` value to maintain backward compatibility + * with previous versions of Popper.js. Expect the modifiers ordering method + * to change in future major versions of the library. + * + * @memberof modifiers + * @inner + */ + computeStyle: { + /** @prop {number} order=850 - Index used to define the order of execution */ + order: 850, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: computeStyle, + /** + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: true, + /** + * @prop {string} [x='bottom'] + * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. + * Change this if your popper should grow in a direction different from `bottom` + */ + x: 'bottom', + /** + * @prop {string} [x='left'] + * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. + * Change this if your popper should grow in a direction different from `right` + */ + y: 'right' + }, + + /** + * Applies the computed styles to the popper element. + * + * All the DOM manipulations are limited to this modifier. This is useful in case + * you want to integrate Popper.js inside a framework or view library and you + * want to delegate all the DOM manipulations to it. + * + * Note that if you disable this modifier, you must make sure the popper element + * has its position set to `absolute` before Popper.js can do its work! + * + * Just disable this modifier and define your own to achieve the desired effect. + * + * @memberof modifiers + * @inner + */ + applyStyle: { + /** @prop {number} order=900 - Index used to define the order of execution */ + order: 900, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: applyStyle, + /** @prop {Function} */ + onLoad: applyStyleOnLoad, + /** + * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: undefined + } +}; + +/** + * The `dataObject` is an object containing all the information used by Popper.js. + * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. + * @name dataObject + * @property {Object} data.instance The Popper.js instance + * @property {String} data.placement Placement applied to popper + * @property {String} data.originalPlacement Placement originally defined on init + * @property {Boolean} data.flipped True if popper has been flipped by flip modifier + * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper + * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier + * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.boundaries Offsets of the popper boundaries + * @property {Object} data.offsets The measurements of popper, reference and arrow elements + * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 + */ + +/** + * Default options provided to Popper.js constructor.
    + * These can be overridden using the `options` argument of Popper.js.
    + * To override an option, simply pass an object with the same + * structure of the `options` object, as the 3rd argument. For example: + * ``` + * new Popper(ref, pop, { + * modifiers: { + * preventOverflow: { enabled: false } + * } + * }) + * ``` + * @type {Object} + * @static + * @memberof Popper + */ +var Defaults$1 = { + /** + * Popper's placement. + * @prop {Popper.placements} placement='bottom' + */ + placement: 'bottom', + + /** + * Set this to true if you want popper to position it self in 'fixed' mode + * @prop {Boolean} positionFixed=false + */ + positionFixed: false, + + /** + * Whether events (resize, scroll) are initially enabled. + * @prop {Boolean} eventsEnabled=true + */ + eventsEnabled: true, + + /** + * Set to true if you want to automatically remove the popper when + * you call the `destroy` method. + * @prop {Boolean} removeOnDestroy=false + */ + removeOnDestroy: false, + + /** + * Callback called when the popper is created.
    + * By default, it is set to no-op.
    + * Access Popper.js instance with `data.instance`. + * @prop {onCreate} + */ + onCreate: function onCreate() {}, + + /** + * Callback called when the popper is updated. This callback is not called + * on the initialization/creation of the popper, but only on subsequent + * updates.
    + * By default, it is set to no-op.
    + * Access Popper.js instance with `data.instance`. + * @prop {onUpdate} + */ + onUpdate: function onUpdate() {}, + + /** + * List of modifiers used to modify the offsets before they are applied to the popper. + * They provide most of the functionalities of Popper.js. + * @prop {modifiers} + */ + modifiers: modifiers +}; + +/** + * @callback onCreate + * @param {dataObject} data + */ + +/** + * @callback onUpdate + * @param {dataObject} data + */ + +// Utils +// Methods +var Popper = function () { + /** + * Creates a new Popper.js instance. + * @class Popper + * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper + * @param {HTMLElement} popper - The HTML element used as the popper + * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) + * @return {Object} instance - The generated Popper.js instance + */ + function Popper(reference, popper) { + var _this = this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + classCallCheck(this, Popper); + + this.scheduleUpdate = function () { + return requestAnimationFrame(_this.update); + }; + + // make update() debounced, so that it only runs at most once-per-tick + this.update = debounce(this.update.bind(this)); + + // with {} we create a new object with the options inside it + this.options = _extends({}, Popper.Defaults, options); + + // init state + this.state = { + isDestroyed: false, + isCreated: false, + scrollParents: [] + }; + + // get reference and popper elements (allow jQuery wrappers) + this.reference = reference && reference.jquery ? reference[0] : reference; + this.popper = popper && popper.jquery ? popper[0] : popper; + + // Deep merge modifiers options + this.options.modifiers = {}; + Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { + _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); + }); + + // Refactoring modifiers' list (Object => Array) + this.modifiers = Object.keys(this.options.modifiers).map(function (name) { + return _extends({ + name: name + }, _this.options.modifiers[name]); + }) + // sort the modifiers by order + .sort(function (a, b) { + return a.order - b.order; + }); + + // modifiers have the ability to execute arbitrary code when Popper.js get inited + // such code is executed in the same order of its modifier + // they could add new properties to their options configuration + // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! + this.modifiers.forEach(function (modifierOptions) { + if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { + modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); + } + }); + + // fire the first update to position the popper in the right place + this.update(); + + var eventsEnabled = this.options.eventsEnabled; + if (eventsEnabled) { + // setup event listeners, they will take care of update the position in specific situations + this.enableEventListeners(); + } + + this.state.eventsEnabled = eventsEnabled; + } + + // We can't use class properties because they don't get listed in the + // class prototype and break stuff like Sinon stubs + + + createClass(Popper, [{ + key: 'update', + value: function update$$1() { + return update.call(this); + } + }, { + key: 'destroy', + value: function destroy$$1() { + return destroy.call(this); + } + }, { + key: 'enableEventListeners', + value: function enableEventListeners$$1() { + return enableEventListeners.call(this); + } + }, { + key: 'disableEventListeners', + value: function disableEventListeners$$1() { + return disableEventListeners.call(this); + } + + /** + * Schedules an update. It will run on the next UI update available. + * @method scheduleUpdate + * @memberof Popper + */ + + /** + * Collection of utilities useful when writing custom modifiers. + * Starting from version 1.7, this method is available only if you + * include `popper-utils.js` before `popper.js`. + * + * **DEPRECATION**: This way to access PopperUtils is deprecated + * and will be removed in v2! Use the PopperUtils module directly instead. + * Due to the high instability of the methods contained in Utils, we can't + * guarantee them to follow semver. Use them at your own risk! + * @static + * @private + * @type {Object} + * @deprecated since version 1.8 + * @member Utils + * @memberof Popper + */ + + }]); + return Popper; +}(); + +/** + * The `referenceObject` is an object that provides an interface compatible with Popper.js + * and lets you use it as replacement of a real DOM node.
    + * You can use this method to position a popper relatively to a set of coordinates + * in case you don't have a DOM node to use as reference. + * + * ``` + * new Popper(referenceObject, popperNode); + * ``` + * + * NB: This feature isn't supported in Internet Explorer 10. + * @name referenceObject + * @property {Function} data.getBoundingClientRect + * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. + * @property {number} data.clientWidth + * An ES6 getter that will return the width of the virtual reference element. + * @property {number} data.clientHeight + * An ES6 getter that will return the height of the virtual reference element. + */ + +Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; +Popper.placements = placements; +Popper.Defaults = Defaults$1; + +var Selectors = { + POPPER: '.tippy-popper', + TOOLTIP: '.tippy-tooltip', + CONTENT: '.tippy-content', + BACKDROP: '.tippy-backdrop', + ARROW: '.tippy-arrow', + ROUND_ARROW: '.tippy-roundarrow' +}; + +var elementProto = isBrowser ? Element.prototype : {}; + +var matches = elementProto.matches || elementProto.matchesSelector || elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector; + +/** + * Ponyfill for Array.from - converts iterable values to an array + * @param {Array-like} value + * @return {Array} + */ +function arrayFrom(value) { + return [].slice.call(value); +} + +/** + * Ponyfill for Element.prototype.closest + * @param {Element} element + * @param {String} parentSelector + * @return {Element} + */ +function closest(element, parentSelector) { + return (elementProto.closest || function (selector) { + var el = this; + while (el) { + if (matches.call(el, selector)) return el; + el = el.parentElement; + } + }).call(element, parentSelector); +} + +/** + * Works like Element.prototype.closest, but uses a callback instead + * @param {Element} element + * @param {Function} callback + * @return {Element} + */ +function closestCallback(element, callback) { + while (element) { + if (callback(element)) return element; + element = element.parentElement; + } +} + +var PASSIVE = { passive: true }; +var FF_EXTENSION_TRICK = { x: true }; + +/** + * Returns a new `div` element + * @return {HTMLDivElement} + */ +function div() { + return document.createElement('div'); +} + +/** + * Sets the innerHTML of an element while tricking linters & minifiers + * @param {HTMLElement} el + * @param {Element|String} html + */ +function setInnerHTML(el, html) { + el[FF_EXTENSION_TRICK.x && 'innerHTML'] = html instanceof Element ? html[FF_EXTENSION_TRICK.x && 'innerHTML'] : html; +} + +/** + * Sets the content of a tooltip + * @param {HTMLElement} contentEl + * @param {Object} props + */ +function setContent(contentEl, props) { + if (props.content instanceof Element) { + setInnerHTML(contentEl, ''); + contentEl.appendChild(props.content); + } else { + contentEl[props.allowHTML ? 'innerHTML' : 'textContent'] = props.content; + } +} + +/** + * Returns the child elements of a popper element + * @param {HTMLElement} popper + */ +function getChildren(popper) { + return { + tooltip: popper.querySelector(Selectors.TOOLTIP), + backdrop: popper.querySelector(Selectors.BACKDROP), + content: popper.querySelector(Selectors.CONTENT), + arrow: popper.querySelector(Selectors.ARROW) || popper.querySelector(Selectors.ROUND_ARROW) + }; +} + +/** + * Adds `data-inertia` attribute + * @param {HTMLElement} tooltip + */ +function addInertia(tooltip) { + tooltip.setAttribute('data-inertia', ''); +} + +/** + * Removes `data-inertia` attribute + * @param {HTMLElement} tooltip + */ +function removeInertia(tooltip) { + tooltip.removeAttribute('data-inertia'); +} + +/** + * Creates an arrow element and returns it + */ +function createArrowElement(arrowType) { + var arrow = div(); + if (arrowType === 'round') { + arrow.className = 'tippy-roundarrow'; + setInnerHTML(arrow, ''); + } else { + arrow.className = 'tippy-arrow'; + } + return arrow; +} + +/** + * Creates a backdrop element and returns it + */ +function createBackdropElement() { + var backdrop = div(); + backdrop.className = 'tippy-backdrop'; + backdrop.setAttribute('data-state', 'hidden'); + return backdrop; +} + +/** + * Adds interactive-related attributes + * @param {HTMLElement} popper + * @param {HTMLElement} tooltip + */ +function addInteractive(popper, tooltip) { + popper.setAttribute('tabindex', '-1'); + tooltip.setAttribute('data-interactive', ''); +} + +/** + * Removes interactive-related attributes + * @param {HTMLElement} popper + * @param {HTMLElement} tooltip + */ +function removeInteractive(popper, tooltip) { + popper.removeAttribute('tabindex'); + tooltip.removeAttribute('data-interactive'); +} + +/** + * Applies a transition duration to a list of elements + * @param {Array} els + * @param {Number} value + */ +function applyTransitionDuration(els, value) { + els.forEach(function (el) { + if (el) { + el.style.transitionDuration = value + 'ms'; + } + }); +} + +/** + * Add/remove transitionend listener from tooltip + * @param {Element} tooltip + * @param {String} action + * @param {Function} listener + */ +function toggleTransitionEndListener(tooltip, action, listener) { + tooltip[action + 'EventListener']('transitionend', listener); +} + +/** + * Returns the popper's placement, ignoring shifting (top-start, etc) + * @param {Element} popper + * @return {String} + */ +function getPopperPlacement(popper) { + var fullPlacement = popper.getAttribute('x-placement'); + return fullPlacement ? fullPlacement.split('-')[0] : ''; +} + +/** + * Sets the visibility state to elements so they can begin to transition + * @param {Array} els + * @param {String} state + */ +function setVisibilityState(els, state) { + els.forEach(function (el) { + if (el) { + el.setAttribute('data-state', state); + } + }); +} + +/** + * Triggers reflow + * @param {Element} popper + */ +function reflow(popper) { + void popper.offsetHeight; +} + +/** + * Constructs the popper element and returns it + * @param {Number} id + * @param {Object} props + */ +function createPopperElement(id, props) { + var popper = div(); + popper.className = 'tippy-popper'; + popper.setAttribute('role', 'tooltip'); + popper.id = 'tippy-' + id; + popper.style.zIndex = props.zIndex; + + var tooltip = div(); + tooltip.className = 'tippy-tooltip'; + tooltip.style.maxWidth = props.maxWidth + (typeof props.maxWidth === 'number' ? 'px' : ''); + tooltip.setAttribute('data-size', props.size); + tooltip.setAttribute('data-animation', props.animation); + tooltip.setAttribute('data-state', 'hidden'); + props.theme.split(' ').forEach(function (t) { + tooltip.classList.add(t + '-theme'); + }); + + var content = div(); + content.className = 'tippy-content'; + content.setAttribute('data-state', 'hidden'); + + if (props.interactive) { + addInteractive(popper, tooltip); + } + + if (props.arrow) { + tooltip.appendChild(createArrowElement(props.arrowType)); + } + + if (props.animateFill) { + tooltip.appendChild(createBackdropElement()); + tooltip.setAttribute('data-animatefill', ''); + } + + if (props.inertia) { + addInertia(tooltip); + } + + setContent(content, props); + + tooltip.appendChild(content); + popper.appendChild(tooltip); + + popper.addEventListener('focusout', function (e) { + if (e.relatedTarget && popper._tippy && !closestCallback(e.relatedTarget, function (el) { + return el === popper; + }) && e.relatedTarget !== popper._tippy.reference && popper._tippy.props.shouldPopperHideOnBlur(e)) { + popper._tippy.hide(); + } + }); + + return popper; +} + +/** + * Updates the popper element based on the new props + * @param {HTMLElement} popper + * @param {Object} prevProps + * @param {Object} nextProps + */ +function updatePopperElement(popper, prevProps, nextProps) { + var _getChildren = getChildren(popper), + tooltip = _getChildren.tooltip, + content = _getChildren.content, + backdrop = _getChildren.backdrop, + arrow = _getChildren.arrow; + + popper.style.zIndex = nextProps.zIndex; + tooltip.setAttribute('data-size', nextProps.size); + tooltip.setAttribute('data-animation', nextProps.animation); + tooltip.style.maxWidth = nextProps.maxWidth + (typeof nextProps.maxWidth === 'number' ? 'px' : ''); + + if (prevProps.content !== nextProps.content) { + setContent(content, nextProps); + } + + // animateFill + if (!prevProps.animateFill && nextProps.animateFill) { + tooltip.appendChild(createBackdropElement()); + tooltip.setAttribute('data-animatefill', ''); + } else if (prevProps.animateFill && !nextProps.animateFill) { + tooltip.removeChild(backdrop); + tooltip.removeAttribute('data-animatefill'); + } + + // arrow + if (!prevProps.arrow && nextProps.arrow) { + tooltip.appendChild(createArrowElement(nextProps.arrowType)); + } else if (prevProps.arrow && !nextProps.arrow) { + tooltip.removeChild(arrow); + } + + // arrowType + if (prevProps.arrow && nextProps.arrow && prevProps.arrowType !== nextProps.arrowType) { + tooltip.replaceChild(createArrowElement(nextProps.arrowType), arrow); + } + + // interactive + if (!prevProps.interactive && nextProps.interactive) { + addInteractive(popper, tooltip); + } else if (prevProps.interactive && !nextProps.interactive) { + removeInteractive(popper, tooltip); + } + + // inertia + if (!prevProps.inertia && nextProps.inertia) { + addInertia(tooltip); + } else if (prevProps.inertia && !nextProps.inertia) { + removeInertia(tooltip); + } + + // theme + if (prevProps.theme !== nextProps.theme) { + prevProps.theme.split(' ').forEach(function (theme) { + tooltip.classList.remove(theme + '-theme'); + }); + nextProps.theme.split(' ').forEach(function (theme) { + tooltip.classList.add(theme + '-theme'); + }); + } +} + +/** + * Runs the callback after the popper's position has been updated + * update() is debounced with Promise.resolve() or setTimeout() + * scheduleUpdate() is update() wrapped in requestAnimationFrame() + * @param {Popper} popperInstance + * @param {Function} callback + */ +function afterPopperPositionUpdates(popperInstance, callback) { + var popper = popperInstance.popper, + options = popperInstance.options; + var onCreate = options.onCreate, + onUpdate = options.onUpdate; + + + options.onCreate = options.onUpdate = function () { + reflow(popper); + callback(); + onUpdate(); + options.onCreate = onCreate; + options.onUpdate = onUpdate; + }; +} + +/** + * Hides all visible poppers on the document, optionally excluding one + * @param {Tippy} tippyInstanceToExclude + */ +function hideAllPoppers(tippyInstanceToExclude) { + arrayFrom(document.querySelectorAll(Selectors.POPPER)).forEach(function (popper) { + var tip = popper._tippy; + if (tip && tip.props.hideOnClick === true && (!tippyInstanceToExclude || popper !== tippyInstanceToExclude.popper)) { + tip.hide(); + } + }); +} + +/** + * Determines if the mouse cursor is outside of the popper's interactive border + * region + * @param {String} popperPlacement + * @param {Object} popperRect + * @param {MouseEvent} event + * @param {Object} props + */ +function isCursorOutsideInteractiveBorder(popperPlacement, popperRect, event, props) { + if (!popperPlacement) { + return true; + } + + var x = event.clientX, + y = event.clientY; + var interactiveBorder = props.interactiveBorder, + distance = props.distance; + + + var exceedsTop = popperRect.top - y > (popperPlacement === 'top' ? interactiveBorder + distance : interactiveBorder); + + var exceedsBottom = y - popperRect.bottom > (popperPlacement === 'bottom' ? interactiveBorder + distance : interactiveBorder); + + var exceedsLeft = popperRect.left - x > (popperPlacement === 'left' ? interactiveBorder + distance : interactiveBorder); + + var exceedsRight = x - popperRect.right > (popperPlacement === 'right' ? interactiveBorder + distance : interactiveBorder); + + return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight; +} + +/** + * Returns the distance offset, taking into account the default offset due to + * the transform: translate() rule in CSS + * @param {Number} distance + * @param {Number} defaultDistance + */ +function getOffsetDistanceInPx(distance, defaultDistance) { + return -(distance - defaultDistance) + 'px'; +} + +/** + * Determines if a value is a plain object + * @param {any} value + * @return {Boolean} + */ +function isPlainObject(value) { + return {}.toString.call(value) === '[object Object]'; +} + +/** + * Safe .hasOwnProperty check, for prototype-less objects + * @param {Object} obj + * @param {String} key + * @return {Boolean} + */ +function hasOwnProperty(obj, key) { + return {}.hasOwnProperty.call(obj, key); +} + +/** + * Determines if a value is numeric + * @param {any} value + * @return {Boolean} + */ +function isNumeric$1(value) { + return !isNaN(value) && !isNaN(parseFloat(value)); +} + +/** + * Returns an array of elements based on the value + * @param {any} value + * @return {Array} + */ +function getArrayOfElements(value) { + if (value instanceof Element || isPlainObject(value)) { + return [value]; + } + if (value instanceof NodeList) { + return arrayFrom(value); + } + if (Array.isArray(value)) { + return value; + } + + try { + return arrayFrom(document.querySelectorAll(value)); + } catch (e) { + return []; + } +} + +/** + * Returns a value at a given index depending on if it's an array or number + * @param {any} value + * @param {Number} index + * @param {any} defaultValue + */ +function getValue(value, index, defaultValue) { + if (Array.isArray(value)) { + var v = value[index]; + return v == null ? defaultValue : v; + } + return value; +} + +/** + * Focuses an element while preventing a scroll jump if it's not within the + * viewport + * @param {Element} el + */ +function focus(el) { + var x = window.scrollX || window.pageXOffset; + var y = window.scrollY || window.pageYOffset; + el.focus(); + scroll(x, y); +} + +/** + * Defers a function's execution until the call stack has cleared + * @param {Function} fn + */ +function defer(fn) { + setTimeout(fn, 1); +} + +/** + * Debounce utility + * @param {Function} fn + * @param {Number} ms + */ +function debounce$1(fn, ms) { + var timeoutId = void 0; + return function () { + var _this = this, + _arguments = arguments; + + clearTimeout(timeoutId); + timeoutId = setTimeout(function () { + return fn.apply(_this, _arguments); + }, ms); + }; +} + +/** + * Prevents errors from being thrown while accessing nested modifier objects + * in `popperOptions` + * @param {Object} obj + * @param {String} key + * @return {Object|undefined} + */ +function getModifier(obj, key) { + return obj && obj.modifiers && obj.modifiers[key]; +} + +/** + * Determines if an array or string includes a value + * @param {Array|String} a + * @param {any} b + * @return {Boolean} + */ +function includes(a, b) { + return a.indexOf(b) > -1; +} + +var isUsingTouch = false; + +function onDocumentTouch() { + if (isUsingTouch) { + return; + } + + isUsingTouch = true; + + if (isIOS) { + document.body.classList.add('tippy-iOS'); + } + + if (window.performance) { + document.addEventListener('mousemove', onDocumentMouseMove); + } +} + +var lastMouseMoveTime = 0; +function onDocumentMouseMove() { + var now = performance.now(); + + // Chrome 60+ is 1 mousemove per animation frame, use 20ms time difference + if (now - lastMouseMoveTime < 20) { + isUsingTouch = false; + document.removeEventListener('mousemove', onDocumentMouseMove); + if (!isIOS) { + document.body.classList.remove('tippy-iOS'); + } + } + + lastMouseMoveTime = now; +} + +function onDocumentClick(_ref) { + var target = _ref.target; + + // Simulated events dispatched on the document + if (!(target instanceof Element)) { + return hideAllPoppers(); + } + + // Clicked on an interactive popper + var popper = closest(target, Selectors.POPPER); + if (popper && popper._tippy && popper._tippy.props.interactive) { + return; + } + + // Clicked on a reference + var reference = closestCallback(target, function (el) { + return el._tippy && el._tippy.reference === el; + }); + if (reference) { + var tip = reference._tippy; + var isClickTrigger = includes(tip.props.trigger, 'click'); + + if (isUsingTouch || isClickTrigger) { + return hideAllPoppers(tip); + } + + if (tip.props.hideOnClick !== true || isClickTrigger) { + return; + } + + tip.clearDelayTimeouts(); + } + + hideAllPoppers(); +} + +function onWindowBlur() { + var _document = document, + activeElement = _document.activeElement; + + if (activeElement && activeElement.blur && activeElement._tippy) { + activeElement.blur(); + } +} + +function onWindowResize() { + arrayFrom(document.querySelectorAll(Selectors.POPPER)).forEach(function (popper) { + var tippyInstance = popper._tippy; + if (!tippyInstance.props.livePlacement) { + tippyInstance.popperInstance.scheduleUpdate(); + } + }); +} + +/** + * Adds the needed global event listeners + */ +function bindGlobalEventListeners() { + document.addEventListener('click', onDocumentClick, true); + document.addEventListener('touchstart', onDocumentTouch, PASSIVE); + window.addEventListener('blur', onWindowBlur); + window.addEventListener('resize', onWindowResize); + + if (!supportsTouch && (navigator.maxTouchPoints || navigator.msMaxTouchPoints)) { + document.addEventListener('pointerdown', onDocumentTouch); + } +} + +var keys = Object.keys(Defaults); + +/** + * Determines if an element can receive focus + * @param {Element} el + * @return {Boolean} + */ +function canReceiveFocus(el) { + return el instanceof Element ? matches.call(el, 'a[href],area[href],button,details,input,textarea,select,iframe,[tabindex]') && !el.hasAttribute('disabled') : true; +} + +/** + * Returns an object of optional props from data-tippy-* attributes + * @param {Element} reference + * @return {Object} + */ +function getDataAttributeOptions(reference) { + return keys.reduce(function (acc, key) { + var valueAsString = (reference.getAttribute('data-tippy-' + key) || '').trim(); + + if (!valueAsString) { + return acc; + } + + if (key === 'content') { + acc[key] = valueAsString; + } else if (valueAsString === 'true') { + acc[key] = true; + } else if (valueAsString === 'false') { + acc[key] = false; + } else if (isNumeric$1(valueAsString)) { + acc[key] = Number(valueAsString); + } else if (valueAsString[0] === '[' || valueAsString[0] === '{') { + acc[key] = JSON.parse(valueAsString); + } else { + acc[key] = valueAsString; + } + + return acc; + }, {}); +} + +/** + * Polyfills the virtual reference (plain object) with Element.prototype props + * Mutating because DOM elements are mutated, adds `_tippy` property + * @param {Object} virtualReference + * @return {Object} + */ +function polyfillElementPrototypeProperties(virtualReference) { + var polyfills = { + isVirtual: true, + attributes: virtualReference.attributes || {}, + setAttribute: function setAttribute(key, value) { + virtualReference.attributes[key] = value; + }, + getAttribute: function getAttribute(key) { + return virtualReference.attributes[key]; + }, + removeAttribute: function removeAttribute(key) { + delete virtualReference.attributes[key]; + }, + hasAttribute: function hasAttribute(key) { + return key in virtualReference.attributes; + }, + addEventListener: function addEventListener() {}, + removeEventListener: function removeEventListener() {}, + + classList: { + classNames: {}, + add: function add(key) { + virtualReference.classList.classNames[key] = true; + }, + remove: function remove(key) { + delete virtualReference.classList.classNames[key]; + }, + contains: function contains(key) { + return key in virtualReference.classList.classNames; + } + } + }; + + for (var key in polyfills) { + virtualReference[key] = polyfills[key]; + } +} + +var _extends$1 = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; +}; + +/** + * Evaluates the props object + * @param {Element} reference + * @param {Object} props + * @return {Object} + */ +function evaluateProps(reference, props) { + var out = _extends$1({}, props, props.performance ? {} : getDataAttributeOptions(reference)); + + if (out.arrow) { + out.animateFill = false; + } + + if (typeof out.appendTo === 'function') { + out.appendTo = props.appendTo(reference); + } + + if (typeof out.content === 'function') { + out.content = props.content(reference); + } + + return out; +} + +/** + * Validates an object of options with the valid default props object + * @param {Object} options + * @param {Object} defaults + */ +function validateOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var defaults$$1 = arguments[1]; + + Object.keys(options).forEach(function (option) { + if (!hasOwnProperty(defaults$$1, option)) { + throw new Error('[tippy]: `' + option + '` is not a valid option'); + } + }); +} + +// ============================================================================= +// DEPRECATED +// All of this code (for the `arrowTransform` option) will be removed in v4 +// ============================================================================= +var TRANSFORM_NUMBER_RE = { + translate: /translateX?Y?\(([^)]+)\)/, + scale: /scaleX?Y?\(([^)]+)\)/ + + /** + * Transforms the x/y axis based on the placement + */ +};function transformAxisBasedOnPlacement(axis, isVertical) { + return (isVertical ? axis : { + X: 'Y', + Y: 'X' + }[axis]) || ''; +} + +/** + * Transforms the scale/translate numbers based on the placement + */ +function transformNumbersBasedOnPlacement(type, numbers, isVertical, isReverse) { + /** + * Avoid destructuring because a large boilerplate function is generated + * by Babel + */ + var a = numbers[0]; + var b = numbers[1]; + + if (!a && !b) { + return ''; + } + + var transforms = { + scale: function () { + if (!b) { + return '' + a; + } else { + return isVertical ? a + ', ' + b : b + ', ' + a; + } + }(), + translate: function () { + if (!b) { + return isReverse ? -a + 'px' : a + 'px'; + } else { + if (isVertical) { + return isReverse ? a + 'px, ' + -b + 'px' : a + 'px, ' + b + 'px'; + } else { + return isReverse ? -b + 'px, ' + a + 'px' : b + 'px, ' + a + 'px'; + } + } + }() + }; + + return transforms[type]; +} + +/** + * Returns the axis for a CSS function (translate or scale) + */ +function getTransformAxis(str, cssFunction) { + var match = str.match(new RegExp(cssFunction + '([XY])')); + return match ? match[1] : ''; +} + +/** + * Returns the numbers given to the CSS function + */ +function getTransformNumbers(str, regex) { + var match = str.match(regex); + return match ? match[1].split(',').map(function (n) { + return parseFloat(n, 10); + }) : []; +} + +/** + * Computes the arrow's transform so that it is correct for any placement + */ +function computeArrowTransform(arrow, arrowTransform) { + var placement = getPopperPlacement(closest(arrow, Selectors.POPPER)); + var isVertical = includes(['top', 'bottom'], placement); + var isReverse = includes(['right', 'bottom'], placement); + + var matches$$1 = { + translate: { + axis: getTransformAxis(arrowTransform, 'translate'), + numbers: getTransformNumbers(arrowTransform, TRANSFORM_NUMBER_RE.translate) + }, + scale: { + axis: getTransformAxis(arrowTransform, 'scale'), + numbers: getTransformNumbers(arrowTransform, TRANSFORM_NUMBER_RE.scale) + } + }; + + var computedTransform = arrowTransform.replace(TRANSFORM_NUMBER_RE.translate, 'translate' + transformAxisBasedOnPlacement(matches$$1.translate.axis, isVertical) + '(' + transformNumbersBasedOnPlacement('translate', matches$$1.translate.numbers, isVertical, isReverse) + ')').replace(TRANSFORM_NUMBER_RE.scale, 'scale' + transformAxisBasedOnPlacement(matches$$1.scale.axis, isVertical) + '(' + transformNumbersBasedOnPlacement('scale', matches$$1.scale.numbers, isVertical, isReverse) + ')'); + + arrow.style[typeof document.body.style.transform !== 'undefined' ? 'transform' : 'webkitTransform'] = computedTransform; +} + +var idCounter = 1; + +/** + * Creates and returns a Tippy object. We're using a closure pattern instead of + * a class so that the exposed object API is clean without private members + * prefixed with `_`. + * @param {Element} reference + * @param {Object} collectionProps + * @return {Object} instance + */ +function createTippy(reference, collectionProps) { + var props = evaluateProps(reference, collectionProps); + + // If the reference shouldn't have multiple tippys, return null early + if (!props.multiple && reference._tippy) { + return null; + } + + /* ======================= 🔒 Private members 🔒 ======================= */ + // The popper element's mutation observer + var popperMutationObserver = null; + + // The last trigger event object that caused the tippy to show + var lastTriggerEvent = {}; + + // The last mousemove event object created by the document mousemove event + var lastMouseMoveEvent = null; + + // Timeout created by the show delay + var showTimeoutId = 0; + + // Timeout created by the hide delay + var hideTimeoutId = 0; + + // Flag to determine if the tippy is preparing to show due to the show timeout + var isPreparingToShow = false; + + // The current `transitionend` callback reference + var transitionEndListener = function transitionEndListener() {}; + + // Array of event listeners currently attached to the reference element + var listeners = []; + + // Flag to determine if the reference was recently programmatically focused + var referenceJustProgrammaticallyFocused = false; + + // Private onMouseMove handler reference, debounced or not + var debouncedOnMouseMove = props.interactiveDebounce > 0 ? debounce$1(onMouseMove, props.interactiveDebounce) : onMouseMove; + + /* ======================= 🔑 Public members 🔑 ======================= */ + // id used for the `aria-describedby` / `aria-labelledby` attribute + var id = idCounter++; + + // Popper element reference + var popper = createPopperElement(id, props); + + // Prevent a tippy with a delay from hiding if the cursor left then returned + // before it started hiding + popper.addEventListener('mouseenter', function (event) { + if (tip.props.interactive && tip.state.isVisible && lastTriggerEvent.type === 'mouseenter') { + prepareShow(event); + } + }); + popper.addEventListener('mouseleave', function (event) { + if (tip.props.interactive && lastTriggerEvent.type === 'mouseenter' && tip.props.interactiveDebounce === 0 && isCursorOutsideInteractiveBorder(getPopperPlacement(popper), popper.getBoundingClientRect(), event, tip.props)) { + prepareHide(); + } + }); + + // Popper element children: { arrow, backdrop, content, tooltip } + var popperChildren = getChildren(popper); + + // The state of the tippy + var state = { + // If the tippy is currently enabled + isEnabled: true, + // show() invoked, not currently transitioning out + isVisible: false, + // If the tippy has been destroyed + isDestroyed: false, + // If the tippy is on the DOM (transitioning out or in) + isMounted: false, + // show() transition finished + isShown: false + + // Popper.js instance for the tippy is lazily created + };var popperInstance = null; + + // 🌟 tippy instance + var tip = { + // properties + id: id, + reference: reference, + popper: popper, + popperChildren: popperChildren, + popperInstance: popperInstance, + props: props, + state: state, + // methods + clearDelayTimeouts: clearDelayTimeouts, + set: set$$1, + setContent: setContent$$1, + show: show, + hide: hide, + enable: enable, + disable: disable, + destroy: destroy + }; + + addTriggersToReference(); + + reference.addEventListener('click', onReferenceClick); + + if (!props.lazy) { + tip.popperInstance = createPopperInstance(); + tip.popperInstance.disableEventListeners(); + } + + if (props.showOnInit) { + prepareShow(); + } + + // Ensure the reference element can receive focus (and is not a delegate) + if (props.a11y && !props.target && !canReceiveFocus(reference)) { + reference.setAttribute('tabindex', '0'); + } + + // Install shortcuts + reference._tippy = tip; + popper._tippy = tip; + + return tip; + + /* ======================= 🔒 Private methods 🔒 ======================= */ + /** + * If the reference was clicked, it also receives focus + */ + function onReferenceClick() { + defer(function () { + referenceJustProgrammaticallyFocused = false; + }); + } + + /** + * Ensure the popper's position stays correct if its dimensions change. Use + * update() over .scheduleUpdate() so there is no 1 frame flash due to + * async update + */ + function addMutationObserver() { + popperMutationObserver = new MutationObserver(function () { + tip.popperInstance.update(); + }); + popperMutationObserver.observe(popper, { + childList: true, + subtree: true, + characterData: true + }); + } + + /** + * Positions the virtual reference near the mouse cursor + */ + function positionVirtualReferenceNearCursor(event) { + var _lastMouseMoveEvent = lastMouseMoveEvent = event, + clientX = _lastMouseMoveEvent.clientX, + clientY = _lastMouseMoveEvent.clientY; + + if (!tip.popperInstance) { + return; + } + + // Ensure virtual reference is padded by 5px to prevent tooltip from + // overflowing. Maybe Popper.js issue? + var placement = getPopperPlacement(tip.popper); + var padding = tip.popperChildren.arrow ? 20 : 5; + var isVerticalPlacement = includes(['top', 'bottom'], placement); + var isHorizontalPlacement = includes(['left', 'right'], placement); + + // Top / left boundary + var x = isVerticalPlacement ? Math.max(padding, clientX) : clientX; + var y = isHorizontalPlacement ? Math.max(padding, clientY) : clientY; + + // Bottom / right boundary + if (isVerticalPlacement && x > padding) { + x = Math.min(clientX, window.innerWidth - padding); + } + if (isHorizontalPlacement && y > padding) { + y = Math.min(clientY, window.innerHeight - padding); + } + + var rect = tip.reference.getBoundingClientRect(); + var followCursor = tip.props.followCursor; + + var isHorizontal = followCursor === 'horizontal'; + var isVertical = followCursor === 'vertical'; + + tip.popperInstance.reference = { + getBoundingClientRect: function getBoundingClientRect() { + return { + width: 0, + height: 0, + top: isHorizontal ? rect.top : y, + bottom: isHorizontal ? rect.bottom : y, + left: isVertical ? rect.left : x, + right: isVertical ? rect.right : x + }; + }, + clientWidth: 0, + clientHeight: 0 + }; + + tip.popperInstance.scheduleUpdate(); + + if (followCursor === 'initial' && tip.state.isVisible) { + removeFollowCursorListener(); + } + } + + /** + * Creates the tippy instance for a delegate when it's been triggered + */ + function createDelegateChildTippy(event) { + var targetEl = closest(event.target, tip.props.target); + if (targetEl && !targetEl._tippy) { + createTippy(targetEl, _extends$1({}, tip.props, { + target: '', + showOnInit: true + })); + prepareShow(event); + } + } + + /** + * Setup before show() is invoked (delays, etc.) + */ + function prepareShow(event) { + clearDelayTimeouts(); + + if (tip.state.isVisible) { + return; + } + + // Is a delegate, create an instance for the child target + if (tip.props.target) { + return createDelegateChildTippy(event); + } + + isPreparingToShow = true; + + if (tip.props.wait) { + return tip.props.wait(tip, event); + } + + // If the tooltip has a delay, we need to be listening to the mousemove as + // soon as the trigger event is fired, so that it's in the correct position + // upon mount. + // Edge case: if the tooltip is still mounted, but then prepareShow() is + // called, it causes a jump. + if (hasFollowCursorBehavior() && !tip.state.isMounted) { + document.addEventListener('mousemove', positionVirtualReferenceNearCursor); + } + + var delay = getValue(tip.props.delay, 0, Defaults.delay); + + if (delay) { + showTimeoutId = setTimeout(function () { + show(); + }, delay); + } else { + show(); + } + } + + /** + * Setup before hide() is invoked (delays, etc.) + */ + function prepareHide() { + clearDelayTimeouts(); + + if (!tip.state.isVisible) { + return removeFollowCursorListener(); + } + + isPreparingToShow = false; + + var delay = getValue(tip.props.delay, 1, Defaults.delay); + + if (delay) { + hideTimeoutId = setTimeout(function () { + if (tip.state.isVisible) { + hide(); + } + }, delay); + } else { + hide(); + } + } + + /** + * Removes the follow cursor listener + */ + function removeFollowCursorListener() { + document.removeEventListener('mousemove', positionVirtualReferenceNearCursor); + lastMouseMoveEvent = null; + } + + /** + * Cleans up old listeners + */ + function cleanupOldMouseListeners() { + document.body.removeEventListener('mouseleave', prepareHide); + document.removeEventListener('mousemove', debouncedOnMouseMove); + } + + /** + * Event listener invoked upon trigger + */ + function onTrigger(event) { + if (!tip.state.isEnabled || isEventListenerStopped(event)) { + return; + } + + if (!tip.state.isVisible) { + lastTriggerEvent = event; + } + + // Toggle show/hide when clicking click-triggered tooltips + if (event.type === 'click' && tip.props.hideOnClick !== false && tip.state.isVisible) { + prepareHide(); + } else { + prepareShow(event); + } + } + + /** + * Event listener used for interactive tooltips to detect when they should + * hide + */ + function onMouseMove(event) { + var referenceTheCursorIsOver = closestCallback(event.target, function (el) { + return el._tippy; + }); + + var isCursorOverPopper = closest(event.target, Selectors.POPPER) === tip.popper; + var isCursorOverReference = referenceTheCursorIsOver === tip.reference; + + if (isCursorOverPopper || isCursorOverReference) { + return; + } + + if (isCursorOutsideInteractiveBorder(getPopperPlacement(tip.popper), tip.popper.getBoundingClientRect(), event, tip.props)) { + cleanupOldMouseListeners(); + prepareHide(); + } + } + + /** + * Event listener invoked upon mouseleave + */ + function onMouseLeave(event) { + if (isEventListenerStopped(event)) { + return; + } + + if (tip.props.interactive) { + document.body.addEventListener('mouseleave', prepareHide); + document.addEventListener('mousemove', debouncedOnMouseMove); + return; + } + + prepareHide(); + } + + /** + * Event listener invoked upon blur + */ + function onBlur(event) { + if (event.target !== tip.reference) { + return; + } + + if (tip.props.interactive) { + if (!event.relatedTarget) { + return; + } + if (closest(event.relatedTarget, Selectors.POPPER)) { + return; + } + } + + prepareHide(); + } + + /** + * Event listener invoked when a child target is triggered + */ + function onDelegateShow(event) { + if (closest(event.target, tip.props.target)) { + prepareShow(event); + } + } + + /** + * Event listener invoked when a child target should hide + */ + function onDelegateHide(event) { + if (closest(event.target, tip.props.target)) { + prepareHide(); + } + } + + /** + * Determines if an event listener should stop further execution due to the + * `touchHold` option + */ + function isEventListenerStopped(event) { + var isTouchEvent = includes(event.type, 'touch'); + var caseA = supportsTouch && isUsingTouch && tip.props.touchHold && !isTouchEvent; + var caseB = isUsingTouch && !tip.props.touchHold && isTouchEvent; + return caseA || caseB; + } + + /** + * Creates the popper instance for the tip + */ + function createPopperInstance() { + var popperOptions = tip.props.popperOptions; + var _tip$popperChildren = tip.popperChildren, + tooltip = _tip$popperChildren.tooltip, + arrow = _tip$popperChildren.arrow; + + + return new Popper(tip.reference, tip.popper, _extends$1({ + placement: tip.props.placement + }, popperOptions, { + modifiers: _extends$1({}, popperOptions ? popperOptions.modifiers : {}, { + preventOverflow: _extends$1({ + boundariesElement: tip.props.boundary + }, getModifier(popperOptions, 'preventOverflow')), + arrow: _extends$1({ + element: arrow, + enabled: !!arrow + }, getModifier(popperOptions, 'arrow')), + flip: _extends$1({ + enabled: tip.props.flip, + padding: tip.props.distance + 5 /* 5px from viewport boundary */ + , behavior: tip.props.flipBehavior + }, getModifier(popperOptions, 'flip')), + offset: _extends$1({ + offset: tip.props.offset + }, getModifier(popperOptions, 'offset')) + }), + onCreate: function onCreate() { + tooltip.style[getPopperPlacement(tip.popper)] = getOffsetDistanceInPx(tip.props.distance, Defaults.distance); + + if (arrow && tip.props.arrowTransform) { + computeArrowTransform(arrow, tip.props.arrowTransform); + } + }, + onUpdate: function onUpdate() { + var styles = tooltip.style; + styles.top = ''; + styles.bottom = ''; + styles.left = ''; + styles.right = ''; + styles[getPopperPlacement(tip.popper)] = getOffsetDistanceInPx(tip.props.distance, Defaults.distance); + + if (arrow && tip.props.arrowTransform) { + computeArrowTransform(arrow, tip.props.arrowTransform); + } + } + })); + } + + /** + * Mounts the tooltip to the DOM, callback to show tooltip is run **after** + * popper's position has updated + */ + function mount(callback) { + if (!tip.popperInstance) { + tip.popperInstance = createPopperInstance(); + addMutationObserver(); + if (!tip.props.livePlacement || hasFollowCursorBehavior()) { + tip.popperInstance.disableEventListeners(); + } + } else { + if (!hasFollowCursorBehavior()) { + tip.popperInstance.scheduleUpdate(); + if (tip.props.livePlacement) { + tip.popperInstance.enableEventListeners(); + } + } + } + + // If the instance previously had followCursor behavior, it will be + // positioned incorrectly if triggered by `focus` afterwards. + // Update the reference back to the real DOM element + tip.popperInstance.reference = tip.reference; + var arrow = tip.popperChildren.arrow; + + + if (hasFollowCursorBehavior()) { + if (arrow) { + arrow.style.margin = '0'; + } + var delay = getValue(tip.props.delay, 0, Defaults.delay); + if (lastTriggerEvent.type) { + positionVirtualReferenceNearCursor(delay && lastMouseMoveEvent ? lastMouseMoveEvent : lastTriggerEvent); + } + } else if (arrow) { + arrow.style.margin = ''; + } + + afterPopperPositionUpdates(tip.popperInstance, callback); + + if (!tip.props.appendTo.contains(tip.popper)) { + tip.props.appendTo.appendChild(tip.popper); + tip.props.onMount(tip); + tip.state.isMounted = true; + } + } + + /** + * Determines if the instance is in `followCursor` mode + */ + function hasFollowCursorBehavior() { + return tip.props.followCursor && !isUsingTouch && lastTriggerEvent.type !== 'focus'; + } + + /** + * Updates the tooltip's position on each animation frame + timeout + */ + function makeSticky() { + applyTransitionDuration([tip.popper], isIE ? 0 : tip.props.updateDuration); + + var updatePosition = function updatePosition() { + if (tip.popperInstance) { + tip.popperInstance.scheduleUpdate(); + } + + if (tip.state.isMounted) { + requestAnimationFrame(updatePosition); + } else { + applyTransitionDuration([tip.popper], 0); + } + }; + + updatePosition(); + } + + /** + * Invokes a callback once the tooltip has fully transitioned out + */ + function onTransitionedOut(duration, callback) { + onTransitionEnd(duration, function () { + if (!tip.state.isVisible && tip.props.appendTo.contains(tip.popper)) { + callback(); + } + }); + } + + /** + * Invokes a callback once the tooltip has fully transitioned in + */ + function onTransitionedIn(duration, callback) { + onTransitionEnd(duration, callback); + } + + /** + * Invokes a callback once the tooltip's CSS transition ends + */ + function onTransitionEnd(duration, callback) { + // Make callback synchronous if duration is 0 + if (duration === 0) { + return callback(); + } + + var tooltip = tip.popperChildren.tooltip; + + + var listener = function listener(e) { + if (e.target === tooltip) { + toggleTransitionEndListener(tooltip, 'remove', listener); + callback(); + } + }; + + toggleTransitionEndListener(tooltip, 'remove', transitionEndListener); + toggleTransitionEndListener(tooltip, 'add', listener); + + transitionEndListener = listener; + } + + /** + * Adds an event listener to the reference and stores it in `listeners` + */ + function on(eventType, handler) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + tip.reference.addEventListener(eventType, handler, options); + listeners.push({ eventType: eventType, handler: handler, options: options }); + } + + /** + * Adds event listeners to the reference based on the `trigger` prop + */ + function addTriggersToReference() { + if (tip.props.touchHold && !tip.props.target) { + on('touchstart', onTrigger, PASSIVE); + on('touchend', onMouseLeave, PASSIVE); + } + + tip.props.trigger.trim().split(' ').forEach(function (eventType) { + if (eventType === 'manual') { + return; + } + + if (!tip.props.target) { + on(eventType, onTrigger); + switch (eventType) { + case 'mouseenter': + on('mouseleave', onMouseLeave); + break; + case 'focus': + on(isIE ? 'focusout' : 'blur', onBlur); + break; + } + } else { + switch (eventType) { + case 'mouseenter': + on('mouseover', onDelegateShow); + on('mouseout', onDelegateHide); + break; + case 'focus': + on('focusin', onDelegateShow); + on('focusout', onDelegateHide); + break; + case 'click': + on(eventType, onDelegateShow); + break; + } + } + }); + } + + /** + * Removes event listeners from the reference + */ + function removeTriggersFromReference() { + listeners.forEach(function (_ref) { + var eventType = _ref.eventType, + handler = _ref.handler, + options = _ref.options; + + tip.reference.removeEventListener(eventType, handler, options); + }); + listeners = []; + } + + /* ======================= 🔑 Public methods 🔑 ======================= */ + /** + * Enables the instance to allow it to show or hide + */ + function enable() { + tip.state.isEnabled = true; + } + + /** + * Disables the instance to disallow it to show or hide + */ + function disable() { + tip.state.isEnabled = false; + } + + /** + * Clears pending timeouts related to the `delay` prop if any + */ + function clearDelayTimeouts() { + clearTimeout(showTimeoutId); + clearTimeout(hideTimeoutId); + } + + /** + * Sets new props for the instance and redraws the tooltip + */ + function set$$1() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + validateOptions(options, Defaults); + + var prevProps = tip.props; + var nextProps = evaluateProps(tip.reference, _extends$1({}, tip.props, options, { + performance: true + })); + nextProps.performance = hasOwnProperty(options, 'performance') ? options.performance : prevProps.performance; + tip.props = nextProps; + + if (hasOwnProperty(options, 'trigger') || hasOwnProperty(options, 'touchHold')) { + removeTriggersFromReference(); + addTriggersToReference(); + } + + if (hasOwnProperty(options, 'interactiveDebounce')) { + cleanupOldMouseListeners(); + debouncedOnMouseMove = debounce$1(onMouseMove, options.interactiveDebounce); + } + + updatePopperElement(tip.popper, prevProps, nextProps); + tip.popperChildren = getChildren(tip.popper); + + if (tip.popperInstance && POPPER_INSTANCE_RELATED_PROPS.some(function (prop) { + return hasOwnProperty(options, prop); + })) { + tip.popperInstance.destroy(); + tip.popperInstance = createPopperInstance(); + if (!tip.state.isVisible) { + tip.popperInstance.disableEventListeners(); + } + if (tip.props.followCursor && lastMouseMoveEvent) { + positionVirtualReferenceNearCursor(lastMouseMoveEvent); + } + } + } + + /** + * Shortcut for .set({ content: newContent }) + */ + function setContent$$1(content) { + set$$1({ content: content }); + } + + /** + * Shows the tooltip + */ + function show() { + var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getValue(tip.props.duration, 0, Defaults.duration[0]); + + if (tip.state.isDestroyed || !tip.state.isEnabled || isUsingTouch && !tip.props.touch) { + return; + } + + // Destroy tooltip if the reference element is no longer on the DOM + if (!tip.reference.isVirtual && !document.documentElement.contains(tip.reference)) { + return destroy(); + } + + // Do not show tooltip if the reference element has a `disabled` attribute + if (tip.reference.hasAttribute('disabled')) { + return; + } + + // If the reference was just programmatically focused for accessibility + // reasons + if (referenceJustProgrammaticallyFocused) { + referenceJustProgrammaticallyFocused = false; + return; + } + + if (tip.props.onShow(tip) === false) { + return; + } + + tip.popper.style.visibility = 'visible'; + tip.state.isVisible = true; + + // Prevent a transition if the popper is at the opposite placement + applyTransitionDuration([tip.popper, tip.popperChildren.tooltip, tip.popperChildren.backdrop], 0); + + mount(function () { + if (!tip.state.isVisible) { + return; + } + + // Arrow will sometimes not be positioned correctly. Force another update + if (!hasFollowCursorBehavior()) { + tip.popperInstance.update(); + } + + applyTransitionDuration([tip.popperChildren.tooltip, tip.popperChildren.backdrop, tip.popperChildren.content], duration); + if (tip.popperChildren.backdrop) { + tip.popperChildren.content.style.transitionDelay = Math.round(duration / 6) + 'ms'; + } + + if (tip.props.interactive) { + tip.reference.classList.add('tippy-active'); + } + + if (tip.props.sticky) { + makeSticky(); + } + + setVisibilityState([tip.popperChildren.tooltip, tip.popperChildren.backdrop, tip.popperChildren.content], 'visible'); + + onTransitionedIn(duration, function () { + if (tip.props.updateDuration === 0) { + tip.popperChildren.tooltip.classList.add('tippy-notransition'); + } + + if (tip.props.autoFocus && tip.props.interactive && includes(['focus', 'click'], lastTriggerEvent.type)) { + focus(tip.popper); + } + + if (tip.props.aria) { + tip.reference.setAttribute('aria-' + tip.props.aria, tip.popper.id); + } + + tip.props.onShown(tip); + tip.state.isShown = true; + }); + }); + } + + /** + * Hides the tooltip + */ + function hide() { + var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getValue(tip.props.duration, 1, Defaults.duration[1]); + + if (tip.state.isDestroyed || !tip.state.isEnabled) { + return; + } + + if (tip.props.onHide(tip) === false) { + return; + } + + if (tip.props.updateDuration === 0) { + tip.popperChildren.tooltip.classList.remove('tippy-notransition'); + } + + if (tip.props.interactive) { + tip.reference.classList.remove('tippy-active'); + } + + tip.popper.style.visibility = 'hidden'; + tip.state.isVisible = false; + tip.state.isShown = false; + + applyTransitionDuration([tip.popperChildren.tooltip, tip.popperChildren.backdrop, tip.popperChildren.content], duration); + + setVisibilityState([tip.popperChildren.tooltip, tip.popperChildren.backdrop, tip.popperChildren.content], 'hidden'); + + if (tip.props.autoFocus && tip.props.interactive && !referenceJustProgrammaticallyFocused && includes(['focus', 'click'], lastTriggerEvent.type)) { + if (lastTriggerEvent.type === 'focus') { + referenceJustProgrammaticallyFocused = true; + } + focus(tip.reference); + } + + onTransitionedOut(duration, function () { + if (!isPreparingToShow) { + removeFollowCursorListener(); + } + + if (tip.props.aria) { + tip.reference.removeAttribute('aria-' + tip.props.aria); + } + + tip.popperInstance.disableEventListeners(); + + tip.props.appendTo.removeChild(tip.popper); + tip.state.isMounted = false; + + tip.props.onHidden(tip); + }); + } + + /** + * Destroys the tooltip + */ + function destroy(destroyTargetInstances) { + if (tip.state.isDestroyed) { + return; + } + + // If the popper is currently mounted to the DOM, we want to ensure it gets + // hidden and unmounted instantly upon destruction + if (tip.state.isMounted) { + hide(0); + } + + removeTriggersFromReference(); + + tip.reference.removeEventListener('click', onReferenceClick); + + delete tip.reference._tippy; + + if (tip.props.target && destroyTargetInstances) { + arrayFrom(tip.reference.querySelectorAll(tip.props.target)).forEach(function (child) { + return child._tippy && child._tippy.destroy(); + }); + } + + if (tip.popperInstance) { + tip.popperInstance.destroy(); + } + + if (popperMutationObserver) { + popperMutationObserver.disconnect(); + } + + tip.state.isDestroyed = true; + } +} + +var globalEventListenersBound = false; + +/** + * Exported module + * @param {String|Element|Element[]|NodeList|Object} targets + * @param {Object} options + * @param {Boolean} one + * @return {Object} + */ +function tippy(targets, options, one) { + validateOptions(options, Defaults); + + if (!globalEventListenersBound) { + bindGlobalEventListeners(); + globalEventListenersBound = true; + } + + var props = _extends$1({}, Defaults, options); + + /** + * If they are specifying a virtual positioning reference, we need to polyfill + * some native DOM props + */ + if (isPlainObject(targets)) { + polyfillElementPrototypeProperties(targets); + } + + var references = getArrayOfElements(targets); + var firstReference = references[0]; + + var instances = (one && firstReference ? [firstReference] : references).reduce(function (acc, reference) { + var tip = reference && createTippy(reference, props); + if (tip) { + acc.push(tip); + } + return acc; + }, []); + + var collection = { + targets: targets, + props: props, + instances: instances, + destroyAll: function destroyAll() { + collection.instances.forEach(function (instance) { + instance.destroy(); + }); + collection.instances = []; + } + }; + + return collection; +} + +/** + * Static props + */ +tippy.version = version; +tippy.defaults = Defaults; + +/** + * Static methods + */ +tippy.one = function (targets, options) { + return tippy(targets, options, true).instances[0]; +}; +tippy.setDefaults = function (partialDefaults) { + Object.keys(partialDefaults).forEach(function (key) { + Defaults[key] = partialDefaults[key]; + }); +}; +tippy.disableAnimations = function () { + tippy.setDefaults({ + duration: 0, + updateDuration: 0, + animateFill: false + }); +}; +tippy.hideAllPoppers = hideAllPoppers; +// noop: deprecated static method as capture phase is now default +tippy.useCapture = function () {}; + +/** + * Auto-init tooltips for elements with a `data-tippy="..."` attribute + */ +var autoInit = function autoInit() { + arrayFrom(document.querySelectorAll('[data-tippy]')).forEach(function (el) { + var content = el.getAttribute('data-tippy'); + if (content) { + tippy(el, { content: content }); + } + }); +}; +if (isBrowser) { + setTimeout(autoInit); +} + +/** + * Injects a string of CSS styles to a style node in + * @param {String} css + */ +function injectCSS(css) { + if (isBrowserSupported) { + var style = document.createElement('style'); + style.type = 'text/css'; + style.textContent = css; + document.head.insertBefore(style, document.head.firstChild); + } +} + +injectCSS(styles); + +return tippy; + +}))); +//# sourceMappingURL=tippy.all.js.map diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/tippy.js/tippy.all.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/tippy.js/tippy.all.min.js new file mode 100644 index 00000000..3c80eaff --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/assets/tippy.js/tippy.all.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.tippy=e()}(this,function(){"use strict";for(var t="undefined"!=typeof window,e=t?navigator:{},r=t?window:{},n=("MutationObserver"in r),z=/MSIE |Trident\//.test(e.userAgent),o=/iPhone|iPad|iPod/.test(e.platform)&&!r.MSStream,_=("ontouchstart"in r),j={a11y:!0,allowHTML:!0,animateFill:!0,animation:"shift-away",appendTo:function(){return document.body},aria:"describedby",arrow:!1,arrowTransform:"",arrowType:"sharp",autoFocus:!0,boundary:"scrollParent",content:"",delay:[0,20],distance:10,duration:[325,275],flip:!0,flipBehavior:"flip",followCursor:!1,hideOnClick:!0,inertia:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,lazy:!0,livePlacement:!0,maxWidth:"",multiple:!1,offset:0,onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},performance:!1,placement:"top",popperOptions:{},shouldPopperHideOnBlur:function(){return!0},showOnInit:!1,size:"regular",sticky:!1,target:"",theme:"dark",touch:!0,touchHold:!1,trigger:"mouseenter focus",updateDuration:200,wait:null,zIndex:9999},V=["arrow","arrowType","distance","flip","flipBehavior","offset","placement","popperOptions"],i="undefined"!=typeof window&&"undefined"!=typeof document,a=["Edge","Trident","Firefox"],p=0,s=0;s=n.clientWidth&&r>=n.clientHeight}),f=0s[t]&&!n.escapeWithReference&&(r=Math.min(c[e],s[t]-("right"===t?c.width:c.height))),L({},e,r)}};return l.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";c=C({},c,f[e](t))}),t.offsets.popper=c,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,r=e.popper,n=e.reference,o=t.placement.split("-")[0],i=Math.floor,a=-1!==["top","bottom"].indexOf(o),p=a?"right":"bottom",s=a?"left":"top",l=a?"width":"height";return r[p]i(n[p])&&(t.offsets.popper[s]=i(n[p])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var r;if(!Z(t.instance.modifiers,"arrow","keepTogether"))return t;var n=e.element;if("string"==typeof n){if(!(n=t.instance.popper.querySelector(n)))return t}else if(!t.instance.popper.contains(n))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],i=t.offsets,a=i.popper,p=i.reference,s=-1!==["left","right"].indexOf(o),l=s?"height":"width",c=s?"Top":"Left",f=c.toLowerCase(),d=s?"left":"top",u=s?"bottom":"right",m=S(n)[l];p[u]-ma[u]&&(t.offsets.popper[f]+=p[f]+m-a[u]),t.offsets.popper=A(t.offsets.popper);var h=p[f]+p[l]/2-m/2,b=w(t.instance.popper),v=parseFloat(b["margin"+c],10),y=parseFloat(b["border"+c+"Width"],10),g=h-t.offsets.popper[f]-v-y;return g=Math.max(Math.min(a[l]-m,g),0),t.arrowElement=n,t.offsets.arrow=(L(r={},f,Math.round(g)),L(r,d,""),r),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(u,m){if(R(u.instance.modifiers,"inner"))return u;if(u.flipped&&u.placement===u.originalPlacement)return u;var h=P(u.instance.popper,u.instance.reference,m.padding,m.boundariesElement,u.positionFixed),b=u.placement.split("-")[0],v=I(b),y=u.placement.split("-")[1]||"",g=[];switch(m.behavior){case rt:g=[b,v];break;case nt:g=et(b);break;case ot:g=et(b,!0);break;default:g=m.behavior}return g.forEach(function(t,e){if(b!==t||g.length===e+1)return u;b=u.placement.split("-")[0],v=I(b);var r=u.offsets.popper,n=u.offsets.reference,o=Math.floor,i="left"===b&&o(r.right)>o(n.left)||"right"===b&&o(r.left)o(n.top)||"bottom"===b&&o(r.top)o(h.right),s=o(r.top)o(h.bottom),c="left"===b&&a||"right"===b&&p||"top"===b&&s||"bottom"===b&&l,f=-1!==["top","bottom"].indexOf(b),d=!!m.flipVariations&&(f&&"start"===y&&a||f&&"end"===y&&p||!f&&"start"===y&&s||!f&&"end"===y&&l);(i||c||d)&&(u.flipped=!0,(i||c)&&(b=g[e+1]),d&&(y=function(t){return"end"===t?"start":"start"===t?"end":t}(y)),u.placement=b+(y?"-"+y:""),u.offsets.popper=C({},u.offsets.popper,H(u.instance.popper,u.offsets.reference,u.placement)),u=B(u.instance.modifiers,u,"flip"))}),u},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,r=e.split("-")[0],n=t.offsets,o=n.popper,i=n.reference,a=-1!==["left","right"].indexOf(r),p=-1===["top","left"].indexOf(r);return o[a?"left":"top"]=i[r]-(p?o[a?"width":"height"]:0),t.placement=I(e),t.offsets.popper=A(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!Z(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,r=F(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottomr.right||e.top>r.bottom||e.right')):e.className="tippy-arrow",e}function Et(){var t=vt();return t.className="tippy-backdrop",t.setAttribute("data-state","hidden"),t}function Ot(t,e){t.setAttribute("tabindex","-1"),e.setAttribute("data-interactive","")}function Tt(t,e){t.forEach(function(t){t&&(t.style.transitionDuration=e+"ms")})}function Lt(t,e,r){t[e+"EventListener"]("transitionend",r)}function Ct(t){var e=t.getAttribute("x-placement");return e?e.split("-")[0]:""}function At(t,e){t.forEach(function(t){t&&t.setAttribute("data-state",e)})}function Yt(r){dt(document.querySelectorAll(lt.POPPER)).forEach(function(t){var e=t._tippy;!e||!0!==e.props.hideOnClick||r&&t===r.popper||e.hide()})}function Dt(t,e,r,n){if(!t)return!0;var o=r.clientX,i=r.clientY,a=n.interactiveBorder,p=n.distance,s=e.top-i>("top"===t?a+p:a),l=i-e.bottom>("bottom"===t?a+p:a),c=e.left-o>("left"===t?a+p:a),f=o-e.right>("right"===t?a+p:a);return s||l||c||f}function Mt(t,e){return-(t-e)+"px"}function Pt(t){return"[object Object]"==={}.toString.call(t)}function Xt(t,e){return{}.hasOwnProperty.call(t,e)}function Nt(t,e,r){if(Array.isArray(t)){var n=t[e];return null==n?r:n}return t}function St(t){var e=window.scrollX||window.pageXOffset,r=window.scrollY||window.pageYOffset;t.focus(),scroll(e,r)}function It(r,n){var o=void 0;return function(){var t=this,e=arguments;clearTimeout(o),o=setTimeout(function(){return r.apply(t,e)},n)}}function Ht(t,e){return t&&t.modifiers&&t.modifiers[e]}function Ft(t,e){return-1 p { + color: #777; +} + +hr { + background: #c3c3c3; + border: 0; + margin: 2em auto; + width: 60%; + height: 1px; +} + +#pronamic_ideal_form label { + display: block; + font-weight: bold; + margin-bottom: 0.5em; +} +#pronamic_ideal_form p .pronamic-pay-btn { + margin-top: 0.5em; +} + +.pronamic-pay-btn { + background: #008ec2; + border: 0; + border-radius: 4px; + color: #fff; + font-size: 24px; + font-weight: 200; + padding: 10px 20px; +} + +.alignleft { + text-align: left; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/css/redirect.css.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/css/redirect.css.map new file mode 100644 index 00000000..ec4004f8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/css/redirect.css.map @@ -0,0 +1 @@ +{"version": 3, "mappings": "AAYA,IAAK;EACJ,UAAU,EAVoB,OAAO;EAYrC,WAAW,EAAE,8CAA8C;;;AAG5D,2BAA4B;EAC3B,MAAM,EAAE,MAAM;EAEd,SAAS,EAAE,KAAK;;;AAGjB,gCAAiC;EAChC,UAAU,EAxBH,IAAI;EA0BX,MAAM,EAAE,iBAAqB;EAE7B,aAAa,EAAE,GAAG;EAElB,MAAM,EAAE,SAAS;EACjB,OAAO,EAAE,IAAI;EAEb,UAAU,EAAE,MAAM;;AAElB,mCAAG;EACF,MAAM,EAAE,CAAC;;AAGV,uCAAS;EACR,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,KAAK;;AAGf,oCAAI;EACH,KAAK,EAxCK,IAAI;;;AA4ChB,EAAG;EACF,UAAU,EA/CE,OAAO;EAiDnB,MAAM,EAAE,CAAC;EAET,MAAM,EAAE,QAAQ;EAEhB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;;;AAIX,0BAAM;EACL,OAAO,EAAE,KAAK;EAEd,WAAW,EAAE,IAAI;EAEjB,aAAa,EAAE,IAAI;;AAInB,wCAAkB;EACjB,UAAU,EAAE,IAAI;;;AAKnB,iBAAkB;EACjB,UAAU,EArEgC,OAAO;EAuEjD,MAAM,EAAE,CAAC;EACT,aAAa,EAAE,GAAG;EAElB,KAAK,EAnFE,IAAI;EAqFX,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAEhB,OAAO,EAAE,SAAS;;;AAGnB,UAAW;EACV,UAAU,EAAE,IAAI", "sources": ["../scss/redirect.scss"], "names": [], "file": "redirect.css"} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/css/redirect.min.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/css/redirect.min.css new file mode 100644 index 00000000..d21dbf39 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/css/redirect.min.css @@ -0,0 +1 @@ +body{background:#f6f6f6;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.pronamic-pay-redirect-page{margin:0 auto;max-width:750px}.pronamic-pay-redirect-container{background:#fff;border:1px solid #c3c3c3;border-radius:4px;margin:30px auto;padding:20px;text-align:center}.pronamic-pay-redirect-container h1{margin:0}.pronamic-pay-redirect-container:after{clear:both;content:"";display:table}.pronamic-pay-redirect-container>p{color:#777}hr{background:#c3c3c3;border:0;margin:2em auto;width:60%;height:1px}#pronamic_ideal_form label{display:block;font-weight:700;margin-bottom:.5em}#pronamic_ideal_form p .pronamic-pay-btn{margin-top:.5em}.pronamic-pay-btn{background:#008ec2;border:0;border-radius:4px;color:#fff;font-size:24px;font-weight:200;padding:10px 20px}.alignleft{text-align:left} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.css new file mode 100644 index 00000000..6000acee --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.css @@ -0,0 +1,94 @@ +/* Generated by grunt-webfont */ + + + +@font-face { + font-family:"Pronamic Pay Icons"; + src:url("pronamic-pay-icons.eot?90e24a9302e93ce8bcdcfcae23956ece"); + src:url("pronamic-pay-icons.eot?90e24a9302e93ce8bcdcfcae23956ece#iefix") format("embedded-opentype"), + url("pronamic-pay-icons.woff2?90e24a9302e93ce8bcdcfcae23956ece") format("woff2"), + url("pronamic-pay-icons.woff?90e24a9302e93ce8bcdcfcae23956ece") format("woff"), + url("pronamic-pay-icons.ttf?90e24a9302e93ce8bcdcfcae23956ece") format("truetype"), + url("pronamic-pay-icons.svg?90e24a9302e93ce8bcdcfcae23956ece#pronamic-pay-icons") format("svg"); + font-weight:normal; + font-style:normal; +} + +.pronamic-pay-icon { + + font-family:"Pronamic Pay Icons"; + + display:inline-block; + line-height:1; + font-weight:normal; + font-style:normal; + speak:none; + text-decoration:inherit; + text-transform:none; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale; +} + + +/* Icons */ + + +.pronamic-pay-icon-ideal:before { + content:"\f101"; +} + + +.pronamic-pay-icon-pay:before { + content:"\f102"; +} + + +.pronamic-pay-icon-pronamic:before { + content:"\f103"; +} + + +.pronamic-pay-icon-question-mark:before { + content:"\f104"; +} + + +.pronamic-pay-icon-recurring:before { + content:"\f105"; +} + + +.pronamic-pay-icon-status-cancelled:before { + content:"\f106"; +} + + +.pronamic-pay-icon-status-completed:before { + content:"\f107"; +} + + +.pronamic-pay-icon-status-failed:before { + content:"\f108"; +} + + +.pronamic-pay-icon-status-on-hold:before { + content:"\f109"; +} + + +.pronamic-pay-icon-status-pending:before { + content:"\f10a"; +} + + +.pronamic-pay-icon-status-processing:before { + content:"\f10b"; +} + + +.pronamic-pay-icon-status-refunded:before { + content:"\f10c"; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.eot b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.eot new file mode 100644 index 00000000..51b2e0df Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.eot differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.html b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.html new file mode 100644 index 00000000..23420b36 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.html @@ -0,0 +1,205 @@ + + + + + Pronamic Pay Icons + + + +

    Pronamic Pay Icons

    + +
    + +
    pronamic-pay-icon-ideal
    + +
    pronamic-pay-icon-pay
    + +
    pronamic-pay-icon-pronamic
    + +
    pronamic-pay-icon-question-mark
    + +
    pronamic-pay-icon-recurring
    + +
    pronamic-pay-icon-status-cancelled
    + +
    pronamic-pay-icon-status-completed
    + +
    pronamic-pay-icon-status-failed
    + +
    pronamic-pay-icon-status-on-hold
    + +
    pronamic-pay-icon-status-pending
    + +
    pronamic-pay-icon-status-processing
    + +
    pronamic-pay-icon-status-refunded
    + +
    + + + +

    Usage

    +
    <i class="pronamic-pay-icon pronamic-pay-icon-name"></i>
    + + + + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.svg new file mode 100644 index 00000000..f45e1c6e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.svg @@ -0,0 +1,69 @@ + + + + +Created by FontForge 20190801 at Mon Nov 4 16:58:48 2019 + By Reüel + + + + + + + + + + + + + + + + + + + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.ttf b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.ttf new file mode 100644 index 00000000..96fe9557 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.ttf differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.woff b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.woff new file mode 100644 index 00000000..f822988c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.woff differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.woff2 b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.woff2 new file mode 100644 index 00000000..16fa340c Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/fonts/dist/pronamic-pay-icons.woff2 differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-512.pngquant-min.png b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-512.pngquant-min.png new file mode 100644 index 00000000..e5b939ba Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-512.pngquant-min.png differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-white-512.pngquant-min.png b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-white-512.pngquant-min.png new file mode 100644 index 00000000..3f2cc7d2 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-white-512.pngquant-min.png differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-white.svgo-min.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-white.svgo-min.svg new file mode 100644 index 00000000..36040761 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-white.svgo-min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-wp-admin-fresh-base.svgo-min.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-wp-admin-fresh-base.svgo-min.svg new file mode 100644 index 00000000..60bf1720 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay-wp-admin-fresh-base.svgo-min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.icns b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.icns new file mode 100644 index 00000000..c7693768 Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.icns differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.ico b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.ico new file mode 100644 index 00000000..85a0fcce Binary files /dev/null and b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.ico differ diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.svgo-min.svg b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.svgo-min.svg new file mode 100644 index 00000000..6d55b186 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/images/dist/wp-pay.svgo-min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/functions.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/functions.php new file mode 100644 index 00000000..0caf3827 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/functions.php @@ -0,0 +1,374 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; + +/** + * Pronamic Pay plugin. + * + * @return \Pronamic\WordPress\Pay\Plugin + */ +function pronamic_pay_plugin() { + return \Pronamic\WordPress\Pay\Plugin::instance(); +} + +/** + * Get payment by specified post ID. + * + * @param bool|int|string|null $post_id A payment post ID. + * @return Payment|null + */ +function get_pronamic_payment( $post_id ) { + return pronamic_pay_plugin()->payments_data_store->get_payment( $post_id ); +} + +/** + * Get payment by specified meta key and value. + * + * @link https://developer.wordpress.org/reference/classes/wp_query/ + * @link https://developer.wordpress.org/reference/functions/wp_reset_postdata/ + * + * @param string $meta_key The meta key to query for. + * @param string|int $meta_value The meta value to query for. + * @param array $args Query arguments. + * @return Payment|null + */ +function get_pronamic_payment_by_meta( $meta_key, $meta_value, $args = array() ) { + $args['posts_per_page'] = 1; + + $payments = get_pronamic_payments_by_meta( $meta_key, $meta_value, $args ); + + // No payments found. + if ( empty( $payments ) ) { + return null; + } + + // Get first (and only) payment. + $payment = array_shift( $payments ); + + return $payment; +} + +/** + * Get payments by specified meta key and value. + * + * @link https://developer.wordpress.org/reference/classes/wp_query/ + * @link https://developer.wordpress.org/reference/functions/wp_reset_postdata/ + * + * @param string $meta_key The meta key to query for. + * @param string|int $meta_value The meta value to query for. + * @param array $args Query arguments. + * @return Payment[] + */ +function get_pronamic_payments_by_meta( $meta_key, $meta_value, $args = array() ) { + $payments = array(); + + $defaults = array( + 'post_type' => 'pronamic_payment', + 'post_status' => 'any', + 'posts_per_page' => -1, + 'no_found_rows' => true, + 'meta_query' => array(), + ); + + $args = wp_parse_args( $args, $defaults ); + + // Add meta query for given meta key and value. + if ( ! empty( $meta_key ) ) { + if ( ! is_array( $args['meta_query'] ) ) { + $args['meta_query'] = array(); + } + + $args['meta_query'][] = array( + 'key' => $meta_key, + 'value' => $meta_value, + ); + } + + $query = new WP_Query( $args ); + + foreach ( $query->posts as $p ) { + $payment = get_pronamic_payment( $p->ID ); + + if ( null !== $payment ) { + $payments[] = $payment; + } + } + + return $payments; +} + +/** + * Get payment by the specified purchase ID. + * + * @param string $purchase_id The purchase ID to query for. + * @return Payment|null + */ +function get_pronamic_payment_by_purchase_id( $purchase_id ) { + return get_pronamic_payment_by_meta( '_pronamic_payment_purchase_id', $purchase_id ); +} + +/** + * Get payment by the specified transaction ID. + * + * @param string $transaction_id The transaction ID to query for. + * + * @return Payment|null + */ +function get_pronamic_payment_by_transaction_id( $transaction_id ) { + return get_pronamic_payment_by_meta( '_pronamic_payment_transaction_id', $transaction_id ); +} + +/** + * Get payments by the specified user ID. + * + * @param string|int $user_id The user ID to query for. + * + * @return Payment[] + */ +function get_pronamic_payments_by_user_id( $user_id = null ) { + if ( null === $user_id ) { + $user_id = \get_current_user_id(); + } + + return get_pronamic_payments_by_meta( null, null, array( 'author' => $user_id ) ); +} + +/** + * Get subscription by the specified post ID. + * + * @param int $post_id A subscription post ID. + * @return Subscription|null + */ +function get_pronamic_subscription( $post_id ) { + return pronamic_pay_plugin()->subscriptions_data_store->get_subscription( $post_id ); +} + +/** + * Get subscription by the specified meta key and value. + * + * @param string $meta_key The meta key to query for. + * @param string $meta_value The meta value to query for. + * @param array $args Query arguments. + * @return Subscription|null + */ +function get_pronamic_subscription_by_meta( $meta_key, $meta_value, $args = array() ) { + $args['posts_per_page'] = 1; + + $subscriptions = get_pronamic_subscriptions_by_meta( $meta_key, $meta_value, $args ); + + // No subscriptions found. + if ( empty( $subscriptions ) ) { + return null; + } + + // Get first (and only) subscription. + $subscription = array_shift( $subscriptions ); + + return $subscription; +} + +/** + * Get subscriptions by specified meta key and value. + * + * @param string $meta_key The meta key to query for. + * @param string $meta_value The meta value to query for. + * @param array $args Query arguments. + * @return Subscription[] + */ +function get_pronamic_subscriptions_by_meta( $meta_key, $meta_value, $args = array() ) { + $subscriptions = array(); + + $defaults = array( + 'post_type' => 'pronamic_pay_subscr', + 'post_status' => 'any', + 'posts_per_page' => -1, + 'no_found_rows' => true, + 'meta_query' => array(), + ); + + $args = wp_parse_args( $args, $defaults ); + + // Add meta query for given meta key and value. + if ( ! is_array( $args['meta_query'] ) ) { + $args['meta_query'] = array(); + } + + $args['meta_query'][] = array( + 'key' => $meta_key, + 'value' => $meta_value, + ); + + $query = new WP_Query( $args ); + + foreach ( $query->posts as $p ) { + $subscription = get_pronamic_subscription( $p->ID ); + + if ( null !== $subscription ) { + $subscriptions[] = $subscription; + } + } + + return $subscriptions; +} + +/** + * Get subscriptions by the specified user ID. + * + * @param string|int $user_id The user ID to query for. + * + * @return Subscription[] + */ +function get_pronamic_subscriptions_by_user_id( $user_id = null ) { + if ( null === $user_id ) { + $user_id = \get_current_user_id(); + } + + return get_pronamic_subscriptions_by_meta( null, null, array( 'author' => $user_id ) ); +} + +/** + * Get subscription by the specified source and value. + * + * @param string $source The source to query for. + * @param string|null $source_id The source ID to query for. + * @return Subscription[]|null + */ +function get_pronamic_subscriptions_by_source( $source, $source_id = null ) { + // Meta query. + $meta_query = array( + array( + 'key' => '_pronamic_subscription_source', + 'value' => $source, + ), + ); + + // Add source ID meta query condition. + if ( ! empty( $source_id ) ) { + $meta_query[] = array( + 'key' => '_pronamic_subscription_source_id', + 'value' => $source_id, + ); + } + + // Return. + $args = array( + 'meta_query' => $meta_query, + 'order' => 'DESC', + 'orderby' => 'ID', + ); + + return get_pronamic_subscriptions_by_meta( null, null, $args ); +} + +/** + * Bind the global providers and gateways together. + */ +function bind_providers_and_gateways() { + global $pronamic_pay_providers; + + $integrations = pronamic_pay_plugin()->gateway_integrations; + + foreach ( $integrations as $integration ) { + $provider = $integration->provider; + + if ( ! isset( $pronamic_pay_providers[ $provider ] ) ) { + $pronamic_pay_providers[ $provider ] = array( + 'integrations' => array(), + ); + } + + $pronamic_pay_providers[ $provider ]['integrations'][] = $integration; + } + + // Sort by provider. + ksort( $pronamic_pay_providers ); +} + +/** + * Let to num function. + * + * This function transforms the php.ini notation for numbers (like '2M') to an integer. + * + * @link https://github.com/woothemes/woocommerce/blob/v2.0.20/woocommerce-core-functions.php#L1779 + * @access public + * @param string $size A php.ini notation for nubmer to convert to an integer. + * @return int + */ +function pronamic_pay_let_to_num( $size ) { + $l = substr( $size, -1 ); + $ret = substr( $size, 0, -1 ); + + switch ( strtoupper( $l ) ) { + case 'P': + $ret *= 1024; + // no break. + case 'T': + $ret *= 1024; + // no break. + case 'G': + $ret *= 1024; + // no break. + case 'M': + $ret *= 1024; + // no break. + case 'K': + $ret *= 1024; + // no break. + } + + return intval( $ret ); +} + +/** + * Pronamic Pay get page ID. + * + * @link https://github.com/woothemes/woocommerce/blob/v2.0.16/woocommerce-core-functions.php#L344 + * + * @param string $page Pronamic Pay page identifier slug. + * @return int + */ +function pronamic_pay_get_page_id( $page ) { + $option_name = sprintf( 'pronamic_pay_%s_page_id', $page ); + + $option = get_option( $option_name, -1 ); + + if ( false === $option ) { + return -1; + } + + return $option; +} + +/** + * Helper function to update post meta data. + * + * @link http://codex.wordpress.org/Function_Reference/update_post_meta + * @param int $post_id The post ID to update the specified meta data for. + * @param array $data The data array with meta keys/values. + */ +function pronamic_pay_update_post_meta_data( $post_id, array $data ) { + /* + * Post meta values are passed through the stripslashes() function + * upon being stored, so you will need to be careful when passing + * in values such as JSON that might include \ escaped characters. + */ + $data = (array) wp_slash( $data ); + + // Meta. + foreach ( $data as $key => $value ) { + if ( isset( $value ) && '' !== $value ) { + update_post_meta( $post_id, $key, $value ); + } else { + delete_post_meta( $post_id, $key ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.php new file mode 100644 index 00000000..e5c4a8e4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.php @@ -0,0 +1,1803 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Robert Richards nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @author Robert Richards + * @copyright 2007-2011 Robert Richards + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version 1.3.0 + */ +/* + Functions to generate simple cases of Exclusive Canonical XML - Callable function is C14NGeneral() + i.e.: $canonical = C14NGeneral($domelement, TRUE); + */ + +/* helper function */ +function sortAndAddAttrs($element, $arAtts) { + $newAtts = array(); + foreach ($arAtts AS $attnode) { + $newAtts[$attnode->nodeName] = $attnode; + } + ksort($newAtts); + foreach ($newAtts as $attnode) { + $element->setAttribute($attnode->nodeName, $attnode->nodeValue); + } +} + +/* helper function */ + +function canonical($tree, $element, $withcomments) { + if ($tree->nodeType != XML_DOCUMENT_NODE) { + $dom = $tree->ownerDocument; + } else { + $dom = $tree; + } + if ($element->nodeType != XML_ELEMENT_NODE) { + if ($element->nodeType == XML_DOCUMENT_NODE) { + foreach ($element->childNodes AS $node) { + canonical($dom, $node, $withcomments); + } + return; + } + if ($element->nodeType == XML_COMMENT_NODE && !$withcomments) { + return; + } + $tree->appendChild($dom->importNode($element, TRUE)); + return; + } + $arNS = array(); + if ($element->namespaceURI != "") { + if ($element->prefix == "") { + $elCopy = $dom->createElementNS($element->namespaceURI, $element->nodeName); + } else { + $prefix = $tree->lookupPrefix($element->namespaceURI); + if ($prefix == $element->prefix) { + $elCopy = $dom->createElementNS($element->namespaceURI, $element->nodeName); + } else { + $elCopy = $dom->createElement($element->nodeName); + $arNS[$element->namespaceURI] = $element->prefix; + } + } + } else { + $elCopy = $dom->createElement($element->nodeName); + } + $tree->appendChild($elCopy); + + /* Create DOMXPath based on original document */ + $xPath = new DOMXPath($element->ownerDocument); + + /* Get namespaced attributes */ + $arAtts = $xPath->query('attribute::*[namespace-uri(.) != ""]', $element); + + /* Create an array with namespace URIs as keys, and sort them */ + foreach ($arAtts AS $attnode) { + if (array_key_exists($attnode->namespaceURI, $arNS) && + ($arNS[$attnode->namespaceURI] == $attnode->prefix)) { + continue; + } + $prefix = $tree->lookupPrefix($attnode->namespaceURI); + if ($prefix != $attnode->prefix) { + $arNS[$attnode->namespaceURI] = $attnode->prefix; + } else { + $arNS[$attnode->namespaceURI] = NULL; + } + } + if (count($arNS) > 0) { + asort($arNS); + } + + /* Add namespace nodes */ + foreach ($arNS AS $namespaceURI => $prefix) { + if ($prefix != NULL) { + $elCopy->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" . $prefix, $namespaceURI); + } + } + if (count($arNS) > 0) { + ksort($arNS); + } + + /* Get attributes not in a namespace, and then sort and add them */ + $arAtts = $xPath->query('attribute::*[namespace-uri(.) = ""]', $element); + sortAndAddAttrs($elCopy, $arAtts); + + /* Loop through the URIs, and then sort and add attributes within that namespace */ + foreach ($arNS as $nsURI => $prefix) { + $arAtts = $xPath->query('attribute::*[namespace-uri(.) = "' . $nsURI . '"]', $element); + sortAndAddAttrs($elCopy, $arAtts); + } + + foreach ($element->childNodes AS $node) { + canonical($elCopy, $node, $withcomments); + } +} + +/* + $element - DOMElement for which to produce the canonical version of + $exclusive - boolean to indicate exclusive canonicalization (must pass TRUE) + $withcomments - boolean indicating wether or not to include comments in canonicalized form + */ + +function C14NGeneral($element, $exclusive=FALSE, $withcomments=FALSE) { + /* IF PHP 5.2+ then use built in canonical functionality */ + $php_version = explode('.', PHP_VERSION); + if (($php_version[0] > 5) || ($php_version[0] == 5 && $php_version[1] >= 2)) { + return $element->C14N($exclusive, $withcomments); + } + + /* Must be element or document */ + if (!$element instanceof DOMElement && !$element instanceof DOMDocument) { + return NULL; + } + /* Currently only exclusive XML is supported */ + if ($exclusive == FALSE) { + throw new Exception("Only exclusive canonicalization is supported in this version of PHP"); + } + + $copyDoc = new DOMDocument(); + canonical($copyDoc, $element, $withcomments); + return $copyDoc->saveXML($copyDoc->documentElement, LIBXML_NOEMPTYTAG); +} + +class XMLSecurityKey { + const TRIPLEDES_CBC = 'http://www.w3.org/2001/04/xmlenc#tripledes-cbc'; + const AES128_CBC = 'http://www.w3.org/2001/04/xmlenc#aes128-cbc'; + const AES192_CBC = 'http://www.w3.org/2001/04/xmlenc#aes192-cbc'; + const AES256_CBC = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc'; + const RSA_1_5 = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5'; + const RSA_OAEP_MGF1P = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'; + const DSA_SHA1 = 'http://www.w3.org/2000/09/xmldsig#dsa-sha1'; + const RSA_SHA1 = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; + const RSA_SHA256 = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; + + private $cryptParams = array(); + public $type = 0; + public $key = NULL; + public $passphrase = ""; + public $iv = NULL; + public $name = NULL; + public $keyChain = NULL; + public $isEncrypted = FALSE; + public $encryptedCtx = NULL; + public $guid = NULL; + + /** + * This variable contains the certificate as a string if this key represents an X509-certificate. + * If this key doesn't represent a certificate, this will be NULL. + */ + private $x509Certificate = NULL; + + /* This variable contains the certificate thunbprint if we have loaded an X509-certificate. */ + private $X509Thumbprint = NULL; + + public function __construct($type, $params=NULL) { + srand(); + switch ($type) { + case (XMLSecurityKey::TRIPLEDES_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_TRIPLEDES; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#tripledes-cbc'; + $this->cryptParams['keysize'] = 24; + break; + case (XMLSecurityKey::AES128_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_RIJNDAEL_128; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#aes128-cbc'; + $this->cryptParams['keysize'] = 16; + break; + case (XMLSecurityKey::AES192_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_RIJNDAEL_128; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#aes192-cbc'; + $this->cryptParams['keysize'] = 24; + break; + case (XMLSecurityKey::AES256_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_RIJNDAEL_128; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc'; + $this->cryptParams['keysize'] = 32; + break; + case (XMLSecurityKey::RSA_1_5): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5'; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + return; + case (XMLSecurityKey::RSA_OAEP_MGF1P): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_OAEP_PADDING; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'; + $this->cryptParams['hash'] = NULL; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + return; + case (XMLSecurityKey::RSA_SHA1): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['method'] = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + break; + case (XMLSecurityKey::RSA_SHA256): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING; + $this->cryptParams['digest'] = 'SHA256'; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + break; + default: + throw new Exception('Invalid Key Type'); + return; + } + $this->type = $type; + } + + /** + * Retrieve the key size for the symmetric encryption algorithm.. + * + * If the key size is unknown, or this isn't a symmetric encryption algorithm, + * NULL is returned. + * + * @return int|NULL The number of bytes in the key. + */ + public function getSymmetricKeySize() { + if (!isset($this->cryptParams['keysize'])) { + return NULL; + } + return $this->cryptParams['keysize']; + } + + public function generateSessionKey() { + if (!isset($this->cryptParams['keysize'])) { + throw new Exception('Unknown key size for type "' . $this->type . '".'); + } + $keysize = $this->cryptParams['keysize']; + + if (function_exists('openssl_random_pseudo_bytes')) { + /* We have PHP >= 5.3 - use openssl to generate session key. */ + $key = openssl_random_pseudo_bytes($keysize); + } else { + /* Generating random key using iv generation routines */ + $key = mcrypt_create_iv($keysize, MCRYPT_RAND); + } + + if ($this->type === XMLSecurityKey::TRIPLEDES_CBC) { + /* Make sure that the generated key has the proper parity bits set. + * Mcrypt doesn't care about the parity bits, but others may care. + */ + for ($i = 0; $i < strlen($key); $i++) { + $byte = ord($key[$i]) & 0xfe; + $parity = 1; + for ($j = 1; $j < 8; $j++) { + $parity ^= ($byte >> $j) & 1; + } + $byte |= $parity; + $key[$i] = chr($byte); + } + } + + $this->key = $key; + return $key; + } + + public static function getRawThumbprint($cert) { + + $arCert = explode("\n", $cert); + $data = ''; + $inData = FALSE; + + foreach ($arCert AS $curData) { + if (!$inData) { + if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) { + $inData = TRUE; + } + } else { + if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) { + $inData = FALSE; + break; + } + $data .= trim($curData); + } + } + + if (!empty($data)) { + return strtolower(sha1(base64_decode($data))); + } + + return NULL; + } + + public function loadKey($key, $isFile=FALSE, $isCert = FALSE) { + if ($isFile) { + $this->key = file_get_contents($key); + } else { + $this->key = $key; + } + if ($isCert) { + $this->key = openssl_x509_read($this->key); + openssl_x509_export($this->key, $str_cert); + $this->x509Certificate = $str_cert; + $this->key = $str_cert; + } else { + $this->x509Certificate = NULL; + } + if ($this->cryptParams['library'] == 'openssl') { + if ($this->cryptParams['type'] == 'public') { + if ($isCert) { + /* Load the thumbprint if this is an X509 certificate. */ + $this->X509Thumbprint = self::getRawThumbprint($this->key); + } + $this->key = openssl_get_publickey($this->key); + } else { + $this->key = openssl_get_privatekey($this->key, $this->passphrase); + } + } else if ($this->cryptParams['cipher'] == MCRYPT_RIJNDAEL_128) { + /* Check key length */ + switch ($this->type) { + case (XMLSecurityKey::AES256_CBC): + if (strlen($this->key) < 25) { + throw new Exception('Key must contain at least 25 characters for this cipher'); + } + break; + case (XMLSecurityKey::AES192_CBC): + if (strlen($this->key) < 17) { + throw new Exception('Key must contain at least 17 characters for this cipher'); + } + break; + } + } + } + + private function encryptMcrypt($data) { + $td = mcrypt_module_open($this->cryptParams['cipher'], '', $this->cryptParams['mode'], ''); + $this->iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); + mcrypt_generic_init($td, $this->key, $this->iv); + if ($this->cryptParams['mode'] == MCRYPT_MODE_CBC) { + $bs = mcrypt_enc_get_block_size($td); + for ($datalen0 = $datalen = strlen($data); (($datalen % $bs) != ($bs - 1)); $datalen++) + $data.=chr(rand(1, 127)); + $data.=chr($datalen - $datalen0 + 1); + } + $encrypted_data = $this->iv . mcrypt_generic($td, $data); + mcrypt_generic_deinit($td); + mcrypt_module_close($td); + return $encrypted_data; + } + + private function decryptMcrypt($data) { + $td = mcrypt_module_open($this->cryptParams['cipher'], '', $this->cryptParams['mode'], ''); + $iv_length = mcrypt_enc_get_iv_size($td); + + $this->iv = substr($data, 0, $iv_length); + $data = substr($data, $iv_length); + + mcrypt_generic_init($td, $this->key, $this->iv); + $decrypted_data = mdecrypt_generic($td, $data); + mcrypt_generic_deinit($td); + mcrypt_module_close($td); + if ($this->cryptParams['mode'] == MCRYPT_MODE_CBC) { + $dataLen = strlen($decrypted_data); + $paddingLength = substr($decrypted_data, $dataLen - 1, 1); + $decrypted_data = substr($decrypted_data, 0, $dataLen - ord($paddingLength)); + } + return $decrypted_data; + } + + private function encryptOpenSSL($data) { + if ($this->cryptParams['type'] == 'public') { + if (!openssl_public_encrypt($data, $encrypted_data, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure encrypting Data'); + return; + } + } else { + if (!openssl_private_encrypt($data, $encrypted_data, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure encrypting Data'); + return; + } + } + return $encrypted_data; + } + + private function decryptOpenSSL($data) { + if ($this->cryptParams['type'] == 'public') { + if (!openssl_public_decrypt($data, $decrypted, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure decrypting Data'); + return; + } + } else { + if (!openssl_private_decrypt($data, $decrypted, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure decrypting Data'); + return; + } + } + return $decrypted; + } + + function custom_openssl_sign($data, &$signature, $priv_key_id, $signature_alg = 'sha256WithRSAEncryption') { + $pinfo = openssl_pkey_get_details($priv_key_id); + $hash = hash('sha256', $data); + $t = '3031300d060960864801650304020105000420'; # sha256 + $t .= $hash; + $pslen = $pinfo['bits']/8 - (strlen($t)/2 + 3); + + $eb = '0001' . str_repeat('FF', $pslen) . '00' . $t; + $eb = pack('H*', $eb); + + return openssl_private_encrypt($eb, $signature, $priv_key_id, OPENSSL_NO_PADDING); + } + + function custom_openssl_verify ($data, &$signature, $priv_key_id, $signature_alg = 'sha256WithRSAEncryption') { + $pinfo = openssl_pkey_get_details($priv_key_id); + $hash = hash('sha256', $data); + $t = '3031300d060960864801650304020105000420'; # sha256 + $t .= $hash; + $pslen = $pinfo['bits']/8 - (strlen($t)/2 + 3); + + $eb = '0001' . str_repeat('FF', $pslen) . '00' . $t; + $eb = pack('H*', $eb); + + return openssl_public_decrypt($eb, $signature, $priv_key_id, OPENSSL_NO_PADDING); + } + + private function signOpenSSL($data) { + $algo = OPENSSL_ALGO_SHA1; + if (!empty($this->cryptParams['digest'])) { + $algo = $this->cryptParams['digest']; + } + $signature = ''; + + if (!$this->custom_openssl_sign($data, $signature, $this->key)) { + throw new Exception('Failure Signing Data: ' . openssl_error_string() . ' - ' . $algo); + return; + } + return $signature; + } + + private function verifyOpenSSL($data, $signature) { + $algo = OPENSSL_ALGO_SHA1; + if (!empty($this->cryptParams['digest'])) { + $algo = $this->cryptParams['digest']; + } + return $this->custom_openssl_verify($data, $signature, $this->key); + } + + public function encryptData($data) { + switch ($this->cryptParams['library']) { + case 'mcrypt': + return $this->encryptMcrypt($data); + break; + case 'openssl': + return $this->encryptOpenSSL($data); + break; + } + } + + public function decryptData($data) { + switch ($this->cryptParams['library']) { + case 'mcrypt': + return $this->decryptMcrypt($data); + break; + case 'openssl': + return $this->decryptOpenSSL($data); + break; + } + } + + public function signData($data) { + switch ($this->cryptParams['library']) { + case 'openssl': + return $this->signOpenSSL($data); + break; + } + } + + public function verifySignature($data, $signature) { + switch ($this->cryptParams['library']) { + case 'openssl': + return $this->verifyOpenSSL($data, $signature); + break; + } + } + + public function getAlgorith() { + return $this->cryptParams['method']; + } + + static function makeAsnSegment($type, $string) { + switch ($type) { + case 0x02: + if (ord($string) > 0x7f) + $string = chr(0) . $string; + break; + case 0x03: + $string = chr(0) . $string; + break; + } + + $length = strlen($string); + + if ($length < 128) { + $output = sprintf("%c%c%s", $type, $length, $string); + } else if ($length < 0x0100) { + $output = sprintf("%c%c%c%s", $type, 0x81, $length, $string); + } else if ($length < 0x010000) { + $output = sprintf("%c%c%c%c%s", $type, 0x82, $length / 0x0100, $length % 0x0100, $string); + } else { + $output = NULL; + } + return($output); + } + + /* Modulus and Exponent must already be base64 decoded */ + + static function convertRSA($modulus, $exponent) { + /* make an ASN publicKeyInfo */ + $exponentEncoding = XMLSecurityKey::makeAsnSegment(0x02, $exponent); + $modulusEncoding = XMLSecurityKey::makeAsnSegment(0x02, $modulus); + $sequenceEncoding = XMLSecurityKey:: makeAsnSegment(0x30, $modulusEncoding . $exponentEncoding); + $bitstringEncoding = XMLSecurityKey::makeAsnSegment(0x03, $sequenceEncoding); + $rsaAlgorithmIdentifier = pack("H*", "300D06092A864886F70D0101010500"); + $publicKeyInfo = XMLSecurityKey::makeAsnSegment(0x30, $rsaAlgorithmIdentifier . $bitstringEncoding); + + /* encode the publicKeyInfo in base64 and add PEM brackets */ + $publicKeyInfoBase64 = base64_encode($publicKeyInfo); + $encoding = "-----BEGIN PUBLIC KEY-----\n"; + $offset = 0; + while ($segment = substr($publicKeyInfoBase64, $offset, 64)) { + $encoding = $encoding . $segment . "\n"; + $offset += 64; + } + return $encoding . "-----END PUBLIC KEY-----\n"; + } + + public function serializeKey($parent) { + + } + + /** + * Retrieve the X509 certificate this key represents. + * + * Will return the X509 certificate in PEM-format if this key represents + * an X509 certificate. + * + * @return The X509 certificate or NULL if this key doesn't represent an X509-certificate. + */ + public function getX509Certificate() { + return $this->x509Certificate; + } + + /* Get the thumbprint of this X509 certificate. + * + * Returns: + * The thumbprint as a lowercase 40-character hexadecimal number, or NULL + * if this isn't a X509 certificate. + */ + + public function getX509Thumbprint() { + return $this->X509Thumbprint; + } + + /** + * Create key from an EncryptedKey-element. + * + * @param DOMElement $element The EncryptedKey-element. + * @return XMLSecurityKey The new key. + */ + public static function fromEncryptedKeyElement(DOMElement $element) { + + $objenc = new XMLSecEnc(); + $objenc->setNode($element); + if (!$objKey = $objenc->locateKey()) { + throw new Exception("Unable to locate algorithm for this Encrypted Key"); + } + $objKey->isEncrypted = TRUE; + $objKey->encryptedCtx = $objenc; + XMLSecEnc::staticLocateKeyInfo($objKey, $element); + return $objKey; + } + +} + +class XMLSecurityDSig { + const XMLDSIGNS = 'http://www.w3.org/2000/09/xmldsig#'; + const SHA1 = 'http://www.w3.org/2000/09/xmldsig#sha1'; + const SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256'; + const SHA512 = 'http://www.w3.org/2001/04/xmlenc#sha512'; + const RIPEMD160 = 'http://www.w3.org/2001/04/xmlenc#ripemd160'; + + const C14N = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; + const C14N_COMMENTS = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments'; + const EXC_C14N = 'http://www.w3.org/2001/10/xml-exc-c14n#'; + const EXC_C14N_COMMENTS = 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments'; + + const template = ' + + + +'; + + public $sigNode = NULL; + public $idKeys = array(); + public $idNS = array(); + private $signedInfo = NULL; + private $xPathCtx = NULL; + private $canonicalMethod = NULL; + private $prefix = NULL; + private $searchpfx = 'secdsig'; + + /* This variable contains an associative array of validated nodes. */ + private $validatedNodes = NULL; + + public function __construct() { + $sigdoc = new DOMDocument(); + $sigdoc->loadXML(XMLSecurityDSig::template); + $this->sigNode = $sigdoc->documentElement; + } + + private function resetXPathObj() { + $this->xPathCtx = NULL; + } + + private function getXPathObj() { + if (empty($this->xPathCtx) && !empty($this->sigNode)) { + $xpath = new DOMXPath($this->sigNode->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $this->xPathCtx = $xpath; + } + return $this->xPathCtx; + } + + static function generate_GUID($prefix='pfx') { + $uuid = md5(uniqid(rand(), true)); + $guid = $prefix . substr($uuid, 0, 8) . "-" . + substr($uuid, 8, 4) . "-" . + substr($uuid, 12, 4) . "-" . + substr($uuid, 16, 4) . "-" . + substr($uuid, 20, 12); + return $guid; + } + + public function locateSignature($objDoc) { + if ($objDoc instanceof DOMDocument) { + $doc = $objDoc; + } else { + $doc = $objDoc->ownerDocument; + } + if ($doc) { + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = ".//secdsig:Signature"; + $nodeset = $xpath->query($query, $objDoc); + $this->sigNode = $nodeset->item(0); + return $this->sigNode; + } + return NULL; + } + + public function createNewSignNode($name, $value=NULL) { + $doc = $this->sigNode->ownerDocument; + if ($this->prefix != null) { + $name = $this->prefix . ':' . $name; + } + if (!is_null($value)) { + $node = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS, $name, $value); + } else { + $node = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS, $name); + } + return $node; + } + + public function setCanonicalMethod($method) { + switch ($method) { + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315': + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments': + case 'http://www.w3.org/2001/10/xml-exc-c14n#': + case 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments': + $this->canonicalMethod = $method; + break; + default: + throw new Exception('Invalid Canonical Method'); + } + if ($xpath = $this->getXPathObj()) { + $query = './' . $this->searchpfx . ':SignedInfo'; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sinfo = $nodeset->item(0)) { + $query = './' . $this->searchpfx . 'CanonicalizationMethod'; + $nodeset = $xpath->query($query, $sinfo); + if (!($canonNode = $nodeset->item(0))) { + $canonNode = $this->createNewSignNode('CanonicalizationMethod'); + $sinfo->insertBefore($canonNode, $sinfo->firstChild); + } + $canonNode->setAttribute('Algorithm', $this->canonicalMethod); + } + } + } + + private function canonicalizeData($node, $canonicalmethod, $arXPath=NULL, $prefixList=NULL) { + $exclusive = FALSE; + $withComments = FALSE; + switch ($canonicalmethod) { + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315': + $exclusive = FALSE; + $withComments = FALSE; + break; + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments': + $withComments = TRUE; + break; + case 'http://www.w3.org/2001/10/xml-exc-c14n#': + $exclusive = TRUE; + break; + case 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments': + $exclusive = TRUE; + $withComments = TRUE; + break; + } + /* Support PHP versions < 5.2 not containing C14N methods in DOM extension */ + $php_version = explode('.', PHP_VERSION); + if (($php_version[0] < 5) || ($php_version[0] == 5 && $php_version[1] < 2)) { + if (!is_null($arXPath)) { + throw new Exception("PHP 5.2.0 or higher is required to perform XPath Transformations"); + } + return C14NGeneral($node, $exclusive, $withComments); + } + return $node->C14N($exclusive, $withComments, $arXPath, $prefixList); + } + + public function canonicalizeSignedInfo() { + + $doc = $this->sigNode->ownerDocument; + $canonicalmethod = NULL; + if ($doc) { + $xpath = $this->getXPathObj(); + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($signInfoNode = $nodeset->item(0)) { + $query = "./secdsig:CanonicalizationMethod"; + $nodeset = $xpath->query($query, $signInfoNode); + if ($canonNode = $nodeset->item(0)) { + $canonicalmethod = $canonNode->getAttribute('Algorithm'); + } + $this->signedInfo = $this->canonicalizeData($signInfoNode, $canonicalmethod); + return $this->signedInfo; + } + } + return NULL; + } + + public function calculateDigest($digestAlgorithm, $data) { + switch ($digestAlgorithm) { + case XMLSecurityDSig::SHA1: + $alg = 'sha1'; + break; + case XMLSecurityDSig::SHA256: + $alg = 'sha256'; + break; + case XMLSecurityDSig::SHA512: + $alg = 'sha512'; + break; + case XMLSecurityDSig::RIPEMD160: + $alg = 'ripemd160'; + break; + default: + throw new Exception("Cannot validate digest: Unsupported Algorith <$digestAlgorithm>"); + } + if (function_exists('hash')) { + return base64_encode(hash($alg, $data, TRUE)); + } elseif (function_exists('mhash')) { + $alg = "MHASH_" . strtoupper($alg); + return base64_encode(mhash(constant($alg), $data)); + } elseif ($alg === 'sha1') { + return base64_encode(sha1($data, TRUE)); + } else { + throw new Exception('xmlseclibs is unable to calculate a digest. Maybe you need the mhash library?'); + } + } + + public function validateDigest($refNode, $data) { + $xpath = new DOMXPath($refNode->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = 'string(./secdsig:DigestMethod/@Algorithm)'; + $digestAlgorithm = $xpath->evaluate($query, $refNode); + $digValue = $this->calculateDigest($digestAlgorithm, $data); + $query = 'string(./secdsig:DigestValue)'; + $digestValue = $xpath->evaluate($query, $refNode); + return ($digValue == $digestValue); + } + + public function processTransforms($refNode, $objData, $includeCommentNodes = TRUE) { + $data = $objData; + $xpath = new DOMXPath($refNode->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = './secdsig:Transforms/secdsig:Transform'; + $nodelist = $xpath->query($query, $refNode); + $canonicalMethod = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; + $arXPath = NULL; + $prefixList = NULL; + foreach ($nodelist AS $transform) { + $algorithm = $transform->getAttribute("Algorithm"); + switch ($algorithm) { + case 'http://www.w3.org/2001/10/xml-exc-c14n#': + case 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments': + + if (!$includeCommentNodes) { + /* We remove comment nodes by forcing it to use a canonicalization + * without comments. + */ + $canonicalMethod = 'http://www.w3.org/2001/10/xml-exc-c14n#'; + } else { + $canonicalMethod = $algorithm; + } + + $node = $transform->firstChild; + while ($node) { + if ($node->localName == 'InclusiveNamespaces') { + if ($pfx = $node->getAttribute('PrefixList')) { + $arpfx = array(); + $pfxlist = explode(" ", $pfx); + foreach ($pfxlist AS $pfx) { + $val = trim($pfx); + if (!empty($val)) { + $arpfx[] = $val; + } + } + if (count($arpfx) > 0) { + $prefixList = $arpfx; + } + } + break; + } + $node = $node->nextSibling; + } + break; + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315': + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments': + if (!$includeCommentNodes) { + /* We remove comment nodes by forcing it to use a canonicalization + * without comments. + */ + $canonicalMethod = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; + } else { + $canonicalMethod = $algorithm; + } + + break; + case 'http://www.w3.org/TR/1999/REC-xpath-19991116': + $node = $transform->firstChild; + while ($node) { + if ($node->localName == 'XPath') { + $arXPath = array(); + $arXPath['query'] = '(.//. | .//@* | .//namespace::*)[' . $node->nodeValue . ']'; + $arXpath['namespaces'] = array(); + $nslist = $xpath->query('./namespace::*', $node); + foreach ($nslist AS $nsnode) { + if ($nsnode->localName != "xml") { + $arXPath['namespaces'][$nsnode->localName] = $nsnode->nodeValue; + } + } + break; + } + $node = $node->nextSibling; + } + break; + } + } + if ($data instanceof DOMNode) { + $data = $this->canonicalizeData($objData, $canonicalMethod, $arXPath, $prefixList); + } + return $data; + } + + public function processRefNode($refNode) { + $dataObject = NULL; + + /* + * Depending on the URI, we may not want to include comments in the result + * See: http://www.w3.org/TR/xmldsig-core/#sec-ReferenceProcessingModel + */ + $includeCommentNodes = TRUE; + + if ($uri = $refNode->getAttribute("URI")) { + $arUrl = parse_url($uri); + if (empty($arUrl['path'])) { + if ($identifier = $arUrl['fragment']) { + + /* This reference identifies a node with the given id by using + * a URI on the form "#identifier". This should not include comments. + */ + $includeCommentNodes = FALSE; + + $xPath = new DOMXPath($refNode->ownerDocument); + if ($this->idNS && is_array($this->idNS)) { + foreach ($this->idNS AS $nspf => $ns) { + $xPath->registerNamespace($nspf, $ns); + } + } + $iDlist = '@Id="' . $identifier . '"'; + if (is_array($this->idKeys)) { + foreach ($this->idKeys AS $idKey) { + $iDlist .= " or @$idKey='$identifier'"; + } + } + $query = '//*[' . $iDlist . ']'; + $dataObject = $xPath->query($query)->item(0); + } else { + $dataObject = $refNode->ownerDocument; + } + } else { + $dataObject = file_get_contents($arUrl); + } + } else { + /* This reference identifies the root node with an empty URI. This should + * not include comments. + */ + $includeCommentNodes = FALSE; + + $dataObject = $refNode->ownerDocument; + } + $data = $this->processTransforms($refNode, $dataObject, $includeCommentNodes); + if (!$this->validateDigest($refNode, $data)) { + return FALSE; + } + + if ($dataObject instanceof DOMNode) { + /* Add this node to the list of validated nodes. */ + if (!empty($identifier)) { + $this->validatedNodes[$identifier] = $dataObject; + } else { + $this->validatedNodes[] = $dataObject; + } + } + + return TRUE; + } + + public function getRefNodeID($refNode) { + if ($uri = $refNode->getAttribute("URI")) { + $arUrl = parse_url($uri); + if (empty($arUrl['path'])) { + if ($identifier = $arUrl['fragment']) { + return $identifier; + } + } + } + return null; + } + + public function getRefIDs() { + $refids = array(); + $doc = $this->sigNode->ownerDocument; + + $xpath = $this->getXPathObj(); + $query = "./secdsig:SignedInfo/secdsig:Reference"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($nodeset->length == 0) { + throw new Exception("Reference nodes not found"); + } + foreach ($nodeset AS $refNode) { + $refids[] = $this->getRefNodeID($refNode); + } + return $refids; + } + + public function validateReference() { + $doc = $this->sigNode->ownerDocument; + if (!$doc->isSameNode($this->sigNode)) { + $this->sigNode->parentNode->removeChild($this->sigNode); + } + $xpath = $this->getXPathObj(); + $query = "./secdsig:SignedInfo/secdsig:Reference"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($nodeset->length == 0) { + throw new Exception("Reference nodes not found"); + } + + /* Initialize/reset the list of validated nodes. */ + $this->validatedNodes = array(); + + foreach ($nodeset AS $refNode) { + if (!$this->processRefNode($refNode)) { + /* Clear the list of validated nodes. */ + $this->validatedNodes = NULL; + throw new Exception("Reference validation failed"); + } + } + return TRUE; + } + + private function addRefInternal($sinfoNode, $node, $algorithm, $arTransforms=NULL, $options=NULL) { + $prefix = NULL; + $prefix_ns = NULL; + $id_name = 'Id'; + $overwrite_id = TRUE; + $force_uri = FALSE; + + if (is_array($options)) { + $prefix = empty($options['prefix']) ? NULL : $options['prefix']; + $prefix_ns = empty($options['prefix_ns']) ? NULL : $options['prefix_ns']; + $id_name = empty($options['id_name']) ? 'Id' : $options['id_name']; + $overwrite_id = !isset($options['overwrite']) ? TRUE : (bool) $options['overwrite']; + $force_uri = !isset($options['force_uri']) ? FALSE : (bool) $options['force_uri']; + } + + $attname = $id_name; + if (!empty($prefix)) { + $attname = $prefix . ':' . $attname; + } + + $refNode = $this->createNewSignNode('Reference'); + $sinfoNode->appendChild($refNode); + + if (!$node instanceof DOMDocument) { + $uri = NULL; + if (!$overwrite_id) { + $uri = $node->getAttributeNS($prefix_ns, $attname); + } + if (empty($uri)) { + $uri = XMLSecurityDSig::generate_GUID(); + $node->setAttributeNS($prefix_ns, $attname, $uri); + } + $refNode->setAttribute("URI", '#' . $uri); + } elseif ($force_uri) { + $refNode->setAttribute("URI", ''); + } + + $transNodes = $this->createNewSignNode('Transforms'); + $refNode->appendChild($transNodes); + + if (is_array($arTransforms)) { + foreach ($arTransforms AS $transform) { + $transNode = $this->createNewSignNode('Transform'); + $transNodes->appendChild($transNode); + if (is_array($transform) && + (!empty($transform['http://www.w3.org/TR/1999/REC-xpath-19991116'])) && + (!empty($transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['query']))) { + $transNode->setAttribute('Algorithm', 'http://www.w3.org/TR/1999/REC-xpath-19991116'); + $XPathNode = $this->createNewSignNode('XPath', $transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['query']); + $transNode->appendChild($XPathNode); + if (!empty($transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['namespaces'])) { + foreach ($transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['namespaces'] AS $prefix => $namespace) { + $XPathNode->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:$prefix", $namespace); + } + } + } else { + $transNode->setAttribute('Algorithm', $transform); + } + } + } elseif (!empty($this->canonicalMethod)) { + $transNode = $this->createNewSignNode('Transform'); + $transNodes->appendChild($transNode); + $transNode->setAttribute('Algorithm', $this->canonicalMethod); + } + + $canonicalData = $this->processTransforms($refNode, $node); + $digValue = $this->calculateDigest($algorithm, $canonicalData); + + $digestMethod = $this->createNewSignNode('DigestMethod'); + $refNode->appendChild($digestMethod); + $digestMethod->setAttribute('Algorithm', $algorithm); + + $digestValue = $this->createNewSignNode('DigestValue', $digValue); + $refNode->appendChild($digestValue); + } + + public function addReference($node, $algorithm, $arTransforms=NULL, $options=NULL) { + if ($xpath = $this->getXPathObj()) { + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sInfo = $nodeset->item(0)) { + $this->addRefInternal($sInfo, $node, $algorithm, $arTransforms, $options); + } + } + } + + public function addReferenceList($arNodes, $algorithm, $arTransforms=NULL, $options=NULL) { + if ($xpath = $this->getXPathObj()) { + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sInfo = $nodeset->item(0)) { + foreach ($arNodes AS $node) { + $this->addRefInternal($sInfo, $node, $algorithm, $arTransforms, $options); + } + } + } + } + + public function addObject($data, $mimetype=NULL, $encoding=NULL) { + $objNode = $this->createNewSignNode('Object'); + $this->sigNode->appendChild($objNode); + if (!empty($mimetype)) { + $objNode->setAtribute('MimeType', $mimetype); + } + if (!empty($encoding)) { + $objNode->setAttribute('Encoding', $encoding); + } + + if ($data instanceof DOMElement) { + $newData = $this->sigNode->ownerDocument->importNode($data, TRUE); + } else { + $newData = $this->sigNode->ownerDocument->createTextNode($data); + } + $objNode->appendChild($newData); + + return $objNode; + } + + public function locateKey($node=NULL) { + if (empty($node)) { + $node = $this->sigNode; + } + if (!$node instanceof DOMNode) { + return NULL; + } + if ($doc = $node->ownerDocument) { + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = "string(./secdsig:SignedInfo/secdsig:SignatureMethod/@Algorithm)"; + $algorithm = $xpath->evaluate($query, $node); + if ($algorithm) { + try { + $objKey = new XMLSecurityKey($algorithm, array('type' => 'public')); + } catch (Exception $e) { + return NULL; + } + return $objKey; + } + } + return NULL; + } + + public function verify($objKey) { + $doc = $this->sigNode->ownerDocument; + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = "string(./secdsig:SignatureValue)"; + $sigValue = $xpath->evaluate($query, $this->sigNode); + if (empty($sigValue)) { + throw new Exception("Unable to locate SignatureValue"); + } + return $objKey->verifySignature($this->signedInfo, base64_decode($sigValue)); + } + + public function signData($objKey, $data) { + return $objKey->signData($data); + } + + public function sign($objKey, $appendToNode = NULL) { + // If we have a parent node append it now so C14N properly works + if ($appendToNode != NULL) { + $this->resetXPathObj(); + $this->appendSignature($appendToNode); + $this->sigNode = $appendToNode->lastChild; + } + if ($xpath = $this->getXPathObj()) { + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sInfo = $nodeset->item(0)) { + $query = "./secdsig:SignatureMethod"; + $nodeset = $xpath->query($query, $sInfo); + $sMethod = $nodeset->item(0); + $sMethod->setAttribute('Algorithm', $objKey->type); + $data = $this->canonicalizeData($sInfo, $this->canonicalMethod); + $sigValue = base64_encode($this->signData($objKey, $data)); + $sigValueNode = $this->createNewSignNode('SignatureValue', $sigValue); + if ($infoSibling = $sInfo->nextSibling) { + $infoSibling->parentNode->insertBefore($sigValueNode, $infoSibling); + } else { + $this->sigNode->appendChild($sigValueNode); + } + } + } + } + + public function appendCert() { + + } + + public function appendKey($objKey, $parent=NULL) { + $objKey->serializeKey($parent); + } + + /** + * This function inserts the signature element. + * + * The signature element will be appended to the element, unless $beforeNode is specified. If $beforeNode + * is specified, the signature element will be inserted as the last element before $beforeNode. + * + * @param $node The node the signature element should be inserted into. + * @param $beforeNode The node the signature element should be located before. + * + * @return DOMNode The signature element node + */ + public function insertSignature($node, $beforeNode = NULL) { + + $document = $node->ownerDocument; + $signatureElement = $document->importNode($this->sigNode, TRUE); + + if ($beforeNode == NULL) { + return $node->insertBefore($signatureElement); + } else { + return $node->insertBefore($signatureElement, $beforeNode); + } + } + + public function appendSignature($parentNode, $insertBefore = FALSE) { + $beforeNode = $insertBefore ? $parentNode->firstChild : NULL; + return $this->insertSignature($parentNode, $beforeNode); + } + + static function get509XCert($cert, $isPEMFormat=TRUE) { + $certs = XMLSecurityDSig::staticGet509XCerts($cert, $isPEMFormat); + if (!empty($certs)) { + return $certs[0]; + } + return ''; + } + + static function staticGet509XCerts($certs, $isPEMFormat=TRUE) { + if ($isPEMFormat) { + $data = ''; + $certlist = array(); + $arCert = explode("\n", $certs); + $inData = FALSE; + foreach ($arCert AS $curData) { + if (!$inData) { + if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) { + $inData = TRUE; + } + } else { + if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) { + $inData = FALSE; + $certlist[] = $data; + $data = ''; + continue; + } + $data .= trim($curData); + } + } + return $certlist; + } else { + return array($certs); + } + } + + static function staticAdd509Cert($parentRef, $cert, $isPEMFormat=TRUE, $isURL=False, $xpath=NULL) { + if ($isURL) { + $cert = file_get_contents($cert); + } + if (!$parentRef instanceof DOMElement) { + throw new Exception('Invalid parent Node parameter'); + } + $baseDoc = $parentRef->ownerDocument; + + if (empty($xpath)) { + $xpath = new DOMXPath($parentRef->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + } + + $query = "./secdsig:KeyInfo"; + $nodeset = $xpath->query($query, $parentRef); + $keyInfo = $nodeset->item(0); + if (!$keyInfo) { + $inserted = FALSE; + $keyInfo = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:KeyInfo'); + + $query = "./secdsig:Object"; + $nodeset = $xpath->query($query, $parentRef); + if ($sObject = $nodeset->item(0)) { + $sObject->parentNode->insertBefore($keyInfo, $sObject); + $inserted = TRUE; + } + + if (!$inserted) { + $parentRef->appendChild($keyInfo); + } + } + + // Add all certs if there are more than one + $certs = XMLSecurityDSig::staticGet509XCerts($cert, $isPEMFormat); + + // Atach X509 data node + $x509DataNode = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:X509Data'); + $keyInfo->appendChild($x509DataNode); + + // Atach all certificate nodes + foreach ($certs as $X509Cert) { + $x509CertNode = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:X509Certificate', $X509Cert); + $x509DataNode->appendChild($x509CertNode); + } + } + + public function add509Cert($cert, $isPEMFormat=TRUE, $isURL=False) { + if ($xpath = $this->getXPathObj()) { + self::staticAdd509Cert($this->sigNode, $cert, $isPEMFormat, $isURL, $xpath); + } + } + + function addKeyInfoAndName($keyName, $xpath=NULL) { + + $baseDoc = $this->sigNode->ownerDocument; + + if (empty($xpath)) { + $xpath = new DOMXPath($baseDoc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + } + + $query = "./secdsig:KeyInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + $keyInfo = $nodeset->item(0); + if (!$keyInfo) { + $inserted = FALSE; + $keyInfo = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'KeyInfo'); + + $query = "./secdsig:Object"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sObject = $nodeset->item(0)) { + $sObject->parentNode->insertBefore($keyInfo, $sObject); + $inserted = TRUE; + } + if (!$inserted) { + $this->sigNode->appendChild($keyInfo); + } + } + $keyInfo->appendChild($baseDoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'KeyName', $keyName)); + } + + /* This function retrieves an associative array of the validated nodes. + * + * The array will contain the id of the referenced node as the key and the node itself + * as the value. + * + * Returns: + * An associative array of validated nodes or NULL if no nodes have been validated. + */ + + public function getValidatedNodes() { + return $this->validatedNodes; + } + +} + +class XMLSecEnc { + const template = " + + + +"; + + const Element = 'http://www.w3.org/2001/04/xmlenc#Element'; + const Content = 'http://www.w3.org/2001/04/xmlenc#Content'; + const URI = 3; + const XMLENCNS = 'http://www.w3.org/2001/04/xmlenc#'; + + private $encdoc = NULL; + private $rawNode = NULL; + public $type = NULL; + public $encKey = NULL; + private $references = array(); + + public function __construct() { + $this->_resetTemplate(); + } + + private function _resetTemplate() { + $this->encdoc = new DOMDocument(); + $this->encdoc->loadXML(XMLSecEnc::template); + } + + public function addReference($name, $node, $type) { + if (!$node instanceOf DOMNode) { + throw new Exception('$node is not of type DOMNode'); + } + $curencdoc = $this->encdoc; + $this->_resetTemplate(); + $encdoc = $this->encdoc; + $this->encdoc = $curencdoc; + $refuri = XMLSecurityDSig::generate_GUID(); + $element = $encdoc->documentElement; + $element->setAttribute("Id", $refuri); + $this->references[$name] = array("node" => $node, "type" => $type, "encnode" => $encdoc, "refuri" => $refuri); + } + + public function setNode($node) { + $this->rawNode = $node; + } + + public function encryptNode($objKey, $replace=TRUE) { + $data = ''; + if (empty($this->rawNode)) { + throw new Exception('Node to encrypt has not been set'); + } + if (!$objKey instanceof XMLSecurityKey) { + throw new Exception('Invalid Key'); + } + $doc = $this->rawNode->ownerDocument; + $xPath = new DOMXPath($this->encdoc); + $objList = $xPath->query('/xenc:EncryptedData/xenc:CipherData/xenc:CipherValue'); + $cipherValue = $objList->item(0); + if ($cipherValue == NULL) { + throw new Exception('Error locating CipherValue element within template'); + } + switch ($this->type) { + case (XMLSecEnc::Element): + $data = $doc->saveXML($this->rawNode); + $this->encdoc->documentElement->setAttribute('Type', XMLSecEnc::Element); + break; + case (XMLSecEnc::Content): + $children = $this->rawNode->childNodes; + foreach ($children AS $child) { + $data .= $doc->saveXML($child); + } + $this->encdoc->documentElement->setAttribute('Type', XMLSecEnc::Content); + break; + default: + throw new Exception('Type is currently not supported'); + return; + } + + $encMethod = $this->encdoc->documentElement->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:EncryptionMethod')); + $encMethod->setAttribute('Algorithm', $objKey->getAlgorith()); + $cipherValue->parentNode->parentNode->insertBefore($encMethod, $cipherValue->parentNode->parentNode->firstChild); + + $strEncrypt = base64_encode($objKey->encryptData($data)); + $value = $this->encdoc->createTextNode($strEncrypt); + $cipherValue->appendChild($value); + + if ($replace) { + switch ($this->type) { + case (XMLSecEnc::Element): + if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) { + return $this->encdoc; + } + $importEnc = $this->rawNode->ownerDocument->importNode($this->encdoc->documentElement, TRUE); + $this->rawNode->parentNode->replaceChild($importEnc, $this->rawNode); + return $importEnc; + break; + case (XMLSecEnc::Content): + $importEnc = $this->rawNode->ownerDocument->importNode($this->encdoc->documentElement, TRUE); + while ($this->rawNode->firstChild) { + $this->rawNode->removeChild($this->rawNode->firstChild); + } + $this->rawNode->appendChild($importEnc); + return $importEnc; + break; + } + } + } + + public function encryptReferences($objKey) { + $curRawNode = $this->rawNode; + $curType = $this->type; + foreach ($this->references AS $name => $reference) { + $this->encdoc = $reference["encnode"]; + $this->rawNode = $reference["node"]; + $this->type = $reference["type"]; + try { + $encNode = $this->encryptNode($objKey); + $this->references[$name]["encnode"] = $encNode; + } catch (Exception $e) { + $this->rawNode = $curRawNode; + $this->type = $curType; + throw $e; + } + } + $this->rawNode = $curRawNode; + $this->type = $curType; + } + + /** + * Retrieve the CipherValue text from this encrypted node. + * + * @return string|NULL The Ciphervalue text, or NULL if no CipherValue is found. + */ + public function getCipherValue() { + if (empty($this->rawNode)) { + throw new Exception('Node to decrypt has not been set'); + } + + $doc = $this->rawNode->ownerDocument; + $xPath = new DOMXPath($doc); + $xPath->registerNamespace('xmlencr', XMLSecEnc::XMLENCNS); + /* Only handles embedded content right now and not a reference */ + $query = "./xmlencr:CipherData/xmlencr:CipherValue"; + $nodeset = $xPath->query($query, $this->rawNode); + $node = $nodeset->item(0); + + if (!$node) { + return NULL; + } + + return base64_decode($node->nodeValue); + } + + /** + * Decrypt this encrypted node. + * + * The behaviour of this function depends on the value of $replace. + * If $replace is FALSE, we will return the decrypted data as a string. + * If $replace is TRUE, we will insert the decrypted element(s) into the + * document, and return the decrypted element(s). + * + * @params XMLSecurityKey $objKey The decryption key that should be used when decrypting the node. + * @params boolean $replace Whether we should replace the encrypted node in the XML document with the decrypted data. The default is TRUE. + * @return string|DOMElement The decrypted data. + */ + public function decryptNode($objKey, $replace=TRUE) { + if (!$objKey instanceof XMLSecurityKey) { + throw new Exception('Invalid Key'); + } + + $encryptedData = $this->getCipherValue(); + if ($encryptedData) { + $decrypted = $objKey->decryptData($encryptedData); + if ($replace) { + switch ($this->type) { + case (XMLSecEnc::Element): + $newdoc = new DOMDocument(); + $newdoc->loadXML($decrypted); + if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) { + return $newdoc; + } + $importEnc = $this->rawNode->ownerDocument->importNode($newdoc->documentElement, TRUE); + $this->rawNode->parentNode->replaceChild($importEnc, $this->rawNode); + return $importEnc; + break; + case (XMLSecEnc::Content): + if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) { + $doc = $this->rawNode; + } else { + $doc = $this->rawNode->ownerDocument; + } + $newFrag = $doc->createDocumentFragment(); + $newFrag->appendXML($decrypted); + $parent = $this->rawNode->parentNode; + $parent->replaceChild($newFrag, $this->rawNode); + return $parent; + break; + default: + return $decrypted; + } + } else { + return $decrypted; + } + } else { + throw new Exception("Cannot locate encrypted data"); + } + } + + public function encryptKey($srcKey, $rawKey, $append=TRUE) { + if ((!$srcKey instanceof XMLSecurityKey) || (!$rawKey instanceof XMLSecurityKey)) { + throw new Exception('Invalid Key'); + } + $strEncKey = base64_encode($srcKey->encryptData($rawKey->key)); + $root = $this->encdoc->documentElement; + $encKey = $this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:EncryptedKey'); + if ($append) { + $keyInfo = $root->insertBefore($this->encdoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'dsig:KeyInfo'), $root->firstChild); + $keyInfo->appendChild($encKey); + } else { + $this->encKey = $encKey; + } + $encMethod = $encKey->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:EncryptionMethod')); + $encMethod->setAttribute('Algorithm', $srcKey->getAlgorith()); + if (!empty($srcKey->name)) { + $keyInfo = $encKey->appendChild($this->encdoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'dsig:KeyInfo')); + $keyInfo->appendChild($this->encdoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'dsig:KeyName', $srcKey->name)); + } + $cipherData = $encKey->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:CipherData')); + $cipherData->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:CipherValue', $strEncKey)); + if (is_array($this->references) && count($this->references) > 0) { + $refList = $encKey->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:ReferenceList')); + foreach ($this->references AS $name => $reference) { + $refuri = $reference["refuri"]; + $dataRef = $refList->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:DataReference')); + $dataRef->setAttribute("URI", '#' . $refuri); + } + } + return; + } + + public function decryptKey($encKey) { + if (!$encKey->isEncrypted) { + throw new Exception("Key is not Encrypted"); + } + if (empty($encKey->key)) { + throw new Exception("Key is missing data to perform the decryption"); + } + return $this->decryptNode($encKey, FALSE); + } + + public function locateEncryptedData($element) { + if ($element instanceof DOMDocument) { + $doc = $element; + } else { + $doc = $element->ownerDocument; + } + if ($doc) { + $xpath = new DOMXPath($doc); + $query = "//*[local-name()='EncryptedData' and namespace-uri()='" . XMLSecEnc::XMLENCNS . "']"; + $nodeset = $xpath->query($query); + return $nodeset->item(0); + } + return NULL; + } + + public function locateKey($node=NULL) { + if (empty($node)) { + $node = $this->rawNode; + } + if (!$node instanceof DOMNode) { + return NULL; + } + if ($doc = $node->ownerDocument) { + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('xmlsecenc', XMLSecEnc::XMLENCNS); + $query = ".//xmlsecenc:EncryptionMethod"; + $nodeset = $xpath->query($query, $node); + if ($encmeth = $nodeset->item(0)) { + $attrAlgorithm = $encmeth->getAttribute("Algorithm"); + try { + $objKey = new XMLSecurityKey($attrAlgorithm, array('type' => 'private')); + } catch (Exception $e) { + return NULL; + } + return $objKey; + } + } + return NULL; + } + + static function staticLocateKeyInfo($objBaseKey=NULL, $node=NULL) { + if (empty($node) || (!$node instanceof DOMNode)) { + return NULL; + } + $doc = $node->ownerDocument; + if (!$doc) { + return NULL; + } + + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('xmlsecenc', XMLSecEnc::XMLENCNS); + $xpath->registerNamespace('xmlsecdsig', XMLSecurityDSig::XMLDSIGNS); + $query = "./xmlsecdsig:KeyInfo"; + $nodeset = $xpath->query($query, $node); + $encmeth = $nodeset->item(0); + if (!$encmeth) { + /* No KeyInfo in EncryptedData / EncryptedKey. */ + return $objBaseKey; + } + + foreach ($encmeth->childNodes AS $child) { + switch ($child->localName) { + case 'KeyName': + if (!empty($objBaseKey)) { + $objBaseKey->name = $child->nodeValue; + } + break; + case 'KeyValue': + foreach ($child->childNodes AS $keyval) { + switch ($keyval->localName) { + case 'DSAKeyValue': + throw new Exception("DSAKeyValue currently not supported"); + break; + case 'RSAKeyValue': + $modulus = NULL; + $exponent = NULL; + if ($modulusNode = $keyval->getElementsByTagName('Modulus')->item(0)) { + $modulus = base64_decode($modulusNode->nodeValue); + } + if ($exponentNode = $keyval->getElementsByTagName('Exponent')->item(0)) { + $exponent = base64_decode($exponentNode->nodeValue); + } + if (empty($modulus) || empty($exponent)) { + throw new Exception("Missing Modulus or Exponent"); + } + $publicKey = XMLSecurityKey::convertRSA($modulus, $exponent); + $objBaseKey->loadKey($publicKey); + break; + } + } + break; + case 'RetrievalMethod': + $type = $child->getAttribute('Type'); + if ($type !== 'http://www.w3.org/2001/04/xmlenc#EncryptedKey') { + /* Unsupported key type. */ + break; + } + $uri = $child->getAttribute('URI'); + if ($uri[0] !== '#') { + /* URI not a reference - unsupported. */ + break; + } + $id = substr($uri, 1); + + $query = "//xmlsecenc:EncryptedKey[@Id='$id']"; + $keyElement = $xpath->query($query)->item(0); + if (!$keyElement) { + throw new Exception("Unable to locate EncryptedKey with @Id='$id'."); + } + + return XMLSecurityKey::fromEncryptedKeyElement($keyElement); + case 'EncryptedKey': + return XMLSecurityKey::fromEncryptedKeyElement($child); + case 'X509Data': + if ($x509certNodes = $child->getElementsByTagName('X509Certificate')) { + if ($x509certNodes->length > 0) { + $x509cert = $x509certNodes->item(0)->textContent; + $x509cert = str_replace(array("\r", "\n"), "", $x509cert); + $x509cert = "-----BEGIN CERTIFICATE-----\n" . chunk_split($x509cert, 64, "\n") . "-----END CERTIFICATE-----\n"; + $objBaseKey->loadKey($x509cert, FALSE, TRUE); + } + } + break; + } + } + return $objBaseKey; + } + + public function locateKeyInfo($objBaseKey=NULL, $node=NULL) { + if (empty($node)) { + $node = $this->rawNode; + } + return XMLSecEnc::staticLocateKeyInfo($objBaseKey, $node); + } + + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.txt new file mode 100644 index 00000000..3d1b6a34 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs-ing.txt @@ -0,0 +1,11 @@ +Beste partners, + +Na de afgelopen tijd meerdere opmerkingen te hebben ontvangen over de onmogelijkheden van merchants om over te kunnen stappen naar PHP versie 5.3 of hoger hebben we een tweede versie van de PHP connector laten ontwikkelen die werkt op PHP versie 5.2.x. +De 5.2.x compatible versie bevat geen namespaces en er is een workaround geïmplementeerd voor het issue met openssl in deze versie van php. +Onze hoop is dat jullie de wijzigingen ook kunnen doorvoeren in de plugins, modules of implementaties die jullie ontwikkelen om het eenvoudiger te maken voor merchants om te kunnen overstappen naar de nieuwe versie van iDEAL. + +De nieuwe connector heb ik als bijlage meegestuurd. Wij zullen deze ook via de reguliere kanalen beschikbaar stellen maar wilde hem jullie z.s.m. doen toekomen. Mochten er problemen zijn met de bijlage dan horen wij dit graag zodat we het probleem kunnen (laten) oplossen. + +Met vriendelijke groet, + +iDEAL Project Implementation manager \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs.php new file mode 100644 index 00000000..bba67c3a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/includes/xmlseclibs/xmlseclibs.php @@ -0,0 +1,1774 @@ +. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Robert Richards nor the names of his + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @author Robert Richards + * @copyright 2007-2011 Robert Richards + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * @version 1.3.0 + */ +/* + Functions to generate simple cases of Exclusive Canonical XML - Callable function is C14NGeneral() + i.e.: $canonical = C14NGeneral($domelement, TRUE); + */ + +/* helper function */ +function sortAndAddAttrs($element, $arAtts) { + $newAtts = array(); + foreach ($arAtts AS $attnode) { + $newAtts[$attnode->nodeName] = $attnode; + } + ksort($newAtts); + foreach ($newAtts as $attnode) { + $element->setAttribute($attnode->nodeName, $attnode->nodeValue); + } +} + +/* helper function */ + +function canonical($tree, $element, $withcomments) { + if ($tree->nodeType != XML_DOCUMENT_NODE) { + $dom = $tree->ownerDocument; + } else { + $dom = $tree; + } + if ($element->nodeType != XML_ELEMENT_NODE) { + if ($element->nodeType == XML_DOCUMENT_NODE) { + foreach ($element->childNodes AS $node) { + canonical($dom, $node, $withcomments); + } + return; + } + if ($element->nodeType == XML_COMMENT_NODE && !$withcomments) { + return; + } + $tree->appendChild($dom->importNode($element, TRUE)); + return; + } + $arNS = array(); + if ($element->namespaceURI != "") { + if ($element->prefix == "") { + $elCopy = $dom->createElementNS($element->namespaceURI, $element->nodeName); + } else { + $prefix = $tree->lookupPrefix($element->namespaceURI); + if ($prefix == $element->prefix) { + $elCopy = $dom->createElementNS($element->namespaceURI, $element->nodeName); + } else { + $elCopy = $dom->createElement($element->nodeName); + $arNS[$element->namespaceURI] = $element->prefix; + } + } + } else { + $elCopy = $dom->createElement($element->nodeName); + } + $tree->appendChild($elCopy); + + /* Create DOMXPath based on original document */ + $xPath = new DOMXPath($element->ownerDocument); + + /* Get namespaced attributes */ + $arAtts = $xPath->query('attribute::*[namespace-uri(.) != ""]', $element); + + /* Create an array with namespace URIs as keys, and sort them */ + foreach ($arAtts AS $attnode) { + if (array_key_exists($attnode->namespaceURI, $arNS) && + ($arNS[$attnode->namespaceURI] == $attnode->prefix)) { + continue; + } + $prefix = $tree->lookupPrefix($attnode->namespaceURI); + if ($prefix != $attnode->prefix) { + $arNS[$attnode->namespaceURI] = $attnode->prefix; + } else { + $arNS[$attnode->namespaceURI] = NULL; + } + } + if (count($arNS) > 0) { + asort($arNS); + } + + /* Add namespace nodes */ + foreach ($arNS AS $namespaceURI => $prefix) { + if ($prefix != NULL) { + $elCopy->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:" . $prefix, $namespaceURI); + } + } + if (count($arNS) > 0) { + ksort($arNS); + } + + /* Get attributes not in a namespace, and then sort and add them */ + $arAtts = $xPath->query('attribute::*[namespace-uri(.) = ""]', $element); + sortAndAddAttrs($elCopy, $arAtts); + + /* Loop through the URIs, and then sort and add attributes within that namespace */ + foreach ($arNS as $nsURI => $prefix) { + $arAtts = $xPath->query('attribute::*[namespace-uri(.) = "' . $nsURI . '"]', $element); + sortAndAddAttrs($elCopy, $arAtts); + } + + foreach ($element->childNodes AS $node) { + canonical($elCopy, $node, $withcomments); + } +} + +/* + $element - DOMElement for which to produce the canonical version of + $exclusive - boolean to indicate exclusive canonicalization (must pass TRUE) + $withcomments - boolean indicating wether or not to include comments in canonicalized form + */ + +function C14NGeneral($element, $exclusive=FALSE, $withcomments=FALSE) { + /* IF PHP 5.2+ then use built in canonical functionality */ + $php_version = explode('.', PHP_VERSION); + if (($php_version[0] > 5) || ($php_version[0] == 5 && $php_version[1] >= 2)) { + return $element->C14N($exclusive, $withcomments); + } + + /* Must be element or document */ + if (!$element instanceof DOMElement && !$element instanceof DOMDocument) { + return NULL; + } + /* Currently only exclusive XML is supported */ + if ($exclusive == FALSE) { + throw new Exception("Only exclusive canonicalization is supported in this version of PHP"); + } + + $copyDoc = new DOMDocument(); + canonical($copyDoc, $element, $withcomments); + return $copyDoc->saveXML($copyDoc->documentElement, LIBXML_NOEMPTYTAG); +} + +class XMLSecurityKey { + const TRIPLEDES_CBC = 'http://www.w3.org/2001/04/xmlenc#tripledes-cbc'; + const AES128_CBC = 'http://www.w3.org/2001/04/xmlenc#aes128-cbc'; + const AES192_CBC = 'http://www.w3.org/2001/04/xmlenc#aes192-cbc'; + const AES256_CBC = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc'; + const RSA_1_5 = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5'; + const RSA_OAEP_MGF1P = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'; + const DSA_SHA1 = 'http://www.w3.org/2000/09/xmldsig#dsa-sha1'; + const RSA_SHA1 = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; + const RSA_SHA256 = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; + + private $cryptParams = array(); + public $type = 0; + public $key = NULL; + public $passphrase = ""; + public $iv = NULL; + public $name = NULL; + public $keyChain = NULL; + public $isEncrypted = FALSE; + public $encryptedCtx = NULL; + public $guid = NULL; + + /** + * This variable contains the certificate as a string if this key represents an X509-certificate. + * If this key doesn't represent a certificate, this will be NULL. + */ + private $x509Certificate = NULL; + + /* This variable contains the certificate thunbprint if we have loaded an X509-certificate. */ + private $X509Thumbprint = NULL; + + public function __construct($type, $params=NULL) { + srand(); + switch ($type) { + case (XMLSecurityKey::TRIPLEDES_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_TRIPLEDES; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#tripledes-cbc'; + $this->cryptParams['keysize'] = 24; + break; + case (XMLSecurityKey::AES128_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_RIJNDAEL_128; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#aes128-cbc'; + $this->cryptParams['keysize'] = 16; + break; + case (XMLSecurityKey::AES192_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_RIJNDAEL_128; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#aes192-cbc'; + $this->cryptParams['keysize'] = 24; + break; + case (XMLSecurityKey::AES256_CBC): + $this->cryptParams['library'] = 'mcrypt'; + $this->cryptParams['cipher'] = MCRYPT_RIJNDAEL_128; + $this->cryptParams['mode'] = MCRYPT_MODE_CBC; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc'; + $this->cryptParams['keysize'] = 32; + break; + case (XMLSecurityKey::RSA_1_5): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5'; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + return; + case (XMLSecurityKey::RSA_OAEP_MGF1P): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_OAEP_PADDING; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'; + $this->cryptParams['hash'] = NULL; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + return; + case (XMLSecurityKey::RSA_SHA1): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['method'] = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + break; + case (XMLSecurityKey::RSA_SHA256): + $this->cryptParams['library'] = 'openssl'; + $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; + $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING; + $this->cryptParams['digest'] = 'SHA256'; + if (is_array($params) && !empty($params['type'])) { + if ($params['type'] == 'public' || $params['type'] == 'private') { + $this->cryptParams['type'] = $params['type']; + break; + } + } + throw new Exception('Certificate "type" (private/public) must be passed via parameters'); + break; + default: + throw new Exception('Invalid Key Type'); + return; + } + $this->type = $type; + } + + /** + * Retrieve the key size for the symmetric encryption algorithm.. + * + * If the key size is unknown, or this isn't a symmetric encryption algorithm, + * NULL is returned. + * + * @return int|NULL The number of bytes in the key. + */ + public function getSymmetricKeySize() { + if (!isset($this->cryptParams['keysize'])) { + return NULL; + } + return $this->cryptParams['keysize']; + } + + public function generateSessionKey() { + if (!isset($this->cryptParams['keysize'])) { + throw new Exception('Unknown key size for type "' . $this->type . '".'); + } + $keysize = $this->cryptParams['keysize']; + + if (function_exists('openssl_random_pseudo_bytes')) { + /* We have PHP >= 5.3 - use openssl to generate session key. */ + $key = openssl_random_pseudo_bytes($keysize); + } else { + /* Generating random key using iv generation routines */ + $key = mcrypt_create_iv($keysize, MCRYPT_RAND); + } + + if ($this->type === XMLSecurityKey::TRIPLEDES_CBC) { + /* Make sure that the generated key has the proper parity bits set. + * Mcrypt doesn't care about the parity bits, but others may care. + */ + for ($i = 0; $i < strlen($key); $i++) { + $byte = ord($key[$i]) & 0xfe; + $parity = 1; + for ($j = 1; $j < 8; $j++) { + $parity ^= ($byte >> $j) & 1; + } + $byte |= $parity; + $key[$i] = chr($byte); + } + } + + $this->key = $key; + return $key; + } + + public static function getRawThumbprint($cert) { + + $arCert = explode("\n", $cert); + $data = ''; + $inData = FALSE; + + foreach ($arCert AS $curData) { + if (!$inData) { + if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) { + $inData = TRUE; + } + } else { + if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) { + $inData = FALSE; + break; + } + $data .= trim($curData); + } + } + + if (!empty($data)) { + return strtolower(sha1(base64_decode($data))); + } + + return NULL; + } + + public function loadKey($key, $isFile=FALSE, $isCert = FALSE) { + if ($isFile) { + $this->key = file_get_contents($key); + } else { + $this->key = $key; + } + if ($isCert) { + $this->key = openssl_x509_read($this->key); + openssl_x509_export($this->key, $str_cert); + $this->x509Certificate = $str_cert; + $this->key = $str_cert; + } else { + $this->x509Certificate = NULL; + } + if ($this->cryptParams['library'] == 'openssl') { + if ($this->cryptParams['type'] == 'public') { + if ($isCert) { + /* Load the thumbprint if this is an X509 certificate. */ + $this->X509Thumbprint = self::getRawThumbprint($this->key); + } + $this->key = openssl_get_publickey($this->key); + } else { + $this->key = openssl_get_privatekey($this->key, $this->passphrase); + } + } else if ($this->cryptParams['cipher'] == MCRYPT_RIJNDAEL_128) { + /* Check key length */ + switch ($this->type) { + case (XMLSecurityKey::AES256_CBC): + if (strlen($this->key) < 25) { + throw new Exception('Key must contain at least 25 characters for this cipher'); + } + break; + case (XMLSecurityKey::AES192_CBC): + if (strlen($this->key) < 17) { + throw new Exception('Key must contain at least 17 characters for this cipher'); + } + break; + } + } + } + + private function encryptMcrypt($data) { + $td = mcrypt_module_open($this->cryptParams['cipher'], '', $this->cryptParams['mode'], ''); + $this->iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); + mcrypt_generic_init($td, $this->key, $this->iv); + if ($this->cryptParams['mode'] == MCRYPT_MODE_CBC) { + $bs = mcrypt_enc_get_block_size($td); + for ($datalen0 = $datalen = strlen($data); (($datalen % $bs) != ($bs - 1)); $datalen++) + $data.=chr(rand(1, 127)); + $data.=chr($datalen - $datalen0 + 1); + } + $encrypted_data = $this->iv . mcrypt_generic($td, $data); + mcrypt_generic_deinit($td); + mcrypt_module_close($td); + return $encrypted_data; + } + + private function decryptMcrypt($data) { + $td = mcrypt_module_open($this->cryptParams['cipher'], '', $this->cryptParams['mode'], ''); + $iv_length = mcrypt_enc_get_iv_size($td); + + $this->iv = substr($data, 0, $iv_length); + $data = substr($data, $iv_length); + + mcrypt_generic_init($td, $this->key, $this->iv); + $decrypted_data = mdecrypt_generic($td, $data); + mcrypt_generic_deinit($td); + mcrypt_module_close($td); + if ($this->cryptParams['mode'] == MCRYPT_MODE_CBC) { + $dataLen = strlen($decrypted_data); + $paddingLength = substr($decrypted_data, $dataLen - 1, 1); + $decrypted_data = substr($decrypted_data, 0, $dataLen - ord($paddingLength)); + } + return $decrypted_data; + } + + private function encryptOpenSSL($data) { + if ($this->cryptParams['type'] == 'public') { + if (!openssl_public_encrypt($data, $encrypted_data, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure encrypting Data'); + return; + } + } else { + if (!openssl_private_encrypt($data, $encrypted_data, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure encrypting Data'); + return; + } + } + return $encrypted_data; + } + + private function decryptOpenSSL($data) { + if ($this->cryptParams['type'] == 'public') { + if (!openssl_public_decrypt($data, $decrypted, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure decrypting Data'); + return; + } + } else { + if (!openssl_private_decrypt($data, $decrypted, $this->key, $this->cryptParams['padding'])) { + throw new Exception('Failure decrypting Data'); + return; + } + } + return $decrypted; + } + + private function signOpenSSL($data) { + $algo = OPENSSL_ALGO_SHA1; + if (!empty($this->cryptParams['digest'])) { + $algo = $this->cryptParams['digest']; + } + if (!openssl_sign($data, $signature, $this->key, $algo)) { + throw new Exception('Failure Signing Data: ' . openssl_error_string() . ' - ' . $algo); + return; + } + return $signature; + } + + private function verifyOpenSSL($data, $signature) { + $algo = OPENSSL_ALGO_SHA1; + if (!empty($this->cryptParams['digest'])) { + $algo = $this->cryptParams['digest']; + } + return openssl_verify($data, $signature, $this->key, $algo); + } + + public function encryptData($data) { + switch ($this->cryptParams['library']) { + case 'mcrypt': + return $this->encryptMcrypt($data); + break; + case 'openssl': + return $this->encryptOpenSSL($data); + break; + } + } + + public function decryptData($data) { + switch ($this->cryptParams['library']) { + case 'mcrypt': + return $this->decryptMcrypt($data); + break; + case 'openssl': + return $this->decryptOpenSSL($data); + break; + } + } + + public function signData($data) { + switch ($this->cryptParams['library']) { + case 'openssl': + return $this->signOpenSSL($data); + break; + } + } + + public function verifySignature($data, $signature) { + switch ($this->cryptParams['library']) { + case 'openssl': + return $this->verifyOpenSSL($data, $signature); + break; + } + } + + public function getAlgorith() { + return $this->cryptParams['method']; + } + + static function makeAsnSegment($type, $string) { + switch ($type) { + case 0x02: + if (ord($string) > 0x7f) + $string = chr(0) . $string; + break; + case 0x03: + $string = chr(0) . $string; + break; + } + + $length = strlen($string); + + if ($length < 128) { + $output = sprintf("%c%c%s", $type, $length, $string); + } else if ($length < 0x0100) { + $output = sprintf("%c%c%c%s", $type, 0x81, $length, $string); + } else if ($length < 0x010000) { + $output = sprintf("%c%c%c%c%s", $type, 0x82, $length / 0x0100, $length % 0x0100, $string); + } else { + $output = NULL; + } + return($output); + } + + /* Modulus and Exponent must already be base64 decoded */ + + static function convertRSA($modulus, $exponent) { + /* make an ASN publicKeyInfo */ + $exponentEncoding = XMLSecurityKey::makeAsnSegment(0x02, $exponent); + $modulusEncoding = XMLSecurityKey::makeAsnSegment(0x02, $modulus); + $sequenceEncoding = XMLSecurityKey:: makeAsnSegment(0x30, $modulusEncoding . $exponentEncoding); + $bitstringEncoding = XMLSecurityKey::makeAsnSegment(0x03, $sequenceEncoding); + $rsaAlgorithmIdentifier = pack("H*", "300D06092A864886F70D0101010500"); + $publicKeyInfo = XMLSecurityKey::makeAsnSegment(0x30, $rsaAlgorithmIdentifier . $bitstringEncoding); + + /* encode the publicKeyInfo in base64 and add PEM brackets */ + $publicKeyInfoBase64 = base64_encode($publicKeyInfo); + $encoding = "-----BEGIN PUBLIC KEY-----\n"; + $offset = 0; + while ($segment = substr($publicKeyInfoBase64, $offset, 64)) { + $encoding = $encoding . $segment . "\n"; + $offset += 64; + } + return $encoding . "-----END PUBLIC KEY-----\n"; + } + + public function serializeKey($parent) { + + } + + /** + * Retrieve the X509 certificate this key represents. + * + * Will return the X509 certificate in PEM-format if this key represents + * an X509 certificate. + * + * @return The X509 certificate or NULL if this key doesn't represent an X509-certificate. + */ + public function getX509Certificate() { + return $this->x509Certificate; + } + + /* Get the thumbprint of this X509 certificate. + * + * Returns: + * The thumbprint as a lowercase 40-character hexadecimal number, or NULL + * if this isn't a X509 certificate. + */ + + public function getX509Thumbprint() { + return $this->X509Thumbprint; + } + + /** + * Create key from an EncryptedKey-element. + * + * @param DOMElement $element The EncryptedKey-element. + * @return XMLSecurityKey The new key. + */ + public static function fromEncryptedKeyElement(DOMElement $element) { + + $objenc = new XMLSecEnc(); + $objenc->setNode($element); + if (!$objKey = $objenc->locateKey()) { + throw new Exception("Unable to locate algorithm for this Encrypted Key"); + } + $objKey->isEncrypted = TRUE; + $objKey->encryptedCtx = $objenc; + XMLSecEnc::staticLocateKeyInfo($objKey, $element); + return $objKey; + } + +} + +class XMLSecurityDSig { + const XMLDSIGNS = 'http://www.w3.org/2000/09/xmldsig#'; + const SHA1 = 'http://www.w3.org/2000/09/xmldsig#sha1'; + const SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256'; + const SHA512 = 'http://www.w3.org/2001/04/xmlenc#sha512'; + const RIPEMD160 = 'http://www.w3.org/2001/04/xmlenc#ripemd160'; + + const C14N = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; + const C14N_COMMENTS = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments'; + const EXC_C14N = 'http://www.w3.org/2001/10/xml-exc-c14n#'; + const EXC_C14N_COMMENTS = 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments'; + + const template = ' + + + +'; + + public $sigNode = NULL; + public $idKeys = array(); + public $idNS = array(); + private $signedInfo = NULL; + private $xPathCtx = NULL; + private $canonicalMethod = NULL; + private $prefix = NULL; + private $searchpfx = 'secdsig'; + + /* This variable contains an associative array of validated nodes. */ + private $validatedNodes = NULL; + + public function __construct() { + $sigdoc = new DOMDocument(); + $sigdoc->loadXML(XMLSecurityDSig::template); + $this->sigNode = $sigdoc->documentElement; + } + + private function resetXPathObj() { + $this->xPathCtx = NULL; + } + + private function getXPathObj() { + if (empty($this->xPathCtx) && !empty($this->sigNode)) { + $xpath = new DOMXPath($this->sigNode->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $this->xPathCtx = $xpath; + } + return $this->xPathCtx; + } + + static function generate_GUID($prefix='pfx') { + $uuid = md5(uniqid(rand(), true)); + $guid = $prefix . substr($uuid, 0, 8) . "-" . + substr($uuid, 8, 4) . "-" . + substr($uuid, 12, 4) . "-" . + substr($uuid, 16, 4) . "-" . + substr($uuid, 20, 12); + return $guid; + } + + public function locateSignature($objDoc) { + if ($objDoc instanceof DOMDocument) { + $doc = $objDoc; + } else { + $doc = $objDoc->ownerDocument; + } + if ($doc) { + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = ".//secdsig:Signature"; + $nodeset = $xpath->query($query, $objDoc); + $this->sigNode = $nodeset->item(0); + return $this->sigNode; + } + return NULL; + } + + public function createNewSignNode($name, $value=NULL) { + $doc = $this->sigNode->ownerDocument; + if ($this->prefix != null) { + $name = $this->prefix . ':' . $name; + } + if (!is_null($value)) { + $node = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS, $name, $value); + } else { + $node = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS, $name); + } + return $node; + } + + public function setCanonicalMethod($method) { + switch ($method) { + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315': + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments': + case 'http://www.w3.org/2001/10/xml-exc-c14n#': + case 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments': + $this->canonicalMethod = $method; + break; + default: + throw new Exception('Invalid Canonical Method'); + } + if ($xpath = $this->getXPathObj()) { + $query = './' . $this->searchpfx . ':SignedInfo'; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sinfo = $nodeset->item(0)) { + $query = './' . $this->searchpfx . 'CanonicalizationMethod'; + $nodeset = $xpath->query($query, $sinfo); + if (!($canonNode = $nodeset->item(0))) { + $canonNode = $this->createNewSignNode('CanonicalizationMethod'); + $sinfo->insertBefore($canonNode, $sinfo->firstChild); + } + $canonNode->setAttribute('Algorithm', $this->canonicalMethod); + } + } + } + + private function canonicalizeData($node, $canonicalmethod, $arXPath=NULL, $prefixList=NULL) { + $exclusive = FALSE; + $withComments = FALSE; + switch ($canonicalmethod) { + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315': + $exclusive = FALSE; + $withComments = FALSE; + break; + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments': + $withComments = TRUE; + break; + case 'http://www.w3.org/2001/10/xml-exc-c14n#': + $exclusive = TRUE; + break; + case 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments': + $exclusive = TRUE; + $withComments = TRUE; + break; + } + /* Support PHP versions < 5.2 not containing C14N methods in DOM extension */ + $php_version = explode('.', PHP_VERSION); + if (($php_version[0] < 5) || ($php_version[0] == 5 && $php_version[1] < 2)) { + if (!is_null($arXPath)) { + throw new Exception("PHP 5.2.0 or higher is required to perform XPath Transformations"); + } + return C14NGeneral($node, $exclusive, $withComments); + } + return $node->C14N($exclusive, $withComments, $arXPath, $prefixList); + } + + public function canonicalizeSignedInfo() { + + $doc = $this->sigNode->ownerDocument; + $canonicalmethod = NULL; + if ($doc) { + $xpath = $this->getXPathObj(); + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($signInfoNode = $nodeset->item(0)) { + $query = "./secdsig:CanonicalizationMethod"; + $nodeset = $xpath->query($query, $signInfoNode); + if ($canonNode = $nodeset->item(0)) { + $canonicalmethod = $canonNode->getAttribute('Algorithm'); + } + $this->signedInfo = $this->canonicalizeData($signInfoNode, $canonicalmethod); + return $this->signedInfo; + } + } + return NULL; + } + + public function calculateDigest($digestAlgorithm, $data) { + switch ($digestAlgorithm) { + case XMLSecurityDSig::SHA1: + $alg = 'sha1'; + break; + case XMLSecurityDSig::SHA256: + $alg = 'sha256'; + break; + case XMLSecurityDSig::SHA512: + $alg = 'sha512'; + break; + case XMLSecurityDSig::RIPEMD160: + $alg = 'ripemd160'; + break; + default: + throw new Exception("Cannot validate digest: Unsupported Algorith <$digestAlgorithm>"); + } + if (function_exists('hash')) { + return base64_encode(hash($alg, $data, TRUE)); + } elseif (function_exists('mhash')) { + $alg = "MHASH_" . strtoupper($alg); + return base64_encode(mhash(constant($alg), $data)); + } elseif ($alg === 'sha1') { + return base64_encode(sha1($data, TRUE)); + } else { + throw new Exception('xmlseclibs is unable to calculate a digest. Maybe you need the mhash library?'); + } + } + + public function validateDigest($refNode, $data) { + $xpath = new DOMXPath($refNode->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = 'string(./secdsig:DigestMethod/@Algorithm)'; + $digestAlgorithm = $xpath->evaluate($query, $refNode); + $digValue = $this->calculateDigest($digestAlgorithm, $data); + $query = 'string(./secdsig:DigestValue)'; + $digestValue = $xpath->evaluate($query, $refNode); + return ($digValue == $digestValue); + } + + public function processTransforms($refNode, $objData, $includeCommentNodes = TRUE) { + $data = $objData; + $xpath = new DOMXPath($refNode->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = './secdsig:Transforms/secdsig:Transform'; + $nodelist = $xpath->query($query, $refNode); + $canonicalMethod = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; + $arXPath = NULL; + $prefixList = NULL; + foreach ($nodelist AS $transform) { + $algorithm = $transform->getAttribute("Algorithm"); + switch ($algorithm) { + case 'http://www.w3.org/2001/10/xml-exc-c14n#': + case 'http://www.w3.org/2001/10/xml-exc-c14n#WithComments': + + if (!$includeCommentNodes) { + /* We remove comment nodes by forcing it to use a canonicalization + * without comments. + */ + $canonicalMethod = 'http://www.w3.org/2001/10/xml-exc-c14n#'; + } else { + $canonicalMethod = $algorithm; + } + + $node = $transform->firstChild; + while ($node) { + if ($node->localName == 'InclusiveNamespaces') { + if ($pfx = $node->getAttribute('PrefixList')) { + $arpfx = array(); + $pfxlist = explode(" ", $pfx); + foreach ($pfxlist AS $pfx) { + $val = trim($pfx); + if (!empty($val)) { + $arpfx[] = $val; + } + } + if (count($arpfx) > 0) { + $prefixList = $arpfx; + } + } + break; + } + $node = $node->nextSibling; + } + break; + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315': + case 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments': + if (!$includeCommentNodes) { + /* We remove comment nodes by forcing it to use a canonicalization + * without comments. + */ + $canonicalMethod = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'; + } else { + $canonicalMethod = $algorithm; + } + + break; + case 'http://www.w3.org/TR/1999/REC-xpath-19991116': + $node = $transform->firstChild; + while ($node) { + if ($node->localName == 'XPath') { + $arXPath = array(); + $arXPath['query'] = '(.//. | .//@* | .//namespace::*)[' . $node->nodeValue . ']'; + $arXpath['namespaces'] = array(); + $nslist = $xpath->query('./namespace::*', $node); + foreach ($nslist AS $nsnode) { + if ($nsnode->localName != "xml") { + $arXPath['namespaces'][$nsnode->localName] = $nsnode->nodeValue; + } + } + break; + } + $node = $node->nextSibling; + } + break; + } + } + if ($data instanceof DOMNode) { + $data = $this->canonicalizeData($objData, $canonicalMethod, $arXPath, $prefixList); + } + return $data; + } + + public function processRefNode($refNode) { + $dataObject = NULL; + + /* + * Depending on the URI, we may not want to include comments in the result + * See: http://www.w3.org/TR/xmldsig-core/#sec-ReferenceProcessingModel + */ + $includeCommentNodes = TRUE; + + if ($uri = $refNode->getAttribute("URI")) { + $arUrl = parse_url($uri); + if (empty($arUrl['path'])) { + if ($identifier = $arUrl['fragment']) { + + /* This reference identifies a node with the given id by using + * a URI on the form "#identifier". This should not include comments. + */ + $includeCommentNodes = FALSE; + + $xPath = new DOMXPath($refNode->ownerDocument); + if ($this->idNS && is_array($this->idNS)) { + foreach ($this->idNS AS $nspf => $ns) { + $xPath->registerNamespace($nspf, $ns); + } + } + $iDlist = '@Id="' . $identifier . '"'; + if (is_array($this->idKeys)) { + foreach ($this->idKeys AS $idKey) { + $iDlist .= " or @$idKey='$identifier'"; + } + } + $query = '//*[' . $iDlist . ']'; + $dataObject = $xPath->query($query)->item(0); + } else { + $dataObject = $refNode->ownerDocument; + } + } else { + $dataObject = file_get_contents($arUrl); + } + } else { + /* This reference identifies the root node with an empty URI. This should + * not include comments. + */ + $includeCommentNodes = FALSE; + + $dataObject = $refNode->ownerDocument; + } + $data = $this->processTransforms($refNode, $dataObject, $includeCommentNodes); + if (!$this->validateDigest($refNode, $data)) { + return FALSE; + } + + if ($dataObject instanceof DOMNode) { + /* Add this node to the list of validated nodes. */ + if (!empty($identifier)) { + $this->validatedNodes[$identifier] = $dataObject; + } else { + $this->validatedNodes[] = $dataObject; + } + } + + return TRUE; + } + + public function getRefNodeID($refNode) { + if ($uri = $refNode->getAttribute("URI")) { + $arUrl = parse_url($uri); + if (empty($arUrl['path'])) { + if ($identifier = $arUrl['fragment']) { + return $identifier; + } + } + } + return null; + } + + public function getRefIDs() { + $refids = array(); + $doc = $this->sigNode->ownerDocument; + + $xpath = $this->getXPathObj(); + $query = "./secdsig:SignedInfo/secdsig:Reference"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($nodeset->length == 0) { + throw new Exception("Reference nodes not found"); + } + foreach ($nodeset AS $refNode) { + $refids[] = $this->getRefNodeID($refNode); + } + return $refids; + } + + public function validateReference() { + $doc = $this->sigNode->ownerDocument; + if (!$doc->isSameNode($this->sigNode)) { + $this->sigNode->parentNode->removeChild($this->sigNode); + } + $xpath = $this->getXPathObj(); + $query = "./secdsig:SignedInfo/secdsig:Reference"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($nodeset->length == 0) { + throw new Exception("Reference nodes not found"); + } + + /* Initialize/reset the list of validated nodes. */ + $this->validatedNodes = array(); + + foreach ($nodeset AS $refNode) { + if (!$this->processRefNode($refNode)) { + /* Clear the list of validated nodes. */ + $this->validatedNodes = NULL; + throw new Exception("Reference validation failed"); + } + } + return TRUE; + } + + private function addRefInternal($sinfoNode, $node, $algorithm, $arTransforms=NULL, $options=NULL) { + $prefix = NULL; + $prefix_ns = NULL; + $id_name = 'Id'; + $overwrite_id = TRUE; + $force_uri = FALSE; + + if (is_array($options)) { + $prefix = empty($options['prefix']) ? NULL : $options['prefix']; + $prefix_ns = empty($options['prefix_ns']) ? NULL : $options['prefix_ns']; + $id_name = empty($options['id_name']) ? 'Id' : $options['id_name']; + $overwrite_id = !isset($options['overwrite']) ? TRUE : (bool) $options['overwrite']; + $force_uri = !isset($options['force_uri']) ? FALSE : (bool) $options['force_uri']; + } + + $attname = $id_name; + if (!empty($prefix)) { + $attname = $prefix . ':' . $attname; + } + + $refNode = $this->createNewSignNode('Reference'); + $sinfoNode->appendChild($refNode); + + if (!$node instanceof DOMDocument) { + $uri = NULL; + if (!$overwrite_id) { + $uri = $node->getAttributeNS($prefix_ns, $attname); + } + if (empty($uri)) { + $uri = XMLSecurityDSig::generate_GUID(); + $node->setAttributeNS($prefix_ns, $attname, $uri); + } + $refNode->setAttribute("URI", '#' . $uri); + } elseif ($force_uri) { + $refNode->setAttribute("URI", ''); + } + + $transNodes = $this->createNewSignNode('Transforms'); + $refNode->appendChild($transNodes); + + if (is_array($arTransforms)) { + foreach ($arTransforms AS $transform) { + $transNode = $this->createNewSignNode('Transform'); + $transNodes->appendChild($transNode); + if (is_array($transform) && + (!empty($transform['http://www.w3.org/TR/1999/REC-xpath-19991116'])) && + (!empty($transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['query']))) { + $transNode->setAttribute('Algorithm', 'http://www.w3.org/TR/1999/REC-xpath-19991116'); + $XPathNode = $this->createNewSignNode('XPath', $transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['query']); + $transNode->appendChild($XPathNode); + if (!empty($transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['namespaces'])) { + foreach ($transform['http://www.w3.org/TR/1999/REC-xpath-19991116']['namespaces'] AS $prefix => $namespace) { + $XPathNode->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:$prefix", $namespace); + } + } + } else { + $transNode->setAttribute('Algorithm', $transform); + } + } + } elseif (!empty($this->canonicalMethod)) { + $transNode = $this->createNewSignNode('Transform'); + $transNodes->appendChild($transNode); + $transNode->setAttribute('Algorithm', $this->canonicalMethod); + } + + $canonicalData = $this->processTransforms($refNode, $node); + $digValue = $this->calculateDigest($algorithm, $canonicalData); + + $digestMethod = $this->createNewSignNode('DigestMethod'); + $refNode->appendChild($digestMethod); + $digestMethod->setAttribute('Algorithm', $algorithm); + + $digestValue = $this->createNewSignNode('DigestValue', $digValue); + $refNode->appendChild($digestValue); + } + + public function addReference($node, $algorithm, $arTransforms=NULL, $options=NULL) { + if ($xpath = $this->getXPathObj()) { + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sInfo = $nodeset->item(0)) { + $this->addRefInternal($sInfo, $node, $algorithm, $arTransforms, $options); + } + } + } + + public function addReferenceList($arNodes, $algorithm, $arTransforms=NULL, $options=NULL) { + if ($xpath = $this->getXPathObj()) { + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sInfo = $nodeset->item(0)) { + foreach ($arNodes AS $node) { + $this->addRefInternal($sInfo, $node, $algorithm, $arTransforms, $options); + } + } + } + } + + public function addObject($data, $mimetype=NULL, $encoding=NULL) { + $objNode = $this->createNewSignNode('Object'); + $this->sigNode->appendChild($objNode); + if (!empty($mimetype)) { + $objNode->setAtribute('MimeType', $mimetype); + } + if (!empty($encoding)) { + $objNode->setAttribute('Encoding', $encoding); + } + + if ($data instanceof DOMElement) { + $newData = $this->sigNode->ownerDocument->importNode($data, TRUE); + } else { + $newData = $this->sigNode->ownerDocument->createTextNode($data); + } + $objNode->appendChild($newData); + + return $objNode; + } + + public function locateKey($node=NULL) { + if (empty($node)) { + $node = $this->sigNode; + } + if (!$node instanceof DOMNode) { + return NULL; + } + if ($doc = $node->ownerDocument) { + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = "string(./secdsig:SignedInfo/secdsig:SignatureMethod/@Algorithm)"; + $algorithm = $xpath->evaluate($query, $node); + if ($algorithm) { + try { + $objKey = new XMLSecurityKey($algorithm, array('type' => 'public')); + } catch (Exception $e) { + return NULL; + } + return $objKey; + } + } + return NULL; + } + + public function verify($objKey) { + $doc = $this->sigNode->ownerDocument; + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + $query = "string(./secdsig:SignatureValue)"; + $sigValue = $xpath->evaluate($query, $this->sigNode); + if (empty($sigValue)) { + throw new Exception("Unable to locate SignatureValue"); + } + return $objKey->verifySignature($this->signedInfo, base64_decode($sigValue)); + } + + public function signData($objKey, $data) { + return $objKey->signData($data); + } + + public function sign($objKey, $appendToNode = NULL) { + // If we have a parent node append it now so C14N properly works + if ($appendToNode != NULL) { + $this->resetXPathObj(); + $this->appendSignature($appendToNode); + $this->sigNode = $appendToNode->lastChild; + } + if ($xpath = $this->getXPathObj()) { + $query = "./secdsig:SignedInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sInfo = $nodeset->item(0)) { + $query = "./secdsig:SignatureMethod"; + $nodeset = $xpath->query($query, $sInfo); + $sMethod = $nodeset->item(0); + $sMethod->setAttribute('Algorithm', $objKey->type); + $data = $this->canonicalizeData($sInfo, $this->canonicalMethod); + $sigValue = base64_encode($this->signData($objKey, $data)); + $sigValueNode = $this->createNewSignNode('SignatureValue', $sigValue); + if ($infoSibling = $sInfo->nextSibling) { + $infoSibling->parentNode->insertBefore($sigValueNode, $infoSibling); + } else { + $this->sigNode->appendChild($sigValueNode); + } + } + } + } + + public function appendCert() { + + } + + public function appendKey($objKey, $parent=NULL) { + $objKey->serializeKey($parent); + } + + /** + * This function inserts the signature element. + * + * The signature element will be appended to the element, unless $beforeNode is specified. If $beforeNode + * is specified, the signature element will be inserted as the last element before $beforeNode. + * + * @param $node The node the signature element should be inserted into. + * @param $beforeNode The node the signature element should be located before. + * + * @return DOMNode The signature element node + */ + public function insertSignature($node, $beforeNode = NULL) { + + $document = $node->ownerDocument; + $signatureElement = $document->importNode($this->sigNode, TRUE); + + if ($beforeNode == NULL) { + return $node->insertBefore($signatureElement); + } else { + return $node->insertBefore($signatureElement, $beforeNode); + } + } + + public function appendSignature($parentNode, $insertBefore = FALSE) { + $beforeNode = $insertBefore ? $parentNode->firstChild : NULL; + return $this->insertSignature($parentNode, $beforeNode); + } + + static function get509XCert($cert, $isPEMFormat=TRUE) { + $certs = XMLSecurityDSig::staticGet509XCerts($cert, $isPEMFormat); + if (!empty($certs)) { + return $certs[0]; + } + return ''; + } + + static function staticGet509XCerts($certs, $isPEMFormat=TRUE) { + if ($isPEMFormat) { + $data = ''; + $certlist = array(); + $arCert = explode("\n", $certs); + $inData = FALSE; + foreach ($arCert AS $curData) { + if (!$inData) { + if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) { + $inData = TRUE; + } + } else { + if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) { + $inData = FALSE; + $certlist[] = $data; + $data = ''; + continue; + } + $data .= trim($curData); + } + } + return $certlist; + } else { + return array($certs); + } + } + + static function staticAdd509Cert($parentRef, $cert, $isPEMFormat=TRUE, $isURL=False, $xpath=NULL) { + if ($isURL) { + $cert = file_get_contents($cert); + } + if (!$parentRef instanceof DOMElement) { + throw new Exception('Invalid parent Node parameter'); + } + $baseDoc = $parentRef->ownerDocument; + + if (empty($xpath)) { + $xpath = new DOMXPath($parentRef->ownerDocument); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + } + + $query = "./secdsig:KeyInfo"; + $nodeset = $xpath->query($query, $parentRef); + $keyInfo = $nodeset->item(0); + if (!$keyInfo) { + $inserted = FALSE; + $keyInfo = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:KeyInfo'); + + $query = "./secdsig:Object"; + $nodeset = $xpath->query($query, $parentRef); + if ($sObject = $nodeset->item(0)) { + $sObject->parentNode->insertBefore($keyInfo, $sObject); + $inserted = TRUE; + } + + if (!$inserted) { + $parentRef->appendChild($keyInfo); + } + } + + // Add all certs if there are more than one + $certs = XMLSecurityDSig::staticGet509XCerts($cert, $isPEMFormat); + + // Atach X509 data node + $x509DataNode = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:X509Data'); + $keyInfo->appendChild($x509DataNode); + + // Atach all certificate nodes + foreach ($certs as $X509Cert) { + $x509CertNode = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:X509Certificate', $X509Cert); + $x509DataNode->appendChild($x509CertNode); + } + } + + public function add509Cert($cert, $isPEMFormat=TRUE, $isURL=False) { + if ($xpath = $this->getXPathObj()) { + self::staticAdd509Cert($this->sigNode, $cert, $isPEMFormat, $isURL, $xpath); + } + } + + function addKeyInfoAndName($keyName, $xpath=NULL) { + + $baseDoc = $this->sigNode->ownerDocument; + + if (empty($xpath)) { + $xpath = new DOMXPath($baseDoc); + $xpath->registerNamespace('secdsig', XMLSecurityDSig::XMLDSIGNS); + } + + $query = "./secdsig:KeyInfo"; + $nodeset = $xpath->query($query, $this->sigNode); + $keyInfo = $nodeset->item(0); + if (!$keyInfo) { + $inserted = FALSE; + $keyInfo = $baseDoc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'KeyInfo'); + + $query = "./secdsig:Object"; + $nodeset = $xpath->query($query, $this->sigNode); + if ($sObject = $nodeset->item(0)) { + $sObject->parentNode->insertBefore($keyInfo, $sObject); + $inserted = TRUE; + } + if (!$inserted) { + $this->sigNode->appendChild($keyInfo); + } + } + $keyInfo->appendChild($baseDoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'KeyName', $keyName)); + } + + /* This function retrieves an associative array of the validated nodes. + * + * The array will contain the id of the referenced node as the key and the node itself + * as the value. + * + * Returns: + * An associative array of validated nodes or NULL if no nodes have been validated. + */ + + public function getValidatedNodes() { + return $this->validatedNodes; + } + +} + +class XMLSecEnc { + const template = " + + + +"; + + const Element = 'http://www.w3.org/2001/04/xmlenc#Element'; + const Content = 'http://www.w3.org/2001/04/xmlenc#Content'; + const URI = 3; + const XMLENCNS = 'http://www.w3.org/2001/04/xmlenc#'; + + private $encdoc = NULL; + private $rawNode = NULL; + public $type = NULL; + public $encKey = NULL; + private $references = array(); + + public function __construct() { + $this->_resetTemplate(); + } + + private function _resetTemplate() { + $this->encdoc = new DOMDocument(); + $this->encdoc->loadXML(XMLSecEnc::template); + } + + public function addReference($name, $node, $type) { + if (!$node instanceOf DOMNode) { + throw new Exception('$node is not of type DOMNode'); + } + $curencdoc = $this->encdoc; + $this->_resetTemplate(); + $encdoc = $this->encdoc; + $this->encdoc = $curencdoc; + $refuri = XMLSecurityDSig::generate_GUID(); + $element = $encdoc->documentElement; + $element->setAttribute("Id", $refuri); + $this->references[$name] = array("node" => $node, "type" => $type, "encnode" => $encdoc, "refuri" => $refuri); + } + + public function setNode($node) { + $this->rawNode = $node; + } + + public function encryptNode($objKey, $replace=TRUE) { + $data = ''; + if (empty($this->rawNode)) { + throw new Exception('Node to encrypt has not been set'); + } + if (!$objKey instanceof XMLSecurityKey) { + throw new Exception('Invalid Key'); + } + $doc = $this->rawNode->ownerDocument; + $xPath = new DOMXPath($this->encdoc); + $objList = $xPath->query('/xenc:EncryptedData/xenc:CipherData/xenc:CipherValue'); + $cipherValue = $objList->item(0); + if ($cipherValue == NULL) { + throw new Exception('Error locating CipherValue element within template'); + } + switch ($this->type) { + case (XMLSecEnc::Element): + $data = $doc->saveXML($this->rawNode); + $this->encdoc->documentElement->setAttribute('Type', XMLSecEnc::Element); + break; + case (XMLSecEnc::Content): + $children = $this->rawNode->childNodes; + foreach ($children AS $child) { + $data .= $doc->saveXML($child); + } + $this->encdoc->documentElement->setAttribute('Type', XMLSecEnc::Content); + break; + default: + throw new Exception('Type is currently not supported'); + return; + } + + $encMethod = $this->encdoc->documentElement->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:EncryptionMethod')); + $encMethod->setAttribute('Algorithm', $objKey->getAlgorith()); + $cipherValue->parentNode->parentNode->insertBefore($encMethod, $cipherValue->parentNode->parentNode->firstChild); + + $strEncrypt = base64_encode($objKey->encryptData($data)); + $value = $this->encdoc->createTextNode($strEncrypt); + $cipherValue->appendChild($value); + + if ($replace) { + switch ($this->type) { + case (XMLSecEnc::Element): + if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) { + return $this->encdoc; + } + $importEnc = $this->rawNode->ownerDocument->importNode($this->encdoc->documentElement, TRUE); + $this->rawNode->parentNode->replaceChild($importEnc, $this->rawNode); + return $importEnc; + break; + case (XMLSecEnc::Content): + $importEnc = $this->rawNode->ownerDocument->importNode($this->encdoc->documentElement, TRUE); + while ($this->rawNode->firstChild) { + $this->rawNode->removeChild($this->rawNode->firstChild); + } + $this->rawNode->appendChild($importEnc); + return $importEnc; + break; + } + } + } + + public function encryptReferences($objKey) { + $curRawNode = $this->rawNode; + $curType = $this->type; + foreach ($this->references AS $name => $reference) { + $this->encdoc = $reference["encnode"]; + $this->rawNode = $reference["node"]; + $this->type = $reference["type"]; + try { + $encNode = $this->encryptNode($objKey); + $this->references[$name]["encnode"] = $encNode; + } catch (Exception $e) { + $this->rawNode = $curRawNode; + $this->type = $curType; + throw $e; + } + } + $this->rawNode = $curRawNode; + $this->type = $curType; + } + + /** + * Retrieve the CipherValue text from this encrypted node. + * + * @return string|NULL The Ciphervalue text, or NULL if no CipherValue is found. + */ + public function getCipherValue() { + if (empty($this->rawNode)) { + throw new Exception('Node to decrypt has not been set'); + } + + $doc = $this->rawNode->ownerDocument; + $xPath = new DOMXPath($doc); + $xPath->registerNamespace('xmlencr', XMLSecEnc::XMLENCNS); + /* Only handles embedded content right now and not a reference */ + $query = "./xmlencr:CipherData/xmlencr:CipherValue"; + $nodeset = $xPath->query($query, $this->rawNode); + $node = $nodeset->item(0); + + if (!$node) { + return NULL; + } + + return base64_decode($node->nodeValue); + } + + /** + * Decrypt this encrypted node. + * + * The behaviour of this function depends on the value of $replace. + * If $replace is FALSE, we will return the decrypted data as a string. + * If $replace is TRUE, we will insert the decrypted element(s) into the + * document, and return the decrypted element(s). + * + * @params XMLSecurityKey $objKey The decryption key that should be used when decrypting the node. + * @params boolean $replace Whether we should replace the encrypted node in the XML document with the decrypted data. The default is TRUE. + * @return string|DOMElement The decrypted data. + */ + public function decryptNode($objKey, $replace=TRUE) { + if (!$objKey instanceof XMLSecurityKey) { + throw new Exception('Invalid Key'); + } + + $encryptedData = $this->getCipherValue(); + if ($encryptedData) { + $decrypted = $objKey->decryptData($encryptedData); + if ($replace) { + switch ($this->type) { + case (XMLSecEnc::Element): + $newdoc = new DOMDocument(); + $newdoc->loadXML($decrypted); + if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) { + return $newdoc; + } + $importEnc = $this->rawNode->ownerDocument->importNode($newdoc->documentElement, TRUE); + $this->rawNode->parentNode->replaceChild($importEnc, $this->rawNode); + return $importEnc; + break; + case (XMLSecEnc::Content): + if ($this->rawNode->nodeType == XML_DOCUMENT_NODE) { + $doc = $this->rawNode; + } else { + $doc = $this->rawNode->ownerDocument; + } + $newFrag = $doc->createDocumentFragment(); + $newFrag->appendXML($decrypted); + $parent = $this->rawNode->parentNode; + $parent->replaceChild($newFrag, $this->rawNode); + return $parent; + break; + default: + return $decrypted; + } + } else { + return $decrypted; + } + } else { + throw new Exception("Cannot locate encrypted data"); + } + } + + public function encryptKey($srcKey, $rawKey, $append=TRUE) { + if ((!$srcKey instanceof XMLSecurityKey) || (!$rawKey instanceof XMLSecurityKey)) { + throw new Exception('Invalid Key'); + } + $strEncKey = base64_encode($srcKey->encryptData($rawKey->key)); + $root = $this->encdoc->documentElement; + $encKey = $this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:EncryptedKey'); + if ($append) { + $keyInfo = $root->insertBefore($this->encdoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'dsig:KeyInfo'), $root->firstChild); + $keyInfo->appendChild($encKey); + } else { + $this->encKey = $encKey; + } + $encMethod = $encKey->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:EncryptionMethod')); + $encMethod->setAttribute('Algorithm', $srcKey->getAlgorith()); + if (!empty($srcKey->name)) { + $keyInfo = $encKey->appendChild($this->encdoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'dsig:KeyInfo')); + $keyInfo->appendChild($this->encdoc->createElementNS('http://www.w3.org/2000/09/xmldsig#', 'dsig:KeyName', $srcKey->name)); + } + $cipherData = $encKey->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:CipherData')); + $cipherData->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:CipherValue', $strEncKey)); + if (is_array($this->references) && count($this->references) > 0) { + $refList = $encKey->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:ReferenceList')); + foreach ($this->references AS $name => $reference) { + $refuri = $reference["refuri"]; + $dataRef = $refList->appendChild($this->encdoc->createElementNS(XMLSecEnc::XMLENCNS, 'xenc:DataReference')); + $dataRef->setAttribute("URI", '#' . $refuri); + } + } + return; + } + + public function decryptKey($encKey) { + if (!$encKey->isEncrypted) { + throw new Exception("Key is not Encrypted"); + } + if (empty($encKey->key)) { + throw new Exception("Key is missing data to perform the decryption"); + } + return $this->decryptNode($encKey, FALSE); + } + + public function locateEncryptedData($element) { + if ($element instanceof DOMDocument) { + $doc = $element; + } else { + $doc = $element->ownerDocument; + } + if ($doc) { + $xpath = new DOMXPath($doc); + $query = "//*[local-name()='EncryptedData' and namespace-uri()='" . XMLSecEnc::XMLENCNS . "']"; + $nodeset = $xpath->query($query); + return $nodeset->item(0); + } + return NULL; + } + + public function locateKey($node=NULL) { + if (empty($node)) { + $node = $this->rawNode; + } + if (!$node instanceof DOMNode) { + return NULL; + } + if ($doc = $node->ownerDocument) { + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('xmlsecenc', XMLSecEnc::XMLENCNS); + $query = ".//xmlsecenc:EncryptionMethod"; + $nodeset = $xpath->query($query, $node); + if ($encmeth = $nodeset->item(0)) { + $attrAlgorithm = $encmeth->getAttribute("Algorithm"); + try { + $objKey = new XMLSecurityKey($attrAlgorithm, array('type' => 'private')); + } catch (Exception $e) { + return NULL; + } + return $objKey; + } + } + return NULL; + } + + static function staticLocateKeyInfo($objBaseKey=NULL, $node=NULL) { + if (empty($node) || (!$node instanceof DOMNode)) { + return NULL; + } + $doc = $node->ownerDocument; + if (!$doc) { + return NULL; + } + + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('xmlsecenc', XMLSecEnc::XMLENCNS); + $xpath->registerNamespace('xmlsecdsig', XMLSecurityDSig::XMLDSIGNS); + $query = "./xmlsecdsig:KeyInfo"; + $nodeset = $xpath->query($query, $node); + $encmeth = $nodeset->item(0); + if (!$encmeth) { + /* No KeyInfo in EncryptedData / EncryptedKey. */ + return $objBaseKey; + } + + foreach ($encmeth->childNodes AS $child) { + switch ($child->localName) { + case 'KeyName': + if (!empty($objBaseKey)) { + $objBaseKey->name = $child->nodeValue; + } + break; + case 'KeyValue': + foreach ($child->childNodes AS $keyval) { + switch ($keyval->localName) { + case 'DSAKeyValue': + throw new Exception("DSAKeyValue currently not supported"); + break; + case 'RSAKeyValue': + $modulus = NULL; + $exponent = NULL; + if ($modulusNode = $keyval->getElementsByTagName('Modulus')->item(0)) { + $modulus = base64_decode($modulusNode->nodeValue); + } + if ($exponentNode = $keyval->getElementsByTagName('Exponent')->item(0)) { + $exponent = base64_decode($exponentNode->nodeValue); + } + if (empty($modulus) || empty($exponent)) { + throw new Exception("Missing Modulus or Exponent"); + } + $publicKey = XMLSecurityKey::convertRSA($modulus, $exponent); + $objBaseKey->loadKey($publicKey); + break; + } + } + break; + case 'RetrievalMethod': + $type = $child->getAttribute('Type'); + if ($type !== 'http://www.w3.org/2001/04/xmlenc#EncryptedKey') { + /* Unsupported key type. */ + break; + } + $uri = $child->getAttribute('URI'); + if ($uri[0] !== '#') { + /* URI not a reference - unsupported. */ + break; + } + $id = substr($uri, 1); + + $query = "//xmlsecenc:EncryptedKey[@Id='$id']"; + $keyElement = $xpath->query($query)->item(0); + if (!$keyElement) { + throw new Exception("Unable to locate EncryptedKey with @Id='$id'."); + } + + return XMLSecurityKey::fromEncryptedKeyElement($keyElement); + case 'EncryptedKey': + return XMLSecurityKey::fromEncryptedKeyElement($child); + case 'X509Data': + if ($x509certNodes = $child->getElementsByTagName('X509Certificate')) { + if ($x509certNodes->length > 0) { + $x509cert = $x509certNodes->item(0)->textContent; + $x509cert = str_replace(array("\r", "\n"), "", $x509cert); + $x509cert = "-----BEGIN CERTIFICATE-----\n" . chunk_split($x509cert, 64, "\n") . "-----END CERTIFICATE-----\n"; + $objBaseKey->loadKey($x509cert, FALSE, TRUE); + } + } + break; + } + } + return $objBaseKey; + } + + public function locateKeyInfo($objBaseKey=NULL, $node=NULL) { + if (empty($node)) { + $node = $this->rawNode; + } + return XMLSecEnc::staticLocateKeyInfo($objBaseKey, $node); + } + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-reports.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-reports.js new file mode 100644 index 00000000..9a9ef359 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-reports.js @@ -0,0 +1,136 @@ +/* global pronamicPayAdminReports */ +/* global accounting */ +/* global tippy */ +jQuery( document ).ready( function( $ ) { + var container = $( '#chart1' ); + + var drawChart = function( highlight ) { + // @see http://stackoverflow.com/a/817050 + var data = $.extend( true, [], pronamicPayAdminReports.data ); + + if ( typeof highlight !== 'undefined' && data[ highlight ] ) { + var serie = data[ highlight ]; + + serie.color = '#23282F'; + + if ( serie.bars ) { + serie.bars.fillColor = '#23282F'; + } + + if ( serie.lines ) { + serie.lines.lineWidth = 5; + } + } + + // @see https://github.com/flot/flot/blob/master/API.md + var font = { + color: '#AAA', + size: 13 + }; + + $.plot( container, data, { + legend: { + show: false + }, + grid: { + color: '#AAA', + borderColor: 'transparent', + borderWidth: 0, + hoverable: true + }, + xaxes: [ { + color: '#AAA', + position: 'bottom', + tickColor: 'transparent', + mode: 'time', + timeformat: '%b', + monthNames: pronamicPayAdminReports.monthNames, + tickLength: 1, + minTickSize: [ 1, 'month' ], + font: font + } ], + yaxes: [ + { + min: 0, + minTickSize: 1, + tickDecimals: 0, + color: '#D4D9DC', + font: font + }, + { + position: 'right', + min: 0, + tickDecimals: 2, + tickFormatter: function( val ) { + return accounting.formatMoney( val, '€' + ' ', 2, '.', ',' ); + }, + alignTicksWithAxis: 1, + color: 'transparent', + font: font + } + ] + } ); + }; + + drawChart(); + + jQuery( '[data-pronamic-pay-highlight-serie]' ).hover( + function() { + drawChart( jQuery( this ).data( 'pronamic-pay-highlight-serie' ) ); + }, + function() { + drawChart(); + } + ); + + var tippyInstance = false; + var dataIndex = false; + var seriesIndex = false; + + container.bind( 'plothover', function( event, pos, item ) { + if ( ! item || item.dataIndex !== dataIndex || item.seriesIndex !== seriesIndex ) { + if ( tippyInstance ) { + tippyInstance.destroy(); + } + + tippyInstance = false; + } + + if ( ! item ) { + return; + } + + if ( tippyInstance ) { + return; + } + + var text = item.datapoint[1].toFixed( 2 ); + + if ( item.series.tooltipFormatter && 'money' === item.series.tooltipFormatter ) { + text = accounting.formatMoney( item.datapoint[1], '€ ', 2, '.', ',' ); + } + + tippyInstance = tippy.one( { + getBoundingClientRect: function() { + return { + width: 0, + height: 0, + top: item.pageY - window.pageYOffset, + left: item.pageX - window.pageXOffset, + right: item.pageX - window.pageXOffset, + bottom: item.pageY - window.pageYOffset + }; + }, + clientHeight: 0, + clientWidth: 0 + }, { + content: text, + placement: 'right' + } ); + + dataIndex = item.dataIndex; + seriesIndex = item.seriesIndex; + + tippyInstance.show(); + } ); +} ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-reports.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-reports.min.js new file mode 100644 index 00000000..6d1e0aa2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-reports.min.js @@ -0,0 +1 @@ +jQuery(document).ready((function(t){var e=t("#chart1"),i=function(i){var o=t.extend(!0,[],pronamicPayAdminReports.data);if(void 0!==i&&o[i]){var n=o[i];n.color="#23282F",n.bars&&(n.bars.fillColor="#23282F"),n.lines&&(n.lines.lineWidth=5)}var r={color:"#AAA",size:13};t.plot(e,o,{legend:{show:!1},grid:{color:"#AAA",borderColor:"transparent",borderWidth:0,hoverable:!0},xaxes:[{color:"#AAA",position:"bottom",tickColor:"transparent",mode:"time",timeformat:"%b",monthNames:pronamicPayAdminReports.monthNames,tickLength:1,minTickSize:[1,"month"],font:r}],yaxes:[{min:0,minTickSize:1,tickDecimals:0,color:"#D4D9DC",font:r},{position:"right",min:0,tickDecimals:2,tickFormatter:function(t){return accounting.formatMoney(t,"€ ",2,".",",")},alignTicksWithAxis:1,color:"transparent",font:r}]})};i(),jQuery("[data-pronamic-pay-highlight-serie]").hover((function(){i(jQuery(this).data("pronamic-pay-highlight-serie"))}),(function(){i()}));var o=!1,n=!1,r=!1;e.bind("plothover",(function(t,e,i){if(i&&i.dataIndex===n&&i.seriesIndex===r||(o&&o.destroy(),o=!1),i&&!o){var a=i.datapoint[1].toFixed(2);i.series.tooltipFormatter&&"money"===i.series.tooltipFormatter&&(a=accounting.formatMoney(i.datapoint[1],"€ ",2,".",",")),o=tippy.one({getBoundingClientRect:function(){return{width:0,height:0,top:i.pageY-window.pageYOffset,left:i.pageX-window.pageXOffset,right:i.pageX-window.pageXOffset,bottom:i.pageY-window.pageYOffset}},clientHeight:0,clientWidth:0},{content:a,placement:"right"}),n=i.dataIndex,r=i.seriesIndex,o.show()}}))})); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-tour.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-tour.js new file mode 100644 index 00000000..63057bc5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-tour.js @@ -0,0 +1,14 @@ +/* global pronamicPayAdminTour */ +jQuery( document ).ready( function( $ ) { + $.each( pronamicPayAdminTour.pointers, function() { + var pointer = this; + + var options = $.extend( pointer.options, { + buttons: function() { + return false; + } + } ); + + $( pointer.selector ).first().pointer( options ).pointer( 'open' ); + } ); +} ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-tour.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-tour.min.js new file mode 100644 index 00000000..4d75279d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin-tour.min.js @@ -0,0 +1 @@ +jQuery(document).ready((function(n){n.each(pronamicPayAdminTour.pointers,(function(){var t=n.extend(this.options,{buttons:function(){return!1}});n(this.selector).first().pointer(t).pointer("open")}))})); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin.js new file mode 100644 index 00000000..98640a07 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin.js @@ -0,0 +1,385 @@ +/* global tippy */ +( function( $ ) { + /** + * Pronamic iDEAL config prototype + */ + var PronamicPayGatewayConfigEditor = function( element ) { + var obj = this; + var $element = $( element ); + + // Elements + var elements = {}; + elements.variantId = $element.find( '#pronamic_gateway_id' ); + elements.extraSettings = $element.find( 'div.extra-settings' ); + elements.sectionHeaders = $element.find( '.gateway-config-section-header' ); + elements.tabs = $element.find( '.pronamic-pay-tabs' ); + elements.tabItems = $element.find( 'ul.pronamic-pay-tabs-items' ); + + /** + * Update config fields + */ + this.updateFields = function() { + // Find selected variant + obj.selectedVariant = elements.variantId.find( 'option:selected' ); + + obj.settings = obj.selectedVariant.data( 'pronamic-pay-settings' ); + + // Hide all settings + $element.find( '.extra-settings' ).hide(); + + // Show settings for variant + obj.settingElements = []; + + if ( $.isArray( obj.settings ) ) { + $.each( obj.settings, function( index, value ) { + $element.find( '.setting-' + value ).show(); + } ); + } + + $element.find( '.setting-' + obj.selectedVariant.val() ).show(); + + // Set name of first tab item to name of selected provider + var providerName = obj.selectedVariant.text().split( ' - ' )[0].replace( / \(.*\)/, '' ); + + elements.tabItems.find( ':visible' ).first().text( providerName ).click(); + + $( '#pronamic-pay-gateway-description').html( obj.selectedVariant.attr( 'data-gateway-description' ) ); + }; + + // Update row background color + this.updateRowBackgroundColor = function() { + // Set background color of visible even rows + var rows = elements.extraSettings.find( '.form-table tr' ); + + rows.removeClass( 'even' ); + rows.filter( ':visible:even' ).addClass( 'even' ); + }; + + /** + * Tabs + */ + this.initTabs = function() { + $.each(elements.sectionHeaders, function ( i, elm ) { + var item = $( elm ); + var title = item.find( 'h4' ).text(); + var settingsClasses = item.parents( 'div' )[0].className; + + elements.tabItems.append( + $( '
  • ' + title + '
  • ' ).addClass( settingsClasses ).removeClass( 'pronamic-pay-tab' ) + ); + } ); + + // Move tab items list after 'Mode' setting + elements.tabItems.next().after( elements.tabItems ); + + elements.tabItems.find( 'li' ).click( obj.showTabSettings ); + }; + + this.showTabSettings = function() { + var tabItem = $( this ); + + // Show tab + elements.extraSettings.hide().eq( tabItem.index() ).show(); + }; + + /** + * Function calls + */ + var update_meta_boxes = function () { + $.ajax( { + url: pronamicPayGatewayAdmin.rest_url, + method: 'GET', + beforeSend: function ( xhr ) { + xhr.setRequestHeader( 'X-WP-Nonce', pronamicPayGatewayAdmin.nonce ); + }, + data: { + 'gateway_id': $( '#pronamic_gateway_id' ).val(), + 'gateway_mode': $( '#pronamic_ideal_mode' ).val() + } + } ).done( function ( response ) { + $( '#pronamic-pay-gateway-settings' ).html( response.meta_boxes.settings ); + + $( '#pronamic-pay-gateway-settings .pronamic-pay-tabs' ).pronamicPayTabs(); + + // Tooltip + $( '#pronamic-pay-gateway-settings .pronamic-pay-tip' ).each( function () { + tippy( this, { + content: $( this ).attr( 'title' ), + arrow: true, + theme: 'pronamic-pay' + } ); + } ); + } ); + }; + + $( '#pronamic_gateway_id' ).change( update_meta_boxes ); + $( '#pronamic_ideal_mode' ).change( update_meta_boxes ); + + obj.initTabs(); + + obj.updateFields(); + + elements.variantId.change( obj.updateFields ); + }; + + /** + * jQuery plugin - Pronamic iDEAL config editor + */ + $.fn.pronamicPayGatewayConfigEditor = function() { + return this.each( function() { + var $this = $( this ); + + if ( $this.data( 'pronamic-pay-gateway-config-editor' ) ) { + return; + } + + var editor = new PronamicPayGatewayConfigEditor( this ); + + $this.data( 'pronamic-pay-gateway-config-editor', editor ); + } ); + }; + + /** + * Pronamic Pay Tabs + */ + var PronamicPayTabs = function( element ) { + var obj = this; + var $element = $( element ); + + // Elements + var elements = {}; + elements.tabItems = $element.find( 'ul.pronamic-pay-tabs-items' ); + elements.tabs = $element.find( '.pronamic-pay-tab' ); + elements.tabItems = $element.find( 'ul.pronamic-pay-tabs-items' ); + + // Update row background color + this.updateRowBackgroundColor = function() { + // Set background color of visible even rows + var rows = elements.tabs.find( '.form-table tr' ); + + rows.removeClass( 'even' ); + rows.filter( ':visible:even' ).addClass( 'even' ); + }; + + /** + * Tabs + */ + this.showTab = function( ) { + var tabItem = $( this ); + + elements.tabItems.find( 'li' ).removeClass( 'active' ); + + tabItem.addClass( 'active' ); + + // Show tab + elements.tabs.hide().eq( tabItem.index() ).show(); + + obj.updateRowBackgroundColor(); + + obj.visibleTabItems = elements.tabItems.find( 'li:visible' ); + + obj.activeTabItem = tabItem; + }; + + this.responsiveTabs = function() { + if ( $( window ).width() > 960 ) { + elements.tabs.hide(); + + if ( obj.activeTabItem ) { + // Activate last active tab + obj.activeTabItem.click(); + } else { + // Make first tab active + elements.tabItems.find( 'li:visible' ).first().click(); + } + } else { + if ( ! obj.visibleTabItems ) { + return; + } + + elements.tabs.hide(); + + $.each( obj.visibleTabItems, function( index, tabItem ) { + elements.tabs.eq( $( tabItem ).index() ).show(); + } ); + } + }; + + /** + * Function calls + */ + elements.tabItems.find( 'li' ).click( obj.showTab ); + + // Make first tab active + elements.tabItems.find( 'li:visible' ).first().click(); + + $( window ).resize( obj.responsiveTabs ); + }; + + /** + * jQuery plugin - Pronamic Pay Tabs + */ + $.fn.pronamicPayTabs = function() { + return this.each( function() { + var $this = $( this ); + + if ( $this.data( 'pronamic-pay-tabs' ) ) { + return; + } + + var tabs = new PronamicPayTabs( this ); + + $this.data( 'pronamic-pay-tabs', tabs ); + } ); + }; + + /** + * Pronamic pay gateway test + */ + var PronamicPayGatewayTest = function( element ) { + var obj = this; + var $element = $( element ); + + // Elements + var elements = {}; + elements.paymentMethods = $element.find( 'select[name="pronamic_pay_test_payment_method"]' ); + + /** + * Update input visibility + */ + this.updateInputVisibility = function() { + var method = elements.paymentMethods.val(); + + if ( '' !== method ) { + $element.find( '.pronamic-pay-test-payment-method' ).hide().filter( '.' + method ).show(); + } + + // Hide subscription options for unsupported payment methods. + if ( 1 === elements.paymentMethods.find( 'option:selected' ).data( 'is-recurring' ) ) { + $( '#pronamic-pay-test-subscription' ).parents( 'tr' ).show(); + } else { + $( '#pronamic-pay-test-subscription' ).parents( 'tr' ).hide(); + $( '#pronamic-pay-test-subscription' ).prop( 'checked', false ).trigger( 'change' ); + } + }; + + // Function calls + obj.updateInputVisibility(); + + elements.paymentMethods.change( obj.updateInputVisibility ); + + $element.on( 'keydown', 'input, select', function( e ) { + if ( 13 === e.keyCode) { + e.preventDefault(); + + $element.find('input[name="test_pay_gateway"]').click(); + } + }); + }; + + /** + * jQuery plugin - Pronamic pay gateway test + */ + $.fn.pronamicPayGatewayTest = function() { + return this.each( function() { + var $this = $( this ); + + if ( $this.data( 'pronamic-pay-gateway-test' ) ) { + return; + } + + var gatewayTest = new PronamicPayGatewayTest( this ); + + $this.data( 'pronamic-pay-gateway-test', gatewayTest ); + } ); + }; + + /** + * Pronamic iDEAL pay form options + */ + var PronamicPayFormOptions = function( element ) { + var obj = this; + var $element = $( element ); + + // Elements + var elements = {}; + elements.amountMethod = $element.find( 'select[name="_pronamic_payment_form_amount_method"]' ); + + /** + * Update amounts visibility + */ + this.updateAmountsVisibility = function() { + var method = elements.amountMethod.val(); + + if ( method === 'choices_only' || method === 'choices_and_input' ) { + $element.find('input[name="_pronamic_payment_form_amount_choices\[\]"]').closest('div').show(); + } else { + $element.find('input[name="_pronamic_payment_form_amount_choices\[\]"]').closest('div').hide(); + } + }; + + /** + * Maybe add an empty amount field + */ + this.maybeAddAmountChoice = function() { + elements.amountChoices = $element.find( 'input[name="_pronamic_payment_form_amount_choices\[\]"]' ); + var emptyChoices = elements.amountChoices.filter( function() { return this.value === ''; } ); + + if ( emptyChoices.length === 0 ) { + var lastChoice = elements.amountChoices.last().closest( 'div' ); + var newChoice = lastChoice.clone(); + var choiceId = '_pronamic_payment_form_amount_choice_' + elements.amountChoices.length; + + newChoice.find( 'input' ).attr( 'id', choiceId ).val( '' ); + newChoice.find( 'label' ).attr( 'for', choiceId ); + + lastChoice.after( newChoice ); + } + }; + + // Function calls + obj.updateAmountsVisibility(); + + elements.amountMethod.change( obj.updateAmountsVisibility ); + + $element.on( 'keyup', 'input[name="_pronamic_payment_form_amount_choices\[\]"]', function() { + obj.maybeAddAmountChoice(); + }); + }; + + /** + * jQuery plugin - Pronamic iDEAL form options + */ + $.fn.pronamicPayFormOptions = function() { + return this.each( function() { + var $this = $( this ); + + if ( $this.data( 'pronamic-pay-forms-options' ) ) { + return; + } + + var formOptions = new PronamicPayFormOptions( this ); + + $this.data( 'pronamic-pay-form-options', formOptions ); + } ); + }; + + /** + * Ready + */ + $( document ).ready( function() { + $( '#pronamic-pay-gateway-config-editor' ).pronamicPayGatewayConfigEditor(); + $( '#pronamic_payment_form_options').pronamicPayFormOptions(); + $( '#pronamic_gateway_test').pronamicPayGatewayTest(); + $( '.pronamic-pay-tabs' ).pronamicPayTabs(); + + // Tooltip + $( '.pronamic-pay-tip' ).each( function() { + tippy( this, { + content: $( this ).attr( 'title' ), + arrow: true, + theme: 'pronamic-pay' + } ); + } ); + } ); +} )( jQuery ); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin.min.js new file mode 100644 index 00000000..987b3627 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/admin.min.js @@ -0,0 +1 @@ +!function(t){var a=function(a){var i=this,e=t(a),n={};n.variantId=e.find("#pronamic_gateway_id"),n.extraSettings=e.find("div.extra-settings"),n.sectionHeaders=e.find(".gateway-config-section-header"),n.tabs=e.find(".pronamic-pay-tabs"),n.tabItems=e.find("ul.pronamic-pay-tabs-items"),this.updateFields=function(){i.selectedVariant=n.variantId.find("option:selected"),i.settings=i.selectedVariant.data("pronamic-pay-settings"),e.find(".extra-settings").hide(),i.settingElements=[],t.isArray(i.settings)&&t.each(i.settings,(function(t,a){e.find(".setting-"+a).show()})),e.find(".setting-"+i.selectedVariant.val()).show();var a=i.selectedVariant.text().split(" - ")[0].replace(/ \(.*\)/,"");n.tabItems.find(":visible").first().text(a).click(),t("#pronamic-pay-gateway-description").html(i.selectedVariant.attr("data-gateway-description"))},this.updateRowBackgroundColor=function(){var t=n.extraSettings.find(".form-table tr");t.removeClass("even"),t.filter(":visible:even").addClass("even")},this.initTabs=function(){t.each(n.sectionHeaders,(function(a,i){var e=t(i),s=e.find("h4").text(),o=e.parents("div")[0].className;n.tabItems.append(t("
  • "+s+"
  • ").addClass(o).removeClass("pronamic-pay-tab"))})),n.tabItems.next().after(n.tabItems),n.tabItems.find("li").click(i.showTabSettings)},this.showTabSettings=function(){var a=t(this);n.extraSettings.hide().eq(a.index()).show()};var s=function(){t.ajax({url:pronamicPayGatewayAdmin.rest_url,method:"GET",beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",pronamicPayGatewayAdmin.nonce)},data:{gateway_id:t("#pronamic_gateway_id").val(),gateway_mode:t("#pronamic_ideal_mode").val()}}).done((function(a){t("#pronamic-pay-gateway-settings").html(a.meta_boxes.settings),t("#pronamic-pay-gateway-settings .pronamic-pay-tabs").pronamicPayTabs(),t("#pronamic-pay-gateway-settings .pronamic-pay-tip").each((function(){tippy(this,{content:t(this).attr("title"),arrow:!0,theme:"pronamic-pay"})}))}))};t("#pronamic_gateway_id").change(s),t("#pronamic_ideal_mode").change(s),i.initTabs(),i.updateFields(),n.variantId.change(i.updateFields)};t.fn.pronamicPayGatewayConfigEditor=function(){return this.each((function(){var i=t(this);if(!i.data("pronamic-pay-gateway-config-editor")){var e=new a(this);i.data("pronamic-pay-gateway-config-editor",e)}}))};var i=function(a){var i=this,e=t(a),n={};n.tabItems=e.find("ul.pronamic-pay-tabs-items"),n.tabs=e.find(".pronamic-pay-tab"),n.tabItems=e.find("ul.pronamic-pay-tabs-items"),this.updateRowBackgroundColor=function(){var t=n.tabs.find(".form-table tr");t.removeClass("even"),t.filter(":visible:even").addClass("even")},this.showTab=function(){var a=t(this);n.tabItems.find("li").removeClass("active"),a.addClass("active"),n.tabs.hide().eq(a.index()).show(),i.updateRowBackgroundColor(),i.visibleTabItems=n.tabItems.find("li:visible"),i.activeTabItem=a},this.responsiveTabs=function(){if(t(window).width()>960)n.tabs.hide(),i.activeTabItem?i.activeTabItem.click():n.tabItems.find("li:visible").first().click();else{if(!i.visibleTabItems)return;n.tabs.hide(),t.each(i.visibleTabItems,(function(a,i){n.tabs.eq(t(i).index()).show()}))}},n.tabItems.find("li").click(i.showTab),n.tabItems.find("li:visible").first().click(),t(window).resize(i.responsiveTabs)};t.fn.pronamicPayTabs=function(){return this.each((function(){var a=t(this);if(!a.data("pronamic-pay-tabs")){var e=new i(this);a.data("pronamic-pay-tabs",e)}}))};var e=function(a){var i=t(a),e={};e.paymentMethods=i.find('select[name="pronamic_pay_test_payment_method"]'),this.updateInputVisibility=function(){var a=e.paymentMethods.val();""!==a&&i.find(".pronamic-pay-test-payment-method").hide().filter("."+a).show(),1===e.paymentMethods.find("option:selected").data("is-recurring")?t("#pronamic-pay-test-subscription").parents("tr").show():(t("#pronamic-pay-test-subscription").parents("tr").hide(),t("#pronamic-pay-test-subscription").prop("checked",!1).trigger("change"))},this.updateInputVisibility(),e.paymentMethods.change(this.updateInputVisibility),i.on("keydown","input, select",(function(t){13===t.keyCode&&(t.preventDefault(),i.find('input[name="test_pay_gateway"]').click())}))};t.fn.pronamicPayGatewayTest=function(){return this.each((function(){var a=t(this);if(!a.data("pronamic-pay-gateway-test")){var i=new e(this);a.data("pronamic-pay-gateway-test",i)}}))};var n=function(a){var i=this,e=t(a),n={};n.amountMethod=e.find('select[name="_pronamic_payment_form_amount_method"]'),this.updateAmountsVisibility=function(){var t=n.amountMethod.val();"choices_only"===t||"choices_and_input"===t?e.find('input[name="_pronamic_payment_form_amount_choices[]"]').closest("div").show():e.find('input[name="_pronamic_payment_form_amount_choices[]"]').closest("div").hide()},this.maybeAddAmountChoice=function(){if(n.amountChoices=e.find('input[name="_pronamic_payment_form_amount_choices[]"]'),0===n.amountChoices.filter((function(){return""===this.value})).length){var t=n.amountChoices.last().closest("div"),a=t.clone(),i="_pronamic_payment_form_amount_choice_"+n.amountChoices.length;a.find("input").attr("id",i).val(""),a.find("label").attr("for",i),t.after(a)}},i.updateAmountsVisibility(),n.amountMethod.change(i.updateAmountsVisibility),e.on("keyup",'input[name="_pronamic_payment_form_amount_choices[]"]',(function(){i.maybeAddAmountChoice()}))};t.fn.pronamicPayFormOptions=function(){return this.each((function(){var a=t(this);if(!a.data("pronamic-pay-forms-options")){var i=new n(this);a.data("pronamic-pay-form-options",i)}}))},t(document).ready((function(){t("#pronamic-pay-gateway-config-editor").pronamicPayGatewayConfigEditor(),t("#pronamic_payment_form_options").pronamicPayFormOptions(),t("#pronamic_gateway_test").pronamicPayGatewayTest(),t(".pronamic-pay-tabs").pronamicPayTabs(),t(".pronamic-pay-tip").each((function(){tippy(this,{content:t(this).attr("title"),arrow:!0,theme:"pronamic-pay"})}))}))}(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/block-payment-form.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/block-payment-form.js new file mode 100644 index 00000000..249b19d6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/block-payment-form.js @@ -0,0 +1,104 @@ +/* globals pronamic_payment_form */ +( function ( blocks, components, editor, element ) { + var el = element.createElement; + var Fragment = element.Fragment; + var InspectorControls = editor.InspectorControls; + var Button = components.Button; + var Placeholder = components.Placeholder; + var TextControl = components.TextControl; + var ServerSideRender = components.ServerSideRender; + + /** + * Register payment form block type. + * + * @param string name Block name. + * @param object settings Block settings. + * + * @return WPBlock Block if registered successfully, otherwise "undefined". + */ + blocks.registerBlockType( 'pronamic-pay/payment-form', { + title: pronamic_payment_form.title, + icon: 'money', + category: 'pronamic-pay', + + // Attributes. + attributes: { + amount: { + type: 'string' + } + }, + + // Feature supports. + supports: { + // Remove support for an HTML mode. + html: false + }, + + // Edit. + edit: function ( props ) { + var amount = props.attributes.amount; + var hasSettingsSet = props.attributes && parseInt( amount ) > 0; + + function onChangeAmount( updatedAmount ) { + props.setAttributes( { amount: updatedAmount } ); + } + + return el( Fragment, null, + + // Inspector controls. + el( InspectorControls, null, + el( Fragment, null, + el( TextControl, { + label: pronamic_payment_form.label_amount, + value: amount, + onChange: onChangeAmount + } ) + ) + ), + + // Setup required props. + ! hasSettingsSet && + el( Placeholder, { + label: pronamic_payment_form.title, + icon: 'money' + }, + el( Fragment, null, + el( TextControl, { + label: pronamic_payment_form.label_amount, + onChange: function ( value ) { + }, + onBlur: function () { + onChangeAmount( event.target.value ); + } + } ), + el( 'div', + { + style: { width: '100%' } + }, + el( Button, + { isPrimary: true }, + el( Fragment, null, pronamic_payment_form.label_add_form ) + ) + ) + ) + ), + + // Server side render. + hasSettingsSet && el( ServerSideRender, { + block: 'pronamic-pay/payment-form', + attributes: props.attributes + } ) + ); + }, + + // Save. + save: function () { + return null; + } + } ); +} )( + window.wp.blocks, + window.wp.components, + window.wp.editor, + window.wp.element +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/block-payment-form.min.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/block-payment-form.min.js new file mode 100644 index 00000000..77e61a25 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/js/dist/block-payment-form.min.js @@ -0,0 +1 @@ +!function(t,n,e,o){var a=o.createElement,r=o.Fragment,l=e.InspectorControls,i=n.Button,m=n.Placeholder,u=n.TextControl,p=n.ServerSideRender;t.registerBlockType("pronamic-pay/payment-form",{title:pronamic_payment_form.title,icon:"money",category:"pronamic-pay",attributes:{amount:{type:"string"}},supports:{html:!1},edit:function(t){var n=t.attributes.amount,e=t.attributes&&parseInt(n)>0;function o(n){t.setAttributes({amount:n})}return a(r,null,a(l,null,a(r,null,a(u,{label:pronamic_payment_form.label_amount,value:n,onChange:o}))),!e&&a(m,{label:pronamic_payment_form.title,icon:"money"},a(r,null,a(u,{label:pronamic_payment_form.label_amount,onChange:function(t){},onBlur:function(){o(event.target.value)}}),a("div",{style:{width:"100%"}},a(i,{isPrimary:!0},a(r,null,pronamic_payment_form.label_add_form))))),e&&a(p,{block:"pronamic-pay/payment-form",attributes:t.attributes}))},save:function(){return null}})}(window.wp.blocks,window.wp.components,window.wp.editor,window.wp.element); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractDataStoreCPT.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractDataStoreCPT.php new file mode 100644 index 00000000..4eee6c69 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractDataStoreCPT.php @@ -0,0 +1,248 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay; + +use Exception; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; + +/** + * Abstract Data Store Custom Post Type + * + * @link https://woocommerce.com/2017/04/woocommerce-3-0-release/ + * @link https://woocommerce.wordpress.com/2016/10/27/the-new-crud-classes-in-woocommerce-2-7/ + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.0 + */ +abstract class AbstractDataStoreCPT { + /** + * Registered meta keys. + * + * @var array + */ + protected $meta = array(); + + /** + * Meta key prefix. + * + * @var string + */ + public $meta_key_prefix = ''; + + /** + * Register meta keys. + * + * @param string $meta_key Meta key to register. + * @param array $args Settings for meta key. + * + * @return void + */ + protected function register_meta_key( $meta_key, $args ) { + $this->meta[ $meta_key ] = $args; + } + + /** + * Get registered meta. + * + * @return array + */ + public function get_registered_meta() { + return $this->meta; + } + + /** + * Get a prefixed meta key for the specified key. + * + * @param string $key A key. + * @return string + */ + private function get_meta_key( $key ) { + return $this->meta_key_prefix . $key; + } + + /** + * Get MySQL UTC datetime of the specified date. + * + * @param \DateTimeInterface $date The date. + * @return string + */ + protected function get_mysql_utc_date( \DateTimeInterface $date ) { + $date = clone $date; + + if ( \method_exists( $date, 'setTimezone' ) ) { + $date = $date->setTimezone( new DateTimeZone( 'UTC' ) ); + } + + return $date->format( DateTime::MYSQL ); + } + + /** + * Get meta for the specified post ID and key. + * + * @param int $id Post ID. + * @param string $key Key. + * @return string|null|false + */ + public function get_meta( $id, $key ) { + $meta_key = $this->get_meta_key( $key ); + + $value = get_post_meta( $id, $meta_key, true ); + + if ( '' === $value ) { + return null; + } + + return $value; + } + + /** + * Get date from meta. + * + * @param int $id Post ID. + * @param string $key Key. + * + * @return DateTime|null + */ + public function get_meta_date( $id, $key ) { + $value = $this->get_meta( $id, $key ); + + if ( empty( $value ) ) { + return null; + } + + try { + $date = new DateTime( $value, new DateTimeZone( 'UTC' ) ); + } catch ( Exception $e ) { + $date = null; + } + + return $date; + } + + /** + * Get string from meta. + * + * @param int $id Post ID. + * @param string $key Key. + * + * @return string|null + */ + public function get_meta_string( $id, $key ) { + $value = $this->get_meta( $id, $key ); + + if ( empty( $value ) ) { + return null; + } + + return strval( $value ); + } + + /** + * Get int from meta. + * + * @param int $id Post ID. + * @param string $key Key. + * + * @return int|null + */ + public function get_meta_int( $id, $key ) { + $value = $this->get_meta( $id, $key ); + + if ( empty( $value ) ) { + return null; + } + + return intval( $value ); + } + + /** + * Get bool from meta. + * + * Please note: + * + * ``` + * update_post_meta( 1, '_test_bool', false ); + * $test = get_post_meta( 1, 'test_bool', true ); + * var_dump( $test ); + * // string(0) "" + * ``` + * + * ``` + * delete_post_meta( 1, '_test_bool' ); + * $test = get_post_meta( 1, 'test_bool', true ); + * var_dump( $test ); + * // string(0) "" + * ``` + * + * ``` + * delete_post_meta( 1, '_test_bool' ); + * $test = get_post_meta( 1, 'test_bool' ); + * var_dump( $test ); + * // array(0) { } + * ``` + * + * ``` + * update_post_meta( 1, '_test_bool', true ); + * $test = get_post_meta( 1, 'test_bool' ); + * var_dump( $test ); + * // array(1) { [0]=> string(0) "" } + * ``` + * + * @param int $id Post ID. + * @param string $key Key. + * + * @return bool|null + */ + public function get_meta_bool( $id, $key ) { + $meta_key = $this->get_meta_key( $key ); + + $value = get_post_meta( $id, $meta_key ); + + if ( empty( $value ) ) { + return null; + } + + $value = get_post_meta( $id, $meta_key, true ); + + return boolval( $value ); + } + + /** + * Update meta. + * + * @param int $id Post ID. + * @param string $key Key. + * @param mixed $value Value. + * @return int|bool + */ + public function update_meta( $id, $key, $value ) { + if ( empty( $value ) ) { + return false; + } + + if ( $value instanceof \DateTimeInterface ) { + $value = $this->get_mysql_utc_date( $value ); + } + + // Use non-locale aware float value. + // @link http://php.net/sprintf. + if ( is_float( $value ) ) { + $value = sprintf( '%F', $value ); + } + + $meta_key = $this->get_meta_key( $key ); + + $result = update_post_meta( $id, $meta_key, $value ); + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractGatewayIntegration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractGatewayIntegration.php new file mode 100644 index 00000000..c0426ce2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractGatewayIntegration.php @@ -0,0 +1,265 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Common + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\GatewayConfig; + +/** + * Title: Abstract gateway integration + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.5.1 + * @since 1.0.0 + * @link https://github.com/thephpleague/omnipay-common/blob/master/src/Omnipay/Common/AbstractGateway.php + */ +abstract class AbstractGatewayIntegration extends AbstractIntegration { + /** + * URL. + * + * @var string + */ + public $url; + + /** + * Product URL. + * + * @var string + */ + public $product_url; + + /** + * Manual URL. + * + * @var string|null + */ + private $manual_url; + + /** + * Dashboard URL. + * + * @var string|array + */ + public $dashboard_url; + + /** + * Provider. + * + * @var string + */ + public $provider; + + /** + * Supported features. + * + * @var array + */ + protected $supports = array(); + + /** + * Construct. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'provider' => null, + 'url' => null, + 'product_url' => null, + 'dashboard_url' => array(), + 'manual_url' => null, + 'supports' => array(), + ) + ); + + parent::__construct( $args ); + + // Provider. + $this->provider = $args['provider']; + + // URL's. + $this->url = $args['url']; + $this->product_url = $args['product_url']; + $this->dashboard_url = $args['dashboard_url']; + $this->manual_url = $args['manual_url']; + + // Supports. + $this->supports = $args['supports']; + } + + /** + * Get provider. + * + * @return string + */ + public function get_provider() { + return $this->provider; + } + + /** + * Get required settings for this integration. + * + * @link https://github.com/wp-premium/gravityforms/blob/1.9.16/includes/fields/class-gf-field-multiselect.php#L21-L42 + * @return array + */ + public function get_settings() { + return array(); + } + + /** + * Get settings fields. + * + * @return array + */ + public function get_settings_fields() { + return array(); + } + + /** + * Get dashboard URL. + * + * @return array + */ + public function get_dashboard_url() { + $url = array(); + + if ( isset( $this->dashboard_url ) ) { + if ( is_string( $this->dashboard_url ) ) { + $url = array( $this->dashboard_url ); + } elseif ( is_array( $this->dashboard_url ) ) { + $url = $this->dashboard_url; + } + } + + return $url; + } + + /** + * Get product URL. + * + * @return string|null + */ + public function get_product_url() { + $url = null; + + if ( isset( $this->product_url ) ) { + $url = $this->product_url; + } elseif ( isset( $this->url ) ) { + $url = $this->url; + } + + return $url; + } + + /** + * Get manual URL. + * + * @return string|null + */ + public function get_manual_url() { + return $this->manual_url; + } + + /** + * Set manual URL. + * + * @param string|null $manual_url Manual URL. + * @return void + */ + public function set_manual_url( $manual_url ) { + $this->manual_url = $manual_url; + } + + /** + * Get provider URL. + * + * @return string|false + */ + public function get_url() { + return $this->url; + } + + /** + * Check if this intengration supports a given feature. + * + * @param string $feature The feature to check. + * @return bool True if supported, false otherwise. + */ + public function supports( $feature ) { + return in_array( $feature, $this->supports, true ); + } + + /** + * Get meta value. + * + * @since 2.0.8 + * + * @param string|int $post_id Post ID. + * @param string $key Shortened meta key. + * + * @return string + */ + protected function get_meta( $post_id, $key ) { + if ( empty( $post_id ) || empty( $key ) ) { + return ''; + } + + $post_id = intval( $post_id ); + + $meta_key = sprintf( '_pronamic_gateway_%s', $key ); + + // Get post meta. + $meta_value = get_post_meta( $post_id, $meta_key, true ); + + if ( false === $meta_value ) { + $meta_value = ''; + } + + return $meta_value; + } + + /** + * Get config by post ID. + * + * @param int $post_id Post ID. + * + * @return GatewayConfig|null + */ + public function get_config( $post_id ) { + return null; + } + + /** + * Get gateway. + * + * @param int $post_id Post ID. + * + * @return Gateway|null + */ + public function get_gateway( $post_id ) { + return null; + } + + /** + * Save post. + * + * @param int $post_id Post ID. + * @return void + */ + public function save_post( $post_id ) { + + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractIntegration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractIntegration.php new file mode 100644 index 00000000..bb07d306 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractIntegration.php @@ -0,0 +1,303 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Common + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\Pay\Dependencies\Dependencies; +use Pronamic\WordPress\Pay\Upgrades\Upgrades; + +/** + * Title: Abstract integration + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + * @link https://github.com/thephpleague/omnipay-common/blob/master/src/Omnipay/Common/AbstractGateway.php + */ +abstract class AbstractIntegration { + /** + * ID. + * + * @var string|null + */ + public $id; + + /** + * Name. + * + * @var string|null + */ + public $name; + + /** + * Version. + * + * @var string|null + */ + private $version; + + /** + * Deprecated boolean flag to mark an integration as deprecated. + * + * @var boolean + */ + public $deprecated; + + /** + * Dependencies. + * + * @var Dependencies + */ + private $dependencies; + + /** + * Upgrades. + * + * @var Upgrades + */ + private $upgrades; + + /** + * The name of the option we store the version of the integration in. + * + * @link https://github.com/WordPress/WordPress/search?q=option_name&unscoped_q=option_name + * @var string|null + */ + private $version_option_name; + + /** + * Data version option nane. + * + * @var string|null + */ + private $db_version_option_name; + + /** + * Construct. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'id' => null, + 'name' => null, + 'version' => null, + 'version_option_name' => null, + 'db_version_option_name' => null, + 'deprecated' => false, + ) + ); + + // ID. + $this->set_id( $args['id'] ); + + // Name. + $this->set_name( $args['name'] ); + + // Version. + $this->set_version( $args['version'] ); + + // Version option name. + $this->set_version_option_name( $args['version_option_name'] ); + + // Database version option name. + $this->set_db_version_option_name( $args['db_version_option_name'] ); + + // Deprecated. + $this->deprecated = $args['deprecated']; + + // Dependencies. + $this->dependencies = new Dependencies(); + + // Upgrades. + $this->upgrades = new Upgrades(); + } + + /** + * Get ID. + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set ID. + * + * @param string|null $id ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get version. + * + * @return string|null + */ + public function get_version() { + return $this->version; + } + + /** + * Set version. + * + * @param string|null $version Version. + * @return void + */ + public function set_version( $version ) { + $this->version = $version; + } + + /** + * Get the dependencies of this plugin integration. + * + * @return Dependencies + */ + public function get_dependencies() { + return $this->dependencies; + } + + /** + * Is active. + * + * @return bool True if dependencies are met, false othwerise. + */ + public function is_active() { + return $this->dependencies->are_met(); + } + + /** + * Setup integration. + * Called from `plugins_loaded` with priority `0`, intended to be overridden. + * + * @see Plugin::plugins_loaded() + * @return void + */ + public function setup() { + } + + /** + * Get version option name. + * + * @return string|null + */ + public function get_version_option_name() { + return $this->version_option_name; + } + + /** + * Set version option name. + * + * @param string $option_name Option name. + * @return void + */ + public function set_version_option_name( $option_name ) { + $this->version_option_name = $option_name; + } + + /** + * Get version option. + * + * @return string|null + */ + public function get_version_option() { + if ( null === $this->version_option_name ) { + return null; + } + + return \get_option( $this->version_option_name ); + } + + /** + * Update database version option. + * + * @link https://github.com/woocommerce/woocommerce/blob/4.0.0/includes/class-wc-install.php#L396-L402 + * @return void + */ + public function update_version_option() { + if ( null === $this->version_option_name ) { + return; + } + + if ( null === $this->version ) { + return; + } + + \update_option( $this->version_option_name, $this->version ); + } + + /** + * Get database version option name. + * + * @return string|null + */ + public function get_db_version_option_name() { + return $this->db_version_option_name; + } + + /** + * Set database version option name. + * + * @param string $option_name Option name. + * @return void + */ + public function set_db_version_option_name( $option_name ) { + $this->db_version_option_name = $option_name; + } + + /** + * Get database version option. + * + * @return string|null + */ + public function get_db_version_option() { + if ( null === $this->db_version_option_name ) { + return null; + } + + return \get_option( $this->db_version_option_name ); + } + + /** + * Get upgrades. + * + * @return Upgrades + */ + public function get_upgrades() { + return $this->upgrades; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractPluginIntegration.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractPluginIntegration.php new file mode 100644 index 00000000..1f2de90c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AbstractPluginIntegration.php @@ -0,0 +1,29 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Gateways\Common + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\Pay\Dependencies\Dependencies; +use Pronamic\WordPress\Pay\Upgrades\Upgrades; + +/** + * Title: Abstract plugin integration + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + * @link https://github.com/thephpleague/omnipay-common/blob/master/src/Omnipay/Common/AbstractGateway.php + */ +abstract class AbstractPluginIntegration extends AbstractIntegration { + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Address.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Address.php new file mode 100644 index 00000000..8ee555c9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Address.php @@ -0,0 +1,646 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use stdClass; + +/** + * Address + * + * @link https://en.wikipedia.org/wiki/HTML_element#address + * @link https://en.wikipedia.org/wiki/Address_(geography) + * @link https://tools.ietf.org/html/rfc6350#section-6.3.1 + * @link https://schema.org/PostalAddress + * @link https://github.com/wp-premium/gravityforms/blob/2.3.2/includes/fields/class-gf-field-address.php + * @link https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_address.htm + * @link https://c3.twinfield.com/webservices/documentation/#/ApiReference/Masters/Suppliers#Create-Update-Delete + * @link https://github.com/wp-pay-gateways/omnikassa-2/blob/develop/src/Address.php + * @link https://docs.adyen.com/developers/api-reference/common-api#address + * @link https://developer.paypal.com/docs/api/payments/v1/#definition-address + * @link https://docs.mollie.com/reference/v2/payments-api/create-payment + * @link https://epayments-api.developer-ingenico.com/s2sapi/v1/en_US/java/payments/create.html#payments-create-payload + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.1.0 + */ +class Address { + /** + * Contact name. + * + * @var ContactName|null + */ + private $name; + + /** + * Email address. + * + * @var string|null + */ + private $email; + + /** + * Company name. + * + * @var string|null + */ + private $company_name; + + /** + * Chamber of Commerce registration number. + * + * @var string|null + */ + private $coc_number; + + /** + * Address line 1. + * + * @var string|null + */ + private $line_1; + + /** + * Address line 2. + * + * @var string|null + */ + private $line_2; + + /** + * Street name. + * + * @var string|null + */ + private $street_name; + + /** + * House number. + * + * @var HouseNumber|null + */ + private $house_number; + + /** + * Postal Code. + * + * @var string|null + */ + private $postal_code; + + /** + * City. + * + * @var string|null + */ + private $city; + + /** + * Region. + * + * Alias: `region`, `county`, `state`, `province`, `stateOrProvince`, `stateCode`. + * + * @var Region|null + */ + private $region; + + /** + * Country. + * + * @var Country|null + */ + private $country; + + /** + * Phone. + * + * @var string|null + */ + private $phone; + + /** + * Get contact name. + * + * @return ContactName|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set contact name. + * + * @param ContactName|null $name Contact name. + * @return void + */ + public function set_name( ContactName $name = null ) { + $this->name = $name; + } + + /** + * Get email. + * + * @return string|null + */ + public function get_email() { + return $this->email; + } + + /** + * Set email. + * + * @param string|null $email Email. + * @return void + */ + public function set_email( $email ) { + $this->email = $email; + } + + /** + * Get company name. + * + * @return string|null + */ + public function get_company_name() { + return $this->company_name; + } + + /** + * Set company name. + * + * @param string|null $company_name Company name. + * @return void + */ + public function set_company_name( $company_name ) { + $this->company_name = $company_name; + } + + /** + * Get Kamer van Koophandel number. + * + * @return string|null + */ + public function get_coc_number() { + return $this->coc_number; + } + + /** + * Set Kamer van Koophandel number. + * + * @param string|null $coc_number Kamer van Koophandel number. + * @return void + */ + public function set_coc_number( $coc_number ) { + $this->coc_number = $coc_number; + } + + /** + * Get address line 1. + * + * @return string|null + */ + public function get_line_1() { + return $this->line_1; + } + + /** + * Set address line 1. + * + * @param string|null $line_1 Address 1. + * @return void + */ + public function set_line_1( $line_1 ) { + $this->line_1 = $line_1; + } + + /** + * Get address line 2. + * + * @return string|null + */ + public function get_line_2() { + return $this->line_2; + } + + /** + * Set address line 2. + * + * @param string|null $line_2 Address 2. + * @return void + */ + public function set_line_2( $line_2 ) { + $this->line_2 = $line_2; + } + + /** + * Get street name. + * + * @return string|null + */ + public function get_street_name() { + return $this->street_name; + } + + /** + * Set street name. + * + * @param string|null $street_name Street name. + * @return void + */ + public function set_street_name( $street_name ) { + $this->street_name = $street_name; + } + + /** + * Get house number. + * + * @return HouseNumber|null + */ + public function get_house_number() { + return $this->house_number; + } + + /** + * Set house number. + * + * @param string|HouseNumber|null $house_number House number. + * @return void + */ + public function set_house_number( $house_number ) { + if ( is_string( $house_number ) ) { + $house_number = new HouseNumber( $house_number ); + } + + $this->house_number = $house_number; + } + + /** + * Get house number base. + * + * @return string|null + */ + public function get_house_number_base() { + if ( null === $this->house_number ) { + return null; + } + + return $this->house_number->get_base(); + } + + /** + * Set house number base. + * + * @param string|null $house_number_base House number base. + * @return void + */ + public function set_house_number_base( $house_number_base ) { + if ( null === $this->house_number ) { + $this->house_number = new HouseNumber(); + } + + $this->house_number->set_base( $house_number_base ); + } + + /** + * Get house number addition. + * + * @return string|null + */ + public function get_house_number_addition() { + if ( null === $this->house_number ) { + return null; + } + + return $this->house_number->get_addition(); + } + + /** + * Set house number addition. + * + * @param string|null $house_number_addition House number addition. + * @return void + */ + public function set_house_number_addition( $house_number_addition ) { + if ( null === $this->house_number ) { + $this->house_number = new HouseNumber(); + } + + $this->house_number->set_addition( $house_number_addition ); + } + + /** + * Get postal code. + * + * @return string|null + */ + public function get_postal_code() { + return $this->postal_code; + } + + /** + * Set postal code. + * + * @param string|null $postal_code Postal Code. + * @return void + */ + public function set_postal_code( $postal_code ) { + $this->postal_code = $postal_code; + } + + /** + * Get city. + * + * @return string|null + */ + public function get_city() { + return $this->city; + } + + /** + * Set city. + * + * @param string|null $city City. + * @return void + */ + public function set_city( $city ) { + $this->city = $city; + } + + /** + * Get region. + * + * @return Region|null + */ + public function get_region() { + return $this->region; + } + + /** + * Set region. + * + * @param string|Region|null $region Region. + * @return void + */ + public function set_region( $region ) { + if ( is_string( $region ) ) { + $region = new Region( $region ); + } + + $this->region = $region; + } + + /** + * Get country. + * + * @return Country|null + */ + public function get_country() { + return $this->country; + } + + /** + * Set country. + * + * @param Country|null $country Country. + * @return void + */ + public function set_country( $country ) { + $this->country = $country; + } + + /** + * Get ISO 3166-1 alpha-2 country code. + * + * @return string|null + */ + public function get_country_code() { + if ( null === $this->country ) { + return null; + } + + return $this->country->get_code(); + } + + /** + * Set country code. + * + * @throws InvalidArgumentException Thrown when country code length is not equal to 2. + * + * @param null|string $country_code Country code. + * @return void + */ + public function set_country_code( $country_code ) { + if ( null === $this->country ) { + $this->country = new Country(); + } + + $this->country->set_code( $country_code ); + } + + /** + * Get country name. + * + * @return string|null + */ + public function get_country_name() { + if ( null === $this->country ) { + return null; + } + + return $this->country->get_name(); + } + + /** + * Set country name. + * + * @param string|null $country_name Country name. + * @return void + */ + public function set_country_name( $country_name ) { + if ( null === $this->country ) { + $this->country = new Country(); + } + + $this->country->set_name( $country_name ); + } + + /** + * Get phone. + * + * @return string|null + */ + public function get_phone() { + return $this->phone; + } + + /** + * Set phone. + * + * @param string|null $phone Phone. + * @return void + */ + public function set_phone( $phone ) { + $this->phone = $phone; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'name' => ( null === $this->name ) ? null : $this->name->get_json(), + 'email' => $this->get_email(), + 'company_name' => $this->get_company_name(), + 'coc_number' => $this->get_coc_number(), + 'line_1' => $this->get_line_1(), + 'line_2' => $this->get_line_2(), + 'street_name' => $this->get_street_name(), + 'house_number' => ( null === $this->house_number ) ? null : $this->house_number->get_json(), + 'postal_code' => $this->get_postal_code(), + 'city' => $this->get_city(), + 'region' => ( null === $this->region ) ? null : $this->region->get_json(), + 'country' => ( null === $this->country ) ? null : $this->country->get_json(), + 'phone' => $this->get_phone(), + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create address from object. + * + * @param mixed $json JSON. + * @return Address + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an array.' ); + } + + $address = new self(); + + if ( isset( $json->name ) ) { + $address->set_name( ContactName::from_json( $json->name ) ); + } + + if ( isset( $json->email ) ) { + $address->set_email( $json->email ); + } + + if ( isset( $json->company_name ) ) { + $address->set_company_name( $json->company_name ); + } + + if ( isset( $json->coc_number ) ) { + $address->set_coc_number( $json->coc_number ); + } + + if ( isset( $json->line_1 ) ) { + $address->set_line_1( $json->line_1 ); + } + + if ( isset( $json->line_2 ) ) { + $address->set_line_2( $json->line_2 ); + } + + if ( isset( $json->street_name ) ) { + $address->set_street_name( $json->street_name ); + } + + if ( isset( $json->house_number ) || isset( $json->house_number_base ) || isset( $json->house_number_addition ) ) { + $house_number = new HouseNumber(); + + if ( isset( $json->house_number ) ) { + $house_number = HouseNumber::from_json( $json->house_number ); + } + + if ( isset( $json->house_number_base ) ) { + $house_number->set_base( $json->house_number_base ); + } + + if ( isset( $json->house_number_addition ) ) { + $house_number->set_addition( $json->house_number_addition ); + } + + $address->set_house_number( $house_number ); + } + + if ( isset( $json->postal_code ) ) { + $address->set_postal_code( $json->postal_code ); + } + + if ( isset( $json->city ) ) { + $address->set_city( $json->city ); + } + + if ( isset( $json->region ) ) { + $address->set_region( Region::from_json( $json->region ) ); + } + + if ( isset( $json->country ) || isset( $json->country_code ) || isset( $json->country_name ) ) { + $country = isset( $json->country ) ? Country::from_json( $json->country ) : new Country(); + + if ( isset( $json->country_code ) ) { + $country->set_code( $json->country_code ); + } + + if ( isset( $json->country_name ) ) { + $country->set_name( $json->country_name ); + } + + $address->set_country( $country ); + } + + if ( isset( $json->phone ) ) { + $address->set_phone( $json->phone ); + } + + return $address; + } + + /** + * Create string representation of personal name. + * + * @return string + */ + public function __toString() { + $parts = array( + $this->get_company_name(), + $this->get_name(), + $this->get_line_1(), + $this->get_line_2(), + strval( $this->get_postal_code() ) . ' ' . strval( $this->get_city() ), + $this->get_country_code(), + $this->get_phone(), + $this->get_email(), + ); + + $parts = array_map( 'strval', $parts ); + + $parts = array_map( 'trim', $parts ); + + $parts = array_filter( $parts ); + + $string = implode( PHP_EOL, $parts ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AddressHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AddressHelper.php new file mode 100644 index 00000000..1eab5718 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/AddressHelper.php @@ -0,0 +1,185 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Exception; +use VIISON\AddressSplitter\AddressSplitter; + +/** + * Address helper + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.1.0 + */ +class AddressHelper { + /** + * Complement address. + * + * @param Address $address Address to complement. + * @return void + */ + public static function complement_address( Address $address ) { + // Name. + $name = $address->get_name(); + + if ( null !== $name ) { + ContactNameHelper::complement_name( $name ); + } + + // Address lines. + $line_1 = $address->get_line_1(); + + if ( empty( $line_1 ) ) { + // If address line 1 is empty we can't use it to complement the address. + return; + } + + try { + $parts = AddressSplitter::splitAddress( $line_1 ); + + if ( null === $address->get_street_name() && array_key_exists( 'streetName', $parts ) ) { + $address->set_street_name( $parts['streetName'] ); + } + + if ( null === $address->get_house_number() && array_key_exists( 'houseNumber', $parts ) ) { + $address->set_house_number( $parts['houseNumber'] ); + } + + if ( array_key_exists( 'houseNumberParts', $parts ) ) { + $house_number_parts = $parts['houseNumberParts']; + + if ( null === $address->get_house_number_base() && array_key_exists( 'base', $house_number_parts ) && ! empty( $house_number_parts['base'] ) ) { + $address->set_house_number_base( $house_number_parts['base'] ); + } + + if ( null === $address->get_house_number_addition() && array_key_exists( 'extension', $house_number_parts ) && ! empty( $house_number_parts['extension'] ) ) { + $address->set_house_number_addition( $house_number_parts['extension'] ); + } + } + } catch ( Exception $e ) { + // On exceptions the address wil not be complemented, no problem. + return; + } + } + + /** + * Anonymize address. + * + * @param Address $address Address to complement. + * @return void + */ + public static function anonymize_address( Address $address ) { + $address->set_company_name( PrivacyManager::anonymize_data( 'text', $address->get_company_name() ) ); + $address->set_coc_number( PrivacyManager::anonymize_data( 'text', $address->get_coc_number() ) ); + $address->set_email( PrivacyManager::anonymize_data( 'email_mask', $address->get_email() ) ); + $address->set_line_1( PrivacyManager::anonymize_data( 'text', $address->get_line_1() ) ); + $address->set_line_2( PrivacyManager::anonymize_data( 'text', $address->get_line_2() ) ); + $address->set_street_name( PrivacyManager::anonymize_data( 'text', $address->get_street_name() ) ); + $address->set_postal_code( PrivacyManager::anonymize_data( 'text', $address->get_postal_code() ) ); + $address->set_city( PrivacyManager::anonymize_data( 'text', $address->get_city() ) ); + $address->set_phone( PrivacyManager::anonymize_data( 'phone', $address->get_phone() ) ); + + // Country code only accepts ISO 3166-1 alpha-2 strings and null. + $address->set_country_code( null ); + + // Anonymize house number. + $house_number = $address->get_house_number(); + + if ( null !== $house_number ) { + $house_number->anonymize(); + } + + // Anonymize region. + $region = $address->get_region(); + + if ( null !== $region ) { + $region->anonymize(); + } + + // Anonymize country. + $country = $address->get_country(); + + if ( null !== $country ) { + $country->anonymize(); + } + + // Anonymize name. + $name = $address->get_name(); + + if ( null !== $name ) { + ContactNameHelper::anonymize_name( $name ); + } + } + + /** + * Create an adress from an array. + * + * @param array $data Data. + * @return Address|null + */ + public static function from_array( $data ) { + $data = \array_filter( + $data, + function( $value ) { + return ( null !== $value ) && ( '' !== $value ); + } + ); + + if ( empty( $data ) ) { + return null; + } + + $address = new Address(); + + if ( \array_key_exists( 'name', $data ) ) { + $name = $data['name']; + + if ( $name instanceof ContactName ) { + $address->set_name( $name ); + } + } + + if ( \array_key_exists( 'line_1', $data ) ) { + $address->set_line_1( $data['line_1'] ); + } + + if ( \array_key_exists( 'line_2', $data ) ) { + $address->set_line_2( $data['line_2'] ); + } + + if ( \array_key_exists( 'postal_code', $data ) ) { + $address->set_postal_code( $data['postal_code'] ); + } + + if ( \array_key_exists( 'city', $data ) ) { + $address->set_city( $data['city'] ); + } + + if ( \array_key_exists( 'region', $data ) ) { + $address->set_region( $data['region'] ); + } + + if ( \array_key_exists( 'country_code', $data ) ) { + $address->set_country_code( $data['country_code'] ); + } + + if ( \array_key_exists( 'email', $data ) ) { + $address->set_email( $data['email'] ); + } + + if ( \array_key_exists( 'phone', $data ) ) { + $address->set_phone( $data['phone'] ); + } + + return $address; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminAboutPage.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminAboutPage.php new file mode 100644 index 00000000..9a534e10 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminAboutPage.php @@ -0,0 +1,192 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress admin about + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class AdminAboutPage { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * File. + * + * @var string + */ + private $file; + + /** + * Constructs and initializes admin about page object. + * + * @link https://github.com/WordImpress/Give/blob/1.1/includes/admin/dashboard-widgets.php + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin.php + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin-dashboard.php + * + * @param Plugin $plugin Plugin. + * @param string $file About page file. + */ + public function __construct( Plugin $plugin, $file ) { + $this->plugin = $plugin; + $this->file = $file; + + // Actions. + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + add_action( 'admin_head', array( $this, 'admin_head' ) ); + } + + /** + * Add admin menus/screens. + * + * @return void + */ + public function admin_menu() { + $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING ); + + if ( 'pronamic-pay-about' !== $page ) { + return; + } + + $hook_suffix = add_dashboard_page( + __( 'About Pronamic Pay', 'pronamic_ideal' ), + __( 'Welcome to Pronamic Pay', 'pronamic_ideal' ), + 'manage_options', + $page, + array( $this, 'render_page' ) + ); + + if ( false === $hook_suffix ) { + return; + } + + add_action( 'admin_print_styles-' . $hook_suffix, array( $this, 'admin_css' ) ); + } + + /** + * Admin head. + * + * @return void + */ + public function admin_head() { + remove_submenu_page( 'index.php', 'pronamic-pay-about' ); + } + + /** + * Admin CSS. + * + * @return void + */ + public function admin_css() { + // @link https://github.com/WordPress/WordPress/blob/4.7/wp-includes/default-constants.php#L83-L93. + $min = SCRIPT_DEBUG ? '' : '.min'; + + wp_enqueue_style( + 'proanmic-pay-admin-about', + plugins_url( '../../css/admin-about' . $min . '.css', __FILE__ ), + array(), + $this->plugin->get_version() + ); + } + + /** + * Get file version. + * + * @param string $file Absolute path to the file. + * @return string + * + * @link https://github.com/woocommerce/woocommerce/blob/3.7.0/includes/admin/class-wc-admin-status.php#L144-L176 + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-includes/functions.php#L5546-L5605 + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-includes/functions.php#L5479-L5492 + * @throws \Exception Throws exception when reading file version fails. + */ + private function get_file_version( $file ) { + // We don't need to write to the file, so just open for reading. + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fopen + $fp = \fopen( $file, 'r' ); + + if ( false === $fp ) { + throw new \Exception( + \sprintf( + 'Could not open file to get version: %s.', + $file + ) + ); + } + + // Pull only the first 8kiB of the file in. + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fread + $file_data = \fread( $fp, 8192 ); + + if ( false === $file_data ) { + throw new \Exception( + \sprintf( + 'Could not read file to get version: %s.', + $file + ) + ); + } + + // PHP will close file handle, but we are good citizens. + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose + \fclose( $fp ); + + // Search. + \preg_match( '/^[ \t\/*#@]*@version(?P.*)$/mi', $file_data, $matches ); + + // Version. + $version = ''; + + if ( \array_key_exists( 'version', $matches ) ) { + $version = \trim( $matches['version'] ); + } + + return $version; + } + + /** + * Get file. + * + * @return string + */ + private function get_file() { + return $this->file; + } + + /** + * Get version. + * + * @return string + * + * @throws \Exception Throws exception if file could not be opened or read. + */ + public function get_version() { + return $this->get_file_version( $this->get_file() ); + } + + /** + * Render about page. + * + * @return void + */ + public function render_page() { + include $this->get_file(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminDashboard.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminDashboard.php new file mode 100644 index 00000000..10a78c0d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminDashboard.php @@ -0,0 +1,110 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress admin dashboard + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 3.7.0 + */ +class AdminDashboard { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initializes admin dashboard object. + * + * @link https://github.com/WordImpress/Give/blob/1.1/includes/admin/dashboard-widgets.php + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin.php + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin-dashboard.php + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'wp_dashboard_setup', array( $this, 'setup' ) ); + } + + /** + * Setup. + * + * @link https://developer.wordpress.org/reference/functions/wp_add_dashboard_widget/ + * @return void + */ + public function setup() { + /** + * Currently we only add dashboard widgets if the + * current user can manage options. + */ + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + /** + * The `wp_add_dashboard_widget` function should exist at + * this point. To make tools like Psalm happy we do check + * if the function exists. + */ + if ( ! function_exists( 'wp_add_dashboard_widget' ) ) { + return; + } + + /** + * Ok, add the dashboard widget. + */ + wp_add_dashboard_widget( + 'pronamic_pay_dashboard_status', + __( 'Pronamic Pay Status', 'pronamic_ideal' ), + array( $this, 'status_widget' ) + ); + } + + /** + * Status widget. + * + * @return void + */ + public function status_widget() { + $counts = wp_count_posts( 'pronamic_payment' ); + + $states = array( + /* translators: %s: posts count value */ + 'payment_completed' => __( '%s completed', 'pronamic_ideal' ), + /* translators: %s: posts count value */ + 'payment_pending' => __( '%s pending', 'pronamic_ideal' ), + /* translators: %s: posts count value */ + 'payment_cancelled' => __( '%s cancelled', 'pronamic_ideal' ), + /* translators: %s: posts count value */ + 'payment_failed' => __( '%s failed', 'pronamic_ideal' ), + /* translators: %s: posts count value */ + 'payment_expired' => __( '%s expired', 'pronamic_ideal' ), + ); + + $url = add_query_arg( + array( + 'post_type' => 'pronamic_payment', + ), + admin_url( 'edit.php' ) + ); + + include __DIR__ . '/../../views/widget-payments-status-list.php'; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php new file mode 100644 index 00000000..07ea0ac7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminGatewayPostType.php @@ -0,0 +1,537 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\WebhookManager; +use WP_Post; + +/** + * WordPress admin gateway post type + * + * @author Remco Tolsma + * @version 2.2.6 + * @since ? + */ +class AdminGatewayPostType { + /** + * Post type. + * + * @var string + */ + const POST_TYPE = 'pronamic_gateway'; + + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Admin. + * + * @var AdminModule + */ + private $admin; + + /** + * Constructs and initializes an admin gateway post type object. + * + * @param Plugin $plugin Plugin. + * @param AdminModule $admin Admin Module. + */ + public function __construct( Plugin $plugin, AdminModule $admin ) { + $this->plugin = $plugin; + $this->admin = $admin; + + add_filter( 'manage_edit-' . self::POST_TYPE . '_columns', array( $this, 'edit_columns' ) ); + + add_action( 'manage_' . self::POST_TYPE . '_posts_custom_column', array( $this, 'custom_columns' ), 10, 2 ); + + add_action( 'post_edit_form_tag', array( $this, 'post_edit_form_tag' ) ); + + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) ); + + add_action( 'save_post_' . self::POST_TYPE, array( $this, 'save_post' ) ); + + add_action( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 ); + + add_filter( 'post_updated_messages', array( $this, 'post_updated_messages' ) ); + } + + /** + * Edit columns. + * + * @param array $columns Columns. + * @return array + */ + public function edit_columns( $columns ) { + $columns = array( + 'cb' => '', + 'title' => __( 'Title', 'pronamic_ideal' ), + 'pronamic_gateway_variant' => __( 'Variant', 'pronamic_ideal' ), + 'pronamic_gateway_id' => __( 'ID', 'pronamic_ideal' ), + 'pronamic_gateway_dashboard' => __( 'Dashboard', 'pronamic_ideal' ), + 'date' => __( 'Date', 'pronamic_ideal' ), + ); + + return $columns; + } + + /** + * Custom columns. + * + * @param string $column Column. + * @param int $post_id Post ID. + * @return void + */ + public function custom_columns( $column, $post_id ) { + $id = get_post_meta( $post_id, '_pronamic_gateway_id', true ); + + $integration = $this->plugin->gateway_integrations->get_integration( $id ); + + switch ( $column ) { + case 'pronamic_gateway_variant': + $value = \strval( $id ); + + if ( isset( $integration ) ) { + $name = $integration->get_name(); + + if ( null !== $name ) { + $value = $name; + } + } + + echo \esc_html( $value ); + + break; + case 'pronamic_gateway_id': + $data = array_filter( + array( + get_post_meta( $post_id, '_pronamic_gateway_ems_ecommerce_storename', true ), + get_post_meta( $post_id, '_pronamic_gateway_ideal_merchant_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_buckaroo_website_key', true ), + get_post_meta( $post_id, '_pronamic_gateway_icepay_merchant_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_mollie_partner_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_multisafepay_account_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_pay_nl_service_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_paydutch_username', true ), + get_post_meta( $post_id, '_pronamic_gateway_sisow_merchant_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_targetpay_layoutcode', true ), + get_post_meta( $post_id, '_pronamic_gateway_ogone_psp_id', true ), + get_post_meta( $post_id, '_pronamic_gateway_ogone_user_id', true ), + ) + ); + + $display_value = \implode( ' ', $data ); + + /** + * Filters the gateway configuration display value. + * + * @param string $display_value Display value. + * @param int $post_id Gateway configuration post ID. + */ + $display_value = \apply_filters( 'pronamic_gateway_configuration_display_value', $display_value, $post_id ); + + /** + * Filters the gateway configuration display value. + * + * The dynamic portion of the hook name, `$id`, refers to the gateway ID. + * For example, the gateway ID for Payvision is `payvision`, se the filter + * for that gateway would be: + * `pronamic_gateway_configuration_display_value_payvision` + * + * @param string $display_value Display value. + * @param int $post_id Gateway configuration post ID. + */ + $display_value = \apply_filters( "pronamic_gateway_configuration_display_value_{$id}", $display_value, $post_id ); + + echo \esc_html( $display_value ); + + break; + case 'pronamic_gateway_secret': + $data = array_filter( + array( + get_post_meta( $post_id, '_pronamic_gateway_ideal_basic_hash_key', true ), + get_post_meta( $post_id, '_pronamic_gateway_omnikassa_secret_key', true ), + get_post_meta( $post_id, '_pronamic_gateway_buckaroo_secret_key', true ), + get_post_meta( $post_id, '_pronamic_gateway_icepay_secret_code', true ), + get_post_meta( $post_id, '_pronamic_gateway_sisow_merchant_key', true ), + get_post_meta( $post_id, '_pronamic_gateway_ogone_password', true ), + ) + ); + + echo esc_html( implode( ' ', $data ) ); + + break; + case 'pronamic_gateway_dashboard': + if ( isset( $integration ) ) { + $urls = $integration->get_dashboard_url(); + + // Output. + $content = array(); + + foreach ( $urls as $name => $url ) { + if ( empty( $name ) ) { + $name = __( 'Dashboard', 'pronamic_ideal' ); + } + + $content[] = sprintf( + '%s', + esc_attr( $url ), + esc_html( ucfirst( strval( $name ) ) ) + ); + } + + echo wp_kses( + implode( + ' | ', + $content + ), + array( + 'a' => array( + 'href' => array(), + 'target' => array(), + ), + ) + ); + } + + break; + } + } + + /** + * Display post states. + * + * @param array $post_states Post states. + * @param \WP_Post $post Post. + * + * @return array + */ + public function display_post_states( $post_states, $post ) { + if ( self::POST_TYPE !== get_post_type( $post ) ) { + return $post_states; + } + + if ( intval( get_option( 'pronamic_pay_config_id' ) ) === $post->ID ) { + $post_states['pronamic_pay_config_default'] = __( 'Default', 'pronamic_ideal' ); + } + + return $post_states; + } + + /** + * Post edit form tag. + * + * @link https://github.com/WordPress/WordPress/blob/3.5.1/wp-admin/edit-form-advanced.php#L299 + * @link https://github.com/WordPress/WordPress/blob/3.5.2/wp-admin/edit-form-advanced.php#L299 + * + * @param WP_Post $post Post (only available @since 3.5.2). + * @return void + */ + public function post_edit_form_tag( $post ) { + if ( self::POST_TYPE !== get_post_type( $post ) ) { + return; + } + + echo ' enctype="multipart/form-data"'; + } + + /** + * Add meta boxes. + * + * @param string $post_type Post Type. + * @return void + */ + public function add_meta_boxes( $post_type ) { + if ( self::POST_TYPE !== $post_type ) { + return; + } + + add_meta_box( + 'pronamic_gateway_config', + __( 'Configuration', 'pronamic_ideal' ), + array( $this, 'meta_box_config' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_gateway_test', + __( 'Test', 'pronamic_ideal' ), + array( $this, 'meta_box_test' ), + $post_type, + 'normal', + 'high' + ); + } + + /** + * Pronamic Pay gateway config meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_config( $post ) { + wp_nonce_field( 'pronamic_pay_save_gateway', 'pronamic_pay_nonce' ); + + $gateway = Plugin::get_gateway( $post->ID ); + + include __DIR__ . '/../../views/meta-box-gateway-config.php'; + + wp_localize_script( + 'pronamic-pay-admin', + 'pronamicPayGatewayAdmin', + array( + 'rest_url' => rest_url( 'pronamic-pay/v1/gateways/' . $post->ID ), + 'nonce' => wp_create_nonce( 'wp_rest' ), + ) + ); + } + + /** + * Pronamic Pay gateway payment methods setting. + * + * @param null|Gateway $gateway Gateway. + * @param null|string $gateway_id Gateway ID. + * + * @return void + */ + public static function settings_payment_methods( $gateway, $gateway_id ) { + if ( null === $gateway ) { + return; + } + + // Supported and available payment methods. + $supported = $gateway->get_supported_payment_methods(); + + try { + $available = $gateway->get_transient_available_payment_methods(); + } catch ( \Exception $e ) { + $available = array(); + } + + // Handle methods request support. + $supports_methods_request = false; + + if ( null === $available ) { + $available = array(); + } else { + // Set method request support variable for use in HTML. + $supports_methods_request = true; + } + + $payment_methods = array(); + + foreach ( $supported as $payment_method ) { + $name = PaymentMethods::get_name( $payment_method ); + + $payment_methods[ $payment_method ] = (object) array( + 'id' => $payment_method, + 'name' => $name, + 'available' => in_array( $payment_method, $available, true ), + ); + } + + usort( + $payment_methods, + function( $a, $b ) { + return strnatcasecmp( $a->name, $b->name ); + } + ); + + require __DIR__ . '/../../views/meta-box-gateway-payment-methods.php'; + } + + /** + * Pronamic Pay gateway webhook log setting. + * + * @param null|Gateway $gateway Gateway. + * @param null|string $gateway_id Gateway ID. + * @param null|int $config_id Config ID. + * + * @return void + */ + public static function settings_webhook_log( $gateway, $gateway_id, $config_id ) { + if ( null === $gateway ) { + return; + } + + require __DIR__ . '/../../views/meta-box-gateway-webhook-log.php'; + } + + /** + * Pronamic Pay gateway test meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_test( $post ) { + include __DIR__ . '/../../views/meta-box-gateway-test.php'; + } + + /** + * When the post is saved, saves our custom data. + * + * @link https://github.com/WordPress/WordPress/blob/5.1/wp-includes/post.php#L3928-L3951 + * + * @param int $post_id The ID of the post being saved. + * @return void + */ + public function save_post( $post_id ) { + // Nonce. + if ( ! \filter_has_var( INPUT_POST, 'pronamic_pay_nonce' ) ) { + return; + } + + \check_admin_referer( 'pronamic_pay_save_gateway', 'pronamic_pay_nonce' ); + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if ( \defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return; + } + + // OK, its safe for us to save the data now. + if ( ! \filter_has_var( INPUT_POST, '_pronamic_gateway_id' ) ) { + return; + } + + // Gateway. + $gateway_id = \filter_input( INPUT_POST, '_pronamic_gateway_id', FILTER_SANITIZE_STRING ); + + \update_post_meta( $post_id, '_pronamic_gateway_id', $gateway_id ); + + // Mode. + if ( \filter_has_var( INPUT_POST, '_pronamic_gateway_mode' ) ) { + $gateway_mode = \filter_input( INPUT_POST, '_pronamic_gateway_mode', FILTER_SANITIZE_STRING ); + + \update_post_meta( $post_id, '_pronamic_gateway_mode', $gateway_mode ); + } + + // Transient. + \delete_transient( 'pronamic_outdated_webhook_urls' ); + + // Gateway fields. + if ( empty( $gateway_id ) ) { + return; + } + + $integration = $this->plugin->gateway_integrations->get_integration( $gateway_id ); + + if ( null === $integration ) { + return; + } + + // Delete transients. + $config = $integration->get_config( $post_id ); + + \delete_transient( 'pronamic_pay_issuers_' . md5( serialize( $config ) ) ); + \delete_transient( 'pronamic_gateway_payment_methods_' . md5( serialize( $config ) ) ); + + // Save settings. + $fields = $integration->get_settings_fields(); + + foreach ( $fields as $field ) { + // Check presence of required field settings. + if ( ! isset( $field['meta_key'], $field['filter'] ) ) { + continue; + } + + $name = $field['meta_key']; + $filter = $field['filter']; + + // Check field in input. + if ( ! \filter_has_var( INPUT_POST, $name ) ) { + continue; + } + + // Filter options. + $options = array(); + + if ( isset( $filter['flags'] ) ) { + $options['flags'] = $filter['flags']; + } + + // Make sure filter is not an array. + if ( \is_array( $filter ) && isset( $filter['filter'] ) ) { + $filter = $filter['filter']; + } + + // Get filtered input and update post meta. + $value = \filter_input( INPUT_POST, $name, $filter, $options ); + + if ( '' !== $value ) { + \update_post_meta( $post_id, $name, $value ); + } else { + \delete_post_meta( $post_id, $name ); + } + } + + $integration->save_post( $post_id ); + + // Update active payment methods. + PaymentMethods::update_active_payment_methods(); + } + + /** + * Post updated messages. + * + * @link https://codex.wordpress.org/Function_Reference/register_post_type + * @link https://github.com/WordPress/WordPress/blob/4.4.2/wp-admin/edit-form-advanced.php#L134-L173 + * @link https://github.com/WordPress/WordPress/blob/5.2.1/wp-admin/edit-form-advanced.php#L164-L203 + * @link https://github.com/woothemes/woocommerce/blob/2.5.5/includes/admin/class-wc-admin-post-types.php#L111-L168 + * @link https://github.com/woocommerce/woocommerce/blob/3.6.4/includes/admin/class-wc-admin-post-types.php#L110-L180 + * @link https://developer.wordpress.org/reference/hooks/post_updated_messages/ + * + * @param array $messages Messages. + * @return array + */ + public function post_updated_messages( $messages ) { + global $post; + + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352797&filters[translation_id]=37948900 + $scheduled_date = date_i18n( __( 'M j, Y @ H:i', 'pronamic_ideal' ), strtotime( $post->post_date ) ); + + $messages[ self::POST_TYPE ] = array( + 0 => '', // Unused. Messages start at index 1. + 1 => __( 'Configuration updated.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352799&filters[translation_id]=37947229 + 2 => $messages['post'][2], + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352800&filters[translation_id]=37947870 + 3 => $messages['post'][3], + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352798&filters[translation_id]=37947230 + 4 => __( 'Configuration updated.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352801&filters[translation_id]=37947231 + /* phpcs:disable WordPress.Security.NonceVerification.Recommended */ + /* translators: %s: date and time of the revision */ + 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Configuration restored to revision from %s.', 'pronamic_ideal' ), strval( wp_post_revision_title( (int) $_GET['revision'], false ) ) ) : false, + /* phpcs:enable WordPress.Security.NonceVerification.Recommended */ + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352802&filters[translation_id]=37949178 + 6 => __( 'Configuration published.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352803&filters[translation_id]=37947232 + 7 => __( 'Configuration saved.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352804&filters[translation_id]=37949303 + 8 => __( 'Configuration submitted.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352805&filters[translation_id]=37949302 + /* translators: %s: scheduled date */ + 9 => sprintf( __( 'Configuration scheduled for: %s.', 'pronamic_ideal' ), '' . $scheduled_date . '' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352806&filters[translation_id]=37949301 + 10 => __( 'Configuration draft updated.', 'pronamic_ideal' ), + ); + + return $messages; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminHealth.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminHealth.php new file mode 100644 index 00000000..a5d8d15a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminHealth.php @@ -0,0 +1,506 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * Class SiteHealth + * + * @link https://make.wordpress.org/core/2019/04/25/site-health-check-in-5-2/ + * + * @author Reüel van der Steege + * @version 2.5.0 + * @since 2.2.4 + */ +class AdminHealth { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Site health constructor. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Filters. + add_filter( 'debug_information', array( $this, 'debug_information' ) ); + add_filter( 'site_status_tests', array( $this, 'status_tests' ) ); + } + + /** + * Debug information. + * + * @param array $debug_information Debug information. + * + * @return array + */ + public function debug_information( $debug_information ) { + $fields = array(); + + // License key. + $fields['license_key'] = array( + 'label' => __( 'Support license key', 'pronamic_ideal' ), + 'value' => esc_html( get_option( 'pronamic_pay_license_key', __( 'No license key found', 'pronamic_ideal' ) ) ), + 'private' => true, + ); + + // License status. + $fields['license_status'] = array( + 'label' => __( 'License status', 'pronamic_ideal' ), + 'value' => esc_html( $this->plugin->license_manager->get_formatted_license_status() ), + ); + + // Next scheduled license check. + $fields['next_license_check'] = array( + 'label' => __( 'Next scheduled license check', 'pronamic_ideal' ), + 'value' => esc_html( $this->plugin->license_manager->get_formatted_next_license_check() ), + ); + + // Time. + $fields['time'] = array( + 'label' => __( 'Time (UTC)', 'pronamic_ideal' ), + 'value' => esc_html( gmdate( __( 'Y/m/d g:i:s A', 'pronamic_ideal' ) ) ), + ); + + // OpenSSL version. + $openssl_version = __( 'Not available', 'pronamic_ideal' ); + + if ( defined( 'OPENSSL_VERSION_TEXT' ) ) { + $openssl_version = OPENSSL_VERSION_TEXT; + } + + $fields['openssl_version'] = array( + 'label' => __( 'OpenSSL version', 'pronamic_ideal' ), + 'value' => esc_html( $openssl_version ), + ); + + // Active plugin integrations. + $fields['active_plugin_integrations'] = array( + 'label' => __( 'Active plugin integrations', 'pronamic_ideal' ), + 'value' => $this->get_active_plugin_integrations_debug(), + ); + + // Add debug information section. + $debug_information['pronamic-pay'] = array( + 'label' => __( 'Pronamic Pay', 'pronamic_ideal' ), + 'fields' => $fields, + ); + + return $debug_information; + } + + /** + * Get active plugin integrations debug. + * + * @return string + */ + private function get_active_plugin_integrations_debug() { + $active = array(); + + // Check integrations. + foreach ( $this->plugin->plugin_integrations as $integration ) { + if ( ! $integration->is_active() ) { + continue; + } + + $active[] = $integration->get_name(); + } + + // Default result no active integrations. + if ( empty( $active ) ) { + $active[] = __( 'None', 'pronamic_ideal' ); + } + + $result = \implode( ', ', $active ); + + return $result; + } + + /** + * Status tests. + * + * @param array $status_tests Status tests. + * + * @return array + */ + public function status_tests( $status_tests ) { + // Test valid license. + $status_tests['direct']['pronamic_pay_valid_license'] = array( + 'label' => __( 'Pronamic Pay support license key test' ), + 'test' => array( $this, 'test_valid_license' ), + ); + + // Test minimum required WordPress version. + $status_tests['direct']['pronamic_pay_wordpress_version'] = array( + 'label' => __( 'Pronamic Pay WordPress version test' ), + 'test' => array( $this, 'test_wordpress_version' ), + ); + + // Test memory limit. + $status_tests['direct']['pronamic_pay_memory_limit'] = array( + 'label' => __( 'Pronamic Pay memory limit test' ), + 'test' => array( $this, 'test_memory_limit' ), + ); + + // Test character set. + $status_tests['direct']['pronamic_pay_character_set'] = array( + 'label' => __( 'Pronamic Pay UTF-8 character set test' ), + 'test' => array( $this, 'test_character_set' ), + ); + + // Test hashing algorithms. + $status_tests['direct']['pronamic_pay_hashing_algorithms'] = array( + 'label' => __( 'Pronamic Pay hashing algorithms test' ), + 'test' => array( $this, 'test_hashing_algorithms' ), + ); + + // Test supported extensions. + $status_tests['direct']['pronamic_pay_extensions_support'] = array( + 'label' => __( 'Pronamic Pay extensions support test' ), + 'test' => array( $this, 'test_extensions_support' ), + ); + + return $status_tests; + } + + /** + * Test if configuration exists. + * + * @return array|string> + */ + public function test_valid_license() { + // Good. + $result = array( + 'test' => 'pronamic_pay_valid_license', + 'label' => __( 'Pronamic Pay license key is valid', 'pronamic_ideal' ), + 'description' => sprintf( + '

    %s

    ', + __( 'A valid license is required for technical support and continued plugin updates.', 'pronamic_ideal' ) + ), + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'status' => 'good', + 'actions' => '', + ); + + // Recommendation. + if ( 'valid' !== get_option( 'pronamic_pay_license_status' ) ) { + $result['status'] = 'recommended'; + $result['label'] = __( 'No valid license key for Pronamic Pay', 'pronamic_ideal' ); + + $result['actions'] = '

    '; + + if ( '' === get_option( 'pronamic_pay_license_key' ) ) { + $result['actions'] .= sprintf( + '%s - ', + esc_url( 'https://www.pronamic.eu/plugins/pronamic-ideal/' ), + __( 'Purchase license' ) + ); + } + + $result['actions'] .= sprintf( + '%s - ', + add_query_arg( 'page', 'pronamic_pay_settings', get_admin_url( null, 'admin.php' ) ), + __( 'License settings' ) + ); + + $result['actions'] .= sprintf( + '%s', + esc_url( 'https://www.pronamic.eu/account/' ), + __( 'Check existing license' ) + ); + + $result['actions'] .= '

    '; + } + + return $result; + } + + /** + * Test WordPress version. + * + * @return array|string> + */ + public function test_wordpress_version() { + // Good. + $result = array( + 'test' => 'pronamic_pay_wordpress_version', + 'label' => sprintf( + /* translators: %s: WordPress version number */ + __( 'WordPress version is supported by Pronamic Pay (%s)', 'pronamic_ideal' ), + get_bloginfo( 'version' ) + ), + 'description' => sprintf( '

    %s

    ', __( 'Pronamic Pay requires at least WordPress 4.7.', 'pronamic_ideal' ) ), + 'badge' => array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'color' => 'blue', + ), + 'status' => 'good', + 'actions' => '', + ); + + // Recommendation. + if ( version_compare( get_bloginfo( 'version' ), '4.7', '<' ) ) { + $result['status'] = 'recommended'; + $result['label'] = __( 'Pronamic Pay requires at least WordPress 4.7', 'pronamic_ideal' ); + } + + return $result; + } + + /** + * Test WordPress memory limit. + * + * @return array|string> + */ + public function test_memory_limit() { + $memory_limit = defined( 'WP_MEMORY_LIMIT' ) ? WP_MEMORY_LIMIT : ''; + + $memory = pronamic_pay_let_to_num( strval( $memory_limit ) ); + + // Good. + $result = array( + 'test' => 'pronamic_pay_memory_limit', + 'label' => sprintf( + /* translators: %s: WordPress memory limit */ + __( 'WordPress memory limit is sufficient (%s)', 'pronamic_ideal' ), + size_format( $memory ) + ), + 'description' => sprintf( '

    %s

    ', __( 'Pronamic Pay recommends setting the WordPress memory limit to at least 64 MB.', 'pronamic_ideal' ) ), + 'badge' => array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'color' => 'blue', + ), + 'status' => 'good', + 'actions' => '', + ); + + // Recommendation. + if ( $memory < 67108864 ) { + $result['status'] = 'recommended'; + + $result['label'] = sprintf( + /* translators: %s: WordPress memory limit */ + __( 'Increase WordPress memory limit (%s) to at least 64 MB', 'pronamic_ideal' ), + size_format( $memory ) + ); + } + + return $result; + } + + /** + * Test UTF-8 character set. + * + * @return array|string> + */ + public function test_character_set() { + // Good. + $result = array( + 'test' => 'pronamic_pay_character_set', + 'label' => __( 'Character encoding is set to UTF-8', 'pronamic_ideal' ), + 'description' => sprintf( '

    %s

    ', __( 'Pronamic Pay recommends to use the UTF-8 character encoding for payments.', 'pronamic_ideal' ) ), + 'badge' => array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'color' => 'blue', + ), + 'status' => 'good', + 'actions' => '', + ); + + // Recommendation. + if ( 0 !== strcasecmp( get_bloginfo( 'charset' ), 'UTF-8' ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'Character encoding is not set to UTF-8', 'pronamic_ideal' ); + } + + return $result; + } + + /** + * Test registered hashing algorithms. + * + * @return array|string> + */ + public function test_hashing_algorithms() { + // Good. + $result = array( + 'test' => 'pronamic_pay_hashing_algorithms', + 'label' => __( 'SHA1 hashing algorithm is available', 'pronamic_ideal' ), + 'description' => sprintf( '

    %s

    ', __( 'Payment gateways often use the SHA1 hashing algorithm, therefore Pronamic Pay advises to enable this hashing algorithm.', 'pronamic_ideal' ) ), + 'badge' => array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'color' => 'blue', + ), + 'status' => 'good', + 'actions' => '', + ); + + // Recommendation. + $algorithms = hash_algos(); + + if ( ! in_array( 'sha1', $algorithms, true ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'SHA1 hashing algorithm is not available for Pronamic Pay', 'pronamic_ideal' ); + } + + return $result; + } + + /** + * Test extensions support. + * + * @return array|string> + */ + public function test_extensions_support() { + $extensions_json_path = \dirname( $this->plugin->get_file() ) . '/other/extensions.json'; + + if ( ! \is_readable( $extensions_json_path ) ) { + return array(); + } + + $data = \file_get_contents( $extensions_json_path, true ); + + if ( false === $data ) { + return array(); + } + + // Check supported extensions. + $extensions = \json_decode( $data ); + + $supported_extensions = array(); + $untested_plugin_versions = array(); + $outdated_plugin_versions = array(); + + $active_plugins = \get_option( 'active_plugins' ); + $plugins = \get_plugins(); + + $status = 'good'; + + foreach ( $plugins as $file => $plugin ) { + // Only test active plugins. + if ( false === \array_search( $file, $active_plugins, true ) ) { + continue; + } + + $plugin_file = null; + + foreach ( $extensions as $extension ) { + // Requires at least. + $requires_at_least = '0.0.0'; + + if ( isset( $extension->requires_at_least ) ) { + $requires_at_least = $extension->requires_at_least; + } + + // Tested up to. + $tested_up_to = '0.0.0'; + + if ( isset( $extension->tested_up_to ) ) { + $tested_up_to = $extension->tested_up_to; + } + + if ( 0 === \strcasecmp( \dirname( $file ), $extension->slug ) ) { + $tested_up_to_ok = \version_compare( $plugin['Version'], $tested_up_to, '<=' ); + $requires_at_least_ok = \version_compare( $plugin['Version'], $requires_at_least, '>=' ); + + $description_text = sprintf( + '– %1$s %2$s (requires at least version %3$s, tested up to %4$s)', + \esc_html( $extension->name ), + \esc_html( $plugin['Version'] ), + \esc_html( $requires_at_least ), + \esc_html( $tested_up_to ) + ); + + if ( $tested_up_to_ok && $requires_at_least_ok ) { + // Plugin version is between minimum and tested versions. + $supported_extensions[] = $description_text; + } elseif ( ! $requires_at_least_ok ) { + // Plugin version is lower than minimum required version. + $outdated_plugin_versions[] = $description_text; + } elseif ( ! $tested_up_to_ok ) { + // Plugin version is higher than tested version. + $untested_plugin_versions[] = $description_text; + } + } + } + } + + // Extensions list text. + $extensions_list_text = ''; + + // Untested plugin versions. + if ( 0 !== count( $untested_plugin_versions ) ) { + $status = 'recommended'; + + $extensions_list_text .= sprintf( + '

    %1$s

    %2$s

    ', + __( 'Untested plugin versions (issues with payments might occur):', 'pronamic_ideal' ), + \join( '

    ', $untested_plugin_versions ) + ); + } + + if ( 0 !== count( $outdated_plugin_versions ) ) { + $status = 'critical'; + + $extensions_list_text .= sprintf( + '

    %1$s

    %2$s

    ', + __( 'Outdated unsupported plugin versions for which payments can not be processed:', 'pronamic_ideal' ), + \join( '

    ', $outdated_plugin_versions ) + ); + } + + // Supported extensions. + if ( 0 !== count( $supported_extensions ) ) { + $extensions_list_text .= sprintf( + '

    %1$s

    %2$s

    ', + __( 'Supported plugin versions:', 'pronamic_ideal' ), + \join( '

    ', $supported_extensions ) + ); + } + + // Result. + $label = __( 'Pronamic Pay extensions are compatible', 'pronamic_ideal' ); + + $description_text = __( 'Pronamic Pay uses extensions to integrate with form, booking and other e-commerce plugins. All extensions support the currently activated plugin version.', 'pronamic_ideal' ); + + if ( 'good' !== $status ) { + $label = __( 'Pronamic Pay extensions are incompatible', 'pronamic_ideal' ); + + $description_text = __( 'Pronamic Pay uses extensions to integrate with form, booking and other e-commerce plugins. Not all extensions support the version of the currently activated plugin.', 'pronamic_ideal' ); + } + + $result = array( + 'test' => 'pronamic_pay_extensions_support', + 'label' => $label, + 'description' => sprintf( '

    %s

    %s

    ', \esc_html( $description_text ), $extensions_list_text ), + 'badge' => array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'color' => 'blue', + ), + 'status' => $status, + 'actions' => '', + ); + + return $result; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminModule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminModule.php new file mode 100644 index 00000000..ffc3fbb2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminModule.php @@ -0,0 +1,1118 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Money\Parser as MoneyParser; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\AddressHelper; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\ContactNameHelper; +use Pronamic\WordPress\Pay\Core\Util; +use Pronamic\WordPress\Pay\CreditCard; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\CustomerHelper; +use Pronamic\WordPress\Pay\Forms\FormPostType; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentLines; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionInterval; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPhase; +use Pronamic\WordPress\Pay\Webhooks\WebhookManager; + +/** + * WordPress Pay admin + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.0 + */ +class AdminModule { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Admin settings page. + * + * @var AdminSettings + */ + public $settings; + + /** + * Admin about page. + * + * @var AdminAboutPage|null + */ + public $about_page; + + /** + * Admin dashboard page. + * + * @var AdminDashboard + */ + public $dashboard; + + /** + * Admin site health. + * + * @var AdminHealth + */ + public $health; + + /** + * Admin notices page. + * + * @var AdminNotices + */ + public $notices; + + /** + * Admin reports page. + * + * @var AdminReports + */ + public $reports; + + /** + * Admin tour page. + * + * @var AdminTour + */ + public $tour; + + /** + * Plugin installation. + * + * @var Install + */ + public $install; + + /** + * Webhook manager. + * + * @var WebhookManager + */ + private $webhook_manager; + + /** + * Constructs and initalize an admin object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + $this->install = new Install( $plugin, $this ); + + // Actions. + add_action( 'admin_init', array( $this, 'admin_init' ) ); + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + + add_action( 'load-post.php', array( $this, 'maybe_test_payment' ) ); + + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + + add_filter( 'parent_file', array( $this, 'admin_menu_parent_file' ) ); + + // Modules. + $this->settings = new AdminSettings( $plugin ); + $this->dashboard = new AdminDashboard( $plugin ); + $this->health = new AdminHealth( $plugin ); + $this->notices = new AdminNotices( $plugin ); + $this->reports = new AdminReports( $plugin, $this ); + $this->tour = new AdminTour( $plugin ); + + // About page. + $about_page_file = $this->plugin->get_option( 'about_page_file' ); + + if ( null !== $about_page_file ) { + $this->about_page = new AdminAboutPage( $plugin, $about_page_file ); + } + + // Webhook Manager. + $this->webhook_manager = new WebhookManager( $plugin, $this ); + } + + /** + * Admin initialize. + * + * @return void + */ + public function admin_init() { + global $pronamic_ideal_errors; + + $pronamic_ideal_errors = array(); + + // Maybe. + $this->maybe_create_pages(); + $this->maybe_redirect(); + + // Post types. + new AdminGatewayPostType( $this->plugin, $this ); + new AdminPaymentPostType( $this->plugin ); + new AdminSubscriptionPostType( $this->plugin ); + + // License check. + if ( ! wp_next_scheduled( 'pronamic_pay_license_check' ) ) { + wp_schedule_event( time(), 'daily', 'pronamic_pay_license_check' ); + } + } + + /** + * Maybe redirect. + * + * @link https://github.com/woothemes/woocommerce/blob/2.4.4/includes/admin/class-wc-admin.php#L29 + * @link https://github.com/woothemes/woocommerce/blob/2.4.4/includes/admin/class-wc-admin.php#L96-L122 + * + * @return void + */ + public function maybe_redirect() { + $redirect = get_transient( 'pronamic_pay_admin_redirect' ); + + // Check. + if ( + empty( $redirect ) + || + wp_doing_ajax() + || + Util::doing_cron() + || + is_network_admin() + || + filter_has_var( INPUT_GET, 'activate-multi' ) + || + ! current_user_can( 'manage_options' ) + ) { + return; + } + + /** + * Delete the `pronamic_pay_admin_redirect` transient. + * + * If we don't get the `true` confirmation we will bail out + * so users will not get stuck in a redirect loop. + * + * We have had issues with this with caching plugins like + * W3 Total Cache and on Savvii hosting environments. + * + * @link https://developer.wordpress.org/reference/functions/delete_transient/ + */ + $result = delete_transient( 'pronamic_pay_admin_redirect' ); + + if ( true !== $result ) { + return; + } + + /** + * Redirect. + */ + wp_safe_redirect( $redirect ); + + exit; + } + + /** + * Input checkbox. + * + * @param array $args Arguments. + * @return void + */ + public static function input_checkbox( $args ) { + $defaults = array( + 'label_for' => '', + 'type' => 'text', + 'label' => '', + ); + + $args = wp_parse_args( $args, $defaults ); + + $id = $args['label_for']; + $value = get_option( $id ); + + $legend = sprintf( + '%s', + esc_html( $args['label'] ) + ); + + $input = sprintf( + '', + esc_attr( $id ), + esc_attr( $id ), + esc_attr( 'checkbox' ), + esc_attr( '1' ), + checked( $value, true, false ) + ); + + $label = sprintf( + '', + esc_attr( $id ), + $input, + esc_html( $args['label'] ) + ); + + printf( + /* phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped */ + '
    %s %s
    ', + $legend, + $label + /* phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped */ + ); + } + + /** + * Sanitize the specified value to a boolean. + * + * @param mixed $value Value. + * @return boolean + */ + public static function sanitize_boolean( $value ) { + return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); + } + + /** + * Configurations dropdown. + * + * @param array $args Arguments. + * @return string|null + */ + public static function dropdown_configs( $args ) { + $defaults = array( + 'name' => 'pronamic_pay_config_id', + 'echo' => true, + 'selected' => false, + 'payment_method' => null, + ); + + $args = wp_parse_args( $args, $defaults ); + + // Output. + $output = ''; + + // Dropdown. + $id = $args['name']; + $name = $args['name']; + $selected = $args['selected']; + + if ( false === $selected ) { + $selected = get_option( $id ); + } + + $output .= sprintf( + '' ); + + // Output. + if ( $args['echo'] ) { + echo wp_kses( + $output, + array( + 'select' => array( + 'id' => array(), + 'name' => array(), + ), + 'option' => array( + 'value' => array(), + 'selected' => array(), + ), + ) + ); + + return null; + } + + return $output; + } + + /** + * Create pages. + * + * @param array $pages Page. + * @param int|null $parent Parent post ID. + * @return void + * @throws \Exception When creating page fails. + */ + private function create_pages( $pages, $parent = null ) { + foreach ( $pages as $page ) { + $post = array( + 'post_title' => $page['post_title'], + 'post_name' => $page['post_title'], + 'post_content' => $page['post_content'], + 'post_status' => 'publish', + 'post_type' => 'page', + 'comment_status' => 'closed', + ); + + if ( isset( $parent ) ) { + $post['post_parent'] = $parent; + } + + $result = wp_insert_post( $post, true ); + + if ( $result instanceof \WP_Error ) { + throw new \Exception( $result->get_error_message() ); + } + + if ( isset( $page['post_meta'] ) ) { + foreach ( $page['post_meta'] as $key => $value ) { + update_post_meta( $result, $key, $value ); + } + } + + if ( isset( $page['option_name'] ) ) { + update_option( $page['option_name'], $result ); + } + + if ( isset( $page['children'] ) ) { + $this->create_pages( $page['children'], $result ); + } + } + } + + /** + * Maybe create pages. + * + * @return void + */ + public function maybe_create_pages() { + if ( ! filter_has_var( INPUT_POST, 'pronamic_pay_create_pages' ) ) { + return; + } + + if ( ! check_admin_referer( 'pronamic_pay_settings', 'pronamic_pay_nonce' ) ) { + return; + } + + $pages = array( + array( + 'post_title' => __( 'Payment Status', 'pronamic_ideal' ), + 'post_name' => __( 'payment', 'pronamic_ideal' ), + 'post_content' => '', + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'children' => array( + 'completed' => array( + 'post_title' => __( 'Payment completed', 'pronamic_ideal' ), + 'post_name' => __( 'completed', 'pronamic_ideal' ), + 'post_content' => sprintf( + '

    %s

    ', + __( 'The payment has been successfully completed.', 'pronamic_ideal' ) + ), + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'option_name' => 'pronamic_pay_completed_page_id', + ), + 'cancel' => array( + 'post_title' => __( 'Payment cancelled', 'pronamic_ideal' ), + 'post_name' => __( 'cancelled', 'pronamic_ideal' ), + 'post_content' => sprintf( + '

    %s

    ', + __( 'You have cancelled the payment.', 'pronamic_ideal' ) + ), + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'option_name' => 'pronamic_pay_cancel_page_id', + ), + 'expired' => array( + 'post_title' => __( 'Payment expired', 'pronamic_ideal' ), + 'post_name' => __( 'expired', 'pronamic_ideal' ), + 'post_content' => sprintf( + '

    %s

    ', + __( 'Your payment session has expired.', 'pronamic_ideal' ) + ), + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'option_name' => 'pronamic_pay_expired_page_id', + ), + 'error' => array( + 'post_title' => __( 'Payment error', 'pronamic_ideal' ), + 'post_name' => __( 'error', 'pronamic_ideal' ), + 'post_content' => sprintf( + '

    %s

    ', + __( 'An error has occurred during payment.', 'pronamic_ideal' ) + ), + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'option_name' => 'pronamic_pay_error_page_id', + ), + 'unknown' => array( + 'post_title' => __( 'Payment status unknown', 'pronamic_ideal' ), + 'post_name' => __( 'unknown', 'pronamic_ideal' ), + 'post_content' => sprintf( + '

    %s

    ', + __( 'The payment status is unknown.', 'pronamic_ideal' ) + ), + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'option_name' => 'pronamic_pay_unknown_page_id', + ), + ), + ), + array( + 'post_title' => __( 'Subscription Canceled', 'pronamic_ideal' ), + 'post_name' => __( 'subscription', 'pronamic_ideal' ), + 'post_content' => sprintf( + '

    %s

    ', + __( 'The subscription has been canceled.', 'pronamic_ideal' ) + ), + 'post_meta' => array( + '_yoast_wpseo_meta-robots-noindex' => true, + ), + 'option_name' => 'pronamic_pay_subscription_canceled_page_id', + ), + ); + + $url_args = array( + 'page' => 'pronamic_pay_settings', + 'message' => 'pages-generated', + ); + + try { + $this->create_pages( $pages ); + } catch ( \Exception $e ) { + $url_args = array( + 'page' => 'pronamic_pay_settings', + 'message' => 'pages-not-generated', + ); + } + + $url = add_query_arg( + $url_args, + admin_url( 'admin.php' ) + ); + + wp_safe_redirect( $url ); + + exit; + } + + /** + * Check if scripts should be enqueued based on the hook and current screen. + * + * @link https://developer.wordpress.org/reference/functions/get_current_screen/ + * @link https://developer.wordpress.org/reference/classes/wp_screen/ + * + * @param string $hook Hook. + * @return bool True if scripts should be enqueued, false otherwise. + */ + private function should_enqueue_scripts( $hook ) { + // Check if the hook contains the value 'pronamic_pay'. + if ( false !== strpos( $hook, 'pronamic_pay' ) ) { + return true; + } + + // Check if the hook contains the value 'pronamic_ideal'. + if ( false !== strpos( $hook, 'pronamic_ideal' ) ) { + return true; + } + + // Check current screen for some values related to Pronamic Pay. + $screen = get_current_screen(); + + if ( null === $screen ) { + return false; + } + + // Current screen is dashboard. + if ( 'dashboard' === $screen->id ) { + return true; + } + + // Gravity Forms. + if ( 'toplevel_page_gf_edit_forms' === $screen->id ) { + return true; + } + + // CHeck if current screen post type is related to Pronamic Pay. + if ( in_array( + $screen->post_type, + array( + 'pronamic_gateway', + 'pronamic_payment', + 'pronamic_pay_form', + 'pronamic_pay_gf', + 'pronamic_pay_subscr', + ), + true + ) ) { + return true; + } + + // Other. + return false; + } + + /** + * Enqueue admin scripts. + * + * @param string $hook Hook. + * @return void + */ + public function enqueue_scripts( $hook ) { + if ( ! $this->should_enqueue_scripts( $hook ) ) { + return; + } + + $min = SCRIPT_DEBUG ? '' : '.min'; + + // Tippy.js - https://atomiks.github.io/tippyjs/. + wp_register_script( + 'tippy.js', + plugins_url( '../../assets/tippy.js/tippy.all' . $min . '.js', __FILE__ ), + array(), + '3.4.1', + true + ); + + // Pronamic. + wp_register_style( + 'pronamic-pay-icons', + plugins_url( '../../fonts/dist/pronamic-pay-icons.css', __FILE__ ), + array(), + $this->plugin->get_version() + ); + + wp_register_style( + 'pronamic-pay-admin', + plugins_url( '../../css/admin' . $min . '.css', __FILE__ ), + array( 'pronamic-pay-icons' ), + $this->plugin->get_version() + ); + + wp_register_script( + 'pronamic-pay-admin', + plugins_url( '../../js/dist/admin' . $min . '.js', __FILE__ ), + array( 'jquery', 'tippy.js' ), + $this->plugin->get_version(), + true + ); + + // Enqueue. + wp_enqueue_style( 'pronamic-pay-admin' ); + wp_enqueue_script( 'pronamic-pay-admin' ); + } + + /** + * Maybe test payment. + * + * @return void + */ + public function maybe_test_payment() { + if ( ! \filter_has_var( \INPUT_POST, 'test_pay_gateway' ) ) { + return; + } + + if ( ! \check_admin_referer( 'test_pay_gateway', 'pronamic_pay_test_nonce' ) ) { + return; + } + + // Gateway. + $config_id = \filter_input( \INPUT_POST, 'post_ID', \FILTER_SANITIZE_NUMBER_INT ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( empty( $gateway ) ) { + return; + } + + // Amount. + $string = \filter_input( INPUT_POST, 'test_amount', \FILTER_SANITIZE_STRING ); + + try { + $money_parser = new MoneyParser(); + + $amount = $money_parser->parse( $string )->get_value(); + } catch ( \Exception $e ) { + \wp_die( \esc_html( $e->getMessage() ) ); + } + + /* + * Payment. + */ + $payment = new Payment(); + + $order_id = (string) \time(); + + $description = \sprintf( + /* translators: %s: order ID */ + __( 'Test %s', 'pronamic_ideal' ), + $order_id + ); + + $payment->set_config_id( $config_id ); + $payment->set_description( $description ); + + $payment->method = \filter_input( \INPUT_POST, 'pronamic_pay_test_payment_method', \FILTER_SANITIZE_STRING ); + $payment->order_id = $order_id; + + // Source. + $payment->set_source( 'test' ); + $payment->set_source_id( $order_id ); + + /* + * Credit Card. + * Test card to simulate a 3-D Secure registered card. + * + * @link http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm + */ + $credit_card = new CreditCard(); + + $expiration_date = new \DateTime( '+5 years' ); + + $credit_card->set_expiration_month( (int) $expiration_date->format( 'n' ) ); + $credit_card->set_expiration_year( (int) $expiration_date->format( 'Y' ) ); + $credit_card->set_name( 'Pronamic' ); + $credit_card->set_number( '5300000000000006' ); + $credit_card->set_security_code( '123' ); + + $payment->set_credit_card( $credit_card ); + + // Data. + $user = \wp_get_current_user(); + + $phone = \filter_input( \INPUT_POST, 'test_phone', \FILTER_SANITIZE_STRING ); + + // Name. + $name = ContactNameHelper::from_array( + array( + 'first_name' => $user->first_name, + 'last_name' => $user->last_name, + ) + ); + + // Customer. + $customer = CustomerHelper::from_array( + array( + 'name' => $name, + 'email' => $user->user_email, + 'phone' => $phone, + 'user_id' => $user->ID, + ) + ); + + $payment->set_customer( $customer ); + + // Billing address. + $address = AddressHelper::from_array( + array( + 'name' => $name, + 'email' => $user->user_email, + 'phone' => $phone, + ) + ); + + $payment->set_billing_address( $address ); + + // Lines. + $payment->lines = new PaymentLines(); + + $line = $payment->lines->new_line(); + + $price = new TaxedMoney( $amount, 'EUR' ); + + $line->set_name( __( 'Test', 'pronamic_ideal' ) ); + $line->set_unit_price( $price ); + $line->set_quantity( 1 ); + $line->set_total_amount( $price ); + + $payment->set_total_amount( $payment->lines->get_amount() ); + + // Subscription. + $test_subscription = \filter_input( \INPUT_POST, 'pronamic_pay_test_subscription', \FILTER_VALIDATE_BOOLEAN ); + $interval = \filter_input( \INPUT_POST, 'pronamic_pay_test_repeat_interval', \FILTER_VALIDATE_INT ); + $interval_period = \filter_input( \INPUT_POST, 'pronamic_pay_test_repeat_frequency', \FILTER_SANITIZE_STRING ); + + if ( ! empty( $test_subscription ) && ! empty( $interval ) && ! empty( $interval_period ) ) { + $subscription = new Subscription(); + + $subscription->set_description( $description ); + $subscription->set_lines( $payment->get_lines() ); + + // Ends on. + $ends_on = \filter_input( \INPUT_POST, 'pronamic_pay_ends_on', \FILTER_SANITIZE_STRING ); + + $total_periods = null; + + switch ( $ends_on ) { + case 'count': + $count = \filter_input( \INPUT_POST, 'pronamic_pay_ends_on_count', \FILTER_VALIDATE_INT ); + + if ( ! empty( $count ) ) { + $total_periods = $count; + } + + break; + case 'date': + $end_date = \filter_input( \INPUT_POST, 'pronamic_pay_ends_on_date', \FILTER_SANITIZE_STRING ); + + if ( ! empty( $end_date ) ) { + $interval_spec = 'P' . $interval . Util::to_period( $interval_period ); + + $period = new \DatePeriod( + new \DateTime(), + new \DateInterval( $interval_spec ), + new \DateTime( $end_date ) + ); + + $total_periods = iterator_count( $period ); + } + + break; + } + + // Phase. + $phase = new SubscriptionPhase( + $subscription, + new \DateTimeImmutable(), + new SubscriptionInterval( 'P' . $interval . Util::to_period( $interval_period ) ), + $price + ); + + $phase->set_total_periods( $total_periods ); + + $subscription->add_phase( $phase ); + + $period = $subscription->new_period(); + + if ( null !== $period ) { + $payment->add_period( $period ); + } + + $payment->subscription = $subscription; + $payment->subscription_source_id = $payment->get_source_id(); + } + + // Start. + try { + $payment = Plugin::start_payment( $payment ); + + if ( null !== $payment ) { + $gateway->redirect( $payment ); + } + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + + exit; + } + } + + /** + * Admin menu parent file. + * + * @param string $parent_file Parent file for admin menu. + * @return string + */ + public function admin_menu_parent_file( $parent_file ) { + $screen = get_current_screen(); + + if ( null === $screen ) { + return $parent_file; + } + + switch ( $screen->id ) { + case FormPostType::POST_TYPE: + case AdminGatewayPostType::POST_TYPE: + case AdminPaymentPostType::POST_TYPE: + case AdminSubscriptionPostType::POST_TYPE: + return 'pronamic_ideal'; + } + + return $parent_file; + } + + /** + * Get menu icon URL. + * + * @link https://developer.wordpress.org/reference/functions/add_menu_page/ + * @return string + * @throws \Exception Throws exception when retrieving menu icon fails. + */ + private function get_menu_icon_url() { + /** + * Icon URL. + * + * Pass a base64-encoded SVG using a data URI, which will be colored to match the color scheme. + * This should begin with 'data:image/svg+xml;base64,'. + * + * We use a SVG image with default fill color #A0A5AA from the default admin color scheme: + * https://github.com/WordPress/WordPress/blob/5.2/wp-includes/general-template.php#L4135-L4145 + * + * The advantage of this is that users with the default admin color scheme do not see the repaint: + * https://github.com/WordPress/WordPress/blob/5.2/wp-admin/js/svg-painter.js + * + * @link https://developer.wordpress.org/reference/functions/add_menu_page/ + */ + $file = __DIR__ . '/../../images/dist/wp-pay-wp-admin-fresh-base.svgo-min.svg'; + + if ( ! \is_readable( $file ) ) { + throw new \Exception( + \sprintf( + 'Could not read WordPress admin menu icon from file: %s.', + $file + ) + ); + } + + $svg = \file_get_contents( $file, true ); + + if ( false === $svg ) { + throw new \Exception( + \sprintf( + 'Could not read WordPress admin menu icon from file: %s.', + $file + ) + ); + } + + $icon_url = \sprintf( + 'data:image/svg+xml;base64,%s', + // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode + \base64_encode( $svg ) + ); + + return $icon_url; + } + + /** + * Create the admin menu. + * + * @return void + */ + public function admin_menu() { + // @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin-menus.php#L145 + $counts = wp_count_posts( 'pronamic_payment' ); + + $badge = ''; + + if ( isset( $counts->payment_pending ) && $counts->payment_pending > 0 ) { + $badge = sprintf( + ' %s', + $counts->payment_pending, + $counts->payment_pending + ); + } + + // Submenu pages. + $submenu_pages = array( + array( + 'page_title' => __( 'Payments', 'pronamic_ideal' ), + 'menu_title' => __( 'Payments', 'pronamic_ideal' ) . $badge, + 'capability' => 'edit_payments', + 'menu_slug' => 'edit.php?post_type=pronamic_payment', + ), + array( + 'page_title' => __( 'Subscriptions', 'pronamic_ideal' ), + 'menu_title' => __( 'Subscriptions', 'pronamic_ideal' ), + 'capability' => 'edit_payments', + 'menu_slug' => 'edit.php?post_type=pronamic_pay_subscr', + ), + array( + 'page_title' => __( 'Reports', 'pronamic_ideal' ), + 'menu_title' => __( 'Reports', 'pronamic_ideal' ), + 'capability' => 'edit_payments', + 'menu_slug' => 'pronamic_pay_reports', + 'function' => function() { + $this->reports->page_reports(); + }, + ), + array( + 'page_title' => __( 'Payment Forms', 'pronamic_ideal' ), + 'menu_title' => __( 'Forms', 'pronamic_ideal' ), + 'capability' => 'edit_forms', + 'menu_slug' => 'edit.php?post_type=pronamic_pay_form', + ), + array( + 'page_title' => __( 'Configurations', 'pronamic_ideal' ), + 'menu_title' => __( 'Configurations', 'pronamic_ideal' ), + 'capability' => 'manage_options', + 'menu_slug' => 'edit.php?post_type=pronamic_gateway', + ), + array( + 'page_title' => __( 'Settings', 'pronamic_ideal' ), + 'menu_title' => __( 'Settings', 'pronamic_ideal' ), + 'capability' => 'manage_options', + 'menu_slug' => 'pronamic_pay_settings', + 'function' => function() { + $this->render_page( 'settings' ); + }, + ), + ); + + if ( version_compare( get_bloginfo( 'version' ), '5.2', '<' ) ) { + $submenu_pages[] = array( + 'page_title' => __( 'Tools', 'pronamic_ideal' ), + 'menu_title' => __( 'Tools', 'pronamic_ideal' ), + 'capability' => 'manage_options', + 'menu_slug' => 'pronamic_pay_tools', + 'function' => function() { + $this->render_page( 'tools' ); + }, + ); + } + + $minimum_capability = $this->get_minimum_capability( $submenu_pages ); + + try { + $menu_icon_url = $this->get_menu_icon_url(); + } catch ( \Exception $e ) { + // @todo Log. + + /** + * If retrieving the menu icon URL fails we will + * fallback to the WordPress money dashicon. + * + * @link https://developer.wordpress.org/resource/dashicons/#money + */ + $menu_icon_url = 'dashicons-money'; + } + + add_menu_page( + __( 'Pronamic Pay', 'pronamic_ideal' ), + __( 'Pay', 'pronamic_ideal' ) . $badge, + $minimum_capability, + 'pronamic_ideal', + function() { + $this->render_page( 'dashboard' ); + }, + $menu_icon_url + ); + + // Add submenu pages. + foreach ( $submenu_pages as $page ) { + /** + * To keep PHPStan happy we use an if/else statement for + * the 6th $function parameter which should be a callable + * function. Unfortunately this is not documented + * correctly in WordPress. + * + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-admin/includes/plugin.php#L1296-L1377 + */ + if ( array_key_exists( 'function', $page ) ) { + add_submenu_page( + 'pronamic_ideal', + $page['page_title'], + $page['menu_title'], + $page['capability'], + $page['menu_slug'], + $page['function'] + ); + } else { + add_submenu_page( + 'pronamic_ideal', + $page['page_title'], + $page['menu_title'], + $page['capability'], + $page['menu_slug'] + ); + } + } + + // Change title of plugin submenu page to 'Dashboard'. + global $submenu; + + if ( isset( $submenu['pronamic_ideal'] ) ) { + /* phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited */ + $submenu['pronamic_ideal'][0][0] = __( 'Dashboard', 'pronamic_ideal' ); + } + } + + /** + * Get minimum capability from submenu pages. + * + * @param array $pages Submenu pages. + * + * @return string + */ + public function get_minimum_capability( array $pages ) { + foreach ( $pages as $page ) { + if ( \current_user_can( $page['capability'] ) ) { + return $page['capability']; + } + } + + return 'edit_payments'; + } + + /** + * Render the specified page. + * + * @param string $name Page identifier. + * @return void + */ + public function render_page( $name ) { + include __DIR__ . '/../../views/page-' . $name . '.php'; + } + + /** + * Get a CSS class for the specified post status. + * + * @param string $post_status Post status. + * @return string + */ + public static function get_post_status_icon_class( $post_status ) { + switch ( $post_status ) { + case 'payment_pending': + case 'subscr_pending': + return 'pronamic-pay-icon-pending'; + + case 'payment_cancelled': + case 'subscr_cancelled': + return 'pronamic-pay-icon-cancelled'; + + case 'payment_completed': + case 'subscr_completed': + return 'pronamic-pay-icon-completed'; + + case 'payment_refunded': + return 'pronamic-pay-icon-refunded'; + + case 'payment_failed': + case 'subscr_failed': + return 'pronamic-pay-icon-failed'; + + case 'payment_on_hold': + case 'payment_expired': + case 'subscr_expired': + case 'subscr_on_hold': + return 'pronamic-pay-icon-on-hold'; + + case 'payment_reserved': + case 'subscr_active': + default: + return 'pronamic-pay-icon-processing'; + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminNotices.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminNotices.php new file mode 100644 index 00000000..a35a0510 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminNotices.php @@ -0,0 +1,93 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress admin notices + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 3.7.0 + */ +class AdminNotices { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initializes an notices object. + * + * @link https://github.com/woothemes/woocommerce/blob/2.4.3/includes/admin/class-wc-admin-notices.php + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'admin_notices', array( $this, 'admin_notices' ), 11 ); + } + + /** + * Admin notices. + * + * @link https://github.com/WordPress/WordPress/blob/4.3.1/wp-admin/admin-header.php#L245-L250 + * @return void + */ + public function admin_notices() { + // Show notices only to options managers (administrators). + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + // Jetpack. + $screen = get_current_screen(); + + if ( null !== $screen && 'jetpack' === $screen->parent_base ) { + return; + } + + // License notice. + if ( 'valid' !== get_option( 'pronamic_pay_license_status' ) ) { + $class = Plugin::get_number_payments() > 20 ? 'error' : 'updated'; + + $license = get_option( 'pronamic_pay_license_key' ); + + if ( '' === $license ) { + $notice = sprintf( + /* translators: 1: Pronamic Pay settings page URL, 2: Pronamic.eu plugin page URL */ + __( 'Pronamic Pay — You have not entered a valid support license key, please get your key at pronamic.eu.', 'pronamic_ideal' ), + add_query_arg( 'page', 'pronamic_pay_settings', get_admin_url( null, 'admin.php' ) ), + 'https://www.pronamic.eu/plugins/pronamic-ideal/' + ); + } else { + $notice = sprintf( + /* translators: 1: Pronamic Pay settings page URL, 2: Pronamic.eu plugin page URL, 3: Pronamic.eu account page URL */ + __( 'Pronamic Pay — You have not entered a valid support license key. Please get your key at pronamic.eu or login to check your license status.', 'pronamic_ideal' ), + add_query_arg( 'page', 'pronamic_pay_settings', get_admin_url( null, 'admin.php' ) ), + 'https://www.pronamic.eu/plugins/pronamic-ideal/', + 'https://www.pronamic.eu/account/' + ); + } + + printf( + '

    %s

    ', + esc_attr( $class ), + wp_kses_post( $notice ) + ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php new file mode 100644 index 00000000..621a9c8a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminPaymentBulkActions.php @@ -0,0 +1,224 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; +use WP_Query; + +/** + * WordPress admin payment bulk actions + * + * @link https://www.skyverge.com/blog/add-custom-bulk-action/ + * @author Remco Tolsma + * @version 2.2.6 + * @since 4.1.0 + */ +class AdminPaymentBulkActions { + /** + * Constructs and initializes an admin payment bulk actions object. + */ + public function __construct() { + add_action( 'load-edit.php', array( $this, 'load' ) ); + } + + /** + * Load. + * + * @return void + */ + public function load() { + // Current user. + if ( ! current_user_can( 'edit_payments' ) ) { + return; + } + + // Screen. + $screen = get_current_screen(); + + if ( null === $screen ) { + return; + } + + if ( 'edit-pronamic_payment' !== $screen->id ) { + return; + } + + // Bulk actions. + add_filter( 'bulk_actions-' . $screen->id, array( $this, 'bulk_actions' ) ); + + add_filter( 'handle_bulk_actions-' . $screen->id, array( $this, 'handle_bulk_action' ), 10, 3 ); + + // Admin notices. + add_action( 'admin_notices', array( $this, 'admin_notices' ) ); + } + + /** + * Custom bulk actions. + * + * @link https://make.wordpress.org/core/2016/10/04/custom-bulk-actions/ + * @link https://github.com/WordPress/WordPress/blob/4.7/wp-admin/includes/class-wp-list-table.php#L440-L452 + * @param array $bulk_actions Bulk actions. + * @return array + */ + public function bulk_actions( $bulk_actions ) { + // Don't allow edit in bulk. + unset( $bulk_actions['edit'] ); + + // Bulk check payment status. + $bulk_actions['pronamic_payment_check_status'] = __( 'Check Payment Status', 'pronamic_ideal' ); + + return $bulk_actions; + } + + /** + * Handle bulk action. + * + * @see hhttps://make.wordpress.org/core/2016/10/04/custom-bulk-actions/ + * @link https://github.com/WordPress/WordPress/blob/4.7/wp-admin/edit.php#L166-L167 + * @param string $sendback Sendback URL. + * @param string $doaction Action indicator. + * @param array $post_ids Post ID's to bulk edit. + * @return string + */ + public function handle_bulk_action( $sendback, $doaction, $post_ids ) { + if ( 'pronamic_payment_check_status' !== $doaction ) { + return $sendback; + } + + $status_updated = 0; + $skipped_check = 0; + $unsupported_gateways = array(); + $gateways = array(); + + foreach ( $post_ids as $post_id ) { + $payment = get_pronamic_payment( $post_id ); + + if ( null === $payment ) { + continue; + } + + // Only check status for pending payments. + if ( \Pronamic\WordPress\Pay\Payments\PaymentStatus::OPEN !== $payment->status && '' !== $payment->status ) { + $skipped_check++; + + continue; + } + + // Make sure gateway supports `payment_status_request` feature. + $config_id = $payment->config_id; + + if ( null === $config_id ) { + continue; + } + + if ( ! isset( $gateways[ $config_id ] ) ) { + $gateways[ $config_id ] = Plugin::get_gateway( $config_id ); + + if ( $gateways[ $config_id ] && ! $gateways[ $config_id ]->supports( 'payment_status_request' ) ) { + $unsupported_gateways[] = $config_id; + } + } + + if ( in_array( $config_id, $unsupported_gateways, true ) ) { + continue; + } + + Plugin::update_payment( $payment, false ); + + $status_updated++; + } + + $sendback = add_query_arg( + array( + 'status_updated' => $status_updated, + 'skipped_check' => $skipped_check, + 'unsupported_gateways' => implode( ',', $unsupported_gateways ), + ), + $sendback + ); + + return $sendback; + } + + /** + * Admin notices. + * + * @return void + */ + public function admin_notices() { + if ( filter_has_var( INPUT_GET, 'status_updated' ) ) { + $updated = filter_input( INPUT_GET, 'status_updated', FILTER_VALIDATE_INT ); + + if ( $updated > 0 ) { + /* translators: %s: number updated payments */ + $message = sprintf( _n( '%s payment updated.', '%s payments updated.', $updated, 'pronamic_ideal' ), number_format_i18n( $updated ) ); + + printf( + '

    %s

    ', + esc_html( $message ) + ); + } + } + + if ( filter_has_var( INPUT_GET, 'skipped_check' ) ) { + $skipped = filter_input( INPUT_GET, 'skipped_check', FILTER_VALIDATE_INT ); + + if ( $skipped > 0 ) { + $message = sprintf( + /* translators: %s: number skipped payments */ + _n( '%s payment is not updated because it already has a final payment status.', '%s payments are not updated because they already have a final payment status.', $skipped, 'pronamic_ideal' ), + number_format_i18n( $skipped ) + ); + + printf( + '

    %s

    ', + esc_html( $message ) + ); + } + } + + if ( filter_has_var( INPUT_GET, 'unsupported_gateways' ) ) { + $unsupported = filter_input( INPUT_GET, 'unsupported_gateways', FILTER_SANITIZE_STRING ); + + if ( '' !== $unsupported ) { + $gateways = explode( ',', $unsupported ); + $gateways = array_filter( $gateways ); + $gateways = array_unique( $gateways ); + + if ( empty( $gateways ) ) { + return; + } + + $query = new WP_Query( + array( + 'post_type' => 'pronamic_gateway', + 'post__in' => $gateways, + 'nopaging' => true, + 'ignore_sticky_posts' => true, + 'no_found_rows' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + ) + ); + + $titles = wp_list_pluck( $query->posts, 'post_title' ); + + /* translators: %s: gateways lists */ + $message = sprintf( __( 'Requesting the current payment status is unsupported by %s.', 'pronamic_ideal' ), implode( ', ', $titles ) ); + + printf( + '

    %s

    ', + esc_html( $message ) + ); + } + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php new file mode 100644 index 00000000..81bcbcbc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminPaymentPostType.php @@ -0,0 +1,767 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentPostType; +use Pronamic\WordPress\Pay\Plugin; +use WP_Post; +use WP_Query; + +/** + * WordPress admin payment post type + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.0 + */ +class AdminPaymentPostType { + /** + * Post type. + * + * @var string + */ + const POST_TYPE = 'pronamic_payment'; + + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Admin notices. + * + * @var array + */ + private $admin_notices = array(); + + /** + * Constructs and initializes an admin payment post type object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + add_filter( 'request', array( $this, 'request' ) ); + + add_filter( 'manage_edit-' . self::POST_TYPE . '_columns', array( $this, 'columns' ) ); + add_filter( 'manage_edit-' . self::POST_TYPE . '_sortable_columns', array( $this, 'sortable_columns' ) ); + add_filter( 'list_table_primary_column', array( $this, 'primary_column' ), 10, 2 ); + + add_action( 'manage_' . self::POST_TYPE . '_posts_custom_column', array( $this, 'custom_columns' ), 10, 2 ); + + add_action( 'load-post.php', array( $this, 'maybe_process_payment_action' ) ); + add_action( 'load-post.php', array( $this, 'maybe_display_anonymized_notice' ) ); + + add_action( 'admin_notices', array( $this, 'admin_notices' ) ); + + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) ); + + add_filter( 'post_row_actions', array( $this, 'post_row_actions' ), 10, 2 ); + + add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); + + add_filter( 'default_hidden_columns', array( $this, 'default_hidden_columns' ) ); + + add_filter( 'post_updated_messages', array( $this, 'post_updated_messages' ) ); + + // Bulk Actions. + new AdminPaymentBulkActions(); + } + + /** + * Filters and sorting handler. + * + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin-post-types.php#L1585-L1596 + * + * @param array $vars Request variables. + * @return array + */ + public function request( $vars ) { + $screen = get_current_screen(); + + if ( null === $screen ) { + return $vars; + } + + // Check payment post type. + if ( self::POST_TYPE !== $screen->post_type ) { + return $vars; + } + + // Check post status var. + if ( isset( $vars['post_status'] ) && ! empty( $vars['post_status'] ) ) { + return $vars; + } + + // Set request post status from payment states. + $vars['post_status'] = array_keys( PaymentPostType::get_payment_states() ); + $vars['post_status'][] = 'publish'; + + return $vars; + } + + /** + * Maybe process payment action. + * + * @return void + */ + public function maybe_process_payment_action() { + // Current user. + if ( ! current_user_can( 'edit_payments' ) ) { + return; + } + + // Screen. + $screen = get_current_screen(); + + if ( null === $screen ) { + return; + } + + if ( ! ( 'post' === $screen->base && 'pronamic_payment' === $screen->post_type ) ) { + return; + } + + $post_id = filter_input( INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT ); + + $payment = get_pronamic_payment( $post_id ); + + if ( null === $payment ) { + return; + } + + // Status check action. + if ( filter_has_var( INPUT_GET, 'pronamic_pay_check_status' ) && check_admin_referer( 'pronamic_payment_check_status_' . $post_id ) ) { + try { + Plugin::update_payment( $payment, false ); + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + + exit; + } + + $this->admin_notices[] = array( + 'type' => 'info', + 'message' => __( 'Payment status updated.', 'pronamic_ideal' ), + ); + } + + // Create invoice action. + if ( filter_has_var( INPUT_GET, 'pronamic_pay_create_invoice' ) && check_admin_referer( 'pronamic_payment_create_invoice_' . $post_id ) ) { + $gateway = Plugin::get_gateway( $payment->get_config_id() ); + + // Admin notice. + if ( null !== $gateway && is_callable( array( $gateway, 'create_invoice' ) ) && $gateway->create_invoice( $payment ) ) { + $this->admin_notices[] = array( + 'type' => 'info', + 'message' => __( 'Invoice created.', 'pronamic_ideal' ), + ); + } else { + $this->admin_notices[] = array( + 'type' => 'error', + 'message' => __( 'Invoice could not be created.', 'pronamic_ideal' ), + ); + } + } + + // Cancel reservation action. + if ( filter_has_var( INPUT_GET, 'pronamic_pay_cancel_reservation' ) && check_admin_referer( 'pronamic_payment_cancel_reservation_' . $post_id ) ) { + $gateway = Plugin::get_gateway( $payment->get_config_id() ); + + // Admin notice. + if ( null !== $gateway && is_callable( array( $gateway, 'cancel_reservation' ) ) && $gateway->cancel_reservation( $payment ) ) { + $this->admin_notices[] = array( + 'type' => 'info', + 'message' => __( 'Reservation cancelled.', 'pronamic_ideal' ), + ); + } else { + $this->admin_notices[] = array( + 'type' => 'error', + 'message' => __( 'Reservation could not be cancelled.', 'pronamic_ideal' ), + ); + } + } + + // Send to Google Analytics action. + if ( filter_has_var( INPUT_GET, 'pronamic_pay_ga_track' ) && check_admin_referer( 'pronamic_payment_ga_track_' . $post_id ) ) { + $ga_ecommerce = pronamic_pay_plugin()->google_analytics_ecommerce; + + if ( ! $ga_ecommerce->valid_payment( $payment ) ) { + $notice = array( + 'type' => 'error', + 'message' => __( 'Payment details or an invalid tracking ID prevent payment from being tracked by Google Analytics.', 'pronamic_ideal' ), + ); + } else { + pronamic_pay_plugin()->google_analytics_ecommerce->send_transaction( $payment ); + + if ( $payment->get_ga_tracked() ) { + $notice = array( + 'type' => 'info', + 'message' => __( 'Payment sent to Google Analytics.', 'pronamic_ideal' ), + ); + } else { + $notice = array( + 'type' => 'error', + 'message' => __( 'Payment could not be sent to Google Analytics.', 'pronamic_ideal' ), + ); + } + } + + $this->admin_notices[] = $notice; + } + } + + /** + * Maybe display anonymized notice. + * + * @link https://developer.wordpress.org/reference/functions/get_current_screen/ + * @return void + */ + public function maybe_display_anonymized_notice() { + // Current user. + if ( ! current_user_can( 'edit_payments' ) ) { + return; + } + + // Screen. + $screen = get_current_screen(); + + if ( null === $screen || 'post' !== $screen->base || 'pronamic_payment' !== $screen->post_type ) { + return; + } + + $post_id = filter_input( INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT ); + + $payment = new Payment( $post_id ); + + if ( ! $payment->is_anonymized() ) { + return; + } + + $this->admin_notices[] = array( + 'type' => 'info', + 'message' => __( 'This payment has been anonymized. Personal details are not available anymore.', 'pronamic_ideal' ), + ); + } + + /** + * Admin notices. + * + * @return void + */ + public function admin_notices() { + foreach ( $this->admin_notices as $notice ) { + printf( + '

    %2$s

    ', + esc_attr( $notice['type'] ), + esc_html( $notice['message'] ) + ); + } + } + + /** + * Pre get posts. + * + * @param WP_Query $query WordPress query. + * @return void + */ + public function pre_get_posts( $query ) { + /** + * The `WP_Query::get` function can return different variable type. + * For now this function can only handle one specific string orderby. + * + * @link https://developer.wordpress.org/reference/classes/wp_query/get/ + * @link https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-includes/class-wp-query.php#L1697-L1713 + */ + $orderby = $query->get( 'orderby' ); + + if ( ! is_string( $orderby ) ) { + return; + } + + $map = array( + 'pronamic_payment_amount' => '_pronamic_payment_amount', + 'pronamic_payment_customer' => '_pronamic_payment_customer_name', + 'pronamic_payment_transaction' => '_pronamic_payment_transaction_id', + ); + + if ( ! isset( $map[ $orderby ] ) ) { + return; + } + + $meta_key = $map[ $orderby ]; + + $query->set( 'meta_key', $meta_key ); + $query->set( 'orderby', 'meta_value' ); + + // Set query meta key. + if ( 'pronamic_payment_amount' === $orderby ) { + $query->set( 'orderby', 'meta_value_num' ); + } + } + + /** + * Columns. + * + * @param array $columns Columns. + * @return array + */ + public function columns( $columns ) { + $columns = array( + 'cb' => '', + 'pronamic_payment_status' => sprintf( + '%s', + esc_html__( 'Status', 'pronamic_ideal' ), + esc_html__( 'Status', 'pronamic_ideal' ) + ), + 'pronamic_payment_subscription' => sprintf( + '%s', + esc_html__( 'Subscription', 'pronamic_ideal' ), + esc_html__( 'Subscription', 'pronamic_ideal' ) + ), + 'pronamic_payment_title' => __( 'Payment', 'pronamic_ideal' ), + 'pronamic_payment_transaction' => __( 'Transaction', 'pronamic_ideal' ), + 'pronamic_payment_gateway' => __( 'Gateway', 'pronamic_ideal' ), + 'pronamic_payment_description' => __( 'Description', 'pronamic_ideal' ), + 'pronamic_payment_customer' => __( 'Customer', 'pronamic_ideal' ), + 'pronamic_payment_amount' => __( 'Amount', 'pronamic_ideal' ), + 'pronamic_payment_date' => __( 'Date', 'pronamic_ideal' ), + ); + + return $columns; + } + + /** + * Default hidden columns. + * + * @param array $hidden Default hidden columns. + * @return array + */ + public function default_hidden_columns( $hidden ) { + $hidden[] = 'pronamic_payment_gateway'; + $hidden[] = 'pronamic_payment_description'; + + return $hidden; + } + + /** + * Sortable columns. + * + * @param array $sortable_columns Sortable columns. + * @return array + */ + public function sortable_columns( $sortable_columns ) { + $sortable_columns['pronamic_payment_title'] = 'ID'; + $sortable_columns['pronamic_payment_transaction'] = 'pronamic_payment_transaction'; + $sortable_columns['pronamic_payment_customer'] = 'pronamic_payment_customer'; + $sortable_columns['pronamic_payment_amount'] = 'pronamic_payment_amount'; + $sortable_columns['pronamic_payment_date'] = 'date'; + + return $sortable_columns; + } + + /** + * Primary column name. + * + * @param string $column_name Primary column name. + * @param string $screen_id Screen ID. + * + * @return string + */ + public function primary_column( $column_name, $screen_id ) { + if ( 'edit-pronamic_payment' !== $screen_id ) { + return $column_name; + } + + return 'pronamic_payment_title'; + } + + /** + * Custom columns. + * + * @link https://codex.wordpress.org/Plugin_API/Action_Reference/manage_$post_type_posts_custom_column + * @link https://developer.wordpress.org/reference/functions/get_post_status/ + * @link https://developer.wordpress.org/reference/functions/get_post_status_object/ + * + * @param string $column Column. + * @param int $post_id Post ID. + * @return void + */ + public function custom_columns( $column, $post_id ) { + $payment = get_pronamic_payment( $post_id ); + + if ( null === $payment ) { + return; + } + + switch ( $column ) { + case 'pronamic_payment_status': + $post_status = get_post_status( $post_id ); + + if ( false === $post_status ) { + break; + } + + $label = __( 'Unknown', 'pronamic_ideal' ); + + if ( 'trash' === $post_status ) { + $post_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); + } + + $status_object = get_post_status_object( $post_status ); + + if ( isset( $status_object, $status_object->label ) ) { + $label = $status_object->label; + } + + printf( + '%s', + esc_attr( AdminModule::get_post_status_icon_class( $post_status ) ), + esc_attr( $label ), + esc_html( $label ) + ); + + break; + case 'pronamic_payment_subscription': + $subscription_id = get_post_meta( $post_id, '_pronamic_payment_subscription_id', true ); + $subscription_id = intval( $subscription_id ); + + if ( $subscription_id ) { + $label = __( 'Recurring payment', 'pronamic_ideal' ); + $class = 'pronamic-pay-icon-recurring'; + + $recurring = get_post_meta( $post_id, '_pronamic_payment_recurring', true ); + + if ( ! $recurring ) { + $label = __( 'First of recurring payment', 'pronamic_ideal' ); + $class = ' pronamic-pay-icon-recurring-first'; + } + + edit_post_link( + sprintf( + '%s', + esc_attr( $class ), + esc_attr( $label ), + esc_attr( $label ) + ), + '', + '', + $subscription_id + ); + } + + break; + case 'pronamic_payment_title': + $source_id = $payment->get_source_id(); + $source_description = $payment->get_source_description(); + + // Post ID text. + $text = sprintf( + '#%s', + esc_html( strval( $post_id ) ) + ); + + $link = get_edit_post_link( $post_id ); + + if ( null !== $link ) { + $text = sprintf( + '%s', + esc_url( $link ), + $text + ); + } + + // Source text. + $source_id_text = ''; + + if ( null !== $source_id ) { + $source_id_text = '#' . strval( $source_id ); + } + + $source_link = $payment->get_source_link(); + + if ( null !== $source_link ) { + $source_id_text = sprintf( + '%s', + esc_url( $source_link ), + $source_id_text + ); + } + + // Output. + echo wp_kses( + sprintf( + /* translators: 1: edit post link with post ID, 2: source description, 3: source ID text */ + __( '%1$s for %2$s %3$s', 'pronamic_ideal' ), + $text, + strval( $source_description ), + $source_id_text + ), + array( + 'a' => array( + 'href' => true, + 'class' => true, + ), + 'strong' => array(), + ) + ); + + break; + case 'pronamic_payment_gateway': + $config_id = get_post_meta( $post_id, '_pronamic_payment_config_id', true ); + $config_id = intval( $config_id ); + + if ( ! empty( $config_id ) ) { + echo esc_html( get_the_title( $config_id ) ); + } else { + echo '—'; + } + + break; + case 'pronamic_payment_transaction': + $transaction_id = get_post_meta( $post_id, '_pronamic_payment_transaction_id', true ); + $transaction_id = strval( $transaction_id ); + + $url = $payment->get_provider_link(); + + if ( empty( $url ) ) { + echo esc_html( $transaction_id ); + } else { + printf( + '%s', + esc_url( $url ), + esc_html( $transaction_id ) + ); + } + + break; + case 'pronamic_payment_description': + echo esc_html( get_post_meta( $post_id, '_pronamic_payment_description', true ) ); + + break; + case 'pronamic_payment_amount': + echo esc_html( $payment->get_total_amount()->format_i18n() ); + + break; + case 'pronamic_payment_date': + echo esc_html( $payment->date->format_i18n() ); + + break; + case 'pronamic_payment_customer': + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + $text = \strval( $customer->get_name() ); + + if ( empty( $text ) ) { + $text = \strval( $customer->get_email() ); + } + + echo \esc_html( $text ); + } + + break; + } + } + + /** + * Add meta boxes. + * + * @param string $post_type Post Type. + * @return void + */ + public function add_meta_boxes( $post_type ) { + if ( self::POST_TYPE !== $post_type ) { + return; + } + + add_meta_box( + 'pronamic_payment', + __( 'Payment', 'pronamic_ideal' ), + array( $this, 'meta_box_info' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_payment_lines', + __( 'Payment Lines', 'pronamic_ideal' ), + array( $this, 'meta_box_lines' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_payment_subscription', + __( 'Subscription', 'pronamic_ideal' ), + array( $this, 'meta_box_subscription' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_payment_notes', + __( 'Notes', 'pronamic_ideal' ), + array( $this, 'meta_box_notes' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_payment_update', + __( 'Update', 'pronamic_ideal' ), + array( $this, 'meta_box_update' ), + $post_type, + 'side', + 'high' + ); + + // @link http://kovshenin.com/2012/how-to-remove-the-publish-box-from-a-post-type/. + remove_meta_box( 'submitdiv', $post_type, 'side' ); + } + + /** + * Pronamic Pay gateway config meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_info( $post ) { + include __DIR__ . '/../../views/meta-box-payment-info.php'; + } + + /** + * Pronamic Pay payment lines meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_lines( $post ) { + $payment = get_pronamic_payment( $post->ID ); + + if ( null === $payment ) { + return; + } + + $lines = $payment->get_lines(); + + include __DIR__ . '/../../views/meta-box-payment-lines.php'; + } + + /** + * Pronamic Pay gateway config meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_notes( $post ) { + $notes = get_comments( + array( + 'post_id' => $post->ID, + 'type' => 'payment_note', + 'orderby' => array( 'comment_date_gmt', 'comment_ID' ), + ) + ); + + include __DIR__ . '/../../views/meta-box-notes.php'; + } + + /** + * Pronamic Pay payment subscription meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_subscription( $post ) { + include __DIR__ . '/../../views/meta-box-payment-subscription.php'; + } + + /** + * Pronamic Pay gateway update meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_update( $post ) { + wp_nonce_field( 'pronamic_payment_update', 'pronamic_payment_update_nonce' ); + + include __DIR__ . '/../../views/meta-box-payment-update.php'; + } + + /** + * Post row actions. + * + * @param array $actions Actions array. + * @param WP_Post $post WordPress post. + * @return array + */ + public function post_row_actions( $actions, $post ) { + if ( self::POST_TYPE === $post->post_type ) { + return array( '' ); + } + + return $actions; + } + + /** + * Post updated messages. + * + * @link https://codex.wordpress.org/Function_Reference/register_post_type + * @link https://github.com/WordPress/WordPress/blob/4.4.2/wp-admin/edit-form-advanced.php#L134-L173 + * @link https://github.com/woothemes/woocommerce/blob/2.5.5/includes/admin/class-wc-admin-post-types.php#L111-L168 + * @param array $messages Message. + * @return array + */ + public function post_updated_messages( $messages ) { + global $post; + + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352797&filters[translation_id]=37948900 + $scheduled_date = date_i18n( __( 'M j, Y @ H:i', 'pronamic_ideal' ), strtotime( $post->post_date ) ); + + $messages[ self::POST_TYPE ] = array( + 0 => '', // Unused. Messages start at index 1. + 1 => __( 'Payment updated.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352799&filters[translation_id]=37947229. + 2 => $messages['post'][2], + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352800&filters[translation_id]=37947870. + 3 => $messages['post'][3], + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352798&filters[translation_id]=37947230. + 4 => __( 'Payment updated.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352801&filters[translation_id]=37947231. + /* phpcs:disable WordPress.Security.NonceVerification.Recommended */ + /* translators: %s: date and time of the revision */ + 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Payment restored to revision from %s.', 'pronamic_ideal' ), strval( wp_post_revision_title( (int) $_GET['revision'], false ) ) ) : false, + /* phpcs:enable WordPress.Security.NonceVerification.Recommended */ + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352802&filters[translation_id]=37949178. + 6 => __( 'Payment published.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352803&filters[translation_id]=37947232. + 7 => __( 'Payment saved.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352804&filters[translation_id]=37949303. + 8 => __( 'Payment submitted.', 'pronamic_ideal' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352805&filters[translation_id]=37949302. + /* translators: %s: scheduled date */ + 9 => sprintf( __( 'Payment scheduled for: %s.', 'pronamic_ideal' ), '' . $scheduled_date . '' ), + // @link https://translate.wordpress.org/projects/wp/4.4.x/admin/nl/default?filters[status]=either&filters[original_id]=2352806&filters[translation_id]=37949301. + 10 => __( 'Payment draft updated.', 'pronamic_ideal' ), + ); + + return $messages; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminReports.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminReports.php new file mode 100644 index 00000000..7b181c02 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminReports.php @@ -0,0 +1,383 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress admin reports + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class AdminReports { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Admin. + * + * @var AdminModule + */ + private $admin; + + /** + * AdminReports constructor. + * + * @param Plugin $plugin Plugin. + * @param AdminModule $admin Admin. + */ + public function __construct( Plugin $plugin, AdminModule $admin ) { + $this->plugin = $plugin; + $this->admin = $admin; + + // Actions. + add_action( 'admin_print_styles', array( $this, 'admin_css' ) ); + } + + /** + * Page reports. + * + * @return void + */ + public function page_reports() { + $this->admin->render_page( 'reports' ); + } + + /** + * Enqueue admin scripts. + * + * @return void + */ + public function admin_css() { + // Check if this is the reports page. + $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING ); + + if ( 'pronamic_pay_reports' !== $page ) { + return; + } + + $min = SCRIPT_DEBUG ? '' : '.min'; + + // Flot - http://www.flotcharts.org/. + $flot_version = '0.8.0-alpha'; + + wp_register_script( + 'flot', + plugins_url( '../../assets/flot/jquery.flot' . $min . '.js', __FILE__ ), + array( 'jquery' ), + $flot_version, + true + ); + + wp_register_script( + 'flot-time', + plugins_url( '../../assets/flot/jquery.flot.time' . $min . '.js', __FILE__ ), + array( 'flot' ), + $flot_version, + true + ); + + wp_register_script( + 'flot-resize', + plugins_url( '../../assets/flot/jquery.flot.resize' . $min . '.js', __FILE__ ), + array( 'flot' ), + $flot_version, + true + ); + + // Accounting.js - http://openexchangerates.github.io/accounting.js. + wp_register_script( + 'accounting', + plugins_url( '../../assets/accounting/accounting' . $min . '.js', __FILE__ ), + array( 'jquery' ), + '0.4.1', + true + ); + + // Reports. + wp_register_script( + 'proanmic-pay-admin-reports', + plugins_url( '../../js/dist/admin-reports' . $min . '.js', __FILE__ ), + array( + 'jquery', + 'flot', + 'flot-time', + 'flot-resize', + 'accounting', + ), + $this->plugin->get_version(), + true + ); + + global $wp_locale; + + wp_localize_script( + 'proanmic-pay-admin-reports', + 'pronamicPayAdminReports', + array( + 'data' => $this->get_reports(), + 'monthNames' => array_values( $wp_locale->month_abbrev ), + ) + ); + + // Enqueue. + wp_enqueue_script( 'proanmic-pay-admin-reports' ); + } + + /** + * Get reports. + * + * @return array + */ + public function get_reports() { + try { + $start = new \DateTime( 'First day of January' ); + $end = new \DateTime( 'Last day of December' ); + } catch ( \Exception $e ) { + return array(); + } + + $data = array( + (object) array( + 'label' => __( 'Number successful payments', 'pronamic_ideal' ), + 'data' => $this->get_report( 'payment_completed', 'COUNT', $start, $end ), + 'color' => '#dbe1e3', + 'bars' => (object) array( + 'fillColor' => '#dbe1e3', + 'fill' => true, + 'show' => true, + 'lineWidth' => 0, + 'barWidth' => 2419200000 * 0.5, + 'align' => 'center', + ), + 'shadowSize' => 0, + 'hoverable' => false, + 'class' => 'completed-count', + ), + (object) array( + 'label' => __( 'Open payments', 'pronamic_ideal' ), + 'data' => $this->get_report( 'payment_pending', 'SUM', $start, $end ), + 'yaxis' => 2, + 'color' => '#b1d4ea', + 'points' => (object) array( + 'show' => true, + 'radius' => 5, + 'lineWidth' => 2, + 'fillColor' => '#FFF', + 'fill' => true, + ), + 'lines' => (object) array( + 'show' => true, + 'lineWidth' => 2, + 'fill' => false, + ), + 'shadowSize' => 0, + 'tooltipFormatter' => 'money', + 'class' => 'pending-sum', + ), + (object) array( + 'label' => __( 'Successful payments', 'pronamic_ideal' ), + 'data' => $this->get_report( 'payment_completed', 'SUM', $start, $end ), + 'yaxis' => 2, + 'color' => '#3498db', + 'points' => (object) array( + 'show' => true, + 'radius' => 6, + 'lineWidth' => 4, + 'fillColor' => '#FFF', + 'fill' => true, + ), + 'lines' => (object) array( + 'show' => true, + 'lineWidth' => 5, + 'fill' => false, + ), + 'shadowSize' => 0, + 'prepend_tooltip' => '€ ', + 'tooltipFormatter' => 'money', + 'class' => 'completed-sum', + ), + (object) array( + 'label' => __( 'Cancelled payments', 'pronamic_ideal' ), + 'data' => $this->get_report( 'payment_cancelled', 'SUM', $start, $end ), + 'yaxis' => 2, + 'color' => '#F1C40F', + 'points' => (object) array( + 'show' => true, + 'radius' => 5, + 'lineWidth' => 2, + 'fillColor' => '#FFF', + 'fill' => true, + ), + 'lines' => (object) array( + 'show' => true, + 'lineWidth' => 2, + 'fill' => false, + ), + 'shadowSize' => 0, + 'prepend_tooltip' => '€ ', + 'tooltipFormatter' => 'money', + 'class' => 'cancelled-sum', + ), + (object) array( + 'label' => __( 'Expired payments', 'pronamic_ideal' ), + 'data' => $this->get_report( 'payment_expired', 'SUM', $start, $end ), + 'yaxis' => 2, + 'color' => '#DBE1E3', + 'points' => (object) array( + 'show' => true, + 'radius' => 5, + 'lineWidth' => 2, + 'fillColor' => '#FFF', + 'fill' => true, + ), + 'lines' => (object) array( + 'show' => true, + 'lineWidth' => 2, + 'fill' => false, + ), + 'shadowSize' => 0, + 'prepend_tooltip' => '€ ', + 'tooltipFormatter' => 'money', + 'class' => 'expired-sum', + ), + (object) array( + 'label' => __( 'Failed payments', 'pronamic_ideal' ), + 'data' => $this->get_report( 'payment_failed', 'SUM', $start, $end ), + 'yaxis' => 2, + 'color' => '#E74C3C', + 'points' => (object) array( + 'show' => true, + 'radius' => 5, + 'lineWidth' => 2, + 'fillColor' => '#FFF', + 'fill' => true, + ), + 'lines' => (object) array( + 'show' => true, + 'lineWidth' => 2, + 'fill' => false, + ), + 'shadowSize' => 0, + 'prepend_tooltip' => '€ ', + 'tooltipFormatter' => 'money', + 'class' => 'failed-sum', + ), + ); + + foreach ( $data as $serie ) { + // @codingStandardsIgnoreStart + $serie->legendValue = array_sum( wp_list_pluck( $serie->data, 1 ) ); + // @codingStandardsIgnoreEnd + } + + return $data; + } + + /** + * Get report. + * + * @link https://github.com/woothemes/woocommerce/blob/2.3.11/assets/js/admin/reports.js + * @link https://github.com/woothemes/woocommerce/blob/master/includes/admin/reports/class-wc-report-sales-by-date.php + * + * @param string $status Status. + * @param string $function Function. + * @param \DateTime $start Start date. + * @param \DateTime $end End date. + * + * @return array + * + * @throws \Exception Throws exception on date interval error. + */ + private function get_report( $status, $function, $start, $end ) { + global $wpdb; + + $interval = new \DateInterval( 'P1M' ); + $period = new \DatePeriod( $start, $interval, $end ); + + $date_format = '%Y-%m'; + + /* phpcs:ignore WordPress.DB.DirectDatabaseQuery */ + $results = $wpdb->get_results( + $wpdb->prepare( + " + SELECT + DATE_FORMAT( post.post_date, %s ) AS month, + post.ID + FROM + $wpdb->posts AS post + WHERE + post.post_type = 'pronamic_payment' + AND + post.post_date BETWEEN %s AND %s + AND + post.post_status = %s + ORDER BY + post_date + ; + ", + $date_format, + $start->format( 'Y-m-d' ), + $end->format( 'Y-m-d' ), + $status + ) + ); + + $months = wp_list_pluck( $results, 'month' ); + + switch ( $function ) { + case 'COUNT': + $data = array_count_values( $months ); + + break; + case 'SUM': + $data = array_fill_keys( + $months, + 0 + ); + + foreach ( $results as $post ) { + $payment = new Payment( $post->ID ); + + $data[ $post->month ] += $payment->get_total_amount()->get_value(); + } + + break; + } + + $report = array(); + + foreach ( $period as $date ) { + $key = $date->format( 'Y-m' ); + + $value = 0; + + if ( isset( $data[ $key ] ) ) { + $value = (float) $data[ $key ]; + } + + $report[] = array( + // Flot requires milliseconds so multiply with 1000. + $date->getTimestamp() * 1000, + $value, + ); + } + + return $report; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminSettings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminSettings.php new file mode 100644 index 00000000..eb3cf058 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminSettings.php @@ -0,0 +1,322 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Util; + +/** + * WordPress iDEAL admin + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class AdminSettings { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initialize an admin object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'admin_init', array( $this, 'admin_init' ) ); + } + + /** + * Admin initialize. + * + * @return void + */ + public function admin_init() { + // Settings - General. + add_settings_section( + 'pronamic_pay_general', + __( 'General', 'pronamic_ideal' ), + array( $this, 'settings_section' ), + 'pronamic_pay' + ); + + add_settings_field( + 'pronamic_pay_license_key', + __( 'Support License Key', 'pronamic_ideal' ), + array( $this, 'input_license_key' ), + 'pronamic_pay', + 'pronamic_pay_general', + array( + 'label_for' => 'pronamic_pay_license_key', + 'classes' => 'regular-text code', + ) + ); + + // Default Config. + add_settings_field( + 'pronamic_pay_config_id', + __( 'Default Gateway', 'pronamic_ideal' ), + array( $this, 'input_page' ), + 'pronamic_pay', + 'pronamic_pay_general', + array( + 'post_type' => 'pronamic_gateway', + 'show_option_none' => __( '— Select a gateway —', 'pronamic_ideal' ), + 'label_for' => 'pronamic_pay_config_id', + ) + ); + + // Google Analytics property UA code. + add_settings_field( + 'pronamic_pay_google_analytics_property', + __( 'Google Analytics tracking ID', 'pronamic_ideal' ), + array( $this, 'input_element' ), + 'pronamic_pay', + 'pronamic_pay_general', + array( + 'description' => __( 'Set a Google Analytics tracking UA code to track ecommerce revenue.', 'pronamic_ideal' ), + 'label_for' => 'pronamic_pay_google_analytics_property', + 'classes' => 'regular-text code', + ) + ); + + // Remove data on uninstall. + add_settings_field( + 'pronamic_pay_uninstall_clear_data', + __( 'Remove Data', 'pronamic_ideal' ), + array( $this, 'input_checkbox' ), + 'pronamic_pay', + 'pronamic_pay_general', + array( + 'legend' => __( 'Remove Data', 'pronamic_ideal' ), + 'description' => __( 'Remove all plugin data on uninstall', 'pronamic_ideal' ), + 'label_for' => 'pronamic_pay_uninstall_clear_data', + 'classes' => 'regular-text', + 'type' => 'checkbox', + ) + ); + + // Debug mode. + $debug_mode_args = array( + 'legend' => \__( 'Debug Mode', 'pronamic_ideal' ), + 'description' => \__( 'Enable debug mode', 'pronamic_ideal' ), + 'label_for' => 'pronamic_pay_debug_mode', + 'type' => 'checkbox', + ); + + if ( \PRONAMIC_PAY_DEBUG ) { + $debug_mode_args['value'] = true; + $debug_mode_args['disabled'] = \disabled( \PRONAMIC_PAY_DEBUG, true, false ); + } + + \add_settings_field( + 'pronamic_pay_debug_mode', + \__( 'Debug Mode', 'pronamic_ideal' ), + array( $this, 'input_checkbox' ), + 'pronamic_pay', + 'pronamic_pay_general', + $debug_mode_args + ); + + // Settings - Pages. + add_settings_section( + 'pronamic_pay_pages', + __( 'Payment Status Pages', 'pronamic_ideal' ), + array( $this, 'settings_section' ), + 'pronamic_pay' + ); + + $pages = $this->plugin->get_pages(); + + $pages['pronamic_pay_subscription_canceled_page_id'] = __( 'Subscription Canceled', 'pronamic_ideal' ); + + foreach ( $pages as $id => $label ) { + add_settings_field( + $id, + $label, + array( $this, 'input_page' ), + 'pronamic_pay', + 'pronamic_pay_pages', + array( + 'label_for' => $id, + ) + ); + } + } + + /** + * Settings section. + * + * @param array $args Arguments. + * @return void + */ + public function settings_section( $args ) { + switch ( $args['id'] ) { + case 'pronamic_pay_pages': + echo '

    '; + esc_html_e( 'The page an user will get redirected to after payment, based on the payment status.', 'pronamic_ideal' ); + echo '

    '; + + $pages = array( 'completed', 'cancel', 'expired', 'error', 'unknown' ); + + foreach ( $pages as $status ) { + $option_name = sprintf( 'pronamic_pay_%s_page_id', $status ); + + $option = get_option( $option_name ); + + if ( ! empty( $option ) ) { + $hide_button = true; + } + } + + if ( ! isset( $hide_button ) ) { + submit_button( + __( 'Set default pages', 'pronamic_ideal' ), + '', + 'pronamic_pay_create_pages', + false + ); + } + + break; + } + } + + /** + * Input text. + * + * @param array $args Arguments. + * @return void + */ + public function input_element( $args ) { + $defaults = array( + 'type' => 'text', + 'classes' => 'regular-text', + 'description' => '', + ); + + $args = wp_parse_args( $args, $defaults ); + + $name = $args['label_for']; + $value = get_option( $name ); + + $atts = array( + 'name' => $name, + 'id' => $name, + 'type' => $args['type'], + 'class' => $args['classes'], + 'value' => $value, + ); + + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $atts ) + // @codingStandardsIgnoreEn + ); + + if ( ! empty( $args['description'] ) ) { + printf( + '

    %s

    ', + esc_html( $args['description'] ) + ); + } + } + + /** + * Input checkbox. + * + * @link https://github.com/WordPress/WordPress/blob/4.9.1/wp-admin/options-writing.php#L60-L68 + * @link https://github.com/WordPress/WordPress/blob/4.9.1/wp-admin/options-reading.php#L110-L141 + * @param array $args Arguments. + * @return void + */ + public function input_checkbox( $args ) { + $id = $args['label_for']; + $name = $args['label_for']; + $value = \array_key_exists( 'value', $args ) ? $args['value'] : get_option( $name ); + $legend = $args['legend']; + + echo '
    '; + + printf( + '%s', + esc_html( $legend ) + ); + + printf( + ''; + + echo '
    '; + } + + /** + * Input license key. + * + * @param array $args Arguments. + * @return void + */ + public function input_license_key( $args ) { + do_action( 'pronamic_pay_license_check' ); + + $this->input_element( $args ); + + $status = get_option( 'pronamic_pay_license_status' ); + + $icon = 'valid' === $status ? 'yes' : 'no'; + + printf( '', esc_attr( $icon ) ); + } + + /** + * Input page. + * + * @param array $args Arguments. + * @return void + */ + public function input_page( $args ) { + $name = $args['label_for']; + + $selected = get_option( $name, '' ); + + if ( false === $selected ) { + $selected = ''; + } + + wp_dropdown_pages( array( + 'name' => esc_attr( $name ), + 'post_type' => esc_attr( isset( $args['post_type'] ) ? $args['post_type'] : 'page' ), + 'selected' => esc_attr( $selected ), + 'show_option_none' => esc_attr( isset( $args['show_option_none'] ) ? $args['show_option_none'] : __( '— Select a page —', 'pronamic_ideal' ) ), + 'class' => 'regular-text', + ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php new file mode 100644 index 00000000..4f4f3ebc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminSubscriptionPostType.php @@ -0,0 +1,678 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; +use Pronamic\WordPress\Pay\Util; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPostType; +use WP_Post; +use WP_Query; + +/** + * WordPress admin subscription post type + * + * @author Reüel van der Steege + * @version 2.5.0 + * @since 1.0.0 + */ +class AdminSubscriptionPostType { + /** + * Post type. + * + * @var string + */ + const POST_TYPE = 'pronamic_pay_subscr'; + + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initializes an admin payment post type object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + add_filter( 'request', array( $this, 'request' ) ); + + add_filter( 'manage_edit-' . self::POST_TYPE . '_columns', array( $this, 'columns' ) ); + add_filter( 'manage_edit-' . self::POST_TYPE . '_sortable_columns', array( $this, 'sortable_columns' ) ); + add_filter( 'list_table_primary_column', array( $this, 'primary_column' ), 10, 2 ); + + add_action( 'manage_' . self::POST_TYPE . '_posts_custom_column', array( $this, 'custom_columns' ), 10, 2 ); + + add_action( 'load-post.php', array( $this, 'maybe_process_subscription_action' ) ); + + add_action( 'admin_notices', array( $this, 'admin_notices' ) ); + + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) ); + + add_filter( 'post_row_actions', array( $this, 'post_row_actions' ), 10, 2 ); + + add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); + + add_filter( 'removable_query_args', array( $this, 'removable_query_args' ) ); + } + + /** + * Filters and sorting handler. + * + * @link https://github.com/woothemes/woocommerce/blob/2.3.13/includes/admin/class-wc-admin-post-types.php#L1585-L1596 + * + * @param array $vars Request variables. + * @return array + */ + public function request( $vars ) { + $screen = get_current_screen(); + + if ( null === $screen ) { + return $vars; + } + + // Check payment post type. + if ( self::POST_TYPE !== $screen->post_type ) { + return $vars; + } + + // Check post status var. + if ( isset( $vars['post_status'] ) && ! empty( $vars['post_status'] ) ) { + return $vars; + } + + // Set request post status from payment states. + $vars['post_status'] = array_keys( SubscriptionPostType::get_states() ); + $vars['post_status'][] = 'publish'; + + return $vars; + } + + /** + * Removable query arguments. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/misc.php#L1204-L1230 + * @link https://developer.wordpress.org/reference/functions/wp_removable_query_args/ + * @param array $args Arguments. + * @return array + */ + public function removable_query_args( $args ) { + $args[] = 'pronamic_payment_created'; + + return $args; + } + + /** + * Maybe process subscription action. + * + * @return void + */ + public function maybe_process_subscription_action() { + // Current user. + if ( ! \current_user_can( 'edit_payments' ) ) { + return; + } + + // Screen. + $screen = \get_current_screen(); + + if ( null === $screen ) { + return; + } + + if ( ! ( 'post' === $screen->base && 'pronamic_pay_subscr' === $screen->post_type ) ) { + return; + } + + $post_id = \filter_input( \INPUT_GET, 'post', \FILTER_SANITIZE_NUMBER_INT ); + + $subscription = \get_pronamic_subscription( $post_id ); + + if ( null === $subscription ) { + return; + } + + // Start payment for next period action. + if ( \filter_input( \INPUT_GET, 'pronamic_next_period', \FILTER_VALIDATE_BOOLEAN ) && \check_admin_referer( 'pronamic_next_period_' . $post_id ) ) { + $payment = $this->plugin->subscriptions_module->start_next_period_payment( $subscription ); + + if ( null !== $payment ) { + // Redirect for notice. + $url = \add_query_arg( + 'pronamic_payment_created', + $payment->get_id(), + \get_edit_post_link( $post_id, 'raw' ) + ); + + \wp_safe_redirect( $url ); + } + } + + // Payment retry action. + $payment_id = \filter_input( \INPUT_GET, 'pronamic_retry_payment', \FILTER_SANITIZE_NUMBER_INT ); + + if ( null !== $payment_id && \check_admin_referer( 'pronamic_retry_payment_' . $payment_id ) ) { + $payment = \get_pronamic_payment( $payment_id ); + + if ( null !== $payment ) { + $payments = $this->plugin->subscriptions_module->retry_payment( $payment ); + + if ( ! empty( $payments ) ) { + $payment_ids = array(); + + foreach ( $payments as $payment ) { + $payment_ids[] = $payment->get_id(); + } + + // Redirect for notice. + $url = \add_query_arg( + 'pronamic_payment_created', + \rawurlencode( \implode( ',', $payment_ids ) ), + \get_edit_post_link( $post_id, 'raw' ) + ); + + \wp_safe_redirect( $url ); + } + } + } + } + + /** + * Admin notices. + * + * @return void + */ + public function admin_notices() { + // Payment created for period. + $payment_ids = \wp_parse_id_list( \filter_input( \INPUT_GET, 'pronamic_payment_created', \FILTER_SANITIZE_STRING ) ); + + foreach ( $payment_ids as $payment_id ) { + $edit_post_link = \sprintf( + /* translators: %d: payment ID */ + __( 'Payment #%d', 'pronamic_ideal' ), + $payment_id + ); + + // Add post edit link. + $edit_post_url = \get_edit_post_link( $payment_id ); + + if ( null !== $edit_post_url ) { + $edit_post_link = \sprintf( + '%2$s', + \esc_url( $edit_post_url ), + $edit_post_link + ); + } + + // Display notice. + \printf( + '

    %1$s

    ', + \wp_kses_post( + \sprintf( + /* translators: %s: payment post edit link */ + __( '%s has been created.', 'pronamic_ideal' ), + \wp_kses_post( $edit_post_link ) + ) + ) + ); + } + } + + /** + * Pre get posts. + * + * @param WP_Query $query WordPress query. + * @return void + */ + public function pre_get_posts( $query ) { + /** + * The `WP_Query::get` function can return different variable type. + * For now this function can only handle one specific string orderby. + * + * @link https://developer.wordpress.org/reference/classes/wp_query/get/ + * @link https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters + * @link https://github.com/WordPress/WordPress/blob/5.2/wp-includes/class-wp-query.php#L1697-L1713 + */ + $orderby = $query->get( 'orderby' ); + + if ( ! is_string( $orderby ) ) { + return; + } + + $map = array( + 'pronamic_subscription_amount' => '_pronamic_subscription_amount', + 'pronamic_subscription_customer' => '_pronamic_subscription_customer_name', + ); + + if ( ! isset( $map[ $orderby ] ) ) { + return; + } + + $meta_key = $map[ $orderby ]; + + $query->set( 'meta_key', $meta_key ); + $query->set( 'orderby', 'meta_value' ); + + // Set query meta key. + if ( 'pronamic_subscription_amount' === $orderby ) { + $query->set( 'orderby', 'meta_value_num' ); + } + } + + /** + * Columns. + * + * @param array $columns Columns. + * @return array + */ + public function columns( $columns ) { + $columns = array( + 'cb' => '', + 'pronamic_subscription_status' => sprintf( + '%s', + esc_html__( 'Status', 'pronamic_ideal' ), + esc_html__( 'Status', 'pronamic_ideal' ) + ), + 'pronamic_subscription_title' => __( 'Subscription', 'pronamic_ideal' ), + 'pronamic_subscription_customer' => __( 'Customer', 'pronamic_ideal' ), + 'pronamic_subscription_amount' => __( 'Amount', 'pronamic_ideal' ), + 'pronamic_subscription_recurring' => __( 'Recurrence', 'pronamic_ideal' ), + 'pronamic_subscription_date' => __( 'Date', 'pronamic_ideal' ), + ); + + return $columns; + } + + /** + * Sortable columns. + * + * @param array $sortable_columns Sortable columns. + * @return array + */ + public function sortable_columns( $sortable_columns ) { + $sortable_columns['pronamic_subscription_title'] = 'ID'; + $sortable_columns['pronamic_subscription_amount'] = 'pronamic_subscription_amount'; + $sortable_columns['pronamic_subscription_customer'] = 'pronamic_subscription_customer_name'; + $sortable_columns['pronamic_subscription_date'] = 'date'; + + return $sortable_columns; + } + + /** + * Primary column name. + * + * @param string $column_name Primary column name. + * @param string $screen_id Screen ID. + * + * @return string + */ + public function primary_column( $column_name, $screen_id ) { + if ( 'edit-pronamic_pay_subscr' !== $screen_id ) { + return $column_name; + } + + return 'pronamic_subscription_title'; + } + + /** + * Custom columns. + * + * @link https://github.com/WordPress/WordPress/blob/5.1/wp-admin/includes/class-wp-posts-list-table.php#L1183-L1193 + * + * @param string $column Column. + * @param int $post_id Post ID. + * @return void + */ + public function custom_columns( $column, $post_id ) { + $subscription = get_pronamic_subscription( $post_id ); + + if ( null === $subscription ) { + return; + } + + $phase = $subscription->get_display_phase(); + + switch ( $column ) { + case 'pronamic_subscription_status': + $post_status = get_post_status( $post_id ); + + $label = __( 'Unknown', 'pronamic_ideal' ); + + if ( 'trash' === $post_status ) { + $post_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); + } + + $status_object = get_post_status_object( $post_status ); + + if ( isset( $status_object, $status_object->label ) ) { + $label = $status_object->label; + } + + printf( + '%s', + esc_attr( AdminModule::get_post_status_icon_class( $post_status ) ), + esc_attr( $label ), + esc_html( $label ) + ); + + break; + case 'pronamic_subscription_title': + $source_id = $subscription->get_source_id(); + $source_description = $subscription->get_source_description(); + + $text = sprintf( + '#%s', + esc_html( strval( $post_id ) ) + ); + + $link = get_edit_post_link( $post_id ); + + if ( null !== $link ) { + $text = sprintf( + '%s', + esc_url( $link ), + $text + ); + } + + $source_id_text = '#' . strval( $source_id ); + + $source_link = $subscription->get_source_link(); + + if ( null !== $source_link ) { + $source_id_text = sprintf( + '%s', + esc_url( $source_link ), + $source_id_text + ); + } + + echo wp_kses( + sprintf( + /* translators: 1: edit post link with post ID, 2: source description, 3: source ID text */ + __( '%1$s for %2$s %3$s', 'pronamic_ideal' ), + $text, + $source_description, + $source_id_text + ), + array( + 'a' => array( + 'href' => true, + 'class' => true, + ), + 'strong' => array(), + ) + ); + + break; + case 'pronamic_subscription_gateway': + $payment = get_pronamic_payment_by_meta( '_pronamic_payment_subscription_id', $post_id ); + + $config_id = null; + + if ( $payment ) { + $payment_id = $payment->get_id(); + + if ( null !== $payment_id ) { + $config_id = get_post_meta( $payment_id, '_pronamic_payment_config_id', true ); + } + } + + echo empty( $config_id ) ? '—' : esc_html( get_the_title( $config_id ) ); + + break; + case 'pronamic_subscription_description': + echo esc_html( get_post_meta( $post_id, '_pronamic_subscription_description', true ) ); + + break; + case 'pronamic_subscription_amount': + echo esc_html( null === $phase ? '—' : $phase->get_amount()->format_i18n() ); + + break; + case 'pronamic_subscription_recurring': + $total_periods = ( null === $phase ? null : $phase->get_total_periods() ); + + if ( null === $phase || 1 === $total_periods ) : + // No recurrence. + echo '—'; + + elseif ( null === $total_periods ) : + // Infinite. + echo esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ); + + else : + // Fixed number of recurrences. + printf( + '%s
    %s', + esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ), + esc_html( strval( Util::format_frequency( $total_periods ) ) ) + ); + + endif; + + break; + case 'pronamic_subscription_date': + if ( null !== $subscription->date ) { + echo esc_html( $subscription->date->format_i18n() ); + } + + break; + case 'pronamic_subscription_customer': + $text = get_post_meta( $post_id, '_pronamic_subscription_customer_name', true ); + + $customer = $subscription->get_customer(); + + if ( null !== $customer ) { + $contact_name = $customer->get_name(); + + if ( null !== $contact_name ) { + $text = strval( $contact_name ); + } + + if ( empty( $text ) ) { + $text = $customer->get_email(); + } + } + + echo esc_html( $text ); + + break; + } + } + + /** + * Add meta boxes. + * + * @param string $post_type Post Type. + * @return void + */ + public function add_meta_boxes( $post_type ) { + if ( self::POST_TYPE !== $post_type ) { + return; + } + + add_meta_box( + 'pronamic_subscription', + __( 'Subscription', 'pronamic_ideal' ), + array( $this, 'meta_box_info' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_payment_lines', + __( 'Payment Lines', 'pronamic_ideal' ), + array( $this, 'meta_box_lines' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_subscription_phases', + __( 'Phases', 'pronamic_ideal' ), + array( $this, 'meta_box_phases' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_subscription_payments', + __( 'Payments', 'pronamic_ideal' ), + array( $this, 'meta_box_payments' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_subscription_notes', + __( 'Notes', 'pronamic_ideal' ), + array( $this, 'meta_box_notes' ), + $post_type, + 'normal', + 'high' + ); + + add_meta_box( + 'pronamic_subscription_update', + __( 'Update', 'pronamic_ideal' ), + array( $this, 'meta_box_update' ), + $post_type, + 'side', + 'high' + ); + + // @link http://kovshenin.com/2012/how-to-remove-the-publish-box-from-a-post-type/. + remove_meta_box( 'submitdiv', $post_type, 'side' ); + } + + /** + * Pronamic Pay subscription info meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_info( $post ) { + $subscription = get_pronamic_subscription( $post->ID ); + + if ( null === $subscription ) { + return; + } + + include __DIR__ . '/../../views/meta-box-subscription-info.php'; + } + + /** + * Pronamic Pay payment lines meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_lines( $post ) { + $subscription = get_pronamic_subscription( $post->ID ); + + if ( null === $subscription ) { + return; + } + + $lines = $subscription->get_lines(); + + include __DIR__ . '/../../views/meta-box-payment-lines.php'; + } + + /** + * Pronamic Pay subscription notes meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_notes( $post ) { + $notes = get_comments( + array( + 'post_id' => $post->ID, + 'type' => 'subscription_note', + 'orderby' => array( 'comment_date_gmt', 'comment_ID' ), + ) + ); + + include __DIR__ . '/../../views/meta-box-notes.php'; + } + + /** + * Pronamic Pay subscription phases meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_phases( $post ) { + $subscription = get_pronamic_subscription( $post->ID ); + + if ( null === $subscription ) { + return; + } + + $phases = $subscription->get_phases(); + + include __DIR__ . '/../../views/meta-box-subscription-phases.php'; + } + + /** + * Pronamic Pay subscription payments meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_payments( $post ) { + $subscription = get_pronamic_subscription( $post->ID ); + + if ( null === $subscription ) { + return; + } + + $periods = $subscription->get_payments_by_period(); + + include __DIR__ . '/../../views/meta-box-subscription-payments.php'; + } + + /** + * Pronamic Pay subscription update meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_update( $post ) { + wp_nonce_field( 'pronamic_subscription_update', 'pronamic_subscription_update_nonce' ); + + include __DIR__ . '/../../views/meta-box-subscription-update.php'; + } + + /** + * Post row actions. + * + * @param array $actions Actions array. + * @param WP_Post $post WordPress post. + * @return array + */ + public function post_row_actions( $actions, $post ) { + if ( self::POST_TYPE === $post->post_type ) { + $actions = array( '' ); + } + + return $actions; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminTour.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminTour.php new file mode 100644 index 00000000..c7b333be --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/AdminTour.php @@ -0,0 +1,310 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * WordPress admin tour + * + * @author Remco Tolsma + * @version 2.4.0 + * @since 1.0.0 + */ +class AdminTour { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initializes an pointers object. + * + * @link https://github.com/WordPress/WordPress/blob/4.2.4/wp-includes/js/wp-pointer.js + * @link https://github.com/WordPress/WordPress/blob/4.2.4/wp-admin/includes/template.php#L1955-L2016 + * @link https://github.com/Yoast/wordpress-seo/blob/2.3.4/admin/class-pointers.php + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'admin_init', array( $this, 'admin_init' ) ); + } + + /** + * Admin initialize. + * + * @return void + */ + public function admin_init() { + if ( filter_has_var( INPUT_GET, 'pronamic_pay_ignore_tour' ) && wp_verify_nonce( filter_input( INPUT_GET, 'pronamic_pay_nonce', FILTER_SANITIZE_STRING ), 'pronamic_pay_ignore_tour' ) ) { + $ignore = filter_input( INPUT_GET, 'pronamic_pay_ignore_tour', FILTER_VALIDATE_BOOLEAN ); + + update_user_meta( get_current_user_id(), 'pronamic_pay_ignore_tour', $ignore ); + } + + if ( ! get_user_meta( get_current_user_id(), 'pronamic_pay_ignore_tour', true ) ) { + add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); + } + } + + /** + * Admin enqueue scripts. + * + * @return void + */ + public function admin_enqueue_scripts() { + $min = SCRIPT_DEBUG ? '' : '.min'; + + // Pointers. + wp_register_style( + 'pronamic-pay-admin-tour', + plugins_url( '../../css/admin-tour' . $min . '.css', __FILE__ ), + array( + 'wp-pointer', + ), + $this->plugin->get_version() + ); + + wp_register_script( + 'pronamic-pay-admin-tour', + plugins_url( '../../js/dist/admin-tour' . $min . '.js', __FILE__ ), + array( + 'jquery', + 'wp-pointer', + ), + $this->plugin->get_version(), + true + ); + + wp_localize_script( + 'pronamic-pay-admin-tour', + 'pronamicPayAdminTour', + array( + 'pointers' => $this->get_pointers(), + ) + ); + + // Enqueue. + wp_enqueue_style( 'pronamic-pay-admin-tour' ); + wp_enqueue_script( 'pronamic-pay-admin-tour' ); + } + + /** + * Get pointer content. + * + * @param string $file File. + * @return string + * @throws \Exception When output buffering is not active. + */ + private function get_content( $file ) { + $content = ''; + + $path = __DIR__ . '/../../views/' . $file . '.php'; + + if ( is_readable( $path ) ) { + ob_start(); + + include $path; + + $content = ob_get_clean(); + + if ( false === $content ) { + throw new \Exception( 'Output buffering is not active.' ); + } + } + + return $content; + } + + /** + * Get pointers. + * + * @return array + */ + private function get_pointers() { + $pointers = array(); + + $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRING ); + $screen = get_current_screen(); + + if ( null !== $screen ) { + switch ( $screen->id ) { + case 'toplevel_page_pronamic_ideal': + try { + $pointers = array( + array( + // @link https://github.com/WordPress/WordPress/blob/4.7/wp-admin/edit.php#L321 + 'selector' => '.wrap h1', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-dashboard' ), + 'position' => (object) array( + 'edge' => 'top', + 'align' => ( is_rtl() ) ? 'left' : 'right', + ), + 'pointerWidth' => 450, + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + + break; + case 'edit-pronamic_payment': + try { + $pointers = array( + array( + 'selector' => '.wrap .wp-header-end', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-payments' ), + 'position' => (object) array( + 'edge' => 'top', + 'align' => ( is_rtl() ) ? 'left' : 'right', + ), + 'pointerWidth' => 450, + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + + break; + case 'edit-pronamic_gateway': + try { + $pointers = array( + array( + 'selector' => '.wrap .wp-header-end', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-gateways' ), + 'position' => (object) array( + 'edge' => 'top', + 'align' => ( is_rtl() ) ? 'left' : 'right', + ), + 'pointerWidth' => 450, + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + + break; + case 'edit-pronamic_pay_form': + try { + $pointers = array( + array( + 'selector' => '.wrap .wp-header-end', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-forms' ), + 'position' => (object) array( + 'edge' => 'top', + 'align' => ( is_rtl() ) ? 'left' : 'right', + ), + 'pointerWidth' => 450, + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + + break; + } + } + + switch ( $page ) { + case 'pronamic_pay_settings': + try { + $pointers = array( + array( + 'selector' => '.wrap .wp-header-end', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-settings' ), + 'position' => (object) array( + 'edge' => 'top', + 'align' => ( is_rtl() ) ? 'left' : 'right', + ), + 'pointerWidth' => 450, + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + + break; + case 'pronamic_pay_reports': + try { + $pointers = array( + array( + 'selector' => '.wrap .wp-header-end', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-reports' ), + 'position' => (object) array( + 'edge' => 'top', + 'align' => ( is_rtl() ) ? 'left' : 'right', + ), + 'pointerWidth' => 450, + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + + break; + } + + if ( empty( $pointers ) ) { + try { + $pointers = array( + array( + 'selector' => 'li.toplevel_page_pronamic_ideal', + 'options' => (object) array( + 'content' => $this->get_content( 'pointer-start' ), + 'position' => (object) array( + 'edge' => 'left', + 'align' => 'center', + ), + ), + ), + ); + } catch ( \Exception $e ) { + $pointers = array(); + } + } + + return $pointers; + } + + /** + * Get tour close URL. + * + * @return string + */ + public function get_close_url() { + return wp_nonce_url( + add_query_arg( + array( + 'pronamic_pay_ignore_tour' => true, + ) + ), + 'pronamic_pay_ignore_tour', + 'pronamic_pay_nonce' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/Install.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/Install.php new file mode 100644 index 00000000..311ffeb1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Admin/Install.php @@ -0,0 +1,402 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Admin + */ + +namespace Pronamic\WordPress\Pay\Admin; + +use Pronamic\WordPress\Pay\AbstractIntegration; +use Pronamic\WordPress\Pay\Forms\FormPostType; +use Pronamic\WordPress\Pay\Payments\PaymentPostType; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Upgrades\Upgrade620; + +/** + * WordPress admin install + * + * @author Remco Tolsma + * @version 2.3.2 + * @since 1.0.0 + */ +class Install { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Admin. + * + * @var AdminModule + */ + private $admin; + + /** + * Database updates. + * + * @var array + */ + private $db_updates = array( + '2.0.0', + '2.0.1', + '3.3.0', + '3.7.0', + '3.7.2', + ); + + /** + * Constructs and initializes an install object. + * + * @link https://github.com/woothemes/woocommerce/blob/2.4.3/includes/class-wc-install.php + * + * @param Plugin $plugin Plugin. + * @param AdminModule $admin Admin. + */ + public function __construct( Plugin $plugin, AdminModule $admin ) { + $this->plugin = $plugin; + $this->admin = $admin; + + // Actions. + add_action( 'admin_init', array( $this, 'admin_init' ), 5 ); + + add_filter( 'removable_query_args', array( $this, 'removable_query_args' ) ); + } + + /** + * Admin initialize. + * + * @return void + */ + public function admin_init() { + // Install. + if ( get_option( 'pronamic_pay_version' ) !== $this->plugin->get_version() ) { + $this->install(); + } + + // Notices. + add_action( 'admin_notices', array( $this, 'admin_notice_upgrades_available' ), 20 ); + add_action( 'admin_notices', array( $this, 'admin_notice_upgraded' ), 20 ); + + // Maybe update database. + if ( filter_has_var( INPUT_GET, 'pronamic_pay_upgrade' ) && wp_verify_nonce( filter_input( INPUT_GET, 'pronamic_pay_nonce', FILTER_SANITIZE_STRING ), 'pronamic_pay_upgrade' ) ) { + $this->upgrade(); + + /** + * Redirect to admin dashboard or referer. + * + * @link https://developer.wordpress.org/reference/functions/admin_url/ + * @link https://developer.wordpress.org/reference/functions/wp_get_referer/ + * @link https://developer.wordpress.org/reference/functions/wp_safe_redirect/ + */ + $location = admin_url(); + + $referer = wp_get_referer(); + + if ( false !== $referer ) { + $location = $referer; + } + + $location = add_query_arg( + array( + 'pronamic_pay_upgrade' => false, + 'pronamic_pay_nonce' => false, + 'pronamic_pay_upgraded' => true, + ), + $location + ); + + wp_safe_redirect( $location ); + + exit; + } + } + + /** + * Removable query arguments. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/misc.php#L1204-L1230 + * @link https://developer.wordpress.org/reference/functions/wp_removable_query_args/ + * @param array $args Arguments. + * @return array + */ + public function removable_query_args( $args ) { + $args[] = 'pronamic_pay_upgraded'; + + return $args; + } + + /** + * Install. + * + * @return void + */ + private function install() { + // Roles. + $this->create_roles(); + + // Rewrite Rules. + flush_rewrite_rules(); + + // Version. + $version = $this->plugin->get_version(); + + $current_version = get_option( 'pronamic_pay_version', null ); + + // Upgrade 6.2.0 - Fixes missing subscription next payment dates. + if ( null !== $current_version && \version_compare( $current_version, '6.2.0', '<' ) ) { + $upgrade = new Upgrade620(); + + $upgrade->execute(); + } + + // Redirect. + if ( null !== $this->admin->about_page ) { + try { + $about_page_version = $this->admin->about_page->get_version(); + } catch ( \Exception $e ) { + $about_page_version = ''; + } + + $about_page_version_viewed = get_option( 'pronamic_pay_about_page_version', null ); + + $tab = null; + + if ( null === $current_version ) { + // No version? This is a new install :). + $tab = 'getting-started'; + } elseif ( version_compare( $about_page_version_viewed, $about_page_version, '<' ) ) { + // Show about page only if viewed version is lower then current version. + $tab = 'new'; + } + + if ( null !== $tab ) { + $url = add_query_arg( + array( + 'page' => 'pronamic-pay-about', + 'tab' => $tab, + ), + admin_url( 'index.php' ) + ); + + set_transient( 'pronamic_pay_admin_redirect', $url, 3600 ); + } + + update_option( 'pronamic_pay_about_page_version', $about_page_version ); + } + + // Set database version option. + $db_version = \get_option( 'pronamic_pay_db_version', null ); + + if ( null === $db_version ) { + \update_option( 'pronamic_pay_db_version', $this->plugin->get_version() ); + } + + // Update version. + update_option( 'pronamic_pay_version', $version ); + } + + /** + * Admin notice upgrades. + * + * @link https://developer.wordpress.org/reference/hooks/admin_notices/ + * @return void + */ + public function admin_notice_upgrades_available() { + if ( ! $this->requires_upgrade() ) { + return; + } + + include __DIR__ . '/../../views/notice-upgrade.php'; + } + + /** + * Admin notice upgraded. + * + * @link https://developer.wordpress.org/reference/hooks/admin_notices/ + * @return void + */ + public function admin_notice_upgraded() { + $upgraded = filter_input( INPUT_GET, 'pronamic_pay_upgraded', FILTER_VALIDATE_BOOLEAN ); + + if ( true !== $upgraded ) { + return; + } + + include __DIR__ . '/../../views/notice-upgraded.php'; + } + + /** + * Create roles. + * + * @link https://codex.wordpress.org/Function_Reference/register_post_type + * @link https://github.com/woothemes/woocommerce/blob/v2.2.3/includes/class-wc-install.php#L519-L562 + * @link https://github.com/woothemes/woocommerce/blob/v2.2.3/includes/class-wc-post-types.php#L245 + * @return void + */ + private function create_roles() { + // Payer role. + add_role( + 'payer', + __( 'Payer', 'pronamic_ideal' ), + array( + 'read' => true, + ) + ); + + // @link https://developer.wordpress.org/reference/functions/wp_roles/. + $roles = wp_roles(); + + // Payments. + $payment_capabilities = PaymentPostType::get_capabilities(); + + unset( $payment_capabilities['publish_posts'] ); + unset( $payment_capabilities['create_posts'] ); + + foreach ( $payment_capabilities as $capability ) { + $roles->add_cap( 'administrator', $capability ); + } + + // Forms. + $form_capabilities = FormPostType::get_capabilities(); + + foreach ( $form_capabilities as $capability ) { + $roles->add_cap( 'administrator', $capability ); + } + } + + /** + * Get upgradeable integrations. + * + * @return array + */ + private function get_upgradeable_integrations() { + $integrations = $this->plugin->integrations; + + $integrations = array_filter( + $integrations, + /** + * Filter integration with version option name. + * + * @param AbstractIntegration $integration Integration object. + * @return bool True if integration has version option name, false otherwise. + */ + function( $integration ) { + if ( ! $integration->is_active() ) { + return false; + } + + if ( null === $integration->get_db_version_option_name() ) { + return false; + } + + if ( ! $integration->get_upgrades()->are_executable() ) { + return false; + } + + return true; + } + ); + + return $integrations; + } + + /** + * Requires upgrade. + * + * @return bool True if database update is required, false othwerise. + */ + public function requires_upgrade() { + $current_db_version = get_option( 'pronamic_pay_db_version' ); + + if ( + // Check for old database version notation without dots, for example `366`. + false === strpos( $current_db_version, '.' ) + || + version_compare( $current_db_version, max( $this->db_updates ), '<' ) + ) { + return true; + } + + // Integrations. + $integrations = $this->get_upgradeable_integrations(); + + foreach ( $integrations as $integration ) { + $version_option = $integration->get_db_version_option(); + + if ( null === $version_option ) { + continue; + } + + $upgrades = $integration->get_upgrades(); + + foreach ( $upgrades as $upgrade ) { + if ( version_compare( $version_option, $upgrade->get_version(), '<' ) ) { + return true; + } + } + } + + return false; + } + + /** + * Upgrade. + * + * @return void + */ + public function upgrade() { + $current_db_version = get_option( 'pronamic_pay_db_version', null ); + + if ( $current_db_version ) { + foreach ( $this->db_updates as $version ) { + if ( ! version_compare( $current_db_version, $version, '<' ) ) { + continue; + } + + $file = plugin_dir_path( $this->plugin->get_file() ) . 'includes/updates/update-' . $version . '.php'; + + if ( is_readable( $file ) ) { + include $file; + + update_option( 'pronamic_pay_db_version', $version ); + } + } + } + + // Integrations. + $integrations = $this->get_upgradeable_integrations(); + + foreach ( $integrations as $integration ) { + $db_version_option_name = $integration->get_db_version_option_name(); + + if ( null === $db_version_option_name ) { + continue; + } + + $db_version_option = \strval( $integration->get_db_version_option() ); + + $upgrades = $integration->get_upgrades(); + + foreach ( $upgrades as $upgrade ) { + $version = $upgrade->get_version(); + + if ( ! version_compare( $db_version_option, $version, '<' ) ) { + continue; + } + + $upgrade->execute(); + + update_option( $db_version_option_name, $version ); + } + } + + update_option( 'pronamic_pay_db_version', $this->plugin->get_version() ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Banks/BankAccountDetails.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Banks/BankAccountDetails.php new file mode 100644 index 00000000..0aba61dd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Banks/BankAccountDetails.php @@ -0,0 +1,301 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Banks; + +/** + * Bank details + * + * @author Reüel van der Steege + * @since 2.2.6 + * @version 2.2.6 + */ +class BankAccountDetails { + /** + * Bank name. + * + * @var string|null + */ + private $bank_name; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * IBAN. + * + * @var string|null + */ + private $iban; + /** + * BIC. + * + * @var string|null + */ + private $bic; + + /** + * Account number. + * + * @var string|null + */ + private $account_number; + + /** + * Account holder city. + * + * @var string|null + */ + private $city; + + /** + * Account holder country. + * + * @var string|null + */ + private $country; + + /** + * Get bank name. + * + * @return string|null + */ + public function get_bank_name() { + return $this->bank_name; + } + + /** + * Set bank name. + * + * @param string|null $bank_name Bank name. + * @return void + */ + public function set_bank_name( $bank_name ) { + $this->bank_name = $bank_name; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get IBAN. + * + * @return string|null + */ + public function get_iban() { + return $this->iban; + } + + /** + * Set IBAN. + * + * @param string|null $iban IBAN. + * @return void + */ + public function set_iban( $iban ) { + $this->iban = $iban; + } + + /** + * Get BIC. + * + * @return string|null + */ + public function get_bic() { + return $this->bic; + } + + /** + * Set BIC. + * + * @param string|null $bic Bic. + * @return void + */ + public function set_bic( $bic ) { + $this->bic = $bic; + } + + /** + * Get account number. + * + * @return string|null + */ + public function get_account_number() { + return $this->account_number; + } + + /** + * Set account number. + * + * @param string|null $account_number Account number. + * @return void + */ + public function set_account_number( $account_number ) { + $this->account_number = $account_number; + } + + /** + * Get city. + * + * @return string|null + */ + public function get_city() { + return $this->city; + } + + /** + * Set city. + * + * @param string|null $city City. + * @return void + */ + public function set_city( $city ) { + $this->city = $city; + } + + /** + * Get country. + * + * @return string|null + */ + public function get_country() { + return $this->country; + } + + /** + * Set country. + * + * @param string|null $country Country. + * @return void + */ + public function set_country( $country ) { + $this->country = $country; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'name' => $this->get_name(), + 'account_number' => $this->get_account_number(), + 'iban' => $this->get_iban(), + 'bic' => $this->get_bic(), + 'bank_name' => $this->get_bank_name(), + 'city' => $this->get_city(), + 'country' => $this->get_country(), + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create bank account details from object. + * + * @param mixed $json JSON. + * @param BankAccountDetails|null $bank_account_details Bank account details. + * + * @return BankAccountDetails + * + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json, $bank_account_details = null ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( null === $bank_account_details ) { + $bank_account_details = new self(); + } + + if ( isset( $json->name ) ) { + $bank_account_details->set_name( $json->name ); + } + + if ( isset( $json->iban ) ) { + $bank_account_details->set_iban( $json->iban ); + } + + if ( isset( $json->bic ) ) { + $bank_account_details->set_bic( $json->bic ); + } + + if ( isset( $json->account_number ) ) { + $bank_account_details->set_account_number( $json->account_number ); + } + + if ( isset( $json->bank_name ) ) { + $bank_account_details->set_bank_name( $json->bank_name ); + } + + if ( isset( $json->city ) ) { + $bank_account_details->set_city( $json->city ); + } + + if ( isset( $json->country ) ) { + $bank_account_details->set_country( $json->country ); + } + + return $bank_account_details; + } + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + $pieces = array( + $this->get_name(), + $this->get_bank_name(), + $this->get_iban(), + $this->get_bic(), + $this->get_account_number(), + $this->get_city(), + $this->get_country(), + ); + + $pieces = array_map( 'trim', $pieces ); + + $pieces = array_filter( $pieces ); + + $string = implode( PHP_EOL, $pieces ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Banks/BankTransferDetails.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Banks/BankTransferDetails.php new file mode 100644 index 00000000..7118e29b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Banks/BankTransferDetails.php @@ -0,0 +1,151 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Banks; + +/** + * Bank transfer details + * + * @author Reüel van der Steege + * @since 2.2.6 + * @version 2.2.6 + */ +class BankTransferDetails { + /** + * Bank account details. + * + * @var BankAccountDetails|null + */ + private $bank_account; + + /** + * Reference. + * + * @var string|null + */ + private $reference; + + /** + * Get bank account. + * + * @return BankAccountDetails|null + */ + public function get_bank_account() { + return $this->bank_account; + } + + /** + * Set bank account. + * + * @param BankAccountDetails|null $bank_account Bank account. + * @return void + */ + public function set_bank_account( $bank_account ) { + $this->bank_account = $bank_account; + } + + /** + * Get reference. + * + * @return string|null + */ + public function get_reference() { + return $this->reference; + } + + /** + * Set reference. + * + * @param string|null $reference Reference. + * @return void + */ + public function set_reference( $reference ) { + $this->reference = $reference; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array(); + + // Bank account. + $bank_account = $this->get_bank_account(); + + if ( null !== $bank_account ) { + $data['bank_account'] = $bank_account->get_json(); + } + + // Reference. + $data['reference'] = $this->get_reference(); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create bank account details from object. + * + * @param mixed $json JSON. + * @param BankTransferDetails|null $bank_transfer_details Bank account details. + * + * @return BankTransferDetails + * + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json, $bank_transfer_details = null ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( null === $bank_transfer_details ) { + $bank_transfer_details = new self(); + } + + if ( isset( $json->bank_account ) ) { + $bank_transfer_details->set_bank_account( BankAccountDetails::from_json( $json->bank_account ) ); + } + + if ( isset( $json->reference ) ) { + $bank_transfer_details->set_reference( $json->reference ); + } + + return $bank_transfer_details; + } + + /** + * Create an string representation of this object + * + * @return string + */ + public function __toString() { + $pieces = array( + $this->get_bank_account(), + $this->get_reference(), + ); + + $pieces = array_map( 'strval', $pieces ); + + $pieces = array_map( 'trim', $pieces ); + + $pieces = array_filter( $pieces ); + + $string = implode( PHP_EOL, $pieces ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Blocks/BlocksModule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Blocks/BlocksModule.php new file mode 100644 index 00000000..0bd01dbb --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Blocks/BlocksModule.php @@ -0,0 +1,252 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Blocks; + +use Pronamic\WordPress\Money\Parser; +use Pronamic\WordPress\Pay\Forms\FormsSource; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use WP_Error; + +/** + * Blocks + * + * @author Reüel van der Steege + * @since 2.5.0 + * @version 2.1.7 + */ +class BlocksModule { + /** + * Setup. + * + * @return void + */ + public function setup() { + // Initialize. + add_action( 'init', array( $this, 'register_scripts' ) ); + add_action( 'init', array( $this, 'register_block_types' ) ); + + add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_styles' ) ); + + add_filter( 'block_categories', array( $this, 'block_categories' ), 10, 2 ); + + // Source text and description. + add_filter( 'pronamic_payment_source_url_' . FormsSource::BLOCK_PAYMENT_FORM, array( $this, 'source_url' ), 10, 2 ); + add_filter( 'pronamic_payment_source_text_' . FormsSource::BLOCK_PAYMENT_FORM, array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . FormsSource::BLOCK_PAYMENT_FORM, array( $this, 'source_description' ), 10, 2 ); + } + + /** + * Block categories. + * + * @param array $categories Block categories. + * @param \WP_Post $post Post being loaded. + * + * @return array + */ + public function block_categories( $categories, $post ) { + $categories[] = array( + 'slug' => 'pronamic-pay', + 'title' => __( 'Pronamic Pay', 'pronamic-ideal' ), + 'icon' => null, + ); + + return $categories; + } + + /** + * Register blocks. + * + * @return void + */ + public function register_scripts() { + // Register editor script. + $min = SCRIPT_DEBUG ? '' : '.min'; + + wp_register_script( + 'pronamic-payment-form-editor', + plugins_url( '/js/dist/block-payment-form' . $min . '.js', dirname( dirname( __FILE__ ) ) ), + array( 'wp-blocks', 'wp-components', 'wp-editor', 'wp-element' ), + pronamic_pay_plugin()->get_version(), + false + ); + + // Localize script. + wp_localize_script( + 'pronamic-payment-form-editor', + 'pronamic_payment_form', + array( + 'title' => _x( 'Payment Form', 'Block', 'pronamic_ideal' ), + 'label_add_form' => __( 'Add form', 'pronamic_ideal' ), + 'label_amount' => __( 'Amount', 'pronamic_ideal' ), + ) + ); + } + + /** + * Register block types. + * + * @return void + */ + public function register_block_types() { + register_block_type( + 'pronamic-pay/payment-form', + array( + 'render_callback' => array( $this, 'render_payment_form_block' ), + 'editor_script' => 'pronamic-payment-form-editor', + 'attributes' => array( + 'amount' => array( + 'type' => 'string', + 'default' => '0', + ), + ), + ) + ); + } + + /** + * Enqueue styles. + * + * @return void + */ + public function enqueue_styles() { + \wp_enqueue_style( 'pronamic-pay-forms' ); + } + + /** + * Render payment form block. + * + * @param array $attributes Attributes. + * + * @return string + * + * @throws \Exception When output buffering is not working as expected. + */ + public function render_payment_form_block( $attributes = array() ) { + // Amount. + $money_parser = new Parser(); + + $amount = ''; + + if ( ! empty( $attributes['amount'] ) ) { + try { + $amount = $money_parser->parse( $attributes['amount'] )->get_minor_units(); + } catch ( \Exception $e ) { + return ''; + } + } + + // Form settings. + $args = array( + 'amount' => $amount, + 'html_id' => sprintf( 'pronamic-pay-payment-form-%s', get_the_ID() ), + 'source' => FormsSource::BLOCK_PAYMENT_FORM, + 'source_id' => get_the_ID(), + ); + + // Check valid gateway. + $config_id = get_option( 'pronamic_pay_config_id' ); + + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway ) : + ob_start(); + + Plugin::render_errors( + new WP_Error( + 'pay_error', + __( 'Unable to process payments with default gateway.', 'pronamic_ideal' ) + ) + ); + + $output = ob_get_clean(); + + if ( false === $output ) { + throw new \Exception( 'Output buffering is not active.' ); + } + + return $output; + endif; + + $this->enqueue_styles(); + + // Return form output. + return pronamic_pay_plugin()->forms_module->get_form_output( $args ); + } + + /** + * Source text filter. + * + * @param string $text The source text to filter. + * @param Payment $payment The payment for the specified source text. + * + * @return string + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'Payment Form Block', 'pronamic_ideal' ); + + if ( empty( $payment->source_id ) ) { + return $text; + } + + $link = get_edit_post_link( intval( $payment->source_id ) ); + + if ( null === $link ) { + return $text; + } + + $text .= '
    '; + + $text .= sprintf( + '%s', + esc_url( $link ), + esc_html( strval( $payment->source_id ) ) + ); + + return $text; + } + + /** + * Source description filter. + * + * @param string $text The source text to filter. + * @param Payment $payment The payment for the specified source text. + * + * @return string + */ + public function source_description( $text, Payment $payment ) { + $text = __( 'Payment Form Block', 'pronamic_ideal' ) . '
    '; + + return $text; + } + + /** + * Source URL. + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + if ( empty( $payment->source_id ) ) { + return $url; + } + + $link = get_edit_post_link( intval( $payment->source_id ) ); + + if ( null === $link ) { + return $url; + } + + return $link; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Cards.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Cards.php new file mode 100644 index 00000000..94b74f0c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Cards.php @@ -0,0 +1,209 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Cards + * + * @author Reüel van der Steege + * @version 2.5.0 + * @since 2.4.0 + */ +class Cards { + /** + * Cards. + * + * @var array + */ + private $cards; + + /** + * Cards constructor. + */ + public function __construct() { + $this->register_cards(); + } + + /** + * Register cards. + * + * @return void + */ + private function register_cards() { + $this->cards = array( + // Cards. + array( + 'bic' => null, + 'brand' => 'american-express', + 'title' => __( 'American Express', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'carta-si', + 'title' => __( 'Carta Si', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'carte-bleue', + 'title' => __( 'Carte Bleue', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'dankort', + 'title' => __( 'Dankort', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'diners-club', + 'title' => __( 'Diners Club', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'discover', + 'title' => __( 'Discover', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'jcb', + 'title' => __( 'JCB', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'maestro', + 'title' => __( 'Maestro', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'mastercard', + 'title' => __( 'Mastercard', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'unionpay', + 'title' => __( 'UnionPay', 'pronamic_ideal' ), + ), + array( + 'bic' => null, + 'brand' => 'visa', + 'title' => __( 'Visa', 'pronamic_ideal' ), + ), + + // Banks. + array( + 'bic' => 'abna', + 'brand' => 'abn-amro', + 'title' => __( 'ABN Amro', 'pronamic_ideal' ), + ), + array( + 'bic' => 'asnb', + 'brand' => 'asn-bank', + 'title' => __( 'ASN Bank', 'pronamic_ideal' ), + ), + array( + 'bic' => 'bunq', + 'brand' => 'bunq', + 'title' => __( 'bunq', 'pronamic_ideal' ), + ), + array( + 'bic' => 'hand', + 'brand' => 'handelsbanken', + 'title' => __( 'Handelsbanken', 'pronamic_ideal' ), + ), + array( + 'bic' => 'ingb', + 'brand' => 'ing', + 'title' => __( 'ING Bank', 'pronamic_ideal' ), + ), + array( + 'bic' => 'knab', + 'brand' => 'knab', + 'title' => __( 'Knab', 'pronamic_ideal' ), + ), + array( + 'bic' => 'moyo', + 'brand' => 'moneyou', + 'title' => __( 'Moneyou', 'pronamic_ideal' ), + ), + array( + 'bic' => 'rabo', + 'brand' => 'rabobank', + 'title' => __( 'Rabobank', 'pronamic_ideal' ), + ), + array( + 'bic' => 'rbrb', + 'brand' => 'regiobank', + 'title' => __( 'RegioBank', 'pronamic_ideal' ), + ), + array( + 'bic' => 'snsb', + 'brand' => 'sns', + 'title' => __( 'SNS Bank', 'pronamic_ideal' ), + ), + array( + 'bic' => 'trio', + 'brand' => 'triodos-bank', + 'title' => __( 'Triodos Bank', 'pronamic_ideal' ), + ), + array( + 'bic' => 'fvlb', + 'brand' => 'van-lanschot', + 'title' => __( 'Van Lanschot', 'pronamic_ideal' ), + ), + ); + } + + /** + * Get card. + * + * @param string $bic_or_brand 4-letter ISO 9362 Bank Identifier Code (BIC) or brand name. + * @return array|null + */ + public function get_card( $bic_or_brand ) { + // Use lowercase BIC or brand without spaces. + $bic_or_brand = \strtolower( $bic_or_brand ); + + $bic_or_brand = \str_replace( ' ', '-', $bic_or_brand ); + + // Try to find card. + $cards = \wp_list_filter( + $this->cards, + array( + 'bic' => $bic_or_brand, + 'brand' => $bic_or_brand, + ), + 'OR' + ); + + $card = \array_shift( $cards ); + + // Return card details. + if ( ! empty( $card ) ) { + return $card; + } + + // No matching card. + return null; + } + + /** + * Get card logo URL. + * + * @param string $brand Brand. + * + * @return string|null + */ + public function get_card_logo_url( $brand ) { + return sprintf( + 'https://cdn.wp-pay.org/jsdelivr.net/npm/@wp-pay/logos@1.6.5/dist/cards/%1$s/card-%1$s-logo-_x80.svg', + $brand + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/ContactName.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/ContactName.php new file mode 100644 index 00000000..3ffc8cff --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/ContactName.php @@ -0,0 +1,319 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use stdClass; + +/** + * Personal Name + * + * @link https://en.wikipedia.org/wiki/Personal_name + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.4.0 + */ +class ContactName { + /** + * Full Name. + * + * @var string|null + */ + private $full_name; + + /** + * Prefix. + * + * @var string|null + * + * @link https://en.wikipedia.org/wiki/Personal_name + * @link https://en.wikipedia.org/wiki/Suffix_(name) + */ + private $prefix; + + /** + * Initials. + * + * @var string|null + * + * @link https://nl.wikipedia.org/wiki/Voorletter + */ + private $initials; + + /** + * First name. + * + * @var string|null + * + * @link https://en.wikipedia.org/wiki/Personal_name + */ + private $first_name; + + /** + * Middle name. + * + * @var string|null + * + * @link https://en.wikipedia.org/wiki/Middle_name + * @link https://en.wikipedia.org/wiki/Tussenvoegsel + */ + private $middle_name; + + /** + * Last name. + * + * @var string|null + * + * @link https://en.wikipedia.org/wiki/Personal_name + * @link https://en.wikipedia.org/wiki/Surname + */ + private $last_name; + + /** + * Suffix. + * + * @var string|null + * + * @link https://en.wikipedia.org/wiki/Personal_name + * @link https://en.wikipedia.org/wiki/Suffix_(name) + */ + private $suffix; + + /** + * Get full name. + * + * @return string|null + */ + public function get_full_name() { + return $this->full_name; + } + + /** + * Set full name. + * + * @param string|null $full_name Full name. + * @return void + */ + public function set_full_name( $full_name ) { + $this->full_name = $full_name; + } + + /** + * Get prefix. + * + * @return string|null + */ + public function get_prefix() { + return $this->prefix; + } + + /** + * Set prefix. + * + * @param string|null $prefix Prefix. + * @return void + */ + public function set_prefix( $prefix ) { + $this->prefix = $prefix; + } + + /** + * Get initials. + * + * @return string|null + */ + public function get_initials() { + return $this->initials; + } + + /** + * Set initials. + * + * @param string|null $initials Initials. + * @return void + */ + public function set_initials( $initials ) { + $this->initials = $initials; + } + + /** + * Get first name. + * + * @return string|null + */ + public function get_first_name() { + return $this->first_name; + } + + /** + * Set first name. + * + * @param string|null $first_name First name. + * @return void + */ + public function set_first_name( $first_name ) { + $this->first_name = $first_name; + } + + /** + * Get middle name. + * + * @return string|null + */ + public function get_middle_name() { + return $this->middle_name; + } + + /** + * Set middle name. + * + * @param string|null $middle_name Middle name. + * @return void + */ + public function set_middle_name( $middle_name ) { + $this->middle_name = $middle_name; + } + + /** + * Get last name. + * + * @return string|null + */ + public function get_last_name() { + return $this->last_name; + } + + /** + * Set last name. + * + * @param string|null $last_name Last name. + * @return void + */ + public function set_last_name( $last_name ) { + $this->last_name = $last_name; + } + + /** + * Get suffix. + * + * @return string|null + */ + public function get_suffix() { + return $this->suffix; + } + + /** + * Set suffix. + * + * @param string|null $suffix Suffix. + * @return void + */ + public function set_suffix( $suffix ) { + $this->suffix = $suffix; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'full_name' => $this->get_full_name(), + 'prefix' => $this->get_prefix(), + 'initials' => $this->get_initials(), + 'first_name' => $this->get_first_name(), + 'middle_name' => $this->get_middle_name(), + 'last_name' => $this->get_last_name(), + 'suffix' => $this->get_suffix(), + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create contact name from object. + * + * @param mixed $json JSON. + * @return ContactName + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an array.' ); + } + + $name = new self(); + + if ( property_exists( $json, 'full_name' ) ) { + $name->set_full_name( $json->full_name ); + } + + if ( property_exists( $json, 'prefix' ) ) { + $name->set_prefix( $json->prefix ); + } + + if ( property_exists( $json, 'initials' ) ) { + $name->set_initials( $json->initials ); + } + + if ( property_exists( $json, 'first_name' ) ) { + $name->set_first_name( $json->first_name ); + } + + if ( property_exists( $json, 'middle_name' ) ) { + $name->set_middle_name( $json->middle_name ); + } + + if ( property_exists( $json, 'last_name' ) ) { + $name->set_last_name( $json->last_name ); + } + + if ( property_exists( $json, 'suffix' ) ) { + $name->set_suffix( $json->suffix ); + } + + return $name; + } + + /** + * Create string representation of personal name. + * + * @return string + */ + public function __toString() { + $pieces = array( + $this->get_prefix(), + $this->get_first_name(), + $this->get_middle_name(), + $this->get_last_name(), + $this->get_suffix(), + ); + + $pieces = array_filter( $pieces ); + $pieces = array_map( 'trim', $pieces ); + $pieces = array_filter( $pieces ); + + $string = implode( ' ', $pieces ); + + if ( empty( $string ) ) { + $string = (string) $this->get_full_name(); + } + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/ContactNameHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/ContactNameHelper.php new file mode 100644 index 00000000..df5342b2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/ContactNameHelper.php @@ -0,0 +1,145 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use DateTime; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; + +/** + * Contact name helper + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.0.8 + */ +class ContactNameHelper { + /** + * Complement name. + * + * @param ContactName $name Contact name to complement. + * @return void + */ + public static function complement_name( ContactName $name ) { + // Name. + if ( \is_user_logged_in() ) { + $user = \wp_get_current_user(); + + if ( null === $name->get_first_name() && ! empty( $user->user_firstname ) ) { + $name->set_first_name( $user->user_firstname ); + } + + if ( null === $name->get_last_name() && ! empty( $user->user_lastname ) ) { + $name->set_last_name( $user->user_lastname ); + } + } + + // Initials. + if ( null === $name->get_initials() ) { + // First and middle name could contain multiple names. + $names = array(); + + $first_name = $name->get_first_name(); + + if ( null !== $first_name ) { + $names = \array_merge( $names, \explode( ' ', $first_name ) ); + } + + $middle_name = $name->get_middle_name(); + + if ( null !== $middle_name ) { + $names = \array_merge( $names, \explode( ' ', $middle_name ) ); + } + + $names = \array_map( 'trim', $names ); + + $names = \array_filter( $names ); + + if ( \count( $names ) > 0 ) { + $initials = array_map( + function ( $name ) { + return self::string_to_uppercase( \mb_substr( $name, 0, 1 ) ) . '.'; + }, + $names + ); + + $name->set_initials( implode( '', $initials ) ); + } + } + + /* + * Parse full name. + * + * @link https://github.com/dschnelldavis/parse-full-name + * @link https://github.com/joshfraser/PHP-Name-Parser + * @link https://github.com/jasonpriem/HumanNameParser.php + * @todo + */ + } + + /** + * Convert string to uppercase. + * + * @param string $string String. + * @return string + */ + private static function string_to_uppercase( $string ) { + if ( \function_exists( 'mb_strtoupper' ) ) { + return \mb_strtoupper( $string ); + } + + return \strtoupper( $string ); + } + + /** + * Anonymize customer. + * + * @param ContactName $name Contact name to anonymize. + * @return void + */ + public static function anonymize_name( ContactName $name ) { + $name->set_full_name( PrivacyManager::anonymize_data( 'text', $name->get_full_name() ) ); + $name->set_first_name( PrivacyManager::anonymize_data( 'text', $name->get_first_name() ) ); + $name->set_middle_name( PrivacyManager::anonymize_data( 'text', $name->get_middle_name() ) ); + $name->set_last_name( PrivacyManager::anonymize_data( 'text', $name->get_last_name() ) ); + } + + /** + * Create a contact name from an array. + * + * @param array $data Data. + * @return ContactName|null + */ + public static function from_array( $data ) { + $data = \array_filter( + $data, + function( $value ) { + return ( null !== $value ) && ( '' !== $value ); + } + ); + + if ( empty( $data ) ) { + return null; + } + + $name = new ContactName(); + + if ( \array_key_exists( 'first_name', $data ) ) { + $name->set_first_name( $data['first_name'] ); + } + + if ( \array_key_exists( 'last_name', $data ) ) { + $name->set_last_name( $data['last_name'] ); + } + + return $name; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Gateway.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Gateway.php new file mode 100644 index 00000000..d16930d7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Gateway.php @@ -0,0 +1,845 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Util as PayUtil; +use WP_Error; + +/** + * Title: Gateway + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.5.1 + * @since 1.0.0 + */ +abstract class Gateway { + /** + * Method indicator for an gateway wich works through an HTML form + * + * @var int + */ + const METHOD_HTML_FORM = 1; + + /** + * Method indicator for an gateway wich works through an HTTP redirect + * + * @var int + */ + const METHOD_HTTP_REDIRECT = 2; + + /** + * Indicator for test mode + * + * @var int + */ + const MODE_TEST = 'test'; + + /** + * Indicator for live mode + * + * @var int + */ + const MODE_LIVE = 'live'; + + /** + * Config + * + * @var GatewayConfig + */ + protected $config; + + /** + * The method of this gateway + * + * @var int + */ + private $method; + + /** + * The transaction ID + * + * @var string + */ + private $transaction_id; + + /** + * Action URL + * + * @var string + */ + private $action_url; + + /** + * Payment method to use on this gateway. + * + * @since 1.2.3 + * @var string|null + */ + private $payment_method; + + /** + * Supported features on this gateway. + * + * @since 1.3.9 + * @var array + */ + protected $supports; + + /** + * Error + * + * @var WP_Error|null + */ + public $error; + + /** + * Constructs and initializes an gateway + * + * @param GatewayConfig $config Gateway configuration object. + */ + public function __construct( GatewayConfig $config ) { + $this->config = $config; + + /** + * Supported features. + * + * Possible values: + * - payment_status_request Gateway can request current payment status. + * - recurring_credit_card Recurring payments through credit card. + * - recurring_direct_debit Recurring payments through direct debit. + */ + $this->supports = array(); + } + + /** + * Check if a gateway supports a given feature. + * + * @since 1.3.11 + * @param string $feature The feature to check. + * @return bool True if supported, false otherwise. + */ + public function supports( $feature ) { + return in_array( $feature, $this->supports, true ); + } + + /** + * Get the error + * + * @return WP_Error|null + */ + public function get_error() { + return $this->error; + } + + /** + * Has error + * + * @return boolean + */ + public function has_error() { + return null !== $this->error; + } + + /** + * Set error + * + * @param WP_Error|null $error WordPress error object or null. + * @return void + */ + public function set_error( WP_Error $error = null ) { + $this->error = $error; + } + + /** + * Set the method. + * + * @param int $method HTML form or HTTP redirect method. + * @return void + */ + public function set_method( $method ) { + $this->method = $method; + } + + /** + * Check if this gateway works trhough an HTTP redirect + * + * @return boolean true if an HTTP redirect is required, false otherwise + */ + public function is_http_redirect() { + return self::METHOD_HTTP_REDIRECT === $this->method; + } + + /** + * Check if this gateway works through an HTML form + * + * @return boolean true if an HTML form is required, false otherwise + */ + public function is_html_form() { + return self::METHOD_HTML_FORM === $this->method; + } + + /** + * Set has feedback. + * + * @param boolean $has_feedback Feedback from gateway indicator. + * @return void + * @deprecated 2.0.5 Not in use anymore. + */ + public function set_has_feedback( $has_feedback ) { + } + + /** + * Set the minimum amount required + * + * @param float $amount Minimum payment amount. + * @return void + * @deprecated 2.0.5 Not in use anymore. + */ + public function set_amount_minimum( $amount ) { + } + + /** + * Get iDEAL issuers. + * + * @return array + */ + public function get_issuers() { + return array(); + } + + /** + * Get credit card issuers. + * + * @return array|null + */ + public function get_credit_card_issuers() { + return null; + } + + /** + * Get the iDEAL issuers transient. + * + * @return array|null + */ + public function get_transient_issuers() { + $issuers = null; + + // Transient name. + $transient = 'pronamic_pay_issuers_' . md5( serialize( $this->config ) ); + + $result = get_transient( $transient ); + + if ( is_wp_error( $result ) || false === $result ) { + $issuers = $this->get_issuers(); + + if ( ! empty( $issuers ) ) { + // 60 * 60 * 24 = 24 hours = 1 day + set_transient( $transient, $issuers, 60 * 60 * 24 ); + } + } elseif ( is_array( $result ) ) { + $issuers = $result; + } + + return $issuers; + } + + /** + * Get the credit card issuers transient. + * + * @return array|null + */ + public function get_transient_credit_card_issuers() { + $issuers = null; + + // Transient name. + $transient = 'pronamic_pay_credit_card_issuers_' . md5( serialize( $this->config ) ); + + $result = get_transient( $transient ); + + if ( is_wp_error( $result ) || false === $result ) { + $issuers = $this->get_credit_card_issuers(); + + if ( $issuers ) { + // 60 * 60 * 24 = 24 hours = 1 day + set_transient( $transient, $issuers, 60 * 60 * 24 ); + } + } elseif ( is_array( $result ) ) { + $issuers = $result; + } + + return $issuers; + } + + /** + * Custom payment redirect. + * Intended to be overridden by gateway. + * + * @param Payment $payment Payment. + * + * @return void + */ + public function payment_redirect( Payment $payment ) { + } + + /** + * Get supported payment providers for gateway. + * Intended to be overridden by gateway. + * + * @return array + */ + public function get_supported_payment_methods() { + return array(); + } + + /** + * Get available payment methods. + * Intended to be overridden by gateway if active payment methods for account can be determined. + * + * @since 1.3.0 + * @return array|null + */ + public function get_available_payment_methods() { + return null; + } + + /** + * Get the payment methods transient + * + * @since 1.3.0 + * @return array|null + */ + public function get_transient_available_payment_methods() { + // Transient name. + $transient = 'pronamic_gateway_payment_methods_' . md5( serialize( $this->config ) ); + + $methods = get_transient( $transient ); + + if ( is_wp_error( $methods ) || false === $methods ) { + $methods = $this->get_available_payment_methods(); + + if ( is_array( $methods ) ) { + set_transient( $transient, $methods, DAY_IN_SECONDS ); + + PaymentMethods::update_active_payment_methods(); + } + } + + if ( empty( $methods ) ) { + return null; + } + + return $methods; + } + + /** + * Is payment method required to start transaction? + * + * @since 1.3.0 + * @return boolean True if payment method is required, false otherwise. + */ + public function payment_method_is_required() { + return false; + } + + /** + * Get payment method field options. + * + * @param bool $other_first Flag to prepend the 'Other' / 'All available methods' option. + * @return array + */ + public function get_payment_method_field_options( $other_first = false ) { + $options = array(); + + $payment_methods = array(); + + try { + $available_methods = $this->get_transient_available_payment_methods(); + + if ( null !== $available_methods ) { + $payment_methods = \array_intersect( $available_methods, $this->get_supported_payment_methods() ); + } + } catch ( \Exception $e ) { + $payment_methods = array(); + } + + // Use all supported payment methods as fallback. + if ( empty( $payment_methods ) ) { + $payment_methods = $this->get_supported_payment_methods(); + } + + // Set payment methods as options with name. + foreach ( $payment_methods as $payment_method ) { + $options[ $payment_method ] = PaymentMethods::get_name( $payment_method ); + } + + // Sort options by name. + natcasesort( $options ); + + // Add option to use all available payment methods. + if ( ! $this->payment_method_is_required() ) { + if ( $other_first ) { + $options = array( _x( 'All available methods', 'Payment method field', 'pronamic_ideal' ) ) + $options; + } else { + $options[] = _x( 'Other', 'Payment method field', 'pronamic_ideal' ); + } + } + + return $options; + } + + /** + * Start transaction/payment + * + * @param Payment $payment The payment to start up at this gateway. + * @return void + */ + public function start( Payment $payment ) { + + } + + /** + * Handle subscription update. + * + * @param Payment $payment The payment to handle subscription update for. + * @return void + */ + public function update_subscription( Payment $payment ) { + + } + + /** + * Handle subscription cancellation. + * + * @param Subscription $subscription The subscipriont to handle cancellation for. + * @return void + */ + public function cancel_subscription( Subscription $subscription ) { + + } + + /** + * Redirect to the gateway action URL. + * + * @param Payment $payment The payment to redirect for. + * @return void + * @throws \Exception Throws exception when action URL for HTTP redirect is empty. + */ + public function redirect( Payment $payment ) { + switch ( $this->method ) { + case self::METHOD_HTTP_REDIRECT: + $this->redirect_via_http( $payment ); + + break; + case self::METHOD_HTML_FORM: + $this->redirect_via_html( $payment ); + + break; + default: + // No idea how to redirect to the gateway. + } + } + + /** + * Redirect via HTTP. + * + * @param Payment $payment The payment to redirect for. + * @return void + * @throws \Exception When payment action URL is empty. + */ + public function redirect_via_http( Payment $payment ) { + if ( headers_sent() ) { + $this->redirect_via_html( $payment ); + } + + $action_url = $payment->get_action_url(); + + if ( empty( $action_url ) ) { + throw new \Exception( 'Action URL is empty, can not redirect.' ); + } + + // Redirect, See Other. + // https://en.wikipedia.org/wiki/HTTP_303. + wp_redirect( $action_url, 303 ); + + exit; + } + + /** + * Redirect via HTML. + * + * @param Payment $payment The payment to redirect for. + * @return void + */ + public function redirect_via_html( Payment $payment ) { + if ( headers_sent() ) { + /* phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ + echo $this->get_form_html( $payment, true ); + } else { + Core_Util::no_cache(); + + include Plugin::$dirname . '/views/redirect-via-html.php'; + } + + exit; + } + + /** + * Get an issuer field + * + * @return array|null + */ + public function get_issuer_field() { + $field = null; + + $payment_method = $this->get_payment_method(); + + // Set default payment method if needed. + if ( null === $payment_method && $this->payment_method_is_required() ) { + $payment_method = PaymentMethods::IDEAL; + } + + // No issuers without payment method. + if ( empty( $payment_method ) ) { + return $field; + } + + // Set issuer field for payment method. + switch ( $payment_method ) { + case PaymentMethods::IDEAL: + $issuers = $this->get_transient_issuers(); + + if ( ! empty( $issuers ) ) { + $field = array( + 'id' => 'pronamic_ideal_issuer_id', + 'name' => 'pronamic_ideal_issuer_id', + 'label' => __( 'Choose your bank', 'pronamic_ideal' ), + 'type' => 'select', + 'choices' => $issuers, + ); + } + + break; + case PaymentMethods::CREDIT_CARD: + $issuers = $this->get_credit_card_issuers(); + + if ( ! empty( $issuers ) ) { + $field = array( + 'id' => 'pronamic_credit_card_issuer_id', + 'name' => 'pronamic_credit_card_issuer_id', + 'label' => __( 'Choose your credit card issuer', 'pronamic_ideal' ), + 'type' => 'select', + 'choices' => $issuers, + ); + } + + break; + } + + return $field; + } + + /** + * Get a gender field. + * + * @return array|null + */ + public function get_gender_field() { + $payment_methods = array( + PaymentMethods::AFTERPAY, + PaymentMethods::FOCUM, + PaymentMethods::IN3, + PaymentMethods::KLARNA_PAY_LATER, + ); + + $payment_method = $this->get_payment_method(); + + // Only add field for specified payment methods. + if ( ! in_array( $payment_method, $payment_methods, true ) ) { + return null; + } + + // Return field. + return array( + 'id' => 'pronamic_pay_gender', + 'name' => 'pronamic_pay_gender', + 'label' => __( 'Gender', 'pronamic_ideal' ), + 'type' => 'select', + 'choices' => array( + array( + 'options' => array( + '' => __( '— Select gender —', 'pronamic_ideal' ), + 'F' => __( 'Female', 'pronamic_ideal' ), + 'M' => __( 'Male', 'pronamic_ideal' ), + ), + ), + ), + ); + } + + /** + * Get a date of birth field. + * + * @return array|null + */ + public function get_birth_date_field() { + $payment_methods = array( + PaymentMethods::AFTERPAY, + PaymentMethods::FOCUM, + PaymentMethods::IN3, + PaymentMethods::KLARNA_PAY_LATER, + ); + + $payment_method = $this->get_payment_method(); + + // Only add field for specified payment methods. + if ( ! in_array( $payment_method, $payment_methods, true ) ) { + return null; + } + + // Return field. + return array( + 'id' => 'pronamic_pay_birth_date', + 'name' => 'pronamic_pay_birth_date', + 'label' => __( 'Date of birth', 'pronamic_ideal' ), + 'type' => 'date', + 'max' => gmdate( 'Y-m-d' ), + ); + } + + /** + * Get a consumer bank details name field. + * + * @return array|null + */ + public function get_consumer_bank_details_name_field() { + $payment_methods = array( + PaymentMethods::DIRECT_DEBIT, + ); + + $payment_method = $this->get_payment_method(); + + // Only add field for specified payment methods. + if ( ! in_array( $payment_method, $payment_methods, true ) ) { + return null; + } + + // Return field. + return array( + 'id' => 'pronamic_pay_consumer_bank_details_name', + 'name' => 'pronamic_pay_consumer_bank_details_name', + 'label' => __( 'Account holder name', 'pronamic_ideal' ), + 'type' => 'text', + ); + } + + /** + * Get a consumer bank details IBAN field. + * + * @return array|null + */ + public function get_consumer_bank_details_iban_field() { + $payment_methods = array( + PaymentMethods::DIRECT_DEBIT, + ); + + $payment_method = $this->get_payment_method(); + + // Only add field for specified payment methods. + if ( ! in_array( $payment_method, $payment_methods, true ) ) { + return null; + } + + // Return field. + return array( + 'id' => 'pronamic_pay_consumer_bank_details_iban', + 'name' => 'pronamic_pay_consumer_bank_details_iban', + 'label' => __( 'IBAN', 'pronamic_ideal' ), + 'type' => 'text', + ); + } + + /** + * Get the payment method to use on this gateway. + * + * @since 1.2.3 + * @return string|null One of the PaymentMethods constants. + */ + public function get_payment_method() { + return $this->payment_method; + } + + /** + * Set the payment method to use on this gateway. + * + * @since 1.2.3 + * + * @param string|null $payment_method One of the PaymentMethods constants. + * @return void + */ + public function set_payment_method( $payment_method ) { + $this->payment_method = $payment_method; + } + + /** + * Get the input fields for this gateway + * + * This function will automatically add the issuer field to the + * input fields array of it's not empty + * + * @return array + */ + public function get_input_fields() { + // Make sure to use input for first payment method. + $payment_method = $this->get_payment_method(); + + $first_payment_method = PaymentMethods::get_first_payment_method( $payment_method ); + + $this->set_payment_method( $first_payment_method ); + + /* + * Fields. + */ + $fields = array(); + + // Issuer field. + $fields[] = $this->get_issuer_field(); + + // Gender field. + $fields[] = $this->get_gender_field(); + + // Birth date field. + $fields[] = $this->get_birth_date_field(); + + // Consumer bank details name field. + $fields[] = $this->get_consumer_bank_details_name_field(); + + // Consumer bank details IBAN field. + $fields[] = $this->get_consumer_bank_details_iban_field(); + + // Remove empty input fields. + $fields = array_filter( $fields ); + + // Restore payment method to original value. + $this->set_payment_method( $payment_method ); + + return $fields; + } + + /** + * Get the input HTML + * + * This function will convert all input fields to an HTML notation + * + * @return string + */ + public function get_input_html() { + $fields = $this->get_input_fields(); + + return Util::input_fields_html( $fields ); + } + + /** + * Get form HTML. + * + * @param Payment $payment Payment to get form HTML for. + * @param bool $auto_submit Flag to auto submit. + * @return string + * @throws \Exception When payment action URL is empty. + */ + public function get_form_html( Payment $payment, $auto_submit = false ) { + $form_inner = $this->get_output_html( $payment ); + + $form_inner .= sprintf( + '', + __( 'Pay', 'pronamic_ideal' ) + ); + + $action_url = $payment->get_action_url(); + + if ( empty( $action_url ) ) { + throw new \Exception( 'Action URL is empty, can not get form HTML.' ); + } + + $html = sprintf( + '
    %s
    ', + esc_attr( $action_url ), + $form_inner + ); + + if ( $auto_submit ) { + $html .= ''; + } + + return $html; + } + + /** + * Get output inputs. + * + * @param Payment $payment Payment. + * + * @return array + * @since 1.2.0 + */ + public function get_output_fields( Payment $payment ) { + return array(); + } + + /** + * Get the output HTML + * + * @param Payment $payment Payment. + * + * @return string + */ + public function get_output_html( Payment $payment ) { + $fields = $this->get_output_fields( $payment ); + + return PayUtil::html_hidden_fields( $fields ); + } + + /** + * Update status of the specified payment + * + * @param Payment $payment Payment. + * @return void + */ + public function update_status( Payment $payment ) { + + } + + /** + * Create invoice. + * + * @param Payment $payment Payment. + * @return bool + */ + public function create_invoice( $payment ) { + return false; + } + + /** + * Cancel reservation. + * + * @param Payment $payment Payment. + * @return bool + */ + public function cancel_reservation( $payment ) { + return false; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/GatewayConfig.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/GatewayConfig.php new file mode 100644 index 00000000..9203d707 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/GatewayConfig.php @@ -0,0 +1,30 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Title: Gateway config + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.8 + * @since 1.0.0 + */ +abstract class GatewayConfig { + /** + * Mode + * + * @var string + */ + public $mode; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/IdTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/IdTrait.php new file mode 100644 index 00000000..bc12ddc0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/IdTrait.php @@ -0,0 +1,47 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Privacy + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Id Trait + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + * @link https://github.com/search?q=%22trait+IdTrait%22+language%3APHP&type=Code + */ +trait IdTrait { + /** + * ID. + * + * @var string|null + */ + private $id; + + /** + * Get the ID. + * + * @return int|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set the ID. + * + * @param int $id Unique ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/PaymentMethods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/PaymentMethods.php new file mode 100644 index 00000000..da22ed0d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/PaymentMethods.php @@ -0,0 +1,585 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +use Pronamic\WordPress\Pay\Plugin; +use WP_Query; + +/** + * Title: WordPress pay payment methods + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.1 + */ +class PaymentMethods { + /** + * AfterPay. + * + * @var string + * @since 2.1.0 + */ + const AFTERPAY = 'afterpay'; + + /** + * Alipay + * + * @var string + * @since 2.0.0 + */ + const ALIPAY = 'alipay'; + + /** + * Apple Pay + * + * @var string + * @since 2.2.8 + */ + const APPLE_PAY = 'apple_pay'; + + /** + * Bancontact + * + * @var string + * @since 1.3.7 + */ + const BANCONTACT = 'bancontact'; + + /** + * Bank transfer + * + * @var string + */ + const BANK_TRANSFER = 'bank_transfer'; + + /** + * Constant for the Belfius Direct Net method. + * + * @since 1.3.11 + * @var string + */ + const BELFIUS = 'belfius'; + + /** + * Billink + * + * @since 2.0.9 + * @var string + */ + const BILLINK = 'billink'; + + /** + * Bitcoin + * + * @since 1.3.9 + * @var string + */ + const BITCOIN = 'bitcoin'; + + /** + * Bunq + * + * @link https://www.sisow.nl/news/00009 + * @link https://plugins.trac.wordpress.org/browser/sisow-for-woocommerce/tags/4.7.2/includes/classes/Sisow/Gateway/Bunq.php + * @since 1.3.13 + * @var string + */ + const BUNQ = 'bunq'; + + /** + * Constant for the In3 payment method. + * + * @var string + * @since 2.1.0 + */ + const IN3 = 'in3'; + + /** + * Capayable. + * + * @var string + * @since 2.0.9 + */ + const CAPAYABLE = 'capayable'; + + /** + * Credit Card + * + * @var string + */ + const CREDIT_CARD = 'credit_card'; + + /** + * Direct Debit + * + * @var string + */ + const DIRECT_DEBIT = 'direct_debit'; + + /** + * Constant for the Direct Debit mandate via Bancontact payment method. + * + * @var string + * @since 1.3.13 + */ + const DIRECT_DEBIT_BANCONTACT = 'direct_debit_bancontact'; + + /** + * Constant for the Direct Debit mandate via iDEAL payment method. + * + * @var string + * @since 1.3.9 + */ + const DIRECT_DEBIT_IDEAL = 'direct_debit_ideal'; + + /** + * Constant for the Direct Debit mandate via SOFORT payment method. + * + * @var string + * @since 1.3.15 + */ + const DIRECT_DEBIT_SOFORT = 'direct_debit_sofort'; + + /** + * Constant for the EPS payment method. + * + * @var string + * @since 2.1.7 + */ + const EPS = 'eps'; + + /** + * Constant for the Focum payment method. + * + * @var string + * @since 2.1.0 + */ + const FOCUM = 'focum'; + + /** + * Constant for the iDEAL payment method. + * + * @var string + */ + const IDEAL = 'ideal'; + + /** + * Constant for the iDEAL payment method. + * + * @var string + */ + const IDEALQR = 'idealqr'; + + /** + * Constant for the Giropay payment method. + * + * @var string + */ + const GIROPAY = 'giropay'; + + /** + * Constant for the Google Pay payment method. + * + * @var string + */ + const GOOGLE_PAY = 'google_pay'; + + /** + * Constant for the Gulden payment method. + * + * @var string + */ + const GULDEN = 'gulden'; + + /** + * Constant for the KBC/CBC Payment Button method. + * + * @since 1.3.11 + * @var string + */ + const KBC = 'kbc'; + + /** + * Constant for the Klarna Pay Later payment method. + * + * @var string + * @since 2.1.0 + */ + const KLARNA_PAY_LATER = 'klarna_pay_later'; + + /** + * Constant for the Maestro payment method. + * + * @var string + * @since 1.3.10 + */ + const MAESTRO = 'maestro'; + + /** + * Bancontact/Mister Cash + * + * @deprecated "Bancontact/Mister Cash" was renamed to just "Bancontact". + * @var string + */ + const MISTER_CASH = 'mister_cash'; + + /** + * Constant for the Payconiq method. + * + * @since 2.0.0 + * @var string + */ + const PAYCONIQ = 'payconiq'; + + /** + * PayPal + * + * @var string + * @since 1.3.7 + */ + const PAYPAL = 'paypal'; + + /** + * Przelewy24 + * + * @since 2.5.0 + * @var string + */ + const PRZELEWY24 = 'przelewy24'; + + /** + * Santander + * + * @var string + * @since 2.6.0 + */ + const SANTANDER = 'santander'; + + /** + * SOFORT Banking + * + * @var string + * @since 1.0.1 + */ + const SOFORT = 'sofort'; + + /** + * Get payment methods + * + * @since 1.3.0 + * @return array + */ + public static function get_payment_methods() { + $payment_methods = array( + self::AFTERPAY => __( 'AfterPay', 'pronamic_ideal' ), + self::ALIPAY => __( 'Alipay', 'pronamic_ideal' ), + self::APPLE_PAY => __( 'Apple Pay', 'pronamic_ideal' ), + self::BANCONTACT => __( 'Bancontact', 'pronamic_ideal' ), + self::BANK_TRANSFER => __( 'Bank Transfer', 'pronamic_ideal' ), + self::BELFIUS => __( 'Belfius Direct Net', 'pronamic_ideal' ), + self::BILLINK => __( 'Billink', 'pronamic_ideal' ), + self::BITCOIN => __( 'Bitcoin', 'pronamic_ideal' ), + self::BUNQ => __( 'Bunq', 'pronamic_ideal' ), + self::CAPAYABLE => __( 'Capayable', 'pronamic_ideal' ), + self::IN3 => __( 'In3', 'pronamic_ideal' ), + self::CREDIT_CARD => __( 'Credit Card', 'pronamic_ideal' ), + self::DIRECT_DEBIT => __( 'Direct Debit', 'pronamic_ideal' ), + self::DIRECT_DEBIT_BANCONTACT => sprintf( + /* translators: %s: payment method */ + __( 'Direct Debit (mandate via %s)', 'pronamic_ideal' ), + __( 'Bancontact', 'pronamic_ideal' ) + ), + self::DIRECT_DEBIT_IDEAL => sprintf( + /* translators: %s: payment method */ + __( 'Direct Debit (mandate via %s)', 'pronamic_ideal' ), + __( 'iDEAL', 'pronamic_ideal' ) + ), + self::DIRECT_DEBIT_SOFORT => sprintf( + /* translators: %s: payment method */ + __( 'Direct Debit (mandate via %s)', 'pronamic_ideal' ), + __( 'SOFORT', 'pronamic_ideal' ) + ), + self::EPS => __( 'EPS', 'pronamic_ideal' ), + self::FOCUM => __( 'Focum', 'pronamic_ideal' ), + self::GIROPAY => __( 'Giropay', 'pronamic_ideal' ), + self::GOOGLE_PAY => __( 'Google Pay', 'pronamic_ideal' ), + self::GULDEN => __( 'Gulden', 'pronamic_ideal' ), + self::IDEAL => __( 'iDEAL', 'pronamic_ideal' ), + self::IDEALQR => __( 'iDEAL QR', 'pronamic_ideal' ), + self::KBC => __( 'KBC/CBC Payment Button', 'pronamic_ideal' ), + self::KLARNA_PAY_LATER => __( 'Klarna Pay Later', 'pronamic_ideal' ), + self::MAESTRO => __( 'Maestro', 'pronamic_ideal' ), + self::PAYCONIQ => __( 'Payconiq', 'pronamic_ideal' ), + self::PAYPAL => __( 'PayPal', 'pronamic_ideal' ), + self::PRZELEWY24 => __( 'Przelewy24', 'pronamic_ideal' ), + self::SANTANDER => __( 'Santander', 'pronamic_ideal' ), + self::SOFORT => __( 'SOFORT Banking', 'pronamic_ideal' ), + ); + + return $payment_methods; + } + + /** + * Get payment method name + * + * @since 1.3.0 + * + * @param string|null $method Method to get the name for. + * @param string|null $default Default name to return if method was not found. + * + * @return string|null + */ + public static function get_name( $method = null, $default = null ) { + $payment_methods = self::get_payment_methods(); + + if ( null !== $method && array_key_exists( $method, $payment_methods ) ) { + return $payment_methods[ $method ]; + } + + if ( null === $default ) { + return $method; + } + + return $default; + } + + /** + * Get direct debit methods. + * + * @since 1.3.14 + * @return array + */ + public static function get_direct_debit_methods() { + $payment_methods = array( + self::DIRECT_DEBIT_BANCONTACT => self::BANCONTACT, + self::DIRECT_DEBIT_IDEAL => self::IDEAL, + self::DIRECT_DEBIT_SOFORT => self::SOFORT, + ); + + return $payment_methods; + } + + /** + * Is direct debit method. + * + * @since 1.3.14 + * + * @param string $payment_method Payment method to check for direct debit. + * + * @return bool True if the specified payment method is direct debit, false otherwise. + */ + public static function is_direct_debit_method( $payment_method ) { + return array_key_exists( $payment_method, self::get_direct_debit_methods() ); + } + + /** + * Get recurring methods. + * + * @since 1.3.14 + * @return array + */ + public static function get_recurring_methods() { + // Get the direct debit methods. + $payment_methods = self::get_direct_debit_methods(); + + // Add additional methods suitable for recurring payments. + $payment_methods[ self::APPLE_PAY ] = self::APPLE_PAY; + $payment_methods[ self::CREDIT_CARD ] = self::CREDIT_CARD; + + return $payment_methods; + } + + /** + * Is recurring method. + * + * @since 1.3.14 + * + * @param string $payment_method The payment method to check for recurring. + * + * @return bool True if the specified payment method supports recurring, false otherwise. + */ + public static function is_recurring_method( $payment_method ) { + return array_key_exists( $payment_method, self::get_recurring_methods() ); + } + + /** + * Get first method for payment method. + * + * @param string|null $payment_method The payment method to get the first payment method for. + * + * @return string|null + */ + public static function get_first_payment_method( $payment_method ) { + if ( empty( $payment_method ) ) { + return null; + } + + if ( self::is_direct_debit_method( $payment_method ) ) { + $direct_debit_methods = self::get_direct_debit_methods(); + + return $direct_debit_methods[ $payment_method ]; + } + + return $payment_method; + } + + /** + * Maybe update active payment methods. + * + * @return void + */ + public static function maybe_update_active_payment_methods() { + $payment_methods = get_option( 'pronamic_pay_active_payment_methods' ); + + // Update active payment methods option if necessary. + if ( ! is_array( $payment_methods ) ) { + self::update_active_payment_methods(); + } + } + + /** + * Update active payment methods option. + * + * @since 2.0.0 + * @return void + */ + public static function update_active_payment_methods() { + $active_payment_methods = array(); + + $query = new WP_Query( + array( + 'post_type' => 'pronamic_gateway', + 'nopaging' => true, + 'fields' => 'ids', + ) + ); + + foreach ( $query->posts as $config_id ) { + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + continue; + } + + if ( ! method_exists( $gateway, 'get_supported_payment_methods' ) ) { + continue; + } + + try { + $payment_methods = $gateway->get_transient_available_payment_methods(); + } catch ( \Exception $e ) { + // Do not update active payment methods on error. + return; + } + + if ( null === $payment_methods ) { + $payment_methods = $gateway->get_supported_payment_methods(); + } + + foreach ( $payment_methods as $payment_method ) { + if ( ! isset( $active_payment_methods[ $payment_method ] ) ) { + $active_payment_methods[ $payment_method ] = array(); + } + + // Check if payment method is supported. + if ( ! \in_array( $payment_method, $gateway->get_supported_payment_methods(), true ) ) { + continue; + } + + $active_payment_methods[ $payment_method ][] = $config_id; + } + } + + update_option( 'pronamic_pay_active_payment_methods', $active_payment_methods ); + } + + /** + * Get active payment methods. + * + * @return array + */ + public static function get_active_payment_methods() { + self::maybe_update_active_payment_methods(); + + $payment_methods = array(); + + $active_methods = get_option( 'pronamic_pay_active_payment_methods' ); + + if ( is_array( $active_methods ) ) { + $payment_methods = array_keys( $active_methods ); + } + + return $payment_methods; + } + + /** + * Get config IDs for payment method. + * + * @param string $payment_method Payment method. + * + * @return array + */ + public static function get_config_ids( $payment_method = null ) { + self::maybe_update_active_payment_methods(); + + $config_ids = array(); + + $active_methods = get_option( 'pronamic_pay_active_payment_methods' ); + + // Make sure active payments methods is an array. + if ( ! is_array( $active_methods ) ) { + return $config_ids; + } + + // Get config IDs for payment method. + if ( isset( $active_methods[ $payment_method ] ) ) { + $config_ids = $active_methods[ $payment_method ]; + } + + // Get all config IDs if payment method is empty. + if ( empty( $payment_method ) ) { + foreach ( $active_methods as $method_config_ids ) { + $config_ids = array_merge( $config_ids, $method_config_ids ); + } + + $config_ids = array_unique( $config_ids ); + } + + // Make sure payment method is also supported. + if ( null !== $payment_method ) { + foreach ( $config_ids as $key => $config_id ) { + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway || ! \in_array( $payment_method, $gateway->get_supported_payment_methods(), true ) ) { + unset( $config_ids[ $key ] ); + } + } + } + + return $config_ids; + } + + /** + * Check if payment method is active. + * + * @param string $payment_method Payment method. + * + * @since 2.0.0 + * + * @return bool + */ + public static function is_active( $payment_method = null ) { + return in_array( $payment_method, self::get_active_payment_methods(), true ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Recurring.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Recurring.php new file mode 100644 index 00000000..cdac8d40 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Recurring.php @@ -0,0 +1,44 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Title: WordPress pay recurring + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.0.0 + * @since 1.3.11 + */ +class Recurring { + /** + * Constant for the first payment. + * + * @var string + */ + const FIRST = 'first'; + + /** + * Constant for recurring payments. + * + * @var string + */ + const RECURRING = 'recurring'; + + /** + * Constant for subscription payments. + * + * @var string + */ + const SUBSCRIPTION = 'subscription'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Server.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Server.php new file mode 100644 index 00000000..5d86b9b9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Server.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Title: Server + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.0.0 + * @since 1.1.0 + */ +class Server { + /** + * Get server variable. + * + * This helper function was created to bypass PHP bug 49184. + * + * @link https://bugs.php.net/49184 + * + * @param string $key Server value key. + * @param int $filter PHP filter constant. + * + * @return mixed + */ + public static function get( $key, $filter = FILTER_DEFAULT ) { + $value = null; + + if ( isset( $_SERVER[ $key ] ) ) { // WPCS: input var okay. + $value = filter_var( wp_unslash( $_SERVER[ $key ] ), $filter ); // WPCS: input var okay. + } + + return $value; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Statuses.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Statuses.php new file mode 100644 index 00000000..193b5908 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Statuses.php @@ -0,0 +1,114 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Title: WordPress pay statuses constants + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.4 + * @since 1.0.0 + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + */ +class Statuses { + /** + * Status indicator for success + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const SUCCESS = 'Success'; + + /** + * Status indicator for cancelled + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Status indicator for expired + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const EXPIRED = 'Expired'; + + /** + * Status indicator for failure + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const FAILURE = 'Failure'; + + /** + * Status indicator for on hold + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const ON_HOLD = 'On Hold'; + + /** + * Status indicator for open + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const OPEN = 'Open'; + + /** + * Status indicator for refunded + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const REFUNDED = 'Refunded'; + + /** + * Status indicator for reserved + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const RESERVED = 'Reserved'; + + /** + * Status indicator for active + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const ACTIVE = 'Active'; + + /** + * Status indicator for completed + * + * @deprecated 2.2.4 Use \Pronamic\WordPress\Pay\Payments\PaymentStatus or \Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus instead. + * + * @var string + */ + const COMPLETED = 'Completed'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/TimestampsTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/TimestampsTrait.php new file mode 100644 index 00000000..8d5deec6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/TimestampsTrait.php @@ -0,0 +1,86 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Privacy + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Timestamps Trait + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + * @link https://github.com/laravel/framework/blob/v7.27.0/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php + */ +trait TimestampsTrait { + /** + * Created At. + * + * @var \DateTime|null + */ + private $created_at; + + /** + * Updated At. + * + * @var \DateTime|null + */ + private $updated_at; + + /** + * Set created at. + * + * @param \DateTime|null $created_at Created at. + * @return void + */ + public function set_created_at( $created_at ) { + $this->created_at = $created_at; + } + + /** + * Get created at. + * + * @return \DateTime|null + */ + public function get_created_at() { + return $this->created_at; + } + + /** + * Set updated at. + * + * @param \DateTime|null $updated_at Updated at. + * @return void + */ + public function set_updated_at( $updated_at ) { + $this->updated_at = $updated_at; + } + + /** + * Get updated at. + * + * @return \DateTime|null + */ + public function get_updated_at() { + return $this->updated_at; + } + + /** + * Touch. + * + * @return void + */ + public function touch() { + if ( null === $this->created_at ) { + $this->created_at = new \DateTime(); + } + + $this->updated_at = new \DateTime(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Util.php new file mode 100644 index 00000000..a02f580d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/Util.php @@ -0,0 +1,483 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Core; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\Parser as MoneyParser; +use Pronamic\WordPress\Pay\Util as Pay_Util; + +/** + * Title: WordPress utility class + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class Util { + /** + * Remote get body. + * + * @param string $url URL to request. + * @param int $required_response_code Required response code. + * @param array $args Remote request arguments. + * + * @return array|bool|string|\WP_Error + */ + public static function remote_get_body( $url, $required_response_code = 200, array $args = array() ) { + $result = wp_remote_request( $url, $args ); + + if ( $result instanceof \WP_Error ) { + return $result; + } + + /* + * The response code is cast to a integer since WordPress 4.1, therefor we can't use + * strict comparison on the required response code. + * + * @link https://github.com/WordPress/WordPress/blob/4.1/wp-includes/class-http.php#L528-L529 + * @link https://github.com/WordPress/WordPress/blob/4.0/wp-includes/class-http.php#L527 + */ + /* phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison */ + if ( wp_remote_retrieve_response_code( $result ) == $required_response_code ) { + return wp_remote_retrieve_body( $result ); + } + + // Wrong response code. + return new \WP_Error( + 'wrong_response_code', + sprintf( + /* translators: 1: received response code, 2: required response code */ + __( 'The response code (%1$s) was incorrect, required response code %2$s.', 'pronamic_ideal' ), + wp_remote_retrieve_response_code( $result ), + $required_response_code + ) + ); + } + + /** + * SimpleXML load string. + * + * @link https://akrabat.com/throw-an-exception-when-simplexml_load_string-fails/ + * @link https://www.php.net/manual/en/class.invalidargumentexception.php + * @link https://www.php.net/manual/en/class.libxmlerror.php + * + * @param string $string The XML string to convert to a SimpleXMLElement object. + * @return \SimpleXMLElement + * @throws \InvalidArgumentException If string could not be loaded in to a SimpleXMLElement object. + */ + public static function simplexml_load_string( $string ) { + // Suppress all XML errors. + $use_errors = libxml_use_internal_errors( true ); + + // Load. + $xml = simplexml_load_string( $string ); + + // Check result. + if ( false !== $xml ) { + // Set back to previous value. + libxml_use_internal_errors( $use_errors ); + + return $xml; + } + + // Error message. + $messages = array( + __( 'Could not load the XML string.', 'pronamic_ideal' ), + ); + + foreach ( libxml_get_errors() as $error ) { + $messages[] = sprintf( + '%s on line: %s, column: %s', + $error->message, + $error->line, + $error->column + ); + } + + // Clear errors. + libxml_clear_errors(); + + // Set back to previous value. + libxml_use_internal_errors( $use_errors ); + + // Throw exception. + $message = implode( PHP_EOL, $messages ); + + throw new \InvalidArgumentException( $message ); + } + + /** + * Compat function to mimic wp_doing_cron(). + * + * @link https://github.com/WordPress/WordPress/blob/4.9/wp-includes/load.php#L1066-L1082 + * @ignore + * @since 2.1.2 + * + * @return bool True if it's a WordPress cron request, false otherwise. + */ + public static function doing_cron() { + if ( function_exists( '\wp_doing_cron' ) ) { + return \wp_doing_cron(); + } + + /** + * Filters whether the current request is a WordPress cron request. + * + * @since 4.8.0 + * + * @param bool $wp_doing_cron Whether the current request is a WordPress cron request. + */ + return apply_filters( 'wp_doing_cron', defined( 'DOING_CRON' ) && DOING_CRON ); + } + + /** + * Doing CLI. + * + * @return bool + */ + public static function doing_cli() { + return defined( 'WP_CLI' ) && WP_CLI; + } + + /** + * No cache. + * + * @return void + */ + public static function no_cache() { + // @link https://github.com/woothemes/woocommerce/blob/2.3.11/includes/class-wc-cache-helper.php + // @link https://www.w3-edge.com/products/w3-total-cache/ + $do_not_constants = array( + 'DONOTCACHEPAGE', + 'DONOTCACHEDB', + 'DONOTMINIFY', + 'DONOTCDN', + 'DONOTCACHEOBJECT', + ); + + foreach ( $do_not_constants as $do_not_constant ) { + if ( ! defined( $do_not_constant ) ) { + define( $do_not_constant, true ); + } + } + + nocache_headers(); + } + + /** + * Amount to cents. + * + * @param float $amount The amount to conver to cents. + * + * @deprecated 2.0.9 Use \Pronamic\WordPress\Money\Money::get_cents() instead. + * + * @return float + */ + public static function amount_to_cents( $amount ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Money\Money::get_cents()' ); + + $money = new Money( $amount ); + + return $money->get_cents(); + } + + /** + * Cents to amount. + * + * @param int $cents The cents to convert to float value. + * + * @return float + */ + public static function cents_to_amount( $cents ) { + return $cents / 100; + } + + /** + * String to amount (user input string). + * + * @link https://github.com/WordPress/WordPress/blob/4.9.6/wp-includes/functions.php#L206-L237 + * + * @version 1.3.1 + * @since 1.3.0 + * @deprecated 2.0.3 Use Pronamic\WordPress\Money\Parser::parse( $amount )->get_amount() instead. + * + * @param string $value The string value to convert to a float value. + * + * @return float + */ + public static function string_to_amount( $value ) { + _deprecated_function( __FUNCTION__, '2.0.3', 'Pronamic\WordPress\Money\Parser::parse()->get_value()' ); + + $money_parser = new MoneyParser(); + + try { + $amount = $money_parser->parse( $value )->get_value(); + } catch ( \Exception $e ) { + $amount = (float) 0; + } + + return $amount; + } + + /** + * String to interval period (user input string). + * + * @since 2.0.3 + * @param string $interval Interval user input string. + * @return string|null + */ + public static function string_to_interval_period( $interval ) { + if ( ! is_string( $interval ) ) { + return null; + } + + $interval = trim( $interval ); + + // Check last character for period. + $interval_char = strtoupper( substr( $interval, - 1, 1 ) ); + + if ( in_array( $interval_char, array( 'D', 'W', 'M', 'Y' ), true ) ) { + return $interval_char; + } + + // Find interval period by counting string replacements. + $periods = array( + 'D' => array( 'D', 'day' ), + 'W' => array( 'W', 'week' ), + 'M' => array( 'M', 'month' ), + 'Y' => array( 'Y', 'year' ), + ); + + foreach ( $periods as $interval_period => $search ) { + $count = 0; + + str_ireplace( $search, '', $interval, $count ); + + if ( $count > 0 ) { + return $interval_period; + } + } + + return null; + } + + /** + * Convert boolean to an numeric boolean. + * + * @link https://github.com/eet-nu/buckaroo-ideal/blob/master/lib/buckaroo-ideal/request.rb#L136 + * + * @param boolean $boolean The boolean value to convert to an integer value. + * + * @return int + */ + public static function boolean_to_numeric( $boolean ) { + return $boolean ? 1 : 0; + } + + /** + * Convert boolean to an string boolean + * + * @link https://github.com/eet-nu/buckaroo-ideal/blob/master/lib/buckaroo-ideal/request.rb#L136 + * + * @param bool $boolean The boolean value to convert to a string value. + * @return string + */ + public static function boolean_to_string( $boolean ) { + return $boolean ? 'true' : 'false'; + } + + /** + * Convert the specified period to a single char notation. + * + * @since 1.3.9 + * + * @param string $period The period value to convert to a single character/string value. + * + * @return string + */ + public static function to_period( $period ) { + if ( false !== strpos( $period, 'day' ) || false !== strpos( $period, 'daily' ) ) { + return 'D'; + } + + if ( false !== strpos( $period, 'week' ) ) { + return 'W'; + } + + if ( false !== strpos( $period, 'month' ) ) { + return 'M'; + } + + if ( false !== strpos( $period, 'year' ) ) { + return 'Y'; + } + + return $period; + } + + /** + * Build URL with the specified parameters + * + * @param string $url URL to extend with the specified parameters. + * @param array $parameters URL parameters. + * + * @return string + */ + public static function build_url( $url, array $parameters ) { + return $url . '?' . _http_build_query( $parameters, null, '&' ); + } + + /** + * Get remote address. + * + * @link https://github.com/WordPress/WordPress/blob/4.9.8/wp-admin/includes/class-wp-community-events.php#L210-L274 + * @since 2.1.0 + * @return mixed|null + */ + public static function get_remote_address() { + // In order of preference, with the best ones for this purpose first. + $headers = array( + 'HTTP_CLIENT_IP', + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED', + 'HTTP_X_CLUSTER_CLIENT_IP', + 'HTTP_FORWARDED_FOR', + 'HTTP_FORWARDED', + 'REMOTE_ADDR', + ); + + foreach ( $headers as $header ) { + if ( isset( $_SERVER[ $header ] ) ) { + /* + * HTTP_X_FORWARDED_FOR can contain a chain of comma-separated + * addresses. The first one is the original client. It can't be + * trusted for authenticity, but we don't need to for this purpose. + */ + $addresses = explode( ',', (string) filter_var( wp_unslash( $_SERVER[ $header ] ) ) ); + + $addresses = array_slice( $addresses, 0, 1 ); + + foreach ( $addresses as $address ) { + $address = trim( $address ); + + $address = filter_var( $address, FILTER_VALIDATE_IP ); + + if ( false === $address ) { + continue; + } + + return $address; + } + } + } + + return null; + } + + /** + * Convert input fields array to HTML. + * + * @param array $fields Array with fields data to convert to HTML. + * + * @return string + */ + public static function input_fields_html( array $fields ) { + $html = ''; + + foreach ( $fields as $field ) { + if ( ! isset( $field['type'], $field['name'] ) ) { + continue; + } + + $field = \wp_parse_args( + $field, + array( + 'id' => $field['name'], + 'type' => 'text', + 'value' => ( \filter_has_var( INPUT_POST, $field['name'] ) ? \filter_input( INPUT_POST, $field['name'], FILTER_SANITIZE_STRING ) : null ), + 'required' => false, + 'max' => null, + ) + ); + + // Field label. + $html .= sprintf( + ' ', + esc_attr( $field['id'] ), + $field['label'] + ); + + switch ( $field['type'] ) { + case 'select': + $html .= sprintf( + '', + esc_attr( $field['id'] ), + esc_attr( $field['name'] ), + ( $field['required'] ? 'required' : null ), + Pay_Util::select_options_grouped( $field['choices'] ) + ); + + break; + default: + $attributes = array( + 'type' => $field['type'], + 'id' => $field['id'], + 'name' => $field['name'], + 'value' => $field['value'], + 'max' => $field['max'], + 'required' => $field['required'], + ); + + $html .= sprintf( '', Pay_Util::array_to_html_attributes( $attributes ) ); + + break; + } + } + + return $html; + } + + /** + * Method exists + * + * This helper function was created to fix an issue with `method_exists` calls + * and non existings classes. + * + * @param string $class Class name to check for the specifiekd method. + * @param string $method Method name to check for existance. + * + * @return boolean + */ + public static function class_method_exists( $class, $method ) { + return class_exists( $class ) && method_exists( $class, $method ); + } + + /** + * Check if input type has vars. + * + * @param int $type One of INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV. + * @param array $variable_names Array of variable names to check in input type. + * + * @return bool + */ + public static function input_has_vars( $type, $variable_names ) { + foreach ( $variable_names as $variable_name ) { + if ( ! filter_has_var( $type, $variable_name ) ) { + return false; + } + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/VersionTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/VersionTrait.php new file mode 100644 index 00000000..9ddd628a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/VersionTrait.php @@ -0,0 +1,47 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Privacy + */ + +namespace Pronamic\WordPress\Pay\Core; + +/** + * Version Trait + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + * @link https://github.com/search?q=%22trait+VersionTrait%22+language%3APHP&type=Code + */ +trait VersionTrait { + /** + * Version. + * + * @var string|null + */ + private $version; + + /** + * Set version. + * + * @param string|null $version Version. + * @return void + */ + public function set_version( $version ) { + $this->version = $version; + } + + /** + * Get version. + * + * @return string|null + */ + public function get_version() { + return $this->version; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/XML/Security.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/XML/Security.php new file mode 100644 index 00000000..b70c3e63 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/XML/Security.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core\XML + */ + +namespace Pronamic\WordPress\Pay\Core\XML; + +use SimpleXMLElement; + +/** + * Title: XML Security + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class Security { + /** + * Filter XML variable. + * + * @param string|SimpleXMLElement $variable Variable to filter. + * @param int $filter PHP filter flag constant. + * + * @return mixed|null + */ + public static function filter( $variable, $filter = FILTER_SANITIZE_STRING ) { + if ( ! $variable ) { + return null; + } + + return filter_var( (string) $variable, $filter ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/XML/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/XML/Util.php new file mode 100644 index 00000000..cbea0ed1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Core/XML/Util.php @@ -0,0 +1,69 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core\XML + */ + +namespace Pronamic\WordPress\Pay\Core\XML; + +use DOMDocument; +use DOMNode; +use DOMText; + +/** + * Title: XML utility class + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.2.1 + */ +class Util { + /** + * Create and add an element with the specified name and value to the specified parent. + * + * @param DOMDocument $document DOM document to add the specified node to. + * @param DOMNode $parent DOM node to add a new element to. + * @param string $name Name of the new DOM element to add. + * @param string $value Value of the new DOM element to add. + * + * @return \DOMElement + */ + public static function add_element( DOMDocument $document, DOMNode $parent, $name, $value = null ) { + $element = $document->createElement( $name ); + + if ( null !== $value ) { + $element->appendChild( new DOMText( $value ) ); + } + + $parent->appendChild( $element ); + + return $element; + } + + /** + * Add the specified elements to the parent node. + * + * @param DOMDocument $document DOM document to add the specified node to. + * @param DOMNode $parent DOM node to add a new element to. + * @param array $elements The elements (name => value pairs) to add. + * @return void + */ + public static function add_elements( DOMDocument $document, DOMNode $parent, array $elements = array() ) { + foreach ( $elements as $name => $value ) { + $element = $document->createElement( $name ); + + if ( null !== $value ) { + $element->appendChild( new DOMText( $value ) ); + } + + $parent->appendChild( $element ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Country.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Country.php new file mode 100644 index 00000000..88ff8167 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Country.php @@ -0,0 +1,157 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use stdClass; + +/** + * Country + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.1.6 + */ +class Country { + /** + * Code. + * + * @var string|null + */ + private $code; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * Get code. + * + * @return string|null + */ + public function get_code() { + return $this->code; + } + + /** + * Set code. + * + * @throws InvalidArgumentException Thrown when country code length is not equal to 2. + * + * @param string|null $code Code. + * @return void + */ + public function set_code( $code ) { + if ( null !== $code && 2 !== strlen( $code ) ) { + throw new InvalidArgumentException( + sprintf( + 'Given country code `%s` not ISO 3166-1 alpha-2 value.', + $code + ) + ); + } + + $this->code = $code; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'code' => $this->code, + 'name' => $this->name, + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create from object. + * + * @param mixed $json JSON. + * @return Country + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + $country = new self(); + + if ( isset( $json->code ) ) { + $country->set_code( $json->code ); + } + + if ( isset( $json->name ) ) { + $country->set_name( $json->name ); + } + + return $country; + } + + /** + * Create string representation of personal name. + * + * @return string + */ + public function __toString() { + $values = array( + $this->code, + $this->name, + ); + + $values = array_filter( $values ); + + return implode( ' - ', $values ); + } + + /** + * Anonymize. + * + * @return void + */ + public function anonymize() { + $this->set_code( PrivacyManager::anonymize_data( 'text', $this->get_code() ) ); + $this->set_name( PrivacyManager::anonymize_data( 'text', $this->get_name() ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/CreditCard.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/CreditCard.php new file mode 100644 index 00000000..d44344e0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/CreditCard.php @@ -0,0 +1,177 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Credit card class + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.4.0 + */ +class CreditCard { + /** + * Credit card number. + * + * @var string + */ + private $number; + + /** + * Credit card expiration month. + * + * @var int + */ + private $expiration_month; + + /** + * Credit card expiration year. + * + * @var int + */ + private $expiration_year; + + /** + * Credit card security code. + * + * @var string + */ + private $security_code; + + /** + * Credit card holder name. + * + * @var string + */ + private $name; + + /** + * Constructs and initializes an credit card object. + */ + public function __construct() { + + } + + /** + * Get credit card number. + * + * @return string + */ + public function get_number() { + return $this->number; + } + + /** + * Set credit card number. + * + * @param string $number Number. + * @return void + */ + public function set_number( $number ) { + $this->number = $number; + } + + /** + * Get expiration month. + * + * @return int + */ + public function get_expiration_month() { + return $this->expiration_month; + } + + /** + * Set expiration month + * + * @param int $month Month. + * @return void + */ + public function set_expiration_month( $month ) { + $this->expiration_month = $month; + } + + /** + * Get expiration year. + * + * @return int + */ + public function get_expiration_year() { + return $this->expiration_year; + } + + /** + * Set expiration year + * + * @param int $year Year. + * @return void + */ + public function set_expiration_year( $year ) { + $this->expiration_year = $year; + } + + /** + * Get expiration date. + * + * @link http://php.net/manual/en/datetime.formats.relative.php + * @link http://php.net/manual/en/datetime.setdate.php + * @return \DateTime|null + */ + public function get_expiration_date() { + if ( empty( $this->expiration_year ) || empty( $this->expiration_month ) ) { + return null; + } + + $date = new \DateTime(); + + $date->setDate( $this->expiration_year, $this->expiration_month, 1 ); + $date->setTime( 0, 0 ); + + return $date; + } + + /** + * Get security code. + * + * @return string + */ + public function get_security_code() { + return $this->security_code; + } + + /** + * Set security code. + * + * @param string $security_code Security code. + * @return void + */ + public function set_security_code( $security_code ) { + $this->security_code = $security_code; + } + + /** + * Get credit card holder name. + * + * @return string + */ + public function get_name() { + return $this->name; + } + + /** + * Set credit card holder name. + * + * @param string $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Customer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Customer.php new file mode 100644 index 00000000..5999e08a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Customer.php @@ -0,0 +1,437 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\VatNumbers\VatNumber; + +/** + * Contact. + * + * @author Reüel van der Steege. + * @version 2.4.0 + * @since 2.1.0 + */ +class Customer { + /** + * Contact name. + * + * @var ContactName|null + */ + private $name; + + /** + * Gender. + * + * @var string|null + */ + private $gender; + + /** + * Date of birth. + * + * @var DateTime|null + */ + private $birth_date; + + /** + * Email address. + * + * @var string|null + */ + private $email; + + /** + * Telephone number. + * + * @var string|null + */ + private $phone; + + /** + * IP address. + * + * @var string|null + */ + private $ip_address; + + /** + * User agent. + * + * @var string|null + */ + private $user_agent; + + /** + * Language. + * + * @var string|null + */ + private $language; + + /** + * Locale. + * + * @var string|null + */ + private $locale; + + /** + * WordPress user ID. + * + * @var integer|null + */ + private $user_id; + + /** + * Company name. + * + * @var string|null + */ + private $company_name; + + /** + * VAT Number. + * + * @var VatNumber|null + */ + private $vat_number; + + /** + * Get contact name. + * + * @return ContactName|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set contact name. + * + * @param ContactName|null $name Contact name. + * @return void + */ + public function set_name( ContactName $name = null ) { + $this->name = $name; + } + + /** + * Get gender. + * + * @return string|null + */ + public function get_gender() { + return $this->gender; + } + + /** + * Set gender. + * + * @param string|null $gender Gender. + * @return void + */ + public function set_gender( $gender ) { + $this->gender = $gender; + } + + /** + * Get birth date. + * + * @return DateTime|null + */ + public function get_birth_date() { + return $this->birth_date; + } + + /** + * Set birth date. + * + * @param DateTime|null $birth_date Date of birth. + * @return void + */ + public function set_birth_date( $birth_date ) { + $this->birth_date = $birth_date; + } + + /** + * Get email. + * + * @return string|null + */ + public function get_email() { + return $this->email; + } + + /** + * Set email address. + * + * @param string|null $email Email adress. + * @return void + */ + public function set_email( $email ) { + $this->email = $email; + } + + /** + * Get phone. + * + * @return string|null + */ + public function get_phone() { + return $this->phone; + } + + /** + * Set phone. + * + * @param string|null $phone Telephone number. + * @return void + */ + public function set_phone( $phone ) { + $this->phone = $phone; + } + + /** + * Get ip address. + * + * @return string|null + */ + public function get_ip_address() { + return $this->ip_address; + } + + /** + * Set ip address. + * + * @param string|null $ip_address IP address. + * @return void + */ + public function set_ip_address( $ip_address ) { + $this->ip_address = $ip_address; + } + + /** + * Get user agent. + * + * @return string|null + */ + public function get_user_agent() { + return $this->user_agent; + } + + /** + * Set user agent. + * + * @param string|null $user_agent User agent. + * @return void + */ + public function set_user_agent( $user_agent ) { + $this->user_agent = $user_agent; + } + + /** + * Get language. + * + * @return string|null + */ + public function get_language() { + return $this->language; + } + + /** + * Set language. + * + * @param string|null $language Language. + * @return void + */ + public function set_language( $language ) { + $this->language = $language; + } + + /** + * Get locale. + * + * @return string|null + */ + public function get_locale() { + return $this->locale; + } + + /** + * Set locale. + * + * @param string|null $locale Locale. + * @return void + */ + public function set_locale( $locale ) { + $this->locale = $locale; + } + + /** + * Get WordPress user ID. + * + * @return int|null + */ + public function get_user_id() { + return $this->user_id; + } + + /** + * Set WordPress user ID. + * + * @param int|null $user_id WordPress user ID. + * @return void + */ + public function set_user_id( $user_id ) { + $this->user_id = $user_id; + } + + /** + * Get company name. + * + * @return string|null + */ + public function get_company_name() { + return $this->company_name; + } + + /** + * Set company name. + * + * @param string|null $company_name Company name. + * @return void + */ + public function set_company_name( $company_name = null ) { + $this->company_name = $company_name; + } + + /** + * Get VAT number. + * + * @return VatNumber|null + */ + public function get_vat_number() { + return $this->vat_number; + } + + /** + * Set VAT number. + * + * @param VatNumber|string|null $vat_number VAT number. + * @return void + */ + public function set_vat_number( $vat_number = null ) { + if ( \is_string( $vat_number ) ) { + $vat_number = new VatNumber( $vat_number ); + } + + $this->vat_number = $vat_number; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'name' => ( null === $this->name ) ? null : $this->name->get_json(), + 'gender' => $this->get_gender(), + 'birth_date' => ( null === $this->birth_date ) ? null : $this->birth_date->format( DATE_RFC3339 ), + 'email' => $this->get_email(), + 'phone' => $this->get_phone(), + 'ip_address' => $this->get_ip_address(), + 'user_agent' => $this->get_user_agent(), + 'language' => $this->get_language(), + 'locale' => $this->get_locale(), + 'user_id' => $this->get_user_id(), + 'company_name' => $this->get_company_name(), + 'vat_number' => ( null === $this->vat_number ) ? null : $this->vat_number->get_json(), + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create address from object. + * + * @param mixed $json JSON. + * @return Customer + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an array.' ); + } + + $customer = new self(); + + $properties = (array) $json; + + foreach ( $properties as $key => $value ) { + $method = sprintf( 'set_%s', $key ); + + $callable = array( $customer, $method ); + + if ( is_callable( $callable ) ) { + if ( 'name' === $key ) { + $value = ContactName::from_json( $value ); + } + + if ( 'birth_date' === $key ) { + $value = new DateTime( $value ); + } + + if ( 'vat_number' === $key ) { + $value = VatNumber::from_json( $value ); + } + + call_user_func( $callable, $value ); + } + } + + return $customer; + } + + /** + * Create string representation of customer. + * + * @return string + */ + public function __toString() { + $pieces = array( + $this->get_name(), + $this->get_email(), + $this->get_phone(), + $this->get_gender(), + ( null === $this->birth_date ) ? null : $this->birth_date->format( DATE_RFC3339 ), + $this->get_user_agent(), + $this->get_ip_address(), + $this->get_language(), + $this->get_locale(), + ); + + $pieces = array_map( 'strval', $pieces ); + + $pieces = array_filter( $pieces ); + + $string = implode( PHP_EOL, $pieces ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/CustomerHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/CustomerHelper.php new file mode 100644 index 00000000..644c3c3d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/CustomerHelper.php @@ -0,0 +1,242 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\VatNumbers\VatNumberViesValidator; + +/** + * Customer helper + * + * @author Remco Tolsma + * @version 2.4.0 + * @since 2.1.0 + */ +class CustomerHelper { + /** + * Complement customer. + * + * @param Customer $customer Customer to complement. + * @return void + */ + public static function complement_customer( Customer $customer ) { + // Name. + if ( null === $customer->get_name() && is_user_logged_in() ) { + $user = wp_get_current_user(); + + $data = array( + 'first_name' => $user->user_firstname, + 'last_name' => $user->user_lastname, + ); + + $data = array_map( 'trim', $data ); + $data = array_filter( $data ); + + if ( ! empty( $data ) ) { + $name = new ContactName(); + + $customer->set_name( $name ); + } + } + + // Name. + $name = $customer->get_name(); + + if ( null !== $name ) { + ContactNameHelper::complement_name( $name ); + } + + // VAT Number validity. + $vat_number = $customer->get_vat_number(); + + if ( null !== $vat_number ) { + $vat_number_validity = $vat_number->get_validity(); + + if ( null === $vat_number_validity ) { + try { + $vat_number_validity = VatNumberViesValidator::validate( $vat_number ); + } catch ( \Exception $e ) { + // On exceptions we have no VAT number validity info, no problem. + $vat_number_validity = null; + } + + $vat_number->set_validity( $vat_number_validity ); + } + } + + // Locale. + if ( null === $customer->get_locale() ) { + $locales = array(); + + // User locale. + if ( is_user_logged_in() ) { + $user = wp_get_current_user(); + + $locales[] = $user->locale; + } + + // Locale based on ACCEPT_LANGUAGE header. + if ( function_exists( 'locale_accept_from_http' ) ) { + /** + * Please note that `locale_accept_from_http` can also return `false`, + * this is not documented on PHP.net. + * + * @link https://www.php.net/manual/en/locale.acceptfromhttp.php + * @link https://github.com/php/php-src/blob/php-7.3.5/ext/intl/locale/locale_methods.c#L1578-L1631 + */ + $http_locale = locale_accept_from_http( Server::get( 'HTTP_ACCEPT_LANGUAGE' ) ); + + // Make sure locale includes a country (i.e. Firefox sets `nl` as accepted language). + if ( false !== $http_locale ) { + if ( false === strpos( $http_locale, '_' ) ) { + $http_locale = sprintf( + '%1$s_%2$s', + $http_locale, + strtoupper( $http_locale ) + ); + } + + $locales[] = $http_locale; + } + } + + // Site locale. + $locales[] = get_locale(); + + // Find first valid locale. + $locales = array_filter( $locales ); + + $locale = reset( $locales ); + + if ( ! empty( $locale ) ) { + $customer->set_locale( $locale ); + } + } + + // Language. + $locale = $customer->get_locale(); + + if ( null === $customer->get_language() && null !== $locale ) { + $language = substr( $locale, 0, 2 ); + + $customer->set_language( $language ); + } + + /** + * User Agent. + * + * @link https://github.com/WordPress/WordPress/blob/4.9.4/wp-includes/comment.php#L1962-L1965 + */ + if ( null === $customer->get_user_agent() && isset( $_SERVER['HTTP_USER_AGENT'] ) ) { + $user_agent = filter_var( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); + + if ( false !== $user_agent ) { + $customer->set_user_agent( $user_agent ); + } + } + + // User IP. + if ( null === $customer->get_ip_address() ) { + // IP (@link https://github.com/WordPress/WordPress/blob/4.9.4/wp-includes/comment.php#L1957-L1960). + $ip_address = Core_Util::get_remote_address(); + + if ( ! empty( $ip_address ) ) { + $customer->set_ip_address( $ip_address ); + } + } + + // Gender. + if ( null === $customer->get_gender() && filter_has_var( INPUT_POST, 'pronamic_pay_gender' ) ) { + $gender = filter_input( INPUT_POST, 'pronamic_pay_gender', FILTER_SANITIZE_STRING ); + + if ( Gender::is_valid( $gender ) ) { + $customer->set_gender( $gender ); + } + } + + // Birth date. + if ( null === $customer->get_birth_date() && filter_has_var( INPUT_POST, 'pronamic_pay_birth_date' ) ) { + $birth_date_string = filter_input( INPUT_POST, 'pronamic_pay_birth_date', FILTER_SANITIZE_STRING ); + + $birth_date = DateTime::create_from_format( 'Y-m-d', $birth_date_string ); + + if ( false !== $birth_date ) { + $customer->set_birth_date( $birth_date ); + } + } + } + + /** + * Anonymize customer. + * + * @param Customer $customer Customer to anonymize. + * @return void + */ + public static function anonymize_customer( Customer $customer ) { + $customer->set_gender( PrivacyManager::anonymize_data( 'text', $customer->get_gender() ) ); + $customer->set_birth_date( null ); + $customer->set_email( PrivacyManager::anonymize_data( 'email_mask', $customer->get_email() ) ); + $customer->set_phone( PrivacyManager::anonymize_data( 'phone', $customer->get_phone() ) ); + $customer->set_ip_address( PrivacyManager::anonymize_ip( $customer->get_ip_address() ) ); + $customer->set_user_agent( PrivacyManager::anonymize_data( 'text', $customer->get_user_agent() ) ); + + $name = $customer->get_name(); + + if ( null !== $name ) { + ContactNameHelper::anonymize_name( $name ); + } + } + + /** + * Create a customer from an array. + * + * @param array $data Data. + * @return Customer|null + */ + public static function from_array( $data ) { + $data = \array_filter( + $data, + function( $value ) { + return ( null !== $value ) && ( '' !== $value ); + } + ); + + if ( empty( $data ) ) { + return null; + } + + $customer = new Customer(); + + if ( \array_key_exists( 'name', $data ) ) { + $name = $data['name']; + + if ( $name instanceof ContactName ) { + $customer->set_name( $name ); + } + } + + if ( \array_key_exists( 'email', $data ) ) { + $customer->set_email( $data['email'] ); + } + + if ( \array_key_exists( 'phone', $data ) ) { + $customer->set_phone( $data['phone'] ); + } + + if ( \array_key_exists( 'user_id', $data ) ) { + $customer->set_user_id( \intval( $data['user_id'] ) ); + } + + return $customer; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/Dependencies.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/Dependencies.php new file mode 100644 index 00000000..1b8cddaa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/Dependencies.php @@ -0,0 +1,59 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Dependencies + */ + +namespace Pronamic\WordPress\Pay\Dependencies; + +/** + * Dependencies + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + */ +class Dependencies { + /** + * Dependencies. + * + * @var array + */ + private $dependencies; + + /** + * Construct. + */ + public function __construct() { + $this->dependencies = array(); + } + + /** + * Add dependency. + * + * @param Dependency $dependency The dependency to add. + * @return void + */ + public function add( Dependency $dependency ) { + $this->dependencies[] = $dependency; + } + + /** + * Are met. + * + * @return bool True if dependencies are met, false otherwise. + */ + public function are_met() { + foreach ( $this->dependencies as $dependency ) { + if ( ! $dependency->is_met() ) { + return false; + } + } + + return true; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/Dependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/Dependency.php new file mode 100644 index 00000000..fd1697ea --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/Dependency.php @@ -0,0 +1,27 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Dependencies + */ + +namespace Pronamic\WordPress\Pay\Dependencies; + +/** + * Dependency + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + */ +abstract class Dependency { + /** + * Is met. + * + * @return bool True if dependency is met, false otherwise. + */ + abstract public function is_met(); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/PhpDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/PhpDependency.php new file mode 100644 index 00000000..099612f8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/PhpDependency.php @@ -0,0 +1,52 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Dependencies + */ + +namespace Pronamic\WordPress\Pay\Dependencies; + +/** + * PHP Dependency + * + * @link https://github.com/Yoast/yoast-acf-analysis/blob/2.3.0/inc/dependencies/dependency-yoast-seo.php + * @link https://github.com/dsawardekar/wp-requirements/blob/0.3.0/lib/Requirements.php#L104-L118 + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + */ +class PhpDependency extends Dependency { + /** + * Minimum PHP version. + * + * @var string + */ + private $minimum_version; + + /** + * Construct PHP dependency. + * + * @param string $minimum_version Minimum PHP version. + */ + public function __construct( $minimum_version ) { + $this->minimum_version = $minimum_version; + } + + /** + * Is met. + * + * @link https://github.com/dsawardekar/wp-requirements/blob/0.3.0/lib/Requirements.php#L104-L118 + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + return \version_compare( + \strval( \phpversion() ), + $this->minimum_version, + '>=' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/PhpExtensionDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/PhpExtensionDependency.php new file mode 100644 index 00000000..a5aad9fd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/PhpExtensionDependency.php @@ -0,0 +1,47 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Dependencies + */ + +namespace Pronamic\WordPress\Pay\Dependencies; + +/** + * PHP Extension Dependency + * + * @link https://github.com/Yoast/yoast-acf-analysis/blob/2.3.0/inc/dependencies/dependency-yoast-seo.php + * @link https://github.com/dsawardekar/wp-requirements/blob/0.3.0/lib/Requirements.php#L104-L118 + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + */ +class PhpExtensionDependency extends Dependency { + /** + * Required PHP extension. + * + * @var string + */ + private $required_extension; + + /** + * Construct PHP extension dependency. + * + * @param string $required_extension Required PHP extension. + */ + public function __construct( $required_extension ) { + $this->required_extension = $required_extension; + } + + /** + * Is met. + * + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + return \extension_loaded( $this->required_extension ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/WordPressDependency.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/WordPressDependency.php new file mode 100644 index 00000000..c7495857 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Dependencies/WordPressDependency.php @@ -0,0 +1,54 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Dependencies + */ + +namespace Pronamic\WordPress\Pay\Dependencies; + +/** + * WordPress Dependency + * + * @link https://github.com/Yoast/yoast-acf-analysis/blob/2.3.0/inc/dependencies/dependency-yoast-seo.php + * @link https://github.com/dsawardekar/wp-requirements/blob/0.3.0/lib/Requirements.php#L104-L118 + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + */ +class WordPressDependency extends Dependency { + /** + * Minimum WordPress version. + * + * @var string + */ + private $minimum_version; + + /** + * Construct WordPress dependency. + * + * @param string $minimum_version Minimum WordPress version. + */ + public function __construct( $minimum_version ) { + $this->minimum_version = $minimum_version; + } + + /** + * Is met. + * + * @link https://codex.wordpress.org/Global_Variables + * @return bool True if dependency is met, false otherwise. + */ + public function is_met() { + global $wp_version; + + return \version_compare( + $wp_version, + $this->minimum_version, + '>=' + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Facades/Http.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Facades/Http.php new file mode 100644 index 00000000..1d9d5154 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Facades/Http.php @@ -0,0 +1,87 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Facades; + +use Pronamic\WordPress\Pay\Http\Response; +use WP_Error; + +/** + * HTTP + * + * @link https://laravel.com/docs/8.x/http-client + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +class Http { + /** + * Result. + * + * @param array|WP_Error $result Remote request result. + * @return Response + * @throws \Exception Throw exception on request error. + */ + private static function result( $result ) { + if ( $result instanceof \WP_Error ) { + throw new \Exception( $result->get_error_message() ); + } + + return new Response( $result ); + } + + /** + * Request. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_request/ + * @param string $url URL. + * @param array $args Arguments. + * @return Response + */ + public static function request( $url, $args ) { + return self::result( \wp_remote_request( $url, $args ) ); + } + + /** + * GET. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_get/ + * @param string $url URL. + * @param array $args Arguments. + * @return Response + */ + public static function get( $url, $args ) { + return self::result( \wp_remote_get( $url, $args ) ); + } + + /** + * POST. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_post/ + * @param string $url URL. + * @param array $args Arguments. + * @return Response + */ + public static function post( $url, $args ) { + return self::result( \wp_remote_post( $url, $args ) ); + } + + /** + * HEAD. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_head/ + * @param string $url URL. + * @param array $args Arguments. + * @return Response + */ + public static function head( $url, $args ) { + return self::result( \wp_remote_head( $url, $args ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormPostType.php new file mode 100644 index 00000000..4e672659 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormPostType.php @@ -0,0 +1,441 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Forms + */ + +namespace Pronamic\WordPress\Pay\Forms; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\Parser as MoneyParser; +use Pronamic\WordPress\Pay\Plugin; +use WP_Post; + +/** + * Form Post Type + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class FormPostType { + /** + * Post type. + * + * @var string + */ + const POST_TYPE = 'pronamic_pay_form'; + + /** + * Amount method input fixed. + * + * @var string + */ + const AMOUNT_METHOD_INPUT_FIXED = 'fixed'; + + /** + * Amount method input only. + * + * @var string + */ + const AMOUNT_METHOD_INPUT_ONLY = 'input_only'; + + /** + * Amount method choices only. + * + * @var string + */ + const AMOUNT_METHOD_CHOICES_ONLY = 'choices_only'; + + /** + * Amount method choices and input. + * + * @var string + */ + const AMOUNT_METHOD_CHOICES_AND_INPUT = 'choices_and_input'; + + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initializes an admin form post type object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + /** + * Priotiry of the initial post types function should be set to < 10. + * + * @link https://core.trac.wordpress.org/ticket/28488. + * @link https://core.trac.wordpress.org/changeset/29318. + * + * @link https://github.com/WordPress/WordPress/blob/4.0/wp-includes/post.php#L167. + */ + add_action( 'init', array( $this, 'register_post_type' ), 0 ); // Highest priority. + + add_filter( 'manage_edit-' . self::POST_TYPE . '_columns', array( $this, 'edit_columns' ) ); + + add_action( 'manage_' . self::POST_TYPE . '_posts_custom_column', array( $this, 'custom_columns' ), 10, 2 ); + + /* + * Add meta box, we use priority 9 to make sure it loads before Yoast SEO meta box. + * @link https://github.com/Yoast/wordpress-seo/blob/2.3.4/admin/class-metabox.php#L20. + */ + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 9 ); + + add_action( 'save_post_' . self::POST_TYPE, array( $this, 'save_post' ) ); + + add_action( 'post_submitbox_misc_actions', array( $this, 'post_submitbox_misc_actions' ) ); + } + + /** + * Register post type. + * + * @return void + */ + public function register_post_type() { + register_post_type( + self::POST_TYPE, + array( + 'label' => __( 'Payment Forms', 'pronamic_ideal' ), + 'labels' => array( + 'name' => __( 'Payment Forms', 'pronamic_ideal' ), + 'singular_name' => __( 'Payment Form', 'pronamic_ideal' ), + 'add_new' => __( 'Add New', 'pronamic_ideal' ), + 'add_new_item' => __( 'Add New Payment Form', 'pronamic_ideal' ), + 'edit_item' => __( 'Edit Payment Form', 'pronamic_ideal' ), + 'new_item' => __( 'New Payment Form', 'pronamic_ideal' ), + 'all_items' => __( 'All Payment Forms', 'pronamic_ideal' ), + 'view_item' => __( 'View Payment Form', 'pronamic_ideal' ), + 'search_items' => __( 'Search Payment Forms', 'pronamic_ideal' ), + 'not_found' => __( 'No payment forms found.', 'pronamic_ideal' ), + 'not_found_in_trash' => __( 'No payment forms found in Trash.', 'pronamic_ideal' ), + 'menu_name' => __( 'Payment Forms', 'pronamic_ideal' ), + 'filter_items_list' => __( 'Filter payment forms list', 'pronamic_ideal' ), + 'items_list_navigation' => __( 'Payment forms list navigation', 'pronamic_ideal' ), + 'items_list' => __( 'Payment forms list', 'pronamic_ideal' ), + + /* + * New Post Type Labels in 5.0. + * @link https://make.wordpress.org/core/2018/12/05/new-post-type-labels-in-5-0/ + */ + 'item_published' => __( 'Payment form published.', 'pronamic_ideal' ), + 'item_published_privately' => __( 'Payment form published privately.', 'pronamic_ideal' ), + 'item_reverted_to_draft' => __( 'Payment form reverted to draft.', 'pronamic_ideal' ), + 'item_scheduled' => __( 'Payment form scheduled.', 'pronamic_ideal' ), + 'item_updated' => __( 'Payment form updated.', 'pronamic_ideal' ), + ), + 'public' => true, + 'publicly_queryable' => true, + 'show_ui' => true, + 'show_in_nav_menus' => true, + 'show_in_menu' => false, + 'show_in_admin_bar' => false, + 'supports' => array( + 'title', + 'revisions', + ), + 'rewrite' => array( + 'slug' => _x( 'payment-forms', 'slug', 'pronamic_ideal' ), + ), + 'query_var' => false, + 'capabilities' => self::get_capabilities(), + 'map_meta_cap' => true, + ) + ); + } + + /** + * Edit columns. + * + * @param array $columns Edit columns. + * @return array + */ + public function edit_columns( $columns ) { + $columns = array( + 'cb' => '', + 'title' => __( 'Title', 'pronamic_ideal' ), + 'pronamic_payment_form_gateway' => __( 'Gateway', 'pronamic_ideal' ), + 'pronamic_payment_form_payments' => __( 'Payments', 'pronamic_ideal' ), + 'pronamic_payment_form_earnings' => __( 'Earnings', 'pronamic_ideal' ), + 'pronamic_payment_form_shortcode' => __( 'Shortcode', 'pronamic_ideal' ), + 'date' => __( 'Date', 'pronamic_ideal' ), + ); + + return $columns; + } + + /** + * Custom columns. + * + * @param string $column Column. + * @param int $post_id Post ID. + * @return void + */ + public function custom_columns( $column, $post_id ) { + global $post; + global $wpdb; + + switch ( $column ) { + case 'pronamic_payment_form_gateway': + $config_id = get_post_meta( $post_id, '_pronamic_payment_form_config_id', true ); + + if ( ! empty( $config_id ) ) { + echo esc_html( get_the_title( $config_id ) ); + } else { + echo '—'; + } + + break; + case 'pronamic_payment_form_payments': + /* phpcs:ignore WordPress.DB.DirectDatabaseQuery */ + $value = $wpdb->get_var( + $wpdb->prepare( + " + SELECT + COUNT( post.ID ) AS value + FROM + $wpdb->posts AS post + LEFT JOIN + $wpdb->postmeta AS meta_amount + ON post.ID = meta_amount.post_id AND meta_amount.meta_key = '_pronamic_payment_amount' + LEFT JOIN + $wpdb->postmeta AS meta_source + ON post.ID = meta_source.post_id AND meta_source.meta_key = '_pronamic_payment_source' + LEFT JOIN + $wpdb->postmeta AS meta_source_id + ON post.ID = meta_source_id.post_id AND meta_source_id.meta_key = '_pronamic_payment_source_id' + WHERE + post.post_type = 'pronamic_payment' + AND + post.post_status = 'payment_completed' + AND + meta_source.meta_value = 'payment_form' + AND + meta_source_id.meta_value = %s + GROUP BY + post.ID + ; + ", + $post_id + ) + ); + + echo esc_html( number_format_i18n( $value ) ); + + break; + case 'pronamic_payment_form_earnings': + /* phpcs:ignore WordPress.DB.DirectDatabaseQuery */ + $value = $wpdb->get_var( + $wpdb->prepare( + " + SELECT + SUM( meta_amount.meta_value ) AS value + FROM + $wpdb->posts AS post + LEFT JOIN + $wpdb->postmeta AS meta_amount + ON post.ID = meta_amount.post_id AND meta_amount.meta_key = '_pronamic_payment_amount' + LEFT JOIN + $wpdb->postmeta AS meta_source + ON post.ID = meta_source.post_id AND meta_source.meta_key = '_pronamic_payment_source' + LEFT JOIN + $wpdb->postmeta AS meta_source_id + ON post.ID = meta_source_id.post_id AND meta_source_id.meta_key = '_pronamic_payment_source_id' + WHERE + post.post_type = 'pronamic_payment' + AND + post.post_status = 'payment_completed' + AND + meta_source.meta_value = 'payment_form' + AND + meta_source_id.meta_value = %s + GROUP BY + post.ID + ; + ", + $post_id + ) + ); + + $money = new Money( $value, 'EUR' ); + + echo esc_html( $money->format_i18n() ); + + break; + case 'pronamic_payment_form_shortcode': + printf( + '', + esc_attr( $this->get_shortcode( $post_id ) ) + ); + + break; + } + } + + /** + * Add meta boxes. + * + * @param string $post_type Post Type. + * @return void + */ + public function add_meta_boxes( $post_type ) { + if ( self::POST_TYPE === $post_type ) { + add_meta_box( + 'pronamic_payment_form_options', + __( 'Form Options', 'pronamic_ideal' ), + array( $this, 'meta_box_form_options' ), + $post_type, + 'normal', + 'high' + ); + } + } + + /** + * Pronamic Pay gateway config meta box. + * + * @param WP_Post $post The object for the current post/page. + * @return void + */ + public function meta_box_form_options( $post ) { + include __DIR__ . '/../../views/meta-box-form-options.php'; + } + + /** + * When the post is saved, saves our custom data. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-includes/post.php#L4096-L4119 + * @param int $post_id The ID of the post being saved. + * @return void + */ + public function save_post( $post_id ) { + // Check if our nonce is set. + if ( ! filter_has_var( INPUT_POST, 'pronamic_pay_nonce' ) ) { + return; + } + + $nonce = filter_input( INPUT_POST, 'pronamic_pay_nonce', FILTER_SANITIZE_STRING ); + + // Verify that the nonce is valid. + if ( ! wp_verify_nonce( $nonce, 'pronamic_pay_save_form_options' ) ) { + return; + } + + // If this is an autosave, our form has not been submitted, so we don't want to do anything. + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return; + } + + // OK, its safe for us to save the data now. + $definition = array( + // General. + '_pronamic_payment_form_config_id' => FILTER_SANITIZE_NUMBER_INT, + '_pronamic_payment_form_button_text' => FILTER_SANITIZE_STRING, + '_pronamic_payment_form_amount_method' => FILTER_SANITIZE_STRING, + '_pronamic_payment_form_amount_choices' => array( + 'flags' => FILTER_REQUIRE_ARRAY, + ), + ); + + $data = \filter_input_array( INPUT_POST, $definition ); + + if ( ! \is_array( $data ) ) { + return; + } + + // Convert amount choices to cents. + if ( isset( $data['_pronamic_payment_form_amount_choices'] ) ) { + $money_parser = new MoneyParser(); + + foreach ( $data['_pronamic_payment_form_amount_choices'] as $i => $amount ) { + // Parse input value to money object. + try { + $amount = $money_parser->parse( $amount ); + } catch ( \Exception $e ) { + // Remove amount choice if parsing failed (i.e. empty string). + unset( $data['_pronamic_payment_form_amount_choices'][ $i ] ); + + continue; + } + + $data['_pronamic_payment_form_amount_choices'][ $i ] = $amount->get_cents(); + } + + // Remove empty choices. + $data['_pronamic_payment_form_amount_choices'] = array_filter( $data['_pronamic_payment_form_amount_choices'] ); + } + + // Update post meta data. + pronamic_pay_update_post_meta_data( $post_id, $data ); + } + + /** + * Get shortcode of the specified form post ID. + * + * @param int|null $post_id Post ID. + * @return string + */ + private function get_shortcode( $post_id = null ) { + $post_id = ( null === $post_id ) ? get_the_ID() : $post_id; + + $shortcode = sprintf( '[pronamic_payment_form id="%s"]', esc_attr( strval( $post_id ) ) ); + + return $shortcode; + } + + /** + * Post submit box miscellaneous actions. + * + * @link https://github.com/WordPress/WordPress/blob/5.3/wp-admin/includes/meta-boxes.php#L283-L293 + * @return void + */ + public function post_submitbox_misc_actions() { + if ( self::POST_TYPE !== get_post_type() ) { + return; + } + + ?> +
    + + + +
    + 'edit_form', + 'read_post' => 'read_form', + 'delete_post' => 'delete_form', + 'edit_posts' => 'edit_forms', + 'edit_others_posts' => 'edit_others_forms', + 'publish_posts' => 'publish_forms', + 'read_private_posts' => 'read_private_forms', + 'read' => 'read', + 'delete_posts' => 'delete_forms', + 'delete_private_posts' => 'delete_private_forms', + 'delete_published_posts' => 'delete_published_forms', + 'delete_others_posts' => 'delete_others_forms', + 'edit_private_posts' => 'edit_private_forms', + 'edit_published_posts' => 'edit_published_forms', + 'create_posts' => 'create_forms', + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormProcessor.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormProcessor.php new file mode 100644 index 00000000..a61c1355 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormProcessor.php @@ -0,0 +1,261 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Forms + */ + +namespace Pronamic\WordPress\Pay\Forms; + +use Exception; +use Pronamic\WordPress\Money\Parser as MoneyParser; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentLines; +use Pronamic\WordPress\Pay\Plugin; +use WP_Error; +use WP_User; + +/** + * Form Processor + * + * @author Remco Tolsma + * @version 2.3.2 + * @since 3.7.0 + */ +class FormProcessor { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initialize an form processor object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'init', array( $this, 'init' ) ); + } + + /** + * Initialize. + * + * @return void + * @throws Exception When processing form fails on creating WordPress user. + */ + public function init() { + global $pronamic_pay_errors; + + $pronamic_pay_errors = array(); + + // Nonce. + if ( ! filter_has_var( INPUT_POST, 'pronamic_pay_nonce' ) ) { + return; + } + + $nonce = filter_input( INPUT_POST, 'pronamic_pay_nonce', FILTER_SANITIZE_STRING ); + + if ( ! wp_verify_nonce( $nonce, 'pronamic_pay' ) ) { + return; + } + + // Validate. + $valid = $this->validate(); + + if ( ! $valid ) { + return; + } + + // Source. + $source = filter_input( INPUT_POST, 'pronamic_pay_source', FILTER_SANITIZE_STRING ); + $source_id = filter_input( INPUT_POST, 'pronamic_pay_source_id', FILTER_SANITIZE_STRING ); + + if ( ! FormsSource::is_valid( $source ) ) { + return; + } + + // Config ID. + $config_id = filter_input( INPUT_POST, 'pronamic_pay_config_id', FILTER_SANITIZE_STRING ); + + if ( FormsSource::PAYMENT_FORM === $source ) { + $config_id = get_post_meta( $source_id, '_pronamic_payment_form_config_id', true ); + } + + // Gateway. + $gateway = Plugin::get_gateway( $config_id ); + + if ( ! $gateway ) { + return; + } + + /* + * Start payment. + */ + $first_name = filter_input( INPUT_POST, 'pronamic_pay_first_name', FILTER_SANITIZE_STRING ); + $last_name = filter_input( INPUT_POST, 'pronamic_pay_last_name', FILTER_SANITIZE_STRING ); + $email = filter_input( INPUT_POST, 'pronamic_pay_email', FILTER_VALIDATE_EMAIL ); + $order_id = time(); + + $description = sprintf( + /* translators: %s: order id */ + __( 'Payment Form %s', 'pronamic_ideal' ), + $order_id + ); + + $payment = new Payment(); + + $payment->title = sprintf( + /* translators: %s: payment data title */ + __( 'Payment for %s', 'pronamic_ideal' ), + $description + ); + + $payment->description = $description; + $payment->config_id = $config_id; + $payment->order_id = $order_id; + $payment->source = $source; + $payment->source_id = $source_id; + $payment->set_origin_id( $source_id ); + + // Set default payment method if required. + if ( $gateway->payment_method_is_required() ) { + $payment->method = PaymentMethods::IDEAL; + } + + // Customer. + $customer = array( + 'name' => (object) array( + 'first_name' => $first_name, + 'last_name' => $last_name, + ), + 'email' => $email, + ); + + $customer = array_filter( $customer ); + + if ( ! empty( $customer ) ) { + $customer = Customer::from_json( (object) $customer ); + + $payment->set_customer( $customer ); + } + + // Amount. + $amount_method = get_post_meta( $source_id, '_pronamic_payment_form_amount_method', true ); + $amount = filter_input( INPUT_POST, 'pronamic_pay_amount', FILTER_SANITIZE_STRING ); + + if ( 'other' === $amount ) { + $amount = filter_input( INPUT_POST, 'pronamic_pay_amount_other', FILTER_SANITIZE_STRING ); + + $money_parser = new MoneyParser(); + + $amount = $money_parser->parse( $amount )->get_value(); + } elseif ( empty( $amount_method ) || in_array( $amount_method, array( FormPostType::AMOUNT_METHOD_CHOICES_ONLY, FormPostType::AMOUNT_METHOD_CHOICES_AND_INPUT ), true ) ) { + $amount /= 100; + } + + $payment->set_total_amount( + new TaxedMoney( + $amount, + 'EUR' + ) + ); + + // Payment lines. + $payment->lines = new PaymentLines(); + + $line = $payment->lines->new_line(); + + // Set line properties. + $line->set_id( strval( $order_id ) ); + $line->set_name( $description ); + $line->set_quantity( 1 ); + $line->set_unit_price( $payment->get_total_amount() ); + $line->set_total_amount( $payment->get_total_amount() ); + + // Start payment. + try { + $payment = Plugin::start_payment( $payment, $gateway ); + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + + exit; + } + + // @link https://github.com/WordImpress/Give/blob/1.1/includes/payments/functions.php#L172-L178. + // @link https://github.com/woothemes/woocommerce/blob/2.4.3/includes/wc-user-functions.php#L36-L118. + $user = get_user_by( 'email', $email ); + + if ( ! empty( $email ) && ! $user ) { + // Make a random string for password. + $password = wp_generate_password( 10 ); + + // Make a user with the username as the email. + $result = wp_insert_user( + array( + 'user_login' => $email, + 'user_pass' => $password, + 'user_email' => $email, + 'role' => 'payer', + 'first_name' => $first_name, + 'last_name' => $last_name, + ) + ); + + if ( $result instanceof WP_Error ) { + throw new Exception( $result->get_error_message() ); + } + + // User. + $user = new WP_User( $result ); + } + + if ( is_object( $user ) ) { + wp_update_post( + array( + 'ID' => $payment->get_id(), + 'post_author' => $user->ID, + ) + ); + } + + $gateway->redirect( $payment ); + + exit; + } + + /** + * Validate. + * + * @return boolean True if valid, false otherwise. + */ + private function validate() { + global $pronamic_pay_errors; + + // First Name. + $first_name = filter_input( INPUT_POST, 'pronamic_pay_first_name', FILTER_SANITIZE_STRING ); + + if ( empty( $first_name ) ) { + $pronamic_pay_errors['first_name'] = __( 'Please enter your first name', 'pronamic_ideal' ); + } + + // E-mail. + $email = filter_input( INPUT_POST, 'pronamic_pay_email', FILTER_VALIDATE_EMAIL ); + + if ( empty( $email ) ) { + $pronamic_pay_errors['email'] = __( 'Please enter a valid email address', 'pronamic_ideal' ); + } + + return empty( $pronamic_pay_errors ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormScripts.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormScripts.php new file mode 100644 index 00000000..d760da7a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormScripts.php @@ -0,0 +1,86 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Forms + */ + +namespace Pronamic\WordPress\Pay\Forms; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * Form Scripts + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 3.7.0 + */ +class FormScripts { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initialize an form scripts object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + /** + * We register the form style in the 'init' action so the style + * is available on the front end and admin pages. This is + * important for the block editor to work. According to the + * `_wp_scripts_maybe_doing_it_wrong` function it is allowed + * to register scripts in the 'init' action. + * + * @link https://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts + * @link https://github.com/WordPress/WordPress/blob/5.1/wp-includes/script-loader.php#L2645-L2680 + * @link https://github.com/WordPress/WordPress/blob/5.1/wp-includes/functions.wp-scripts.php#L28-L52 + */ + add_action( 'init', array( $this, 'register' ) ); + + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ) ); + } + + /** + * Register. + * + * @return void + */ + public function register() { + $min = SCRIPT_DEBUG ? '' : '.min'; + + wp_register_style( + 'pronamic-pay-forms', + plugins_url( 'css/forms' . $min . '.css', dirname( dirname( __FILE__ ) ) ), + array(), + $this->plugin->get_version() + ); + } + + /** + * Enqueue. + * + * @link https://mikejolley.com/2013/12/02/sensible-script-enqueuing-shortcodes/ + * @link http://wordpress.stackexchange.com/questions/165754/enqueue-scripts-styles-when-shortcode-is-present + * @return void + */ + public function enqueue() { + if ( + has_shortcode( get_post_field( 'post_content' ), 'pronamic_payment_form' ) + || + is_singular( 'pronamic_pay_form' ) + ) { + wp_enqueue_style( 'pronamic-pay-forms' ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormShortcode.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormShortcode.php new file mode 100644 index 00000000..bcdb029e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormShortcode.php @@ -0,0 +1,104 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Forms + */ + +namespace Pronamic\WordPress\Pay\Forms; + +/** + * Form Shortcode + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 3.7.0 + */ +class FormShortcode { + /** + * Forms module. + * + * @var FormsModule + */ + private $forms_module; + + /** + * Constructs and initializes an post types object. + * + * @param FormsModule $forms_module Reference to the forms module. + */ + public function __construct( $forms_module ) { + $this->forms_module = $forms_module; + + add_shortcode( 'pronamic_payment_form', array( $this, 'shortcode_form' ) ); + + add_action( 'init', array( $this, 'shortcode_ui_register' ) ); + } + + /** + * Shortcode form. + * + * @link https://github.com/WordImpress/Give/blob/1.1/includes/shortcodes.php#L39-L65 + * @link https://github.com/WordImpress/Give/blob/1.1/includes/forms/template.php#L18-L140 + * + * @param array $atts Shortcode attributes array. + * + * @return string + * + * @throws \Exception Throws exception if output buffering is not active. + */ + public function shortcode_form( $atts ) { + $atts = shortcode_atts( + array( + 'id' => null, + ), + $atts, + 'pronamic_payment_form' + ); + + return $this->forms_module->get_form_output_by_id( $atts['id'] ); + } + + /** + * Shortcode user interface register. + * + * @return void + */ + public function shortcode_ui_register() { + if ( ! function_exists( 'shortcode_ui_register_for_shortcode' ) ) { + return; + } + + shortcode_ui_register_for_shortcode( + 'pronamic_payment_form', + array( + // Display label. String. Required. + 'label' => __( 'Payment Form', 'pronamic_ideal' ), + + // Icon/attachment for shortcode. Optional. src or dashicons-$icon. Defaults to carrot. + 'listItemImage' => 'dashicons-money', + + // Available shortcode attributes and default values. Required. Array. + // Attribute model expects 'attr', 'type' and 'label'. + // Supported field types: text, checkbox, textarea, radio, select, email, url, number, and date. + 'attrs' => array( + + array( + 'label' => __( 'Select Payment Form', 'pronamic_ideal' ), + 'attr' => 'id', + 'type' => 'post_select', + 'query' => array( + 'post_type' => 'pronamic_pay_form', + ), + 'multiple' => false, + ), + + ), + + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormsModule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormsModule.php new file mode 100644 index 00000000..4bbbc824 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormsModule.php @@ -0,0 +1,255 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Forms + */ + +namespace Pronamic\WordPress\Pay\Forms; + +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Forms Module + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 3.7.0 + */ +class FormsModule { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Form post type. + * + * @var FormPostType + */ + private $form_post_type; + + /** + * Form processor. + * + * @var FormProcessor + */ + private $processor; + + /** + * Form scripts. + * + * @var FormScripts + */ + private $scripts; + + /** + * Form shortcode. + * + * @var FormShortcode + */ + private $shortcode; + + /** + * Constructs and initalize a forms module object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + // Form Post Type. + $this->form_post_type = new FormPostType( $plugin ); + + // Processor. + $this->processor = new FormProcessor( $plugin ); + + // Scripts. + $this->scripts = new FormScripts( $plugin ); + + // Shortcode. + $this->shortcode = new FormShortcode( $this ); + + // Actions. + add_filter( 'the_content', array( $this, 'maybe_add_form_to_content' ) ); + + add_filter( 'pronamic_payment_source_url_' . FormsSource::PAYMENT_FORM, array( $this, 'source_url' ), 10, 2 ); + add_filter( 'pronamic_payment_source_text_' . FormsSource::PAYMENT_FORM, array( $this, 'source_text' ), 10, 2 ); + add_filter( 'pronamic_payment_source_description_' . FormsSource::PAYMENT_FORM, array( $this, 'source_description' ), 10, 2 ); + } + + /** + * Maybe add form to content. + * + * @link https://developer.wordpress.org/reference/hooks/the_content/ + * + * @param string $content Post content to maybe extend with a payment form. + * + * @return string + * + * @throws \Exception Throws exception if output buffering is not active. + */ + public function maybe_add_form_to_content( $content ) { + if ( is_singular( 'pronamic_pay_form' ) && 'pronamic_pay_form' === get_post_type() ) { + $content .= $this->get_form_output_by_id( (int) get_the_ID() ); + } + + return $content; + } + + /** + * Get form output. + * + * @param int $id Form ID or form settings. + * + * @return string + * + * @throws \Exception Throws exception if output buffering is not active. + */ + public function get_form_output_by_id( $id ) { + $args = array( + 'amount_method' => get_post_meta( $id, '_pronamic_payment_form_amount_method', true ), + 'amounts' => get_post_meta( $id, '_pronamic_payment_form_amount_choices', true ), + 'config_id' => get_post_meta( $id, '_pronamic_payment_form_config_id', true ), + 'html_id' => sprintf( 'pronamic-pay-form-%s', $id ), + 'source' => FormsSource::PAYMENT_FORM, + 'source_id' => $id, + 'title' => ( is_singular( 'pronamic_pay_form' ) ? null : get_the_title( $id ) ), + ); + + // Button text. + $button_text = get_post_meta( $id, '_pronamic_payment_form_button_text', true ); + + if ( '' !== $button_text ) { + $args['button_text'] = $button_text; + } + + return $this->get_form_output( $args ); + } + + /** + * Get form output. + * + * @param array $args Form settings. + * + * @return string + * + * @throws \Exception When output buffering is not working as expected. + */ + public function get_form_output( $args ) { + if ( ! is_array( $args ) ) { + return ''; + } + + // Amount(s). + $amounts = array( 0 ); + + if ( isset( $args['amounts'] ) && is_array( $args['amounts'] ) ) { + $amounts = $args['amounts']; + } elseif ( isset( $args['amount'] ) ) { + $amounts = array( $args['amount'] ); + } + + // Form settings. + $defaults = array( + 'amount_method' => FormPostType::AMOUNT_METHOD_INPUT_FIXED, + 'amounts' => $amounts, + 'button_text' => __( 'Pay Now', 'pronamic_ideal' ), + 'config_id' => get_option( 'pronamic_pay_config_id' ), + 'form_id' => null, + 'html_id' => 'pronamic-pay-form', + 'source' => null, + 'source_id' => null, + 'title' => null, + ); + + $settings = wp_parse_args( $args, $defaults ); + + // Load template. + ob_start(); + + include __DIR__ . '/../../views/form.php'; + + $output = ob_get_clean(); + + if ( false === $output ) { + throw new \Exception( 'Output buffering is not active.' ); + } + + return $output; + } + + /** + * Source text filter. + * + * @param string $text The source text to filter. + * @param Payment $payment The payment for the specified source text. + * @return string + */ + public function source_text( $text, Payment $payment ) { + $text = __( 'Payment Form', 'pronamic_ideal' ); + + if ( empty( $payment->source_id ) ) { + return $text; + } + + $link = get_edit_post_link( intval( $payment->source_id ) ); + + if ( null === $link ) { + return $text; + } + + $text .= '
    '; + + $text .= sprintf( + '%s', + esc_url( $link ), + esc_html( strval( $payment->source_id ) ) + ); + + return $text; + } + + /** + * Source description filter. + * + * @param string $text The source text to filter. + * @param Payment $payment The payment for the specified source text. + * @return string + */ + public function source_description( $text, Payment $payment ) { + $text = __( 'Payment Form', 'pronamic_ideal' ) . '
    '; + + return $text; + } + + /** + * Source URL. + * + * @link https://developer.wordpress.org/reference/functions/get_edit_post_link/ + * + * @param string $url Source URL. + * @param Payment $payment Payment. + * + * @return string + */ + public function source_url( $url, Payment $payment ) { + if ( empty( $payment->source_id ) ) { + return $url; + } + + $link = get_edit_post_link( intval( $payment->source_id ) ); + + if ( null === $link ) { + return $url; + } + + return $link; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormsSource.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormsSource.php new file mode 100644 index 00000000..c3767e05 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Forms/FormsSource.php @@ -0,0 +1,50 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Forms + */ + +namespace Pronamic\WordPress\Pay\Forms; + +/** + * Form Source + * + * @author Reüel van der Steege + * @version 2.1.7 + * @since 2.1.7 + */ +class FormsSource { + /** + * Payment form. + * + * @var string + */ + const PAYMENT_FORM = 'payment_form'; + + /** + * Block payment form. + * + * @var string + */ + const BLOCK_PAYMENT_FORM = 'block_payment_form'; + + /** + * Is valid source? + * + * @param string $source Source string to validate. + * + * @return bool + */ + public static function is_valid( $source ) { + $sources = array( + self::BLOCK_PAYMENT_FORM, + self::PAYMENT_FORM, + ); + + return in_array( $source, $sources, true ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GatewayIntegrations.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GatewayIntegrations.php new file mode 100644 index 00000000..3e0659e1 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GatewayIntegrations.php @@ -0,0 +1,80 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Title: WordPress gateway integrations class. + * + * @author Reüel van der Steege + * @version 2.2.6 + * @since 1.0.0 + * @implements \IteratorAggregate + */ +class GatewayIntegrations implements \IteratorAggregate { + /** + * Integrations. + * + * @var AbstractGatewayIntegration[] + */ + private $integrations = array(); + + /** + * Construct gateway integrations. + * + * @param array $integrations Integrations. + */ + public function __construct( $integrations ) { + foreach ( $integrations as $integration ) { + if ( is_string( $integration ) && class_exists( $integration ) ) { + $integration = new $integration(); + } + + /** + * Invalid integrations are ignored for now. + * + * @todo Consider throwing exception? + */ + if ( ! ( $integration instanceof AbstractGatewayIntegration ) ) { + continue; + } + + /** + * Only add active integrations. + */ + if ( $integration->is_active() ) { + $this->integrations[ $integration->get_id() ] = $integration; + } + } + } + + /** + * Get integration by ID. + * + * @param string $id Integration ID. + * @return AbstractGatewayIntegration|null + */ + public function get_integration( $id ) { + if ( array_key_exists( $id, $this->integrations ) ) { + return $this->integrations[ $id ]; + } + + return null; + } + + /** + * Get iterator. + * + * @return \ArrayIterator + */ + public function getIterator() { + return new \ArrayIterator( $this->integrations ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GatewayPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GatewayPostType.php new file mode 100644 index 00000000..6da09168 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GatewayPostType.php @@ -0,0 +1,150 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Title: WordPress gateway post type + * + * @author Remco Tolsma + * @version 2.2.6 + * @since ? + */ +class GatewayPostType { + /** + * Post type. + * + * @var string + */ + const POST_TYPE = 'pronamic_gateway'; + + /** + * Constructs and initializes a gateway post type object. + */ + public function __construct() { + /** + * Priotiry of the initial post types function should be set to < 10. + * + * @link https://core.trac.wordpress.org/ticket/28488 + * @link https://core.trac.wordpress.org/changeset/29318 + * + * @link https://github.com/WordPress/WordPress/blob/4.0/wp-includes/post.php#L167 + */ + add_action( 'init', array( $this, 'register_gateway_post_type' ), 0 ); // Highest priority. + + add_action( 'save_post_' . self::POST_TYPE, array( $this, 'maybe_set_default_gateway' ) ); + } + + /** + * Register post types. + * + * @link https://github.com/WordPress/WordPress/blob/4.6.1/wp-includes/post.php#L1277-L1300 + * @return void + */ + public function register_gateway_post_type() { + register_post_type( + 'pronamic_gateway', + array( + 'label' => __( 'Payment Gateway Configurations', 'pronamic_ideal' ), + 'labels' => array( + 'name' => __( 'Payment Gateway Configurations', 'pronamic_ideal' ), + 'singular_name' => __( 'Payment Gateway Configuration', 'pronamic_ideal' ), + 'add_new' => __( 'Add New', 'pronamic_ideal' ), + 'add_new_item' => __( 'Add New Payment Gateway Configuration', 'pronamic_ideal' ), + 'edit_item' => __( 'Edit Payment Gateway Configuration', 'pronamic_ideal' ), + 'new_item' => __( 'New Payment Gateway Configuration', 'pronamic_ideal' ), + 'all_items' => __( 'All Payment Gateway Configurations', 'pronamic_ideal' ), + 'view_item' => __( 'View Payment Gateway Configuration', 'pronamic_ideal' ), + 'search_items' => __( 'Search Payment Gateway Configurations', 'pronamic_ideal' ), + 'not_found' => __( 'No payment gateway configurations found.', 'pronamic_ideal' ), + 'not_found_in_trash' => __( 'No payment gateway configurations found in Trash.', 'pronamic_ideal' ), + 'menu_name' => __( 'Configurations', 'pronamic_ideal' ), + 'filter_items_list' => __( 'Filter payment gateway configurations list', 'pronamic_ideal' ), + 'items_list_navigation' => __( 'Payment gateway configurations list navigation', 'pronamic_ideal' ), + 'items_list' => __( 'Payment gateway configurations list', 'pronamic_ideal' ), + + /* + * New Post Type Labels in 5.0. + * @link https://make.wordpress.org/core/2018/12/05/new-post-type-labels-in-5-0/ + */ + 'item_published' => __( 'Payment gateway configuration published.', 'pronamic_ideal' ), + 'item_published_privately' => __( 'Payment gateway configuration published privately.', 'pronamic_ideal' ), + 'item_reverted_to_draft' => __( 'Payment gateway configuration reverted to draft.', 'pronamic_ideal' ), + 'item_scheduled' => __( 'Payment gateway configuration scheduled.', 'pronamic_ideal' ), + 'item_updated' => __( 'Payment gateway configuration updated.', 'pronamic_ideal' ), + ), + 'public' => false, + 'publicly_queryable' => false, + 'show_ui' => true, + 'show_in_nav_menus' => false, + 'show_in_menu' => false, + 'show_in_admin_bar' => false, + 'hierarchical' => true, + 'supports' => array( + 'title', + 'revisions', + ), + 'rewrite' => false, + 'query_var' => false, + 'capabilities' => self::get_capabilities(), + // Don't map meta capabilities since we only use the `manage_options` capability for this post type. + 'map_meta_cap' => false, + ) + ); + } + + /** + * Maybe set the default gateway. + * + * @param int $post_id Post ID. + * @return void + */ + public function maybe_set_default_gateway( $post_id ) { + // Don't set the default gateway if the post is not published. + if ( 'publish' !== get_post_status( $post_id ) ) { + return; + } + + // Don't set the default gateway if there is already a published gateway set. + $config_id = get_option( 'pronamic_pay_config_id' ); + + if ( ! empty( $config_id ) && 'publish' === get_post_status( $config_id ) ) { + return; + } + + // Update. + update_option( 'pronamic_pay_config_id', $post_id ); + } + + /** + * Get capabilities for this post type. + * + * @return array + */ + public static function get_capabilities() { + return array( + 'edit_post' => 'manage_options', + 'read_post' => 'manage_options', + 'delete_post' => 'manage_options', + 'edit_posts' => 'manage_options', + 'edit_others_posts' => 'manage_options', + 'publish_posts' => 'manage_options', + 'read_private_posts' => 'manage_options', + 'read' => 'manage_options', + 'delete_posts' => 'manage_options', + 'delete_private_posts' => 'manage_options', + 'delete_published_posts' => 'manage_options', + 'delete_others_posts' => 'manage_options', + 'edit_private_posts' => 'manage_options', + 'edit_published_posts' => 'manage_options', + 'create_posts' => 'manage_options', + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Gender.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Gender.php new file mode 100644 index 00000000..cf15b7c3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Gender.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Gender. + * + * @author Remco Tolsma + * @since 2.1.0 + * @version 2.0.8 + */ +class Gender { + /** + * Female. + * + * @var string + */ + const FEMALE = 'F'; + + /** + * Male. + * + * @var string + */ + const MALE = 'M'; + + /** + * Other. + * + * @link https://en.wikipedia.org/wiki/Legal_recognition_of_non-binary_gender + * + * @var string + */ + const OTHER = 'X'; + + /** + * Check if value is valid. + * + * @param string $gender Gender. + * @return boolean True if valid, false otherwise. + */ + public static function is_valid( $gender ) { + return in_array( + $gender, + array( + self::FEMALE, + self::MALE, + self::OTHER, + ), + true + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GoogleAnalyticsEcommerce.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GoogleAnalyticsEcommerce.php new file mode 100644 index 00000000..48787951 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/GoogleAnalyticsEcommerce.php @@ -0,0 +1,378 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Pronamic Pay Google Analytics e-commerce + * + * @author Reüel van der Steege + * @version 2.2.6 + * @since 2.0.1 + */ +class GoogleAnalyticsEcommerce { + /** + * Google Analytics Measurement Protocol API endpoint URL. + * + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide + * @var string + */ + const API_URL = 'https://www.google-analytics.com/collect'; + + /** + * Measurement Protocol API version. + * + * @var int + */ + const API_VERSION = '1'; + + /** + * Anonymous client ID. + * + * @var string|null + */ + private $client_id; + + /** + * Constructs an analytics e-commerce object. + */ + public function __construct() { + // Actions. + add_action( 'pronamic_payment_status_update', array( $this, 'maybe_send_transaction' ), 10 ); + + // Filters. + add_filter( 'pronamic_payment_redirect_url', array( $this, 'payment_redirect_url' ), 15, 2 ); + } + + /** + * Maybe send transaction for the specified payment. + * + * @param Payment $payment Payment. + * @return void + */ + public function maybe_send_transaction( $payment ) { + // Ignore test mode payments. + if ( Gateway::MODE_TEST === $payment->get_mode() ) { + return; + } + + $this->send_transaction( $payment ); + } + + /** + * Is this a valid payment to track? + * + * @param Payment $payment Payment to track. + * + * @return bool + */ + public function valid_payment( $payment ) { + // Is payment already tracked? + if ( $payment->get_ga_tracked() ) { + return false; + } + + // Check if Google Analytics property ID has been set. + $property_id = get_option( 'pronamic_pay_google_analytics_property' ); + + if ( empty( $property_id ) ) { + return false; + } + + // Only process successful payments. + if ( PaymentStatus::SUCCESS !== $payment->get_status() ) { + return false; + } + + return true; + } + + /** + * Send transaction. + * + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide#ecom + * + * Parameters: + * v=1 // Version. + * &tid=UA-XXXX-Y // Tracking ID / Property ID. + * &cid=555 // Anonymous Client ID. + * + * &t=transaction // Transaction hit type. + * &ti=12345 // transaction ID. Required. + * &ta=westernWear // Transaction affiliation. + * &tr=50.00 // Transaction revenue. + * &ts=32.00 // Transaction shipping. + * &tt=12.00 // Transaction tax. + * &cu=EUR // Currency code. + * + * @param Payment $payment Payment. + * @return void + */ + public function send_transaction( $payment ) { + if ( ! $this->valid_payment( $payment ) ) { + return; + } + + $defaults = array( + 'v' => self::API_VERSION, + 'tid' => get_option( 'pronamic_pay_google_analytics_property' ), + 'cid' => $this->get_client_id( $payment ), + 'ti' => strval( $payment->get_id() ), + 'ni' => 1, + ); + + // Transaction Hit. + $transaction = wp_parse_args( + array( + 't' => 'transaction', + 'tr' => sprintf( '%F', $payment->get_total_amount()->get_value() ), + ), + $defaults + ); + + // Currency. + if ( null !== $payment->get_total_amount()->get_currency()->get_alphabetic_code() ) { + /* + * Currency Code + * Optional. + * When present indicates the local currency for all transaction currency values. Value should be a valid ISO 4217 currency code. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#cu + */ + $transaction['cu'] = $payment->get_total_amount()->get_currency()->get_alphabetic_code(); + } + + // Shipping. + $shipping_amount = $payment->get_shipping_amount(); + + if ( null !== $shipping_amount ) { + /* + * Transaction Shipping + * Optional. + * Specifies the total shipping cost of the transaction. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#ts + */ + $transaction['ts'] = sprintf( '%F', $shipping_amount->get_value() ); + } + + // Tax. + if ( $payment->get_total_amount()->has_tax() ) { + /* + * Transaction Tax + * Optional. + * Specifies the total tax of the transaction. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#tt + */ + $transaction['tt'] = sprintf( '%F', $payment->get_total_amount()->get_tax_value() ); + } + + wp_remote_post( + self::API_URL, + array( + 'user-agent' => Server::get( 'HTTP_USER_AGENT' ), + 'body' => $transaction, + 'blocking' => false, + ) + ); + + // Mark payment as tracked. + $payment->set_ga_tracked( true ); + $payment->save(); + + // Item Hit. + $lines = $payment->get_lines(); + + if ( ! empty( $lines ) ) { + foreach ( $lines as $line ) { + $item = $defaults; + + /* + * Hit - Hit type - Required for all hit types. + * The type of hit. Must be one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t + */ + $item['t'] = 'item'; + + /* + * Item Name - Required for item hit type. - Specifies the item name. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#in + */ + $item['in'] = \apply_filters( 'pronamic_pay_google_analytics_ecommerce_item_name', $line->get_name(), $line ); + + /* + * Item Price - Optional. - Specifies the price for a single item / unit. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#ip + */ + $unit_price = $line->get_unit_price(); + + if ( null !== $unit_price ) { + $item['ip'] = sprintf( '%F', $unit_price->get_value() ); + } + + /* + * Item Quantity - Optional. - Specifies the number of items purchased. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#iq + */ + if ( null !== $line->get_quantity() ) { + $item['iq'] = $line->get_quantity(); + } + + /* + * Item Code - Optional. - Specifies the SKU or item code. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#ic + */ + if ( null !== $line->get_id() ) { + $item['ic'] = $line->get_id(); + } + + if ( null !== $line->get_sku() ) { + $item['ic'] = $line->get_sku(); + } + + /* + * Item Category - Optional. - Specifies the category that the item belongs to. + * @link https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#iv + */ + $product_category = \apply_filters( 'pronamic_pay_google_analytics_ecommerce_item_product_category', $line->get_product_category(), $line ); + + if ( null !== $product_category ) { + $item['iv'] = $product_category; + } + + wp_remote_post( + self::API_URL, + array( + 'user-agent' => Server::get( 'HTTP_USER_AGENT' ), + 'body' => $item, + 'blocking' => false, + ) + ); + } + } + } + + /** + * Get the Client ID. + * + * @param Payment $payment Payment. + * @return string + */ + private function get_client_id( Payment $payment ) { + $client_id = $payment->get_analytics_client_id(); + + if ( ! empty( $client_id ) ) { + return $client_id; + } + + if ( ! empty( $this->client_id ) ) { + return $this->client_id; + } + + // Check cookie `_ga` for Client ID. + $this->client_id = self::get_cookie_client_id(); + + if ( empty( $this->client_id ) ) { + // Generate UUID. + // Borrowed from https://github.com/ins0/google-measurement-php-client/blob/master/src/Racecore/GATracking/GATracking.php. + $this->client_id = sprintf( + '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + // 32 bits for "time_low". + wp_rand( 0, 0xffff ), + wp_rand( 0, 0xffff ), + // 16 bits for "time_mid". + wp_rand( 0, 0xffff ), + // 16 bits for "time_hi_and_version",. + // four most significant bits holds version number 4. + wp_rand( 0, 0x0fff ) | 0x4000, + // 16 bits, 8 bits for "clk_seq_hi_res",. + // 8 bits for "clk_seq_low",. + // two most significant bits holds zero and one for variant DCE1.1. + wp_rand( 0, 0x3fff ) | 0x8000, + // 48 bits for "node". + wp_rand( 0, 0xffff ), + wp_rand( 0, 0xffff ), + wp_rand( 0, 0xffff ) + ); + } + + return $this->client_id; + } + + /** + * Check if the specified UUID is valid. + * + * @link http://php.net/preg_match + * + * @param string $uuid String. + * @return boolean True if value is a valid UUID, false otherwise. + */ + public static function is_uuid( $uuid ) { + $result = preg_match( '#^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$#i', $uuid ); + + return 1 === $result; + } + + /** + * Get cookie client ID. + * + * @return string|null + */ + public static function get_cookie_client_id() { + $client_id = null; + + $ga_cookie = filter_input( INPUT_COOKIE, '_ga', FILTER_SANITIZE_STRING ); + + if ( empty( $ga_cookie ) ) { + // No `_ga` cookie available. + return $client_id; + } + + $ga = explode( '.', $ga_cookie ); + + if ( isset( $ga[2] ) && self::is_uuid( $ga[2] ) ) { + // Use UUID from cookie. + $client_id = $ga[2]; + } elseif ( isset( $ga[2], $ga[3] ) ) { + // Older Google Client ID. + $client_id = sprintf( '%s.%s', $ga[2], $ga[3] ); + } + + return $client_id; + } + + /** + * Payment redirect URL. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * @return string + */ + public function payment_redirect_url( $url, Payment $payment ) { + /** + * Payment Gateway Referral Exclusions in Google Analytics. + * + * @link https://lmgtfy.com/?q=google+analytics+exclude+payment+providers + * @link https://webvalue.nl/blog/betaalproviders-uitsluiten-google-analytics + * @link https://seeders.nl/lijst-nederlandse-paymentproviders-om-sluiten-google-analytics/ + * @link http://blog.analytics-toolkit.com/2015/payment-gateway-referrer-exclusions-google-analytics/ + * @link https://andrescholten.nl/a-bank-ideal-ogone-paypal-or-other-payment-providers-getting-all-revenue-in-google-analytics/ + * @link https://nicksnell.dev/log/2017/06/exclude-social-login-referrals/ + * @link https://bluegg.co.uk/blog/tracking-referrals-when-using-an-external-payment-gatewa + * @link https://github.com/Adyen/adyen-magento2/search?q=utm_nooverride + */ + $url = \add_query_arg( 'utm_nooverride', '1', $url ); + + return $url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/HouseNumber.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/HouseNumber.php new file mode 100644 index 00000000..acfdf7f2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/HouseNumber.php @@ -0,0 +1,184 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use stdClass; + +/** + * House number + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.1.6 + */ +class HouseNumber { + /** + * Value. + * + * @var string|null + */ + private $value; + + /** + * Base. + * + * @var string|null + */ + private $base; + + /** + * Addition. + * + * @var string|null + */ + private $addition; + + /** + * Construct house number. + * + * @param string|null $value House number. + */ + public function __construct( $value = null ) { + $this->set_value( $value ); + } + + /** + * Get value. + * + * @return string|null + */ + public function get_value() { + return $this->value; + } + + /** + * Set value. + * + * @param string|null $value Value. + * @return void + */ + public function set_value( $value ) { + $this->value = $value; + } + + /** + * Get base. + * + * @return string|null + */ + public function get_base() { + return $this->base; + } + + /** + * Set base. + * + * @param string|null $base Base. + * @return void + */ + public function set_base( $base ) { + $this->base = $base; + } + + /** + * Get addition. + * + * @return string|null + */ + public function get_addition() { + return $this->addition; + } + + /** + * Set addition. + * + * @param string|null $addition Addition. + * @return void + */ + public function set_addition( $addition ) { + $this->addition = $addition; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'value' => $this->value, + 'base' => $this->base, + 'addition' => $this->addition, + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create from object. + * + * @param mixed $json JSON. + * @return HouseNumber + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( is_string( $json ) ) { + return new self( $json ); + } + + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + $house_number = new self(); + + if ( isset( $json->value ) ) { + $house_number->set_value( $json->value ); + } + + if ( isset( $json->base ) ) { + $house_number->set_base( $json->base ); + } + + if ( isset( $json->addition ) ) { + $house_number->set_addition( $json->addition ); + } + + return $house_number; + } + + /** + * Create string representation of personal name. + * + * @return string + */ + public function __toString() { + return strval( $this->value ); + } + + /** + * Anonymize. + * + * @return void + */ + public function anonymize() { + $this->set_value( PrivacyManager::anonymize_data( 'text', $this->get_value() ) ); + $this->set_base( PrivacyManager::anonymize_data( 'text', $this->get_base() ) ); + $this->set_addition( PrivacyManager::anonymize_data( 'text', $this->get_addition() ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Http/Response.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Http/Response.php new file mode 100644 index 00000000..aeb74772 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Http/Response.php @@ -0,0 +1,117 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Http; + +/** + * HTTP Response + * + * @link https://laravel.com/docs/8.x/http-client + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +class Response { + /** + * Remote request response array. + * + * @var array + */ + private $array; + + /** + * Construct response array. + * + * @param array $array WordPress remote request response array. + */ + public function __construct( $array ) { + $this->array = $array; + } + + /** + * Status. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_retrieve_response_code/ + * @return int|string + */ + public function status() { + return \wp_remote_retrieve_response_code( $this->array ); + } + + /** + * Message. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_retrieve_response_message/ + * @return string + */ + public function message() { + return \wp_remote_retrieve_response_message( $this->array ); + } + + /** + * Body. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_retrieve_body/ + * @return string + */ + public function body() { + return \wp_remote_retrieve_body( $this->array ); + } + + /** + * JSON. + * + * @return mixed + * @throws \Exception Throw exception on empty response. + */ + public function json() { + $body = $this->body(); + + /** + * On PHP 7 or higher the `json_decode` function will return `null` and + * `json_last_error` will return `4` (Syntax error). On PHP 5.6 or lower + * the `json_decode` will also return `null`, but json_last_error` will + * return `0` (No error). Therefore we check if the HTTP response body + * is an empty string. + * + * @link https://3v4l.org/ + */ + if ( '' === $body ) { + throw new \Exception( + \sprintf( + 'Response is empty, HTTP response: "%s %s".', + \wp_remote_retrieve_response_code( $this->array ), + \wp_remote_retrieve_response_message( $this->array ) + ) + ); + } + + // JSON. + $data = \json_decode( $body ); + + // JSON error. + $json_error = \json_last_error(); + + if ( \JSON_ERROR_NONE !== $json_error ) { + throw new \Exception( + \sprintf( + 'Could not JSON decode response, HTTP response: "%s %s", HTTP body length: "%d", JSON error: "%s".', + \wp_remote_retrieve_response_code( $this->array ), + \wp_remote_retrieve_response_message( $this->array ), + \strlen( $body ), + \json_last_error_msg() + ), + $json_error + ); + } + + return $data; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/LicenseManager.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/LicenseManager.php new file mode 100644 index 00000000..0d9f8515 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/LicenseManager.php @@ -0,0 +1,279 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; +use WP_Error; + +/** + * License Manager + * + * @author Remco Tolsma + * @version 2.4.0 + * @since 2.0.1 + */ +class LicenseManager { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initalize an license manager object. + * + * @param Plugin $plugin Plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'pronamic_pay_license_check', array( $this, 'license_check_event' ) ); + add_action( 'admin_notices', array( $this, 'admin_notices' ) ); + + // Filters. + add_filter( sprintf( 'pre_update_option_%s', 'pronamic_pay_license_key' ), array( $this, 'pre_update_option_license_key' ), 10, 2 ); + } + + /** + * Admin notices. + * + * @link https://github.com/WordPress/WordPress/blob/4.2.4/wp-admin/options.php#L205-L218 + * @link https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.4.2/includes/class-edd-license-handler.php#L309-L369 + * @return void + */ + public function admin_notices() { + $data = get_transient( 'pronamic_pay_license_data' ); + + if ( $data ) { + include __DIR__ . '/../views/notice-license.php'; + + delete_transient( 'pronamic_pay_license_data' ); + } + } + + /** + * Pre update option 'pronamic_pay_license_key'. + * + * @param string $newvalue New value. + * @param string $oldvalue Old value. + * @return string + */ + public function pre_update_option_license_key( $newvalue, $oldvalue ) { + $newvalue = trim( $newvalue ); + + // Deactivate license on changed value. + if ( $newvalue !== $oldvalue ) { + delete_option( 'pronamic_pay_license_status' ); + + if ( ! empty( $oldvalue ) ) { + $this->deactivate_license( $oldvalue ); + } + } + + delete_transient( 'pronamic_pay_license_data' ); + + // Always try to activate the new license, it could be deactivated. + if ( ! empty( $newvalue ) ) { + $this->activate_license( $newvalue ); + } + + // Schedule daily license check. + $time = time() + DAY_IN_SECONDS; + + wp_clear_scheduled_hook( 'pronamic_pay_license_check' ); + + wp_schedule_event( $time, 'daily', 'pronamic_pay_license_check' ); + + // Get and update license status. + $old_status = \get_option( 'pronamic_pay_license_status' ); + + $this->check_license( $newvalue ); + + $new_status = \get_option( 'pronamic_pay_license_status' ); + + // Don't show activated notice if option value and valid status have not changed. + if ( $oldvalue === $newvalue && $old_status === $new_status && 'valid' === $new_status ) { + delete_transient( 'pronamic_pay_license_data' ); + } + + return $newvalue; + } + + /** + * License check event. + * + * @return void + */ + public function license_check_event() { + $license = get_option( 'pronamic_pay_license_key' ); + $license = strval( $license ); + + $this->check_license( $license ); + } + + /** + * Request license status. + * + * @param string $license License. + * @return string + */ + private function request_license_status( $license ) { + if ( empty( $license ) ) { + return 'invalid'; + } + + // Request. + $args = array( + 'license' => $license, + 'name' => 'Pronamic Pay', + 'url' => home_url(), + ); + + $args = urlencode_deep( $args ); + + $response = wp_remote_get( + add_query_arg( $args, 'https://api.pronamic.eu/licenses/check/1.0/' ), + array( + 'timeout' => 20, + ) + ); + + // On errors we give benefit of the doubt. + if ( $response instanceof WP_Error ) { + return 'valid'; + } + + $data = json_decode( wp_remote_retrieve_body( $response ) ); + + if ( is_object( $data ) && isset( $data->license ) ) { + return $data->license; + } + + return 'valid'; + } + + /** + * Check license. + * + * @param string $license License. + * @return void + */ + public function check_license( $license ) { + $status = $this->request_license_status( $license ); + + update_option( 'pronamic_pay_license_status', $status ); + } + + /** + * Deactivate license. + * + * @param string $license License to deactivate. + * @return void + */ + public function deactivate_license( $license ) { + $args = array( + 'license' => $license, + 'name' => 'Pronamic Pay', + 'url' => home_url(), + ); + + $args = urlencode_deep( $args ); + + $response = wp_remote_get( + add_query_arg( $args, 'https://api.pronamic.eu/licenses/deactivate/1.0/' ), + array( + 'timeout' => 20, + ) + ); + } + + /** + * Activate license. + * + * @param string $license License to activate. + * @return void + */ + public function activate_license( $license ) { + // Request. + $args = array( + 'license' => $license, + 'name' => 'Pronamic Pay', + 'url' => home_url(), + ); + + $args = urlencode_deep( $args ); + + $response = wp_remote_get( + add_query_arg( $args, 'https://api.pronamic.eu/licenses/activate/1.0/' ), + array( + 'timeout' => 20, + ) + ); + + if ( $response instanceof WP_Error ) { + return; + } + + $data = json_decode( wp_remote_retrieve_body( $response ) ); + + if ( $data ) { + set_transient( 'pronamic_pay_license_data', $data, 30 ); + } + } + + /** + * Get license status text. + * + * @return string + */ + public function get_formatted_license_status() { + $license_status = get_option( 'pronamic_pay_license_status' ); + + switch ( $license_status ) { + case 'valid': + return __( 'Valid', 'pronamic_ideal' ); + + case 'invalid': + return __( 'Invalid', 'pronamic_ideal' ); + + case 'site_inactive': + return __( 'Site Inactive', 'pronamic_ideal' ); + } + + return $license_status; + } + + /** + * Get next scheduled license check text. + * + * @return string + */ + public function get_formatted_next_license_check() { + $next_license_check = esc_html__( 'Not scheduled', 'pronamic_ideal' ); + + $timestamp = wp_next_scheduled( 'pronamic_pay_license_check' ); + + if ( false !== $timestamp ) { + try { + $date = new DateTime( '@' . $timestamp, new DateTimeZone( 'UTC' ) ); + + $next_license_check = $date->format_i18n(); + } catch ( \Exception $e ) { + return $next_license_check; + } + } + + return $next_license_check; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/MoneyJsonTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/MoneyJsonTransformer.php new file mode 100644 index 00000000..b6d23173 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/MoneyJsonTransformer.php @@ -0,0 +1,73 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use Pronamic\WordPress\Money\Money; + +/** + * Money JSON transformer + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class MoneyJsonTransformer { + /** + * Convert money object to JSON. + * + * @param Money|null $money Money. + * + * @return null|object + */ + public static function to_json( Money $money = null ) { + if ( null === $money ) { + return null; + } + + $properties = array( + 'value' => $money->get_value(), + ); + + if ( null !== $money->get_currency()->get_alphabetic_code() ) { + $properties['currency'] = $money->get_currency()->get_alphabetic_code(); + } + + $object = (object) $properties; + + return $object; + } + + /** + * Convert JSON to money object. + * + * @param mixed $json JSON. + * @return Money + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + $money = new Money(); + + if ( property_exists( $json, 'value' ) ) { + $money->set_value( $json->value ); + } + + if ( property_exists( $json, 'currency' ) ) { + $money->set_currency( $json->currency ); + } + + return $money; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/FailureReason.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/FailureReason.php new file mode 100644 index 00000000..88798db6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/FailureReason.php @@ -0,0 +1,141 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Failure reason. + * + * @author Reüel van der Steege + * @since 2.2.8 + * @version 2.2.8 + */ +class FailureReason { + /** + * Code. + * + * @var string|null + */ + private $code; + + /** + * Message. + * + * @var string|null + */ + private $message; + + /** + * Get code. + * + * @return string|null + */ + public function get_code() { + return $this->code; + } + + /** + * Set code. + * + * @param string|null $code Code. + * @return void + */ + public function set_code( $code ) { + $this->code = $code; + } + + /** + * Get message. + * + * @return string|null + */ + public function get_message() { + return $this->message; + } + + /** + * Set message. + * + * @param string|null $message Message. + * @return void + */ + public function set_message( $message ) { + $this->message = $message; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'code' => $this->get_code(), + 'message' => $this->get_message(), + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create failure reason from object. + * + * @param mixed $json JSON. + * @return FailureReason + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! \is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an array.' ); + } + + $failure_reason = new self(); + + if ( isset( $json->code ) ) { + $failure_reason->set_code( $json->code ); + } + + if ( isset( $json->message ) ) { + $failure_reason->set_message( $json->message ); + } + + return $failure_reason; + } + + /** + * To string. + * + * @return string + */ + public function __toString() { + $code = $this->get_code(); + $message = $this->get_message(); + + if ( null !== $code && null !== $message ) { + return sprintf( '%1$s (`%2$s`)', $message, $code ); + } + + if ( null !== $code ) { + return $code; + } + + if ( null !== $message ) { + return $message; + } + + return ''; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Item.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Item.php new file mode 100644 index 00000000..b0e4354d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Item.php @@ -0,0 +1,186 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Money\Money; + +/** + * Item. + * + * @deprecated Use `PaymentLine`. + * @author Remco Tolsma + * @version 2.2.6 + */ +class Item { + /** + * The number. + * + * @var string + */ + private $number; + + /** + * The description. + * + * @var string + */ + private $description; + + /** + * The quantity. + * + * @var int + */ + private $quantity; + + /** + * The price. + * + * @var float + */ + private $price; + + /** + * Constructs and initialize a iDEAL basic item. + */ + public function __construct() { + $this->number = ''; + $this->description = ''; + $this->quantity = 1; + $this->price = 0.0; + } + + /** + * Call. + * + * @link http://php.net/manual/de/language.oop5.magic.php + * + * @param string $name Method name. + * @param array $arguments Method arguments. + * @return float|int|string|bool + */ + public function __call( $name, $arguments ) { + $map = array( + 'getNumber' => 'get_number', + 'setNumber' => 'set_number', + 'setDescription' => 'set_description', + 'getQuantity' => 'get_quantity', + 'setQuantity' => 'set_quantity', + 'getPrice' => 'get_price', + 'setPrice' => 'set_price', + ); + + if ( isset( $map[ $name ] ) ) { + $old_method = $name; + $new_method = $map[ $name ]; + + _deprecated_function( esc_html( __CLASS__ . '::' . $old_method ), '2.0.1', esc_html( __CLASS__ . '::' . $new_method ) ); + + $callable = array( $this, $new_method ); + + if ( is_callable( $callable ) ) { + return call_user_func_array( $callable, $arguments ); + } + } + + return trigger_error( esc_html( 'Call to undefined method ' . __CLASS__ . '::' . $name . '()' ), E_USER_ERROR ); + } + + /** + * Get the number / identifier of this item. + * + * @return string + */ + public function get_number() { + return $this->number; + } + + /** + * Set the number / identifier of this item. + * + * @param string $number Number. + * @return void + */ + public function set_number( $number ) { + $this->number = $number; + } + + /** + * Get the description of this item. + * + * @return string + */ + public function get_description() { + return $this->description; + } + + /** + * Set the description of this item. + * AN..max32 (AN = Alphanumeric, free text). + * + * @param string $description Description. + * @return void + */ + public function set_description( $description ) { + $this->description = substr( $description, 0, 32 ); + } + + /** + * Get the quantity of this item. + * + * @return int + */ + public function get_quantity() { + return $this->quantity; + } + + /** + * Set the quantity of this item + * + * @param int $quantity Quantity. + * @return void + */ + public function set_quantity( $quantity ) { + $this->quantity = $quantity; + } + + /** + * Get the price of this item. + * + * @return float + */ + public function get_price() { + return $this->price; + } + + /** + * Set the price of this item. + * + * @param float $price Price. + * @return void + */ + public function set_price( $price ) { + $this->price = $price; + } + + /** + * Get the amount. + * + * @return Money + */ + public function get_amount() { + $money = new Money( $this->get_price() ); + + $amount = $money->multiply( $this->get_quantity() ); + + return $amount; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Items.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Items.php new file mode 100644 index 00000000..35dc266c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Items.php @@ -0,0 +1,84 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Money\Money; + +/** + * Items + * + * @deprecated Use `PaymentLines`. + * @author Remco Tolsma + * @version 2.2.6 + * @implements \IteratorAggregate + */ +class Items implements \IteratorAggregate { + /** + * The items. + * + * @var Item[] + */ + private $items; + + /** + * Constructs and initialize a iDEAL basic object. + */ + public function __construct() { + $this->items = array(); + } + + /** + * Get iterator. + * + * @return \ArrayIterator + */ + public function getIterator() { + return new \ArrayIterator( $this->items ); + } + + /** + * Add item. + * + * @param Item $item The item to add. + * @return void + * @deprecated 2.0.8 + */ + public function addItem( Item $item ) { + _deprecated_function( __FUNCTION__, '2.0.8', 'Pronamic\WordPress\Pay\Payments\Items::add_item()' ); + + $this->add_item( $item ); + } + + /** + * Add item. + * + * @param Item $item The item to add. + * @return void + */ + public function add_item( Item $item ) { + $this->items[] = $item; + } + + /** + * Calculate the total amount of all items. + * + * @return Money + */ + public function get_amount() { + $amount = new Money( 0, 'EUR' ); + + foreach ( $this->items as $item ) { + $amount = $amount->add( $item->get_amount() ); + } + + return $amount; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPayment.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPayment.php new file mode 100644 index 00000000..cf81aff9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPayment.php @@ -0,0 +1,37 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Legacy payment. + * + * Legacy and deprecated functions are here to keep the Payment class clean. + * This class will be removed in future versions. + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.1.0 + * + * @property string $language + * @property string $locale + * @property string $email + * @property string $first_name + * @property string $last_name + * @property string $telephone_number + * @property string $country + * @property string $zip + * @property string $city + * @property string $address + * @property int|null $user_id + */ +abstract class LegacyPayment extends LegacyPaymentInfo { + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPaymentInfo.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPaymentInfo.php new file mode 100644 index 00000000..4eda1d9d --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPaymentInfo.php @@ -0,0 +1,692 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Customer; + +/** + * Legacy payment. + * + * Legacy and deprecated functions are here to keep the Payment class clean. + * This class will be removed in future versions. + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.1.0 + * + * @property string|null $language + * @property string|null $locale + * @property string|null $email + * @property string|null $first_name + * @property string|null $last_name + * @property string|null $customer_name + * @property string|null $telephone_number + * @property string|null $country + * @property string|null $zip + * @property string|null $city + * @property string|null $address + * @property int|string|null $user_id + */ +abstract class LegacyPaymentInfo extends PaymentInfo { + /** + * The amount of this payment, for example 18.95. + * + * @deprecated 2.0.9 Use Payment::$total_amount instead. + * + * @var Money + */ + protected $amount; + + /** + * Get the payment amount. + * + * @deprecated 2.0.9 Use Payment::get_total_amount() instead. + * + * @return Money + */ + public function get_amount() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_total_amount()' ); + + if ( \method_exists( $this, 'get_total_amount' ) ) { + return $this->get_total_amount(); + } + + return new Money( 0 ); + } + + /** + * Set the payment amount. + * + * @param Money $amount Money object. + * @return void + * @deprecated 2.0.9 Use Payment::set_total_amount() instead. + */ + public function set_amount( Money $amount ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::set_total_amount()' ); + + if ( \method_exists( $this, 'set_total_amount' ) ) { + $money = new TaxedMoney( $amount->get_value(), $amount->get_currency() ); + + $this->set_total_amount( $money ); + } + } + + /** + * Get the payment currency alphabetic code. + * + * @deprecated 2.0.9 Use Payment::get_total_amount()->get_currency()->get_alphabetic_code() instead. + * + * @return string|null + */ + public function get_currency() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_total_amount()->get_currency()->get_alphabetic_code()' ); + + if ( \method_exists( $this, 'get_total_amount' ) ) { + return $this->get_total_amount()->get_currency()->get_alphabetic_code(); + } + + return null; + } + + /** + * Get currency numeric code + * + * @deprecated 2.0.9 Use Payment::get_total_amount()->get_currency()->get_numeric_code() instead. + * + * @return string|null + */ + public function get_currency_numeric_code() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_total_amount()->get_currency()->get_numeric_code()' ); + + if ( \method_exists( $this, 'get_total_amount' ) ) { + return $this->get_total_amount()->get_currency()->get_numeric_code(); + } + + return null; + } + + /** + * Get the payment language. + * + * @deprecated 2.0.9 Use Payment::get_customer()->get_language() instead. + * + * @return string|null + */ + public function get_language() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_customer()->get_language()' ); + + $customer = $this->get_customer(); + + if ( null === $customer ) { + return null; + } + + return $customer->get_language(); + } + + /** + * Get the payment locale. + * + * @deprecated 2.0.9 Use Payment::get_customer()->get_locale() instead. + * + * @return string|null + */ + public function get_locale() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_customer()->get_locale()' ); + + $customer = $this->get_customer(); + + if ( null === $customer ) { + return null; + } + + return $customer->get_locale(); + } + + /** + * Get first name. + * + * @deprecated 2.0.9 Use Payment::get_customer()->get_name()->get_first_name() instead. + * + * @return string|null + */ + public function get_first_name() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_customer()->get_name()->get_first_name()' ); + + $customer = $this->get_customer(); + + if ( null === $customer ) { + return null; + } + + $name = $customer->get_name(); + + if ( null === $name ) { + return null; + } + + return $name->get_first_name(); + } + + /** + * Get last name. + * + * @deprecated 2.0.9 Use Payment::get_customer()->get_name()->get_last_name() instead. + * + * @return string|null + */ + public function get_last_name() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_customer()->get_name()->get_last_name()' ); + + $customer = $this->get_customer(); + + if ( null === $customer ) { + return null; + } + + $name = $customer->get_name(); + + if ( null === $name ) { + return null; + } + + return $name->get_last_name(); + } + + /** + * Get customer name. + * + * @deprecated 2.0.9 Use Payment::get_customer()->get_name() instead. + * + * @return string|null + */ + public function get_customer_name() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_customer()->get_name()' ); + + $customer = $this->get_customer(); + + if ( null === $customer ) { + return null; + } + + $name = $customer->get_name(); + + if ( null === $name ) { + return null; + } + + return strval( $name ); + } + + /** + * Get address. + * + * @deprecated 2.0.9 Use Payment::get_billing_address()->get_line_1() instead. + * + * @return string|null + */ + public function get_address() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_billing_address()->get_line_1()' ); + + $address = $this->get_billing_address(); + + if ( null === $address ) { + return null; + } + + return $address->get_line_1(); + } + + /** + * Get city. + * + * @deprecated 2.0.9 Use Payment::get_billing_address()->get_city() instead. + * + * @return string|null + */ + public function get_city() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_billing_address()->get_city()' ); + + $address = $this->get_billing_address(); + + if ( null === $address ) { + return null; + } + + return $address->get_city(); + } + + /** + * Get ZIP. + * + * @deprecated 2.0.9 Use Payment::get_billing_address()->get_postal_code() instead. + * + * @return string|null + */ + public function get_zip() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_billing_address()->get_postal_code()' ); + + $address = $this->get_billing_address(); + + if ( null === $address ) { + return null; + } + + return $address->get_postal_code(); + } + + /** + * Get country. + * + * @deprecated 2.0.9 Use Payment::get_billing_address()->get_country_code() instead. + * + * @return string|null + */ + public function get_country() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_billing_address()->get_country()' ); + + $address = $this->get_billing_address(); + + if ( null === $address ) { + return null; + } + + return $address->get_country_code(); + } + + /** + * Get telephone number. + * + * @deprecated 2.0.9 Use Payment::get_billing_address()->get_phone() instead. + * + * @return string|null + */ + public function get_telephone_number() { + _deprecated_function( __FUNCTION__, '2.0.9', 'Payment::get_billing_address()->get_phone()' ); + + $address = $this->get_billing_address(); + + if ( null === $address ) { + return null; + } + + return $address->get_phone(); + } + + /** + * Set consumer name. + * + * @deprecated 2.2.6 Use Payment::set_consumer_bank_details()->set_name() instead. + * + * @param string|null $name Name. + * @return void + */ + public function set_consumer_name( $name ) { + _deprecated_function( __FUNCTION__, '2.2.6', 'Payment::set_consumer_bank_details()->set_name()' ); + + $consumer_bank_details = $this->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $this->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_name( $name ); + } + + /** + * Set consumer account number. + * + * @deprecated 2.2.6 Use Payment::set_consumer_bank_details()->set_account_number() instead. + * + * @param string|null $account_number Account number. + * @return void + */ + public function set_consumer_account_number( $account_number ) { + _deprecated_function( __FUNCTION__, '2.2.6', 'Payment::set_consumer_bank_details()->set_account_number()' ); + + $consumer_bank_details = $this->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $this->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_account_number( $account_number ); + } + + /** + * Set consumer IBAN. + * + * @deprecated 2.2.6 Use Payment::set_consumer_bank_details()->set_iban() instead. + * + * @param string|null $iban IBAN. + * @return void + */ + public function set_consumer_iban( $iban ) { + _deprecated_function( __FUNCTION__, '2.2.6', 'Payment::set_consumer_bank_details()->set_iban()' ); + + $consumer_bank_details = $this->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $this->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_iban( $iban ); + } + + /** + * Set consumer BIC. + * + * @deprecated 2.2.6 Use Payment::set_consumer_bank_details()->set_bic() instead. + * + * @param string|null $bic BIC. + * @return void + */ + public function set_consumer_bic( $bic ) { + _deprecated_function( __FUNCTION__, '2.2.6', 'Payment::set_consumer_bank_details()->set_bic()' ); + + $consumer_bank_details = $this->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $this->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_bic( $bic ); + } + + /** + * Set consumer city. + * + * @deprecated 2.2.6 Use Payment::set_consumer_bank_details()->set_city() instead. + * + * @param string|null $city City. + * @return void + */ + public function set_consumer_city( $city ) { + _deprecated_function( __FUNCTION__, '2.2.6', 'Payment::set_consumer_bank_details()->set_city()' ); + + $consumer_bank_details = $this->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $this->set_consumer_bank_details( $consumer_bank_details ); + } + + $consumer_bank_details->set_city( $city ); + } + + /** + * Get. + * + * @link http://php.net/manual/en/language.oop5.overloading.php#object.get + * @param string $name Name. + * @return mixed + */ + public function __get( $name ) { + $customer = $this->get_customer(); + $consumer_bank_details = $this->get_consumer_bank_details(); + + switch ( $name ) { + case 'language': + return $this->get_language(); + case 'locale': + return $this->get_locale(); + case 'email': + return ( null === $customer ) ? null : $customer->get_email(); + case 'user_agent': + return ( null === $customer ) ? null : $customer->get_user_agent(); + case 'user_id': + return ( null === $customer ) ? null : $customer->get_user_id(); + case 'user_ip': + return ( null === $customer ) ? null : $customer->get_ip_address(); + case 'customer_name': + return $this->get_customer_name(); + case 'first_name': + return $this->get_first_name(); + case 'last_name': + return $this->get_last_name(); + case 'address': + return $this->get_address(); + case 'zip': + return $this->get_zip(); + case 'city': + return $this->get_city(); + case 'country': + return $this->get_country(); + case 'telephone_number': + return $this->get_telephone_number(); + + // @since 2.2.6 + case 'consumer_name': + return ( null === $consumer_bank_details ) ? null : $consumer_bank_details->get_name(); + case 'consumer_account_number': + return ( null === $consumer_bank_details ) ? null : $consumer_bank_details->get_account_number(); + case 'consumer_iban': + return ( null === $consumer_bank_details ) ? null : $consumer_bank_details->get_iban(); + case 'consumer_bic': + return ( null === $consumer_bank_details ) ? null : $consumer_bank_details->get_bic(); + case 'consumer_city': + return ( null === $consumer_bank_details ) ? null : $consumer_bank_details->get_city(); + } + + return $this->{$name}; + } + + /** + * Set. + * + * @link http://php.net/manual/en/language.oop5.overloading.php#object.set + * + * @param string $name Name. + * @param mixed $value Value. + * + * @return null|void + */ + public function __set( $name, $value ) { + $legacy_keys = array( + 'language', + 'locale', + 'email', + 'first_name', + 'last_name', + 'telephone_number', + 'country', + 'zip', + 'city', + 'address', + 'user_id', + 'consumer_name', + 'consumer_account_number', + 'consumer_iban', + 'consumer_bic', + 'consumer_city', + ); + + if ( ! in_array( $name, $legacy_keys, true ) ) { + $this->{$name} = $value; + + return null; + } + + $customer = $this->get_customer(); + $address = $this->get_billing_address(); + $consumer_bank_details = $this->get_consumer_bank_details(); + $contact_name = null; + + if ( in_array( $name, array( 'language', 'locale', 'email', 'first_name', 'last_name', 'user_id' ), true ) ) { + if ( null === $value && null === $customer ) { + return null; + } + + if ( null === $customer ) { + $customer = new Customer(); + + $this->set_customer( $customer ); + } + + if ( in_array( $name, array( 'first_name', 'last_name' ), true ) ) { + $contact_name = $customer->get_name(); + + if ( null === $value && null === $contact_name ) { + return null; + } + + if ( null === $contact_name ) { + $contact_name = new ContactName(); + + $customer->set_name( $contact_name ); + } + } + } + + if ( in_array( $name, array( 'telephone_number', 'country', 'zip', 'city', 'address' ), true ) ) { + if ( null === $value && null === $address ) { + return null; + } + + if ( null === $address ) { + $address = new Address(); + + $this->set_billing_address( $address ); + } + } + + // Consumer. + if ( in_array( $name, array( 'consumer_name', 'consumer_account_number', 'consumer_iban', 'consumer_bic', 'consumer_city' ), true ) ) { + if ( null === $value && null === $consumer_bank_details ) { + return null; + } + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + + $this->set_consumer_bank_details( $consumer_bank_details ); + } + } + + switch ( $name ) { + case 'language': + if ( null !== $customer ) { + $customer->set_language( $value ); + } + + return; + case 'email': + if ( null !== $customer ) { + $customer->set_email( $value ); + } + + return; + case 'first_name': + if ( null !== $contact_name ) { + $contact_name->set_first_name( $value ); + } + + return; + case 'last_name': + if ( null !== $contact_name ) { + $contact_name->set_last_name( $value ); + } + + return; + case 'locale': + if ( null !== $customer ) { + $customer->set_locale( $value ); + } + + return; + case 'telephone_number': + if ( null !== $address ) { + $address->set_phone( $value ); + } + + return; + case 'country': + if ( null !== $address ) { + $address->set_country_code( $value ); + } + + return; + case 'zip': + if ( null !== $address ) { + $address->set_postal_code( $value ); + } + + return; + case 'city': + if ( null !== $address ) { + $address->set_city( $value ); + } + + return; + case 'address': + if ( null !== $address ) { + $address->set_line_1( $value ); + } + + return; + case 'user_id': + if ( null !== $customer ) { + $customer->set_user_id( $value ); + } + + return; + // @since 2.2.6 + case 'consumer_name': + if ( null !== $consumer_bank_details ) { + $consumer_bank_details->set_name( $value ); + } + + return; + case 'consumer_account_number': + if ( null !== $consumer_bank_details ) { + $consumer_bank_details->set_account_number( $value ); + } + + return; + case 'consumer_iban': + if ( null !== $consumer_bank_details ) { + $consumer_bank_details->set_iban( $value ); + } + + return; + case 'consumer_bic': + if ( null !== $consumer_bank_details ) { + $consumer_bank_details->set_bic( $value ); + } + + return; + case 'consumer_city': + if ( null !== $consumer_bank_details ) { + $consumer_bank_details->set_city( $value ); + } + + return; + } + + $this->{$name} = $value; + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPaymentsDataStoreCPT.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPaymentsDataStoreCPT.php new file mode 100644 index 00000000..d6dcb860 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/LegacyPaymentsDataStoreCPT.php @@ -0,0 +1,348 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\AbstractDataStoreCPT; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\ContactName; +use Pronamic\WordPress\Pay\Customer; + +/** + * Title: Payments data store CPT + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @see https://woocommerce.com/2017/04/woocommerce-3-0-release/ + * @see https://woocommerce.wordpress.com/2016/10/27/the-new-crud-classes-in-woocommerce-2-7/ + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.1.0 + */ +class LegacyPaymentsDataStoreCPT extends AbstractDataStoreCPT { + /** + * Get contact name from legacy meta. + * + * @param PaymentInfo $payment The payment info to read. + * @return ContactName|null + */ + private function get_contact_name_from_legacy_meta( $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return null; + } + + $data = array( + 'full_name' => $this->get_meta_string( $id, 'customer_name' ), + 'first_name' => $this->get_meta_string( $id, 'first_name' ), + 'last_name' => $this->get_meta_string( $id, 'last_name' ), + ); + + $data = array_filter( $data ); + $data = array_map( 'trim', $data ); + $data = array_filter( $data ); + + if ( empty( $data ) ) { + // Bail out if there is no name data. + return null; + } + + $name = new ContactName(); + + if ( isset( $data['full_name'] ) ) { + $name->set_full_name( $data['full_name'] ); + } + + if ( isset( $data['first_name'] ) ) { + $name->set_first_name( $data['first_name'] ); + } + + if ( isset( $data['last_name'] ) ) { + $name->set_last_name( $data['last_name'] ); + } + + return $name; + } + + /** + * Maybe create customer from legacy meta. + * + * @param PaymentInfo $payment The payment to read. + * @return void + */ + private function maybe_create_customer_from_legacy_meta( $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + $data = array( + 'full_name' => $this->get_meta_string( $id, 'customer_name' ), + 'first_name' => $this->get_meta_string( $id, 'first_name' ), + 'last_name' => $this->get_meta_string( $id, 'last_name' ), + 'email' => $this->get_meta_string( $id, 'email' ), + 'phone' => $this->get_meta_string( $id, 'telephone_number' ), + 'ip_address' => $this->get_meta_string( $id, 'user_ip' ), + 'user_agent' => $this->get_meta_string( $id, 'user_agent' ), + 'language' => $this->get_meta_string( $id, 'language' ), + 'locale' => $this->get_meta_string( $id, 'locale' ), + ); + + $data = array_filter( $data ); + $data = array_map( 'trim', $data ); + $data = array_filter( $data ); + + if ( empty( $data ) ) { + // Bail out if there is no customer data. + return; + } + + // Build customer from legacy meta data. + $customer = $payment->get_customer(); + + if ( null === $customer ) { + $customer = new Customer(); + } + + $payment->set_customer( $customer ); + + // Customer name. + if ( null === $customer->get_name() ) { + $customer->set_name( $this->get_contact_name_from_legacy_meta( $payment ) ); + } + + if ( null === $customer->get_email() && isset( $data['email'] ) ) { + $customer->set_email( $data['email'] ); + } + + if ( null === $customer->get_phone() && isset( $data['phone'] ) ) { + $customer->set_phone( $data['phone'] ); + } + + if ( null === $customer->get_ip_address() && isset( $data['ip_address'] ) ) { + $customer->set_ip_address( $data['ip_address'] ); + } + + if ( null === $customer->get_user_agent() && isset( $data['user_agent'] ) ) { + $customer->set_user_agent( $data['user_agent'] ); + } + + if ( null === $customer->get_language() && isset( $data['language'] ) ) { + $customer->set_language( $data['language'] ); + } + + if ( null === $customer->get_locale() && isset( $data['locale'] ) ) { + $customer->set_locale( $data['locale'] ); + } + } + + /** + * Maybe create billing address from legacy meta. + * + * @param PaymentInfo $payment The payment to read. + * @return void + */ + private function maybe_create_billing_address_from_legacy_meta( $payment ) { + if ( null !== $payment->get_billing_address() ) { + // Bail out if there is already a billing address. + return; + } + + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + $data = array( + 'line_1' => $this->get_meta_string( $id, 'address' ), + 'postal_code' => $this->get_meta_string( $id, 'zip' ), + 'city' => $this->get_meta_string( $id, 'city' ), + 'country' => $this->get_meta_string( $id, 'country' ), + 'email' => $this->get_meta_string( $id, 'email' ), + 'phone' => $this->get_meta_string( $id, 'telephone_number' ), + ); + + $data = array_filter( $data ); + $data = array_map( 'trim', $data ); + $data = array_filter( $data ); + + if ( empty( $data ) ) { + // Bail out if there is no address data. + return; + } + + $address = new Address(); + + $payment->set_billing_address( $address ); + + $address->set_name( $this->get_contact_name_from_legacy_meta( $payment ) ); + + if ( isset( $data['line_1'] ) ) { + $address->set_line_1( $data['line_1'] ); + } + + if ( isset( $data['postal_code'] ) ) { + $address->set_postal_code( $data['postal_code'] ); + } + + if ( isset( $data['city'] ) ) { + $address->set_city( $data['city'] ); + } + + if ( isset( $data['country'] ) ) { + if ( 2 === strlen( $data['country'] ) ) { + $address->set_country_code( $data['country'] ); + } else { + $address->set_country_name( $data['country'] ); + } + } + + if ( isset( $data['email'] ) ) { + $address->set_email( $data['email'] ); + } + + if ( isset( $data['phone'] ) ) { + $address->set_phone( $data['phone'] ); + } + } + + /** + * Maybe create consumer bank details from legacy meta. + * + * @param PaymentInfo $payment The payment to read. + * @return void + */ + private function maybe_create_consumer_bank_details_from_legacy_meta( $payment ) { + if ( null !== $payment->get_consumer_bank_details() ) { + // Bail out if there is already a billing consumer_bank_details. + return; + } + + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + $data = array( + 'consumer_name' => $this->get_meta_string( $id, 'consumer_name' ), + 'consumer_account_number' => $this->get_meta_string( $id, 'consumer_account_number' ), + 'consumer_iban' => $this->get_meta_string( $id, 'consumer_iban' ), + 'consumer_bic' => $this->get_meta_string( $id, 'consumer_bic' ), + 'consumer_city' => $this->get_meta_string( $id, 'consumer_city' ), + ); + + $data = array_filter( $data ); + $data = array_map( 'trim', $data ); + $data = array_filter( $data ); + + if ( empty( $data ) ) { + // Bail out if there is no consumer data. + return; + } + + $consumer_bank_details = new BankAccountDetails(); + + $payment->set_consumer_bank_details( $consumer_bank_details ); + + if ( isset( $data['consumer_name'] ) ) { + $consumer_bank_details->set_name( $data['consumer_name'] ); + } + + if ( isset( $data['consumer_account_number'] ) ) { + $consumer_bank_details->set_account_number( $data['consumer_account_number'] ); + } + + if ( isset( $data['consumer_iban'] ) ) { + $consumer_bank_details->set_iban( $data['consumer_iban'] ); + } + + if ( isset( $data['consumer_bic'] ) ) { + $consumer_bank_details->set_bic( $data['consumer_bic'] ); + } + + if ( isset( $data['consumer_city'] ) ) { + $consumer_bank_details->set_city( $data['consumer_city'] ); + } + } + + /** + * Read post meta. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/abstracts/abstract-wc-data.php#L462-L507 + * @param PaymentInfo $payment The payment to read. + * @return void + */ + protected function read_post_meta( $payment ) { + $this->maybe_create_customer_from_legacy_meta( $payment ); + $this->maybe_create_billing_address_from_legacy_meta( $payment ); + $this->maybe_create_consumer_bank_details_from_legacy_meta( $payment ); + } + + /** + * Get update meta. + * + * @param PaymentInfo $payment The payment to update. + * @param array $meta Meta array. + * + * @return array + */ + protected function get_update_meta( $payment, $meta = array() ) { + // Customer. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + // Deprecated meta values. + $meta['language'] = $customer->get_language(); + $meta['locale'] = $customer->get_locale(); + $meta['user_agent'] = $customer->get_user_agent(); + $meta['user_ip'] = $customer->get_ip_address(); + + $name = $customer->get_name(); + + if ( null !== $name ) { + $meta['customer_name'] = (string) $name; + $meta['first_name'] = $name->get_first_name(); + $meta['last_name'] = $name->get_last_name(); + } + } + + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + // Deprecated meta values. + $meta['address'] = $billing_address->get_line_1(); + $meta['zip'] = $billing_address->get_postal_code(); + $meta['city'] = $billing_address->get_city(); + $meta['country'] = $billing_address->get_country_name(); + $meta['telephone_number'] = $billing_address->get_phone(); + } + + // Consumer. + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null !== $consumer_bank_details ) { + // Deprecated meta values. + $meta['consumer_name'] = $consumer_bank_details->get_name(); + $meta['consumer_account_number'] = $consumer_bank_details->get_account_number(); + $meta['consumer_iban'] = $consumer_bank_details->get_iban(); + $meta['consumer_bic'] = $consumer_bank_details->get_bic(); + $meta['consumer_city'] = $consumer_bank_details->get_city(); + } + + return $meta; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Payment.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Payment.php new file mode 100644 index 00000000..daa6ca51 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/Payment.php @@ -0,0 +1,900 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use InvalidArgumentException; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\Subscriptions\Subscription; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPeriod; +use Pronamic\WordPress\Pay\TaxedMoneyJsonTransformer; + +/** + * Payment + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.0 + */ +class Payment extends LegacyPayment { + /** + * The subscription. + * + * @var Subscription|null + */ + public $subscription; + + /** + * The total amount of this payment. + * + * @var TaxedMoney + */ + private $total_amount; + + /** + * The purchase ID. + * + * @todo Is this required/used? + * @var string|null + */ + public $purchase_id; + + /** + * The order ID of this payment. + * + * @todo Is this required/used? + * @var string|int|null + */ + public $order_id; + + /** + * The expiration period of this payment. + * + * @todo Is this required/used? + * @var string + */ + public $expiration_period; + + /** + * The entrance code of this payment. + * + * @todo Is this required/used? + * @var string|null + */ + public $entrance_code; + + /** + * The description of this payment. + * + * @var string|null + */ + public $description; + + /** + * The Google Analytics client ID of the user who started this payment. + * + * @var string|null + */ + public $analytics_client_id; + + /** + * Google Analytics e-commerce tracked. + * + * @var bool|null + */ + public $ga_tracked; + + /** + * The status of this payment. + * + * @todo Check constant? + * @var string|null + */ + public $status; + + /** + * Failure reason. + * + * @var FailureReason|null + */ + public $failure_reason; + + /** + * The email of the user who started this payment. + * + * @var string|null + */ + public $email; + + /** + * The action URL for this payment. + * + * @var string|null + */ + public $action_url; + + /** + * The date this payment expires. + * + * @var DateTime|null + */ + private $expiry_date; + + /** + * The payment method chosen by the user who started this payment. + * + * @var string|null + */ + public $method; + + /** + * The issuer chosen by the user who started this payment. + * + * @var string|null + */ + public $issuer; + + /** + * Subscriptions. + * + * @var Subscription[] + */ + private $subscriptions; + + /** + * Subscription periods. + * + * @since 2.5.0 + * @var SubscriptionPeriod[]|null + */ + private $periods; + + /** + * Subscription ID. + * + * @todo Is this required? + * @var int|null + */ + public $subscription_id; + + /** + * Subscription source ID. + * + * @var string|int|null + */ + public $subscription_source_id; + + /** + * Flag to indicate a recurring payment + * + * @todo Is this required? + * + * @var boolean|null + */ + public $recurring; + + /** + * The recurring type: + * - 'first' + * - 'recurring' + * + * @todo Improve documentation, is this used? + * + * @var string|null + */ + public $recurring_type; + + /** + * Customer. + * + * @var Customer|null + */ + public $customer; + + /** + * Billing address. + * + * @var Address|null + */ + public $billing_address; + + /** + * Shipping address. + * + * @var Address|null + */ + public $shipping_address; + + /** + * Payment lines. + * + * @var PaymentLines|null + */ + public $lines; + + /** + * Version. + * + * @var string|null + */ + private $version; + + /** + * Mode. + * + * @var string|null + */ + private $mode; + + /** + * Is anonymized. + * + * @var bool|null + */ + private $anonymized; + + /** + * Construct and initialize payment object. + * + * @param integer $post_id A payment post ID or null. + */ + public function __construct( $post_id = null ) { + parent::__construct( $post_id ); + + $this->subscriptions = array(); + + $this->set_status( PaymentStatus::OPEN ); + + $this->set_total_amount( new TaxedMoney() ); + + if ( null !== $post_id ) { + pronamic_pay_plugin()->payments_data_store->read( $this ); + } + } + + /** + * Save payment. + * + * @return void + */ + public function save() { + pronamic_pay_plugin()->payments_data_store->save( $this ); + } + + /** + * Add a note to this payment. + * + * @link https://developer.wordpress.org/reference/functions/wp_insert_comment/ + * @param string $note The note to add. + * @return int The new comment's ID. + * @throws \Exception Throws exception when adding note fails. + */ + public function add_note( $note ) { + $commentdata = array( + 'comment_post_ID' => $this->id, + 'comment_content' => $note, + 'comment_type' => 'payment_note', + 'user_id' => get_current_user_id(), + 'comment_approved' => true, + ); + + $result = wp_insert_comment( $commentdata ); + + if ( false === $result ) { + throw new \Exception( + \sprintf( + 'Could not add note "%s" to payment with ID "%d".', + $note, + $this->id + ) + ); + } + + return $result; + } + + /** + * Get the source text of this payment. + * + * @return string + */ + public function get_source_text() { + $pieces = array( + $this->get_source(), + $this->get_source_id(), + ); + + $pieces = array_filter( $pieces ); + + $text = implode( '
    ', $pieces ); + + $text = apply_filters( 'pronamic_payment_source_text_' . $this->get_source(), $text, $this ); + $text = apply_filters( 'pronamic_payment_source_text', $text, $this ); + + return $text; + } + + /** + * Get the payment description. + * + * @return string|null + */ + public function get_description() { + return $this->description; + } + + /** + * Set the transaction ID. + * + * @param string|null $transaction_id Transaction ID. + * @return void + */ + public function set_transaction_id( $transaction_id ) { + $this->transaction_id = $transaction_id; + } + + /** + * Get the payment transaction ID. + * + * @return string|null + */ + public function get_transaction_id() { + return $this->transaction_id; + } + + /** + * Get total amount. + * + * @return TaxedMoney + */ + public function get_total_amount() { + return $this->total_amount; + } + + /** + * Set total amount. + * + * @param TaxedMoney $total_amount Total amount. + * @return void + */ + public function set_total_amount( TaxedMoney $total_amount ) { + $this->total_amount = $total_amount; + } + + /** + * Get the payment status. + * + * @todo Constant? + * @return string|null + */ + public function get_status() { + return $this->status; + } + + /** + * Get payment status label. + * + * @return string|null + */ + public function get_status_label() { + return pronamic_pay_plugin()->payments_data_store->get_meta_status_label( $this->status ); + } + + /** + * Set the payment status. + * + * @param string|null $status Status. + * @return void + */ + public function set_status( $status ) { + $this->status = $status; + } + + /** + * Get failure reason. + * + * @return FailureReason|null + */ + public function get_failure_reason() { + return $this->failure_reason; + } + + /** + * Set failure reason. + * + * @param FailureReason|null $failure_reason Failure reason. + * @return void + */ + public function set_failure_reason( FailureReason $failure_reason = null ) { + $this->failure_reason = $failure_reason; + } + + /** + * Is tracked in Google Analytics? + * + * @return bool|null + */ + public function get_ga_tracked() { + return $this->ga_tracked; + } + + /** + * Set if payment is tracked in Google Analytics. + * + * @param bool|null $tracked Tracked in Google Analytics. + * @return void + */ + public function set_ga_tracked( $tracked ) { + $this->ga_tracked = $tracked; + } + + /** + * Get the pay redirect URL. + * + * @return string + */ + public function get_pay_redirect_url() { + $url = add_query_arg( + array( + 'payment_redirect' => $this->id, + 'key' => $this->key, + ), + home_url( '/' ) + ); + + return $url; + } + + /** + * Get the return URL for this payment. This URL is passed to the payment providers / gateways + * so they know where they should return users to. + * + * @return string + */ + public function get_return_url() { + $home_url = home_url( '/' ); + + /** + * Polylang compatibility. + * + * @link https://github.com/polylang/polylang/blob/2.6.8/include/api.php#L97-L111 + */ + if ( \function_exists( '\pll_home_url' ) ) { + $home_url = \pll_home_url(); + } + + $url = add_query_arg( + array( + 'payment' => $this->id, + 'key' => $this->key, + ), + $home_url + ); + + return $url; + } + + /** + * Get action URL. + * + * @return string|null + */ + public function get_action_url() { + $action_url = $this->action_url; + + $amount = $this->get_total_amount()->get_value(); + + if ( empty( $amount ) ) { + $status = $this->get_status(); + + $this->set_status( PaymentStatus::SUCCESS ); + + $action_url = $this->get_return_redirect_url(); + + $this->set_status( $status ); + } + + return $action_url; + } + + /** + * Set the action URL. + * + * @param string $action_url Action URL. + * @return void + */ + public function set_action_url( $action_url ) { + $this->action_url = $action_url; + } + + /** + * Get expiry date. + * + * @return DateTime|null + */ + public function get_expiry_date() { + return $this->expiry_date; + } + + /** + * Set expiry date. + * + * @param DateTime|null $expiry_date Expiry date. + * @return void + */ + public function set_expiry_date( $expiry_date ) { + $this->expiry_date = $expiry_date; + } + + /** + * Get the return redirect URL for this payment. This URL is used after a user is returned + * from a payment provider / gateway to WordPress. It allows WordPress payment extensions + * to redirect users to the correct URL. + * + * @return string + */ + public function get_return_redirect_url() { + $url = home_url( '/' ); + + $url = apply_filters( 'pronamic_payment_redirect_url', $url, $this ); + + return $url; + } + + /** + * Get the redirect URL for this payment. + * + * @deprecated 4.1.2 Use get_return_redirect_url() + * + * @return string + */ + public function get_redirect_url() { + _deprecated_function( __FUNCTION__, '4.1.2', 'get_return_redirect_url()' ); + + return $this->get_return_redirect_url(); + } + + /** + * Get edit payment URL. + * + * @link https://docs.woocommerce.com/wc-apidocs/source-class-WC_Order.html#1538-1546 + * + * @return string + */ + public function get_edit_payment_url() { + $url = add_query_arg( + array( + 'action' => 'edit', + 'post' => $this->get_id(), + ), + admin_url( 'post.php' ) + ); + + return $url; + } + + /** + * Get source description. + * + * @return string|null + */ + public function get_source_description() { + $description = $this->source; + + $description = apply_filters( 'pronamic_payment_source_description', $description, $this ); + $description = apply_filters( 'pronamic_payment_source_description_' . $this->source, $description, $this ); + + return $description; + } + + /** + * Get the source link for this payment. + * + * @return string|null + */ + public function get_source_link() { + $url = null; + + $url = apply_filters( 'pronamic_payment_source_url', $url, $this ); + $url = apply_filters( 'pronamic_payment_source_url_' . $this->source, $url, $this ); + + return $url; + } + + /** + * Get provider link for this payment. + * + * @return string + */ + public function get_provider_link() { + $url = null; + + $url = apply_filters( 'pronamic_payment_provider_url', $url, $this ); + + if ( null === $this->id ) { + return $url; + } + + $config_id = get_post_meta( $this->id, '_pronamic_payment_config_id', true ); + + if ( empty( $config_id ) ) { + return $url; + } + + $gateway_id = get_post_meta( intval( $config_id ), '_pronamic_gateway_id', true ); + + if ( empty( $gateway_id ) ) { + return $url; + } + + $url = apply_filters( 'pronamic_payment_provider_url_' . $gateway_id, $url, $this ); + + return $url; + } + + /** + * Get subscription. + * + * @return Subscription|null + */ + public function get_subscription() { + if ( is_object( $this->subscription ) ) { + return $this->subscription; + } + + if ( empty( $this->subscription_id ) ) { + return null; + } + + $this->subscription = new Subscription( $this->subscription_id ); + + return $this->subscription; + } + + /** + * Get subscriptions. + * + * @return Subscription[] + */ + public function get_subscriptions() { + return $this->subscriptions; + } + + /** + * Connect subscription to this payment. + * + * @param Subscription $subscription Subscription. + * @return void + */ + public function add_subscription( Subscription $subscription ) { + $this->subscriptions[] = $subscription; + } + + /** + * Format string + * + * @link https://github.com/woocommerce/woocommerce/blob/v2.2.3/includes/abstracts/abstract-wc-email.php#L187-L195 + * + * @param string $string The string to format. + * @return string + */ + public function format_string( $string ) { + $id = $this->get_id(); + + // Replacements definition. + $replacements = array( + '{order_id}' => $this->get_order_id(), + '{payment_id}' => $id, + ); + + // Find and replace. + $count = 0; + + $string = str_replace( + array_keys( $replacements ), + array_values( $replacements ), + $string, + $count + ); + + // Make sure there is an dynamic part in the order ID. + // @link https://secure.ogone.com/ncol/param_cookbook.asp. + if ( 0 === $count && null !== $id ) { + $string .= $id; + } + + return $string; + } + + /** + * Get payment email. + * + * @return string|null + */ + public function get_email() { + return $this->email; + } + + /** + * Get Google Analytics client ID. + * + * @return string|null + */ + public function get_analytics_client_id() { + return $this->analytics_client_id; + } + + /** + * Get entrance code. + * + * @return string|null + */ + public function get_entrance_code() { + return $this->entrance_code; + } + + /** + * Get subscription periods. + * + * @since 2.5.0 + * @return SubscriptionPeriod[]|null + */ + public function get_periods() { + return $this->periods; + } + + /** + * Add subscription period. + * + * @since 2.5.0 + * @param SubscriptionPeriod $period Subscription period. + * @return void + */ + public function add_period( SubscriptionPeriod $period ) { + if ( null === $this->periods ) { + $this->periods = array(); + } + + $this->periods[] = $period; + } + + /** + * Get payment subscription ID. + * + * @return int|null + */ + public function get_subscription_id() { + return $this->subscription_id; + } + + /** + * Get recurring. + * + * @return bool|null + */ + public function get_recurring() { + return $this->recurring; + } + + /** + * Create payment from object. + * + * @param mixed $json JSON. + * @param Payment|null $payment Payment. + * @return Payment + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json, $payment = null ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( null === $payment ) { + $payment = new self(); + } + + PaymentInfoHelper::from_json( $json, $payment ); + + if ( isset( $json->total_amount ) ) { + $payment->set_total_amount( TaxedMoneyJsonTransformer::from_json( $json->total_amount ) ); + } + + if ( isset( $json->expiry_date ) ) { + $payment->set_expiry_date( new DateTime( $json->expiry_date ) ); + } + + if ( isset( $json->status ) ) { + $payment->set_status( $json->status ); + } + + if ( isset( $json->periods ) ) { + foreach ( $json->periods as $json_period ) { + try { + $payment->add_period( SubscriptionPeriod::from_json( $json_period ) ); + } catch ( \Exception $exception ) { + // For now we temporarily ignore subscription period exception due to changes in the JSON schema. + continue; + } + } + } + + if ( isset( $json->failure_reason ) ) { + $payment->set_failure_reason( FailureReason::from_json( $json->failure_reason ) ); + } + + if ( isset( $json->ga_tracked ) ) { + $payment->set_ga_tracked( $json->ga_tracked ); + } + + if ( isset( $json->origin_id ) ) { + $payment->set_origin_id( $json->origin_id ); + } + + return $payment; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $object = PaymentInfoHelper::to_json( $this ); + + $properties = (array) $object; + + $expiry_date = $this->get_expiry_date(); + + if ( null !== $expiry_date ) { + $properties['expiry_date'] = $expiry_date->format( \DATE_ATOM ); + } + + $total_amount = $this->get_total_amount(); + + if ( null !== $total_amount ) { + $properties['total_amount'] = TaxedMoneyJsonTransformer::to_json( $total_amount ); + } + + $periods = $this->get_periods(); + + if ( null !== $periods ) { + foreach ( $periods as $period ) { + $properties['periods'][] = $period->to_json(); + } + } + + if ( null !== $this->get_status() ) { + $properties['status'] = $this->get_status(); + } + + $failure_reason = $this->get_failure_reason(); + + if ( null !== $failure_reason ) { + $properties['failure_reason'] = $failure_reason->get_json(); + } + + if ( null !== $this->get_ga_tracked() ) { + $properties['ga_tracked'] = $this->get_ga_tracked(); + } + + $origin_id = $this->get_origin_id(); + + if ( null !== $origin_id ) { + $properties['origin_id'] = $origin_id; + } + + $object = (object) $properties; + + return $object; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfo.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfo.php new file mode 100644 index 00000000..4a559704 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfo.php @@ -0,0 +1,649 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Banks\BankTransferDetails; +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\CreditCard; +use Pronamic\WordPress\Pay\Customer; +use WP_Post; + +/** + * Payment info + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.0 + */ +abstract class PaymentInfo { + use \Pronamic\WordPress\Pay\Core\TimestampsTrait; + + use \Pronamic\WordPress\Pay\Core\VersionTrait; + + use \Pronamic\WordPress\Pay\Privacy\AnonymizedTrait; + + use \Pronamic\WordPress\Pay\Payments\PaymentInfoTrait; + + use \Pronamic\WordPress\Pay\Payments\SourceTrait; + + /** + * The post object. + * + * @var WP_Post|array|null + */ + public $post; + + /** + * The date of this payment info. + * + * @var DateTime + */ + public $date; + + /** + * The unique ID of this payment info. + * + * @var int|null + */ + protected $id; + + /** + * The title of this payment info. + * + * @var string|null + */ + public $title; + + /** + * The configuration ID. + * + * @var int|null + */ + public $config_id; + + /** + * The key of this payment info, used in URL's for security. + * + * @var string|null + */ + public $key; + + /** + * Origin post ID. + * + * @var int|null + */ + private $origin_id; + + /** + * The order ID of this payment. + * + * @todo Is this required/used? + * + * @var string|null + */ + public $order_id; + + /** + * The transaction ID of this payment. + * + * @var string|null + */ + public $transaction_id; + + /** + * The shipping amount of this payment. + * + * @var Money|null + */ + private $shipping_amount; + + /** + * The description of this payment. + * + * @var string|null + */ + public $description; + + /** + * Bank transfer recipient details. + * + * @var BankTransferDetails|null + */ + private $bank_transfer_recipient_details; + + /** + * Consumer bank details. + * + * @var BankAccountDetails|null + */ + private $consumer_bank_details; + + /** + * The Google Analytics client ID of the user who started this payment. + * + * @var string|null + */ + public $analytics_client_id; + + /** + * Google Analytics e-commerce tracked. + * + * @var bool|null + */ + public $ga_tracked; + + /** + * The email of the user who started this payment. + * + * @var string|null + */ + public $email; + + /** + * The payment method chosen by the user who started this payment. + * + * @var string|null + */ + public $method; + + /** + * The issuer chosen by the user who started this payment. + * + * @var string|null + */ + public $issuer; + + /** + * Customer. + * + * @var Customer|null + */ + public $customer; + + /** + * Billing address. + * + * @var Address|null + */ + public $billing_address; + + /** + * Shipping address. + * + * @var Address|null + */ + public $shipping_address; + + /** + * Payment lines. + * + * @var PaymentLines|null + */ + public $lines; + + /** + * Mode. + * + * @var string|null + */ + private $mode; + + /** + * Credit card + * + * @var CreditCard|null + */ + private $credit_card; + + /** + * Start date if the payment is related to a specific period. + * + * @var DateTime|null + */ + public $start_date; + + /** + * End date if the payment is related to a specific period. + * + * @var DateTime|null + */ + public $end_date; + + /** + * Meta. + * + * @var array + */ + public $meta; + + /** + * Construct and initialize payment object. + * + * @param integer $post_id A payment post ID or null. + */ + public function __construct( $post_id = null ) { + $this->id = $post_id; + $this->date = new DateTime(); + $this->meta = array(); + + $this->touch(); + } + + /** + * Get the ID of this payment. + * + * @return int|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set the ID of this payment. + * + * @param int $id Unique ID. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get payment date. + * + * @return DateTime + */ + public function get_date() { + return $this->date; + } + + /** + * Set payment date. + * + * @param DateTime $date Date. + * @return void + */ + public function set_date( $date ) { + $this->date = $date; + } + + /** + * Get start date. + * + * @return DateTime|null + */ + public function get_start_date() { + return $this->start_date; + } + + /** + * Set start date. + * + * @param DateTime|null $start_date Start date. + * @return void + */ + public function set_start_date( $start_date ) { + $this->start_date = $start_date; + } + + /** + * Get end date. + * + * @return DateTime|null + */ + public function get_end_date() { + return $this->end_date; + } + + /** + * Set end date. + * + * @param DateTime|null $end_date End date. + * @return void + */ + public function set_end_date( $end_date ) { + $this->end_date = $end_date; + } + + /** + * Get origin post ID. + * + * @return int|null + */ + public function get_origin_id() { + return $this->origin_id; + } + + /** + * Set origin post ID. + * + * @param int|null $origin_id Origin post ID. + * @return void + */ + public function set_origin_id( $origin_id ) { + $this->origin_id = $origin_id; + } + + /** + * Get the config ID of this payment. + * + * @return int|null + */ + public function get_config_id() { + return $this->config_id; + } + + /** + * Set the config ID of this payment. + * + * @param int|null $config_id Config ID. + * @return void + */ + public function set_config_id( $config_id ) { + $this->config_id = $config_id; + } + + /** + * Get customer. + * + * @return Customer|null + */ + public function get_customer() { + return $this->customer; + } + + /** + * Set customer. + * + * @param Customer|null $customer Contact. + * @return void + */ + public function set_customer( $customer ) { + $this->customer = $customer; + } + + /** + * Get billing address. + * + * @return Address|null + */ + public function get_billing_address() { + return $this->billing_address; + } + + /** + * Set billing address. + * + * @param Address|null $billing_address Billing address. + * @return void + */ + public function set_billing_address( $billing_address ) { + $this->billing_address = $billing_address; + } + + /** + * Get shipping address. + * + * @return Address|null + */ + public function get_shipping_address() { + return $this->shipping_address; + } + + /** + * Set shipping address. + * + * @param Address|null $shipping_address Shipping address. + * @return void + */ + public function set_shipping_address( $shipping_address ) { + $this->shipping_address = $shipping_address; + } + + /** + * Get payment lines. + * + * @return PaymentLines|null + */ + public function get_lines() { + return $this->lines; + } + + /** + * Set payment lines. + * + * @param PaymentLines|null $lines Payment lines. + * @return void + */ + public function set_lines( PaymentLines $lines = null ) { + $this->lines = $lines; + } + + /** + * Get the order ID of this payment. + * + * @return string|null + */ + public function get_order_id() { + return $this->order_id; + } + + /** + * Get the shipping amount. + * + * @return Money|null + */ + public function get_shipping_amount() { + return $this->shipping_amount; + } + + /** + * Set the shipping amount. + * + * @param Money|null $shipping_amount Money object. + * @return void + */ + public function set_shipping_amount( Money $shipping_amount = null ) { + $this->shipping_amount = $shipping_amount; + } + + /** + * Get the payment method. + * + * @todo Constant? + * + * @return string|null + */ + public function get_method() { + return $this->method; + } + + /** + * Get the payment issuer. + * + * @return string|null + */ + public function get_issuer() { + return $this->issuer; + } + + /** + * Get the payment description. + * + * @return string|null + */ + public function get_description() { + return $this->description; + } + + /** + * Set the payment description. + * + * @param string|null $description Description. + * @return void + */ + public function set_description( $description ) { + $this->description = $description; + } + + /** + * Get the meta value of this specified meta key. + * + * @param string $key Meta key. + * @return mixed + */ + public function get_meta( $key ) { + if ( null === $this->id ) { + return null; + } + + $key = '_pronamic_payment_' . $key; + + return get_post_meta( $this->id, $key, true ); + } + + /** + * Set meta data. + * + * @param string $key A meta key. + * @param mixed $value A meta value. + * + * @return bool True on successful update, false on failure. + */ + public function set_meta( $key, $value ) { + if ( null === $this->id ) { + return false; + } + + $key = '_pronamic_payment_' . $key; + + if ( $value instanceof \DateTime ) { + $value = $value->format( 'Y-m-d H:i:s' ); + } + + if ( empty( $value ) ) { + return delete_post_meta( $this->id, $key ); + } + + $result = update_post_meta( $this->id, $key, $value ); + + return ( false !== $result ); + } + + /** + * Get consumer bank details. + * + * @return BankAccountDetails|null + */ + public function get_consumer_bank_details() { + return $this->consumer_bank_details; + } + + /** + * Set consumer bank details. + * + * @param BankAccountDetails|null $bank_details Consumer bank details. + * @return void + */ + public function set_consumer_bank_details( $bank_details ) { + $this->consumer_bank_details = $bank_details; + } + + /** + * Get bank transfer details. + * + * @return BankTransferDetails|null + */ + public function get_bank_transfer_recipient_details() { + return $this->bank_transfer_recipient_details; + } + + /** + * Set bank transfer details. + * + * @param BankTransferDetails|null $bank_transfer Bank transfer details. + * @return void + */ + public function set_bank_transfer_recipient_details( $bank_transfer ) { + $this->bank_transfer_recipient_details = $bank_transfer; + } + + /** + * Get payment email. + * + * @return string|null + */ + public function get_email() { + return $this->email; + } + + /** + * Get Google Analytics client ID. + * + * @return string|null + */ + public function get_analytics_client_id() { + return $this->analytics_client_id; + } + + /** + * Set the credit card to use for this payment. + * + * @param CreditCard|null $credit_card Credit Card. + * @return void + */ + public function set_credit_card( $credit_card ) { + $this->credit_card = $credit_card; + } + + /** + * Get the credit card to use for this payment. + * + * @return CreditCard|null + */ + public function get_credit_card() { + return $this->credit_card; + } + + /** + * Set mode. + * + * @param string|null $mode Mode. + * @return void + * @throws \InvalidArgumentException Throws invalid argument exception when mode is not a string or not one of the mode constants. + */ + public function set_mode( $mode ) { + if ( ! is_string( $mode ) ) { + throw new \InvalidArgumentException( 'Mode must be a string.' ); + } + + if ( ! in_array( $mode, array( Gateway::MODE_TEST, Gateway::MODE_LIVE ), true ) ) { + throw new \InvalidArgumentException( 'Invalid mode.' ); + } + + $this->mode = $mode; + } + + /** + * Get mode. + * + * @return string|null + */ + public function get_mode() { + return $this->mode; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfoHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfoHelper.php new file mode 100644 index 00000000..bf60f5d2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfoHelper.php @@ -0,0 +1,183 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Banks\BankTransferDetails; +use Pronamic\WordPress\Pay\Address; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\MoneyJsonTransformer; +use Pronamic\WordPress\Pay\TaxedMoneyJsonTransformer; + +/** + * Payment info helper + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.1.0 + */ +class PaymentInfoHelper { + /** + * Convert payment info to JSON. + * + * @param PaymentInfo $payment_info Payment info. + * @return object + */ + public static function to_json( PaymentInfo $payment_info ) { + $object = (object) array(); + + if ( null !== $payment_info->get_id() ) { + $object->id = $payment_info->get_id(); + } + + $origin_id = $payment_info->get_origin_id(); + + if ( null !== $origin_id ) { + $object->origin_id = $origin_id; + } + + $shipping_amount = $payment_info->get_shipping_amount(); + + if ( null !== $shipping_amount ) { + $object->shipping_amount = MoneyJsonTransformer::to_json( $shipping_amount ); + } + + $customer = $payment_info->get_customer(); + + if ( null !== $customer ) { + $object->customer = $customer->get_json(); + } + + $billing_address = $payment_info->get_billing_address(); + + if ( null !== $billing_address ) { + $object->billing_address = $billing_address->get_json(); + } + + $shipping_address = $payment_info->get_shipping_address(); + + if ( null !== $shipping_address ) { + $object->shipping_address = $shipping_address->get_json(); + } + + $lines = $payment_info->get_lines(); + + if ( null !== $lines ) { + $object->lines = $lines->get_json(); + } + + // Consumer bank details. + $consumer_bank_details = $payment_info->get_consumer_bank_details(); + + if ( null !== $consumer_bank_details ) { + $object->consumer_bank_details = $consumer_bank_details->get_json(); + } + + // Bank transfer recipient details. + $bank_transfer_recipient_details = $payment_info->get_bank_transfer_recipient_details(); + + if ( null !== $bank_transfer_recipient_details ) { + $object->bank_transfer_recipient_details = $bank_transfer_recipient_details->get_json(); + } + + $mode = $payment_info->get_mode(); + + if ( null !== $mode ) { + $object->mode = $mode; + } + + if ( $payment_info->is_anonymized() ) { + $object->anonymized = $payment_info->is_anonymized(); + } + + $start_date = $payment_info->get_start_date(); + + if ( null !== $start_date ) { + $object->start_date = $start_date->format( \DATE_ATOM ); + } + + $end_date = $payment_info->get_end_date(); + + if ( null !== $end_date ) { + $object->end_date = $end_date->format( \DATE_ATOM ); + } + + return $object; + } + + /** + * Convert JSON to payment info object. + * + * @param object $json JSON. + * @param PaymentInfo $payment_info Payment info object. + * @return PaymentInfo + */ + public static function from_json( $json, PaymentInfo $payment_info ) { + if ( isset( $json->id ) ) { + $payment_info->set_id( $json->id ); + } + + if ( isset( $json->origin_id ) ) { + $payment_info->set_origin_id( $json->origin_id ); + } + + if ( isset( $json->shipping_amount ) ) { + $payment_info->set_shipping_amount( MoneyJsonTransformer::from_json( $json->shipping_amount ) ); + } + + if ( isset( $json->customer ) ) { + $payment_info->set_customer( Customer::from_json( $json->customer ) ); + } + + if ( isset( $json->billing_address ) ) { + $payment_info->set_billing_address( Address::from_json( $json->billing_address ) ); + } + + if ( isset( $json->shipping_address ) ) { + $payment_info->set_shipping_address( Address::from_json( $json->shipping_address ) ); + } + + if ( isset( $json->lines ) ) { + $payment_info->set_lines( PaymentLines::from_json( $json->lines ) ); + } + + if ( isset( $json->consumer_bank_details ) ) { + $payment_info->set_consumer_bank_details( BankAccountDetails::from_json( $json->consumer_bank_details ) ); + } + + if ( isset( $json->bank_transfer_recipient_details ) ) { + $payment_info->set_bank_transfer_recipient_details( BankTransferDetails::from_json( $json->bank_transfer_recipient_details ) ); + } + + if ( isset( $json->lines ) ) { + $payment_info->set_lines( PaymentLines::from_json( $json->lines, $payment_info ) ); + } + + if ( isset( $json->mode ) ) { + $payment_info->set_mode( $json->mode ); + } + + if ( isset( $json->anonymized ) ) { + $payment_info->set_anonymized( $json->anonymized ); + } + + if ( isset( $json->start_date ) ) { + $payment_info->set_start_date( new DateTime( $json->start_date ) ); + } + + if ( isset( $json->end_date ) ) { + $payment_info->set_end_date( new DateTime( $json->end_date ) ); + } + + return $payment_info; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfoTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfoTrait.php new file mode 100644 index 00000000..3ea16470 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentInfoTrait.php @@ -0,0 +1,22 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Payment info + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +trait PaymentInfoTrait { + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLine.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLine.php new file mode 100644 index 00000000..2070f462 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLine.php @@ -0,0 +1,505 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use InvalidArgumentException; +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\MoneyJsonTransformer; +use Pronamic\WordPress\Pay\TaxedMoneyJsonTransformer; + +/** + * Payment line. + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.1.0 + */ +class PaymentLine { + /** + * The ID. + * + * @var string|null + */ + private $id; + + /** + * The payment type. + * + * @see PaymentLineType + * + * @var string + */ + private $type; + + /** + * SKU. + * + * @var string|null + */ + private $sku; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * The description. + * + * @var string|null + */ + private $description; + + /** + * The quantity. + * + * @var int|null + */ + private $quantity; + + /** + * The unit price of this payment line. + * + * @var TaxedMoney|null + */ + private $unit_price; + + /** + * The discount amount of this payment line, no tax included. + * + * @var Money|null + */ + private $discount_amount; + + /** + * Total amount of this payment line. + * + * @var TaxedMoney + */ + private $total_amount; + + /** + * Product URL. + * + * @var string|null + */ + private $product_url; + + /** + * Image url. + * + * @var string|null + */ + private $image_url; + + /** + * Product category. + * + * @var string|null + */ + private $product_category; + + /** + * Payment + * + * @var Payment|null + */ + private $payment; + + /** + * Payment line constructor. + */ + public function __construct() { + $this->set_total_amount( new TaxedMoney() ); + } + + /** + * Get the id / identifier of this payment line. + * + * @return string|null + */ + public function get_id() { + return $this->id; + } + + /** + * Set the id / identifier of this payment line. + * + * @param string|null $id Number. + * @return void + */ + public function set_id( $id ) { + $this->id = $id; + } + + /** + * Get type. + * + * @return string + */ + public function get_type() { + return $this->type; + } + + /** + * Set type. + * + * @param string $type Type. + * @return void + */ + public function set_type( $type ) { + $this->type = $type; + } + + /** + * Get the SKU of this payment line. + * + * @return string|null + */ + public function get_sku() { + return $this->sku; + } + + /** + * Set the SKU of this payment line. + * + * @param string|null $sku SKU. + * @return void + */ + public function set_sku( $sku ) { + $this->sku = $sku; + } + + /** + * Get the name of this payment line. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set the name of this payment line. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get the description of this payment line. + * + * @return string|null + */ + public function get_description() { + return $this->description; + } + + /** + * Set the description of this payment line. + * + * @param string|null $description Description. + * @return void + */ + public function set_description( $description ) { + $this->description = $description; + } + + /** + * Get the quantity of this payment line. + * + * @return int|null + */ + public function get_quantity() { + return $this->quantity; + } + + /** + * Set the quantity of this payment line. + * + * @param int|null $quantity Quantity. + * @return void + */ + public function set_quantity( $quantity ) { + $this->quantity = $quantity; + } + + /** + * Get unit price. + * + * @return TaxedMoney|null + */ + public function get_unit_price() { + return $this->unit_price; + } + + /** + * Set unit price. + * + * @param TaxedMoney|null $price Unit price. + * @return void + */ + public function set_unit_price( TaxedMoney $price = null ) { + $this->unit_price = ( null === $price ? null : $price ); + } + + /** + * Get discount amount, should not contain any tax. + * + * @return Money|null + */ + public function get_discount_amount() { + return $this->discount_amount; + } + + /** + * Set discount amount, should not contain any tax. + * + * @param Money $discount_amount Discount amount. + * @return void + */ + public function set_discount_amount( Money $discount_amount = null ) { + $this->discount_amount = $discount_amount; + } + + /** + * Get tax amount. + * + * @return Money|null + */ + public function get_tax_amount() { + $tax_value = $this->get_total_amount()->get_tax_value(); + + if ( null === $tax_value ) { + return null; + } + + return new Money( + $tax_value, + $this->get_total_amount()->get_currency() + ); + } + + /** + * Get total amount. + * + * @return TaxedMoney + */ + public function get_total_amount() { + return $this->total_amount; + } + + /** + * Set total amount. + * + * @param TaxedMoney $total_amount Total amount. + * @return void + */ + public function set_total_amount( TaxedMoney $total_amount ) { + $this->total_amount = $total_amount; + } + + /** + * Get product URL. + * + * @return string|null + */ + public function get_product_url() { + return $this->product_url; + } + + /** + * Set product URL. + * + * @param string|null $product_url Product URL. + * @return void + */ + public function set_product_url( $product_url = null ) { + $this->product_url = $product_url; + } + + /** + * Get image URL. + * + * @return null|string + */ + public function get_image_url() { + return $this->image_url; + } + + /** + * Set image URL. + * + * @param null|string $image_url Image url. + * @return void + */ + public function set_image_url( $image_url ) { + $this->image_url = $image_url; + } + + /** + * Get product category. + * + * @return null|string + */ + public function get_product_category() { + return $this->product_category; + } + + /** + * Set product category. + * + * @param null|string $product_category Product category. + * @return void + */ + public function set_product_category( $product_category ) { + $this->product_category = $product_category; + } + + /** + * Get payment. + * + * @return null|Payment + */ + public function get_payment() { + return $this->payment; + } + + /** + * Set payment. + * + * @param Payment $payment Payment. + * @return void + */ + public function set_payment( Payment $payment ) { + $this->payment = $payment; + } + + /** + * Create payment line from object. + * + * @param mixed $json JSON. + * @return PaymentLine + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an array.' ); + } + + $line = new self(); + + if ( property_exists( $json, 'id' ) ) { + $line->set_id( $json->id ); + } + + if ( property_exists( $json, 'type' ) ) { + $line->set_type( $json->type ); + } + + if ( property_exists( $json, 'sku' ) ) { + $line->set_sku( $json->sku ); + } + + if ( property_exists( $json, 'name' ) ) { + $line->set_name( $json->name ); + } + + if ( property_exists( $json, 'description' ) ) { + $line->set_description( $json->description ); + } + + if ( property_exists( $json, 'quantity' ) ) { + $line->set_quantity( $json->quantity ); + } + + if ( isset( $json->unit_price ) ) { + $line->set_unit_price( TaxedMoneyJsonTransformer::from_json( $json->unit_price ) ); + } + + if ( isset( $json->discount_amount ) ) { + $line->set_discount_amount( MoneyJsonTransformer::from_json( $json->discount_amount ) ); + } + + if ( isset( $json->total_amount ) ) { + $line->set_total_amount( TaxedMoneyJsonTransformer::from_json( $json->total_amount ) ); + } + + if ( property_exists( $json, 'product_url' ) ) { + $line->set_product_url( $json->product_url ); + } + + if ( property_exists( $json, 'image_url' ) ) { + $line->set_image_url( $json->image_url ); + } + + if ( property_exists( $json, 'product_category' ) ) { + $line->set_product_category( $json->product_category ); + } + + return $line; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = array( + 'id' => $this->get_id(), + 'type' => $this->get_type(), + 'sku' => $this->get_sku(), + 'name' => $this->get_name(), + 'description' => $this->get_description(), + 'quantity' => $this->get_quantity(), + 'unit_price' => TaxedMoneyJsonTransformer::to_json( $this->get_unit_price() ), + 'discount_amount' => MoneyJsonTransformer::to_json( $this->get_discount_amount() ), + 'total_amount' => TaxedMoneyJsonTransformer::to_json( $this->get_total_amount() ), + 'product_url' => $this->get_product_url(), + 'image_url' => $this->get_image_url(), + 'product_category' => $this->get_product_category(), + ); + + $properties = array_filter( $properties ); + + return (object) $properties; + } + + /** + * Create string representation of the payment line. + * + * @return string + */ + public function __toString() { + $parts = array( + $this->get_id(), + $this->get_description(), + $this->get_quantity(), + ); + + $parts = array_map( 'strval', $parts ); + + $parts = array_map( 'trim', $parts ); + + $parts = array_filter( $parts ); + + $string = implode( ' - ', $parts ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLineType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLineType.php new file mode 100644 index 00000000..e4b58f12 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLineType.php @@ -0,0 +1,62 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Payment line type. + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.1.0 + */ +class PaymentLineType { + /** + * Constant for 'digital' type. + * + * @var string + */ + const DIGITAL = 'digital'; + + /** + * Constant for 'discount' type. + * + * @var string + */ + const DISCOUNT = 'discount'; + + /** + * Constant for 'fee' type. + * + * @var string + */ + const FEE = 'fee'; + + /** + * Constant for 'physical' type. + * + * @var string + */ + const PHYSICAL = 'physical'; + + /** + * Constant for 'shipping' type. + * + * @var string + */ + const SHIPPING = 'shipping'; + + /** + * Constant for 'tax' type. + * + * @var string + */ + const TAX = 'tax'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLines.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLines.php new file mode 100644 index 00000000..57ed360e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentLines.php @@ -0,0 +1,206 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\TaxedMoney; + +/** + * Payment lines + * + * @author Remco Tolsma + * @version 2.5.1 + * @since 2.1.0 + * @implements \IteratorAggregate + */ +class PaymentLines implements \Countable, \IteratorAggregate { + /** + * The lines. + * + * @var array + */ + private $lines; + + /** + * Constructs and initialize a payment lines object. + */ + public function __construct() { + $this->lines = array(); + } + + /** + * Get iterator. + * + * @return \ArrayIterator + */ + public function getIterator() { + return new \ArrayIterator( $this->lines ); + } + + /** + * Get array. + * + * @return array + */ + public function get_array() { + return $this->lines; + } + + /** + * Add line. + * + * @param PaymentLine $line The line to add. + * @return void + */ + public function add_line( PaymentLine $line ) { + $this->lines[] = $line; + } + + /** + * New line. + * + * @return PaymentLine + */ + public function new_line() { + $line = new PaymentLine(); + + $this->add_line( $line ); + + return $line; + } + + /** + * Count lines. + * + * @return int + */ + public function count() { + return count( $this->lines ); + } + + /** + * Calculate the total amount of all lines. + * + * @return TaxedMoney + */ + public function get_amount() { + $total = new Money(); + $tax = new Money(); + $currency = null; + + foreach ( $this->lines as $line ) { + // Total. + $line_total = $line->get_total_amount(); + + $total = $total->add( $line_total ); + + // Tax. + $line_tax = $line_total->get_tax_amount(); + + if ( null !== $line_tax ) { + $tax = $tax->add( $line_tax ); + } + + // Currency. + if ( null === $currency ) { + $currency = $line_total->get_currency(); + } + } + + // Currency. + if ( null === $currency ) { + $currency = 'EUR'; + } + + // Return payment lines amount. + return new TaxedMoney( + $total->get_value(), + $currency, + $tax->get_value() + ); + } + + /** + * Get JSON. + * + * @return array + */ + public function get_json() { + $objects = array_map( + /** + * Get JSON for payment line. + * + * @param PaymentLine $line Payment line. + * @return object + */ + function( PaymentLine $line ) { + return $line->get_json(); + }, + $this->lines + ); + + return $objects; + } + + /** + * Create items from object. + * + * @param mixed $json JSON. + * @param PaymentInfo|null $payment_info Payment info. + * + * @return PaymentLines + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an array. + */ + public static function from_json( $json, PaymentInfo $payment_info = null ) { + if ( ! is_array( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an array.' ); + } + + $object = new self(); + + $lines = array_map( + /** + * Get payment line from object. + * + * @param object $object Object. + * @return PaymentLine + */ + function( $object ) { + return PaymentLine::from_json( $object ); + }, + $json + ); + + foreach ( $lines as $line ) { + // Set payment. + if ( $payment_info instanceof Payment ) { + $line->set_payment( $payment_info ); + } + + $object->add_line( $line ); + } + + return $object; + } + + /** + * Create string representation the payment lines. + * + * @return string + */ + public function __toString() { + $pieces = array_map( 'strval', $this->lines ); + + $string = implode( PHP_EOL, $pieces ); + + return $string; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentPostType.php new file mode 100644 index 00000000..a1280276 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentPostType.php @@ -0,0 +1,251 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Title: WordPress iDEAL post types + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 3.7.0 + */ +class PaymentPostType { + /** + * Constructs and initializes an post types object + */ + public function __construct() { + /** + * Priority of the initial post types function should be set to < 10 + * + * @link https://core.trac.wordpress.org/ticket/28488 + * @link https://core.trac.wordpress.org/changeset/29318 + * + * @link https://github.com/WordPress/WordPress/blob/4.0/wp-includes/post.php#L167 + */ + add_action( 'init', array( $this, 'register_payment_post_type' ), 0 ); // Highest priority. + add_action( 'init', array( $this, 'register_post_status' ), 9 ); + } + + /** + * Register post types. + * + * @link https://github.com/WordPress/WordPress/blob/4.6.1/wp-includes/post.php#L1277-L1300 + * @return void + */ + public function register_payment_post_type() { + register_post_type( + 'pronamic_payment', + array( + 'label' => __( 'Payments', 'pronamic_ideal' ), + 'labels' => array( + 'name' => __( 'Payments', 'pronamic_ideal' ), + 'singular_name' => __( 'Payment', 'pronamic_ideal' ), + 'add_new' => __( 'Add New', 'pronamic_ideal' ), + 'add_new_item' => __( 'Add New Payment', 'pronamic_ideal' ), + 'edit_item' => __( 'Edit Payment', 'pronamic_ideal' ), + 'new_item' => __( 'New Payment', 'pronamic_ideal' ), + 'all_items' => __( 'All Payments', 'pronamic_ideal' ), + 'view_item' => __( 'View Payment', 'pronamic_ideal' ), + 'search_items' => __( 'Search Payments', 'pronamic_ideal' ), + 'not_found' => __( 'No payments found.', 'pronamic_ideal' ), + 'not_found_in_trash' => __( 'No payments found in Trash.', 'pronamic_ideal' ), + 'menu_name' => __( 'Payments', 'pronamic_ideal' ), + 'filter_items_list' => __( 'Filter payments list', 'pronamic_ideal' ), + 'items_list_navigation' => __( 'Payments list navigation', 'pronamic_ideal' ), + 'items_list' => __( 'Payments list', 'pronamic_ideal' ), + + /* + * New Post Type Labels in 5.0. + * @link https://make.wordpress.org/core/2018/12/05/new-post-type-labels-in-5-0/ + */ + 'item_published' => __( 'Payment published.', 'pronamic_ideal' ), + 'item_published_privately' => __( 'Payment published privately.', 'pronamic_ideal' ), + 'item_reverted_to_draft' => __( 'Payment reverted to draft.', 'pronamic_ideal' ), + 'item_scheduled' => __( 'Payment scheduled.', 'pronamic_ideal' ), + 'item_updated' => __( 'Payment updated.', 'pronamic_ideal' ), + ), + 'public' => false, + 'publicly_queryable' => false, + 'show_ui' => true, + 'show_in_nav_menus' => false, + 'show_in_menu' => false, + 'show_in_admin_bar' => false, + 'show_in_rest' => true, + 'rest_base' => 'pronamic-payments', + 'supports' => false, + 'rewrite' => false, + 'query_var' => false, + 'capabilities' => self::get_capabilities(), + 'map_meta_cap' => true, + ) + ); + } + + /** + * Get payment states. + * + * @return array + */ + public static function get_payment_states() { + return array( + 'payment_pending' => _x( 'Pending', 'Payment status', 'pronamic_ideal' ), + 'payment_reserved' => _x( 'Reserved', 'Payment status', 'pronamic_ideal' ), + 'payment_on_hold' => _x( 'On Hold', 'Payment status', 'pronamic_ideal' ), + 'payment_completed' => _x( 'Completed', 'Payment status', 'pronamic_ideal' ), + 'payment_cancelled' => _x( 'Cancelled', 'Payment status', 'pronamic_ideal' ), + 'payment_refunded' => _x( 'Refunded', 'Payment status', 'pronamic_ideal' ), + 'payment_failed' => _x( 'Failed', 'Payment status', 'pronamic_ideal' ), + 'payment_expired' => _x( 'Expired', 'Payment status', 'pronamic_ideal' ), + ); + } + + /** + * Register our custom post statuses, used for order status. + * + * @return void + */ + public function register_post_status() { + /** + * Payment post statuses + */ + register_post_status( + 'payment_pending', + array( + 'label' => _x( 'Pending', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Pending (%s)', 'Pending (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_reserved', + array( + 'label' => _x( 'Reserved', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Reserved (%s)', 'Reserved (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_on_hold', + array( + 'label' => _x( 'On Hold', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'On Hold (%s)', 'On Hold (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_completed', + array( + 'label' => _x( 'Completed', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Completed (%s)', 'Completed (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_cancelled', + array( + 'label' => _x( 'Cancelled', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Cancelled (%s)', 'Cancelled (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_refunded', + array( + 'label' => _x( 'Refunded', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Refunded (%s)', 'Refunded (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_failed', + array( + 'label' => _x( 'Failed', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'payment_expired', + array( + 'label' => _x( 'Expired', 'Payment status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Expired (%s)', 'Expired (%s)', 'pronamic_ideal' ), + ) + ); + } + + /** + * Get capabilities for this post type. + * + * @return array + */ + public static function get_capabilities() { + return array( + 'edit_post' => 'edit_payment', + 'read_post' => 'read_payment', + 'delete_post' => 'delete_payment', + 'edit_posts' => 'edit_payments', + 'edit_others_posts' => 'edit_others_payments', + 'publish_posts' => 'publish_payments', + 'read_private_posts' => 'read_private_payments', + 'read' => 'read', + 'delete_posts' => 'delete_payments', + 'delete_private_posts' => 'delete_private_payments', + 'delete_published_posts' => 'delete_published_payments', + 'delete_others_posts' => 'delete_others_payments', + 'edit_private_posts' => 'edit_private_payments', + 'edit_published_posts' => 'edit_published_payments', + 'create_posts' => 'create_payments', + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentStatus.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentStatus.php new file mode 100644 index 00000000..ca7deba6 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentStatus.php @@ -0,0 +1,86 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Title: WordPress pay payment statuses constants + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 2.1.0 + * @since 1.0.0 + */ +class PaymentStatus { + /** + * Status indicator for success + * + * @var string + */ + const SUCCESS = 'Success'; + + /** + * Status indicator for cancelled + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Status indicator for expired + * + * @var string + */ + const EXPIRED = 'Expired'; + + /** + * Status indicator for failure + * + * @var string + */ + const FAILURE = 'Failure'; + + /** + * Status indicator for on hold + * + * @var string + */ + const ON_HOLD = 'On Hold'; + + /** + * Status indicator for open + * + * @var string + */ + const OPEN = 'Open'; + + /** + * Status indicator for refunded + * + * @var string + */ + const REFUNDED = 'Refunded'; + + /** + * Status indicator for reserved + * + * @var string + */ + const RESERVED = 'Reserved'; + + /** + * Status indicator for completed + * + * @var string + */ + const COMPLETED = 'Completed'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php new file mode 100644 index 00000000..28d45d26 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsDataStoreCPT.php @@ -0,0 +1,885 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Customer; + +/** + * Title: Payments data store CPT + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @see https://woocommerce.com/2017/04/woocommerce-3-0-release/ + * @see https://woocommerce.wordpress.com/2016/10/27/the-new-crud-classes-in-woocommerce-2-7/ + * @author Remco Tolsma + * @version 2.5.0 + * @since 3.7.0 + */ +class PaymentsDataStoreCPT extends LegacyPaymentsDataStoreCPT { + /** + * Payment. + * + * @var Payment|null + */ + private $payment; + + /** + * Payments. + * + * @var array + */ + private $payments; + + /** + * Status map. + * + * @var array + */ + private $status_map; + + /** + * Construct payments data store CPT object. + */ + public function __construct() { + $this->meta_key_prefix = '_pronamic_payment_'; + + $this->register_meta(); + + $this->payments = array(); + + $this->status_map = array( + PaymentStatus::CANCELLED => 'payment_cancelled', + PaymentStatus::EXPIRED => 'payment_expired', + PaymentStatus::FAILURE => 'payment_failed', + PaymentStatus::REFUNDED => 'payment_refunded', + PaymentStatus::RESERVED => 'payment_reserved', + PaymentStatus::SUCCESS => 'payment_completed', + PaymentStatus::OPEN => 'payment_pending', + ); + } + + /** + * Setup. + * + * @return void + */ + public function setup() { + add_filter( 'wp_insert_post_data', array( $this, 'insert_payment_post_data' ), 10, 2 ); + + add_action( 'save_post_pronamic_payment', array( $this, 'save_post_meta' ), 100, 3 ); + } + + /** + * Get payment by ID. + * + * @param int $id Payment ID. + * @return Payment|null + */ + public function get_payment( $id ) { + if ( ! isset( $this->payments[ $id ] ) ) { + if ( empty( $id ) ) { + return null; + } + + $id = (int) $id; + + $post_type = get_post_type( $id ); + + if ( 'pronamic_payment' !== $post_type ) { + return null; + } + + $payment = new Payment(); + + $payment->set_id( $id ); + + $this->payments[ $id ] = $payment; + + $this->read( $payment ); + } + + return $this->payments[ $id ]; + } + + /** + * Get post status from meta status. + * + * @param string|null $meta_status Meta status. + * @return string|null + */ + private function get_post_status_from_meta_status( $meta_status ) { + if ( null === $meta_status ) { + return null; + } + + if ( isset( $this->status_map[ $meta_status ] ) ) { + return $this->status_map[ $meta_status ]; + } + + return null; + } + + /** + * Get meta status from post status. + * + * @param string $post_status Post status. + * @return string|null + */ + private function get_meta_status_from_post_status( $post_status ) { + $key = array_search( $post_status, $this->status_map, true ); + + if ( false !== $key ) { + return \strval( $key ); + } + + return null; + } + + /** + * Complement payment post data. + * + * @link https://github.com/WordPress/WordPress/blob/5.0.3/wp-includes/post.php#L3515-L3523 + * @link https://developer.wordpress.org/reference/functions/wp_json_encode/ + * + * @param array $data An array of slashed post data. + * @param array $postarr An array of sanitized, but otherwise unmodified post data. + * @return array + * @throws \Exception When inserting payment post data JSON string fails. + */ + public function insert_payment_post_data( $data, $postarr ) { + $this->payment = null; + + if ( isset( $postarr['pronamic_payment'] ) ) { + $this->payment = $postarr['pronamic_payment']; + } elseif ( isset( $postarr['ID'] ) ) { + $post_id = $postarr['ID']; + + $this->payment = $this->get_payment( $post_id ); + } + + if ( $this->payment instanceof Payment ) { + $payment = $this->payment; + + // Update subscription from post array. + $this->update_payment_form_post_array( $payment, $postarr ); + + if ( ! isset( $data['post_status'] ) || 'trash' !== $data['post_status'] ) { + $data['post_status'] = $this->get_post_status_from_meta_status( $payment->get_status() ); + } + + // Data. + $json_string = wp_json_encode( $payment->get_json() ); + + if ( false === $json_string ) { + throw new \Exception( 'Error inserting payment post data as JSON.' ); + } + + $data['post_content'] = wp_slash( $json_string ); + $data['post_mime_type'] = 'application/json'; + } + + return $data; + } + + /** + * Update payment from post array. + * + * @param Payment $payment Payment. + * @param array $postarr Post data array. + * @return void + */ + private function update_payment_form_post_array( $payment, $postarr ) { + if ( ! isset( $postarr['pronamic_payment_post_status'] ) ) { + return; + } + + $post_status = sanitize_text_field( stripslashes( $postarr['pronamic_payment_post_status'] ) ); + $meta_status = $this->get_meta_status_from_post_status( $post_status ); + + if ( null === $meta_status ) { + return; + } + + $payment->set_status( $meta_status ); + } + + /** + * Save post meta. + * + * @link https://github.com/WordPress/WordPress/blob/5.0.3/wp-includes/post.php#L3724-L3736 + * + * @param int $post_id Post ID. + * @param \WP_Post $post Post object. + * @param bool $update Whether this is an existing post being updated or not. + * @return void + */ + public function save_post_meta( $post_id, $post, $update ) { + if ( $this->payment instanceof Payment ) { + $payment = $this->payment; + + if ( ! $update && null === $payment->get_id() ) { + $payment->set_id( $post_id ); + $payment->post = $post; + } + + $this->update_post_meta( $payment ); + + do_action( 'pronamic_pay_update_payment', $payment ); + } + + $this->payment = null; + } + + /** + * Create payment. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L47-L76 + * + * @param Payment $payment The payment to create in this data store. + * + * @return bool + */ + public function create( Payment $payment ) { + $title = $payment->title; + + if ( empty( $title ) ) { + $title = sprintf( + 'Payment – %s', + date_i18n( _x( 'M d, Y @ h:i A', 'Payment title date format parsed by `date_i18n`.', 'pronamic_ideal' ) ) + ); + } + + $customer = $payment->get_customer(); + + $result = wp_insert_post( + array( + 'post_type' => 'pronamic_payment', + 'post_date_gmt' => $this->get_mysql_utc_date( $payment->date ), + 'post_title' => $title, + 'post_author' => null === $customer ? null : $customer->get_user_id(), + 'pronamic_payment' => $payment, + ), + true + ); + + if ( is_wp_error( $result ) ) { + return false; + } + + do_action( 'pronamic_pay_new_payment', $payment ); + + return true; + } + + /** + * Update payment. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L113-L154 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L154-L257 + * + * @param Payment $payment The payment to update in this data store. + * + * @return bool + */ + public function update( Payment $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return false; + } + + $data = array( + 'ID' => $id, + 'pronamic_payment' => $payment, + ); + + $result = wp_update_post( $data, true ); + + if ( is_wp_error( $result ) ) { + return false; + } + + return true; + } + + /** + * Save payment. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L113-L154 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L154-L257 + * @param Payment $payment The payment to save in this data store. + * @return boolean True if saved, false otherwise. + */ + public function save( $payment ) { + $id = $payment->get_id(); + + $result = empty( $id ) ? $this->create( $payment ) : $this->update( $payment ); + + return $result; + } + + /** + * Read payment. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/abstracts/abstract-wc-order.php#L85-L111 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L78-L111 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L81-L136 + * @link https://developer.wordpress.org/reference/functions/get_post/ + * @link https://developer.wordpress.org/reference/classes/wp_post/ + * + * @param Payment $payment The payment to read from this data store. + * @return void + * @throws \Exception Throws exception if payment date can not be set. + */ + public function read( Payment $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + $payment->post = get_post( $id ); + $payment->title = get_the_title( $id ); + $payment->date = new DateTime( + get_post_field( 'post_date_gmt', $id, 'raw' ), + new DateTimeZone( 'UTC' ) + ); + + $content = get_post_field( 'post_content', $id, 'raw' ); + + $json = json_decode( $content ); + + if ( is_object( $json ) ) { + Payment::from_json( $json, $payment ); + } + + // Set user ID from `post_author` field if not set from payment JSON. + $customer = $payment->get_customer(); + + if ( null === $customer ) { + $customer = new Customer(); + + $payment->set_customer( $customer ); + } + + if ( null === $customer->get_user_id() ) { + $post_author = get_post_field( 'post_author', $id, 'raw' ); + + $customer->set_user_id( intval( $post_author ) ); + } + + $this->read_post_meta( $payment ); + } + + /** + * Get meta status label. + * + * @param string|null $meta_status The payment meta status to get the status label for. + * @return string|null + */ + public function get_meta_status_label( $meta_status ) { + $post_status = $this->get_post_status_from_meta_status( $meta_status ); + + if ( empty( $post_status ) ) { + return null; + } + + $status_object = get_post_status_object( $post_status ); + + if ( isset( $status_object, $status_object->label ) ) { + return $status_object->label; + } + + return null; + } + + /** + * Register meta. + * + * @return void + */ + private function register_meta() { + $this->register_meta_key( + 'config_id', + array( + 'label' => __( 'Config ID', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'key', + array( + 'label' => __( 'Key', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'method', + array( + 'label' => __( 'Method', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'currency', + array( + 'label' => __( 'Currency', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'amount', + array( + 'label' => __( 'Amount', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'issuer', + array( + 'label' => __( 'Issuer', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'order_id', + array( + 'label' => __( 'Order ID', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'transaction_id', + array( + 'label' => __( 'Transaction ID', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'entrance_code', + array( + 'label' => __( 'Entrance Code', 'pronamic_ideal' ), + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'action_url', + array( + 'label' => __( 'Action URL', 'pronamic_ideal' ), + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'source', + array( + 'label' => __( 'Source', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'source_id', + array( + 'label' => __( 'Source ID', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'description', + array( + 'label' => __( 'Description', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'language', + array( + 'label' => __( 'Language', 'pronamic_ideal' ), + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'locale', + array( + 'label' => __( 'Locale', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'email', + array( + 'label' => __( 'Email', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'anonymize', + ) + ); + + $this->register_meta_key( + 'status', + array( + 'label' => __( 'Status', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'customer_name', + array( + 'label' => __( 'Customer Name', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'address', + array( + 'label' => __( 'Address', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'postal_code', + array( + 'label' => __( 'Postal Code', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'city', + array( + 'label' => __( 'City', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'country', + array( + 'label' => __( 'Country', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'telephone_number', + array( + 'label' => __( 'Telephone Number', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'consumer_name', + array( + 'label' => __( 'Consumer Name', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'consumer_account_number', + array( + 'label' => __( 'Consumer Account Number', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'consumer_iban', + array( + 'label' => __( 'Consumer IBAN', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'consumer_bic', + array( + 'label' => __( 'Consumer BIC', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'consumer_city', + array( + 'label' => __( 'Consumer City', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'analytics_client_id', + array( + 'label' => __( 'Analytics Client ID', 'pronamic_ideal' ), + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'subscription_id', + array( + 'label' => __( 'Subscription ID', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'recurring_type', + array( + 'label' => __( 'Recurring Type', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'recurring', + array( + 'label' => __( 'Recurring', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'start_date', + array( + 'label' => __( 'Start Date', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'end_date', + array( + 'label' => __( 'End Date', 'pronamic_ideal' ), + 'privacy_export' => true, + ) + ); + + $this->register_meta_key( + 'user_agent', + array( + 'label' => __( 'User Agent', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'user_ip', + array( + 'label' => __( 'User IP', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + } + + /** + * Read post meta. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/abstracts/abstract-wc-data.php#L462-L507 + * @param Payment $payment The payment to read. + * @return void + */ + protected function read_post_meta( $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + $payment->config_id = $this->get_meta_int( $id, 'config_id' ); + $payment->key = $this->get_meta_string( $id, 'key' ); + $payment->method = $this->get_meta_string( $id, 'method' ); + $payment->issuer = $this->get_meta_string( $id, 'issuer' ); + $payment->order_id = $this->get_meta_string( $id, 'order_id' ); + $payment->transaction_id = $this->get_meta_string( $id, 'transaction_id' ); + $payment->entrance_code = $this->get_meta_string( $id, 'entrance_code' ); + $payment->action_url = $this->get_meta_string( $id, 'action_url' ); + $payment->source = $this->get_meta_string( $id, 'source' ); + $payment->source_id = $this->get_meta_string( $id, 'source_id' ); + $payment->description = $this->get_meta_string( $id, 'description' ); + $payment->email = $this->get_meta_string( $id, 'email' ); + $payment->status = $this->get_meta_string( $id, 'status' ); + $payment->analytics_client_id = $this->get_meta_string( $id, 'analytics_client_id' ); + $payment->subscription_id = $this->get_meta_int( $id, 'subscription_id' ); + $payment->recurring_type = $this->get_meta_string( $id, 'recurring_type' ); + $payment->recurring = $this->get_meta_bool( $id, 'recurring' ); + $payment->start_date = $this->get_meta_date( $id, 'start_date' ); + $payment->end_date = $this->get_meta_date( $id, 'end_date' ); + + $payment->set_version( $this->get_meta_string( $id, 'version' ) ); + + // Legacy. + parent::read_post_meta( $payment ); + + // Amount. + $amount = $payment->get_meta( 'amount' ); + + $amount_value = $payment->get_total_amount()->get_value(); + + if ( empty( $amount_value ) && ! empty( $amount ) ) { + $payment->set_total_amount( + new TaxedMoney( + $amount, + $payment->get_meta( 'currency' ) + ) + ); + } + + // Subscription. + if ( ! empty( $payment->subscription_id ) ) { + $subscription = get_pronamic_subscription( $payment->subscription_id ); + + if ( null !== $subscription ) { + $payment->add_subscription( $subscription ); + } + } + } + + /** + * Get update meta. + * + * @param Payment $payment The payment to update. + * @param array $meta Meta array. + * + * @return array + */ + protected function get_update_meta( $payment, $meta = array() ) { + $customer = $payment->get_customer(); + + $consumer_bank_details = $payment->get_consumer_bank_details(); + + $meta = array( + 'config_id' => $payment->config_id, + 'key' => $payment->key, + 'order_id' => $payment->order_id, + 'currency' => $payment->get_total_amount()->get_currency()->get_alphabetic_code(), + 'amount' => $payment->get_total_amount()->format(), + 'method' => $payment->method, + 'issuer' => $payment->issuer, + 'expiration_period' => null, + 'entrance_code' => $payment->entrance_code, + 'description' => $payment->description, + 'consumer_name' => ( null === $consumer_bank_details ? null : $consumer_bank_details->get_name() ), + 'consumer_account_number' => ( null === $consumer_bank_details ? null : $consumer_bank_details->get_account_number() ), + 'consumer_iban' => ( null === $consumer_bank_details ? null : $consumer_bank_details->get_iban() ), + 'consumer_bic' => ( null === $consumer_bank_details ? null : $consumer_bank_details->get_bic() ), + 'consumer_city' => ( null === $consumer_bank_details ? null : $consumer_bank_details->get_city() ), + 'source' => $payment->source, + 'source_id' => $payment->source_id, + 'email' => ( null === $customer ? null : $customer->get_email() ), + 'analytics_client_id' => $payment->analytics_client_id, + 'subscription_id' => $payment->subscription_id, + 'recurring_type' => $payment->recurring_type, + 'recurring' => $payment->recurring, + 'transaction_id' => $payment->get_transaction_id(), + 'action_url' => $payment->get_action_url(), + 'start_date' => $payment->start_date, + 'end_date' => $payment->end_date, + 'version' => $payment->get_version(), + ); + + $meta = parent::get_update_meta( $payment, $meta ); + + return $meta; + } + + /** + * Update payment post meta. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L154-L257 + * @param Payment $payment The payment to update. + * @return void + */ + private function update_post_meta( $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + $meta = $this->get_update_meta( $payment ); + + foreach ( $meta as $meta_key => $meta_value ) { + $this->update_meta( $id, $meta_key, $meta_value ); + } + + $this->update_meta_status( $payment ); + } + + /** + * Update meta status. + * + * @param Payment $payment The payment to update the status for. + * @return void + */ + public function update_meta_status( $payment ) { + $id = $payment->get_id(); + + if ( empty( $id ) ) { + return; + } + + // Clean post cache to prevent duplicate status updates. + \clean_post_cache( $id ); + + $previous_status = $this->get_meta( $id, 'status' ); + + $this->update_meta( $id, 'status', $payment->status ); + + if ( $previous_status !== $payment->status ) { + $old = $previous_status; + $old = empty( $old ) ? 'unknown' : $old; + $old = strtolower( $old ); + + $new = $payment->status; + $new = empty( $new ) ? 'unknown' : $new; + $new = strtolower( $new ); + + $can_redirect = false; + + do_action( 'pronamic_payment_status_update_' . $payment->source . '_' . $old . '_to_' . $new, $payment, $can_redirect, $previous_status, $payment->status ); + do_action( 'pronamic_payment_status_update_' . $payment->source, $payment, $can_redirect, $previous_status, $payment->status ); + do_action( 'pronamic_payment_status_update', $payment, $can_redirect, $previous_status, $payment->status ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsModule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsModule.php new file mode 100644 index 00000000..21653209 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsModule.php @@ -0,0 +1,312 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * Payments Module + * + * @link https://woocommerce.com/2017/04/woocommerce-3-0-release/ + * @link https://woocommerce.wordpress.com/2016/10/27/the-new-crud-classes-in-woocommerce-2-7/ + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.0.1 + */ +class PaymentsModule { + /** + * Plugin. + * + * @var Plugin $plugin + */ + public $plugin; + + /** + * Privacy. + * + * @var PaymentsPrivacy + */ + public $privacy; + + /** + * Status checker. + * + * @var StatusChecker + */ + public $status_checker; + + /** + * Construct and initialize a payments module object. + * + * @param Plugin $plugin The plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Payments privacy exporters and erasers. + $this->privacy = new PaymentsPrivacy(); + + // Exclude payment notes. + add_filter( 'comments_clauses', array( $this, 'exclude_payment_comment_notes' ), 10, 2 ); + + // Payment redirect URL. + add_filter( 'pronamic_payment_redirect_url', array( $this, 'payment_redirect_url' ), 5, 2 ); + + // Listen to payment status changes so we can log these in a note. + add_action( 'pronamic_payment_status_update', array( $this, 'log_payment_status_update' ), 10, 4 ); + + // REST API. + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + + // Payment Status Checker. + $this->status_checker = new StatusChecker(); + } + + /** + * Comments clauses. + * + * @param array $clauses Array with query clauses for the comments query. + * @param \WP_Comment_Query $query A WordPress comment query object. + * + * @return array + */ + public function exclude_payment_comment_notes( $clauses, $query ) { + $type = $query->query_vars['type']; + + // Ignore payment notes comments if it's not specifically requested. + if ( 'payment_note' !== $type ) { + $clauses['where'] .= " AND comment_type != 'payment_note'"; + } + + return $clauses; + } + + /** + * Payment redirect URL filter. + * + * @param string $url A payment redirect URL. + * @param Payment $payment The payment to get a redirect URL for. + * + * @return string + */ + public function payment_redirect_url( $url, $payment ) { + $page_id = null; + + switch ( $payment->status ) { + case PaymentStatus::CANCELLED: + $page_id = pronamic_pay_get_page_id( 'cancel' ); + + break; + case PaymentStatus::EXPIRED: + $page_id = pronamic_pay_get_page_id( 'expired' ); + + break; + case PaymentStatus::FAILURE: + $page_id = pronamic_pay_get_page_id( 'error' ); + + break; + case PaymentStatus::OPEN: + $page_id = pronamic_pay_get_page_id( 'unknown' ); + + break; + case PaymentStatus::SUCCESS: + $page_id = pronamic_pay_get_page_id( 'completed' ); + + break; + default: + $page_id = pronamic_pay_get_page_id( 'unknown' ); + + break; + } + + if ( ! empty( $page_id ) ) { + $page_url = get_permalink( $page_id ); + + if ( false !== $page_url ) { + $url = $page_url; + } + } + + return $url; + } + + /** + * Get payment status update note. + * + * @param string|null $old_status Old meta status. + * @param string $new_status New meta status. + * @return string + */ + private function get_payment_status_update_note( $old_status, $new_status ) { + $old_label = $this->plugin->payments_data_store->get_meta_status_label( $old_status ); + $new_label = $this->plugin->payments_data_store->get_meta_status_label( $new_status ); + + if ( null === $old_status ) { + return sprintf( + /* translators: 1: new status */ + __( 'Payment created with status "%1$s".', 'pronamic_ideal' ), + esc_html( empty( $new_label ) ? $new_status : $new_label ) + ); + } + + return sprintf( + /* translators: 1: old status, 2: new status */ + __( 'Payment status changed from "%1$s" to "%2$s".', 'pronamic_ideal' ), + esc_html( empty( $old_label ) ? $old_status : $old_label ), + esc_html( empty( $new_label ) ? $new_status : $new_label ) + ); + } + + /** + * Payment status update. + * + * @param Payment $payment The status updated payment. + * @param bool $can_redirect Whether or not redirects should be performed. + * @param string|null $old_status Old meta status. + * @param string $new_status New meta status. + * + * @return void + */ + public function log_payment_status_update( $payment, $can_redirect, $old_status, $new_status ) { + $note = $this->get_payment_status_update_note( $old_status, $new_status ); + + $payment->add_note( $note ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * + * @return void + */ + public function rest_api_init() { + \register_rest_route( + 'pronamic-pay/v1', + '/payments/(?P\d+)', + array( + 'methods' => 'GET', + 'callback' => array( $this, 'rest_api_payment' ), + 'permission_callback' => function() { + return \current_user_can( 'edit_payments' ); + }, + 'args' => array( + 'payment_id' => array( + 'description' => __( 'Payment ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + ), + ) + ); + + register_rest_route( + 'pronamic-pay/v1', + '/gateways/(?P\d+)', + array( + 'methods' => 'GET', + 'callback' => array( $this, 'rest_api_gateway' ), + 'permission_callback' => function() { + return current_user_can( 'manage_options' ); + }, + 'args' => array( + 'config_id' => array( + 'description' => __( 'Gateway configuration ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + 'gateway_id' => array( + 'description' => __( 'Gateway ID.', 'pronamic_ideal' ), + 'type' => 'string', + ), + 'gateway_mode' => array( + 'description' => __( 'Gateway mode.', 'pronamic_ideal' ), + 'type' => 'string', + ), + ), + ) + ); + } + + /** + * REST API payment. + * + * @param \WP_REST_Request $request Request. + * @return object + */ + public function rest_api_payment( \WP_REST_Request $request ) { + $payment_id = $request->get_param( 'payment_id' ); + + $payment = \get_pronamic_payment( $payment_id ); + + if ( null === $payment ) { + return new \WP_Error( + 'pronamic-pay-payment-not-found', + \sprintf( + /* translators: %s: payment ID */ + \__( 'Could not find payment with ID `%s`.', 'pronamic_ideal' ), + $payment_id + ), + $payment_id + ); + } + + return $payment->get_json(); + } + + /** + * REST API gateway. + * + * @param \WP_REST_Request $request Request. + * @return object + */ + public function rest_api_gateway( \WP_REST_Request $request ) { + $config_id = $request->get_param( 'config_id' ); + $gateway_id = $request->get_param( 'gateway_id' ); + $gateway_mode = $request->get_param( 'gateway_mode' ); + + // Gateway. + $args = array( + 'gateway_id' => $gateway_id, + 'gateway_mode' => $gateway_mode, + ); + + $gateway = Plugin::get_gateway( $config_id, $args ); + + if ( empty( $gateway ) ) { + return new \WP_Error( + 'pronamic-pay-gateway-not-found', + sprintf( + /* translators: %s: Gateway configuration ID */ + __( 'Could not find gateway with ID `%s`.', 'pronamic_ideal' ), + $config_id + ), + $config_id + ); + } + + // Settings. + ob_start(); + + require __DIR__ . '/../../views/meta-box-gateway-settings.php'; + + $meta_box_settings = ob_get_clean(); + + // Object. + return (object) array( + 'config_id' => $config_id, + 'gateway_id' => $gateway_id, + 'gateway_mode' => $gateway_mode, + 'meta_boxes' => (object) array( + 'settings' => $meta_box_settings, + ), + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php new file mode 100644 index 00000000..26d16ffa --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/PaymentsPrivacy.php @@ -0,0 +1,246 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Pay\AddressHelper; +use Pronamic\WordPress\Pay\CustomerHelper; + +/** + * Payments Privacy class. + * + * @author Reüel van der Steege + * @version 2.1.0 + * @since 2.0.2 + */ +class PaymentsPrivacy { + /** + * Payments privacy constructor. + */ + public function __construct() { + // Register exporters. + add_action( 'pronamic_pay_privacy_register_exporters', array( $this, 'register_exporters' ) ); + + // Register erasers. + add_action( 'pronamic_pay_privacy_register_erasers', array( $this, 'register_erasers' ) ); + } + + /** + * Register privacy exporters. + * + * @param \Pronamic\WordPress\Pay\PrivacyManager $privacy_manager Privacy manager. + * + * @return void + */ + public function register_exporters( $privacy_manager ) { + // Payments export. + $privacy_manager->add_exporter( + 'payments', + __( 'Payments', 'pronamic_ideal' ), + array( $this, 'payments_export' ) + ); + } + + /** + * Register privacy erasers. + * + * @param \Pronamic\WordPress\Pay\PrivacyManager $privacy_manager Privacy manager. + * + * @return void + */ + public function register_erasers( $privacy_manager ) { + // Payments anonymizer. + $privacy_manager->add_eraser( + 'payments', + __( 'Payments', 'pronamic_ideal' ), + array( $this, 'payments_anonymizer' ) + ); + } + + /** + * Payments exporter. + * + * @param string $email_address Email address. + * @param int $page Page. + * + * @return array + */ + public function payments_export( $email_address, $page = 1 ) { + // Payments data store. + $data_store = pronamic_pay_plugin()->payments_data_store; + + // Privacy manager. + $privacy_manager = pronamic_pay_plugin()->privacy_manager; + + // Get payments. + // @todo use paging. + $payments = get_pronamic_payments_by_meta( + $data_store->meta_key_prefix . 'email', + $email_address + ); + + // Get registered meta keys for export. + $meta_keys = wp_list_filter( + $data_store->get_registered_meta(), + array( + 'privacy_export' => true, + ) + ); + + $items = array(); + + // Loop payments. + foreach ( $payments as $payment ) { + $export_data = array(); + + $id = $payment->get_id(); + + if ( empty( $id ) ) { + continue; + } + + $payment_meta = get_post_meta( $id ); + + // Get payment meta. + foreach ( $meta_keys as $meta_key => $meta_options ) { + $meta_key = $data_store->meta_key_prefix . $meta_key; + + if ( ! array_key_exists( $meta_key, $payment_meta ) ) { + continue; + } + + // Add export value. + $export_data[] = $privacy_manager->export_meta( $meta_key, $meta_options, $payment_meta ); + } + + // Add item to export data. + if ( ! empty( $export_data ) ) { + $items[] = array( + 'group_id' => 'pronamic-pay-payments', + 'group_label' => __( 'Payments', 'pronamic_ideal' ), + 'item_id' => 'pronamic-pay-payment-' . $id, + 'data' => $export_data, + ); + } + } + + // Return export data. + return array( + 'data' => $items, + 'done' => true, + ); + } + + /** + * Payments anonymizer. + * + * @param string $email_address Email address. + * @param int $page Page. + * + * @return array + */ + public function payments_anonymizer( $email_address, $page = 1 ) { + // Payments data store. + $data_store = pronamic_pay_plugin()->payments_data_store; + + // Privacy manager. + $privacy_manager = pronamic_pay_plugin()->privacy_manager; + + // Return values. + $items_removed = false; + $items_retained = false; + $messages = array(); + + // Get payments. + // @todo use paging. + $payments = get_pronamic_payments_by_meta( + $data_store->meta_key_prefix . 'email', + $email_address + ); + + // Get registered meta keys for erasure. + $meta_keys = wp_list_filter( + $data_store->get_registered_meta(), + array( + 'privacy_erasure' => null, + ), + 'NOT' + ); + + // Loop payments. + foreach ( $payments as $payment ) { + $payment_id = $payment->get_id(); + + if ( empty( $payment_id ) ) { + continue; + } + + $payment_meta = get_post_meta( $payment_id ); + + // Get payment meta. + foreach ( $meta_keys as $meta_key => $meta_options ) { + $meta_key = $data_store->meta_key_prefix . $meta_key; + + if ( ! array_key_exists( $meta_key, $payment_meta ) ) { + continue; + } + + $action = ( isset( $meta_options['privacy_erasure'] ) ? $meta_options['privacy_erasure'] : null ); + + $privacy_manager->erase_meta( $payment_id, $meta_key, $action ); + } + + // Customer. + $customer = $payment->get_customer(); + + if ( null !== $customer ) { + CustomerHelper::anonymize_customer( $customer ); + } + + // Billing Address. + $address = $payment->get_billing_address(); + + if ( null !== $address ) { + AddressHelper::anonymize_address( $address ); + } + + // Shipping Address. + $address = $payment->get_shipping_address(); + + if ( null !== $address ) { + AddressHelper::anonymize_address( $address ); + } + + // Set anonymized. + $payment->set_anonymized( true ); + + // Save. + $payment->save(); + + // Add payment note. + $payment->add_note( __( 'Payment anonymized for personal data erasure request.', 'pronamic_ideal' ) ); + + // Add message. + /* translators: %s: Payment ID */ + $messages[] = sprintf( __( 'Payment ID %s anonymized.', 'pronamic_ideal' ), $payment_id ); + + $items_removed = true; + } + + // Return results. + return array( + 'items_removed' => $items_removed, + 'items_retained' => $items_retained, + 'messages' => $messages, + 'done' => true, + ); + } + +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/SourceTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/SourceTrait.php new file mode 100644 index 00000000..63d41540 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/SourceTrait.php @@ -0,0 +1,76 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Privacy + */ + +namespace Pronamic\WordPress\Pay\Payments; + +/** + * Source Trait + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +trait SourceTrait { + /** + * Identifier for the source which started this payment info. + * For example: 'woocommerce', 'gravityforms', 'easydigitaldownloads', etc. + * + * @var string|null + */ + public $source; + + /** + * Unique ID at the source which started this payment info, for example: + * - WooCommerce order ID. + * - Easy Digital Downloads payment ID. + * - Gravity Forms entry ID. + * + * @var string|int|null + */ + public $source_id; + + /** + * Get the source identifier of this payment. + * + * @return string|null + */ + public function get_source() { + return $this->source; + } + + /** + * Set the source of this payment. + * + * @param string|null $source Source. + * @return void + */ + public function set_source( $source ) { + $this->source = $source; + } + + /** + * Get the source ID of this payment. + * + * @return string|int|null + */ + public function get_source_id() { + return $this->source_id; + } + + /** + * Set the source ID of this payment. + * + * @param string|int|null $source_id Source ID. + * @return void + */ + public function set_source_id( $source_id ) { + $this->source_id = $source_id; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/StatusChecker.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/StatusChecker.php new file mode 100644 index 00000000..6260e09e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Payments/StatusChecker.php @@ -0,0 +1,228 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Payments + */ + +namespace Pronamic\WordPress\Pay\Payments; + +use Pronamic\WordPress\Pay\Plugin; + +/** + * Status Checker + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class StatusChecker { + /** + * Construct a status checker. + */ + public function __construct() { + // Payment status check events are scheduled when payments are started. + add_action( 'pronamic_pay_payment_status_check', array( $this, 'check_status' ), 10, 2 ); + + // Deprecated `pronamic_ideal_check_transaction_status` hooks got scheduled to request the payment status. + add_action( 'pronamic_ideal_check_transaction_status', array( $this, 'check_transaction_status' ), 10, 3 ); + + // Clear scheduled status check once payment reaches a final status. + add_action( 'pronamic_payment_status_update', array( $this, 'maybe_clear_scheduled_status_check' ), 10, 1 ); + } + + /** + * Schedule event. + * + * @param Payment $payment The payment to schedule the status check event. + * + * @return void + */ + public static function schedule_event( $payment ) { + /* + * Schedule status requests + * http://pronamic.nl/wp-content/uploads/2011/12/iDEAL_Advanced_PHP_EN_V2.2.pdf (page 19) + * + * @todo + * Considering the number of status requests per transaction: + * - Maximum of five times per transaction; + * - Maximum of two times during the expirationPeriod; + * - After the expirationPeriod not more often than once per 60 minutes; + * - No status request after a final status has been received for a transaction; + * - No status request for transactions older than 7 days. + */ + + /* + * The function `wp_schedule_single_event` uses the arguments array as an key for the event, + * that's why we also add the time to this array, besides that it's also much clearer on + * the Cron View (http://wordpress.org/extend/plugins/cron-view/) page. + */ + + // Bail if payment already has a final status (e.g. failed payments). + $status = $payment->get_status(); + + if ( ! empty( $status ) && PaymentStatus::OPEN !== $status ) { + return; + } + + // Get delay seconds for first status check. + $delay = self::get_delay_seconds( 1, $payment->get_recurring() ); + + wp_schedule_single_event( + time() + $delay, + 'pronamic_pay_payment_status_check', + array( + 'payment_id' => $payment->get_id(), + 'try' => 1, + ) + ); + } + + /** + * Get the delay seconds for the specified try. + * + * @param int $try Which try/round to get the delay seconds for. + * @param bool|null $recurring Whether or not to use the delay scheme for recurring payments. + * + * @return int + */ + private static function get_delay_seconds( $try, $recurring = false ) { + // Delays for recurring payments. + if ( $recurring ) { + switch ( $try ) { + case 1: + return 15 * MINUTE_IN_SECONDS; + + case 2: + return 5 * DAY_IN_SECONDS; + + case 3: + return 10 * DAY_IN_SECONDS; + + case 4: + default: + return 14 * DAY_IN_SECONDS; + } + } + + // Delays for regular payments. + switch ( $try ) { + case 1: + return 15 * MINUTE_IN_SECONDS; + + case 2: + return 30 * MINUTE_IN_SECONDS; + + case 3: + return HOUR_IN_SECONDS; + + case 4: + default: + return DAY_IN_SECONDS; + } + } + + /** + * Backwards compatible transaction status check. + * + * @param integer $payment_id The ID of a payment to check. + * @param integer $seconds The number of seconds this status check was delayed. + * @param integer $number_tries The number of status check tries. + * + * @return void + * + * @deprecated 2.1.6 In favor of event `pronamic_pay_payment_status_check`. + */ + public function check_transaction_status( $payment_id = null, $seconds = null, $number_tries = 1 ) { + $this->check_status( $payment_id, $number_tries ); + } + + /** + * Check status of the specified payment. + * + * @param integer $payment_id The payment ID to check. + * @param integer $try The try number for this status check. + * + * @return void + */ + public function check_status( $payment_id = null, $try = 1 ) { + $payment = get_pronamic_payment( $payment_id ); + + // No payment found, unable to check status. + if ( null === $payment ) { + return; + } + + // http://pronamic.nl/wp-content/uploads/2011/12/iDEAL_Advanced_PHP_EN_V2.2.pdf (page 19) + // - No status request after a final status has been received for a transaction. + if ( ! empty( $payment->status ) && PaymentStatus::OPEN !== $payment->status ) { + return; + } + + // Add note. + $note = sprintf( + /* translators: %s: Pronamic Pay */ + __( 'Payment status check at gateway by %s.', 'pronamic_ideal' ), + __( 'Pronamic Pay', 'pronamic_ideal' ) + ); + + $payment->add_note( $note ); + + // Update payment. + Plugin::update_payment( $payment ); + + // Limit number of tries. + if ( 4 === $try ) { + return; + } + + // Schedule check if no final status has been received. + $status = $payment->get_status(); + + if ( empty( $status ) || PaymentStatus::OPEN === $status ) { + $next_try = ( $try + 1 ); + + // Get delay seconds for next status check. + $delay = self::get_delay_seconds( $next_try, $payment->get_recurring() ); + + wp_schedule_single_event( + time() + $delay, + 'pronamic_pay_payment_status_check', + array( + 'payment_id' => $payment->get_id(), + 'try' => $next_try, + ) + ); + } + } + + /** + * Maybe clear scheduled status check. + * + * @param Payment $payment Payment to maybe clear scheduled status checks for. + * + * @return void + */ + public function maybe_clear_scheduled_status_check( $payment ) { + $status = $payment->get_status(); + + // Bail if payment does not have a final payment status. + if ( empty( $status ) || PaymentStatus::OPEN === $status ) { + return; + } + + // Clear scheduled hooks for all 4 tries. + $args = array( + 'payment_id' => $payment->get_id(), + ); + + foreach ( range( 1, 4 ) as $try ) { + $args['try'] = $try; + + wp_clear_scheduled_hook( 'pronamic_pay_payment_status_check', $args ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Plugin.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Plugin.php new file mode 100644 index 00000000..7d2bc533 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Plugin.php @@ -0,0 +1,1113 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\Pay\Admin\AdminModule; +use Pronamic\WordPress\Pay\Banks\BankAccountDetails; +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentPostType; +use Pronamic\WordPress\Pay\Payments\StatusChecker; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPostType; +use Pronamic\WordPress\Pay\Webhooks\WebhookLogger; +use WP_Error; +use WP_Query; + +/** + * Plugin + * + * @author Remco Tolsma + * @version 2.5.1 + * @since 2.0.1 + */ +class Plugin { + /** + * Version. + * + * @var string + */ + private $version = ''; + + /** + * The root file of this WordPress plugin + * + * @var string + */ + public static $file; + + /** + * The plugin dirname + * + * @var string + */ + public static $dirname; + + /** + * The timezone + * + * @var string + */ + const TIMEZONE = 'UTC'; + + /** + * Instance. + * + * @var Plugin|null + */ + protected static $instance; + + /** + * Instance. + * + * @param string|array|object $args The plugin arguments. + * + * @return Plugin + */ + public static function instance( $args = array() ) { + if ( is_null( self::$instance ) ) { + self::$instance = new self( $args ); + } + + return self::$instance; + } + + /** + * Plugin settings. + * + * @var Settings + */ + public $settings; + + /** + * Payment data storing. + * + * @var Payments\PaymentsDataStoreCPT + */ + public $payments_data_store; + + /** + * Subscription data storing. + * + * @var Subscriptions\SubscriptionsDataStoreCPT + */ + public $subscriptions_data_store; + + /** + * Gateway post type. + * + * @var GatewayPostType + */ + public $gateway_post_type; + + /** + * Payment post type. + * + * @var PaymentPostType + */ + public $payment_post_type; + + /** + * Subscription post type. + * + * @var SubscriptionPostType + */ + public $subscription_post_type; + + /** + * Licence manager. + * + * @var LicenseManager + */ + public $license_manager; + + /** + * Privacy manager. + * + * @var PrivacyManager + */ + public $privacy_manager; + + /** + * Admin module. + * + * @var AdminModule + */ + public $admin; + + /** + * Blocks module. + * + * @var Blocks\BlocksModule + */ + public $blocks_module; + + /** + * Forms module. + * + * @var Forms\FormsModule + */ + public $forms_module; + + /** + * Tracking module. + * + * @var TrackingModule + */ + public $tracking_module; + + /** + * Payments module. + * + * @var Payments\PaymentsModule + */ + public $payments_module; + + /** + * Subsciptions module. + * + * @var Subscriptions\SubscriptionsModule + */ + public $subscriptions_module; + + /** + * Google analytics ecommerce. + * + * @var GoogleAnalyticsEcommerce + */ + public $google_analytics_ecommerce; + + /** + * Gateway integrations. + * + * @var GatewayIntegrations + */ + public $gateway_integrations; + + /** + * Integrations + * + * @var AbstractIntegration[] + */ + public $integrations; + + /** + * Webhook logger. + * + * @var WebhookLogger + */ + private $webhook_logger; + + /** + * Options. + * + * @var array + */ + private $options; + + /** + * Plugin integrations. + * + * @var array + */ + public $plugin_integrations; + + /** + * Construct and initialize an Pronamic Pay plugin object. + * + * @param string|array|object $args The plugin arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'file' => null, + 'options' => array(), + ) + ); + + // Version from plugin file header. + if ( null !== $args['file'] ) { + $file_data = get_file_data( $args['file'], array( 'Version' => 'Version' ) ); + + if ( \array_key_exists( 'Version', $file_data ) ) { + $this->version = $file_data['Version']; + } + } + + // Backward compatibility. + self::$file = $args['file']; + self::$dirname = dirname( self::$file ); + + // Options. + $this->options = $args['options']; + + // Integrations. + $this->integrations = array(); + + /* + * Plugins loaded. + * + * Priority should be at least lower then 8 to support the "WP eCommerce" plugin. + * + * new WP_eCommerce() + * add_action( 'plugins_loaded' , array( $this, 'init' ), 8 ); + * $this->load(); + * wpsc_core_load_gateways(); + * + * @link https://github.com/wp-e-commerce/WP-e-Commerce/blob/branch-3.11.2/wp-shopping-cart.php#L342-L343 + * @link https://github.com/wp-e-commerce/WP-e-Commerce/blob/branch-3.11.2/wp-shopping-cart.php#L26-L35 + * @link https://github.com/wp-e-commerce/WP-e-Commerce/blob/branch-3.11.2/wp-shopping-cart.php#L54 + * @link https://github.com/wp-e-commerce/WP-e-Commerce/blob/branch-3.11.2/wp-shopping-cart.php#L296-L297 + */ + add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ), 0 ); + + // Plugin locale. + add_filter( 'plugin_locale', array( $this, 'plugin_locale' ), 10, 2 ); + + // Register styles. + add_action( 'init', array( $this, 'register_styles' ), 9 ); + + // If WordPress is loaded check on returns and maybe redirect requests. + add_action( 'wp_loaded', array( $this, 'handle_returns' ), 10 ); + add_action( 'wp_loaded', array( $this, 'maybe_redirect' ), 10 ); + + // Default date time format. + add_filter( 'pronamic_datetime_default_format', array( $this, 'datetime_format' ), 10, 1 ); + } + + /** + * Get the version number of this plugin. + * + * @return string The version number of this plugin. + */ + public function get_version() { + return $this->version; + } + + /** + * Get plugin file path. + * + * @return string + */ + public function get_file() { + return self::$file; + } + + /** + * Get option. + * + * @param string $option Name of option to retrieve. + * @return string|null + */ + public function get_option( $option ) { + if ( array_key_exists( $option, $this->options ) ) { + return $this->options[ $option ]; + } + + return null; + } + + /** + * Get the plugin dir path. + * + * @return string + */ + public function get_plugin_dir_path() { + return plugin_dir_path( $this->get_file() ); + } + + /** + * Update payment. + * + * @param Payment $payment The payment to update. + * @param bool $can_redirect Flag to indicate if redirect is allowed after the payment update. + * @return void + */ + public static function update_payment( $payment = null, $can_redirect = true ) { + if ( empty( $payment ) ) { + return; + } + + // Gateway. + $gateway = self::get_gateway( $payment->config_id ); + + if ( empty( $gateway ) ) { + return; + } + + // Update status. + $gateway->update_status( $payment ); + + // Add gateway errors as payment notes. + $error = $gateway->get_error(); + + if ( $error instanceof WP_Error ) { + foreach ( $error->get_error_codes() as $code ) { + $payment->add_note( sprintf( '%s: %s', $code, $error->get_error_message( $code ) ) ); + } + } + + // Update payment in data store. + $payment->save(); + + // Maybe redirect. + if ( ! $can_redirect ) { + return; + } + + /* + * If WordPress is doing cron we can't redirect. + * + * @link https://github.com/pronamic/wp-pronamic-ideal/commit/bb967a3e7804ecfbd83dea110eb8810cbad097d7 + * @link https://github.com/pronamic/wp-pronamic-ideal/commit/3ab4a7c1fc2cef0b6f565f8205da42aa1203c3c5 + */ + if ( Core_Util::doing_cron() ) { + return; + } + + /* + * If WordPress CLI is runnig we can't redirect. + * + * @link https://basecamp.com/1810084/projects/10966871/todos/346407847 + * @link https://github.com/woocommerce/woocommerce/blob/3.5.3/includes/class-woocommerce.php#L381-L383 + */ + if ( defined( 'WP_CLI' ) && WP_CLI ) { + return; + } + + // Redirect. + $url = $payment->get_return_redirect_url(); + + wp_redirect( $url ); + + exit; + } + + /** + * Handle returns. + * + * @return void + */ + public function handle_returns() { + if ( ! filter_has_var( INPUT_GET, 'payment' ) ) { + return; + } + + $payment_id = filter_input( INPUT_GET, 'payment', FILTER_SANITIZE_NUMBER_INT ); + + $payment = get_pronamic_payment( $payment_id ); + + if ( null === $payment ) { + return; + } + + // Check if payment key is valid. + $valid_key = false; + + if ( empty( $payment->key ) ) { + $valid_key = true; + } elseif ( filter_has_var( INPUT_GET, 'key' ) ) { + $key = filter_input( INPUT_GET, 'key', FILTER_SANITIZE_STRING ); + + $valid_key = ( $key === $payment->key ); + } + + if ( ! $valid_key ) { + wp_safe_redirect( home_url() ); + + exit; + } + + // Check if we should redirect. + $should_redirect = apply_filters( 'pronamic_pay_return_should_redirect', true, $payment ); + + try { + self::update_payment( $payment, $should_redirect ); + } catch ( \Exception $e ) { + self::render_exception( $e ); + + exit; + } + } + + /** + * Maybe redirect. + * + * @return void + */ + public function maybe_redirect() { + if ( ! filter_has_var( INPUT_GET, 'payment_redirect' ) || ! filter_has_var( INPUT_GET, 'key' ) ) { + return; + } + + // Get payment. + $payment_id = filter_input( INPUT_GET, 'payment_redirect', FILTER_SANITIZE_NUMBER_INT ); + + $payment = get_pronamic_payment( $payment_id ); + + if ( null === $payment ) { + return; + } + + // Validate key. + $key = filter_input( INPUT_GET, 'key', FILTER_SANITIZE_STRING ); + + if ( $key !== $payment->key || empty( $payment->key ) ) { + return; + } + + // Don't cache. + Core_Util::no_cache(); + + // Handle redirect message from payment meta. + $redirect_message = $payment->get_meta( 'payment_redirect_message' ); + + if ( ! empty( $redirect_message ) ) { + require self::$dirname . '/views/redirect-message.php'; + + exit; + } + + $gateway = self::get_gateway( $payment->config_id ); + + if ( $gateway ) { + // Give gateway a chance to handle redirect. + $gateway->payment_redirect( $payment ); + + // Handle HTML form redirect. + if ( $gateway->is_html_form() ) { + $gateway->start( $payment ); + + $error = $gateway->get_error(); + + if ( $error instanceof WP_Error ) { + self::render_errors( $error ); + } else { + $gateway->redirect( $payment ); + } + } + } + + // Redirect to payment action URL. + if ( ! empty( $payment->action_url ) ) { + wp_redirect( $payment->action_url ); + + exit; + } + } + + /** + * Get number payments. + * + * @link https://developer.wordpress.org/reference/functions/wp_count_posts/ + * + * @return int|false + */ + public static function get_number_payments() { + $number = false; + + $count = wp_count_posts( 'pronamic_payment' ); + + if ( isset( $count->payment_completed ) ) { + $number = intval( $count->payment_completed ); + } + + return $number; + } + + /** + * Plugins loaded. + * + * @link https://developer.wordpress.org/reference/hooks/plugins_loaded/ + * @link https://developer.wordpress.org/reference/functions/load_plugin_textdomain/ + * @return void + */ + public function plugins_loaded() { + // Load plugin text domain. + $rel_path = dirname( plugin_basename( self::$file ) ); + + load_plugin_textdomain( 'pronamic_ideal', false, $rel_path . '/languages' ); + + load_plugin_textdomain( 'pronamic-money', false, $rel_path . '/vendor/pronamic/wp-money/languages' ); + + // Settings. + $this->settings = new Settings( $this ); + + // Data Stores. + $this->payments_data_store = new Payments\PaymentsDataStoreCPT(); + $this->subscriptions_data_store = new Subscriptions\SubscriptionsDataStoreCPT(); + + $this->payments_data_store->setup(); + $this->subscriptions_data_store->setup(); + + // Post Types. + $this->gateway_post_type = new GatewayPostType(); + $this->payment_post_type = new PaymentPostType(); + $this->subscription_post_type = new SubscriptionPostType(); + + // License Manager. + $this->license_manager = new LicenseManager( $this ); + + // Privacy Manager. + $this->privacy_manager = new PrivacyManager(); + + // Webhook Logger. + $this->webhook_logger = new WebhookLogger(); + $this->webhook_logger->setup(); + + // Modules. + $this->forms_module = new Forms\FormsModule( $this ); + $this->payments_module = new Payments\PaymentsModule( $this ); + $this->subscriptions_module = new Subscriptions\SubscriptionsModule( $this ); + $this->tracking_module = new TrackingModule(); + + // Blocks module. + if ( function_exists( 'register_block_type' ) ) { + $this->blocks_module = new Blocks\BlocksModule(); + $this->blocks_module->setup(); + } + + // Google Analytics Ecommerce. + $this->google_analytics_ecommerce = new GoogleAnalyticsEcommerce(); + + // Admin. + if ( is_admin() ) { + $this->admin = new Admin\AdminModule( $this ); + } + + // Gateway Integrations. + $gateways = apply_filters( 'pronamic_pay_gateways', array() ); + + $this->gateway_integrations = new GatewayIntegrations( $gateways ); + + foreach ( $this->gateway_integrations as $integration ) { + $integration->setup(); + } + + // Plugin Integrations. + $this->plugin_integrations = apply_filters( 'pronamic_pay_plugin_integrations', array() ); + + foreach ( $this->plugin_integrations as $integration ) { + $integration->setup(); + } + + // Integrations. + $gateway_integrations = \iterator_to_array( $this->gateway_integrations ); + + $this->integrations = array_merge( $gateway_integrations, $this->plugin_integrations ); + + // Maybes. + PaymentMethods::maybe_update_active_payment_methods(); + + // Filters. + \add_filter( 'pronamic_payment_redirect_url', array( $this, 'payment_redirect_url' ), 10, 2 ); + } + + /** + * Filter plugin locale. + * + * @param string $locale A WordPress locale identifier. + * @param string $domain A WordPress text domain indentifier. + * + * @return string + */ + public function plugin_locale( $locale, $domain ) { + if ( 'pronamic_ideal' !== $domain ) { + return $locale; + } + + if ( 'nl_NL_formal' === $locale ) { + return 'nl_NL'; + } + + if ( 'nl_BE' === $locale ) { + return 'nl_NL'; + } + + return $locale; + } + + /** + * Default date time format. + * + * @param string $format Format. + * + * @return string + */ + public function datetime_format( $format ) { + $format = _x( 'D j M Y \a\t H:i', 'default datetime format', 'pronamic_ideal' ); + + return $format; + } + + /** + * Get default error message. + * + * @return string + */ + public static function get_default_error_message() { + return __( 'Something went wrong with the payment. Please try again later or pay another way.', 'pronamic_ideal' ); + } + + /** + * Register styles. + * + * @since 2.1.6 + * @return void + */ + public function register_styles() { + $min = SCRIPT_DEBUG ? '' : '.min'; + + wp_register_style( + 'pronamic-pay-redirect', + plugins_url( 'css/redirect' . $min . '.css', dirname( __FILE__ ) ), + array(), + $this->get_version() + ); + } + + /** + * Get config select options. + * + * @param null|string $payment_method The gateway configuration options for the specified payment method. + * + * @return array + */ + public static function get_config_select_options( $payment_method = null ) { + $args = array( + 'post_type' => 'pronamic_gateway', + 'orderby' => 'post_title', + 'order' => 'ASC', + 'nopaging' => true, + ); + + if ( null !== $payment_method ) { + $config_ids = PaymentMethods::get_config_ids( $payment_method ); + + $args['post__in'] = empty( $config_ids ) ? array( 0 ) : $config_ids; + } + + $query = new WP_Query( $args ); + + $options = array( __( '— Select Configuration —', 'pronamic_ideal' ) ); + + foreach ( $query->posts as $post ) { + $id = $post->ID; + + $options[ $id ] = sprintf( + '%s (%s)', + get_the_title( $id ), + get_post_meta( $id, '_pronamic_gateway_mode', true ) + ); + } + + return $options; + } + + /** + * Render errors. + * + * @param array|WP_Error $errors An array with errors to render. + * @return void + */ + public static function render_errors( $errors = array() ) { + if ( ! is_array( $errors ) ) { + $errors = array( $errors ); + } + + foreach ( $errors as $pay_error ) { + include self::$dirname . '/views/error.php'; + } + } + + /** + * Render exception. + * + * @param \Exception $exception An exception. + * @return void + */ + public static function render_exception( \Exception $exception ) { + include self::$dirname . '/views/exception.php'; + } + + /** + * Get gateway. + * + * @link https://wordpress.org/support/article/post-status/#default-statuses + * + * @param string|integer|boolean|null $config_id A gateway configuration ID. + * @param array $args Extra arguments. + * + * @return null|Gateway + */ + public static function get_gateway( $config_id, $args = array() ) { + // Check for 0, false, null and other empty values. + if ( empty( $config_id ) ) { + return null; + } + + $config_id = intval( $config_id ); + + // Check if config is trashed. + if ( 'trash' === get_post_status( $config_id ) ) { + return null; + } + + // Arguments. + $args = wp_parse_args( + $args, + array( + 'gateway_id' => get_post_meta( $config_id, '_pronamic_gateway_id', true ), + 'mode' => get_post_meta( $config_id, '_pronamic_gateway_mode', true ), + ) + ); + + // Get config. + $gateway_id = $args['gateway_id']; + $mode = $args['mode']; + + $integration = pronamic_pay_plugin()->gateway_integrations->get_integration( $gateway_id ); + + if ( null === $integration ) { + return null; + } + + $gateway = $integration->get_gateway( $config_id ); + + return $gateway; + } + + /** + * Complement payment. + * + * @param Payment $payment Payment. + * @return void + */ + private static function complement_payment( Payment $payment ) { + // Entrance Code. + if ( null === $payment->entrance_code ) { + $payment->entrance_code = uniqid(); + } + + // Key. + if ( null === $payment->key ) { + $payment->key = uniqid( 'pay_' ); + } + + // User ID. + if ( null === $payment->user_id && is_user_logged_in() ) { + $payment->user_id = get_current_user_id(); + } + + $origin_id = $payment->get_origin_id(); + + if ( null === $origin_id ) { + // Queried object. + $queried_object = \get_queried_object(); + $queried_object_id = \get_queried_object_id(); + + if ( null !== $queried_object && $queried_object_id > 0 ) { + $origin_id = $queried_object_id; + } + + // Referer. + $referer = \wp_get_referer(); + + if ( null === $origin_id && false !== $referer ) { + $post_id = \url_to_postid( $referer ); + + if ( $post_id > 0 ) { + $origin_id = $post_id; + } + } + + // Set origin ID. + $payment->set_origin_id( $origin_id ); + } + + // Google Analytics client ID. + if ( null === $payment->analytics_client_id ) { + $payment->analytics_client_id = GoogleAnalyticsEcommerce::get_cookie_client_id(); + } + + // Customer. + $customer = $payment->get_customer(); + + if ( null === $customer ) { + $customer = new Customer(); + + $payment->set_customer( $customer ); + } + + CustomerHelper::complement_customer( $customer ); + + // Email. + if ( null === $payment->get_email() ) { + $payment->email = $customer->get_email(); + } + + // Billing address. + $billing_address = $payment->get_billing_address(); + + if ( null !== $billing_address ) { + AddressHelper::complement_address( $billing_address ); + } + + // Shipping address. + $shipping_address = $payment->get_shipping_address(); + + if ( null !== $shipping_address ) { + AddressHelper::complement_address( $shipping_address ); + } + + // Version. + if ( null === $payment->get_version() ) { + $payment->set_version( pronamic_pay_plugin()->get_version() ); + } + + // Mode. + $config_id = $payment->get_config_id(); + + if ( null === $payment->get_mode() && null !== $config_id ) { + $mode = get_post_meta( $config_id, '_pronamic_gateway_mode', true ); + + $payment->set_mode( $mode ); + } + + // Issuer. + if ( null === $payment->issuer ) { + // Credit card. + if ( PaymentMethods::CREDIT_CARD === $payment->method && filter_has_var( INPUT_POST, 'pronamic_credit_card_issuer_id' ) ) { + $payment->issuer = filter_input( INPUT_POST, 'pronamic_credit_card_issuer_id', FILTER_SANITIZE_STRING ); + } + + // iDEAL. + $ideal_methods = array( PaymentMethods::IDEAL, PaymentMethods::DIRECT_DEBIT_IDEAL ); + + if ( \in_array( $payment->method, $ideal_methods, true ) && filter_has_var( INPUT_POST, 'pronamic_ideal_issuer_id' ) ) { + $payment->issuer = filter_input( INPUT_POST, 'pronamic_ideal_issuer_id', FILTER_SANITIZE_STRING ); + } + } + + /** + * If an issuer has been specified and the payment + * method is unknown, we set the payment method to + * iDEAL. This may not be correct in all cases, + * but for now Pronamic Pay works this way. + * + * @link https://github.com/wp-pay-extensions/gravityforms/blob/2.4.0/src/Processor.php#L251-L256 + * @link https://github.com/wp-pay-extensions/contact-form-7/blob/1.0.0/src/Pronamic.php#L181-L187 + * @link https://github.com/wp-pay-extensions/formidable-forms/blob/2.1.0/src/Extension.php#L318-L329 + * @link https://github.com/wp-pay-extensions/ninjaforms/blob/1.2.0/src/PaymentGateway.php#L80-L83 + * @link https://github.com/wp-pay/core/blob/2.4.0/src/Forms/FormProcessor.php#L131-L134 + */ + if ( null !== $payment->issuer && null === $payment->method ) { + $payment->method = PaymentMethods::IDEAL; + } + + // Consumer bank details. + $consumer_bank_details = $payment->get_consumer_bank_details(); + + if ( null === $consumer_bank_details ) { + $consumer_bank_details = new BankAccountDetails(); + } + + if ( null === $consumer_bank_details->get_name() && filter_has_var( INPUT_POST, 'pronamic_pay_consumer_bank_details_name' ) ) { + $consumer_bank_details->set_name( filter_input( INPUT_POST, 'pronamic_pay_consumer_bank_details_name', FILTER_SANITIZE_STRING ) ); + } + + if ( null === $consumer_bank_details->get_iban() && filter_has_var( INPUT_POST, 'pronamic_pay_consumer_bank_details_iban' ) ) { + $consumer_bank_details->set_iban( filter_input( INPUT_POST, 'pronamic_pay_consumer_bank_details_iban', FILTER_SANITIZE_STRING ) ); + } + + $payment->set_consumer_bank_details( $consumer_bank_details ); + + // Payment lines payment. + $lines = $payment->get_lines(); + + if ( null !== $lines ) { + foreach ( $lines as $line ) { + $line->set_payment( $payment ); + } + } + } + + /** + * Start payment. + * + * @param Payment $payment The payment to start at the specified gateway. + * @param Gateway $gateway The gateway to start the payment at. + * + * @return Payment + * + * @throws \Exception Throws exception if gateway payment start fails. + */ + public static function start_payment( Payment $payment, $gateway = null ) { + global $pronamic_ideal; + + // Complement payment. + self::complement_payment( $payment ); + + /** + * Filters the payment gateway configuration ID. + * + * @param int $configuration_id Gateway configuration ID. + * @param Payment $payment The payment resource data. + */ + $config_id = \apply_filters( 'pronamic_payment_gateway_configuration_id', $payment->get_config_id(), $payment ); + + $payment->set_config_id( $config_id ); + + // Create payment. + $pronamic_ideal->payments_data_store->create( $payment ); + + // Prevent payment start at gateway if amount is empty. + $amount = $payment->get_total_amount()->get_value(); + + if ( empty( $amount ) ) { + $payment->set_status( PaymentStatus::SUCCESS ); + + $payment->save(); + + /** + * Return or throw exception? + * + * @link https://github.com/wp-pay/core/commit/aa6422f0963d9718edd11ac41edbadfd6cd07d49 + * @todo Throw exception? + */ + + return $payment; + } + + // Gateway. + $gateway = self::get_gateway( $payment->get_config_id() ); + + if ( null === $gateway ) { + $payment->set_status( PaymentStatus::FAILURE ); + + $payment->save(); + + return $payment; + } + + // Recurring. + if ( true === $payment->get_recurring() && ! $gateway->supports( 'recurring' ) ) { + throw new \Exception( 'Gateway does not support recurring payments.' ); + } + + // Start payment at the gateway. + try { + $gateway->start( $payment ); + + // Add gateway errors as payment notes. + $error = $gateway->get_error(); + + if ( $error instanceof \WP_Error ) { + $message = $error->get_error_message(); + $code = $error->get_error_code(); + + if ( ! \is_int( $code ) ) { + $message = sprintf( '%s: %s', $code, $message ); + $code = 0; + } + + throw new \Exception( $message, $code ); + } + } catch ( \Exception $error ) { + $message = $error->getMessage(); + + // Maybe include error code in message. + $code = $error->getCode(); + + if ( $code > 0 ) { + $message = \sprintf( '%s: %s', $code, $message ); + } + + // Add note. + $payment->add_note( $message ); + + // Set payment status. + $payment->set_status( PaymentStatus::FAILURE ); + } + + // Save payment. + $payment->save(); + + // Schedule payment status check. + if ( $gateway->supports( 'payment_status_request' ) ) { + StatusChecker::schedule_event( $payment ); + } + + // Throw/rethrow exception. + if ( $error instanceof \Exception ) { + throw $error; + } + + return $payment; + } + + /** + * Get pages. + * + * @return array + */ + public function get_pages() { + $return = array(); + + $pages = array( + 'completed' => __( 'Completed', 'pronamic_ideal' ), + 'cancel' => __( 'Canceled', 'pronamic_ideal' ), + 'expired' => __( 'Expired', 'pronamic_ideal' ), + 'error' => __( 'Error', 'pronamic_ideal' ), + 'unknown' => __( 'Unknown', 'pronamic_ideal' ), + ); + + foreach ( $pages as $key => $label ) { + $id = sprintf( 'pronamic_pay_%s_page_id', $key ); + + $return[ $id ] = $label; + } + + return $return; + } + + /** + * Payment redirect URL. + * + * @param string $url Redirect URL. + * @param Payment $payment Payment. + * @return string + */ + public function payment_redirect_url( $url, Payment $payment ) { + $url = \apply_filters( 'pronamic_payment_redirect_url_' . $payment->get_source(), $url, $payment ); + + return $url; + } + + /** + * Is debug mode. + * + * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/2.9.26/includes/misc-functions.php#L26-L38 + * @return bool True if debug mode is enabled, false otherwise. + */ + public function is_debug_mode() { + $value = \get_option( 'pronamic_pay_debug_mode', false ); + + if ( PRONAMIC_PAY_DEBUG ) { + $value = true; + } + + return (bool) $value; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Privacy/AnonymizedTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Privacy/AnonymizedTrait.php new file mode 100644 index 00000000..65b86c94 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Privacy/AnonymizedTrait.php @@ -0,0 +1,46 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Privacy + */ + +namespace Pronamic\WordPress\Pay\Privacy; + +/** + * Anonymized Trait + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +trait AnonymizedTrait { + /** + * Is anonymized. + * + * @var bool|null + */ + private $anonymized; + + /** + * Is anonymized? + * + * @return bool + */ + public function is_anonymized() { + return ( true === $this->anonymized ); + } + + /** + * Set anonymized. + * + * @param bool|null $anonymized Anonymized. + * @return void + */ + public function set_anonymized( $anonymized ) { + $this->anonymized = $anonymized; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/PrivacyManager.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/PrivacyManager.php new file mode 100644 index 00000000..eb241e9c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/PrivacyManager.php @@ -0,0 +1,292 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Exception; + +/** + * Class PrivacyManager + * + * @version 2.0.5 + */ +class PrivacyManager { + /** + * Exporters. + * + * @var array + */ + private $exporters = array(); + + /** + * Erasers. + * + * @var array + */ + private $erasers = array(); + + /** + * Privacy manager constructor. + */ + public function __construct() { + // Filters. + add_filter( 'wp_privacy_personal_data_exporters', array( $this, 'register_exporters' ), 10 ); + add_filter( 'wp_privacy_personal_data_erasers', array( $this, 'register_erasers' ), 10 ); + add_filter( 'wp_privacy_anonymize_data', array( $this, 'anonymize_custom_data_types' ), 10, 3 ); + } + + /** + * Register exporters. + * + * @param array $exporters Privacy exporters. + * @return array + */ + public function register_exporters( $exporters ) { + do_action( 'pronamic_pay_privacy_register_exporters', $this ); + + foreach ( $this->exporters as $id => $exporter ) { + $exporters[ $id ] = $exporter; + } + + return $exporters; + } + + /** + * Register erasers. + * + * @param array $erasers Privacy erasers. + * @return array + */ + public function register_erasers( $erasers ) { + do_action( 'pronamic_pay_privacy_register_erasers', $this ); + + foreach ( $this->erasers as $id => $eraser ) { + $erasers[ $id ] = $eraser; + } + + return $erasers; + } + + /** + * Add exporter. + * + * @param string $id ID of the exporter. + * @param string $name Exporter name. + * @param array $callback Exporter callback. + * @return void + */ + public function add_exporter( $id, $name, $callback ) { + $id = 'pronamic-pay-' . $id; + + $this->exporters[ $id ] = array( + 'exporter_friendly_name' => $name, + 'callback' => $callback, + ); + } + + /** + * Add eraser. + * + * @param string $id ID of the eraser. + * @param string $name Eraser name. + * @param array $callback Eraser callback. + * @return void + */ + public function add_eraser( $id, $name, $callback ) { + $id = 'pronamic-pay-' . $id; + + $this->erasers[ $id ] = array( + 'eraser_friendly_name' => $name, + 'callback' => $callback, + ); + } + + /** + * Export meta. + * + * @param string $meta_key Meta key. + * @param array $meta_options Registered meta options. + * @param array $meta_values Array with all post meta for item. + * + * @return array + */ + public function export_meta( $meta_key, $meta_options, $meta_values ) { + // Label. + $label = $meta_key; + + if ( isset( $meta_options['label'] ) ) { + $label = $meta_options['label']; + } + + // Meta value. + $meta_value = $meta_values[ $meta_key ]; + + if ( 1 === count( $meta_value ) ) { + $meta_value = array_shift( $meta_value ); + } else { + $meta_value = wp_json_encode( $meta_value ); + } + + // Return export data. + return array( + 'name' => $label, + 'value' => $meta_value, + ); + } + + /** + * Erase meta. + * + * @param int $post_id ID of the post. + * @param string $meta_key Meta key to erase. + * @param string $action Action 'erase' or 'anonymize'. + * @return void + */ + public function erase_meta( $post_id, $meta_key, $action = 'erase' ) { + switch ( $action ) { + case 'erase': + delete_post_meta( $post_id, $meta_key ); + + break; + case 'anonymize': + $meta_value = get_post_meta( $post_id, $meta_key, true ); + + // Mask email addresses. + if ( false !== strpos( $meta_value, '@' ) ) { + $meta_value = self::mask_email( $meta_value ); + } + + update_post_meta( $post_id, $meta_key, $meta_value ); + + break; + } + } + + /** + * Mask email address. + * + * @param string $email Email address. + * @return string + */ + public static function mask_email( $email ) { + // Is this an email address? + if ( ! is_string( $email ) || false === strpos( $email, '@' ) ) { + return $email; + } + + $parts = explode( '@', $email ); + + // Local part. + $local = $parts[0]; + + if ( strlen( $local ) > 2 ) { + $local = sprintf( + '%1$s%2$s%3$s', + substr( $local, 0, 1 ), + str_repeat( '*', ( strlen( $local ) - 2 ) ), + substr( $local, - 1 ) + ); + } + + // Domain part. + $domain_parts = explode( '.', $parts[1] ); + + $domain = array(); + + foreach ( $domain_parts as $part ) { + if ( strlen( $part ) <= 2 ) { + $domain[] = $part; + + continue; + } + + $domain[] = sprintf( + '%1$s%2$s%3$s', + substr( $part, 0, 1 ), + str_repeat( '*', ( strlen( $part ) - 2 ) ), + substr( $part, - 1 ) + ); + } + + // Combine local and domain part. + $email = sprintf( + '%1$s@%2$s', + $local, + implode( '.', $domain ) + ); + + return $email; + } + + /** + * Anonymize data. + * + * @link https://github.com/WordPress/WordPress/blob/4.9.8/wp-includes/functions.php#L5932-L5978 + * + * @param string $type The type of data to be anonymized. + * @param string|null $data Optional The data to be anonymized. + * @return string|null The anonymous data for the requested type. + */ + public static function anonymize_data( $type, $data = null ) { + if ( null === $data ) { + return null; + } + + return wp_privacy_anonymize_data( $type, $data ); + } + + /** + * Anonymize IPv4 or IPv6 address. + * + * @link https://github.com/WordPress/WordPress/blob/4.9.8/wp-includes/functions.php#L5862-L5930 + * + * @param string|null $ip_addr The IPv4 or IPv6 address to be anonymized. + * @param bool $ipv6_fallback Optional. Whether to return the original IPv6 address if the needed functions + * to anonymize it are not present. Default false, return `::` (unspecified address). + * @return string|null The anonymized IP address. + */ + public static function anonymize_ip( $ip_addr, $ipv6_fallback = false ) { + if ( null === $ip_addr ) { + return null; + } + + return wp_privacy_anonymize_ip( $ip_addr, $ipv6_fallback ); + } + + /** + * Anonymize custom data types. + * + * @param string $anonymous Anonymized data. + * @param string $type Type of the data. + * @param string $data Original data. + * + * @return string Anonymized string. + * + * @throws Exception When error occurs anonymize phone. + */ + public static function anonymize_custom_data_types( $anonymous, $type, $data ) { + switch ( $type ) { + case 'email_mask': + $anonymous = self::mask_email( $data ); + + break; + case 'phone': + $anonymous = preg_replace( '/\d/u', '0', $data ); + + if ( null === $anonymous ) { + throw new Exception( 'Could not anonymize phone number.' ); + } + + break; + } + + return $anonymous; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Region.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Region.php new file mode 100644 index 00000000..396316c4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Region.php @@ -0,0 +1,195 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use stdClass; + +/** + * Region + * + * @author Remco Tolsma + * @version 2.1.6 + * @since 2.1.6 + */ +class Region { + /** + * Value. + * + * @var string|null + */ + private $value; + + /** + * Code. + * + * @var string|null + */ + private $code; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * Construct region. + * + * @param string|null $value Value. + */ + public function __construct( $value = null ) { + $this->set_value( $value ); + } + + /** + * Get value. + * + * @return string|null + */ + public function get_value() { + return $this->value; + } + + /** + * Set value. + * + * @param string|null $value Value. + * @return void + */ + public function set_value( $value ) { + $this->value = $value; + } + + /** + * Get code. + * + * @return string|null + */ + public function get_code() { + return $this->code; + } + + /** + * Set code. + * + * @param string|null $code Code. + * @return void + */ + public function set_code( $code ) { + $this->code = $code; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'value' => $this->value, + 'code' => $this->code, + 'name' => $this->name, + ); + + $data = array_filter( $data ); + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create from object. + * + * @param mixed $json JSON. + * @return Region + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( is_string( $json ) ) { + return new self( $json ); + } + + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + $region = new self(); + + if ( isset( $json->value ) ) { + $region->set_value( $json->value ); + } + + if ( isset( $json->code ) ) { + $region->set_code( $json->code ); + } + + if ( isset( $json->name ) ) { + $region->set_name( $json->name ); + } + + return $region; + } + + /** + * Create string representation. + * + * @return string + */ + public function __toString() { + if ( is_string( $this->value ) ) { + return $this->value; + } + + $values = array( + $this->code, + $this->name, + ); + + $values = array_filter( $values ); + + return implode( ' - ', $values ); + } + + /** + * Anonymize. + * + * @return void + */ + public function anonymize() { + $this->set_value( PrivacyManager::anonymize_data( 'text', $this->get_value() ) ); + $this->set_code( PrivacyManager::anonymize_data( 'text', $this->get_code() ) ); + $this->set_name( PrivacyManager::anonymize_data( 'text', $this->get_name() ) ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Settings.php new file mode 100644 index 00000000..a6d3c52e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Settings.php @@ -0,0 +1,126 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Title: WordPress iDEAL admin + * + * @author Remco Tolsma + * @version 2.0.5 + */ +class Settings { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Constructs and initalize settings object. + * + * @param Plugin $plugin The plugin. + */ + public function __construct( $plugin ) { + $this->plugin = $plugin; + + // Actions. + add_action( 'init', array( $this, 'init' ) ); + } + + /** + * Initialize. + * + * @link https://make.wordpress.org/core/2016/10/26/registering-your-settings-in-wordpress-4-7/ + * @link https://github.com/WordPress/WordPress/blob/4.6/wp-admin/includes/plugin.php#L1767-L1795 + * @link https://github.com/WordPress/WordPress/blob/4.7/wp-includes/option.php#L1849-L1925 + * @link https://github.com/WordPress/WordPress/blob/4.7/wp-includes/option.php#L1715-L1847 + * + * @return void + */ + public function init() { + register_setting( + 'pronamic_pay', + 'pronamic_pay_license_key', + array( + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + register_setting( + 'pronamic_pay', + 'pronamic_pay_config_id', + array( + 'type' => 'integer', + 'sanitize_callback' => array( $this, 'sanitize_published_post_id' ), + ) + ); + + register_setting( + 'pronamic_pay', + 'pronamic_pay_uninstall_clear_data', + array( + 'type' => 'boolean', + 'default' => false, + ) + ); + + register_setting( + 'pronamic_pay', + 'pronamic_pay_google_analytics_property', + array( + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + ) + ); + + \register_setting( + 'pronamic_pay', + 'pronamic_pay_debug_mode', + array( + 'type' => 'boolean', + 'description' => 'Setting that can be used to trigger the “debug” mode throughout Pronamic Pay.', + 'default' => false, + ) + ); + + // Pages. + $pages = $this->plugin->get_pages(); + + $pages['pronamic_pay_subscription_canceled_page_id'] = __( 'Subscription Canceled', 'pronamic_ideal' ); + + foreach ( $pages as $id => $label ) { + register_setting( + 'pronamic_pay', + $id, + array( + 'type' => 'integer', + 'sanitize_callback' => array( $this, 'sanitize_published_post_id' ), + ) + ); + } + } + + /** + * Sanitize published post ID. + * + * @param integer $value Check if the value is published post ID. + * @return int|null Post ID if value is published post ID, null otherwise. + */ + public function sanitize_published_post_id( $value ) { + if ( 'publish' === get_post_status( $value ) ) { + return $value; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/AlignmentRule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/AlignmentRule.php new file mode 100644 index 00000000..21535583 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/AlignmentRule.php @@ -0,0 +1,169 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Privacy + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use DateTimeImmutable; + +/** + * Alignment Rule + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +class AlignmentRule { + /** + * Weekdays indexed 0 (for Sunday) through 6 (for Saturday). + * + * @var array + */ + private static $weekdays = array( + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + ); + + /** + * Frequency. + * + * @var string + */ + private $frequency; + + /** + * Day of the week. + * + * @var string|null + */ + private $by_day_of_the_week; + + /** + * Day of the month. + * + * @var int|null + */ + private $by_day_of_the_month; + + /** + * Number of month. + * + * @var int|null + */ + private $by_month; + + /** + * Construct prorating rule. + * + * @param string $frequency Frequency. + */ + public function __construct( $frequency ) { + $this->frequency = $frequency; + } + + /** + * By numeric day of the week. + * + * @param int $number Number of day in the week (0 = Sunday). + * @return $this + */ + public function by_numeric_day_of_the_week( $number ) { + $this->by_day_of_the_week = self::$weekdays[ $number ]; + + return $this; + } + + /** + * By numeric day of the month. + * + * @param int $number Day of the month. + * @return $this + */ + public function by_numeric_day_of_the_month( $number ) { + $this->by_day_of_the_month = $number; + + return $this; + } + + /** + * By numeric month. + * + * @param int $number Number of month. + * @return $this + */ + public function by_numeric_month( $number ) { + $this->by_month = $number; + + return $this; + } + + /** + * Get date. + * + * @param DateTimeImmutable|null $date Date. + * @return DateTimeImmutable + * @throws \Exception Throws exception on date error. + */ + public function get_date( DateTimeImmutable $date = null ) { + if ( null === $date ) { + $date = new DateTimeImmutable(); + } + + return $this->apply_properties( $date ); + } + + /** + * Apply properties. + * + * @param DateTimeImmutable $date Date. + * @return DateTimeImmutable + */ + private function apply_properties( DateTimeImmutable $date ) { + $year = \intval( $date->format( 'Y' ) ); + $month = \intval( $date->format( 'm' ) ); + $day = \intval( $date->format( 'd' ) ); + + // 1 > null === true + if ( $day >= $this->by_day_of_the_month && 'W' !== $this->frequency ) { + $month++; + } + + if ( null !== $this->by_day_of_the_month ) { + $day = $this->by_day_of_the_month; + } + + if ( null !== $this->by_month ) { + if ( $month > $this->by_month ) { + $year++; + } + + $month = $this->by_month; + } + + $date = $date->setDate( $year, $month, $day ); + + // Day of the week. + $day_of_the_week = $this->by_day_of_the_week; + + if ( null === $day_of_the_week && 'W' === $this->frequency ) { + $day_of_the_week = $date->format( 'l' ); + } + + if ( null !== $day_of_the_week ) { + $date = $date->modify( 'Next ' . $day_of_the_week ); + } + + return $date; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/Subscription.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/Subscription.php new file mode 100644 index 00000000..c685a362 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/Subscription.php @@ -0,0 +1,759 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use DateInterval; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Payments\LegacyPaymentInfo; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentInfoHelper; + +/** + * Subscription + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 1.0.0 + */ +class Subscription extends LegacyPaymentInfo implements \JsonSerializable { + use SubscriptionPhasesTrait; + + /** + * The key of this subscription, used in URL's for security. + * + * @var string|null + */ + public $key; + + /** + * The title of this subscription. + * + * @var string|null + */ + public $title; + + /** + * The frequency of this subscription, also known as `times` or `product length`. + * If the frequency is `2` then there will be in total `3` payments for the + * subscription. One (`1`) at the start of the subscription and `2` follow-up + * payments. + * + * @link https://docs.mollie.com/reference/v2/subscriptions-api/create-subscription + * + * @var int|null + */ + public $frequency; + + /** + * The interval of this subscription, for example: 1, 2, 3, etc. + * + * @todo Improve documentation? + * + * @var int|null + */ + public $interval; + + /** + * The interval period of this subscription. + * + * @todo Improve documentation? + * + * @var string|null + */ + public $interval_period; + + /** + * The interval date of this subscription. + * + * @var string|null + */ + public $interval_date; + + /** + * The interval date day of this subscription. + * + * @var string|null + */ + public $interval_date_day; + + /** + * The interval date month of this subscription. + * + * @var string|null + */ + public $interval_date_month; + + /** + * The status of this subscription, for example 'Success'. + * + * @todo How to reference to a class constant? + * @see PaymentStatus + * + * @var string|null + */ + public $status; + + /** + * The payment method which was used to create this subscription. + * + * @var string|null + */ + public $payment_method; + + /** + * The end date of the last succesfull payment. + * + * @var DateTime|null + */ + public $expiry_date; + + /** + * The next payment date. + * + * @var DateTime|null + */ + public $next_payment_date; + + /** + * The next payment delivery date. + * + * @var DateTime|null + */ + public $next_payment_delivery_date; + + /** + * Array for extra meta data to store with this subscription. + * + * @var array + */ + public $meta; + + /** + * Activated at. + * + * The datetime this subscription was activated or reactived. + * + * @var DateTime + */ + private $activated_at; + + /** + * Construct and initialize subscription object. + * + * @param int|null $post_id A subscription post ID or null. + * + * @throws \Exception Throws exception on invalid post date. + */ + public function __construct( $post_id = null ) { + parent::__construct( $post_id ); + + $this->meta = array(); + + $this->activated_at = new DateTime(); + + if ( ! empty( $post_id ) ) { + pronamic_pay_plugin()->subscriptions_data_store->read( $this ); + } + } + + /** + * Get the unique key of this subscription. + * + * @return string|null + */ + public function get_key() { + return $this->key; + } + + /** + * Get the frequency of this subscription. + * + * @return int|null + */ + public function get_frequency() { + return $this->frequency; + } + + /** + * Get the interval, for example: 1, 2, 3, 4, etc., this specifies for example: + * - Repeat every *2* days + * - Repeat every *1* months + * - Repeat every *2* year + * + * @return int|null + */ + public function get_interval() { + return $this->interval; + } + + /** + * Get the interval period, for example 'D', 'M', 'Y', etc. + * + * @link http://php.net/manual/en/dateinterval.construct.php#refsect1-dateinterval.construct-parameters + * + * @return string|null + */ + public function get_interval_period() { + return $this->interval_period; + } + + /** + * Get the interval period date (1-31). + * + * @return string|null + */ + public function get_interval_date() { + return $this->interval_date; + } + + /** + * Get the interval period day (Monday-Sunday). + * + * @return string|null + */ + public function get_interval_date_day() { + return $this->interval_date_day; + } + + /** + * Get the interval period month (1-12). + * + * @return string|null + */ + public function get_interval_date_month() { + return $this->interval_date_month; + } + + /** + * Get date interval. + * + * @link http://php.net/manual/en/dateinterval.construct.php#refsect1-dateinterval.construct-parameters + * + * @return SubscriptionInterval|null + */ + public function get_date_interval() { + $phase = $this->get_current_phase(); + + if ( null === $phase ) { + return null; + } + + return $phase->get_interval(); + } + + /** + * Get the status of this subscription. + * + * @todo Check constant? + * + * @return string|null + */ + public function get_status() { + return $this->status; + } + + /** + * Set the status of this subscription. + * + * @todo Check constant? + * + * @param string|null $status A status string. + * @return void + */ + public function set_status( $status ) { + if ( SubscriptionStatus::ACTIVE === $status && $this->status !== $status ) { + $this->set_activated_at( new DateTime() ); + } + + $this->status = $status; + } + + /** + * Add the specified note to this subscription. + * + * @link https://developer.wordpress.org/reference/functions/wp_insert_comment/ + * @param string $note A Note. + * @return int The new comment's ID. + * @throws \Exception Throws exception when adding note fails. + */ + public function add_note( $note ) { + $commentdata = array( + 'comment_post_ID' => $this->id, + 'comment_content' => $note, + 'comment_type' => 'subscription_note', + 'user_id' => get_current_user_id(), + 'comment_approved' => true, + ); + + $result = wp_insert_comment( $commentdata ); + + if ( false === $result ) { + throw new \Exception( + \sprintf( + 'Could not add note "%s" to subscription with ID "%d".', + $note, + $this->id + ) + ); + } + + return $result; + } + + /** + * Get meta by the specified meta key. + * + * @param string $key A meta key. + * @return string|false + */ + public function get_meta( $key ) { + if ( null === $this->id ) { + return false; + } + + $key = '_pronamic_subscription_' . $key; + + return get_post_meta( $this->id, $key, true ); + } + + /** + * Set meta data. + * + * @param string $key A meta key. + * @param mixed $value A meta value. + * + * @return bool True on successful update, false on failure. + */ + public function set_meta( $key, $value = false ) { + if ( null === $this->id ) { + return false; + } + + $key = '_pronamic_subscription_' . $key; + + if ( $value instanceof \DateTime ) { + $value = $value->format( 'Y-m-d H:i:s' ); + } + + if ( empty( $value ) ) { + return delete_post_meta( $this->id, $key ); + } + + $result = update_post_meta( $this->id, $key, $value ); + + return ( false !== $result ); + } + + /** + * Get source text. + * + * @return string + */ + public function get_source_text() { + $pieces = array( + $this->get_source(), + $this->get_source_id(), + ); + + $pieces = array_filter( $pieces ); + + $default_text = implode( '
    ', $pieces ); + + $text = apply_filters( 'pronamic_subscription_source_text_' . $this->get_source(), $default_text, $this ); + $text = apply_filters( 'pronamic_subscription_source_text', $text, $this ); + + return $text; + } + + /** + * Get source description. + * + * @return string + */ + public function get_source_description() { + $default_text = $this->get_source(); + + $text = apply_filters( 'pronamic_subscription_source_description_' . $this->get_source(), $default_text, $this ); + $text = apply_filters( 'pronamic_subscription_source_description', $text, $this ); + + return $text; + } + + /** + * Get source link for this subscription. + * + * @return string|null + */ + public function get_source_link() { + $url = null; + + $url = apply_filters( 'pronamic_subscription_source_url', $url, $this ); + $url = apply_filters( 'pronamic_subscription_source_url_' . $this->source, $url, $this ); + + return $url; + } + + /** + * Get cancel URL for this subscription. + * + * @return string + */ + public function get_cancel_url() { + $cancel_url = add_query_arg( + array( + 'subscription' => $this->get_id(), + 'key' => $this->get_key(), + 'action' => 'cancel', + ), + home_url() + ); + + return $cancel_url; + } + + /** + * Get renewal URL for this subscription. + * + * @return string + */ + public function get_renewal_url() { + $renewal_url = add_query_arg( + array( + 'subscription' => $this->get_id(), + 'key' => $this->get_key(), + 'action' => 'renew', + ), + home_url() + ); + + return $renewal_url; + } + + /** + * Get mandate selection URL for this subscription. + * + * @return string + */ + public function get_mandate_selection_url() { + $renewal_url = add_query_arg( + array( + 'subscription' => $this->get_id(), + 'key' => $this->get_key(), + 'action' => 'mandate', + ), + home_url() + ); + + return $renewal_url; + } + + /** + * Get all the payments for this subscription. + * + * @return Payment[] + */ + public function get_payments() { + if ( null === $this->id ) { + return array(); + } + + $payments = get_pronamic_payments_by_meta( '_pronamic_payment_subscription_id', $this->id ); + + return $payments; + } + + /** + * Get payments by period. + * + * @return array + */ + public function get_payments_by_period() { + $payments = $this->get_payments(); + + $periods = array(); + + foreach ( $payments as $payment ) { + // Get period for this subscription. + $period = null; + + $payment_periods = $payment->get_periods(); + + if ( null === $payment_periods ) { + break; + } + + foreach ( $payment_periods as $period ) { + if ( $this->get_id() === $period->get_phase()->get_subscription()->get_id() ) { + break; + } + } + + if ( null === $period ) { + continue; + } + + // Add period to result. + $start = $period->get_start_date()->getTimestamp(); + + if ( ! \array_key_exists( $start, $periods ) ) { + $periods[ $start ] = array( + 'period' => $period, + 'payments' => array(), + 'can_retry' => true, + ); + } + + // Add payment to result. + $periods[ $start ]['payments'][ $payment->get_date()->getTimestamp() ] = $payment; + + if ( \in_array( $payment->get_status(), array( PaymentStatus::OPEN, PaymentStatus::SUCCESS ), true ) ) { + $periods[ $start ]['can_retry'] = false; + } + } + + // Sort periods and payments. + \krsort( $periods ); + + foreach ( $periods as &$period ) { + \ksort( $period['payments'] ); + } + + return $periods; + } + + /** + * Get the first payment of this subscription. + * + * @return Payment|null + */ + public function get_first_payment() { + if ( null === $this->id ) { + return null; + } + + // Query arguments to get first payment. + $args = array( + 'posts_per_page' => 1, + 'orderby' => 'post_date', + 'order' => 'ASC', + ); + + $first_payment = get_pronamic_payments_by_meta( '_pronamic_payment_subscription_id', $this->id, $args ); + + if ( ! empty( $first_payment ) ) { + return $first_payment[0]; + } + + return null; + } + + /** + * Get the expiry date of this subscription. + * + * @return DateTime|null + */ + public function get_expiry_date() { + return $this->expiry_date; + } + + /** + * Set the expiry date of this subscription. + * + * @param DateTime|null $date Expiry date. + * @return void + */ + public function set_expiry_date( DateTime $date = null ) { + $this->expiry_date = $date; + } + + /** + * Set the next payment date of this subscription. + * + * @param DateTime|null $date Next payment date. + * @return void + */ + public function set_next_payment_date( DateTime $date = null ) { + $this->next_payment_date = $date; + } + + /** + * Get the next payment date of this subscription. + * + * @return DateTime|null + */ + public function get_next_payment_date() { + return $this->next_payment_date; + } + + /** + * Set the next payment delivery date of this subscription. + * + * @param DateTime|null $date Next payment delivery date. + * + * @return void + */ + public function set_next_payment_delivery_date( DateTime $date = null ) { + $this->next_payment_delivery_date = $date; + } + + /** + * Get the next payment delivery date of this subscription. + * + * @return DateTime|null + */ + public function get_next_payment_delivery_date() { + return $this->next_payment_delivery_date; + } + + /** + * Create new subscription period. + * + * @return SubscriptionPeriod|null + * @throws \UnexpectedValueException Throws exception when no date interval is available for this subscription. + */ + public function new_period() { + $phase = $this->get_current_phase(); + + if ( null === $phase ) { + throw new \UnexpectedValueException( 'Cannot create new subscription period for subscription without phase.' ); + } + + return $this->next_period(); + } + + /** + * Save subscription. + * + * @return void + */ + public function save() { + pronamic_pay_plugin()->subscriptions_data_store->save( $this ); + } + + /** + * Create subscription from object. + * + * @param mixed $json JSON. + * @param Subscription|null $subscription Subscription. + * @return Subscription + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json, $subscription = null ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( null === $subscription ) { + $subscription = new self(); + } + + PaymentInfoHelper::from_json( $json, $subscription ); + + if ( isset( $json->expiry_date ) ) { + $subscription->set_expiry_date( new DateTime( $json->expiry_date ) ); + } + + if ( isset( $json->next_payment_date ) ) { + $subscription->set_next_payment_date( new DateTime( $json->next_payment_date ) ); + } + + if ( isset( $json->next_payment_delivery_date ) ) { + $subscription->set_next_payment_delivery_date( new DateTime( $json->next_payment_delivery_date ) ); + } + + if ( isset( $json->status ) ) { + $subscription->set_status( $json->status ); + } + + if ( isset( $json->phases ) ) { + foreach ( $json->phases as $json_phase ) { + $json_phase->subscription = $subscription; + + $subscription->add_phase( SubscriptionPhase::from_json( $json_phase ) ); + } + } + + $activated_at = $subscription->date; + + if ( property_exists( $json, 'activated_at' ) ) { + $activated_at = new DateTime( $json->activated_at ); + } + + $subscription->set_activated_at( $activated_at ); + + return $subscription; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $object = PaymentInfoHelper::to_json( $this ); + + $properties = (array) $object; + + $properties['phases'] = $this->phases; + + if ( null !== $this->expiry_date ) { + $properties['expiry_date'] = $this->expiry_date->format( \DATE_ATOM ); + } + + if ( null !== $this->next_payment_date ) { + $properties['next_payment_date'] = $this->next_payment_date->format( \DATE_ATOM ); + } + + if ( null !== $this->next_payment_delivery_date ) { + $properties['next_payment_delivery_date'] = $this->next_payment_delivery_date->format( \DATE_ATOM ); + } + + if ( null !== $this->get_status() ) { + $properties['status'] = $this->get_status(); + } + + $properties['activated_at'] = $this->get_activated_at()->format( \DATE_ATOM ); + + $object = (object) $properties; + + return $object; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return object + */ + public function jsonSerialize() { + return $this->get_json(); + } + + /** + * Get activated datetime. + * + * @return DateTime + */ + public function get_activated_at() { + return $this->activated_at; + } + + /** + * Set activated datetime. + * + * @param DateTime $activated_at Activated at. + * @return void + */ + public function set_activated_at( DateTime $activated_at ) { + $this->activated_at = $activated_at; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionHelper.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionHelper.php new file mode 100644 index 00000000..b8c13265 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionHelper.php @@ -0,0 +1,258 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Subscription Helper + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.4.0 + */ +class SubscriptionHelper { + /** + * Complement subscription. + * + * @param Subscription $subscription Subscription. + * @return void + */ + public static function complement_subscription( Subscription $subscription ) { + // Key. + if ( null === $subscription->key ) { + $subscription->key = uniqid( 'subscr_' ); + } + + // Status. + if ( null === $subscription->status ) { + $subscription->status = PaymentStatus::OPEN; + } + } + + /** + * Complement subscription by payment. + * + * @param Subscription $subscription Subscription. + * @param Payment $payment Payment. + * @return void + */ + public static function complement_subscription_by_payment( Subscription $subscription, Payment $payment ) { + // Gateway configuration ID. + if ( null === $subscription->config_id ) { + $subscription->config_id = $payment->config_id; + } + + // Title. + if ( null === $subscription->title ) { + $subscription->title = sprintf( + /* translators: %s: payment title */ + __( 'Subscription for %s', 'pronamic_ideal' ), + $payment->title + ); + } + + $customer = $subscription->get_customer(); + + if ( null === $customer ) { + $customer = new Customer(); + } + + // Customer. + $payment_customer = $payment->get_customer(); + + if ( null !== $payment_customer ) { + // Contact name. + $customer_name = $customer->get_name(); + + if ( null === $customer_name ) { + $customer->set_name( $payment_customer->get_name() ); + } + + // WordPress user ID. + $user_id = $customer->get_user_id(); + + if ( null === $user_id ) { + $customer->set_user_id( $payment_customer->get_user_id() ); + } + + $subscription->set_customer( $customer ); + } + + // Origin. + if ( null === $subscription->get_origin_id() ) { + $subscription->set_origin_id( $payment->get_origin_id() ); + } + + // Source. + if ( empty( $subscription->source ) && empty( $subscription->source_id ) ) { + $subscription->source = $payment->source; + $subscription->source_id = $payment->subscription_source_id; + } + + // Description. + if ( null === $subscription->description ) { + $subscription->description = $payment->description; + } + + // Email. + $email = $customer->get_email(); + + if ( null === $email ) { + $customer->set_email( $payment->email ); + + $subscription->set_customer( $customer ); + } + + // Payment method. + if ( null === $subscription->payment_method ) { + $subscription->payment_method = $payment->method; + } + + // Start date. + if ( null === $subscription->start_date ) { + $subscription->start_date = clone $payment->date; + } + } + + /** + * Complement subscription dates. + * + * @param Subscription $subscription Subscription. + * @return void + */ + public static function complement_subscription_dates( Subscription $subscription ) { + // End date. + if ( null === $subscription->end_date ) { + $subscription->set_end_date( self::calculate_end_date( $subscription ) ); + } + + // Expiry date. + if ( null === $subscription->expiry_date ) { + $subscription->set_expiry_date( self::calculate_expiry_date( $subscription ) ); + } + + // Next payment date. + if ( null === $subscription->next_payment_date ) { + $subscription->set_next_payment_date( self::calculate_next_payment_date( $subscription ) ); + } + + // Next payment delivery date. + if ( null === $subscription->next_payment_delivery_date ) { + $subscription->set_next_payment_delivery_date( self::calculate_next_payment_delivery_date( $subscription ) ); + } + } + + /** + * Calculate end date of subscription. + * + * @param Subscription $subscription Subscription. + * @return DateTime|null + */ + public static function calculate_end_date( Subscription $subscription ) { + $end_date = null; + + $phase = $subscription->get_current_phase(); + + if ( null !== $phase ) { + $phase_end = $phase->get_end_date(); + + if ( null !== $phase_end ) { + $end_date = new DateTime( $phase_end->format( \DATE_ATOM ) ); + } + } + + return $end_date; + } + + /** + * Calculate expirty date. + * + * @param Subscription $subscription Subscription. + * @return DateTime|null + */ + public static function calculate_expiry_date( Subscription $subscription ) { + $start_date = $subscription->get_start_date(); + + if ( null === $start_date ) { + return null; + } + + $expiry_date = clone $start_date; + + return $expiry_date; + } + + /** + * Calculate next payment date. + * + * @param Subscription $subscription Subscription. + * @return DateTime|null + * @throws \InvalidArgumentException Throws invalid argument exception if no phases are defined. + */ + public static function calculate_next_payment_date( Subscription $subscription ) { + $phases = $subscription->get_phases(); + + if ( empty( $phases ) ) { + throw new \InvalidArgumentException( 'Can not calculate next payment date of subscription without phases.' ); + } + + // Get current phase. + $phase = $subscription->get_current_phase(); + + if ( null === $phase ) { + return null; + } + + // Get next payment date. + $next_date = $phase->get_next_date(); + + if ( null === $next_date ) { + return null; + } + + $next_date = new DateTime( $next_date->format( \DATE_ATOM ) ); + + return $next_date; + } + + /** + * Calculate next payment delivery date. + * + * @param Subscription $subscription Subscription. + * @return DateTime|null + */ + public static function calculate_next_payment_delivery_date( $subscription ) { + $next_payment_date = $subscription->get_next_payment_date(); + + // Check if there is next payment date. + if ( null === $next_payment_date ) { + return null; + } + + $next_payment_delivery_date = clone $next_payment_date; + + /** + * Filters the subscription next payment delivery date. + * + * @since unreleased + * + * @param DateTime $next_payment_delivery_date Next payment delivery date. + * @param Subscription $subscription Subscription. + */ + $next_payment_delivery_date = \apply_filters( 'pronamic_pay_subscription_next_payment_delivery_date', $next_payment_delivery_date, $subscription ); + + return $next_payment_delivery_date; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionInterval.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionInterval.php new file mode 100644 index 00000000..b80b7baf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionInterval.php @@ -0,0 +1,129 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +/** + * Subscription Interval + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.4.0 + * @link https://github.com/briannesbitt/Carbon/blob/2.40.0/src/Carbon/CarbonInterval.php + * @link https://github.com/frak/s3bk/blob/master/src/S3Bk/Type/StringableInterval.php + * @link https://github.com/stylers-llc/laratask/blob/master/src/Support/DateInterval.php + */ +class SubscriptionInterval extends \DateInterval implements \JsonSerializable { + /** + * Specification. + * + * @var string + */ + private $specification; + + /** + * Construct interval. + * + * @link https://en.wikipedia.org/wiki/ISO_8601#Durations + * @link https://www.php.net/manual/en/dateinterval.construct.php + * @link https://github.com/php/php-src/blob/php-7.4.10/ext/date/php_date.c#L414-L416 + * @param string $specification An interval specification. + */ + public function __construct( $specification ) { + $this->specification = $specification; + + parent::__construct( $specification ); + } + + /** + * Get specification. + * + * @return string + */ + public function get_specification() { + return $this->specification; + } + + /** + * Multiply. + * + * @param int $times Number of times to multiply with. + * @return SubscriptionInterval + * @throws \InvalidArgumentException Throws exception if times to multiply is zero. + */ + public function multiply( $times ) { + if ( 0 === $times ) { + throw new \InvalidArgumentException( 'Subscription interval cannot be multiplied by 0.' ); + } + + $invert = ( $times < 0 ); + + $times = \absint( $times ); + + $interval_spec = 'P'; + + // Date. + $date = \array_filter( + array( + 'Y' => $this->y * $times, + 'M' => $this->m * $times, + 'D' => $this->d * $times, + ) + ); + + foreach ( $date as $unit => $value ) { + $interval_spec .= $value . $unit; + } + + // Time. + $time = \array_filter( + array( + 'H' => $this->h * $times, + 'M' => $this->i * $times, + 'S' => $this->s * $times, + ) + ); + + if ( count( $time ) > 0 ) { + $interval_spec .= 'T'; + + foreach ( $time as $unit => $value ) { + $interval_spec .= $value . $unit; + } + } + + // Interval. + $interval = new self( $interval_spec ); + + $interval->invert = \intval( $invert ); + + return $interval; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * @return string + */ + public function jsonSerialize() { + return $this->specification; + } + + /** + * To string. + * + * @link https://www.php.net/manual/en/language.oop5.magic.php#object.tostring + * @return string + */ + public function __toString() { + return $this->specification; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php new file mode 100644 index 00000000..524dd1b2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPeriod.php @@ -0,0 +1,265 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\TaxedMoneyJsonTransformer; + +/** + * Subscription Period + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.4.0 + */ +class SubscriptionPeriod { + /** + * Phase. + * + * @var SubscriptionPhase + */ + private $phase; + + /** + * The start date of this period. + * + * @var DateTime + */ + private $start_date; + + /** + * The end date of this period. + * + * @var DateTime + */ + private $end_date; + + /** + * The amount to pay for this period. + * + * @var TaxedMoney + */ + private $amount; + + /** + * Construct and initialize subscription period object. + * + * @param SubscriptionPhase $phase Subscription phase. + * @param DateTime $start_date Start date. + * @param DateTime $end_date End date. + * @param TaxedMoney $amount Taxed amount. + */ + public function __construct( SubscriptionPhase $phase, DateTime $start_date, DateTime $end_date, TaxedMoney $amount ) { + $this->phase = $phase; + $this->start_date = $start_date; + $this->end_date = $end_date; + $this->amount = $amount; + } + + /** + * Get phase. + * + * @return SubscriptionPhase + */ + public function get_phase() { + return $this->phase; + } + + /** + * Set phase. + * + * @param SubscriptionPhase $phase Phase. + * @return void + */ + public function set_phase( SubscriptionPhase $phase ) { + $this->phase = $phase; + } + + /** + * Get start date. + * + * @return DateTime + */ + public function get_start_date() { + return $this->start_date; + } + + /** + * Get end date. + * + * @return DateTime + */ + public function get_end_date() { + return $this->end_date; + } + + /** + * Get amount. + * + * @return TaxedMoney + */ + public function get_amount() { + return $this->amount; + } + + /** + * Is trial period? + * + * @return bool + */ + public function is_trial() { + return $this->phase->is_trial(); + } + + /** + * From JSON. + * + * @param object $json Subscription period JSON. + * @return SubscriptionPeriod + * @throws \InvalidArgumentException Throws exception on invalid JSON. + * @throws \Exception Throws exception on problem. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( ! isset( $json->phase ) ) { + throw new \InvalidArgumentException( 'Object must contain `phase` property.' ); + } + + if ( ! isset( $json->start_date ) ) { + throw new \InvalidArgumentException( 'Object must contain `start_date` property.' ); + } + + if ( ! isset( $json->end_date ) ) { + throw new \InvalidArgumentException( 'Object must contain `end_date` property.' ); + } + + if ( ! isset( $json->amount ) ) { + throw new \InvalidArgumentException( 'Object must contain `amount` property.' ); + } + + /** + * Phase. + */ + if ( ! property_exists( $json->phase, 'subscription' ) ) { + throw new \InvalidArgumentException( 'The `phase` property must contain a `subscription` property.' ); + } + + if ( ! property_exists( $json->phase, 'sequence_number' ) ) { + throw new \InvalidArgumentException( 'The `phase` property must contain a `sequence_number` property.' ); + } + + /** + * Subscription. + */ + if ( ! \property_exists( $json->phase->subscription, 'id' ) ) { + throw new \InvalidArgumentException( 'The `subscription` property must contain an `id` property.' ); + } + + $subscription = \get_pronamic_subscription( $json->phase->subscription->id ); + + if ( null === $subscription ) { + throw new \Exception( + \sprintf( + 'Unable to find subscription by id: %s.', + $json->phase->subscription->id + ) + ); + } + + $phase = $subscription->get_phase_by_sequence_number( $json->phase->sequence_number ); + + if ( null === $phase ) { + throw new \Exception( + \sprintf( + 'Unable to find subscription phase by sequence number: %s.', + $json->phase->sequence_number + ) + ); + } + + $start_date = new DateTime( $json->start_date ); + $end_date = new DateTime( $json->end_date ); + + $amount = TaxedMoneyJsonTransformer::from_json( $json->amount ); + + return new self( $phase, $start_date, $end_date, $amount ); + } + + /** + * To JSON. + * + * @return object + */ + public function to_json() { + $json = (object) array( + 'phase' => (object) array( + '$ref' => \rest_url( + \sprintf( + '/%s/%s/%d/phases/%d', + 'pronamic-pay/v1', + 'subscriptions', + $this->phase->get_subscription()->get_id(), + $this->phase->get_sequence_number() + ) + ), + 'subscription' => (object) array( + '$ref' => \rest_url( + \sprintf( + '/%s/%s/%d', + 'pronamic-pay/v1', + 'subscriptions', + $this->phase->get_subscription()->get_id() + ) + ), + 'id' => $this->phase->get_subscription()->get_id(), + ), + 'sequence_number' => $this->phase->get_sequence_number(), + ), + 'start_date' => $this->start_date->format( \DATE_ATOM ), + 'end_date' => $this->end_date->format( \DATE_ATOM ), + 'amount' => TaxedMoneyJsonTransformer::to_json( $this->amount ), + ); + + return $json; + } + + /** + * Human readable range. + * + * @return string + */ + public function human_readable_range() { + $start = $this->get_start_date(); + $end = $this->get_end_date(); + + $format_start = __( 'D j M Y', 'pronamic_ideal' ); + + // Check if year is equal. + if ( $start->format( 'Y' ) === $end->format( 'Y' ) ) { + $format_start = __( 'D j M', 'pronamic_ideal' ); + + // Check if month is equal. + if ( $start->format( 'm' ) === $end->format( 'm' ) ) { + $format_start = __( 'D j', 'pronamic_ideal' ); + } + } + + return sprintf( + '%1$s – %2$s', + $start->format_i18n( $format_start ), + $end->format_i18n() + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPhase.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPhase.php new file mode 100644 index 00000000..cbb6b4d5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPhase.php @@ -0,0 +1,656 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use DateTimeImmutable; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\MoneyJsonTransformer; +use Pronamic\WordPress\Pay\TaxedMoneyJsonTransformer; + +/** + * Subscription Phase + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +class SubscriptionPhase implements \JsonSerializable { + /** + * Subscription. + * + * @var Subscription + */ + private $subscription; + + /** + * The sequence number. + * + * @var int|null + */ + private $sequence_number; + + /** + * Canceled at. + * + * @var DateTimeImmutable|null + */ + private $canceled_at; + + /** + * Amount. + * + * @var TaxedMoney + */ + private $amount; + + /** + * Interval. + * + * @var SubscriptionInterval + */ + private $interval; + + /** + * Total periods, also known as: + * - Number recurrences + * - Frequency. + * - Times. + * - Recurrences. + * - Cycles number. + * - Total cycles. + * - Maximum renewals. + * - Product length. + * - Limit cycles number. + * - Number billing cycles. + * + * @var int|null + */ + private $total_periods; + + /** + * Number periods created, also known as: + * - Number recurrences created. + * + * @var int + */ + private $periods_created; + + /** + * The date this phase will start. + * + * @var DateTimeImmutable + */ + private $start_date; + + /** + * The start date of the next period, also known as: + * - Billing cycle anchor (billing_cycle_anchor). + * - Period anchor. + * + * @link https://stripe.com/docs/billing/subscriptions/billing-cycle + * @link https://stripe.com/docs/api/subscriptions/create#create_subscription-billing_cycle_anchor + * @var DateTimeImmutable + */ + private $next_date; + + /** + * Alignment rate. + * + * @var float|null + */ + private $alignment_rate; + + /** + * Proration. + * + * @var bool + */ + private $is_prorated; + + /** + * Boolean flag to indicate a trial subscription phase. + * + * @var bool + */ + private $is_trial; + + /** + * Construct subscription phase. + * + * @param Subscription $subscription Subscription. + * @param DateTimeImmutable $start_date Start date. + * @param SubscriptionInterval $interval Interval. + * @param TaxedMoney $amount Amount. + * @return void + */ + public function __construct( Subscription $subscription, DateTimeImmutable $start_date, SubscriptionInterval $interval, TaxedMoney $amount ) { + $this->subscription = $subscription; + $this->start_date = $start_date; + $this->interval = $interval; + $this->amount = $amount; + + $this->periods_created = 0; + + $this->is_prorated = false; + $this->is_trial = false; + } + + /** + * Get subscription. + * + * @return Subscription + */ + public function get_subscription() { + return $this->subscription; + } + + /** + * Get sequence number. + * + * @return int|null + */ + public function get_sequence_number() { + return $this->sequence_number; + } + + /** + * Set sequence number. + * + * @param int $sequence_number Sequence number. + * @return void + */ + public function set_sequence_number( $sequence_number ) { + $this->sequence_number = $sequence_number; + } + + /** + * Get start date. + * + * @return DateTimeImmutable + */ + public function get_start_date() { + return $this->start_date; + } + + /** + * Set start date. + * + * @param DateTimeImmutable $start_date Start date. + * @return void + */ + public function set_start_date( $start_date ) { + $this->start_date = $start_date; + } + + /** + * Get next date. + * + * @return DateTimeImmutable|null + */ + public function get_next_date() { + /** + * Check whether all periods have been created, if so there is no next date. + */ + if ( $this->all_periods_created() ) { + return null; + } + + /** + * Check whether phase has been canceled, if so there is no next date. + */ + if ( $this->is_canceled() ) { + return null; + } + + /** + * If there are periods created we add these created periods. + */ + return $this->add_interval( $this->start_date, $this->periods_created ); + } + + /** + * Check if this phase is canceled. + * + * @link https://www.grammarly.com/blog/canceled-vs-cancelled/ + * @link https://docs.mollie.com/reference/v2/subscriptions-api/cancel-subscription + * @return bool True if canceled, false otherwise. + */ + public function is_canceled() { + return ( null !== $this->canceled_at ); + } + + /** + * Get canceled date. + * + * @return DateTimeImmutable|null Canceled date or null if phase is not canceled (yet). + */ + public function get_canceled_at() { + return $this->canceled_at; + } + + /** + * Set canceled date. + * + * @param DateTimeImmutable|null $canceled_at Canceled date. + * @return void + */ + public function set_canceled_at( DateTimeImmutable $canceled_at = null ) { + $this->canceled_at = $canceled_at; + } + + /** + * Get amount. + * + * @return TaxedMoney + */ + public function get_amount() { + return $this->amount; + } + + /** + * Set amount. + * + * @param TaxedMoney $amount Amount. + * @return void + */ + public function set_amount( $amount ) { + $this->amount = $amount; + } + + /** + * Get total periods. + * + * @return int|null + */ + public function get_total_periods() { + return $this->total_periods; + } + + /** + * Set total periods. + * + * @param int|null $total_periods Total periods to create. + * @return void + */ + public function set_total_periods( $total_periods ) { + $this->total_periods = $total_periods; + } + + /** + * Get periods created. + * + * @return int + */ + public function get_periods_created() { + return $this->periods_created; + } + + /** + * Set periods created. + * + * @param int $periods_created The number of periods created. + * @return void + */ + public function set_periods_created( $periods_created ) { + $this->periods_created = $periods_created; + } + + /** + * Get the number of periods that are remaining. + * + * @return int|null + */ + public function get_periods_remaining() { + if ( null === $this->total_periods ) { + // Infinite. + return null; + } + + return $this->total_periods - $this->periods_created; + } + + /** + * Is alignment. + * + * @return bool + */ + public function is_alignment() { + return ( null !== $this->alignment_rate ); + } + + /** + * Get alignment rate. + * + * @return float|null + */ + public function get_alignment_rate() { + return $this->alignment_rate; + } + + /** + * Set alignment rate. + * + * @param float|null $alignment_rate Alignment rate. + * @return void + */ + public function set_alignment_rate( $alignment_rate ) { + $this->alignment_rate = $alignment_rate; + } + + /** + * Is prorated. + * + * @return bool + */ + public function is_prorated() { + return $this->is_prorated; + } + + /** + * Set prorated. + * + * @param bool $is_prorated Proration. + * @return void + */ + public function set_prorated( $is_prorated ) { + $this->is_prorated = $is_prorated; + } + + /** + * Check if this phase is a trial. + * + * @return bool True if trial, false otherwise. + */ + public function is_trial() { + return $this->is_trial; + } + + /** + * Set trial. + * + * @param bool $is_trial Trial. + * @return void + */ + public function set_trial( $is_trial ) { + $this->is_trial = $is_trial; + } + + /** + * The subscription phase is infinite when the total periods number is undefined. + * + * @return bool True if infinite, false otherwise. + */ + public function is_infinite() { + return ( null === $this->total_periods ); + } + + /** + * Check if all periods are created. + * + * @return bool True if all periods are created, false otherwise. + */ + public function all_periods_created() { + return ( $this->total_periods === $this->periods_created ); + } + + /** + * Get interval. + * + * @link https://www.php.net/manual/en/class.dateinterval.php + * @link https://www.php.net/manual/en/dateinterval.construct.php + * @return SubscriptionInterval + */ + public function get_interval() { + return $this->interval; + } + + /** + * Get end date. + * + * @return DateTimeImmutable|null + * @throws \Exception Throws exception on invalid interval spec. + */ + public function get_end_date() { + if ( null === $this->total_periods ) { + // Infinite. + return null; + } + + return $this->add_interval( $this->start_date, $this->total_periods ); + } + + /** + * Add subscription phase interval to date. + * + * @param \DateTimeImmutable $date Date to add interval period to. + * @param int $times Number of times to add interval. + * @return \DateTimeImmutable + */ + private function add_interval( $date, $times = 1 ) { + // If times is zero there is nothing to add. + if ( 0 === $times ) { + return $date; + } + + // Multiply date interval. + return $date->add( $this->interval->multiply( $times ) ); + } + + /** + * Get next period. + * + * @return SubscriptionPeriod|null + */ + public function get_next_period() { + if ( $this->all_periods_created() ) { + return null; + } + + $start = $this->get_next_date(); + + if ( null === $start ) { + return null; + } + + $end = $this->add_interval( $start ); + + $period = new SubscriptionPeriod( + $this, + new DateTime( $start->format( \DATE_ATOM ) ), + new DateTime( $end->format( \DATE_ATOM ) ), + $this->get_amount() + ); + + return $period; + } + + /** + * Next period. + * + * @return SubscriptionPeriod|null + */ + public function next_period() { + $next_period = $this->get_next_period(); + + if ( null === $next_period ) { + return null; + } + + $this->periods_created++; + + return $next_period; + } + + /** + * Get JSON object. + * + * @return object + */ + public function jsonSerialize() { + return (object) array( + 'subscription' => (object) array( + '$ref' => \rest_url( + \sprintf( + '/%s/%s/%d', + 'pronamic-pay/v1', + 'subscriptions', + $this->subscription->get_id() + ) + ), + ), + 'sequence_number' => $this->get_sequence_number(), + 'start_date' => $this->start_date->format( \DATE_ATOM ), + 'interval' => $this->interval->get_specification(), + 'amount' => MoneyJsonTransformer::to_json( $this->amount ), + // Numbers. + 'total_periods' => $this->total_periods, + 'periods_created' => $this->periods_created, + 'periods_remaining' => $this->get_periods_remaining(), + // Other. + 'canceled_at' => ( null === $this->canceled_at ) ? null : $this->canceled_at->format( \DATE_ATOM ), + 'alignment_rate' => $this->alignment_rate, + // Flags. + 'is_alignment' => $this->is_alignment(), + 'is_prorated' => $this->is_prorated(), + 'is_trial' => $this->is_trial(), + // Readonly. + 'is_infinite' => $this->is_infinite(), + 'is_canceled' => $this->is_canceled(), + ); + } + + /** + * Create subscription phase from object. + * + * @param mixed $json JSON. + * @return SubscriptionPhase + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( ! isset( $json->subscription ) ) { + throw new \InvalidArgumentException( 'Object must contain `subscription` property.' ); + } + + if ( ! isset( $json->start_date ) ) { + throw new \InvalidArgumentException( 'Object must contain `start_date` property.' ); + } + + if ( ! isset( $json->interval ) ) { + throw new \InvalidArgumentException( 'Object must contain `interval` property.' ); + } + + if ( ! isset( $json->amount ) ) { + throw new \InvalidArgumentException( 'Object must contain `amount` property.' ); + } + + $phase = new self( + $json->subscription, + new \DateTimeImmutable( $json->start_date ), + new SubscriptionInterval( $json->interval ), + TaxedMoneyJsonTransformer::from_json( $json->amount ) + ); + + if ( property_exists( $json, 'total_periods' ) ) { + $phase->set_total_periods( $json->total_periods ); + } + + if ( property_exists( $json, 'periods_created' ) ) { + $phase->set_periods_created( $json->periods_created ); + } + + if ( property_exists( $json, 'alignment_rate' ) ) { + $phase->set_alignment_rate( $json->alignment_rate ); + } + + if ( property_exists( $json, 'is_prorated' ) ) { + $phase->set_prorated( \boolval( $json->is_prorated ) ); + } + + if ( property_exists( $json, 'is_trial' ) ) { + $phase->set_trial( \boolval( $json->is_trial ) ); + } + + if ( property_exists( $json, 'canceled_at' ) ) { + if ( null !== $json->canceled_at ) { + $phase->set_canceled_at( new \DateTimeImmutable( $json->canceled_at ) ); + } + } + + return $phase; + } + + /** + * Align the phase to align date. + * + * @param self $phase The phase to align. + * @param DateTimeImmutable $align_date The alignment date. + * @return SubscriptionPhase + * @throws \Exception Throws exception on invalid date interval. + */ + public static function align( self $phase, DateTimeImmutable $align_date ) { + $start_date = $phase->get_start_date(); + + $next_date = $start_date->add( $phase->get_interval() ); + + $regular_difference = $start_date->diff( $next_date, true ); + + /** + * PHPStan fix. + * + * If the DateInterval object was created by DateTime::diff(), then this is the total + * number of days between the start and end dates. Otherwise, days will be FALSE. + */ + if ( false === $regular_difference->days ) { + throw new \Exception( 'Could not calculate the total number of days between the phase start date and the next period start date.' ); + } + + $alignment_difference = $start_date->diff( $align_date, true ); + + /** + * PHPStan fix. + * + * If the DateInterval object was created by DateTime::diff(), then this is the total + * number of days between the start and end dates. Otherwise, days will be FALSE. + */ + if ( false === $alignment_difference->days ) { + throw new \Exception( 'Could not calculate the total number of days between the phase start date and the next alignment date.' ); + } + + $alignment_interval = new SubscriptionInterval( 'P' . $alignment_difference->days . 'D' ); + + $alignment_phase = new self( $phase->get_subscription(), $start_date, $alignment_interval, $phase->get_amount() ); + + $alignment_phase->set_total_periods( 1 ); + $alignment_phase->set_alignment_rate( $alignment_difference->days / $regular_difference->days ); + + // Remove one period from regular phase. + $total_periods = $phase->get_total_periods(); + + if ( null !== $total_periods ) { + $phase->set_total_periods( $total_periods - 1 ); + } + + $alignment_end_date = $alignment_phase->get_end_date(); + + if ( null === $alignment_end_date ) { + throw new \Exception( 'The align phase should always end because this phase exists for one period.' ); + } + + $phase->set_start_date( $alignment_end_date ); + + return $alignment_phase; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPhasesTrait.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPhasesTrait.php new file mode 100644 index 00000000..10ea97bc --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPhasesTrait.php @@ -0,0 +1,241 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Money\TaxedMoney; + +/** + * Subscription Phases Trait + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.5.0 + */ +trait SubscriptionPhasesTrait { + /** + * Phases. + * + * @var SubscriptionPhase[] + */ + private $phases = array(); + + /** + * Get phases. + * + * @return array + */ + public function get_phases() { + return $this->phases; + } + + /** + * Add the specified phase to this subscription. + * + * @param SubscriptionPhase $phase Phase. + * @return void + */ + public function add_phase( SubscriptionPhase $phase ) { + $this->phases[] = $phase; + + $phase->set_sequence_number( \count( $this->phases ) ); + + // Update subscription end date. + $end_date = $phase->get_end_date(); + + if ( null !== $end_date ) { + $end_date = DateTime::create_from_immutable( $end_date ); + } + + $this->set_end_date( $end_date ); + } + + /** + * Create new phase for this subscription. + * + * @param DateTime $start_date Start date. + * @param string $interval_spec Interval specification. + * @param TaxedMoney $amount Amount. + * @return SubscriptionPhase + */ + public function new_phase( $start_date, $interval_spec, $amount ) { + $start = new \DateTimeImmutable( $start_date->format( \DATE_ATOM ) ); + + $interval = new SubscriptionInterval( $interval_spec ); + + $phase = new SubscriptionPhase( $this, $start, $interval, $amount ); + + $this->add_phase( $phase ); + + return $phase; + } + + /** + * Check if all the periods within the subscription phases are created. + * + * @return bool True if all created, false otherwise. + */ + public function all_periods_created() { + foreach ( $this->phases as $phase ) { + if ( ! $phase->all_periods_created() ) { + return false; + } + } + + return true; + } + + /** + * Check if this subscription is infinite. + * + * @return bool True if infinite, false otherwise. + */ + public function is_infinite() { + foreach ( $this->phases as $phase ) { + if ( $phase->is_infinite() ) { + return true; + } + } + + return false; + } + + /** + * Get current phase or null if all completed. + * + * @return SubscriptionPhase|null + */ + public function get_current_phase() { + foreach ( $this->phases as $phase ) { + if ( $phase->all_periods_created() ) { + continue; + } + + if ( $phase->is_canceled() ) { + continue; + } + + return $phase; + } + + return null; + } + + /** + * Get phase for display. + * + * @return SubscriptionPhase|null + */ + public function get_display_phase() { + // Get first uncompleted regular phase. + foreach ( $this->phases as $phase ) { + // Skip trial phases. + if ( $phase->is_trial() ) { + continue; + } + + // Skip prorated phases. + if ( $phase->is_prorated() ) { + continue; + } + + if ( ! $phase->all_periods_created() ) { + return $phase; + } + } + + // Get first regular phase. + foreach ( $this->phases as $phase ) { + // Skip trial phases. + if ( $phase->is_trial() ) { + continue; + } + + // Skip prorated phases. + if ( $phase->is_prorated() ) { + continue; + } + + return $phase; + } + + // Get first phase. + foreach ( $this->phases as $phase ) { + return $phase; + } + + return null; + } + + /** + * Check if subscription is in a trial period. + * + * @return bool True if current period definition is a trial, false otherwise. + */ + public function in_trial_period() { + $current_phase = $this->get_current_phase(); + + if ( null === $current_phase ) { + return false; + } + + return $current_phase->is_trial(); + } + + /** + * Get the next period. + * + * @return SubscriptionPeriod|null + */ + public function get_next_period() { + $current_phase = $this->get_current_phase(); + + if ( null === $current_phase ) { + return null; + } + + return $current_phase->get_next_period(); + } + + /** + * Next period. + * + * @return SubscriptionPeriod|null + */ + public function next_period() { + $current_phase = $this->get_current_phase(); + + if ( null === $current_phase ) { + return null; + } + + return $current_phase->next_period(); + } + + /** + * Get phase by sequence number. + * + * @param int $sequence_number Sequence number. + * @return SubscriptionPhase|null + */ + public function get_phase_by_sequence_number( $sequence_number ) { + /** + * PHP arrays are zero-based indexed, sequence number starts from 1. + */ + $key = $sequence_number - 1; + + if ( array_key_exists( $key, $this->phases ) ) { + return $this->phases[ $key ]; + } + + return null; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php new file mode 100644 index 00000000..6c99e67a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionPostType.php @@ -0,0 +1,211 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use Pronamic\WordPress\Pay\Payments\PaymentPostType; + +/** + * Title: WordPress iDEAL post types + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 1.0.0 + */ +class SubscriptionPostType { + /** + * Constructs and initializes an post types object + */ + public function __construct() { + /** + * Priority of the initial post types function should be set to < 10. + * + * @link https://core.trac.wordpress.org/ticket/28488 + * @link https://core.trac.wordpress.org/changeset/29318 + * + * @link https://github.com/WordPress/WordPress/blob/4.0/wp-includes/post.php#L167 + */ + add_action( 'init', array( $this, 'register_subscription_post_type' ), 0 ); // Highest priority. + add_action( 'init', array( $this, 'register_post_status' ), 9 ); + } + + /** + * Register post types. + * + * @link https://github.com/WordPress/WordPress/blob/4.6.1/wp-includes/post.php#L1277-L1300 + * @return void + */ + public function register_subscription_post_type() { + register_post_type( + 'pronamic_pay_subscr', + array( + 'label' => __( 'Subscriptions', 'pronamic_ideal' ), + 'labels' => array( + 'name' => __( 'Subscriptions', 'pronamic_ideal' ), + 'singular_name' => __( 'Subscription', 'pronamic_ideal' ), + 'add_new' => __( 'Add New', 'pronamic_ideal' ), + 'add_new_item' => __( 'Add New Subscription', 'pronamic_ideal' ), + 'edit_item' => __( 'Edit Subscription', 'pronamic_ideal' ), + 'new_item' => __( 'New Subscription', 'pronamic_ideal' ), + 'all_items' => __( 'All Subscriptions', 'pronamic_ideal' ), + 'view_item' => __( 'View Subscription', 'pronamic_ideal' ), + 'search_items' => __( 'Search Subscriptions', 'pronamic_ideal' ), + 'not_found' => __( 'No subscriptions found.', 'pronamic_ideal' ), + 'not_found_in_trash' => __( 'No subscriptions found in Trash.', 'pronamic_ideal' ), + 'menu_name' => __( 'Subscriptions', 'pronamic_ideal' ), + 'filter_items_list' => __( 'Filter subscriptions list', 'pronamic_ideal' ), + 'items_list_navigation' => __( 'Subscriptions list navigation', 'pronamic_ideal' ), + 'items_list' => __( 'Subscriptions list', 'pronamic_ideal' ), + + /* + * New Post Type Labels in 5.0. + * @link https://make.wordpress.org/core/2018/12/05/new-post-type-labels-in-5-0/ + */ + 'item_published' => __( 'Subscription published.', 'pronamic_ideal' ), + 'item_published_privately' => __( 'Subscription published privately.', 'pronamic_ideal' ), + 'item_reverted_to_draft' => __( 'Subscription reverted to draft.', 'pronamic_ideal' ), + 'item_scheduled' => __( 'Subscription scheduled.', 'pronamic_ideal' ), + 'item_updated' => __( 'Subscription updated.', 'pronamic_ideal' ), + ), + 'public' => false, + 'publicly_queryable' => false, + 'show_ui' => true, + 'show_in_nav_menus' => false, + 'show_in_menu' => false, + 'show_in_admin_bar' => false, + 'show_in_rest' => true, + 'rest_base' => 'pronamic-subscriptions', + 'supports' => false, + 'rewrite' => false, + 'query_var' => false, + 'capabilities' => PaymentPostType::get_capabilities(), + 'map_meta_cap' => true, + ) + ); + } + + /** + * Get subscription states. + * + * @return array + */ + public static function get_states() { + return array( + 'subscr_pending' => _x( 'Pending', 'Subscription status', 'pronamic_ideal' ), + 'subscr_cancelled' => _x( 'Cancelled', 'Subscription status', 'pronamic_ideal' ), + 'subscr_expired' => _x( 'Expired', 'Subscription status', 'pronamic_ideal' ), + 'subscr_failed' => _x( 'Failed', 'Subscription status', 'pronamic_ideal' ), + 'subscr_on_hold' => _x( 'On Hold', 'Subscription status', 'pronamic_ideal' ), + 'subscr_active' => _x( 'Active', 'Subscription status', 'pronamic_ideal' ), + 'subscr_completed' => _x( 'Completed', 'Subscription status', 'pronamic_ideal' ), + ); + } + + /** + * Register our custom post statuses, used for order status. + * + * @return void + */ + public function register_post_status() { + /** + * Subscription post statuses. + */ + register_post_status( + 'subscr_pending', + array( + 'label' => _x( 'Pending', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Pending (%s)', 'Pending (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'subscr_cancelled', + array( + 'label' => _x( 'Cancelled', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Cancelled (%s)', 'Cancelled (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'subscr_expired', + array( + 'label' => _x( 'Expired', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Expired (%s)', 'Expired (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'subscr_failed', + array( + 'label' => _x( 'Failed', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'subscr_on_hold', + array( + 'label' => _x( 'On Hold', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'On Hold (%s)', 'On Hold (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'subscr_active', + array( + 'label' => _x( 'Active', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Active (%s)', 'Active (%s)', 'pronamic_ideal' ), + ) + ); + + register_post_status( + 'subscr_completed', + array( + 'label' => _x( 'Completed', 'Subscription status', 'pronamic_ideal' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: count value */ + 'label_count' => _n_noop( 'Completed (%s)', 'Completed (%s)', 'pronamic_ideal' ), + ) + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionStatus.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionStatus.php new file mode 100644 index 00000000..0c2035a3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionStatus.php @@ -0,0 +1,72 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Core + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +/** + * Title: WordPress pay subscription statuses constants + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @author Reüel van der Steege + * @version 2.2.4 + * @since 2.2.4 + */ +class SubscriptionStatus { + /** + * Status indicator for active + * + * @var string + */ + const ACTIVE = 'Active'; + + /** + * Status indicator for cancelled + * + * @var string + */ + const CANCELLED = 'Cancelled'; + + /** + * Status indicator for completed + * + * @var string + */ + const COMPLETED = 'Completed'; + + /** + * Status indicator for expired + * + * @var string + */ + const EXPIRED = 'Expired'; + + /** + * Status indicator for failure + * + * @var string + */ + const FAILURE = 'Failure'; + + /** + * Status indicator for on hold + * + * @var string + */ + const ON_HOLD = 'On Hold'; + + /** + * Status indicator for open + * + * @var string + */ + const OPEN = 'Open'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php new file mode 100644 index 00000000..ff190290 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsDataStoreCPT.php @@ -0,0 +1,742 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use DatePeriod; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Payments\LegacyPaymentsDataStoreCPT; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Customer; +use Pronamic\WordPress\Pay\TaxedMoneyJsonTransformer; + +/** + * Title: Subscriptions data store CPT + * + * @link https://woocommerce.com/2017/04/woocommerce-3-0-release/ + * @link https://woocommerce.wordpress.com/2016/10/27/the-new-crud-classes-in-woocommerce-2-7/ + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.0.1 + */ +class SubscriptionsDataStoreCPT extends LegacyPaymentsDataStoreCPT { + /** + * Subscription. + * + * @var Subscription|null + */ + private $subscription; + + /** + * Subscriptions. + * + * @var array + */ + private $subscriptions; + + /** + * Status map. + * + * @var array + */ + private $status_map; + + /** + * Construct subscriptions data store CPT object. + */ + public function __construct() { + $this->meta_key_prefix = '_pronamic_subscription_'; + + $this->register_meta(); + + $this->subscriptions = array(); + + $this->status_map = array( + SubscriptionStatus::CANCELLED => 'subscr_cancelled', + SubscriptionStatus::EXPIRED => 'subscr_expired', + SubscriptionStatus::FAILURE => 'subscr_failed', + SubscriptionStatus::ACTIVE => 'subscr_active', + SubscriptionStatus::ON_HOLD => 'subscr_on_hold', + SubscriptionStatus::OPEN => 'subscr_pending', + SubscriptionStatus::COMPLETED => 'subscr_completed', + // Map payment status `Success` for backwards compatibility. + PaymentStatus::SUCCESS => 'subscr_active', + ); + } + + /** + * Setup. + * + * @return void + */ + public function setup() { + add_filter( 'wp_insert_post_data', array( $this, 'insert_subscription_post_data' ), 10, 2 ); + + add_action( 'save_post_pronamic_pay_subscr', array( $this, 'save_post_meta' ), 100, 3 ); + } + + /** + * Get subscription by ID. + * + * @param int $id Payment ID. + * @return Subscription|null + */ + public function get_subscription( $id ) { + if ( ! isset( $this->subscriptions[ $id ] ) ) { + if ( empty( $id ) ) { + return null; + } + + $id = (int) $id; + + $post_type = \get_post_type( $id ); + + if ( 'pronamic_pay_subscr' !== $post_type ) { + return null; + } + + $subscription = new Subscription(); + + $subscription->set_id( $id ); + + $this->subscriptions[ $id ] = $subscription; + + $this->read( $subscription ); + } + + return $this->subscriptions[ $id ]; + } + + /** + * Get post status from meta status. + * + * @param string|null $meta_status Meta status. + * @return string|null + */ + private function get_post_status_from_meta_status( $meta_status ) { + if ( null === $meta_status ) { + return null; + } + + if ( isset( $this->status_map[ $meta_status ] ) ) { + return $this->status_map[ $meta_status ]; + } + + return null; + } + + /** + * Get meta status from post status. + * + * @param string $post_status Post status. + * @return string|null + */ + private function get_meta_status_from_post_status( $post_status ) { + $key = array_search( $post_status, $this->status_map, true ); + + if ( false !== $key ) { + return \strval( $key ); + } + + return null; + } + + /** + * Complement subscription post data. + * + * @link https://github.com/WordPress/WordPress/blob/5.0.3/wp-includes/post.php#L3515-L3523 + * + * @param array $data An array of slashed post data. + * @param array $postarr An array of sanitized, but otherwise unmodified post data. + * @return array + * @throws \Exception When inserting subscription post data JSON string fails. + */ + public function insert_subscription_post_data( $data, $postarr ) { + $this->subscription = null; + + if ( isset( $postarr['pronamic_subscription'] ) ) { + $this->subscription = $postarr['pronamic_subscription']; + } elseif ( isset( $postarr['ID'] ) ) { + $post_id = $postarr['ID']; + + if ( 'pronamic_pay_subscr' === get_post_type( $post_id ) ) { + $this->subscription = $this->get_subscription( $post_id ); + } + } + + if ( $this->subscription instanceof Subscription ) { + $subscription = $this->subscription; + + // Update subscription from post array. + $this->update_subscription_form_post_array( $subscription, $postarr ); + + if ( ! isset( $data['post_status'] ) || 'trash' !== $data['post_status'] ) { + $data['post_status'] = $this->get_post_status_from_meta_status( $subscription->get_status() ); + } + + // Data. + $json_string = wp_json_encode( $subscription->get_json() ); + + if ( false === $json_string ) { + throw new \Exception( 'Error inserting subscription post data as JSON.' ); + } + + $data['post_content'] = wp_slash( $json_string ); + $data['post_mime_type'] = 'application/json'; + } + + return $data; + } + + /** + * Update subscription from post array. + * + * @param Subscription $subscription Subscription. + * @param array $postarr Post data array. + * @return void + * @throws \Exception Throws exception if amount could not be parsed to Money object. + */ + private function update_subscription_form_post_array( $subscription, $postarr ) { + if ( isset( $postarr['pronamic_subscription_post_status'] ) ) { + $post_status = sanitize_text_field( stripslashes( $postarr['pronamic_subscription_post_status'] ) ); + $meta_status = $this->get_meta_status_from_post_status( $post_status ); + + if ( null !== $meta_status ) { + $subscription->set_status( $meta_status ); + } + } + + if ( ! isset( $postarr['pronamic_subscription_update_nonce'] ) ) { + return; + } + + if ( ! check_admin_referer( 'pronamic_subscription_update', 'pronamic_subscription_update_nonce' ) ) { + return; + } + } + + /** + * Save post meta. + * + * @link https://github.com/WordPress/WordPress/blob/5.0.3/wp-includes/post.php#L3724-L3736 + * + * @param int $post_id Post ID. + * @param \WP_Post $post Post object. + * @param bool $update Whether this is an existing post being updated or not. + * @return void + */ + public function save_post_meta( $post_id, $post, $update ) { + if ( $this->subscription instanceof Subscription ) { + if ( ! $update && null === $this->subscription->get_id() ) { + $this->subscription->set_id( $post_id ); + $this->subscription->post = $post; + } + + $this->update_post_meta( $this->subscription ); + } + + $this->subscription = null; + } + + /** + * Create subscription. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L47-L76 + * + * @param Subscription $subscription Create the specified subscription in this data store. + * @return bool + */ + public function create( $subscription ) { + $result = wp_insert_post( + array( + 'post_type' => 'pronamic_pay_subscr', + 'post_date_gmt' => $this->get_mysql_utc_date( $subscription->date ), + 'post_title' => sprintf( + 'Subscription – %s', + date_i18n( _x( 'M d, Y @ h:i A', 'Subscription title date format parsed by `date_i18n`.', 'pronamic_ideal' ) ) + ), + 'post_author' => $subscription->user_id, + 'pronamic_subscription' => $subscription, + ), + true + ); + + if ( is_wp_error( $result ) ) { + return false; + } + + $this->update_post_meta( $subscription ); + + do_action( 'pronamic_pay_new_subscription', $subscription ); + + return true; + } + + /** + * Update subscription. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L113-L154 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L154-L257 + * + * @param Subscription $subscription The subscription to update in this data store. + * @return bool + */ + public function update( $subscription ) { + $id = $subscription->get_id(); + + if ( empty( $id ) ) { + return false; + } + + $data = array( + 'ID' => $id, + 'pronamic_subscription' => $subscription, + ); + + $result = wp_update_post( $data, true ); + + if ( is_wp_error( $result ) ) { + return false; + } + + return true; + } + + /** + * Save subscription. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L113-L154 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L154-L257 + * @param Subscription $subscription The subscription to save in this data store. + * @return boolean True if saved, false otherwise. + */ + public function save( $subscription ) { + $id = $subscription->get_id(); + + $result = empty( $id ) ? $this->create( $subscription ) : $this->update( $subscription ); + + return $result; + } + + /** + * Read subscription. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/abstract-wc-order-data-store-cpt.php#L78-L111 + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L81-L136 + * @link https://developer.wordpress.org/reference/functions/get_post_field/ + * + * @param Subscription $subscription The subscription to read the additional data for. + * + * @return void + * @throws \Exception Throws exception on invalid post date. + */ + public function read( $subscription ) { + $id = $subscription->get_id(); + + if ( empty( $id ) ) { + return; + } + + $subscription->post = get_post( $id ); + $subscription->title = get_the_title( $id ); + $subscription->date = new DateTime( get_post_field( 'post_date_gmt', $id, 'raw' ), new DateTimeZone( 'UTC' ) ); + + $content = get_post_field( 'post_content', $id, 'raw' ); + + $json = json_decode( $content ); + + if ( is_object( $json ) ) { + Subscription::from_json( $json, $subscription ); + } + + // Set user ID from `post_author` field if not set from subscription JSON. + $customer = $subscription->get_customer(); + + if ( null === $customer ) { + $customer = new Customer(); + + $subscription->set_customer( $customer ); + } + + if ( null === $customer->get_user_id() ) { + $post_author = get_post_field( 'post_author', $id, 'raw' ); + + $customer->set_user_id( intval( $post_author ) ); + } + + $this->read_post_meta( $subscription ); + + // Phases. + if ( is_object( $json ) && ! property_exists( $json, 'phases' ) ) { + // Amount. + $amount = new TaxedMoney( + (string) $this->get_meta( $id, 'amount' ), + (string) $this->get_meta_string( $id, 'currency' ) + ); + + if ( \property_exists( $json, 'total_amount' ) ) { + $amount = TaxedMoneyJsonTransformer::from_json( $json->total_amount ); + } + + // Phase. + $start_date = $subscription->start_date; + + if ( null === $start_date ) { + $start_date = clone $subscription->get_date(); + } + + $interval_spec = 'P' . $subscription->get_interval() . $subscription->get_interval_period(); + + $phase = $subscription->new_phase( + $start_date, + $interval_spec, + $amount + ); + + $phase->set_total_periods( $subscription->get_frequency() ); + + // Set periods created. + $end_date = $subscription->get_next_payment_date(); + + if ( null === $end_date ) { + $end_date = $subscription->get_expiry_date(); + } + + if ( null !== $end_date ) { + $period = new DatePeriod( $start_date, new \DateInterval( $interval_spec ), $end_date ); + + $phase->set_periods_created( \iterator_count( $period ) ); + } + } + } + + /** + * Get meta status label. + * + * @param string|null $meta_status The subscription meta status to get the status label for. + * @return string|false + */ + public function get_meta_status_label( $meta_status ) { + $post_status = $this->get_post_status_from_meta_status( $meta_status ); + + if ( empty( $post_status ) ) { + return false; + } + + $status_object = get_post_status_object( $post_status ); + + if ( isset( $status_object, $status_object->label ) ) { + return $status_object->label; + } + + return false; + } + + /** + * Register meta. + * + * @return void + */ + private function register_meta() { + $this->register_meta_key( + 'config_id', + array( + 'label' => __( 'Config ID', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'source', + array( + 'label' => __( 'Source', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'source_id', + array( + 'label' => __( 'Source ID', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'currency', + array( + 'label' => __( 'Currency', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'amount', + array( + 'label' => __( 'Amount', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'frequency', + array( + 'label' => __( 'Frequency', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'interval', + array( + 'label' => __( 'Interval', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'interval_period', + array( + 'label' => __( 'Interval Period', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'transaction_id', + array( + 'label' => __( 'Transaction ID', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'status', + array( + 'label' => __( 'Status', 'pronamic_ideal' ), + ) + ); + + $this->register_meta_key( + 'description', + array( + 'label' => __( 'Description', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'email', + array( + 'label' => __( 'Email', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'anonymize', + ) + ); + + $this->register_meta_key( + 'customer_name', + array( + 'label' => __( 'Customer Name', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + + $this->register_meta_key( + 'payment_method', + array( + 'label' => __( 'Payment Method', 'pronamic_ideal' ), + 'privacy_export' => true, + 'privacy_erasure' => 'erase', + ) + ); + } + + /** + * Read post meta. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/abstracts/abstract-wc-data.php#L462-L507 + * + * @param Subscription $subscription The subscription to read the post meta for. + * @return void + */ + protected function read_post_meta( $subscription ) { + $id = $subscription->get_id(); + + if ( empty( $id ) ) { + return; + } + + $subscription->config_id = $this->get_meta_int( $id, 'config_id' ); + $subscription->key = $this->get_meta_string( $id, 'key' ); + $subscription->source = $this->get_meta_string( $id, 'source' ); + $subscription->source_id = $this->get_meta_string( $id, 'source_id' ); + $subscription->frequency = $this->get_meta_int( $id, 'frequency' ); + $subscription->interval = $this->get_meta_int( $id, 'interval' ); + $subscription->interval_period = $this->get_meta_string( $id, 'interval_period' ); + $subscription->transaction_id = $this->get_meta_string( $id, 'transaction_id' ); + $subscription->status = $this->get_meta_string( $id, 'status' ); + $subscription->description = $this->get_meta_string( $id, 'description' ); + $subscription->email = $this->get_meta_string( $id, 'email' ); + $subscription->customer_name = $this->get_meta_string( $id, 'customer_name' ); + $subscription->payment_method = $this->get_meta_string( $id, 'payment_method' ); + + // First Payment. + $first_payment = $subscription->get_first_payment(); + + if ( is_object( $first_payment ) ) { + if ( empty( $subscription->config_id ) ) { + $subscription->config_id = $first_payment->config_id; + } + + if ( empty( $subscription->payment_method ) ) { + $subscription->payment_method = $first_payment->method; + } + + $customer = $subscription->get_customer(); + + $first_customer = $first_payment->get_customer(); + + if ( null !== $customer && null !== $first_customer ) { + $user_id = $customer->get_user_id(); + + if ( empty( $user_id ) ) { + $customer->set_user_id( $first_customer->get_user_id() ); + } + } + } + + // Date interval. + $date_interval = $subscription->get_date_interval(); + + // Start Date. + $start_date = $this->get_meta_date( $id, 'start_date' ); + + if ( empty( $start_date ) ) { + // If no meta start date is set, use subscription date. + $start_date = clone $subscription->date; + } + + $subscription->start_date = $start_date; + + // End Date. + $end_date = $this->get_meta_date( $id, 'end_date' ); + + if ( empty( $end_date ) && null !== $subscription->frequency && null !== $date_interval ) { + // @link https://stackoverflow.com/a/10818981/6411283 + $period = new DatePeriod( $start_date, $date_interval, $subscription->frequency ); + + $dates = iterator_to_array( $period ); + + $end_date = end( $dates ); + } + + $subscription->end_date = $end_date; + + // Expiry Date. + $expiry_date = $this->get_meta_date( $id, 'expiry_date' ); + + if ( empty( $expiry_date ) && null !== $date_interval ) { + // If no meta expiry date is set, use start date + 1 interval period. + $expiry_date = clone $start_date; + + $expiry_date->add( $date_interval ); + } + + $subscription->expiry_date = $expiry_date; + + // Next Payment Date. + $subscription->next_payment_date = $this->get_meta_date( $id, 'next_payment' ); + + // Next Payment Delivery Date. + $subscription->next_payment_delivery_date = $this->get_meta_date( $id, 'next_payment_delivery_date' ); + + if ( empty( $subscription->next_payment_delivery_date ) && null !== $subscription->next_payment_date ) { + $subscription->next_payment_delivery_date = clone $subscription->next_payment_date; + } + + // Legacy. + parent::read_post_meta( $subscription ); + } + + /** + * Update payment post meta. + * + * @link https://github.com/woocommerce/woocommerce/blob/3.2.6/includes/data-stores/class-wc-order-data-store-cpt.php#L154-L257 + * @param Subscription $subscription The subscription to update the post meta for. + * @return void + */ + private function update_post_meta( $subscription ) { + $id = $subscription->get_id(); + + if ( empty( $id ) ) { + return; + } + + $customer = $subscription->get_customer(); + + $this->update_meta( $id, 'config_id', $subscription->config_id ); + $this->update_meta( $id, 'key', $subscription->key ); + $this->update_meta( $id, 'source', $subscription->source ); + $this->update_meta( $id, 'source_id', $subscription->source_id ); + $this->update_meta( $id, 'frequency', $subscription->frequency ); + $this->update_meta( $id, 'interval', $subscription->interval ); + $this->update_meta( $id, 'interval_period', $subscription->interval_period ); + $this->update_meta( $id, 'description', $subscription->description ); + $this->update_meta( $id, 'email', ( null === $customer ? null : $customer->get_email() ) ); + $this->update_meta( $id, 'customer_name', ( null === $customer ? null : strval( $customer->get_name() ) ) ); + $this->update_meta( $id, 'payment_method', $subscription->payment_method ); + $this->update_meta( $id, 'start_date', $subscription->start_date ); + $this->update_meta( $id, 'end_date', $subscription->end_date ); + $this->update_meta( $id, 'expiry_date', $subscription->expiry_date ); + $this->update_meta( $id, 'next_payment', $subscription->next_payment_date ); + $this->update_meta( $id, 'next_payment_delivery_date', $subscription->next_payment_delivery_date ); + + $display_phase = $subscription->get_display_phase(); + + if ( null !== $display_phase ) { + $this->update_meta( $id, 'currency', $display_phase->get_amount()->get_currency()->get_alphabetic_code() ); + $this->update_meta( $id, 'amount', $display_phase->get_amount()->format() ); + } + + $this->update_meta_status( $subscription ); + } + + /** + * Update meta status. + * + * @param Subscription $subscription The subscription to update the status for. + * @return void + */ + public function update_meta_status( $subscription ) { + $id = $subscription->get_id(); + + if ( empty( $id ) ) { + return; + } + + $previous_status = $this->get_meta( $id, 'status' ); + + $this->update_meta( $id, 'status', $subscription->status ); + + if ( $previous_status !== $subscription->status ) { + $old = $previous_status; + $old = empty( $old ) ? 'unknown' : $old; + $old = strtolower( $old ); + + $new = $subscription->status; + $new = empty( $new ) ? 'unknown' : $new; + $new = strtolower( $new ); + + $can_redirect = false; + + do_action( 'pronamic_subscription_status_update_' . $subscription->source . '_' . $old . '_to_' . $new, $subscription, $can_redirect, $previous_status, $subscription->status ); + do_action( 'pronamic_subscription_status_update_' . $subscription->source, $subscription, $can_redirect, $previous_status, $subscription->status ); + do_action( 'pronamic_subscription_status_update', $subscription, $can_redirect, $previous_status, $subscription->status ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php new file mode 100644 index 00000000..d3e3bc75 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsModule.php @@ -0,0 +1,1293 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use DateInterval; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; +use Pronamic\WordPress\Money\TaxedMoney; +use Pronamic\WordPress\Pay\Core\Gateway; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Core\Recurring; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\Core\Util; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; +use WP_CLI; +use WP_Error; +use WP_Query; + +/** + * Title: Subscriptions module + * Description: + * Copyright: 2005-2021 Pronamic + * Company: Pronamic + * + * @link https://woocommerce.com/2017/04/woocommerce-3-0-release/ + * @link https://woocommerce.wordpress.com/2016/10/27/the-new-crud-classes-in-woocommerce-2-7/ + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.0.1 + */ +class SubscriptionsModule { + /** + * Plugin. + * + * @var Plugin $plugin + */ + public $plugin; + + /** + * Privacy. + * + * @var SubscriptionsPrivacy + */ + public $privacy; + + /** + * Construct and initialize a subscriptions module object. + * + * @param Plugin $plugin The plugin. + */ + public function __construct( Plugin $plugin ) { + $this->plugin = $plugin; + + // Subscriptions privacy exporters and erasers. + $this->privacy = new SubscriptionsPrivacy(); + + // Actions. + add_action( 'wp_loaded', array( $this, 'handle_subscription' ) ); + + add_action( 'plugins_loaded', array( $this, 'maybe_schedule_subscription_events' ), 6 ); + + // Exclude subscription notes. + add_filter( 'comments_clauses', array( $this, 'exclude_subscription_comment_notes' ), 10, 2 ); + + add_action( 'pronamic_pay_new_payment', array( $this, 'maybe_create_subscription' ) ); + + // The 'pronamic_pay_update_subscription_payments' hook adds subscription payments and sends renewal notices. + add_action( 'pronamic_pay_update_subscription_payments', array( $this, 'update_subscription_payments' ) ); + + // The 'pronamic_pay_complete_subscriptions' hook completes active subscriptions. + add_action( 'pronamic_pay_complete_subscriptions', array( $this, 'complete_subscriptions' ) ); + + // Listen to payment status changes so we can update related subscriptions. + add_action( 'pronamic_payment_status_update', array( $this, 'payment_status_update' ) ); + + // Listen to subscription status changes so we can log these in a note. + add_action( 'pronamic_subscription_status_update', array( $this, 'log_subscription_status_update' ), 10, 4 ); + + // WordPress CLI. + // @link https://github.com/woocommerce/woocommerce/blob/3.3.1/includes/class-woocommerce.php#L365-L369. + // @link https://github.com/woocommerce/woocommerce/blob/3.3.1/includes/class-wc-cli.php. + // @link https://make.wordpress.org/cli/handbook/commands-cookbook/. + if ( Util::doing_cli() ) { + WP_CLI::add_command( 'pay subscriptions test', array( $this, 'cli_subscriptions_test' ) ); + } + + // REST API. + add_action( 'rest_api_init', array( $this, 'rest_api_init' ) ); + } + + /** + * Handle subscription actions. + * + * Extensions like Gravity Forms can send action links in for example + * email notifications so users can cancel or renew their subscription. + * + * @return void + */ + public function handle_subscription() { + if ( ! Util::input_has_vars( INPUT_GET, array( 'subscription', 'action', 'key' ) ) ) { + return; + } + + Util::no_cache(); + + $subscription_id = filter_input( INPUT_GET, 'subscription', FILTER_SANITIZE_STRING ); + $action = filter_input( INPUT_GET, 'action', FILTER_SANITIZE_STRING ); + $key = filter_input( INPUT_GET, 'key', FILTER_SANITIZE_STRING ); + + $subscription = get_pronamic_subscription( $subscription_id ); + + // Check if subscription and key are valid. + if ( ! $subscription || $key !== $subscription->get_key() ) { + wp_safe_redirect( home_url() ); + + exit; + } + + // Handle action. + switch ( $action ) { + case 'cancel': + $this->handle_subscription_cancel( $subscription ); + + break; + case 'renew': + $this->handle_subscription_renew( $subscription ); + + break; + case 'mandate': + $this->handle_subscription_mandate( $subscription ); + + exit; + } + } + + /** + * Handle cancel subscription action request. + * + * @param Subscription $subscription Subscription to cancel. + * @return void + */ + private function handle_subscription_cancel( Subscription $subscription ) { + if ( + 'POST' === Server::get( 'REQUEST_METHOD' ) + && + SubscriptionStatus::CANCELLED !== $subscription->get_status() + ) { + $subscription->set_status( SubscriptionStatus::CANCELLED ); + + $subscription->save(); + + $url = \home_url(); + + $page_id = \pronamic_pay_get_page_id( 'subscription_canceled' ); + + if ( $page_id > 0 ) { + $page_url = \get_permalink( $page_id ); + + if ( false !== $page_url ) { + $url = $page_url; + } + } + + \wp_safe_redirect( $url ); + + exit; + } + + require __DIR__ . '/../../views/subscription-cancel.php'; + + exit; + } + + /** + * Handle renew subscription action request. + * + * @param Subscription $subscription Subscription to renew. + * @return void + * @throws \Exception Throws exception if unable to redirect (empty payment action URL). + */ + private function handle_subscription_renew( Subscription $subscription ) { + $gateway = Plugin::get_gateway( $subscription->config_id ); + + if ( empty( $gateway ) ) { + require __DIR__ . '/../../views/subscription-renew-failed.php'; + + exit; + } + + if ( 'POST' === Server::get( 'REQUEST_METHOD' ) ) { + try { + $payment = $this->new_subscription_payment( $subscription ); + + if ( null === $payment ) { + throw new \Exception( 'Unable to create renewal payment for subscription.' ); + } + + $payment->recurring = false; + + $payment = $this->start_payment( $payment ); + } catch ( \Exception $e ) { + require __DIR__ . '/../../views/subscription-renew-failed.php'; + + exit; + } + + $error = $gateway->get_error(); + + if ( $error instanceof WP_Error ) { + Plugin::render_errors( $error ); + + exit; + } + + $gateway->redirect( $payment ); + + return; + } + + // Payment method input HTML. + $gateway->set_payment_method( $subscription->payment_method ); + + require __DIR__ . '/../../views/subscription-renew.php'; + + exit; + } + + /** + * Handle subscription mandate update action request. + * + * @param Subscription $subscription Subscription to update mandate for. + * @return void + * @throws \Exception Throws exception if unable to redirect (empty payment action URL). + */ + private function handle_subscription_mandate( Subscription $subscription ) { + $gateway = Plugin::get_gateway( $subscription->config_id ); + + if ( empty( $gateway ) ) { + require __DIR__ . '/../../views/subscription-mandate-failed.php'; + + exit; + } + + $nonce = filter_input( \INPUT_POST, 'pronamic_pay_nonce', \FILTER_SANITIZE_STRING ); + + if ( \wp_verify_nonce( $nonce, 'pronamic_pay_update_subscription_mandate' ) ) { + $mandate_id = \filter_input( \INPUT_POST, 'pronamic_pay_subscription_mandate', \FILTER_SANITIZE_STRING ); + + if ( ! empty( $mandate_id ) ) { + try { + if ( ! \is_callable( array( $gateway, 'update_subscription_mandate' ) ) ) { + throw new \Exception( __( 'Gateway does not support subscription mandate updates.', 'pronamic_ideal' ) ); + } + + $gateway->update_subscription_mandate( $subscription, $mandate_id ); + + require __DIR__ . '/../../views/subscription-mandate-updated.php'; + + exit; + } catch ( \Exception $e ) { + require __DIR__ . '/../../views/subscription-mandate-failed.php'; + + exit; + } + } + + // Start new first payment. + try { + $payment = $this->new_subscription_payment( $subscription ); + + $payment_method = \filter_input( \INPUT_POST, 'pronamic_pay_subscription_payment_method', \FILTER_SANITIZE_STRING ); + + if ( null !== $payment && ! empty( $payment_method ) ) { + $payment->method = $payment_method; + } + + if ( null === $payment ) { + require __DIR__ . '/../../views/subscription-mandate-failed.php'; + + exit; + } + + $payment->recurring = false; + + /* + * Use payment method minimum amount for verification payment. + * + * @link https://help.mollie.com/hc/en-us/articles/115000667365-What-are-the-minimum-and-maximum-amounts-per-payment-method- + */ + switch ( $payment->method ) { + case PaymentMethods::DIRECT_DEBIT_BANCONTACT: + $amount = 0.02; + + break; + case PaymentMethods::DIRECT_DEBIT_SOFORT: + $amount = 0.10; + + break; + default: + $amount = 0.01; + } + + $payment->set_total_amount( + new TaxedMoney( + $amount, + $payment->get_total_amount()->get_currency() + ) + ); + + // Make sure to only start payments for supported gateways. + $gateway = Plugin::get_gateway( $payment->get_config_id() ); + + if ( null === $gateway ) { + require __DIR__ . '/../../views/subscription-mandate-failed.php'; + + exit; + } + + // Start payment. + $payment = Plugin::start_payment( $payment, $gateway ); + } catch ( \Exception $e ) { + require __DIR__ . '/../../views/subscription-mandate-failed.php'; + + exit; + } + + $error = $gateway->get_error(); + + if ( $error instanceof WP_Error ) { + Plugin::render_errors( $error ); + + exit; + } + + $gateway->redirect( $payment ); + + return; + } + + \wp_register_script( + 'pronamic-pay-subscription-mandate', + 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.js', + array( 'jquery' ), + $this->plugin->get_version(), + false + ); + + \wp_register_style( + 'pronamic-pay-card-slider-slick', + 'https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.css', + array(), + $this->plugin->get_version() + ); + + \wp_register_style( + 'pronamic-pay-card-slider-google-font', + 'https://fonts.googleapis.com/css2?family=Roboto+Mono&display=swap', + array(), + $this->plugin->get_version() + ); + + \wp_register_style( + 'pronamic-pay-subscription-mandate', + plugins_url( 'css/card-slider.css', dirname( dirname( __FILE__ ) ) ), + array( 'pronamic-pay-redirect', 'pronamic-pay-card-slider-slick', 'pronamic-pay-card-slider-google-font' ), + $this->plugin->get_version() + ); + + require __DIR__ . '/../../views/subscription-mandate.php'; + + exit; + } + + /** + * Create a new subscription payment. + * + * @param Subscription $subscription Subscription. + * @return null|Payment + */ + public function new_subscription_payment( Subscription $subscription ) { + // Prevent creating a new subscription payment if next payment date is (later than) the subscription end date. + if ( isset( $subscription->end_date, $subscription->next_payment_date ) && $subscription->next_payment_date >= $subscription->end_date ) { + $subscription->next_payment_date = null; + $subscription->next_payment_delivery_date = null; + + // Delete next payment post meta. + $subscription->set_meta( 'next_payment', null ); + $subscription->set_meta( 'next_payment_delivery_date', null ); + + return null; + } + + // Create payment. + $payment = new Payment(); + + $payment->config_id = $subscription->get_config_id(); + $payment->order_id = $subscription->get_order_id(); + $payment->description = $subscription->description; + $payment->source = $subscription->get_source(); + $payment->source_id = $subscription->get_source_id(); + $payment->email = $subscription->get_email(); + $payment->method = $subscription->payment_method; + $payment->issuer = $subscription->issuer; + $payment->recurring = true; + $payment->subscription = $subscription; + $payment->subscription_id = $subscription->get_id(); + + $payment->set_origin_id( $subscription->get_origin_id() ); + $payment->set_customer( $subscription->get_customer() ); + $payment->set_billing_address( $subscription->get_billing_address() ); + $payment->set_shipping_address( $subscription->get_shipping_address() ); + $payment->set_lines( $subscription->get_lines() ); + + // Get amount from current subscription phase. + $current_phase = $subscription->get_current_phase(); + + if ( null === $current_phase ) { + return null; + } + + $payment->set_total_amount( $current_phase->get_amount() ); + + return $payment; + } + + /** + * Start payment. + * + * @param Payment $payment Payment. + * + * @throws \UnexpectedValueException Throw unexpected value exception when no subscription was found in payment. + * + * @return Payment + */ + public function start_payment( Payment $payment ) { + // Set recurring type. + if ( $payment->get_recurring() ) { + $payment->recurring_type = Recurring::RECURRING; + } + + $subscription = $payment->get_subscription(); + + if ( empty( $subscription ) ) { + throw new \UnexpectedValueException( 'No subscription object found in payment.' ); + } + + // Calculate payment start and end dates. + $periods = $payment->get_periods(); + + if ( null === $periods ) { + $period = $subscription->new_period(); + + if ( null === $period ) { + throw new \UnexpectedValueException( 'Can not create new period for subscription.' ); + } + + $payment->add_period( $period ); + } + + $periods = $payment->get_periods(); + + if ( null === $periods ) { + throw new \UnexpectedValueException( 'Can not create payment without period for subscription.' ); + } + + $period = reset( $periods ); + + if ( false === $period ) { + throw new \UnexpectedValueException( 'Can not create payment without period for subscription.' ); + } + + $start_date = $period->get_start_date(); + $end_date = $period->get_end_date(); + + $subscription->next_payment_date = SubscriptionHelper::calculate_next_payment_date( $subscription ); + $subscription->next_payment_delivery_date = SubscriptionHelper::calculate_next_payment_delivery_date( $subscription ); + + // Unset next payment date if this is the last payment according to subscription end date. + if ( null !== $subscription->end_date && $subscription->next_payment_date >= $subscription->end_date ) { + $subscription->next_payment_date = null; + } + + // Delete next payment post meta if not set. + if ( null === $subscription->next_payment_date ) { + $subscription->next_payment_delivery_date = null; + + $subscription->set_meta( 'next_payment', null ); + $subscription->set_meta( 'next_payment_delivery_date', null ); + } + + $payment->start_date = $start_date; + $payment->end_date = $end_date; + + // Update subscription. + $subscription->save(); + + // Start payment. + $payment = Plugin::start_payment( $payment ); + + return $payment; + } + + /** + * Can payment be retried. + * + * @param Payment $payment Payment to retry. + * @return bool + */ + public function can_retry_payment( Payment $payment ) { + // Check status. + if ( PaymentStatus::FAILURE !== $payment->get_status() ) { + return false; + } + + // Check recurring. + if ( ! $payment->get_recurring() ) { + return false; + } + + // Check periods. + $periods = $payment->get_periods(); + + if ( null === $periods ) { + return false; + } + + // Check for pending and successful child payments. + $payments = \get_pronamic_payments_by_meta( '', '', array( 'post_parent' => $payment->get_id() ) ); + + foreach ( $payments as $child_payment ) { + if ( \in_array( $child_payment->get_status(), array( PaymentStatus::OPEN, PaymentStatus::SUCCESS ), true ) ) { + return false; + } + } + + return true; + } + + /** + * New payment based on period. + * + * @param SubscriptionPeriod $period Subscription period. + * @return Payment + * @throws \Exception Throws exception if gateway integration can not be found. + */ + public function new_period_payment( SubscriptionPeriod $period ) { + $subscription = $period->get_phase()->get_subscription(); + + $config_id = (int) $subscription->get_config_id(); + + $integration_id = \get_post_meta( $config_id, '_pronamic_gateway_id', true ); + + $integration = $this->plugin->gateway_integrations->get_integration( $integration_id ); + + if ( null === $integration ) { + throw new \Exception( 'Gateway integration could not be found while creating new subscription period payment.' ); + } + + $config = $integration->get_config( $config_id ); + + if ( null === $config ) { + throw new \Exception( 'Config could not be found while creating new subscription period payment.' ); + } + + $payment = new Payment(); + + $payment->email = $subscription->get_email(); + $payment->method = $subscription->payment_method; + $payment->issuer = $subscription->get_issuer(); + $payment->recurring = true; + $payment->subscription = $subscription; + $payment->subscription_id = $subscription->get_id(); + + $payment->set_description( $subscription->get_description() ); + $payment->set_config_id( $config_id ); + $payment->set_origin_id( $subscription->get_origin_id() ); + $payment->set_mode( $config->mode ); + + $payment->set_source( $subscription->get_source() ); + $payment->set_source_id( $subscription->get_source_id() ); + + $payment->set_customer( $subscription->get_customer() ); + $payment->set_billing_address( $subscription->get_billing_address() ); + $payment->set_shipping_address( $subscription->get_shipping_address() ); + + $payment->add_period( $period ); + $payment->set_start_date( $period->get_start_date() ); + $payment->set_end_date( $period->get_end_date() ); + + $payment->set_lines( $subscription->get_lines() ); + $payment->set_total_amount( $period->get_phase()->get_amount() ); + + return $payment; + } + + /** + * Start payment for next period. + * + * @param Subscription $subscription Subscription. + * @return Payment|null + */ + public function start_next_period_payment( Subscription $subscription ) { + $next_period = $subscription->new_period(); + + if ( null === $next_period ) { + return null; + } + + // Start payment for next period. + $payment = null; + + try { + $payment = $this->new_period_payment( $next_period ); + + $this->start_payment( $payment ); + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + + exit; + } + + return $payment; + } + + /** + * Retry a payment by starting a payment for each period of given payment. + * + * @param Payment $payment Payment. + * @return array|null + */ + public function retry_payment( Payment $payment ) { + // Check if payment can be retried. + if ( ! $this->can_retry_payment( $payment ) ) { + return null; + } + + // Check periods. + $periods = $payment->get_periods(); + + if ( null === $periods ) { + return null; + } + + // Start new payment for period. + $payments = array(); + + foreach ( $periods as $period ) { + try { + $period_payment = $this->new_period_payment( $period ); + + $period_payment->set_source( $payment->get_source() ); + $period_payment->set_source_id( $payment->get_source_id() ); + + $period_payment = $this->start_payment( $period_payment ); + + $payments[] = $period_payment; + } catch ( \Exception $e ) { + Plugin::render_exception( $e ); + + exit; + } + } + + return $payments; + } + + /** + * Comments clauses. + * + * @param array $clauses The database query clauses. + * @param \WP_Comment_Query $query The WordPress comment query object. + * @return array + */ + public function exclude_subscription_comment_notes( $clauses, $query ) { + $type = $query->query_vars['type']; + + // Ignore subscription notes comments if it's not specifically requested. + if ( 'subscription_note' !== $type ) { + $clauses['where'] .= " AND comment_type != 'subscription_note'"; + } + + return $clauses; + } + + /** + * Maybe schedule subscription payments. + * + * @return void + */ + public function maybe_schedule_subscription_events() { + if ( ! wp_next_scheduled( 'pronamic_pay_update_subscription_payments' ) ) { + wp_schedule_event( time(), 'hourly', 'pronamic_pay_update_subscription_payments' ); + } + + if ( ! wp_next_scheduled( 'pronamic_pay_complete_subscriptions' ) ) { + wp_schedule_event( time(), 'hourly', 'pronamic_pay_complete_subscriptions' ); + } + } + + /** + * Maybe create subscription for the specified payment. + * + * @param Payment $payment The new payment. + * + * @return void + * + * @throws \UnexpectedValueException Throw unexpected value exception if the subscription does not have a valid date interval. + */ + public function maybe_create_subscription( $payment ) { + // Check if there is already subscription attached to the payment. + $subscription_id = $payment->get_subscription_id(); + + if ( ! empty( $subscription_id ) ) { + // Subscription already created. + return; + } + + // Check if there is a subscription object attached to the payment. + $subscription = $payment->subscription; + + if ( empty( $subscription ) ) { + return; + } + + // Complement subscription. + SubscriptionHelper::complement_subscription( $subscription ); + SubscriptionHelper::complement_subscription_by_payment( $subscription, $payment ); + SubscriptionHelper::complement_subscription_dates( $subscription ); + + // Create. + $result = $this->plugin->subscriptions_data_store->create( $subscription ); + + if ( $result ) { + $payment->subscription = $subscription; + $payment->subscription_id = $subscription->get_id(); + + $payment->recurring_type = Recurring::FIRST; + + $start_date = $subscription->get_start_date(); + $end_date = $subscription->get_next_payment_date(); + + $payment->start_date = ( null === $start_date ) ? null : clone $start_date; + $payment->end_date = ( null === $end_date ) ? null : clone $end_date; + + $payment->save(); + } + } + + /** + * Get expiring subscriptions. + * + * @link https://github.com/wp-premium/edd-software-licensing/blob/3.5.23/includes/license-renewals.php#L715-L746 + * @link https://github.com/wp-premium/edd-software-licensing/blob/3.5.23/includes/license-renewals.php#L652-L712 + * + * @param DateTime $start_date The start date of the period to check for expiring subscriptions. + * @param DateTime $end_date The end date of the period to check for expiring subscriptions. + * @return array + */ + public function get_expiring_subscription_posts( DateTime $start_date, DateTime $end_date ) { + $args = array( + 'post_type' => 'pronamic_pay_subscr', + 'nopaging' => true, + 'orderby' => 'post_date', + 'order' => 'ASC', + 'post_status' => array( + 'subscr_pending', + 'subscr_failed', + 'subscr_active', + ), + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_expiry_date', + 'value' => array( + $start_date->format( DateTime::MYSQL ), + $end_date->format( DateTime::MYSQL ), + ), + 'compare' => 'BETWEEN', + 'type' => 'DATETIME', + ), + ), + ); + + $query = new WP_Query( $args ); + + return $query->posts; + } + + /** + * Payment status update. + * + * @param Payment $payment The status updated payment. + * @return void + */ + public function payment_status_update( $payment ) { + // Check if the payment is connected to a subscription. + $subscription = $payment->get_subscription(); + + if ( empty( $subscription ) || null === $subscription->get_id() ) { + // Payment not connected to a subscription, nothing to do. + return; + } + + // Status. + $status_before = $subscription->get_status(); + $status_update = $status_before; + + switch ( $payment->get_status() ) { + case PaymentStatus::OPEN: + // @todo + break; + case PaymentStatus::SUCCESS: + $status_update = SubscriptionStatus::ACTIVE; + + if ( isset( $subscription->expiry_date, $payment->end_date ) && $subscription->expiry_date < $payment->end_date ) { + $subscription->expiry_date = clone $payment->end_date; + } + + break; + case PaymentStatus::FAILURE: + /** + * Subscription status for failed payment. + * + * @todo Determine update status based on reason of failed payment. Use `failure` for now as that is usually the desired status. + * + * @link https://www.europeanpaymentscouncil.eu/document-library/guidance-documents/guidance-reason-codes-sepa-direct-debit-r-transactions + * @link https://github.com/pronamic/wp-pronamic-ideal/commit/48449417eac49eb6a93480e3b523a396c7db9b3d#diff-6712c698c6b38adfa7190a4be983a093 + */ + $status_update = SubscriptionStatus::FAILURE; + + break; + case PaymentStatus::CANCELLED: + case PaymentStatus::EXPIRED: + $first_payment = $subscription->get_first_payment(); + + // Set subscription status to 'On Hold' only if the subscription is not already active when processing the first payment. + if ( ! ( null !== $first_payment && $first_payment->get_id() === $payment->get_id() && SubscriptionStatus::ACTIVE === $subscription->get_status() ) ) { + $status_update = SubscriptionStatus::ON_HOLD; + } + + break; + } + + // The status of canceled or completed subscriptions will not be changed automatically. + if ( ! in_array( $status_before, array( SubscriptionStatus::CANCELLED, SubscriptionStatus::COMPLETED, SubscriptionStatus::ON_HOLD ), true ) ) { + $subscription->set_status( $status_update ); + } + + // Update. + $subscription->save(); + } + + /** + * Get subscription status update note. + * + * @param string|null $old_status Old meta status. + * @param string $new_status New meta status. + * @return string + */ + private function get_subscription_status_update_note( $old_status, $new_status ) { + $old_label = $this->plugin->subscriptions_data_store->get_meta_status_label( $old_status ); + $new_label = $this->plugin->subscriptions_data_store->get_meta_status_label( $new_status ); + + if ( null === $old_status ) { + return sprintf( + /* translators: 1: new status */ + __( 'Subscription created with status "%1$s".', 'pronamic_ideal' ), + esc_html( empty( $new_label ) ? $new_status : $new_label ) + ); + } + + return sprintf( + /* translators: 1: old status, 2: new status */ + __( 'Subscription status changed from "%1$s" to "%2$s".', 'pronamic_ideal' ), + esc_html( empty( $old_label ) ? $old_status : $old_label ), + esc_html( empty( $new_label ) ? $new_status : $new_label ) + ); + } + + /** + * Subscription status update. + * + * @param Subscription $subscription The status updated subscription. + * @param bool $can_redirect Whether or not redirects should be performed. + * @param string|null $old_status Old meta status. + * @param string $new_status New meta status. + * + * @return void + */ + public function log_subscription_status_update( $subscription, $can_redirect, $old_status, $new_status ) { + $note = $this->get_subscription_status_update_note( $old_status, $new_status ); + + try { + $subscription->add_note( $note ); + } catch ( \Exception $e ) { + return; + } + } + + /** + * Send renewal notices. + * + * @link https://github.com/wp-premium/edd-software-licensing/blob/3.5.23/includes/license-renewals.php#L652-L712 + * @link https://github.com/wp-premium/edd-software-licensing/blob/3.5.23/includes/license-renewals.php#L715-L746 + * @link https://github.com/wp-premium/edd-software-licensing/blob/3.5.23/includes/classes/class-sl-emails.php#L41-L126 + * + * @return void + * + * @throws \Exception Throws exception on start date error. + */ + public function send_subscription_renewal_notices() { + $interval = new DateInterval( 'P1W' ); // 1 week + + $start_date = new DateTime( 'midnight', new DateTimeZone( 'UTC' ) ); + + $end_date = clone $start_date; + $end_date->add( $interval ); + + $expiring_subscription_posts = $this->get_expiring_subscription_posts( $start_date, $end_date ); + + foreach ( $expiring_subscription_posts as $post ) { + $subscription = new Subscription( $post->ID ); + + // If expiry date is null we continue, subscription is not expiring. + $expiry_date = $subscription->get_expiry_date(); + + if ( null === $expiry_date ) { + continue; + } + + // Date interval. + $date_interval = $subscription->get_date_interval(); + + if ( null === $date_interval ) { + continue; + } + + $sent_date_string = get_post_meta( $post->ID, '_pronamic_subscription_renewal_sent_1week', true ); + + if ( $sent_date_string ) { + $first_date = clone $expiry_date; + $first_date->sub( $date_interval ); + + $sent_date = new DateTime( $sent_date_string, new DateTimeZone( 'UTC' ) ); + + if ( $sent_date >= $first_date || $expiry_date < $subscription->get_next_payment_date() ) { + // Prevent renewal notices from being sent more than once. + continue; + } + + delete_post_meta( $post->ID, '_pronamic_subscription_renewal_sent_1week' ); + } + + // Add renewal notice payment note. + $note = sprintf( + /* translators: %s: expiry date */ + __( 'Subscription renewal due on %s.', 'pronamic_ideal' ), + $expiry_date->format_i18n() + ); + + $subscription->add_note( $note ); + + // Send renewal notice. + do_action( 'pronamic_subscription_renewal_notice_' . $subscription->get_source(), $subscription ); + + // Update renewal notice sent date meta. + $renewal_sent_date = clone $start_date; + + $renewal_sent_date->setTime( + intval( $expiry_date->format( 'H' ) ), + intval( $expiry_date->format( 'i' ) ), + intval( $expiry_date->format( 's' ) ) + ); + + update_post_meta( $post->ID, '_pronamic_subscription_renewal_sent_1week', $renewal_sent_date->format( DateTime::MYSQL ) ); + } + } + + /** + * Update subscription payments. + * + * @param bool $cli_test Whether or not this a CLI test. + * @return void + */ + public function update_subscription_payments( $cli_test = false ) { + $this->send_subscription_renewal_notices(); + + $args = array( + 'post_type' => 'pronamic_pay_subscr', + 'nopaging' => true, + 'orderby' => 'post_date', + 'order' => 'ASC', + 'post_status' => array( + 'subscr_pending', + 'subscr_failed', + 'subscr_active', + ), + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_source', + 'compare' => 'NOT IN', + 'value' => array( + // Don't create payments for sources which schedule payments. + 'woocommerce', + ), + ), + ), + ); + + if ( ! $cli_test ) { + $args['meta_query'][] = array( + 'relation' => 'OR', + array( + 'key' => '_pronamic_subscription_next_payment', + 'compare' => '<=', + 'value' => current_time( 'mysql', true ), + 'type' => 'DATETIME', + ), + array( + 'key' => '_pronamic_subscription_next_payment_delivery_date', + 'compare' => '<=', + 'value' => current_time( 'mysql', true ), + 'type' => 'DATETIME', + ), + ); + } + + $query = new WP_Query( $args ); + + foreach ( $query->posts as $post ) { + if ( $cli_test ) { + WP_CLI::log( sprintf( 'Processing post `%d` - "%s"…', $post->ID, get_the_title( $post ) ) ); + } + + $subscription = new Subscription( $post->ID ); + + $gateway = Plugin::get_gateway( $subscription->config_id ); + + // If gateway is null we continue to next subscription. + if ( null === $gateway ) { + continue; + } + + // Start payment. + try { + $payment = $this->new_subscription_payment( $subscription ); + + if ( null === $payment ) { + continue; + } + + $payment->recurring = true; + + $payment = $this->start_payment( $payment ); + } catch ( \Exception $e ) { + if ( $cli_test ) { + WP_CLI::error( $e->getMessage(), false ); + } + + continue; + } + + if ( is_object( $payment ) ) { + // Update payment. + Plugin::update_payment( $payment, false ); + } + + // Expire manual renewal subscriptions. + if ( ! $gateway->supports( 'recurring' ) ) { + $now = new DateTime(); + + if ( PaymentStatus::COMPLETED !== $subscription->status && isset( $subscription->expiry_date ) && $subscription->expiry_date <= $now ) { + $subscription->status = PaymentStatus::EXPIRED; + + $subscription->save(); + + // Delete next payment date so it won't get used as start date + // of the new payment period when manually renewing and to keep + // the subscription out of updating subscription payments (this method). + $subscription->set_meta( 'next_payment', null ); + } + } + } + } + + /** + * Complete subscriptions. + * + * @param bool $cli_test Whether or not this a CLI test. + * @return void + */ + public function complete_subscriptions( $cli_test = false ) { + $args = array( + 'post_type' => 'pronamic_pay_subscr', + 'nopaging' => true, + 'orderby' => 'post_date', + 'order' => 'ASC', + 'post_status' => 'subscr_active', + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_source', + 'compare' => 'NOT IN', + 'value' => array( + // Don't create payments for sources which schedule payments. + 'woocommerce', + ), + ), + array( + 'relation' => 'AND', + array( + 'key' => '_pronamic_subscription_next_payment', + 'compare' => 'NOT EXISTS', + ), + ), + ), + ); + + if ( ! $cli_test ) { + $args['meta_query'][1][] = array( + 'key' => '_pronamic_subscription_end_date', + 'compare' => '<=', + 'value' => current_time( 'mysql', true ), + 'type' => 'DATETIME', + ); + } + + $query = new WP_Query( $args ); + + foreach ( $query->posts as $post ) { + if ( $cli_test ) { + WP_CLI::log( sprintf( 'Processing post `%d` - "%s"…', $post->ID, get_the_title( $post ) ) ); + } + + // Complete subscription. + try { + $subscription = new Subscription( $post->ID ); + + $subscription->status = SubscriptionStatus::COMPLETED; + $subscription->expiry_date = $subscription->end_date; + + $subscription->save(); + } catch ( \Exception $e ) { + continue; + } + } + } + + /** + * CLI subscriptions test. + * + * @return void + */ + public function cli_subscriptions_test() { + $cli_test = true; + + WP_CLI::log( 'Updating subscription payments…' ); + + $this->update_subscription_payments( $cli_test ); + + WP_CLI::log( 'Completing subscriptions…' ); + + $this->complete_subscriptions( $cli_test ); + + WP_CLI::success( 'Pronamic Pay subscriptions test.' ); + } + + /** + * REST API init. + * + * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/ + * @link https://developer.wordpress.org/reference/hooks/rest_api_init/ + * + * @return void + */ + public function rest_api_init() { + \register_rest_route( + 'pronamic-pay/v1', + '/subscriptions/(?P\d+)', + array( + 'methods' => 'GET', + 'callback' => array( $this, 'rest_api_subscription' ), + 'permission_callback' => function() { + return \current_user_can( 'edit_payments' ); + }, + 'args' => array( + 'subscription_id' => array( + 'description' => __( 'Subscription ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + ), + ) + ); + + \register_rest_route( + 'pronamic-pay/v1', + '/subscriptions/(?P\d+)/phases/(?P\d+)', + array( + 'methods' => 'GET', + 'callback' => array( $this, 'rest_api_subscription_phase' ), + 'permission_callback' => function() { + return \current_user_can( 'edit_payments' ); + }, + 'args' => array( + 'subscription_id' => array( + 'description' => __( 'Subscription ID.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + 'sequence_number' => array( + 'description' => __( 'Subscription phase sequence number.', 'pronamic_ideal' ), + 'type' => 'integer', + ), + ), + ) + ); + } + + /** + * REST API subscription. + * + * @param \WP_REST_Request $request Request. + * @return object + */ + public function rest_api_subscription( \WP_REST_Request $request ) { + $subscription_id = $request->get_param( 'subscription_id' ); + + $subscription = \get_pronamic_subscription( $subscription_id ); + + if ( null === $subscription ) { + return new \WP_Error( + 'pronamic-pay-subscription-not-found', + \sprintf( + /* translators: %s: Subscription ID */ + \__( 'Could not find subscription with ID `%s`.', 'pronamic_ideal' ), + $subscription_id + ), + $subscription_id + ); + } + + return $subscription; + } + + /** + * REST API subscription phase. + * + * @param \WP_REST_Request $request Request. + * @return object + */ + public function rest_api_subscription_phase( \WP_REST_Request $request ) { + $subscription_id = $request->get_param( 'subscription_id' ); + + $subscription = \get_pronamic_subscription( $subscription_id ); + + if ( null === $subscription ) { + return new \WP_Error( + 'pronamic-pay-subscription-not-found', + \sprintf( + /* translators: %s: Subscription ID */ + \__( 'Could not find subscription with ID `%s`.', 'pronamic_ideal' ), + $subscription_id + ), + $subscription_id + ); + } + + $sequence_number = $request->get_param( 'sequence_number' ); + + $phase = $subscription->get_phase_by_sequence_number( $sequence_number ); + + if ( null === $phase ) { + return new \WP_Error( + 'pronamic-pay-subscription-phase-not-found', + \sprintf( + /* translators: %s: Subscription ID */ + \__( 'Could not find subscription phase with sequence number `%s`.', 'pronamic_ideal' ), + $sequence_number + ), + $sequence_number + ); + } + + return $phase; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php new file mode 100644 index 00000000..7bb42879 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Subscriptions/SubscriptionsPrivacy.php @@ -0,0 +1,246 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Subscriptions + */ + +namespace Pronamic\WordPress\Pay\Subscriptions; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Subscriptions Privacy class. + * + * @author Reüel van der Steege + * @version 2.2.6 + * @since 2.0.2 + */ +class SubscriptionsPrivacy { + /** + * Subscriptions privacy constructor. + */ + public function __construct() { + // Register exporters. + add_action( 'pronamic_pay_privacy_register_exporters', array( $this, 'register_exporters' ) ); + + // Register erasers. + add_action( 'pronamic_pay_privacy_register_erasers', array( $this, 'register_erasers' ) ); + } + + /** + * Register privacy exporters. + * + * @param \Pronamic\WordPress\Pay\PrivacyManager $privacy_manager Privacy manager. + * + * @return void + */ + public function register_exporters( $privacy_manager ) { + // Subscriptions export. + $privacy_manager->add_exporter( + 'subscriptions', + __( 'Subscriptions', 'pronamic_ideal' ), + array( $this, 'subscriptions_export' ) + ); + } + + /** + * Register privacy erasers. + * + * @param \Pronamic\WordPress\Pay\PrivacyManager $privacy_manager Privacy manager. + * + * @return void + */ + public function register_erasers( $privacy_manager ) { + // Subscriptions anonymizer. + $privacy_manager->add_eraser( + 'subscriptions', + __( 'Subscriptions', 'pronamic_ideal' ), + array( $this, 'subscriptions_anonymizer' ) + ); + } + + /** + * Subscriptions exporter. + * + * @param string $email_address Email address. + * @param int $page Page. + * + * @return array + */ + public function subscriptions_export( $email_address, $page = 1 ) { + // Subscriptions data store. + $data_store = pronamic_pay_plugin()->subscriptions_data_store; + + // Privacy manager. + $privacy_manager = pronamic_pay_plugin()->privacy_manager; + + // Get subscriptions. + // @todo use paging. + $subscriptions = get_pronamic_subscriptions_by_meta( + $data_store->meta_key_prefix . 'email', + $email_address + ); + + // Get registered meta keys for export. + $meta_keys = wp_list_filter( + $data_store->get_registered_meta(), + array( + 'privacy_export' => true, + ) + ); + + $items = array(); + + // Loop subscriptions. + foreach ( $subscriptions as $subscription ) { + $export_data = array(); + + $id = $subscription->get_id(); + + if ( empty( $id ) ) { + continue; + } + + $subscription_meta = get_post_meta( $id ); + + // Get subscription meta. + foreach ( $meta_keys as $meta_key => $meta_options ) { + $meta_key = $data_store->meta_key_prefix . $meta_key; + + if ( ! array_key_exists( $meta_key, $subscription_meta ) ) { + continue; + } + + // Add export value. + $export_data[] = $privacy_manager->export_meta( $meta_key, $meta_options, $subscription_meta ); + } + + // Add item to export data. + if ( ! empty( $export_data ) ) { + $items[] = array( + 'group_id' => 'pronamic-pay-subscriptions', + 'group_label' => __( 'Subscriptions', 'pronamic_ideal' ), + 'item_id' => 'pronamic-pay-subscription-' . $id, + 'data' => $export_data, + ); + } + } + + $done = true; + + // Return export data. + return array( + 'data' => $items, + 'done' => $done, + ); + } + + /** + * Subscriptions anonymizer. + * + * @param string $email_address Email address. + * @param int $page Page. + * + * @return array + */ + public function subscriptions_anonymizer( $email_address, $page = 1 ) { + // Subscriptions data store. + $data_store = pronamic_pay_plugin()->subscriptions_data_store; + + // Privacy manager. + $privacy_manager = pronamic_pay_plugin()->privacy_manager; + + // Return values. + $items_removed = false; + $items_retained = false; + $messages = array(); + $done = false; + + // Get subscriptions. + // @todo use paging. + $subscriptions = get_pronamic_subscriptions_by_meta( + $data_store->meta_key_prefix . 'email', + $email_address + ); + + // Get registered meta keys for erasure. + $meta_keys = wp_list_filter( + $data_store->get_registered_meta(), + array( + 'privacy_erasure' => null, + ), + 'NOT' + ); + + // Loop subscriptions. + foreach ( $subscriptions as $subscription ) { + $subscription_id = $subscription->get_id(); + + if ( empty( $subscription_id ) ) { + continue; + } + + $subscription_meta = get_post_meta( $subscription_id ); + + $subscription_status = null; + + if ( isset( $subscription_meta[ $data_store->meta_key_prefix . 'status' ] ) ) { + $subscription_status = $subscription_meta[ $data_store->meta_key_prefix . 'status' ]; + } + + // Subscription note and erasure return message. + $note = __( 'Subscription anonymized for personal data erasure request.', 'pronamic_ideal' ); + /* translators: %s = subscription id */ + $message = __( 'Subscription ID %s anonymized.', 'pronamic_ideal' ); + + // Anonymize completed and cancelled subscriptions. + if ( isset( $subscription_status ) && in_array( $subscription_status, array( PaymentStatus::COMPLETED, PaymentStatus::CANCELLED ), true ) ) { + // Erase subscription meta. + foreach ( $meta_keys as $meta_key => $meta_options ) { + $meta_key = $data_store->meta_key_prefix . $meta_key; + + if ( ! array_key_exists( $meta_key, $subscription_meta ) ) { + continue; + } + + $action = ( isset( $meta_options['privacy_erasure'] ) ? $meta_options['privacy_erasure'] : null ); + + $privacy_manager->erase_meta( $subscription_id, $meta_key, $action ); + } + + $items_removed = true; + } else { + $note = __( 'Subscription not anonymized for personal data erasure request because of active status.', 'pronamic_ideal' ); + + /* translators: %s: Subscription ID */ + $message = __( 'Subscription ID %s not anonymized because of active status.', 'pronamic_ideal' ); + + $items_retained = true; + } + + // Add erasure return message. + $messages[] = sprintf( $message, $subscription_id ); + + // Add subscription note. + try { + $subscription->add_note( $note ); + } catch ( \Exception $e ) { + continue; + } + } + + $done = true; + + // Return results. + return array( + 'items_removed' => $items_removed, + 'items_retained' => $items_retained, + 'messages' => $messages, + 'done' => $done, + ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/TaxedMoneyJsonTransformer.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/TaxedMoneyJsonTransformer.php new file mode 100644 index 00000000..de0b9f1b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/TaxedMoneyJsonTransformer.php @@ -0,0 +1,97 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use InvalidArgumentException; +use Pronamic\WordPress\Money\TaxedMoney; + +/** + * Taxed money JSON transformer + * + * @author Remco Tolsma + * @version 2.0.8 + * @since 2.0.8 + */ +class TaxedMoneyJsonTransformer { + /** + * Convert taxed money object to JSON. + * + * @param TaxedMoney|null $money Money. + * + * @return null|object + */ + public static function to_json( TaxedMoney $money = null ) { + if ( null === $money ) { + return null; + } + + $object = MoneyJsonTransformer::to_json( $money ); + + if ( null === $object ) { + return null; + } + + $properties = (array) $object; + + if ( null !== $money->get_tax_value() ) { + $properties['tax_value'] = $money->get_tax_value(); + } + + if ( null !== $money->get_tax_percentage() ) { + $properties['tax_percentage'] = $money->get_tax_percentage(); + } + + $object = (object) $properties; + + return $object; + } + + /** + * Convert JSON to taxed money object. + * + * @param mixed $json JSON. + * + * @return TaxedMoney + * + * @throws InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new InvalidArgumentException( 'JSON value must be an object.' ); + } + + // Default arguments. + $value = 0; + $currency = null; + $tax_value = null; + $tax_percentage = null; + + if ( property_exists( $json, 'value' ) ) { + $value = $json->value; + } + + if ( property_exists( $json, 'currency' ) ) { + $currency = $json->currency; + } + + if ( property_exists( $json, 'tax_value' ) ) { + $tax_value = $json->tax_value; + } + + if ( property_exists( $json, 'tax_percentage' ) ) { + $tax_percentage = $json->tax_percentage; + } + + $money = new TaxedMoney( $value, $currency, $tax_value, $tax_percentage ); + + return $money; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/TrackingModule.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/TrackingModule.php new file mode 100644 index 00000000..7da557d4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/TrackingModule.php @@ -0,0 +1,107 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * Tracking module + * + * @author Reüel van der Steege + * @since 2.2.6 + * @version 2.2.6 + */ +class TrackingModule { + /** + * URL parameters. + * + * @var null|array + */ + private $parameters; + + /** + * Get tracking URL. + * + * @param string $url URL to add tracking parameters to. + * @return string + */ + public function get_tracking_url( $url ) { + if ( null === $this->parameters ) { + $this->build_parameters(); + } + + return \add_query_arg( $this->parameters, $url ); + } + + /** + * Build URL parameters. + * + * @return void + */ + private function build_parameters() { + // General parameters. + $params = array( + 'locale' => \get_locale(), + 'php' => \str_replace( PHP_EXTRA_VERSION, '', \strval( \phpversion() ) ), + ); + + // Add extensions parameters. + $plugins = \get_plugins(); + + $extensions = \array_merge( + array( + 'pronamic-ideal', + 'contact-form-7', + 'wpforms', + ), + $this->get_supported_extensions() + ); + + foreach ( $plugins as $slug => $plugin ) { + foreach ( $extensions as $extension ) { + if ( false === \stristr( $slug, $extension ) ) { + continue; + } + + // Add plugin to URL parameters. + $slug = dirname( $slug ); + + $params[ $slug ] = $plugin['Version']; + } + } + + // Set parameters. + $this->parameters = $params; + } + + /** + * Get supported extensions. + * + * @return array + */ + public function get_supported_extensions() { + $extensions = array(); + + $extensions_json_path = \dirname( \pronamic_pay_plugin()->get_file() ) . '/other/extensions.json'; + + if ( \is_readable( $extensions_json_path ) ) { + $data = \file_get_contents( $extensions_json_path, true ); + + if ( false !== $data ) { + $data = \json_decode( $data ); + + if ( null !== $data ) { + $extensions = \wp_list_pluck( $data, 'slug' ); + } + } + } + + return $extensions; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrade.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrade.php new file mode 100644 index 00000000..61ed9cd2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrade.php @@ -0,0 +1,62 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Upgrades + */ + +namespace Pronamic\WordPress\Pay\Upgrades; + +/** + * Upgrade + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + */ +abstract class Upgrade { + /** + * Version. + * + * @var string + */ + private $version; + + /** + * Construct upgrade object. + * + * @param string $version Version. + */ + public function __construct( $version ) { + $this->set_version( $version ); + } + + /** + * Get version. + * + * @return string + */ + public function get_version() { + return $this->version; + } + + /** + * Set version. + * + * @param string $version Version. + * @return void + */ + public function set_version( $version ) { + $this->version = $version; + } + + /** + * Execute. + * + * @return void + */ + abstract public function execute(); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrade620.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrade620.php new file mode 100644 index 00000000..52a16b8b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrade620.php @@ -0,0 +1,130 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Upgrades; + +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Upgrade 6.2.0. + * + * @author Reüel van der Steege + * @since 2.4.0 + * @version 2.3.2 + */ +class Upgrade620 extends Upgrade { + /** + * Construct 6.2.0 upgrade. + */ + public function __construct() { + parent::__construct( '6.2.0' ); + } + + /** + * Execute. + * + * @return void + */ + public function execute() { + $query = new \WP_Query( + array( + 'post_type' => 'pronamic_pay_subscr', + 'post_status' => array( + 'subscr_active', + 'subscr_expired', + ), + 'posts_per_page' => -1, + 'no_found_rows' => true, + 'meta_query' => array( + array( + 'key' => '_pronamic_subscription_next_payment', + 'compare' => 'NOT EXISTS', + ), + array( + 'key' => '_pronamic_subscription_end_date', + 'compare' => 'NOT EXISTS', + ), + ), + ) + ); + + if ( ! $query->have_posts() ) { + return; + } + + // Loop subscriptions. + while ( $query->have_posts() ) { + $query->the_post(); + + // Update subscription. + $subscription = get_pronamic_subscription( (int) get_the_ID() ); + + if ( null === $subscription ) { + continue; + } + + $subscription_id = $subscription->get_id(); + + if ( null === $subscription_id ) { + continue; + } + + $expiry_date = $subscription->get_expiry_date(); + + if ( null === $expiry_date ) { + continue; + } + + $subscription->next_payment_date = $expiry_date; + + $subscription->save(); + + if ( null === $subscription->next_payment_date ) { + continue; + } + + // Increase next payment date with an interval period if there already is a pending payment. + $args = array( + 'posts_per_page' => 1, + 'orderby' => 'post_date', + 'order' => 'DESC', + ); + + $last_payment = get_pronamic_payments_by_meta( '_pronamic_payment_subscription_id', $subscription_id, $args ); + + if ( ! empty( $last_payment ) ) { + $last_payment = \array_shift( $last_payment ); + + $date_interval = $subscription->get_date_interval(); + + if ( null !== $last_payment && null !== $date_interval && PaymentStatus::OPEN === $last_payment->get_status() ) { + $subscription->next_payment_date->add( $date_interval ); + + $subscription->save(); + } + } + + if ( null === $subscription->next_payment_date ) { + continue; + } + + // Add note. + $subscription->add_note( + \sprintf( + /* translators: %s: formatted next payment date */ + __( 'Missing subscription next payment date restored to %s.', 'pronamic_ideal' ), + $subscription->next_payment_date->format_i18n() + ) + ); + } + + \wp_reset_postdata(); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrades.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrades.php new file mode 100644 index 00000000..ee9a500b --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Upgrades/Upgrades.php @@ -0,0 +1,90 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Upgrades + */ + +namespace Pronamic\WordPress\Pay\Upgrades; + +/** + * Upgrades + * + * @author Remco Tolsma + * @version 2.2.6 + * @since 2.2.6 + * @implements \IteratorAggregate + */ +class Upgrades implements \Countable, \IteratorAggregate { + /** + * Upgrades. + * + * @var array + */ + private $upgrades; + + /** + * Executable. + * + * @var boolean + */ + private $executable; + + /** + * Construct. + */ + public function __construct() { + $this->upgrades = array(); + $this->executable = true; + } + + /** + * Are executable. + * + * @return boolean True if upgrade are executable, false otherwise. + */ + public function are_executable() { + return $this->executable; + } + + /** + * Set the upgrades as executable or not. + * + * @param boolean $executable True if upgrades are executable, false otherwise. + * @return void + */ + public function set_executable( $executable ) { + $this->executable = $executable; + } + + /** + * Add upgrades. + * + * @param Upgrade $upgrade The upgrade to add. + * @return void + */ + public function add( Upgrade $upgrade ) { + $this->upgrades[] = $upgrade; + } + + /** + * Get iterator. + * + * @return \ArrayIterator + */ + public function getIterator() { + return new \ArrayIterator( $this->upgrades ); + } + + /** + * Count upgrades. + * + * @return int + */ + public function count() { + return count( $this->upgrades ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Util.php new file mode 100644 index 00000000..122952d4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Util.php @@ -0,0 +1,393 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use DateInterval; +use Pronamic\WordPress\Pay\Core\Util as Core_Util; +use Pronamic\WordPress\Money\Money; +use SimpleXMLElement; +use WP_Error; + +/** + * WordPress utility class + * + * @author Remco Tolsma + * @version 2.5.0 + * @since 2.0.1 + */ +class Util { + /** + * Remote get body. + * + * @link https://developer.wordpress.org/reference/functions/wp_remote_request/ + * + * @param string $url The URL to use for the remote request. + * @param int $required_response_code The required response code. + * @param array $args The WordPress HTTP API request arguments. + * + * @deprecated 2.0.9 Use Pronamic\WordPress\Pay\Core\Util::remote_get_body() instead. + * + * @return array|bool|string|WP_Error + */ + public static function remote_get_body( $url, $required_response_code = 200, array $args = array() ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Pay\Core\Util::remote_get_body()' ); + + return Core_Util::remote_get_body( $url, $required_response_code, $args ); + } + + /** + * SimpleXML load string. + * + * @param string $string The XML string to convert to a SimpleXMLElement object. + * + * @deprecated 2.0.9 Use Pronamic\WordPress\Pay\Core\Util::simplexml_load_string() instead. + * + * @return SimpleXMLElement|WP_Error + */ + public static function simplexml_load_string( $string ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Pay\Core\Util::simplexml_load_string()' ); + + return Core_Util::simplexml_load_string( $string ); + } + + /** + * Amount to cents. + * + * @param float $price The amount to convert to cents. + * + * @deprecated 2.0.9 Use \Pronamic\WordPress\Money\Money::get_cents() instead. + * + * @return float + */ + public static function amount_to_cents( $price ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Money\Money::get_cents()' ); + + $money = new Money( $price ); + + return $money->get_cents(); + } + + /** + * Cents to amount. + * + * @param int $cents The numberof cents to convert to an amount. + * + * @deprecated 2.0.9 Use \Pronamic\WordPress\Pay\Core\Util::cents_to_amount() instead. + * + * @return float + */ + public static function cents_to_amount( $cents ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Pay\Core\Util::cents_to_amount()' ); + + return Core_Util::cents_to_amount( $cents ); + } + + /** + * Convert boolean to an numceric boolean. + * + * @link https://github.com/eet-nu/buckaroo-ideal/blob/master/lib/buckaroo-ideal/request.rb#L136 + * + * @param boolean $boolean The boolean to convert to 1 or 0. + * + * @deprecated 2.0.9 Use \Pronamic\WordPress\Pay\Core\Util::boolean_to_numeric() instead. + * + * @return int + */ + public static function boolean_to_numeric( $boolean ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Pay\Core\Util::boolean_to_numeric()' ); + + return Core_Util::boolean_to_numeric( $boolean ); + } + + /** + * Convert boolean to an string boolean. + * + * @link https://github.com/eet-nu/buckaroo-ideal/blob/master/lib/buckaroo-ideal/request.rb#L136 + * + * @param boolean $boolean The boolean to convert to the string 'true' or 'false'. + * + * @deprecated 2.0.9 Use \Pronamic\WordPress\Pay\Core\Util::boolean_to_string() instead. + * + * @return string + */ + public static function boolean_to_string( $boolean ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Pay\Core\Util::boolean_to_string()' ); + + return Core_Util::boolean_to_string( $boolean ); + } + + /** + * Format date interval. + * + * @param DateInterval $date_interval Date interval. + * + * @return string + */ + public static function format_date_interval( DateInterval $date_interval ) { + // Periods. + $periods = array(); + + foreach ( array( 'y', 'm', 'd', 'h', 'i', 's' ) as $period ) { + $value = $date_interval->$period; + + // Check value. + if ( 0 === $value ) { + continue; + } + + // Format. + $format = ''; + + switch ( $period ) { + case 'y': + /* translators: %s: number of years */ + $format = _n( '%s year', '%s years', $value, 'pronamic_ideal' ); + + break; + case 'm': + /* translators: %s: number of months */ + $format = _n( '%s month', '%s months', $value, 'pronamic_ideal' ); + + break; + case 'd': + /* translators: %s: number of days */ + $format = _n( '%s day', '%s days', $value, 'pronamic_ideal' ); + + break; + case 'h': + /* translators: %s: number of hours */ + $format = _n( '%s hour', '%s hours', $value, 'pronamic_ideal' ); + + break; + case 'i': + /* translators: %s: number of minutes */ + $format = _n( '%s minute', '%s minutes', $value, 'pronamic_ideal' ); + + break; + case 's': + /* translators: %s: number of seconds */ + $format = _n( '%s second', '%s seconds', $value, 'pronamic_ideal' ); + + break; + } + + // Add period. + $periods[] = \sprintf( $format, $value ); + } + + // Multiple periods. + if ( count( $periods ) > 1 ) { + $last_period = \array_pop( $periods ); + + $formatted = \implode( ', ', $periods ); + + return sprintf( + /* translators: 1: formatted periods, 2: last formatted period */ + __( '%1$s and %2$s', 'pronamic_ideal' ), + $formatted, + $last_period + ); + } + + // Single period. + $formatted = \implode( ', ', $periods ); + + return $formatted; + } + + /** + * Format recurrences date interval. + * + * @param DateInterval $date_interval Date interval. + * + * @return string + */ + public static function format_recurrences( DateInterval $date_interval ) { + $formatted_interval = self::format_date_interval( $date_interval ); + + // Check empty date interval. + if ( empty( $formatted_interval ) ) { + return '—'; + } + + return sprintf( + /* translators: %s: formatted date interval periods */ + __( 'Every %s', 'pronamic_ideal' ), + $formatted_interval + ); + } + + /** + * Format interval. + * + * @param int $interval The interval number. + * @param string $period The period indicator. + * + * @return string|null + */ + public static function format_interval( $interval, $period ) { + switch ( $period ) { + case 'D': + case 'day': + case 'days': + /* translators: %s: interval */ + return sprintf( _n( 'Every %s day', 'Every %s days', $interval, 'pronamic_ideal' ), $interval ); + case 'W': + case 'week': + case 'weeks': + /* translators: %s: interval */ + return sprintf( _n( 'Every %s week', 'Every %s weeks', $interval, 'pronamic_ideal' ), $interval ); + case 'M': + case 'month': + case 'months': + /* translators: %s: interval */ + return sprintf( _n( 'Every %s month', 'Every %s months', $interval, 'pronamic_ideal' ), $interval ); + case 'Y': + case 'year': + case 'years': + /* translators: %s: interval */ + return sprintf( _n( 'Every %s year', 'Every %s years', $interval, 'pronamic_ideal' ), $interval ); + } + + return null; + } + + /** + * Convert single interval period character to full name. + * + * @param string $interval_period string Short interval period (D, W, M or Y). + * + * @return string + */ + public static function to_interval_name( $interval_period ) { + switch ( $interval_period ) { + case 'D': + return 'days'; + case 'W': + return 'weeks'; + case 'M': + return 'months'; + case 'Y': + return 'years'; + } + + return $interval_period; + } + + /** + * Format frequency. + * + * @param int $frequency The number of times. + * + * @return string + */ + public static function format_frequency( $frequency ) { + if ( empty( $frequency ) ) { + return _x( 'Unlimited', 'Recurring payment', 'pronamic_ideal' ); + } + + /* translators: %s: frequency */ + return sprintf( _n( '%s period', '%s periods', $frequency, 'pronamic_ideal' ), $frequency ); + } + + /** + * Build URL with the specified parameters + * + * @param string $url The URL to extend with specified parameters. + * @param array $parameters The parameters to add to the specified URL. + * + * @deprecated 2.0.9 Use \Pronamic\WordPress\Pay\Core\Util::build_url() instead. + * + * @return string + */ + public static function build_url( $url, array $parameters ) { + _deprecated_function( __FUNCTION__, '2.0.9', 'Pronamic\WordPress\Pay\Core\Util::build_url()' ); + + return Core_Util::build_url( $url, $parameters ); + } + + /** + * Get hidden inputs HTML for data. + * + * @param array $data Array with name and value pairs to convert to hidden HTML input eleemnts. + * + * @return string + */ + public static function html_hidden_fields( $data ) { + $html = ''; + + foreach ( $data as $name => $value ) { + $html .= sprintf( '', esc_attr( $name ), esc_attr( $value ) ); + } + + return $html; + } + + /** + * Array to HTML attributes. + * + * @param array $attributes The key and value pairs to convert to HTML attributes. + * + * @return string + */ + public static function array_to_html_attributes( array $attributes ) { + $html = ''; + + foreach ( $attributes as $key => $value ) { + // Check boolean attribute. + if ( \is_bool( $value ) ) { + if ( $value ) { + $html .= sprintf( '%s ', $key ); + } + + continue; + } + + $html .= sprintf( '%s="%s" ', $key, esc_attr( $value ) ); + } + + $html = trim( $html ); + + return $html; + } + + /** + * Select options grouped. + * + * @param array $groups The grouped select options. + * @param string $selected_value The selected value. + * + * @return string + */ + public static function select_options_grouped( $groups, $selected_value = null ) { + $html = ''; + + if ( is_array( $groups ) ) { + foreach ( $groups as $group ) { + $optgroup = isset( $group['name'] ) && ! empty( $group['name'] ); + + if ( $optgroup ) { + $html .= ''; + } + + foreach ( $group['options'] as $value => $label ) { + $html .= ''; + } + + if ( $optgroup ) { + $html .= ''; + } + } + } + + return $html; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumber.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumber.php new file mode 100644 index 00000000..714c5361 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumber.php @@ -0,0 +1,211 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\VatNumbers; + +/** + * VAT Number + * + * @link https://en.wikipedia.org/wiki/VAT_identification_number + * @author Remco Tolsma + * @version 2.4.0 + * @since 1.4.0 + */ +class VatNumber { + /** + * Value. + * + * @var string + */ + private $value; + + /** + * Validity. + * + * @var VatNumberValidity|null + */ + private $validity; + + /** + * Construct VAT number object. + * + * @param string $value VAT identification number. + */ + public function __construct( $value ) { + $this->value = $value; + } + + /** + * Get value. + * + * @return string + */ + public function get_value() { + return $this->value; + } + + /** + * Get 2 digit prefix. + * + * The full identifier starts with an ISO 3166-1 alpha-2 (2 letters) country code (except for Greece, which uses the ISO 639-1 language code EL for the Greek language, instead of its ISO 3166-1 alpha-2 country code GR). + * + * @link https://en.wikipedia.org/wiki/VAT_identification_number + * @return string + */ + public function get_2_digit_prefix() { + $value = self::normalize( $this->value ); + + $prefix = \substr( $value, 0, 2 ); + + return $prefix; + } + + /** + * Get normalized value. + * + * @return string + */ + public function normalized() { + return self::normalize( $this->value ); + } + + /** + * Get the number without the 2 digit prefix. + * + * @link https://en.wikipedia.org/wiki/VAT_identification_number + * @return string + */ + public function normalized_without_prefix() { + $value = self::normalize( $this->value ); + + return \substr( $value, 2 ); + } + + /** + * Get validity. + * + * @return VatNumberValidity|null + */ + public function get_validity() { + return $this->validity; + } + + /** + * Set validity + * + * @param VatNumberValidity|null $validity Validity. + * @return void + */ + public function set_validity( VatNumberValidity $validity = null ) { + $this->validity = $validity; + } + + /** + * Get JSON. + * + * @return string|object + */ + public function get_json() { + if ( null === $this->validity ) { + return $this->value; + } + + $data = array( + 'value' => $this->value, + 'validity' => $this->validity->get_json(), + ); + + return (object) $data; + } + + /** + * Create VAT number from JSON. + * + * @param mixed $json JSON. + * @return VatNumber + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( \is_string( $json ) ) { + return new self( $json ); + } + + if ( ! \is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be either a string or object.' ); + } + + if ( ! \property_exists( $json, 'value' ) ) { + throw new \InvalidArgumentException( 'JSON object must contain value property.' ); + } + + $vat_number = new self( $json->value ); + + if ( property_exists( $json, 'validity' ) ) { + $validity = VatNumberValidity::from_json( $json->validity ); + + $vat_number->set_validity( $validity ); + } + + return $vat_number; + } + + /** + * Create VAT number from string. + * + * @param string $string VAT number string. + * @return VatNumber + */ + public static function from_string( $string ) { + return new self( $string ); + } + + /** + * Create VAT number from prefix and number. + * + * @param string $prefix Prefix (country code). + * @param string $value VAT number. + * @return VatNumber + */ + public static function from_prefix_and_number( $prefix, $value ) { + return new self( $prefix . $value ); + } + + /** + * Create string representation of VAT nunber. + * + * @return string + */ + public function __toString() { + return $this->value; + } + + /** + * Normalize VAT number. + * + * @link https://gitlab.com/pronamic-plugins/edd-vat/-/blob/1.0.0/includes/class-check-vat-eu.php#L39-47 + * @param string $value VAT identification number. + * @return string + */ + public static function normalize( $value ) { + /** + * Replace white spaces and dots. + */ + $value = \str_replace( + array( + ' ', + '.', + ), + '', + $value + ); + + return $value; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberValidationService.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberValidationService.php new file mode 100644 index 00000000..a1d15e70 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberValidationService.php @@ -0,0 +1,28 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\VatNumbers; + +/** + * VAT number validation service + * + * @author Remco Tolsma + * @version 2.4.0 + * @since 2.1.0 + */ +class VatNumberValidationService { + /** + * VIES. + * + * @link https://ec.europa.eu/taxation_customs/vies/?locale=en + * @var string + */ + const VIES = 'vies'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberValidity.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberValidity.php new file mode 100644 index 00000000..aff4a483 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberValidity.php @@ -0,0 +1,246 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\VatNumbers; + +/** + * VAT Number validity + * + * @link https://ec.europa.eu/taxation_customs/vies/?locale=en + * @author Remco Tolsma + * @version 2.4.0 + * @since 1.4.0 + */ +class VatNumberValidity { + /** + * VAT Number. + * + * @var VatNumber + */ + private $vat_number; + + /** + * Request date. + * + * @var \DateTimeInterface + */ + private $request_date; + + /** + * Valid flag. + * + * @var bool + */ + private $valid; + + /** + * Name. + * + * @var string|null + */ + private $name; + + /** + * Address. + * + * @var string|null + */ + private $address; + + /** + * Validation service indicator. + * + * @var string|null + */ + private $service; + + /** + * Construct VAT number object. + * + * @param VatNumber $vat_number VAT identification number. + * @param \DateTimeInterface $request_date Request date. + * @param bool $valid True if valid, false otherwise. + */ + public function __construct( VatNumber $vat_number, \DateTimeInterface $request_date, $valid ) { + $this->vat_number = $vat_number; + $this->request_date = $request_date; + $this->valid = $valid; + } + + /** + * Get VAT number. + * + * @return VatNumber + */ + public function get_vat_number() { + return $this->vat_number; + } + + /** + * Get request date. + * + * @return \DateTimeInterface + */ + public function get_request_date() { + return $this->request_date; + } + + /** + * Is valid. + * + * @return bool True if valid, false otherwise. + */ + public function is_valid() { + return $this->valid; + } + + /** + * Set valid. + * + * @param bool $valid Valid. + * @return void + */ + public function set_valid( $valid ) { + $this->valid = $valid; + } + + /** + * Get name. + * + * @return string|null + */ + public function get_name() { + return $this->name; + } + + /** + * Set name. + * + * @param string|null $name Name. + * @return void + */ + public function set_name( $name ) { + $this->name = $name; + } + + /** + * Get address. + * + * @return string|null + */ + public function get_address() { + return $this->address; + } + + /** + * Set address. + * + * @param string|null $address Address. + * @return void + */ + public function set_address( $address ) { + $this->address = $address; + } + + /** + * Get service. + * + * @return string|null + */ + public function get_service() { + return $this->service; + } + + /** + * Set service. + * + * @param string|null $service Service. + * @return void + */ + public function set_service( $service ) { + $this->service = $service; + } + + /** + * Get JSON. + * + * @return object|null + */ + public function get_json() { + $data = array( + 'vat_number' => $this->vat_number->get_value(), + 'request_date' => $this->request_date->format( 'Y-m-d' ), + 'valid' => $this->valid, + ); + + if ( null !== $this->name ) { + $data['name'] = $this->name; + } + + if ( null !== $this->address ) { + $data['address'] = $this->address; + } + + if ( null !== $this->service ) { + $data['service'] = $this->service; + } + + if ( empty( $data ) ) { + return null; + } + + return (object) $data; + } + + /** + * Create from object. + * + * @param mixed $json JSON. + * @return VatNumberValidity + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( 'JSON value must be an object.' ); + } + + if ( ! property_exists( $json, 'vat_number' ) ) { + throw new \InvalidArgumentException( 'JSON object does not contain `vat_number` property.' ); + } + + if ( ! property_exists( $json, 'request_date' ) ) { + throw new \InvalidArgumentException( 'JSON object does not contain `request_date` property.' ); + } + + if ( ! property_exists( $json, 'valid' ) ) { + throw new \InvalidArgumentException( 'JSON object does not contain `valid` property.' ); + } + + $validity = new self( + VatNumber::from_json( $json->vat_number ), + new \DateTimeImmutable( $json->request_date ), + \boolval( $json->valid ) + ); + + if ( property_exists( $json, 'name' ) ) { + $validity->set_name( $json->name ); + } + + if ( property_exists( $json, 'address' ) ) { + $validity->set_address( $json->address ); + } + + if ( property_exists( $json, 'service' ) ) { + $validity->set_service( $json->service ); + } + + return $validity; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberViesValidator.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberViesValidator.php new file mode 100644 index 00000000..6803d423 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatNumbers/VatNumberViesValidator.php @@ -0,0 +1,60 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\VatNumbers; + +/** + * VAT Number VIES validator + * + * @author Remco Tolsma + * @version 2.4.0 + * @since 1.4.0 + */ +class VatNumberViesValidator { + /** + * API URL + */ + const API_URL = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'; + + /** + * Validate VAT number. + * + * @param VatNumber $vat_number VAT number. + * @return VatNumberValidity + * @throws \Exception SOAP error. + */ + public static function validate( VatNumber $vat_number ) { + // Client. + $client = new \SoapClient( self::API_URL ); + + // Parameters. + $parameters = array( + 'countryCode' => $vat_number->get_2_digit_prefix(), + 'vatNumber' => $vat_number->normalized_without_prefix(), + ); + + // Response. + $response = $client->checkVat( $parameters ); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- VIES response object. + $vat_number = VatNumber::from_prefix_and_number( $response->countryCode, $response->vatNumber ); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- VIES response object. + $request_date = new \DateTime( $response->requestDate ); + + $validity = new VatNumberValidity( $vat_number, $request_date, $response->valid ); + + $validity->set_name( $response->name ); + $validity->set_address( $response->address ); + $validity->set_service( VatNumberValidationService::VIES ); + + return $validity; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatRates.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatRates.php new file mode 100644 index 00000000..bdb3846c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/VatRates.php @@ -0,0 +1,50 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +/** + * VAT rates + * + * @link https://ec.europa.eu/taxation_customs/sites/taxation/files/resources/documents/taxation/vat/how_vat_works/rates/vat_rates_en.pdf + * @link https://github.com/apilayer/euvatrates.com + * @author Remco Tolsma + * @version 2.1.0 + * @since 2.1.0 + */ +class VatRates { + /** + * Standard rate. + * + * @var string + */ + const STANDARD = 'standard'; + + /** + * Reduced rate. + * + * @var string + */ + const REDUCED = 'reduced'; + + /** + * Super reduced rate. + * + * @var string + */ + const SUPER_REDUCED = 'super_reduced'; + + /** + * Parking rate. + * + * @var string + */ + const PARKING = 'parking'; +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookLogger.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookLogger.php new file mode 100644 index 00000000..cffbce79 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookLogger.php @@ -0,0 +1,101 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Webhooks; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Core\Server; +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Plugin; + +/** + * Webhook logger class + * + * @author Reüel van der Steege + * @version 2.1.6 + * @since 2.1.6 + */ +class WebhookLogger { + /** + * Setup. + * + * @return void + */ + public function setup() { + add_action( 'pronamic_pay_webhook_log_payment', array( $this, 'log_payment' ) ); + } + + /** + * Log payment. + * + * @param Payment $payment Payment. + * + * @return void + * + * @throws \Exception Throws an Exception on request date error. + */ + public function log_payment( Payment $payment ) { + $post_data = file_get_contents( 'php://input' ); + + if ( ! $post_data ) { + $post_data = null; + } + + $request_info = new WebhookRequestInfo( + new DateTime(), + ( is_ssl() ? 'https://' : 'http://' ) . Server::get( 'HTTP_HOST' ) . Server::get( 'REQUEST_URI' ), + $post_data + ); + + $request_info->set_payment( $payment ); + + $this->log_request( $request_info ); + } + + /** + * Log request. + * + * @param WebhookRequestInfo $request_info Request info. + * + * @return void + */ + public function log_request( WebhookRequestInfo $request_info ) { + // Payment. + $payment = $request_info->get_payment(); + + if ( null === $payment ) { + return; + } + + // Config ID. + $config_id = $payment->get_config_id(); + + if ( null === $config_id ) { + return; + } + + // Gateway. + $gateway = Plugin::get_gateway( $config_id ); + + if ( null === $gateway ) { + return; + } + + // Update webhook log. + $json = wp_json_encode( $request_info ); + + if ( $json ) { + update_post_meta( $config_id, '_pronamic_gateway_webhook_log', wp_slash( $json ) ); + + // Delete outdated webhook URLs transient. + delete_transient( 'pronamic_outdated_webhook_urls' ); + } + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookManager.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookManager.php new file mode 100644 index 00000000..d9b57903 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookManager.php @@ -0,0 +1,150 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Webhooks; + +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Admin\AdminModule; +use WP_Query; + +/** + * Webhook manager class + * + * @author Reüel van der Steege + * @version 2.2.6 + * @since 2.1.6 + */ +class WebhookManager { + /** + * Plugin. + * + * @var Plugin + */ + private $plugin; + + /** + * Admin. + * + * @var AdminModule + */ + private $admin; + + /** + * Webhook manager. + * + * @param Plugin $plugin Plugin. + * @param AdminModule $admin Admin. + */ + public function __construct( Plugin $plugin, AdminModule $admin ) { + $this->plugin = $plugin; + $this->admin = $admin; + + // Admin notices. + add_action( 'admin_notices', array( $this, 'admin_notices' ) ); + } + + /** + * Admin notices. + * + * @return void + */ + public function admin_notices() { + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $outdated_urls = get_transient( 'pronamic_outdated_webhook_urls' ); + + if ( false === $outdated_urls ) { + $outdated_urls = array(); + + // Get gateways for which a webhook log exists. + $query = new WP_Query( + array( + 'post_type' => 'pronamic_gateway', + 'orderby' => 'post_title', + 'order' => 'ASC', + 'fields' => 'ids', + 'nopaging' => true, + 'meta_query' => array( + array( + 'key' => '_pronamic_gateway_webhook_log', + ), + ), + ) + ); + + // Loop gateways. + foreach ( $query->posts as $config_id ) { + try { + $log = get_post_meta( $config_id, '_pronamic_gateway_webhook_log', true ); + + $log = json_decode( $log ); + + $request_info = WebhookRequestInfo::from_json( $log ); + } catch ( \Exception $e ) { + continue; + } + + // Check if manual configuration is needed for webhook. + $gateway_id = get_post_meta( $config_id, '_pronamic_gateway_id', true ); + + $integration = pronamic_pay_plugin()->gateway_integrations->get_integration( $gateway_id ); + + if ( null === $integration ) { + // Integration unknown. + continue; + } + + if ( ! $integration->supports( 'webhook' ) || $integration->supports( 'webhook_no_config' ) ) { + continue; + } + + // Validate log request URL against current home URL. + if ( self::validate_request_url( $request_info ) ) { + continue; + } + + $outdated_urls[] = $config_id; + } + + /** + * The WordPress Transients API will not always store empty array + * values correctly, therefor we convert an empty array to true. + * + * @todo We should probably schedule a daily event to check for + * possible broken webhooks. + */ + if ( empty( $outdated_urls ) ) { + $outdated_urls = true; + } + + set_transient( 'pronamic_outdated_webhook_urls', $outdated_urls, DAY_IN_SECONDS ); + } + + if ( ! empty( $outdated_urls ) ) { + include __DIR__ . '/../../views/notice-webhook-url.php'; + } + } + + /** + * Validate log URL against current home URL. + * + * @param WebhookRequestInfo $request_info Request info. + * + * @return bool + */ + public static function validate_request_url( WebhookRequestInfo $request_info ) { + // Check if current home URL is the same as in the logged URL. + $home_url = home_url( '/' ); + + return substr( $request_info->get_request_url(), 0, strlen( $home_url ) ) === $home_url; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookRequestInfo.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookRequestInfo.php new file mode 100644 index 00000000..d1956b67 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/src/Webhooks/WebhookRequestInfo.php @@ -0,0 +1,202 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Webhooks; + +use JsonSerializable; +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Payments\Payment; + +/** + * Webhook request info class + * + * @author Reüel van der Steege + * @version 2.2.6 + * @since 2.1.6 + */ +class WebhookRequestInfo implements JsonSerializable { + /** + * Date. + * + * @var DateTime + */ + private $request_date; + + /** + * Request URL. + * + * @var string + */ + private $request_url; + + /** + * Payment. + * + * @var Payment|null + */ + private $payment; + + /** + * Post data. + * + * @var string|null + */ + private $post_data; + + /** + * Construct webhook request info object. + * + * @param DateTime $request_date Request date. + * @param string $request_url Request URL. + * @param string|null $post_data Post data. + */ + public function __construct( DateTime $request_date, $request_url, $post_data ) { + $this->request_date = $request_date; + $this->request_url = $request_url; + $this->post_data = $post_data; + } + + /** + * Get request date. + * + * @return DateTime + */ + public function get_request_date() { + return $this->request_date; + } + + /** + * Get request URL. + * + * @return string + */ + public function get_request_url() { + return $this->request_url; + } + + /** + * Get payment. + * + * @return Payment|null + */ + public function get_payment() { + return $this->payment; + } + + /** + * Set payment. + * + * @param Payment $payment Payment. + * @return void + */ + public function set_payment( Payment $payment ) { + $this->payment = $payment; + } + + /** + * Get JSON. + * + * @return object + */ + public function get_json() { + $properties = array( + 'request_date' => $this->request_date->format( DATE_ATOM ), + 'request_url' => $this->request_url, + 'post_data' => $this->post_data, + ); + + if ( null !== $this->payment ) { + $properties['payment_id'] = $this->payment->get_id(); + } + + $object = (object) $properties; + + return $object; + } + + /** + * JSON serialize. + * + * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php + * + * @return object + */ + public function jsonSerialize() { + return $this->get_json(); + } + + /** + * Create webhook request info from object. + * + * @param mixed $json JSON. + * + * @return WebhookRequestInfo + * + * @throws \InvalidArgumentException Throws invalid argument exception when JSON is not an object. + * @throws \InvalidArgumentException Throws invalid argument exception when JSON does not contain `post_data` property. + * @throws \InvalidArgumentException Throws invalid argument exception when JSON does not contain `request_date` property. + * @throws \InvalidArgumentException Throws invalid argument exception when JSON does not contain `request_url` property. + */ + public static function from_json( $json ) { + if ( ! is_object( $json ) ) { + throw new \InvalidArgumentException( + sprintf( + 'JSON value must be an object (%s).', + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export + var_export( $json, true ) + ) + ); + } + + if ( ! property_exists( $json, 'post_data' ) ) { + throw new \InvalidArgumentException( + sprintf( + 'JSON must contain `post_data` property (%s).', + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export + var_export( $json, true ) + ) + ); + } + + if ( ! isset( $json->request_date ) ) { + throw new \InvalidArgumentException( + sprintf( + 'JSON must contain `request_date` property (%s).', + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export + var_export( $json, true ) + ) + ); + } + + if ( ! isset( $json->request_url ) ) { + throw new \InvalidArgumentException( + sprintf( + 'JSON must contain `request_url` property (%s).', + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export + var_export( $json, true ) + ) + ); + } + + $request_date = new DateTime( $json->request_date ); + + $webhook_request_info = new WebhookRequestInfo( $request_date, $json->request_url, $json->post_data ); + + if ( isset( $json->payment_id ) ) { + $payment = get_pronamic_payment( $json->payment_id ); + + if ( $payment ) { + $webhook_request_info->set_payment( $payment ); + } + } + + return $webhook_request_info; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/form.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/form.php new file mode 100644 index 00000000..939a816f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/form.php @@ -0,0 +1,223 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +global $pronamic_pay_errors; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Forms\FormPostType; +use Pronamic\WordPress\Pay\Forms\FormsSource; +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Util; + +$methods_with_choices = array( + \Pronamic\WordPress\Pay\Forms\FormPostType::AMOUNT_METHOD_CHOICES_ONLY, + \Pronamic\WordPress\Pay\Forms\FormPostType::AMOUNT_METHOD_CHOICES_AND_INPUT, +); + +$gateway = Plugin::get_gateway( $settings['config_id'] ); + +$amount_value = ''; + +if ( filter_has_var( INPUT_GET, 'amount' ) ) { + $amount_value = filter_input( INPUT_GET, 'amount', FILTER_SANITIZE_STRING ); +} + +if ( null === $gateway ) { + return; +} + +?> +
    + + + +

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

    + + + +

    + +

    + + + +

    + +

    + + + +

    +
    + + payment_method_is_required() ) { + + $gateway->set_payment_method( PaymentMethods::IDEAL ); + + } + + $fields = $gateway->get_input_fields(); + + ?> + + + +
    + + + $field ) : ?> + +

    + + + + + + + +

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

    + : +

    + + + +
    + + + +
    + + + $settings['source'], + 'pronamic_pay_source_id' => $settings['source_id'], + ); + + // Add config ID when needed. + if ( FormsSource::PAYMENT_FORM !== $settings['source'] ) { + $fields['pronamic_pay_config_id'] = $settings['config_id']; + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo Util::html_hidden_fields( $fields ); + + ?> + + + + + + + + +
    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-form-options.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-form-options.php new file mode 100644 index 00000000..9da4b3c2 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-form-options.php @@ -0,0 +1,119 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Money\Money; + +wp_nonce_field( 'pronamic_pay_save_form_options', 'pronamic_pay_nonce' ); + +?> + + + + + + + + + + + + + + + + + +
    + + + ID, '_pronamic_payment_form_config_id', true ); + + \Pronamic\WordPress\Pay\Admin\AdminModule::dropdown_configs( + array( + 'name' => '_pronamic_payment_form_config_id', + 'selected' => $config_id, + ) + ); + + ?> +
    + + + ID, '_pronamic_payment_form_button_text', true ); ?> + + +
    + + + +
    + + ID, '_pronamic_payment_form_amount_choices', true ); + + // Start with an empty field. + if ( empty( $choices ) ) { + $choices = array( '' ); + } + + // Add empty input field. + $choices[] = ''; + + foreach ( $choices as $i => $amount ) { + $value = ''; + + if ( $amount ) { + $money = new Money(); + + $value = number_format_i18n( $amount / 100, 2 ); + } + + printf( + '
    + +
    ', + esc_attr( $i ), + esc_attr( $i ), + esc_attr( $value ) + ); + } + ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-config.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-config.php new file mode 100644 index 00000000..f4020919 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-config.php @@ -0,0 +1,171 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Util; + +$integrations = iterator_to_array( $this->plugin->gateway_integrations ); + +usort( + $integrations, + function( $integration_a, $integration_b ) { + return strcasecmp( $integration_a->get_name(), $integration_b->get_name() ); + } +); + +// Sections. +$config_id = get_the_ID(); + +$gateway_id = get_post_meta( $config_id, '_pronamic_gateway_id', true ); + +?> +
    + + + + + + + + + +
    + + + + +

    +
    + + + 'pronamic_ideal_mode', + 'name' => '_pronamic_gateway_mode', + 'class' => 'pronamic-pay-form-control', + ); + + $options = array( + array( + 'options' => array( + 'test' => __( 'Test', 'pronamic_ideal' ), + 'live' => __( 'Live', 'pronamic_ideal' ), + ), + ), + ); + + $value = get_post_meta( get_the_ID(), '_pronamic_gateway_mode', true ); + + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ), + Util::select_options_grouped( $options, $value ) + // @codingStandardsIgnoreEnd + ); + + ?> +
    +
    + +
    + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php new file mode 100644 index 00000000..43b6f3b0 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-payment-methods.php @@ -0,0 +1,97 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +$columns = array( + 'payment_method' => __( 'Payment method', 'pronamic_ideal' ), + 'active' => __( 'Active', 'pronamic_ideal' ), +); + +$integration = pronamic_pay_plugin()->gateway_integrations->get_integration( $gateway_id ); + +if ( $integration->supports( 'recurring' ) ) : + $columns['recurring'] = __( 'Recurring', 'pronamic_ideal' ); +endif; + +?> + + + + + + + + + + + + + + + + + $column ) : + $value = ''; + + switch ( $key ) : + case 'payment_method': + $value = $method->name; + + break; + case 'active': + $icon = 'question-mark'; + + if ( $supports_methods_request ) { + $icon = ( $method->available ? 'completed' : 'cancelled' ); + } + + $value = sprintf( '', esc_attr( $icon ) ); + + break; + case 'recurring': + $icon = 'cancelled'; + + if ( PaymentMethods::is_recurring_method( $method->id ) ) : + $icon = 'completed'; + endif; + + $value = sprintf( '', esc_attr( $icon ) ); + + break; + endswitch; + + printf( + '', + wp_kses( + $value, + array( 'span' => array( 'class' => array() ) ) + ) + ); + + endforeach; + + ?> + + + + + + +
    %s
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-settings.php new file mode 100644 index 00000000..3a8206f4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-settings.php @@ -0,0 +1,434 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Admin\AdminGatewayPostType; +use Pronamic\WordPress\Pay\Util; +use Pronamic\WordPress\Pay\Webhooks\WebhookManager; +use Pronamic\WordPress\Pay\Webhooks\WebhookRequestInfo; + +$integration = $this->plugin->gateway_integrations->get_integration( $gateway_id ); + +if ( null === $integration ) { + return; +} + +$fields = $integration->get_settings_fields(); + +$sections = array( + 'general' => (object) array( + 'title' => __( 'General', 'pronamic_ideal' ), + 'fields' => array(), + ), + 'advanced' => (object) array( + 'title' => __( 'Advanced', 'pronamic_ideal' ), + 'fields' => array(), + ), + 'feedback' => (object) array( + 'title' => __( 'Feedback', 'pronamic_ideal' ), + 'fields' => array(), + ), + 'payment_methods' => (object) array( + 'title' => __( 'Payment Methods', 'pronamic_ideal' ), + 'fields' => array( + array( + 'section' => 'payment_methods', + 'title' => __( 'Supported Payment Methods', 'pronamic_ideal' ), + 'type' => 'html', + 'callback' => function() use ( $gateway, $gateway_id ) { + AdminGatewayPostType::settings_payment_methods( $gateway, $gateway_id ); + }, + ), + ), + ), +); + +// Feedback. +if ( $integration->supports( 'webhook' ) ) { + $fields[] = array( + 'section' => 'feedback', + 'title' => __( 'Webhook Status', 'pronamic_ideal' ), + 'type' => 'description', + 'callback' => function() use ( $gateway, $gateway_id, $config_id ) { + AdminGatewayPostType::settings_webhook_log( $gateway, $gateway_id, $config_id ); + }, + ); +} + +// Check if webhook configuration is needed. +if ( $integration->supports( 'webhook' ) && ! $integration->supports( 'webhook_no_config' ) ) { + $webbhook_config_needed = true; + + $log = get_post_meta( $config_id, '_pronamic_gateway_webhook_log', true ); + + if ( ! empty( $log ) ) { + $log = json_decode( $log ); + + $request_info = WebhookRequestInfo::from_json( $log ); + + // Validate log request URL against current home URL. + if ( WebhookManager::validate_request_url( $request_info ) ) { + $webbhook_config_needed = false; + } + } + + if ( $webbhook_config_needed ) { + $sections['feedback']->title = sprintf( + '⚠️ %s', + $sections['feedback']->title + ); + + $fields[] = array( + 'section' => 'general', + 'title' => __( 'Transaction feedback', 'pronamic_ideal' ), + 'type' => 'description', + 'html' => sprintf( + '⚠️ %s', + __( + 'Processing gateway transaction feedback in the background requires additional configuration.', + 'pronamic_ideal' + ) + ), + ); + } +} + +// Sections. +foreach ( $fields as $field_id => $field ) { + $section = 'general'; + + if ( array_key_exists( 'section', $field ) ) { + $section = $field['section']; + } + + if ( ! array_key_exists( $section, $sections ) ) { + $section = 'general'; + } + + $sections[ $section ]->fields[] = $field; +} + +$sections = array_filter( + $sections, + function( $section ) { + return ! empty( $section->fields ); + } +); + +?> +
    +
      + + + +
    • + icon ) ) { + printf( + '', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $section->icon + ); + + echo ' '; + } + + echo esc_html( $section->title ); + + ?> +
    • + + + +
    + + + +
    +
    +

    title ); ?>

    + + description ) ) : ?> + +

    + description; + + ?> +

    + + +
    + + + + fields as $field ) : + + $classes = array(); + + if ( isset( $field['methods'] ) ) { + foreach ( $field['methods'] as $method ) { + $classes[] = 'setting-' . $method; + } + } + + if ( isset( $field['group'] ) ) { + $classes[] = $field['group']; + } + + if ( isset( $field['id'] ) ) { + $field_id = $field['id']; + } elseif ( isset( $field['meta_key'] ) ) { + $field_id = $field['meta_key']; + } else { + $field_id = uniqid(); + } + + ?> + + + + + + + + + + + + + +
    + + + ', + esc_attr( $field['tooltip'] ) + ); + } + + ?> + + colspan="2"> + ', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ) + // @codingStandardsIgnoreEnd + ); + + break; + case 'number': + $attributes['type'] = $field['type']; + $attributes['value'] = $value; + + if ( isset( $field['min'] ) ) { + $attributes['min'] = $field['min']; + } + + if ( isset( $field['max'] ) ) { + $attributes['max'] = $field['max']; + } + + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ) + // @codingStandardsIgnoreEnd + ); + + break; + case 'checkbox': + $attributes['type'] = $field['type']; + $attributes['value'] = '1'; + + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ), + // @codingStandardsIgnoreEnd + checked( $value, true, false ) + ); + + printf( ' ' ); + + printf( + '', + esc_attr( $attributes['id'] ), + esc_html( $field['label'] ) + ); + + break; + case 'textarea': + $attributes['rows'] = 4; + $attributes['cols'] = 65; + + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ), + // @codingStandardsIgnoreEnd + esc_textarea( $value ) + ); + + break; + case 'file': + $attributes['type'] = 'file'; + + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ) + // @codingStandardsIgnoreEnd + ); + + break; + case 'select': + printf( + '', + // @codingStandardsIgnoreStart + Util::array_to_html_attributes( $attributes ), + Util::select_options_grouped( $field['options'], $value ) + // @codingStandardsIgnoreEnd + ); + + break; + case 'optgroup': + printf( '
    ' ); + printf( '%s', esc_html( $field['title'] ) ); + + foreach ( $field['options'] as $key => $label ) { + printf( + '
    ', + sprintf( + '', + esc_attr( $key ), + esc_attr( $attributes['name'] ), + checked( $value, $key, false ) + ), + esc_html( $label ) + ); + } + + break; + } + + if ( isset( $field['html'] ) ) { + if ( 'description' !== $field['type'] && isset( $field['title'] ) && ! empty( $field['title'] ) ) { + printf( + '%s
    ', + esc_html( $field['title'] ) + ); + } + + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $field['html']; + } + + if ( isset( $field['description'] ) ) { + printf( + '

    %s

    ', + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $field['description'] + ); + } + + if ( isset( $field['callback'] ) ) { + $callback = $field['callback']; + + call_user_func( $callback, $field ); + } + + ?> +
    +
    + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-test.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-test.php new file mode 100644 index 00000000..b7a6f982 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-gateway-test.php @@ -0,0 +1,324 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +global $pronamic_ideal_errors; + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Gateway as IDealAdvancedV3_Gateway; +use Pronamic\WordPress\Pay\Gateways\IDealBasic\Gateway as IDealBasic_Gateway; +use Pronamic\WordPress\Pay\Plugin; + +$gateway = Plugin::get_gateway( get_the_ID() ); + +if ( empty( $gateway ) ) { + printf( + '%s', + esc_html( __( 'Please save the entered account details of your payment provider, to make a test payment.', 'pronamic_ideal' ) ) + ); + + return; +} + +wp_nonce_field( 'test_pay_gateway', 'pronamic_pay_test_nonce' ); + +$is_ideal = false; +$is_ideal |= $gateway instanceof IDealBasic_Gateway; +$is_ideal |= $gateway instanceof IDealAdvancedV3_Gateway; + +// Payment method selector. +$payment_methods = $gateway->get_payment_method_field_options( true ); + +$inputs = array(); + +foreach ( $payment_methods as $payment_method => $method_name ) { + if ( 0 === $payment_method ) { + $payment_method = null; + } + + $gateway->set_payment_method( $payment_method ); + + // Payment method input HTML. + $html = $gateway->get_input_html(); + + if ( ! empty( $html ) ) { + $inputs[ $payment_method ] = array( + 'label' => $method_name, + 'html' => $html, + ); + } +} + +if ( $gateway->has_error() ) { + $pronamic_ideal_errors[] = $gateway->get_error(); +} + +require Plugin::$dirname . '/views/errors.php'; + +?> + + + + + + + $input ) : ?> + + + + + + + + + + + + + + + + + + + supports( 'recurring' ) ) : ?> + + __( '— Select Repeat —', 'pronamic_ideal' ), + 'D' => __( 'Daily', 'pronamic_ideal' ), + 'W' => __( 'Weekly', 'pronamic_ideal' ), + 'M' => __( 'Monthly', 'pronamic_ideal' ), + 'Y' => __( 'Annually', 'pronamic_ideal' ), + ); + + $options_interval_suffix = array( + 'D' => __( 'days', 'pronamic_ideal' ), + 'W' => __( 'weeks', 'pronamic_ideal' ), + 'M' => __( 'months', 'pronamic_ideal' ), + 'Y' => __( 'year', 'pronamic_ideal' ), + ); + + ?> + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + + + + + +
    + + + +
    + + +
    + + + +
    + + +
    + + + +
    + + + + + +
    + + +
    + + + +
    +
    + + + +
    + +
    + + + +
    +
    + + + +
    + + + + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Webhooks\WebhookRequestInfo; + +$integration = pronamic_pay_plugin()->gateway_integrations->get_integration( $gateway_id ); + +if ( ! $integration || ! $integration->supports( 'webhook_log' ) ) { + esc_html_e( 'This gateway does not support webhook logging.', 'pronamic_ideal' ); + + return; +} + +$webhook_log_json_string = get_post_meta( $config_id, '_pronamic_gateway_webhook_log', true ); + +$config_gateway_id = get_post_meta( $config_id, '_pronamic_gateway_id', true ); + +if ( empty( $webhook_log_json_string ) || $config_gateway_id !== $gateway_id ) { + esc_html_e( 'No webhook request processed yet.', 'pronamic_ideal' ); + + return; +} + +$object = json_decode( $webhook_log_json_string ); + +try { + $webhook_log_request_info = WebhookRequestInfo::from_json( $object ); +} catch ( InvalidArgumentException $e ) { + $webhook_error = new WP_Error( 'webhook_request_info_error', $e->getMessage() ); + + Plugin::render_errors( $webhook_error ); + + return; +} + +$payment = $webhook_log_request_info->get_payment(); + +if ( $payment ) { + printf( + /* translators: 1: formatted date, 2: payment edit url, 3: payment id */ + __( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'Last webhook request processed on %1$s for payment #%3$s.', + 'pronamic_ideal' + ), + esc_html( $webhook_log_request_info->get_request_date()->format_i18n( _x( 'l j F Y \a\t H:i', 'full datetime format', 'pronamic_ideal' ) ) ), + esc_url( get_edit_post_link( $payment->get_id() ) ), + esc_html( $payment->get_id() ) + ); +} else { + printf( + /* translators: 1: formatted date, 2: payment edit url, 3: payment id */ + __( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + 'Last webhook request processed on %1$s.', + 'pronamic_ideal' + ), + esc_html( $webhook_log_request_info->get_request_date()->format_i18n( _x( 'l j F Y \a\t H:i', 'full datetime format', 'pronamic_ideal' ) ) ) + ); +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-notes.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-notes.php new file mode 100644 index 00000000..e82beddd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-notes.php @@ -0,0 +1,66 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; + +if ( ! isset( $notes ) ) { + return; +} + +if ( ! is_array( $notes ) ) { + return; +} + +if ( empty( $notes ) ) : ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + comment_date_gmt, new DateTimeZone( 'UTC' ) ); + + echo esc_html( $date->format_i18n() ); + + ?> + + + + +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-info.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-info.php new file mode 100644 index 00000000..210b16ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-info.php @@ -0,0 +1,903 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Gender; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; +use Pronamic\WordPress\Pay\VatNumbers\VatNumberValidationService; + +$payment_id = get_the_ID(); + +if ( empty( $payment_id ) ) { + return; +} + +$payments_post_type = \Pronamic\WordPress\Pay\Admin\AdminPaymentPostType::POST_TYPE; + +$payment = get_pronamic_payment( $payment_id ); + +if ( null === $payment ) { + return; +} + +$purchase_id = get_post_meta( $payment_id, '_pronamic_payment_purchase_id', true ); + +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + get_bank_transfer_recipient_details(); + + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + get_customer(); + + if ( null !== $customer ) : + + $text = \strval( $customer->get_name() ); + + if ( empty( $text ) ) : + + $text = $customer->get_email(); + + endif; + + if ( ! empty( $text ) ) : + + ?> + + + + + + + get_company_name(); + + if ( null !== $company_name ) : + ?> + + + + + + + get_vat_number(); + + if ( null !== $vat_number ) : + $vat_number_validity = $vat_number->get_validity(); + + ?> + + + + + + + + + + + + + + get_birth_date(); + + if ( null !== $birth_date ) : + ?> + + + + + + + + + get_gender(); + + if ( null !== $gender ) : + ?> + + + + + + + + + get_user_id(); + + if ( null !== $user_id ) : + ?> + + + + + + + + + + + get_consumer_bank_details(); + + if ( null !== $consumer_bank_details ) : + + $consumer_name = $consumer_bank_details->get_name(); + + if ( null !== $consumer_name ) : + + ?> + + + + + + + get_city(); + + if ( null !== $account_holder_city ) : + ?> + + + + + + + get_country(); + + if ( null !== $account_holder_country ) : + ?> + + + + + + + get_account_number(); + + if ( null !== $account_number ) : + ?> + + + + + + + get_iban(); + + if ( null !== $iban ) : + ?> + + + + + + + get_bic(); + + if ( null !== $bic ) : + ?> + + + + + + + + + get_billing_address() ) : ?> + + + + + + + + + get_shipping_address() ) : ?> + + + + + + + + + + + + + + get_ga_tracked(); + + $ga_property_id = get_option( 'pronamic_pay_google_analytics_property' ); + + ?> + + + + + + + + + + + get_source() ) : ?> + + + + + + + + + + + + + get_source() ) : ?> + + + + + + + + + + + + + get_source() ) : ?> + + + + + + + + + + + + + get_meta( 'ogone_alias' ); + + ?> + + + + + + + + + + + plugin->is_debug_mode() ) : ?> + + user_agent ) ) : ?> + + + + + + + + + + + + + + get_version() ) : ?> + + + + + + + + + get_mode() ) : ?> + + + + + + + + + + + + + + +
    + + + date->format_i18n() ); ?> +
    + + + +
    + + + +
    + + + +
    + + + get_total_amount()->format_i18n() ); + + ?> +
    + + + +
    + + + +
    + + + config_id ), '', '', $payment->config_id ); ?> +
    + + + get_meta( 'method' ); + + $name = PaymentMethods::get_name( $method ); + + echo esc_html( $name ); + + $issuer = $payment->get_meta( 'issuer' ); + + if ( $issuer ) { + echo esc_html( sprintf( ' (`%s`)', $issuer ) ); + } + + ?> +
    + + + array(), + 'br' => array(), + ) + ); + + ?> +
    + + + %s', + esc_attr( $url ), + esc_html( $url ) + ); + + ?> +
    + + + get_return_url(); + + printf( + '%s', + esc_attr( $url ), + esc_html( $url ) + ); + + ?> +
    + + + get_return_redirect_url(); + + printf( + '%s', + esc_attr( $url ), + esc_html( $url ) + ); + + ?> +
    + + + label ) ) { + echo esc_html( $status_object->label ); + } else { + echo '—'; + } + + // Failure reason. + $failure_reason = $payment->get_failure_reason(); + + if ( PaymentStatus::FAILURE === $payment->get_status() && null !== $failure_reason ) : + + printf( + ' — %s', + esc_html( $failure_reason ) + ); + + endif; + + ?> +
    + + + +
    + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + get_service(); + + if ( null !== $service ) : + ?> + + + + + + + + +
    + + + get_vat_number() ); ?> +
    + + + get_request_date()->format( 'd-m-Y' ) ); ?> +
    + + + is_valid() ? __( 'Yes', 'pronamic_ideal' ) : __( 'No', 'pronamic_ideal' ) ); ?> +
    + + + get_name() ); ?> +
    + + + get_address() ), + array( + 'br' => array(), + ) + ); + + ?> +
    + + + +
    +
    + + + format_i18n( 'D j M Y' ) ) + + ?> +
    + + + +
    + + + display_name; + + if ( ! empty( $display_name ) ) { + $user_text .= sprintf( ' - %s', $display_name ); + } + + printf( + '%s', + esc_url( get_edit_user_link( $user_id ) ), + esc_html( $user_text ) + ); + + ?> +
    + + + +
    + + + +
    + + + +
    + + + +
    + %s', + esc_attr( _x( 'International Bank Account Number', 'IBAN abbreviation title', 'pronamic_ideal' ) ), + esc_html__( 'IBAN', 'pronamic_ideal' ) + ); + + ?> + + +
    + %s', + esc_attr( _x( 'Bank Identifier Code', 'BIC abbreviation title', 'pronamic_ideal' ) ), + esc_html__( 'BIC', 'pronamic_ideal' ) + ); + + ?> + + +
    + + + get_billing_address(); + + echo nl2br( esc_html( (string) $address ) ); + + ?> +
    + + + get_shipping_address(); + + echo nl2br( esc_html( (string) $address ) ); + + ?> +
    + + + get_source_text(); + + ?> +
    + + + +
    + + + get_id(), '_pronamic_payment_s2member_period', true ) ); ?> +
    + + + get_id(), '_pronamic_payment_s2member_level', true ) ); ?> +
    + + + get_id(), '_pronamic_payment_wpsc_purchase_id', true ) ); ?> +
    + + + get_id(), '_pronamic_payment_wpsc_session_id', true ) ); ?> +
    + + + get_id(), '_pronamic_payment_membership_user_id', true ) ); ?> +
    + + + get_id(), '_pronamic_payment_membership_subscription_id', true ) ); ?> +
    + + + +
    + + + user_agent ); ?> +
    + + + user_ip ); ?> +
    + + + get_version() ); ?> +
    + + + get_mode() ) { + case 'live': + esc_html_e( 'Live', 'pronamic_ideal' ); + + break; + case 'test': + esc_html_e( 'Test', 'pronamic_ideal' ); + + break; + default: + echo esc_html( $payment->get_mode() ); + + break; + } + + ?> +
    + + + %s', + esc_url( $rest_api_nonce_url ), + esc_html( $rest_api_url ) + ); + + ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-lines.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-lines.php new file mode 100644 index 00000000..27801977 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-lines.php @@ -0,0 +1,330 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Pay\Payments\PaymentLine; + +if ( empty( $lines ) ) : ?> + +

    + +

    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + %s', + esc_attr__( 'Unit price with discount including tax.', 'pronamic_ideal' ), + esc_html__( 'Unit Price', 'pronamic_ideal' ) + ); + + ?> + + %s', + esc_attr__( 'Total discount.', 'pronamic_ideal' ), + esc_html__( 'Discount', 'pronamic_ideal' ) + ); + + ?> + + %s', + esc_attr__( 'Total amount with discount including tax.', 'pronamic_ideal' ), + esc_html__( 'Total Amount', 'pronamic_ideal' ) + ); + + ?> +
    + get_quantity(); + }, + $lines->get_array() + ); + + echo esc_html( array_sum( $quantities ) ); + + ?> + + get_discount_amount() ) { + return $line->get_discount_amount()->get_value(); + } + }, + $lines->get_array() + ); + + $discount_amount = new Money( array_sum( $values ), $lines->get_amount()->get_currency() ); + + echo esc_html( $discount_amount ); + + ?> + + get_total_amount()->get_excluding_tax()->get_value(); + }, + $lines->get_array() + ); + + $total_exclusive = new Money( array_sum( $values ), $lines->get_amount()->get_currency() ); + + $tip = array( + sprintf( + /* translators: %s: price excluding tax */ + __( 'Exclusive tax: %s', 'pronamic_ideal' ), + $total_exclusive + ), + ); + + if ( $lines->get_amount()->has_tax() ) { + $values = array_map( + function ( PaymentLine $line ) { + return $line->get_total_amount()->get_including_tax()->get_value(); + }, + $lines->get_array() + ); + + $total_inclusive = new Money( array_sum( $values ), $lines->get_amount()->get_currency() ); + + $tip[] = sprintf( + /* translators: %s: price including tax */ + __( 'Inclusive tax: %s', 'pronamic_ideal' ), + $total_inclusive + ); + } + + printf( + '%s', + esc_attr( implode( '
    ', $tip ) ), + esc_html( $total_exclusive ) + ); + + ?> +
    + get_total_amount()->get_tax_value(); + }, + $lines->get_array() + ); + + $tax_amount = new Money( array_sum( $values ), $lines->get_amount()->get_currency()->get_alphabetic_code() ); + + echo esc_html( $tax_amount ); + + ?> +
    get_id() ); ?>get_sku() ); ?> + get_image_url(); + + if ( ! empty( $image_url ) ) { + printf( + '', + esc_url( $image_url ) + ); + } + + ?> + + get_product_url(); + + $description = $line->get_description(); + + if ( ! empty( $product_url ) ) { + // Product URL with or without description. + $line_title = $line->get_name(); + + $classes = array(); + + if ( ! empty( $description ) ) { + $line_title = $line->get_description(); + $classes[] = 'pronamic-pay-tip'; + } + + printf( + '%4$s', + esc_attr( implode( ' ', $classes ) ), + esc_url( $line->get_product_url() ), + esc_attr( $line_title ), + esc_html( $line->get_name() ) + ); + } elseif ( ! empty( $description ) ) { + // Description without product URL. + printf( + '%2$s', + esc_attr( $line->get_description() ), + esc_html( $line->get_name() ) + ); + } else { + // No description and no product URL. + echo esc_html( $line->get_name() ); + } + + ?> + + get_unit_price() ) { + + $tip = array( + sprintf( + /* translators: %s: price excluding tax */ + __( 'Exclusive tax: %s', 'pronamic_ideal' ), + $line->get_unit_price()->get_excluding_tax() + ), + ); + + if ( $line->get_unit_price()->has_tax() ) { + $tip[] = sprintf( + /* translators: %s: price including tax */ + __( 'Inclusive tax: %s', 'pronamic_ideal' ), + $line->get_unit_price()->get_including_tax() + ); + } + + printf( + '%s', + esc_attr( implode( '
    ', $tip ) ), + esc_html( $line->get_unit_price()->get_excluding_tax() ) + ); + + } + + ?> +
    get_quantity() ); ?> + get_discount_amount() ) { + echo esc_html( $line->get_discount_amount() ); + } + + ?> + + get_total_amount()->get_excluding_tax() + ), + ); + + if ( $line->get_total_amount()->has_tax() ) { + $tip[] = sprintf( + /* translators: %s: price including tax */ + __( 'Inclusive tax: %s', 'pronamic_ideal' ), + $line->get_total_amount()->get_including_tax() + ); + } + + printf( + '%s', + esc_attr( implode( '
    ', $tip ) ), + esc_html( $line->get_total_amount()->get_excluding_tax() ) + ); + + ?> +
    + get_total_amount()->get_tax_amount(); + + if ( null === $line->get_total_amount()->get_tax_percentage() ) { + + echo esc_html( $tax_amount ); + + } else { + + printf( + '%s', + esc_attr( number_format_i18n( $line->get_total_amount()->get_tax_percentage() ) . '%' ), + esc_html( $tax_amount ) + ); + + } + + ?> +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-subscription.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-subscription.php new file mode 100644 index 00000000..7378c75e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-subscription.php @@ -0,0 +1,133 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Util; + +$payment_id = get_the_ID(); + +if ( empty( $payment_id ) ) { + return; +} + +$payment = get_pronamic_payment( $payment_id ); + +if ( null === $payment ) { + return; +} + +$subscription = $payment->get_subscription(); + +if ( $subscription ) : + + $phase = $subscription->get_display_phase(); + + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + post->ID ), '', '', $subscription->post->ID ); ?> +
    + + + post->ID ) ); + + if ( isset( $status_object, $status_object->label ) ) { + echo esc_html( $status_object->label ); + } else { + echo '—'; + } + + ?> +
    + + + get_description() ); ?> +
    + + + get_amount()->format_i18n() ); + + endif; + + ?> +
    + + + get_total_periods() ) : + // No recurrence. + echo '—'; + + elseif ( $phase->is_infinite() ) : + // Infinite. + echo esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ); + + else : + // Fixed number of recurrences. + printf( + '%s (%s)', + esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ), + esc_html( strval( Util::format_frequency( $phase->get_total_periods() ) ) ) + ); + + endif; + + ?> +
    + + + get_source_text(); + + ?> +
    + + + +

    + +

    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-update.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-update.php new file mode 100644 index 00000000..2700b056 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-payment-update.php @@ -0,0 +1,186 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Payments\PaymentPostType; +use Pronamic\WordPress\Pay\Plugin; + +$states = PaymentPostType::get_payment_states(); + +$payment = get_pronamic_payment( get_the_ID() ); + +if ( null === $payment ) { + return; +} + +// WordPress by default doesn't allow `post_author` values of `0`, that's why we use a dash (`-`). +// @link https://github.com/WordPress/WordPress/blob/4.9.5/wp-admin/includes/post.php#L56-L64. +$post_author = get_post_field( 'post_author' ); +$post_author = empty( $post_author ) ? '-' : $post_author; + +?> + + +
    +

    + + +

    + + ID, '_pronamic_payment_config_id', true ); + + $gateway = Plugin::get_gateway( $config_id ); + + /** + * Check status button. + */ + if ( $gateway && $gateway->supports( 'payment_status_request' ) ) { + // Only show button if gateway exists and status check is supported. + $action_url = wp_nonce_url( + add_query_arg( + array( + 'post' => $post->ID, + 'action' => 'edit', + 'pronamic_pay_check_status' => true, + ), + admin_url( 'post.php' ) + ), + 'pronamic_payment_check_status_' . $post->ID + ); + + printf( + '

    %s

    ', + esc_url( $action_url ), + esc_html__( 'Check status', 'pronamic_ideal' ) + ); + } + + /** + * Create invoice for reserved payment. + */ + if ( $gateway && $gateway->supports( 'reservation_payments' ) && 'payment_reserved' === get_post_status( $post->ID ) ) { + // Only show button if gateway exists and reservation payments are supported. + $action_url = wp_nonce_url( + add_query_arg( + array( + 'post' => $post->ID, + 'action' => 'edit', + 'pronamic_pay_create_invoice' => true, + ), + admin_url( 'post.php' ) + ), + 'pronamic_payment_create_invoice_' . $post->ID + ); + + $link_text = sprintf( + /* translators: %s: payment method name */ + __( 'Create %1$s invoice', 'pronamic_ideal' ), + PaymentMethods::get_name( $payment->get_method() ) + ); + + printf( + '

    %s

    ', + esc_url( $action_url ), + esc_html( $link_text ) + ); + } + + /** + * Cancel payment reservations. + */ + if ( $gateway && $gateway->supports( 'reservation_payments' ) && 'payment_reserved' === get_post_status( $post->ID ) ) { + // Only show button if gateway exists and reservation payments are supported. + $action_url = wp_nonce_url( + add_query_arg( + array( + 'post' => $post->ID, + 'action' => 'edit', + 'pronamic_pay_cancel_reservation' => true, + ), + admin_url( 'post.php' ) + ), + 'pronamic_payment_cancel_reservation_' . $post->ID + ); + + $link_text = sprintf( + /* translators: %s: payment method name */ + __( 'Cancel %1$s reservation', 'pronamic_ideal' ), + PaymentMethods::get_name( $payment->get_method() ) + ); + + printf( + '

    %s

    ', + esc_url( $action_url ), + esc_html( $link_text ) + ); + } + + /** + * Send to Google Analytics button. + */ + $can_track = pronamic_pay_plugin()->google_analytics_ecommerce->valid_payment( $payment ); + + if ( $can_track ) { + // Only show button for payments that can be tracked. + $action_url = wp_nonce_url( + add_query_arg( + array( + 'post' => $post->ID, + 'action' => 'edit', + 'pronamic_pay_ga_track' => true, + ), + admin_url( 'post.php' ) + ), + 'pronamic_payment_ga_track_' . $post->ID + ); + + printf( + '

    %s

    ', + esc_url( $action_url ), + esc_html__( 'Send to Google Analytics', 'pronamic_ideal' ) + ); + } + + ?> +
    + +
    +
    + +
    + +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-info.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-info.php new file mode 100644 index 00000000..21a3c776 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-info.php @@ -0,0 +1,403 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\Pay\Core\PaymentMethods; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; +use Pronamic\WordPress\Pay\Util; + +$subscription_id = $subscription->get_id(); + +$customer = $subscription->get_customer(); +$user_id = is_null( $customer ) ? null : $customer->get_user_id(); + +$phase = $subscription->get_display_phase(); + +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + get_end_date() ); + + // Show end date if frequency is limited. + if ( null !== $end_date ) : + + ?> + + + + + + + + + + + + + + get_status(), array( SubscriptionStatus::CANCELLED, SubscriptionStatus::COMPLETED, SubscriptionStatus::EXPIRED ), true ) ) : + + ?> + + + + + + + + + + + + + + get_customer(); + + if ( null !== $customer ) : + + $text = \strval( $customer->get_name() ); + + if ( empty( $text ) ) : + + $text = $customer->get_email(); + + endif; + + if ( ! empty( $text ) ) : + + ?> + + + + + + + + + + + + + + + + + + + + + + + + + get_source() ) : ?> + + + + + + + + + + + + + + + + + + + + + + + + + + plugin->is_debug_mode() ) : ?> + + + + + + + + +
    + + + +
    + + + +
    + + + label ) ) { + echo esc_html( $status_object->label ); + } else { + echo '—'; + } + + ?> +
    + + + get_description() ); ?> +
    + + + config_id ), '', '', $subscription->config_id ); ?> +
    + + + payment_method ) ); ?> +
    + + + get_amount()->format_i18n() ); + + endif; + + ?> +
    + + + get_total_periods() ) : + // No recurrence. + echo '—'; + + elseif ( $phase->is_infinite() ) : + // Infinite. + echo esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ); + + else : + // Fixed number of recurrences. + printf( + '%s (%s)', + esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ), + esc_html( strval( Util::format_frequency( $phase->get_total_periods() ) ) ) + ); + + endif; + + ?> +
    + + + get_start_date(); + + echo empty( $start_date ) ? '—' : esc_html( $start_date->format_i18n() ); + + ?> +
    + + + format( \DATE_ATOM ) ) )->format_i18n() ); + + ?> +
    + + + get_expiry_date(); + + echo empty( $expiry_date ) ? '—' : esc_html( $expiry_date->format_i18n() ); + + ?> +
    + + + get_next_payment_date(); + + echo empty( $next_payment_date ) ? '—' : esc_html( $next_payment_date->format_i18n() ); + + ?> +
    + + + get_next_payment_delivery_date(); + + echo empty( $next_payment_delivery_date ) ? '—' : esc_html( $next_payment_delivery_date->format_i18n() ); + + ?> +
    + + + +
    + + + display_name; + + if ( ! empty( $display_name ) ) { + $user_text .= sprintf( ' - %s', $display_name ); + } + + printf( + '%s', + esc_url( get_edit_user_link( $user_id ) ), + esc_html( $user_text ) + ); + + ?> +
    + + + get_source_text(); + + ?> +
    + + + get_id(), '_pronamic_subscription_s2member_period', true ) ); ?> +
    + + + get_id(), '_pronamic_subscription_s2member_level', true ) ); ?> +
    + + + get_cancel_url(); + + printf( + '%s', + esc_attr( $url ), + esc_html( $url ) + ); + + ?> +
    + + + get_renewal_url(); + + printf( + '%s', + esc_attr( $url ), + esc_html( $url ) + ); + + ?> +
    + + + get_mandate_selection_url(); + + printf( + '%s', + esc_attr( $url ), + esc_html( $url ) + ); + + ?> +
    + + + %s', + esc_url( $rest_api_nonce_url ), + esc_html( $rest_api_url ) + ); + + ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-payments.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-payments.php new file mode 100644 index 00000000..8b486141 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-payments.php @@ -0,0 +1,198 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Plugin; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; + +?> + + + + + + + + + + + + + + + + + + + + + + next_period(); + + $gateway = Plugin::get_gateway( $subscription->get_config_id() ); + + $allow_next_period_statuses = array( SubscriptionStatus::OPEN, SubscriptionStatus::ACTIVE, SubscriptionStatus::FAILURE ); + + if ( null !== $next_period && \in_array( $subscription->get_status(), $allow_next_period_statuses, true ) && null !== $gateway && $gateway->supports( 'recurring' ) ) : + + ?> + + + + + + + + + + + + + + get_id(); + $payments_post_type = get_post_type( $payment_id ); + + ?> + + + + + + + + + + + plugin->subscriptions_module->can_retry_payment( $payment ) ) : ?> + + + + + + + + + + + + + +
    + +
     human_readable_range() ); ?> + get_id() ) ), + 'pronamic_next_period_' . $subscription->get_id() + ); + + if ( in_array( $subscription->get_source(), array( 'woocommerce' ), true ) ) : + + echo wp_kses_post( + sprintf( + /* translators: %s: next payment date */ + __( 'Will be created on %s', 'pronamic_ideal' ), + \esc_html( $subscription->get_next_payment_date()->format_i18n() ) + ) + ); + + else : + + echo wp_kses_post( + sprintf( + /* translators: 1: next payment delivery date, 2: create next period payment anchor */ + __( 'Will be created on %1$s or %2$s', 'pronamic_ideal' ), + \esc_html( $subscription->get_next_payment_delivery_date()->format_i18n() ), + \sprintf( + '%2$s', + \esc_url( $create_next_payment_url ), + \esc_html( \__( 'create now', 'pronamic_ideal' ) ) + ) + ) + ); + + endif; + + ?> + get_amount()->format_i18n() ); ?>
    + + + + + human_readable_range() ); ?> + + + + + + + + +
      + $payment_id, + ), + \get_edit_post_link( $post->ID ) + ), + 'pronamic_retry_payment_' . $payment_id + ); + + \printf( + '

    %s

    ', + \esc_url( $action_url ), + \esc_html( + sprintf( + /* translators: %d: payment ID */ + __( 'Retry payment #%d', 'pronamic_ideal' ), + $payment_id + ) + ) + ); + + ?> +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-phases.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-phases.php new file mode 100644 index 00000000..396a39b3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-phases.php @@ -0,0 +1,145 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Util; +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPhase; + +?> + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + get_amount()->format_i18n() ); ?> + + get_total_periods(); + + if ( 1 === $total_periods ) : + // No recurrence. + echo '—'; + + elseif ( null === $total_periods ) : + // Unlimited. + echo esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ); + + else : + // Fixed number of recurrences. + printf( + '%s (%s)', + esc_html( strval( Util::format_recurrences( $phase->get_interval() ) ) ), + esc_html( strval( Util::format_frequency( $total_periods ) ) ) + ); + + endif; + + ?> + + get_start_date(); + + echo esc_html( ( new \Pronamic\WordPress\DateTime\DateTime( '@' . $start_date->getTimestamp() ) )->format_i18n() ); + + ?> + + get_end_date(); + + echo esc_html( null === $end_date ? '∞' : ( new \Pronamic\WordPress\DateTime\DateTime( '@' . $end_date->getTimestamp() ) )->format_i18n() ); + + ?> + + get_next_date(); + + echo esc_html( null === $next_date ? '—' : ( new \Pronamic\WordPress\DateTime\DateTime( '@' . $next_date->getTimestamp() ) )->format_i18n() ); + + ?> + + get_periods_created() ); + + ?> + + is_trial() ? __( 'Yes', 'pronamic_ideal' ) : __( 'No', 'pronamic_ideal' ) ); + + ?> + + is_alignment() ? __( 'Yes', 'pronamic_ideal' ) : __( 'No', 'pronamic_ideal' ) ); + + ?> + + is_prorated() ? __( 'Yes', 'pronamic_ideal' ) : __( 'No', 'pronamic_ideal' ) ); + + ?> +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-update.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-update.php new file mode 100644 index 00000000..e4b74430 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/meta-box-subscription-update.php @@ -0,0 +1,60 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionPostType; + +$states = SubscriptionPostType::get_states(); + +// WordPress by default doesn't allow `post_author` values of `0`, that's why we use a dash (`-`). +// @link https://github.com/WordPress/WordPress/blob/4.9.5/wp-admin/includes/post.php#L56-L64. +$post_author = get_post_field( 'post_author' ); +$post_author = empty( $post_author ) ? '-' : $post_author; + +?> + + +
    +

    + + +

    +
    + +
    +
    + +
    + +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-license.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-license.php new file mode 100644 index 00000000..41829cb8 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-license.php @@ -0,0 +1,47 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +if ( ! defined( 'WPINC' ) ) { + die; +} + +$class = ( 'valid' === $data->license ) ? 'updated' : 'error'; + +?> +
    +

    + — + license ) { + echo \esc_html( + \sprintf( + /* translators: %s: Pronamic Pay */ + \__( 'Thank you for activating your license and using the %s plugin.', 'pronamic_ideal' ), + \__( 'Pronamic Pay', 'pronamic_ideal' ) + ) + ); + } elseif ( 'invalid' === $data->license && \property_exists( $data, 'activations_left' ) && 0 === $data->activations_left ) { + echo \wp_kses( + __( 'This license does not have any activations left. Maybe you have to deactivate your license on a local/staging server. This can be done on your Pronamic.eu account.', 'pronamic_ideal' ), + array( + 'a' => array( + 'href' => true, + 'target' => true, + ), + ) + ); + } else { + \esc_html_e( 'There was a problem activating your license key, please try again or contact support.', 'pronamic_ideal' ); + } + + ?> +

    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-upgrade.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-upgrade.php new file mode 100644 index 00000000..fd0ce59f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-upgrade.php @@ -0,0 +1,41 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +$upgrade_link = wp_nonce_url( + add_query_arg( + array( + 'page' => 'pronamic_ideal', + 'pronamic_pay_upgrade' => true, + ), + admin_url( 'admin.php' ) + ), + 'pronamic_pay_upgrade', + 'pronamic_pay_nonce' +); + +?> +
    +

    + – + +

    + +

    + +

    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-upgraded.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-upgraded.php new file mode 100644 index 00000000..b5256c78 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-upgraded.php @@ -0,0 +1,19 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +
    +

    + – + +

    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-webhook-url.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-webhook-url.php new file mode 100644 index 00000000..96544151 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/notice-webhook-url.php @@ -0,0 +1,77 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Admin\AdminGatewayPostType; + +if ( ! defined( 'WPINC' ) ) { + die; +} + +// Get outdated webhook URLs config IDs. +$config_ids = get_transient( 'pronamic_outdated_webhook_urls' ); + +if ( ! is_array( $config_ids ) ) { + return; +} + +// Build gateways list. +$gateways = array(); + +foreach ( $config_ids as $config_id ) : + if ( AdminGatewayPostType::POST_TYPE !== get_post_type( $config_id ) ) { + continue; + } + + $gateways[] = sprintf( + '%2$s', + get_edit_post_link( $config_id ), + get_the_title( $config_id ) + ); + +endforeach; + +// Don't show notice if non of the gateways exists. +if ( empty( $gateways ) ) { + // Delete transient. + delete_transient( 'pronamic_outdated_webhook_urls' ); + + return; +} + +?> +
    +

    + — + array( + 'href' => true, + 'title' => true, + ), + ) + ); + + ?> +

    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-dashboard.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-dashboard.php new file mode 100644 index 00000000..4a10606e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-dashboard.php @@ -0,0 +1,447 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +$container_index = 1; + +?> +
    +

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

    +
    + +
    + admin->dashboard->status_widget(); + + ?> +
    +
    +
    + +
    + +
    +
    +

    +
    + +
    + $payments_post_type, + 'post_status' => \array_keys( \Pronamic\WordPress\Pay\Payments\PaymentPostType::get_payment_states() ), + 'posts_per_page' => 5, + ) + ); + + if ( $query->have_posts() ) : + + $columns = array( + 'status', + 'subscription', + 'title', + 'amount', + 'date', + ); + + // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + $column_titles = apply_filters( 'manage_edit-' . $payments_post_type . '_columns', array() ); + + ?> + +
    + + + + + %2$s', + esc_attr( implode( ' ', $classes ) ), + wp_kses_post( $column_titles[ $custom_column ] ) + ); + + endforeach; + + ?> + + + + have_posts() ) : + $query->the_post(); + ?> + + + ', + esc_attr( implode( ' ', $classes ) ), + esc_html( $column_titles[ $custom_column ] ) + ); + + // Do custom column action. + do_action( + 'manage_' . $payments_post_type . '_posts_custom_column', + $custom_column, + $payment_id + ); + + if ( 'pronamic_payment_title' === $custom_column ) : + + printf( + '', + esc_html( __( 'Show more details', 'pronamic_ideal' ) ) + ); + + endif; + + echo ''; + + endforeach; + + ?> + + + + + +
    +
    + + + + + +

    + + +
    +
    +
    + + $subscriptions_post_type, + 'post_status' => \array_keys( \Pronamic\WordPress\Pay\Subscriptions\SubscriptionPostType::get_states() ), + 'posts_per_page' => 5, + ) + ); + + if ( $query->have_posts() ) : + ?> + +
    + +
    +
    +

    +
    + +
    + + +
    + + + + + %2$s', + esc_attr( implode( ' ', $classes ) ), + wp_kses_post( $column_titles[ $custom_column ] ) + ); + + endforeach; + + ?> + + + + have_posts() ) : + $query->the_post(); + ?> + + + ', + esc_attr( implode( ' ', $classes ) ), + esc_html( $column_titles[ $custom_column ] ) + ); + + // Do custom column action. + do_action( + 'manage_' . $subscriptions_post_type . '_posts_custom_column', + $custom_column, + $payment_id + ); + + if ( 'pronamic_subscription_title' === $custom_column ) : + + printf( + '', + esc_html( __( 'Show more details', 'pronamic_ideal' ) ) + ); + + endif; + + echo ''; + + endforeach; + + ?> + + + + + +
    +
    + + +
    +
    +
    + + +
    + + + + + +
    +
    + + +
    +
    +

    +
    + +
    +

    + +

    + + %s', + esc_attr( + wp_nonce_url( + add_query_arg( + array( + 'page' => 'pronamic_ideal', + 'pronamic_pay_ignore_tour' => '0', + ) + ), + 'pronamic_pay_ignore_tour', + 'pronamic_pay_nonce' + ) + ), + esc_html__( 'Start tour', 'pronamic_ideal' ) + ); + + echo ' '; + + printf( + '%s', + esc_attr( + add_query_arg( + array( + 'page' => 'pronamic-pay-about', + 'tab' => 'new', + ) + ) + ), + esc_html__( 'What is new', 'pronamic_ideal' ) + ); + + echo ' '; + + printf( + '%s', + esc_attr( + add_query_arg( + array( + 'page' => 'pronamic-pay-about', + 'tab' => 'getting-started', + ) + ) + ), + esc_html__( 'Getting started', 'pronamic_ideal' ) + ); + + echo ' '; + + // Site Health button. + + if ( version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) && current_user_can( 'view_site_health_checks' ) ) : + + printf( + '%s', + esc_attr( get_admin_url( null, 'site-health.php' ) ), + esc_html__( 'Site Health', 'pronamic_ideal' ) + ); + + endif; + + // System Status button. + if ( version_compare( get_bloginfo( 'version' ), '5.2', '<' ) ) : + + printf( + '%s', + esc_attr( + add_query_arg( + array( + 'page' => 'pronamic_pay_tools', + ) + ) + ), + esc_html__( 'System Status', 'pronamic_ideal' ) + ); + + endif; + + ?> +
    +
    + + + +
    +
    +

    +
    + +
    + __( 'http://www.pronamic.eu/', 'pronamic_ideal' ), + 'url' => 'http://feeds.feedburner.com/pronamic', + 'title' => __( 'Pronamic News', 'pronamic_ideal' ), + 'items' => 5, + ) + ); + + ?> +
    +
    + + + +
    +
    + +
    +
    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-reports.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-reports.php new file mode 100644 index 00000000..9e031fda --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-reports.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Pay\Util; + +?> +
    +

    + +
    + +
    +
    +
    + +
    + +
    +
    +
      + + reports->get_reports() as $i => $serie ) : ?> + + + +
    • + '; + + if ( isset( $serie->tooltipFormatter ) && 'money' === $serie->tooltipFormatter ) { + $money = new Money( $serie->legendValue, 'EUR' ); + + echo esc_html( $money->format_i18n() ); + } else { + echo esc_html( $serie->legendValue ); + } + + echo ''; + + echo esc_html( $serie->label ); + + ?> +
    • + + + + + +
    +
    + +
    +
    +
    +
    + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-settings.php new file mode 100644 index 00000000..77f0be84 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-settings.php @@ -0,0 +1,50 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +if ( filter_has_var( INPUT_GET, 'message' ) ) { + $message_id = filter_input( INPUT_GET, 'message', FILTER_SANITIZE_STRING ); + + switch ( $message_id ) { + case 'pages-generated': + printf( + '

    %s

    ', + esc_html__( 'The default payment status pages are created.', 'pronamic_ideal' ) + ); + + break; + case 'pages-not-generated': + printf( + '

    %s

    ', + esc_html__( 'The default payment status pages could not be created.', 'pronamic_ideal' ) + ); + + break; + } +} + +?> + +
    +

    + +
    + +
    + + + + + + + +
    + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-tools.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-tools.php new file mode 100644 index 00000000..1c113c9f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/page-tools.php @@ -0,0 +1,67 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Plugin; + +$nav_tabs = array( + 'system_status' => __( 'System Status', 'pronamic_ideal' ), + 'gateways' => __( 'Payment Gateways', 'pronamic_ideal' ), + 'extensions' => __( 'Extensions', 'pronamic_ideal' ), +); + +$current_tab = filter_input( INPUT_GET, 'tab', FILTER_SANITIZE_STRING ); +$current_tab = empty( $current_tab ) ? key( $nav_tabs ) : $current_tab; + +?> + +
    + + +
    + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-dashboard.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-dashboard.php new file mode 100644 index 00000000..472efe93 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-dashboard.php @@ -0,0 +1,26 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + + + +

    + +
    + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-forms.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-forms.php new file mode 100644 index 00000000..90081b5c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-forms.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + + + “Gravity Forms” plugin.', 'pronamic_ideal' ), + esc_attr( 'https://www.pronamic.nl/go/gravity-forms/' ), + esc_attr( '_blank' ) + ), + array( + 'a' => array( + 'href' => true, + 'target' => true, + ), + ) + ); + + ?> +

    + +
    + + + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-gateways.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-gateways.php new file mode 100644 index 00000000..829a68ae --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-gateways.php @@ -0,0 +1,28 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + + + +

    + +
    + + + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-payments.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-payments.php new file mode 100644 index 00000000..fc7e3f46 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-payments.php @@ -0,0 +1,28 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + + + +

    + +
    + + + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-reports.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-reports.php new file mode 100644 index 00000000..0cfb1537 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-reports.php @@ -0,0 +1,25 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + + +

    + +
    + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-settings.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-settings.php new file mode 100644 index 00000000..e26a42af --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-settings.php @@ -0,0 +1,27 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + + +

    + +
    + + + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-start.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-start.php new file mode 100644 index 00000000..5dc350df --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pointer-start.php @@ -0,0 +1,24 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +

    + +

    + +
    + + + + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pronamic.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pronamic.php new file mode 100644 index 00000000..82dd9486 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/pronamic.php @@ -0,0 +1,21 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + +
    + +
    + +
    + + +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-cancel.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-cancel.php new file mode 100644 index 00000000..b54c8694 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-cancel.php @@ -0,0 +1,95 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Subscriptions\SubscriptionStatus; +use Pronamic\WordPress\Pay\Util; + +$phase = $subscription->get_current_phase(); + +$expiry_date = $subscription->get_expiry_date(); + +?> + + +> + + + + <?php esc_html_e( 'Subscription Cancellation', 'pronamic_ideal' ); ?> + + + + + +
    +
    +
    +

    + + get_status() ) : ?> + +

    + format_i18n() + ) + ); + + ?> +

    + + + +
    + + + +
    +
    + +
    +
    + get_interval() ) ) ); ?> +
    + +
    + +
    +
    + get_amount()->format_i18n() ); ?> +
    +
    + + + + get_status() ) : ?> + +

    + +

    + + + +

    + +

    + + + + +
    +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate-failed.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate-failed.php new file mode 100644 index 00000000..9e592de4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate-failed.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + <?php esc_html_e( 'Subscription Mandate', 'pronamic_ideal' ); ?> + + + + + +
    +
    +

    + +

    +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate-updated.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate-updated.php new file mode 100644 index 00000000..a50d317e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate-updated.php @@ -0,0 +1,38 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + <?php esc_html_e( 'Subscription Mandate', 'pronamic_ideal' ); ?> + + + + + +
    +
    +

    + +

    + +

    + + + +

    +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate.php new file mode 100644 index 00000000..9a21f724 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-mandate.php @@ -0,0 +1,260 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Cards; +use Pronamic\WordPress\Pay\Core\PaymentMethods; + +$subscription_id = $subscription->get_id(); + +$mollie_customer_id = \get_post_meta( $subscription_id, '_pronamic_subscription_mollie_customer_id', true ); + +if ( empty( $mollie_customer_id ) ) { + include \get_404_template(); + + exit; +} + +$api_key = \get_post_meta( $subscription->config_id, '_pronamic_gateway_mollie_api_key', true ); + +$client = new \Pronamic\WordPress\Pay\Gateways\Mollie\Client( $api_key ); + +/** + * Mandates. + * + * @link https://docs.mollie.com/reference/v2/mandates-api/list-mandates + */ +$response = $client->get_mandates( $mollie_customer_id ); + +$mollie_customer_mandates = $response->_embedded->mandates; + +$subscription_mandate_id = $subscription->get_meta( 'mollie_mandate_id' ); + +// Set current subscription mandate as first item. +$current_mandate = wp_list_filter( $mollie_customer_mandates, array( 'id' => $subscription_mandate_id ) ); + +if ( is_array( $current_mandate ) ) { + unset( $mollie_customer_mandates[ key( $current_mandate ) ] ); + + $mollie_customer_mandates = array_merge( $current_mandate, $mollie_customer_mandates ); +} + +?> + + +> + + + + <?php esc_html_e( 'Change subscription payment method', 'pronamic_ideal' ); ?> + + + + + +
    +
    + +

    + +

    + +

    + +

    + +
    +
    +
    +

    + +

    + +
    + status ) : + continue; + endif; + + $card_name = null; + $account_number = null; + $account_label = null; + $bic_or_brand = null; + $logo_url = null; + + switch ( $mandate->method ) : + case 'creditcard': + $card_name = $mandate->details->cardHolder; + $account_number = str_pad( $mandate->details->cardNumber, 16, '*', \STR_PAD_LEFT ); + $account_label = _x( 'Card Number', 'Card selector', 'pronamic_ideal' ); + + $bic_or_brand = $mandate->details->cardLabel; + + break; + case 'directdebit': + $card_name = $mandate->details->consumerName; + $account_number = $mandate->details->consumerAccount; + $account_label = _x( 'Account Number', 'Card selector', 'pronamic_ideal' ); + + $bic_or_brand = substr( $mandate->details->consumerAccount, 4, 4 ); + + break; + endswitch; + + // Split account number in chunks. + if ( null !== $account_number ) : + $account_number = \chunk_split( $account_number, 4, ' ' ); + endif; + + $classes = array( 'pp-card' ); + + $card = $cards->get_card( $bic_or_brand ); + + // Set card brand specific details. + if ( null !== $card ) : + $classes[] = 'brand-' . $card['brand']; + + $logo_url = $cards->get_card_logo_url( $card['brand'] ); + endif; + + ?> + +
    +
    +
    + +
    + + +
    + +

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

    + + + +

    +
    +
    +
    + +
    +
    +
    +

    + +

    + + + + get_input_html(); + + ?> + +

    + + + +

    +
    +
    +
    +
    +
    + + + + + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-renew-failed.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-renew-failed.php new file mode 100644 index 00000000..f280e54c --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-renew-failed.php @@ -0,0 +1,32 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + <?php esc_html_e( 'Subscription Renewal', 'pronamic_ideal' ); ?> + + + + + +
    +
    +

    + +

    +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-renew.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-renew.php new file mode 100644 index 00000000..2c096d9e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/subscription-renew.php @@ -0,0 +1,87 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Util; + +$phase = $subscription->get_current_phase(); + +$expiry_date = $subscription->get_expiry_date(); + +?> + + +> + + + + <?php esc_html_e( 'Subscription Renewal', 'pronamic_ideal' ); ?> + + + + + +
    +
    +
    +

    + + + +

    + format_i18n() + ) + ); + + ?> +

    + + + +
    + + + +
    +
    + +
    +
    + get_interval() ) ) ); ?> +
    + +
    + +
    +
    + get_amount()->format_i18n() ); ?> +
    +
    + + + + get_input_html(); + + ?> + + +
    +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-extensions.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-extensions.php new file mode 100644 index 00000000..0e6a342e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-extensions.php @@ -0,0 +1,96 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Plugin; + +?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    + + name ); ?> + + + author, $extension->author_url ) ) { + printf( + '%s', + esc_attr( $extension->author_url ), + esc_html( $extension->author ) + ); + } + + ?> + + wp_org_url ) ) { + printf( + '%s', + esc_attr( $extension->wp_org_url ), + esc_html( $extension->wp_org_url ) + ); + } + + ?> + + requires_at_least ) ) { + echo esc_html( $extension->requires_at_least ); + } + + ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-gateways.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-gateways.php new file mode 100644 index 00000000..84202090 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-gateways.php @@ -0,0 +1,113 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> +

    + + + + + + + + + + + + + + + get_name(); + + $name = explode( ' - ', $name ); + + // Provider. + if ( count( $name ) > 1 ) : + $provider = array_shift( $name ); + else : + $provider_name = explode( '(', $name[0] ); + + $provider = array_shift( $provider_name ); + endif; + + if ( $current_provider === $integration->provider ) : + $provider = ''; + else : + $current_provider = $integration->provider; + + $alternate = ! $alternate; + endif; + + $name = implode( '', $name ); + + // Deprecated notice. + if ( isset( $integration->deprecated ) && $integration->deprecated ) { + /* translators: %s: Integration name */ + $name = sprintf( __( '%s (obsoleted)', 'pronamic_ideal' ), $name ); + } + + // Product link. + $site = ''; + + if ( null !== $integration->get_product_url() ) { + $site = sprintf( + '%2$s', + $integration->get_product_url(), + __( 'Site', 'pronamic_ideal' ) + ); + } + + printf( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + ' + + + + ', + ( $alternate ? ' class="alternate"' : null ), + esc_html( $provider ), + esc_html( $name ), + wp_kses( + $site, + array( + 'a' => array( + 'href' => true, + 'target' => true, + 'title' => true, + ), + ) + ) + ); + + endforeach; + + endif; + + endforeach; + + ?> + + +
    %s%s%s
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-system_status.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-system_status.php new file mode 100644 index 00000000..f890ab35 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/tab-system_status.php @@ -0,0 +1,443 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay; + +use Pronamic\WordPress\DateTime\DateTime; +use Pronamic\WordPress\DateTime\DateTimeZone; + +?> + + + + + + + + + + + + + + + + + +
    + + + +
    + + + format_i18n() ); + } else { + esc_html_e( 'Not scheduled', 'pronamic_ideal' ); + } + + ?> +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + ✓ +
    + + + + + ✓ +
    + + + + + ' ) ) { + echo '✓'; + } else { + esc_html_e( 'Pronamic Pay requires PHP 5.2 or above.', 'pronamic_ideal' ); + } + + ?> +
    + + + db_version() ); + + ?> + + db_version(), '5', '>' ) ) { + echo '✓'; + } else { + esc_html_e( 'Pronamic Pay requires MySQL 5 or above.', 'pronamic_ideal' ); + } + + ?> +
    + + + + + ' ) ) { + echo '✓'; + } else { + esc_html_e( 'Pronamic Pay requires WordPress 3.2 or above.', 'pronamic_ideal' ); + } + + ?> +
    + + + + + = 67108864 ) { // 64 MB + echo '✓'; + } else { + echo wp_kses( + sprintf( + /* translators: %s: WordPress Codex link */ + __( 'We recommend setting memory to at least 64MB. See: Increasing memory allocated to PHP', 'pronamic_ideal' ), + esc_attr( 'http://codex.wordpress.org/Editing_wp-config.php#Increasing_memory_allocated_to_PHP' ) + ), + array( + 'a' => array( + 'href' => true, + 'target' => true, + ), + ) + ); + } + + ?> +
    + + + + + +
    + + + + + ✓ +
    + + + + + ✓ +
    + + + + + ' ) ) { + echo '✓'; + } else { + esc_html_e( 'Pronamic Pay requires OpenSSL 0.9.8 or above.', 'pronamic_ideal' ); + } + + ?> +
    + + + + + +
    + + + plugin->get_version(), 'https://travis-ci.org/pronamic/wp-pronamic-ideal.png' ); + + ?> + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + +
    + + + — + + iDEAL-status.nl', 'pronamic_ideal' ), + 'http://www.ideal-status.nl/' + ), + array( + 'a' => array( + 'href' => true, + 'target' => true, + ), + ) + ); + + ?> +
    + + + + + + + +
    + issuer_id ); ?> + + – + + issuer_name ); ?> + + rate_success * 100, 1, ',', '.' ) ); ?>% + + rate_failure * 100, 1, ',', '.' ) ); ?>% + + datetime ); ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/widget-payments-status-list.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/widget-payments-status-list.php new file mode 100644 index 00000000..bd3b5f7e --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/core/views/widget-payments-status-list.php @@ -0,0 +1,40 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.css new file mode 100644 index 00000000..279b36a9 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.css @@ -0,0 +1,247 @@ +.ppfr-block { + border: 1px solid #ddd; + border-radius: 5px; + font-size: 16px; + margin: 30px 0; + padding: 20px; +} +@media screen and (min-width: 767px) { + .ppfr-block { + padding: 30px; + } +} + +.edit-post-visual-editor .ppfr-block { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +.ppfr-circle { + background-color: #eee; + border-radius: 50%; + position: relative; + margin: 0 auto 30px; + width: 80px; + height: 80px; +} +@media screen and (min-width: 767px) { + .ppfr-circle { + margin: 0 30px 0 0; + } +} +.ppfr-circle *, +.ppfr-circle *:before, +.ppfr-circle *:after { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +.ppfr-circle .ppfr-circle__label { + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + line-height: 80px; + text-align: center; + z-index: 1; +} +.ppfr-circle::after { + background-color: #fff; + border-radius: 50%; + content: ""; + display: block; + position: absolute; + top: 8px; + left: 8px; + width: 64px; + height: 64px; +} +.ppfr-circle .ppfr-circle__slice { + clip: rect(0, 80px, 80px, 40px); + position: absolute; + width: 80px; + height: 80px; +} +.ppfr-circle .ppfr-circle__slice .ppfr-circle__slice__bar { + border: 8px solid #f9461c; + border-radius: 50%; + clip: rect(0, 40px, 80px, 0); + position: absolute; + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + width: 64px; + height: 64px; +} +.ppfr-circle.ppfr-circle--50 .ppfr-circle__slice { + clip: rect(auto, auto, auto, auto); +} +.ppfr-circle.ppfr-circle--50 .ppfr-circle__slice .ppfr-circle__slice__fill { + border: 8px solid #f9461c; + border-radius: 50%; + clip: rect(0, 40px, 80px, 0); + position: absolute; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + width: 64px; + height: 64px; +} + +.ppfr-dl-list { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + padding: 0; +} +.ppfr-dl-list .ppfr-dl-list__label, +.ppfr-dl-list .ppfr-dl-list__value { + margin: 0; + padding: 0; +} +.ppfr-dl-list .ppfr-dl-list__label { + font-weight: normal; +} +.ppfr-dl-list .ppfr-dl-list__value { + font-weight: bold; + text-align: right; +} + +.ppfr-block-circle .ppfr-block__container__col:nth-of-type(2) { + width: 100%; +} +@media screen and (min-width: 767px) { + .ppfr-block-circle .ppfr-block-circle__container { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + } +} +.ppfr-block-circle .ppfr-dl-list .ppfr-dl-list__label { + opacity: 0.6; + width: 70%; +} +.ppfr-block-circle .ppfr-dl-list .ppfr-dl-list__value { + width: 30%; +} + +.ppfr-block-bar .ppfr-progress { + background: #eee; + border-radius: 10px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin: 20px 0 10px; + width: 100%; + height: 20px; +} +.ppfr-block-bar .ppfr-progress .ppfr-progress__bar { + background: #f9461c; + border-radius: 10px; + position: relative; +} +.ppfr-block-bar .ppfr-progress .ppfr-progress__bar .ppfr-progress__bar__status { + display: block; + font-size: 14px; + line-height: 20px; + position: relative; + top: -20px; + text-align: right; + white-space: nowrap; +} +@media screen and (min-width: 767px) { + .ppfr-block-bar .ppfr-dl-list { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + text-align: left; + } +} +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label { + text-align: left; +} +@media screen and (min-width: 767px) { + .ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(2) { + -webkit-box-flex: 2; + -ms-flex-positive: 2; + flex-grow: 2; + padding-right: 3px; + text-align: right; + } +} +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value { + text-align: right; +} +@media screen and (min-width: 767px) { + .ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value:nth-of-type(1) { + -webkit-box-flex: 2; + -ms-flex-positive: 2; + flex-grow: 2; + padding-left: 3px; + text-align: left; + } +} +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label, +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value { + display: block; + -ms-flex-preferred-size: 50%; + flex-basis: 50%; + font-weight: 500; + width: auto; +} +@media screen and (min-width: 767px) { + .ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label, +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value { + -ms-flex-preferred-size: auto; + flex-basis: auto; + margin: 0; + } +} +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label:first-of-type, +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value:first-of-type { + color: #f9461c; +} +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(3), +.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value:nth-of-type(3) { + display: none; +} + +.entry-content > * > .ppfr-block-bar:first-child { + margin-top: 0; +} + +.ppfr-block-compact .ppfr-dl-list { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__label { + font-weight: 500; +} +.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(1) { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; +} +.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(2) { + color: #999; + margin-left: 5px; + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; +} +.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__value:nth-of-type(1) { + color: #f9461c; + font-size: 26px; + font-weight: 500; + margin-right: 20px; +} +.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__value:nth-of-type(2) { + font-weight: 500; + color: #999; +} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3Njc3MvZnVuZHJhaXNpbmcuc2NzcyIsImZ1bmRyYWlzaW5nLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQTtFQUNDLHNCQUFBO0VBQ0Esa0JBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGFBQUE7QUNQRDtBRFNDO0VBUEQ7SUFRRSxhQUFBO0VDTkE7QUFDRjs7QURVQztFQUNDLCtCQUFBO1VBQUEsdUJBQUE7QUNQRjs7QURZQTtFQUNDLHNCQTFCZ0I7RUEyQmhCLGtCQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtFQUNBLFdBNUJhO0VBNkJiLFlBN0JhO0FDb0JkO0FEV0M7RUFSRDtJQVNFLGtCQUFBO0VDUkE7QUFDRjtBRFVDOzs7RUFHQywrQkFBQTtVQUFBLHVCQUFBO0FDUkY7QURXQztFQUNDLGNBQUE7RUFDQSxrQkFBQTtFQUNBLE1BQUE7RUFDQSxPQUFBO0VBQ0EsV0FBQTtFQUNBLGlCQS9DWTtFQWdEWixrQkFBQTtFQUNBLFVBQUE7QUNURjtBRFlDO0VBQ0Msc0JBQUE7RUFDQSxrQkFBQTtFQUNBLFdBQUE7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSxRQXpEb0I7RUEwRHBCLFNBMURvQjtFQTJEcEIsV0FBQTtFQUNBLFlBQUE7QUNWRjtBRGFDO0VBQ0MsK0JBQUE7RUFDQSxrQkFBQTtFQUNBLFdBbkVZO0VBb0VaLFlBcEVZO0FDeURkO0FEYUU7RUFDQyx5QkFBQTtFQUNBLGtCQUFBO0VBQ0EsNEJBQUE7RUFDQSxrQkFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtBQ1hIO0FEZ0JFO0VBQ0Msa0NBQUE7QUNkSDtBRGdCRztFQUNDLHlCQUFBO0VBQ0Esa0JBQUE7RUFDQSw0QkFBQTtFQUNBLGtCQUFBO0VBQ0EsaUNBQUE7VUFBQSx5QkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0FDZEo7O0FEcUJBO0VBQ0Msb0JBQUE7RUFBQSxvQkFBQTtFQUFBLGFBQUE7RUFDQSxtQkFBQTtNQUFBLGVBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtBQ2xCRDtBRG9CQzs7RUFFQyxTQUFBO0VBQ0EsVUFBQTtBQ2xCRjtBRHFCQztFQUNDLG1CQUFBO0FDbkJGO0FEc0JDO0VBQ0MsaUJBQUE7RUFDQSxpQkFBQTtBQ3BCRjs7QUQyQkU7RUFDQyxXQUFBO0FDeEJIO0FENEJDO0VBQ0M7SUFDQyx5QkFBQTtRQUFBLHNCQUFBO1lBQUEsbUJBQUE7SUFDQSxvQkFBQTtJQUFBLG9CQUFBO0lBQUEsYUFBQTtFQzFCRDtBQUNGO0FEOEJFO0VBQ0MsWUFBQTtFQUNBLFVBQUE7QUM1Qkg7QUQrQkU7RUFDQyxVQUFBO0FDN0JIOztBRG9DQztFQUNDLGdCQXpKZTtFQTBKZixtQkFBQTtFQUNBLG9CQUFBO0VBQUEsb0JBQUE7RUFBQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtBQ2pDRjtBRG1DRTtFQUNDLG1CQWxLVztFQW1LWCxtQkFBQTtFQUNBLGtCQUFBO0FDakNIO0FEbUNHO0VBQ0MsY0FBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7QUNqQ0o7QUR1Q0U7RUFERDtJQUVFLHlCQUFBO1FBQUEsc0JBQUE7WUFBQSw4QkFBQTtJQUNBLGdCQUFBO0VDcENEO0FBQ0Y7QURzQ0U7RUFDQyxnQkFBQTtBQ3BDSDtBRHVDSTtFQUREO0lBRUUsbUJBQUE7UUFBQSxvQkFBQTtZQUFBLFlBQUE7SUFDQSxrQkFBQTtJQUNBLGlCQUFBO0VDcENIO0FBQ0Y7QUR3Q0U7RUFDQyxpQkFBQTtBQ3RDSDtBRHlDSTtFQUREO0lBRUUsbUJBQUE7UUFBQSxvQkFBQTtZQUFBLFlBQUE7SUFDQSxpQkFBQTtJQUNBLGdCQUFBO0VDdENIO0FBQ0Y7QUQwQ0U7O0VBRUMsY0FBQTtFQUNBLDRCQUFBO01BQUEsZUFBQTtFQUNBLGdCQUFBO0VBQ0EsV0FBQTtBQ3hDSDtBRDBDRztFQVBEOztJQVFFLDZCQUFBO1FBQUEsZ0JBQUE7SUFDQSxTQUFBO0VDdENGO0FBQ0Y7QUR3Q0c7O0VBQ0MsY0E3TlU7QUN3TGQ7QUR3Q0c7O0VBQ0MsYUFBQTtBQ3JDSjs7QUQ0Q0E7RUFBbUQsYUFBQTtBQ3hDbkQ7O0FENENDO0VBQ0MseUJBQUE7TUFBQSxzQkFBQTtVQUFBLG1CQUFBO0FDekNGO0FEMkNFO0VBQ0MsZ0JBQUE7QUN6Q0g7QUQyQ0c7RUFDQyw2QkFBQTtNQUFBLGdCQUFBO0FDekNKO0FENENHO0VBQ0MsV0FBQTtFQUNBLGdCQUFBO0VBQ0EsNEJBQUE7TUFBQSxpQkFBQTtVQUFBLFFBQUE7QUMxQ0o7QUQrQ0c7RUFDQyxjQS9QVTtFQWdRVixlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxrQkFBQTtBQzdDSjtBRGdERztFQUNDLGdCQUFBO0VBQ0EsV0FBQTtBQzlDSiIsImZpbGUiOiJmdW5kcmFpc2luZy5jc3MifQ== */ \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.css.map b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.css.map new file mode 100644 index 00000000..a01a4120 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/fundraising.scss"],"names":[],"mappings":"AAQA;EACC;EACA;EACA;EACA;EACA;;AAEA;EAPD;IAQE;;;;AAKD;EACC;;;AAKF;EACC,kBA1BgB;EA2BhB;EACA;EACA;EACA,OA5Ba;EA6Bb,QA7Ba;;AA+Bb;EARD;IASE;;;AAGD;AAAA;AAAA;EAGC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA,aA/CY;EAgDZ;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA,KAzDoB;EA0DpB,MA1DoB;EA2DpB;EACA;;AAGD;EACC;EACA;EACA,OAnEY;EAoEZ,QApEY;;AAsEZ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAKD;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAOJ;EACC;EACA;EACA;EACA;;AAEA;AAAA;EAEC;EACA;;AAGD;EACC;;AAGD;EACC;EACA;;;AAOA;EACC;;AAIF;EACC;IACC;IACA;;;AAKD;EACC;EACA;;AAGD;EACC;;;AAOF;EACC,YAzJe;EA0Jf;EACA;EACA;EACA;EACA;;AAEA;EACC,YAlKW;EAmKX;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAMF;EADD;IAEE;IACA;;;AAGD;EACC;;AAGC;EADD;IAEE;IACA;IACA;;;AAKH;EACC;;AAGC;EADD;IAEE;IACA;IACA;;;AAKH;AAAA;EAEC;EACA;EACA;EACA;;AAEA;EAPD;AAAA;IAQE;IACA;;;AAGD;AAAA;EACC,OA7NU;;AAgOX;AAAA;EACC;;;AAOJ;EAAmD;;;AAIlD;EACC;;AAEA;EACC;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;AAKD;EACC,OA/PU;EAgQV;EACA;EACA;;AAGD;EACC;EACA","file":"fundraising.css"} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.min.css b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.min.css new file mode 100644 index 00000000..e2832e97 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/css/fundraising.min.css @@ -0,0 +1,2 @@ +.ppfr-block{border:1px solid #ddd;border-radius:5px;font-size:16px;margin:30px 0;padding:20px}@media screen and (min-width:767px){.ppfr-block{padding:30px}}.edit-post-visual-editor .ppfr-block{-webkit-box-sizing:content-box;box-sizing:content-box}.ppfr-circle{background-color:#eee;border-radius:50%;position:relative;margin:0 auto 30px;width:80px;height:80px}@media screen and (min-width:767px){.ppfr-circle{margin:0 30px 0 0}}.ppfr-circle *,.ppfr-circle :after,.ppfr-circle :before{-webkit-box-sizing:content-box;box-sizing:content-box}.ppfr-circle .ppfr-circle__label{display:block;position:absolute;top:0;left:0;width:100%;line-height:80px;text-align:center;z-index:1}.ppfr-circle:after{background-color:#fff;border-radius:50%;content:"";display:block;position:absolute;top:8px;left:8px;width:64px;height:64px}.ppfr-circle .ppfr-circle__slice{clip:rect(0,80px,80px,40px);position:absolute;width:80px;height:80px}.ppfr-circle .ppfr-circle__slice .ppfr-circle__slice__bar{border:8px solid #f9461c;border-radius:50%;clip:rect(0,40px,80px,0);position:absolute;-webkit-transform:rotate(0deg);transform:rotate(0deg);width:64px;height:64px}.ppfr-circle.ppfr-circle--50 .ppfr-circle__slice{clip:rect(auto,auto,auto,auto)}.ppfr-circle.ppfr-circle--50 .ppfr-circle__slice .ppfr-circle__slice__fill{border:8px solid #f9461c;border-radius:50%;clip:rect(0,40px,80px,0);position:absolute;-webkit-transform:rotate(180deg);transform:rotate(180deg);width:64px;height:64px}.ppfr-dl-list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.ppfr-dl-list,.ppfr-dl-list .ppfr-dl-list__label,.ppfr-dl-list .ppfr-dl-list__value{margin:0;padding:0}.ppfr-dl-list .ppfr-dl-list__label{font-weight:400}.ppfr-dl-list .ppfr-dl-list__value{font-weight:700;text-align:right}.ppfr-block-circle .ppfr-block__container__col:nth-of-type(2){width:100%}@media screen and (min-width:767px){.ppfr-block-circle .ppfr-block-circle__container{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}}.ppfr-block-circle .ppfr-dl-list .ppfr-dl-list__label{opacity:.6;width:70%}.ppfr-block-circle .ppfr-dl-list .ppfr-dl-list__value{width:30%}.ppfr-block-bar .ppfr-progress{background:#eee;border-radius:10px;display:-webkit-box;display:-ms-flexbox;display:flex;margin:20px 0 10px;width:100%;height:20px}.ppfr-block-bar .ppfr-progress .ppfr-progress__bar{background:#f9461c;border-radius:10px;position:relative}.ppfr-block-bar .ppfr-progress .ppfr-progress__bar .ppfr-progress__bar__status{display:block;font-size:14px;line-height:20px;position:relative;top:-20px;text-align:right;white-space:nowrap}@media screen and (min-width:767px){.ppfr-block-bar .ppfr-dl-list{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;text-align:left}}.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label{text-align:left}@media screen and (min-width:767px){.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(2){-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;padding-right:3px;text-align:right}}.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value{text-align:right}@media screen and (min-width:767px){.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value:first-of-type{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;padding-left:3px;text-align:left}}.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label,.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value{display:block;-ms-flex-preferred-size:50%;flex-basis:50%;font-weight:500;width:auto}@media screen and (min-width:767px){.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label,.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value{-ms-flex-preferred-size:auto;flex-basis:auto;margin:0}}.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label:first-of-type,.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value:first-of-type{color:#f9461c}.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(3),.ppfr-block-bar .ppfr-dl-list .ppfr-dl-list__value:nth-of-type(3){display:none}.entry-content>*>.ppfr-block-bar:first-child{margin-top:0}.ppfr-block-compact .ppfr-dl-list{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__label{font-weight:500}.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__label:first-of-type{-ms-flex-preferred-size:100%;flex-basis:100%}.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__label:nth-of-type(2){color:#999;margin-left:5px;-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__value:first-of-type{color:#f9461c;font-size:26px;font-weight:500;margin-right:20px}.ppfr-block-compact .ppfr-dl-list .ppfr-dl-list__value:nth-of-type(2){font-weight:500;color:#999} +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3Njc3MvZnVuZHJhaXNpbmcuc2NzcyIsImZ1bmRyYWlzaW5nLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxZQUNDLHFCQUFBLENBQ0EsaUJBQUEsQ0FDQSxjQUFBLENBQ0EsYUFBQSxDQUNBLFlDUEQsQ0RTQyxvQ0FQRCxZQVFFLFlDTkEsQ0FDRixDRFVDLHFDQUNDLDhCQUFBLENBQUEsc0JDUEYsQ0RZQSxhQUNDLHFCQTFCZ0IsQ0EyQmhCLGlCQUFBLENBQ0EsaUJBQUEsQ0FDQSxrQkFBQSxDQUNBLFVBNUJhLENBNkJiLFdDVEQsQ0RXQyxvQ0FSRCxhQVNFLGlCQ1JBLENBQ0YsQ0RVQyx3REFHQyw4QkFBQSxDQUFBLHNCQ1JGLENEV0MsaUNBQ0MsYUFBQSxDQUNBLGlCQUFBLENBQ0EsS0FBQSxDQUNBLE1BQUEsQ0FDQSxVQUFBLENBQ0EsZ0JBL0NZLENBZ0RaLGlCQUFBLENBQ0EsU0NURixDRFlDLG1CQUNDLHFCQUFBLENBQ0EsaUJBQUEsQ0FDQSxVQUFBLENBQ0EsYUFBQSxDQUNBLGlCQUFBLENBQ0EsT0F6RG9CLENBMERwQixRQTFEb0IsQ0EyRHBCLFVBQUEsQ0FDQSxXQ1ZGLENEYUMsaUNBQ0MsMkJBQUEsQ0FDQSxpQkFBQSxDQUNBLFVBbkVZLENBb0VaLFdDWEYsQ0RhRSwwREFDQyx3QkFBQSxDQUNBLGlCQUFBLENBQ0Esd0JBQUEsQ0FDQSxpQkFBQSxDQUNBLDhCQUFBLENBQUEsc0JBQUEsQ0FDQSxVQUFBLENBQ0EsV0NYSCxDRGdCRSxpREFDQyw4QkNkSCxDRGdCRywyRUFDQyx3QkFBQSxDQUNBLGlCQUFBLENBQ0Esd0JBQUEsQ0FDQSxpQkFBQSxDQUNBLGdDQUFBLENBQUEsd0JBQUEsQ0FDQSxVQUFBLENBQ0EsV0NkSixDRHFCQSxjQUNDLG1CQUFBLENBQUEsbUJBQUEsQ0FBQSxZQUFBLENBQ0Esa0JBQUEsQ0FBQSxjQ2hCRCxDRG9CQyxvRkFIQSxRQUFBLENBQ0EsU0NiRCxDRHFCQyxtQ0FDQyxlQ25CRixDRHNCQyxtQ0FDQyxlQUFBLENBQ0EsZ0JDcEJGLENEMkJFLDhEQUNDLFVDeEJILENENEJDLG9DQUNDLGlEQUNDLHdCQUFBLENBQUEscUJBQUEsQ0FBQSxrQkFBQSxDQUNBLG1CQUFBLENBQUEsbUJBQUEsQ0FBQSxZQzFCRCxDQUNGLENEOEJFLHNEQUNDLFVBQUEsQ0FDQSxTQzVCSCxDRCtCRSxzREFDQyxTQzdCSCxDRG9DQywrQkFDQyxlQXpKZSxDQTBKZixrQkFBQSxDQUNBLG1CQUFBLENBQUEsbUJBQUEsQ0FBQSxZQUFBLENBQ0Esa0JBQUEsQ0FDQSxVQUFBLENBQ0EsV0NqQ0YsQ0RtQ0UsbURBQ0Msa0JBbEtXLENBbUtYLGtCQUFBLENBQ0EsaUJDakNILENEbUNHLCtFQUNDLGFBQUEsQ0FDQSxjQUFBLENBQ0EsZ0JBQUEsQ0FDQSxpQkFBQSxDQUNBLFNBQUEsQ0FDQSxnQkFBQSxDQUNBLGtCQ2pDSixDRHVDRSxvQ0FERCw4QkFFRSx3QkFBQSxDQUFBLHFCQUFBLENBQUEsNkJBQUEsQ0FDQSxlQ3BDRCxDQUNGLENEc0NFLG1EQUNDLGVDcENILENEdUNJLG9DQURELGtFQUVFLGtCQUFBLENBQUEsbUJBQUEsQ0FBQSxXQUFBLENBQ0EsaUJBQUEsQ0FDQSxnQkNwQ0gsQ0FDRixDRHdDRSxtREFDQyxnQkN0Q0gsQ0R5Q0ksb0NBREQsaUVBRUUsa0JBQUEsQ0FBQSxtQkFBQSxDQUFBLFdBQUEsQ0FDQSxnQkFBQSxDQUNBLGVDdENILENBQ0YsQ0QwQ0Usc0dBRUMsYUFBQSxDQUNBLDJCQUFBLENBQUEsY0FBQSxDQUNBLGVBQUEsQ0FDQSxVQ3hDSCxDRDBDRyxvQ0FQRCxzR0FRRSw0QkFBQSxDQUFBLGVBQUEsQ0FDQSxRQ3RDRixDQUNGLENEd0NHLGtJQUNDLGFDckNKLENEd0NHLG9JQUNDLFlDckNKLENENENBLDZDQUFtRCxZQ3hDbkQsQ0Q0Q0Msa0NBQ0Msd0JBQUEsQ0FBQSxxQkFBQSxDQUFBLGtCQ3pDRixDRDJDRSx1REFDQyxlQ3pDSCxDRDJDRyxxRUFDQyw0QkFBQSxDQUFBLGVDekNKLENENENHLHNFQUNDLFVBQUEsQ0FDQSxlQUFBLENBQ0EsMkJBQUEsQ0FBQSxnQkFBQSxDQUFBLE9DMUNKLENEK0NHLHFFQUNDLGFBL1BVLENBZ1FWLGNBQUEsQ0FDQSxlQUFBLENBQ0EsaUJDN0NKLENEZ0RHLHNFQUNDLGVBQUEsQ0FDQSxVQzlDSiIsImZpbGUiOiJmdW5kcmFpc2luZy5taW4uY3NzIn0= */ \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/js/dist/index.asset.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/js/dist/index.asset.php new file mode 100644 index 00000000..2f953a8f --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/js/dist/index.asset.php @@ -0,0 +1 @@ + array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'fb44b783c2d5a08cc3630b5036ddc753'); \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/js/dist/index.js b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/js/dist/index.js new file mode 100644 index 00000000..4f1b0ce3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/js/dist/index.js @@ -0,0 +1,6 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=9)}([function(e,t){!function(){e.exports=this.wp.i18n}()},function(e,t){!function(){e.exports=this.wp.components}()},function(e,t){!function(){e.exports=this.wp.blockEditor}()},function(e,t){!function(){e.exports=this.wp.blocks}()},function(e){e.exports=JSON.parse('{"name":"pronamic-pay/fundraising-progress-circle","category":"pronamic-pay","attributes":{"raisedLabel":{"type":"string"},"raisedAmount":{"type":"string","default":"0"},"targetLabel":{"type":"string"},"targetAmount":{"type":"string","default":"0"},"contributionsLabel":{"type":"string"},"contributionsValue":{"type":"string","default":"0"},"currencyCode":{"type":"string","default":"EUR"},"currencyDecimals":{"type":"string","default":"2"},"locale":{"type":"string"},"color":{"type":"string","default":"#f9461c"}}}')},function(e){e.exports=JSON.parse('{"name":"pronamic-pay/fundraising-progress-bar","category":"pronamic-pay","attributes":{"raisedLabel":{"type":"string"},"raisedAmount":{"type":"string","default":"0"},"targetLabel":{"type":"string"},"targetAmount":{"type":"string","default":"0"},"contributionsLabel":{"type":"string"},"contributionsValue":{"type":"string","default":"0"},"currencyCode":{"type":"string","default":"EUR"},"currencyDecimals":{"type":"string","default":"2"},"locale":{"type":"string"},"color":{"type":"string","default":"#f9461c"}}}')},function(e){e.exports=JSON.parse('{"name":"pronamic-pay/fundraising-progress-text","category":"pronamic-pay","attributes":{"raisedLabel":{"type":"string"},"raisedAmount":{"type":"string","default":"0"},"targetLabel":{"type":"string"},"targetAmount":{"type":"string","default":"0"},"contributionsLabel":{"type":"string"},"contributionsValue":{"type":"string","default":"0"},"currencyCode":{"type":"string","default":"EUR"},"currencyDecimals":{"type":"string","default":"2"},"locale":{"type":"string"},"color":{"type":"string","default":"#f9461c"}}}')},function(e,t){!function(){e.exports=this.wp.element}()},function(e,t,r){var n; +/*! + Copyright (c) 2017 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;tt)&&(t=100),Math.floor(e/t*100)}function m(e,t,r,n){var a=e.lastIndexOf(".");if(a>-1){var o=e.substring(a+1).replace(/[0]+$/g,"").padEnd(r,"0");e=e.substring(0,a).replace(/\./g,"")+"."+o}var c=r;return 0==100*(e=parseFloat(e))%100&&(c=0),e.toLocaleString(n,{style:"currency",currency:t,minimumFractionDigits:c,maximumFractionDigits:c})}var b=r(7);function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e,t){for(var r=0;r-1){var r=e.substring(t+1).replace(/[0]+$/g,"").padEnd(n,"0");e=e.substring(0,t).replace(/\./g,"")+"."+r}f({raisedAmount:e})},style:t.hasOwnProperty("raisedAmount")&&{color:t.raisedAmount}}),l&&React.createElement(React.Fragment,null,React.createElement(s.RichText,{tagName:"dt",className:"ppfr-dl-list__label",multiline:"false",value:i,onChange:function(e){f({targetLabel:e})}}),React.createElement(s.RichText,{tagName:"dd",className:"ppfr-dl-list__value",multiline:"false",value:m(l||"0",r,n,a),onChange:function(e){f({targetAmount:e.replace(/,/g,".").replace(/[^\d.-]/g,"")})}})),p&&React.createElement(React.Fragment,null,React.createElement(s.RichText,{tagName:"dt",className:"ppfr-dl-list__label",multiline:"false",value:u,onChange:function(e){f({contributionsLabel:e})}}),React.createElement(s.RichText,{tagName:"dd",className:"ppfr-dl-list__value",multiline:"false",value:parseInt(p||0).toString(),onChange:function(e){f({contributionsValue:e?e.replace(/[^\d]/g,""):"0"})},style:t.hasOwnProperty("contributionsValue")&&{color:t.contributionsValue}})))}}])&&y(t.prototype,r),n&&y(t,n),o}(b.Component),E=r(8),O=r.n(E);function L(e,t){for(var r=0;r50&&(a={borderColor:t});var o=O()({"ppfr-circle":!0,"ppfr-circle--50":e>50});return React.createElement("div",{className:o},React.createElement("span",{className:"ppfr-circle__label"},e,"%"),React.createElement("div",{className:"ppfr-circle__slice"},React.createElement("div",{className:"ppfr-circle__slice__bar",style:n}),React.createElement("div",{className:"ppfr-circle__slice__fill",style:a})))}}])&&L(t.prototype,r),n&&L(t,n),e}();function x(e,t){for(var r=0;r\n" +"Language-Team: \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.1\n" +"X-Domain: pronamic-pay-fundraising\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Plugin Name of the plugin +msgid "Pronamic Pay Fundraising Add-On" +msgstr "Pronamic Pay Fundraising Add-On" + +#. Plugin URI of the plugin +msgid "https://www.pronamic.eu/plugins/pronamic-pay-fundraising/" +msgstr "https://www.pronamic.eu/plugins/pronamic-pay-fundraising/" + +#. Description of the plugin +msgid "Extend the Pronamic Pay plugin with fundraising blocks." +msgstr "Breid de Pronamic Pay plugin uit met blokken voor geldinzameling." + +#. Author of the plugin +msgid "Pronamic" +msgstr "Pronamic" + +#. Author URI of the plugin +msgid "https://www.pronamic.eu/" +msgstr "https://www.pronamic.eu/" + +#: js/dist/index.js:6 js/src/progress-bar/edit.js:51 +#: js/src/progress-circle/edit.js:31 js/src/progress-circle/edit.js:58 +#: js/src/progress-text/edit.js:23 js/src/progress-text/edit.js:38 +msgid "Raised" +msgstr "Opbrengst" + +#: js/dist/index.js:6 js/src/progress-bar/edit.js:44 +#: js/src/progress-circle/edit.js:35 js/src/progress-circle/edit.js:51 +msgid "Target" +msgstr "Doel" + +#: js/dist/index.js:6 js/src/progress-circle/edit.js:39 +#: js/src/progress-circle/edit.js:65 js/src/progress-text/edit.js:45 +msgid "Contributions" +msgstr "Bijdragen" + +#: js/dist/index.js:6 js/src/progress-circle/index.js:21 +msgid "Fundraising Progress Circle" +msgstr "Geldinzameling-voortgang (cirkel)" + +#: js/dist/index.js:6 js/src/progress-circle/index.js:22 +msgid "Displays fundraising information with circular progress chart." +msgstr "Toont informatie over geldinzameling met cirkeldiagram." + +#: js/dist/index.js:6 js/src/progress-bar/edit.js:29 +msgid "Raised:" +msgstr "Opbrengst:" + +#: js/dist/index.js:6 js/src/progress-bar/edit.js:33 +msgid "Target:" +msgstr "Doel:" + +#: js/dist/index.js:6 js/src/progress-bar/index.js:21 +msgid "Fundraising Progress Bar" +msgstr "Geldinzameling-voortgang (balk)" + +#: js/dist/index.js:6 js/src/progress-bar/index.js:22 +msgid "Displays fundraising raised and target amount with progress bar." +msgstr "Toont geldinzameling opbrengst en doelbedrag met voortgangsbalk." + +#: js/dist/index.js:6 js/src/progress-text/edit.js:27 +msgid "contributions" +msgstr "bijdragen" + +#: js/dist/index.js:6 js/src/progress-text/index.js:21 +msgid "Fundraising Progress" +msgstr "Geldinzameling-voortgang" + +#: js/dist/index.js:6 js/src/progress-text/index.js:22 +msgid "Displays fundraising raised amount and number of contributions." +msgstr "Toont opgehaald bedrag en het aantal bijdragen voor geldinzameling." diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/languages/pronamic-pay-fundraising.pot b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/languages/pronamic-pay-fundraising.pot new file mode 100644 index 00000000..e68b7ebd --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/languages/pronamic-pay-fundraising.pot @@ -0,0 +1,103 @@ +# Copyright (C) 2020 Pronamic +# This file is distributed under the same license as the Pronamic Pay Fundraising Add-On plugin. +msgid "" +msgstr "" +"Project-Id-Version: Pronamic Pay Fundraising Add-On 1.1.0\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pronamic-pay-fundraising\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-12-17T12:03:37+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.4.0\n" +"X-Domain: pronamic-pay-fundraising\n" + +#. Plugin Name of the plugin +msgid "Pronamic Pay Fundraising Add-On" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://www.pronamic.eu/plugins/pronamic-pay-fundraising/" +msgstr "" + +#. Description of the plugin +msgid "Extend the Pronamic Pay plugin with fundraising blocks." +msgstr "" + +#. Author of the plugin +msgid "Pronamic" +msgstr "" + +#. Author URI of the plugin +msgid "https://www.pronamic.eu/" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-bar/edit.js:51 +#: js/src/progress-circle/edit.js:31 +#: js/src/progress-circle/edit.js:58 +#: js/src/progress-text/edit.js:23 +#: js/src/progress-text/edit.js:38 +msgid "Raised" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-bar/edit.js:44 +#: js/src/progress-circle/edit.js:35 +#: js/src/progress-circle/edit.js:51 +msgid "Target" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-circle/edit.js:39 +#: js/src/progress-circle/edit.js:65 +#: js/src/progress-text/edit.js:45 +msgid "Contributions" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-circle/index.js:21 +msgid "Fundraising Progress Circle" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-circle/index.js:22 +msgid "Displays fundraising information with circular progress chart." +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-bar/edit.js:29 +msgid "Raised:" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-bar/edit.js:33 +msgid "Target:" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-bar/index.js:21 +msgid "Fundraising Progress Bar" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-bar/index.js:22 +msgid "Displays fundraising raised and target amount with progress bar." +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-text/edit.js:27 +msgid "contributions" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-text/index.js:21 +msgid "Fundraising Progress" +msgstr "" + +#: js/dist/index.js:6 +#: js/src/progress-text/index.js:22 +msgid "Displays fundraising raised amount and number of contributions." +msgstr "" diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/pronamic-pay-fundraising.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/pronamic-pay-fundraising.php new file mode 100644 index 00000000..475b5937 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/pronamic-pay-fundraising.php @@ -0,0 +1,39 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay\Fundraising + */ + +if ( ! class_exists( '\Pronamic\WordPress\Pay\Fundraising\Addon' ) ) { + return; +} + +/** + * Bootstrap. + */ +\Pronamic\WordPress\Pay\Fundraising\Addon::instance( + array( + 'file' => __FILE__, + ) +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/readme.txt b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/readme.txt new file mode 100644 index 00000000..3a58462a --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/readme.txt @@ -0,0 +1,9 @@ +=== Pronamic Pay Fundraising Add-On === +Contributors: pronamic, remcotolsma +Tags: pronamic, pay, fundraising, crowdfunding, donations, add-on +Requires at least: 4.7 +Tested up to: 5.6 +Requires PHP: 5.3 +Stable tag: 1.1.0 + +Extend the Pronamic Pay plugin with blocks for fundraising. diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Addon.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Addon.php new file mode 100644 index 00000000..d4a964d5 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Addon.php @@ -0,0 +1,160 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +use Pronamic\WordPress\Pay\Payments\Payment; +use Pronamic\WordPress\Pay\Payments\PaymentStatus; + +/** + * Addon. + * + * @author Reüel van der Steege + * @since 1.0.0 + * @version 1.0.0 + */ +class Addon { + /** + * Instance. + * + * @var Addon|null + */ + protected static $instance; + + /** + * Instance. + * + * @param string|array|object $args The add-on arguments. + * + * @return Addon + */ + public static function instance( $args = array() ) { + if ( is_null( self::$instance ) ) { + self::$instance = new self( $args ); + } + + return self::$instance; + } + + /** + * The root file of this WordPress plugin. + * + * @var string + */ + public $file; + + /** + * Version. + * + * @var string + */ + public $version = ''; + + /** + * Blocks. + * + * @var Blocks + */ + private $blocks; + + /** + * Add-on constructor. + * + * @param array $args Arguments. + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'file' => null, + 'options' => array(), + ) + ); + + $this->file = $args['file']; + + // Version from plugin file header. + if ( null !== $args['file'] ) { + $file_data = get_file_data( $this->file, array( 'Version' => 'Version' ) ); + + if ( \array_key_exists( 'Version', $file_data ) ) { + $this->version = $file_data['Version']; + } + } + + // Actions. + $plugins_loaded_function = array( $this, 'plugins_loaded' ); + + if ( ! \has_action( 'plugins_loaded', $plugins_loaded_function ) ) { + \add_action( 'plugins_loaded', $plugins_loaded_function ); + } + } + + /** + * Plugins loaded. + * + * @link https://developer.wordpress.org/reference/hooks/plugins_loaded/ + * @link https://developer.wordpress.org/reference/functions/load_plugin_textdomain/ + * @return void + */ + public function plugins_loaded() { + if ( ! \function_exists( '\pronamic_pay_plugin' ) ) { + // @todo Add admin notice if Pronamic Pay is not active. + return; + } + + if ( ! \function_exists( '\register_block_type' ) ) { + // @todo Add admin notice if blocks can not be registered. + return; + } + + // Blocks. + $this->blocks = new Blocks( $this ); + $this->blocks->setup(); + + // Update blocks on payment status update. + \add_action( 'pronamic_payment_status_update', array( $this, 'payment_status_block_update' ), 10, 1 ); + } + + /** + * Update blocks on payment status update. + * + * @param Payment $payment Payment. + * @return void + */ + public function payment_status_block_update( Payment $payment ) { + if ( PaymentStatus::SUCCESS !== $payment->get_status() ) { + return; + } + + $post_id = $payment->get_origin_id(); + + if ( null === $post_id ) { + return; + } + + $origin_post = \get_post( $post_id ); + + if ( null === $origin_post ) { + return; + } + + if ( ! \has_blocks( $origin_post->post_content ) ) { + return; + } + + // Use block updater to update blocks in origin post. + $updater = new BlockUpdater(); + + $updater->add_raised_money( $payment->get_total_amount() ); + + $updater->update_post( $origin_post ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/BlockUpdater.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/BlockUpdater.php new file mode 100644 index 00000000..6bea08f3 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/BlockUpdater.php @@ -0,0 +1,231 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +use Pronamic\WordPress\Money\Money; +use Pronamic\WordPress\Money\Parser; +use WP_Post; + +/** + * Addon. + * + * @author Reüel van der Steege + * @since 1.0.0 + * @version 1.0.0 + */ +class BlockUpdater { + /** + * Block names. + * + * @var array + */ + public $block_names; + + /** + * Add raised money. + * + * @var Money|null + */ + public $add_raised; + + /** + * Target amount. + * + * @var Money|null + */ + public $target_amount; + + /** + * Raised amount. + * + * @var Money|null + */ + public $raised_amount; + + /** + * Number of contributions. + * + * @var int|null + */ + public $contributions; + + /** + * Blcok updater constructor. + */ + public function __construct() { + $this->block_names = array( + 'pronamic-pay/fundraising-progress-circle', + 'pronamic-pay/fundraising-progress-bar', + 'pronamic-pay/fundraising-progress-text', + ); + } + + /** + * Add raised money. + * + * @param Money $add Money to add to raised amount. + * @return void + */ + public function add_raised_money( Money $add ) { + $this->add_raised = $add; + } + + /** + * Update post. + * + * @param WP_Post $post Post to update fundraising blocks in. + */ + public function update_post( WP_Post $post ) { + $post_content = $post->post_content; + + if ( ! \has_blocks( $post_content ) ) { + return; + } + + if ( null === $this->add_raised ) { + return; + } + + $updated_content = $this->update_content( $post_content ); + + if ( $updated_content === $post_content ) { + return; + } + + // Temporary allow unfiltered HTML for `transform` CSS attribute. + \add_filter( 'user_has_cap', array( $this, 'allow_unfiltered_html' ), 10, 2 ); + + \kses_init(); + + // Update post. + \wp_update_post( + array( + 'ID' => $post->ID, + 'post_content' => $updated_content, + ) + ); + + \remove_filter( 'user_has_cap', array( $this, 'allow_unfiltered_html' ) ); + + \kses_init(); + } + + /** + * Allow unfiltered HTML. + * + * @param array $attributes CSS attributes. + * + * @return array + */ + public function allow_unfiltered_html( $capabilities, $capability ) { + if ( in_array( 'unfiltered_html', $capability, true ) ) { + $capabilities['unfiltered_html'] = true; + } + + return $capabilities; + } + + /** + * Update content. + * + * @param string $post_content Post content. + * @return string + */ + public function update_content( $post_content ) { + $blocks = \parse_blocks( $post_content ); + + foreach ( $blocks as &$block ) { + $block = $this->update_block( $block ); + } + + // Serialize blocks. + $updated_content = \serialize_blocks( $blocks ); + + return $updated_content; + } + + /** + * Update block. + * + * @param array $block Block to update. + * @return array + */ + public function update_block( $block ) { + // Update fundraising block. + if ( \in_array( $block['blockName'], $this->block_names, true ) ) { + $block = $this->update_fundraising_block( $block ); + } + + // Update inner blocks. + if ( \array_key_exists( 'innerBlocks', $block ) ) { + foreach ( $block['innerBlocks'] as &$inner_block ) { + $inner_block = $this->update_block( $inner_block ); + } + } + + return $block; + } + + /** + * Update fundraising block. + * + * @param array $block Block. + * @return array + */ + public function update_fundraising_block( $block ) { + $parser = new Parser(); + + // Get target amount for use when updating innner blocks. + if ( ! \array_key_exists( 'targetAmount', $block['attrs'] ) ) { + $block['attrs']['targetAmount'] = 0; + } + + // Try parsing `targetAmount` block attribute. + try { + $this->target_amount = $parser->parse( $block['attrs']['targetAmount'] ); + } catch ( \Exception $e ) { + $this->target_amount = null; + } + + // Set raised amount. + if ( ! \array_key_exists( 'raisedAmount', $block['attrs'] ) ) { + $block['attrs']['raisedAmount'] = 0; + } + + // Try parsing and updating `raisedAmount` block attribute. + try { + $this->raised_amount = $parser->parse( $block['attrs']['raisedAmount'] ); + + $this->raised_amount = $this->raised_amount->add( $this->add_raised ); + + $this->raised_amount->set_currency( $this->add_raised->get_currency() ); + + // Update block attributes. + $block['attrs']['raisedAmount'] = \number_format( $this->raised_amount->get_value(), 2, '.', '' ); + $block['attrs']['currencyCode'] = $this->raised_amount->get_currency()->get_alphabetic_code(); + $block['attrs']['currencyDecimals'] = $this->raised_amount->get_currency()->get_number_decimals(); + $block['attrs']['locale'] = str_replace( '_', '-', \get_locale() ); + } catch ( \Exception $e ) { + $this->raised_amount = null; + } + + // Set number of contributions. + if ( ! \array_key_exists( 'contributionsValue', $block['attrs'] ) ) { + $block['attrs']['contributionsValue'] = 0; + } + + $this->contributions = 1 + \intval( $block['attrs']['contributionsValue'] ); + + $block['attrs']['contributionsValue'] = strval( $this->contributions ); + + return $block; + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Blocks.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Blocks.php new file mode 100644 index 00000000..eca8f894 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Blocks.php @@ -0,0 +1,180 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +/** + * Blocks + * + * @author Reüel van der Steege + * @since 2.2.6 + * @version 2.1.7 + */ +class Blocks { + /** + * Add-on plugin. + * + * @var Addon + */ + private $plugin; + + /** + * Constructor. + * + * @param Addon $plugin Add-on plugin. + */ + public function __construct( Addon $plugin ) { + $this->plugin = $plugin; + } + + /** + * Setup. + * + * @return void + */ + public function setup() { + // Initialize. + add_action( 'init', array( $this, 'register_scripts' ) ); + add_action( 'init', array( $this, 'register_styles' ) ); + add_action( 'init', array( $this, 'register_block_types' ) ); + + add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_styles' ) ); + } + + /** + * Register blocks. + * + * @return void + */ + public function register_scripts() { + $asset_file = include( plugin_dir_path( $this->plugin->file ) . 'js/dist/index.asset.php' ); + + wp_register_script( + 'pronamic-pay-fundraising-blocks', + plugins_url( 'js/dist/index.js', $this->plugin->file ), + $asset_file['dependencies'], + $asset_file['version'] + ); + + // Script translations. + wp_set_script_translations( 'pronamic-pay-fundraising-blocks', 'pronamic-pay-fundraising', plugin_dir_path( $this->plugin->file ) . 'languages' ); + } + + /** + * Register styles. + * + * @return void + */ + public function register_styles() { + $min = SCRIPT_DEBUG ? '' : '.min'; + + wp_register_style( + 'pronamic-pay-fundraising', + plugins_url( '/css/fundraising' . $min . '.css', $this->plugin->file ), + array(), + $this->plugin->version + ); + } + + /** + * Register block types. + * + * @return void + */ + public function register_block_types() { + // Blocks. + $attributes = array( + 'raisedLabel' => array( + 'type' => 'string', + ), + 'raisedAmount' => array( + 'type' => 'string', + 'default' => '0', + ), + 'targetLabel' => array( + 'type' => 'string', + ), + 'targetAmount' => array( + 'type' => 'string', + 'default' => '0', + ), + 'contributionsLabel' => array( + 'type' => 'string', + ), + 'contributionsValue' => array( + 'type' => 'string', + 'default' => '0', + ), + "currencyCode" => array( + 'type' => 'string', + ), + "currencyDecimals" => array( + 'type' => 'string', + 'default' => '2', + ), + "locale" => array( + 'type' => 'string', + 'default' => str_replace( '_', '-', \get_locale() ), + ), + 'color' => array( + 'type' => 'string', + 'default' => '#f9461c', + ), + ); + + $args = array( + 'editor_script' => 'pronamic-pay-fundraising-blocks', + 'style' => 'pronamic-pay-fundraising', + 'attributes' => $attributes, + ); + + // Fundraising Progress Circle block. + $args['render_callback'] = function( $attributes, $content ) { + ob_start(); + + include __DIR__ . '/../templates/block-fundraising-progress-circle.php'; + + return ob_get_clean(); + }; + + register_block_type( 'pronamic-pay/fundraising-progress-circle', $args ); + + // Fundraising Progress Bar block. + $args['render_callback'] = function( $attributes, $content ) { + ob_start(); + + include __DIR__ . '/../templates/block-fundraising-progress-bar.php'; + + return ob_get_clean(); + }; + + register_block_type( 'pronamic-pay/fundraising-progress-bar', $args ); + + // Fundraising Progress Text block. + $args['render_callback'] = function( $attributes, $content ) { + ob_start(); + + include __DIR__ . '/../templates/block-fundraising-progress-text.php'; + + return ob_get_clean(); + }; + + register_block_type( 'pronamic-pay/fundraising-progress-text', $args ); + } + + /** + * Enqueue styles. + * + * @return void + */ + public function enqueue_styles() { + \wp_enqueue_style( 'pronamic-pay-fundraising' ); + } +} diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Util.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Util.php new file mode 100644 index 00000000..5ae959ea --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/Util.php @@ -0,0 +1,39 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +/** + * Util. + * + * @author Reüel van der Steege + * @since 1.0.0 + * @version 1.0.0 + */ +class Util { + /** + * Calculate progress value. + * + * @param string $raised Raised amount. + * @param string $target Target amount. + * + * @return float + */ + public static function calculate_progress_value( $raised, $target ) { + $raised = \floatval( $raised ); + $target = \floatval( $target ); + + if ( 0 == $target && ( 0 == $raised || $raised > $target ) ) { + $target = 100; + } + + return (int) floor( ( $raised / $target ) * 100 ); + } +} \ No newline at end of file diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/i18n-make-pot.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/i18n-make-pot.php new file mode 100644 index 00000000..22e2eb90 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/src/i18n-make-pot.php @@ -0,0 +1,75 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +/* + * The `pronamic i18n make-pot` command requires the `i18n make-pot` command. + * + * @link https://make.wordpress.org/cli/2017/05/03/managing-command-dependencies/ + */ +\WP_CLI::add_hook( + 'after_add_command:i18n make-pot', + function() { + + /** + * Title: Make pot command. + * Description: + * Copyright: 2005-2020 Pronamic + * Company: Pronamic + * + * @author Remco Tolsma + * @version 5.5.5 + * @since 5.5.0 + */ + class MakePotCommand extends \WP_CLI\I18n\MakePotCommand { + /** + * Command constructor. + */ + public function __construct() { + parent::__construct(); + + // @link https://github.com/wp-cli/i18n-command/blob/v2.0.1/src/MakePotCommand.php#L36-L44 + $this->exclude = array_diff( + $this->exclude, + array( + 'vendor', + ) + ); + + $this->exclude = array_merge( + $this->exclude, + array( + 'vendor', + 'wordpress', + 'wp-content', + ) + ); + + $this->include = array( + 'js', + 'src', + 'templates', + '*.php', + ); + } + } + + // @link https://github.com/wp-cli/i18n-command/blob/v2.0.1/i18n-command.php + \WP_CLI::add_command( 'pronamic i18n make-pot', '\Pronamic\WordPress\Pay\Fundraising\MakePotCommand' ); + + /* + * Usage example: + * + * wp pronamic i18n make-pot . languages/pronamic-pay-fundraising.pot --slug="pronamic-pay-fundraising" + * wp i18n make-json languages/pronamic-pay-fundraising-nl_NL.po --no-purge + */ + } +); diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-bar.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-bar.php new file mode 100644 index 00000000..c1f08d92 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-bar.php @@ -0,0 +1,48 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +use Pronamic\WordPress\Money\Parser; + +$progress = Util::calculate_progress_value( $attributes['raisedAmount'], $attributes['targetAmount'] ); + +// Bar style. +$bar_style = array( + 'background: ' . $attributes['color'] . ';', + 'width: ' . sprintf( '%.2F', min( $progress, 100 ) ) . '%;', +); + +// Amounts. +$parser = new Parser(); + +$raised_amount = $parser->parse( $attributes['raisedAmount'] ); +$target_amount = $parser->parse( $attributes['targetAmount'] ); + +// Currency. +if ( \array_key_exists( 'currencyCode', $attributes ) ) : + $raised_amount->set_currency( $attributes['currencyCode'] ); + $target_amount->set_currency( $attributes['currencyCode'] ); +endif; + +?> +
    +
    +
    + % +
    +
    +
    +
    +
    format_i18n_non_trailing_zeros() ); ?>
    +
    +
    format_i18n_non_trailing_zeros() ); ?>
    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-circle.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-circle.php new file mode 100644 index 00000000..2c3176d7 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-circle.php @@ -0,0 +1,73 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +use Pronamic\WordPress\Money\Parser; + +$progress = Util::calculate_progress_value( $attributes['raisedAmount'], $attributes['targetAmount'] ); + +// Classes. +$classes = array( 'ppfr-circle' ); + +if ( $progress > 50 ) : + $classes[] = 'ppfr-circle--50'; +endif; + +// Circle style. +$degrees = ( $progress / 100 ) * 360; + +$bar_style = array( + 'border-color: ' . $attributes['color'] . ';', + 'transform: ' . sprintf( 'rotate( %.2Fdeg )', min( $degrees, 360 ) ) . ';', +); + +$fill_style = array(); + +if ( $progress > 50 ) : + $fill_style[] = 'border-color: ' . $attributes['color'] . ';'; +endif; + +// Amounts. +$parser = new Parser(); + +$raised_amount = $parser->parse( $attributes['raisedAmount'] ); +$target_amount = $parser->parse( $attributes['targetAmount'] ); + +// Currency. +if ( \array_key_exists( 'currencyCode', $attributes ) ) : + $raised_amount->set_currency( $attributes['currencyCode'] ); + $target_amount->set_currency( $attributes['currencyCode'] ); +endif; + +?> +
    +
    +
    +
    + % +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    format_i18n_non_trailing_zeros() ); ?>
    +
    +
    format_i18n_non_trailing_zeros() ); ?>
    +
    +
    +
    +
    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-text.php b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-text.php new file mode 100644 index 00000000..581ce431 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/vendor/wp-pay/fundraising/templates/block-fundraising-progress-text.php @@ -0,0 +1,33 @@ + + * @copyright 2005-2020 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +namespace Pronamic\WordPress\Pay\Fundraising; + +use Pronamic\WordPress\Money\Parser; + +// Amount. +$parser = new Parser(); + +$raised_amount = $parser->parse( $attributes['raisedAmount'] ); + +// Currency. +if ( \array_key_exists( 'currencyCode', $attributes ) ) : + $raised_amount->set_currency( $attributes['currencyCode'] ); +endif; + +?> +
    +
    +
    +
    format_i18n_non_trailing_zeros() ); ?>
    +
    +
    +
    +
    diff --git a/wp-content/plugins/pronamic-ideal/views/error.php b/wp-content/plugins/pronamic-ideal/views/error.php new file mode 100644 index 00000000..159e6baf --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/error.php @@ -0,0 +1,61 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +if ( is_wp_error( $pay_error ) ) : ?> + +
    + get_error_codes() as $code ) { + ?> +
    +
    +
    + +
    +
    get_error_message( $code ) ); ?>
    +
    + + get_error_data( $code ); + + if ( $ideal_error instanceof \Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\Error ) : + + ?> + +
    +
    +
    get_code() ); ?>
    + +
    +
    get_message() ); ?>
    + +
    +
    get_detail() ); ?>
    + +
    +
    get_suggested_action() ); ?>
    + +
    +
    get_consumer_message() ); ?>
    +
    + + +
    + + diff --git a/wp-content/plugins/pronamic-ideal/views/errors.php b/wp-content/plugins/pronamic-ideal/views/errors.php new file mode 100644 index 00000000..075ee110 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/errors.php @@ -0,0 +1,15 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +global $pronamic_ideal_errors; + +foreach ( $pronamic_ideal_errors as $pay_error ) { + include 'error.php'; +} diff --git a/wp-content/plugins/pronamic-ideal/views/eshop/settings-meta-box.php b/wp-content/plugins/pronamic-ideal/views/eshop/settings-meta-box.php new file mode 100644 index 00000000..ad9038c4 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/eshop/settings-meta-box.php @@ -0,0 +1,45 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +global $eshop_metabox_plugin, $eshopoptions; + +?> +
    + show_img( 'pronamic_ideal' ); ?> + +

    + /> + + +

    + + + + 'eshop_pronamic_ideal_config_id', + 'selected' => $selected, + ) + ); + + ?> +
    diff --git a/wp-content/plugins/pronamic-ideal/views/exception.php b/wp-content/plugins/pronamic-ideal/views/exception.php new file mode 100644 index 00000000..26053709 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/exception.php @@ -0,0 +1,48 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +if ( $exception instanceof \Exception ) : ?> + +
    +
    +
    +
    getMessage() ); ?>
    + + getCode() ) : ?> + +
    +
    getCode() ); ?>
    + + + + is_debug_mode() && current_user_can( 'manage_options' ) ) : ?> + +
    +
    + '; + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped + + echo $exception->getTraceAsString(); + + // phpcs:enable + + echo ''; + + ?> +
    + + +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/views/ideal-test-cases.php b/wp-content/plugins/pronamic-ideal/views/ideal-test-cases.php new file mode 100644 index 00000000..ec9e6d79 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/ideal-test-cases.php @@ -0,0 +1,86 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +use Pronamic\WordPress\Pay\Gateways\IDealAdvancedV3\IDeal; + +?> + + + + + + + + + array( + 'amount' => 1, + 'result' => 'Success', + ), + 2 => array( + 'amount' => 2, + 'result' => 'Cancelled', + ), + 3 => array( + 'amount' => 3, + 'result' => 'Expired', + ), + 4 => array( + 'amount' => 4, + 'result' => 'Open', + ), + 5 => array( + 'amount' => 5, + 'result' => 'Failure', + ), + 7 => array( + 'amount' => 7, + 'result' => 'SO1000 Failure in system', + ), + ); + + ?> + + + + $data ) : ?> + + + + + + + + + +
    + + + +
    + amount = %s:', 'pronamic_ideal' ), + esc_html( IDeal::format_amount( $data['amount'] ) ) + ), + array( + 'code' => array(), + ) + ); + + ?> + + +
    diff --git a/wp-content/plugins/pronamic-ideal/views/redirect-message.php b/wp-content/plugins/pronamic-ideal/views/redirect-message.php new file mode 100644 index 00000000..94170e32 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/redirect-message.php @@ -0,0 +1,37 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + <?php esc_html_e( 'Payment notice', 'pronamic_ideal' ); ?> + + + + + +
    +
    +

    + +

    +
    +
    + + diff --git a/wp-content/plugins/pronamic-ideal/views/redirect-via-html.php b/wp-content/plugins/pronamic-ideal/views/redirect-via-html.php new file mode 100644 index 00000000..07030663 --- /dev/null +++ b/wp-content/plugins/pronamic-ideal/views/redirect-via-html.php @@ -0,0 +1,64 @@ + + * @copyright 2005-2021 Pronamic + * @license GPL-3.0-or-later + * @package Pronamic\WordPress\Pay + */ + +?> + + +> + + + + <?php esc_html_e( 'Redirecting…', 'pronamic_ideal' ); ?> + + + + + + + + + +
    +
    +

    + +

    + +

    + +

    + +

    + + get_form_html( $payment, $auto_submit ); + + ?> +
    +
    + + diff --git a/wp-content/themes/BIJ1/404.php b/wp-content/themes/BIJ1/404.php index 661ac524..744b2889 100644 --- a/wp-content/themes/BIJ1/404.php +++ b/wp-content/themes/BIJ1/404.php @@ -5,14 +5,21 @@




    -

    De opgevraagde pagina is helaas niet gevonden.

    + +

    The requested page could not be found.

    + +

    De opgevraagde pagina is helaas niet gevonden.

    +


    - Klik hier om terug te keren naar de voorpagina. + + Click here to return to the homepage. + + Klik hier om terug te keren naar de voorpagina. +




    - \ No newline at end of file diff --git a/wp-content/themes/BIJ1/Vacatures.php b/wp-content/themes/BIJ1/Vacatures.php index 97a8e9d0..87580d0c 100644 --- a/wp-content/themes/BIJ1/Vacatures.php +++ b/wp-content/themes/BIJ1/Vacatures.php @@ -25,7 +25,7 @@ ), 'numberposts' => -1 )); - echo '

    ' . $term->name . '

    '; + echo '

    ' . $term->name . '

    '; ?>
    -
    +

    @@ -47,7 +47,8 @@
    diff --git a/wp-content/themes/BIJ1/config.codekit3 b/wp-content/themes/BIJ1/config.codekit3 index ab7e535b..0dc4c171 100644 --- a/wp-content/themes/BIJ1/config.codekit3 +++ b/wp-content/themes/BIJ1/config.codekit3 @@ -1,2960 +1,4645 @@ { -"AAInfo": "This is a CodeKit 3 project config file. EDITING THIS FILE IS A POOR LIFE DECISION. Doing so may cause CodeKit to crash and/or corrupt your project. Several critical values in this file are 64-bit integers, which JavaScript JSON parsers do not support because JavaScript cannot handle 64-bit integers. These values will be corrupted if the file is parsed with JavaScript. This file is not backwards-compatible with CodeKit 1 or 2. For details, see https://codekitapp.com/", -"buildSteps": [ - { - "name": "Process All Remaining Files and Folders", - "stepType": 1, - "uuidString": "D3A22551-9533-4DF5-941F-F19A1A5E5D12" - } - ], -"creatorBuild": "33081", -"files": { - "/3.0.0": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/3.0.0", - "oF": 0 - }, - "/404.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/404.php", - "oF": 0 - }, - "/contact.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/contact.php", - "oF": 0 - }, - "/css/app.css": { - "aP": 1, - "bl": 0, - "ft": 16, - "ma": 0, - "oA": 0, - "oAP": "/css/app-min.css", - "oF": 0, - "oS": 3 - }, - "/css/fontello.css": { - "aP": 1, - "bl": 0, - "ft": 16, - "ma": 0, - "oA": 0, - "oAP": "/css/fontello-min.css", - "oF": 0, - "oS": 3 - }, - "/doemee.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/doemee.php", - "oF": 0 - }, - "/fonts/fontello.eot": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/fontello.eot", - "oF": 0 - }, - "/fonts/fontello.svg": { - "ft": 2097152, - "miP": 0, - "oA": 2, - "oAP": "/fonts/fontello.svg", - "oF": 0, - "opt": 0, - "plM": 52780316221407, - "prP": 0 - }, - "/fonts/fontello.ttf": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/fontello.ttf", - "oF": 0 - }, - "/fonts/fontello.woff": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/fontello.woff", - "oF": 0 - }, - "/fonts/fontello.woff2": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/fontello.woff2", - "oF": 0 - }, - "/fonts/TradeGothicLTStd-Bd2.woff": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/TradeGothicLTStd-Bd2.woff", - "oF": 0 - }, - "/fonts/TradeGothicLTStd-Bd2.woff2": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/TradeGothicLTStd-Bd2.woff2", - "oF": 0 - }, - "/fonts/TradeGothicLTStd.woff": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/TradeGothicLTStd.woff", - "oF": 0 - }, - "/fonts/TradeGothicLTStd.woff2": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/TradeGothicLTStd.woff2", - "oF": 0 - }, - "/fonts/TradeGothicNextSRPro-Hv.woff": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/TradeGothicNextSRPro-Hv.woff", - "oF": 0 - }, - "/fonts/TradeGothicNextSRPro-Hv.woff2": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/fonts/TradeGothicNextSRPro-Hv.woff2", - "oF": 0 - }, - "/footer.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/footer.php", - "oF": 0 - }, - "/functions.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/functions.php", - "oF": 0 - }, - "/functions/guthenberg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/functions/guthenberg.php", - "oF": 0 - }, - "/header.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/header.php", - "oF": 0 - }, - "/img/includes/bij1_default.png": { - "ft": 32768, - "iS": 10951, - "oA": 0, - "oAP": "/img/includes/bij1_default.png", - "oF": 0, - "oIPL": 0, - "opt": 0, - "oT": 1, - "ou": "lpckwebp-none", - "q": 100, - "rq": 75 - }, - "/img/includes/brightness.svg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/img/includes/brightness.svg.php", - "oF": 0 - }, - "/img/includes/donatemobile.svg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/img/includes/donatemobile.svg.php", - "oF": 0 - }, - "/img/includes/language.svg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/img/includes/language.svg.php", - "oF": 0 - }, - "/img/includes/logo.svg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/img/includes/logo.svg.php", - "oF": 0 - }, - "/img/includes/menu.svg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/img/includes/menu.svg.php", - "oF": 0 - }, - "/img/includes/search.svg.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/img/includes/search.svg.php", - "oF": 0 - }, - "/index.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/index.php", - "oF": 0 - }, - "/js/app-min.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/app-min-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/js/app-min.js.map": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/js/app-min.js.map", - "oF": 0 - }, - "/js/app.js": { - "bF": 0, - "ft": 64, - "ma": 1, - "mi": 1, - "oA": 0, - "oAP": "/js/app-min.js", - "oF": 0, - "sC": 3, - "tS": 1 - }, - "/js/flickity.pkgd.min.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/flickity.pkgd.min-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/js/foundation.min.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/foundation.min-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/js/fundtemp.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/fundtemp-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/js/jquery.min.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/jquery.min-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/js/motion-ui.min.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/motion-ui.min-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/js/what-input.min.js": { - "bF": 0, - "ft": 64, - "ma": 0, - "mi": 1, - "oA": 0, - "oAP": "/js/what-input.min-min.js", - "oF": 0, - "sC": 3, - "tS": 0 - }, - "/loadmore.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/loadmore.php", - "oF": 0 - }, - "/package-lock.json": { - "ft": 524288, - "oA": 1, - "oAP": "/package-lock-min.json", - "oF": 0, - "oO": 0, - "oS": 1 - }, - "/package.json": { - "ft": 524288, - "oA": 1, - "oAP": "/package-min.json", - "oF": 0, - "oO": 0, - "oS": 1 - }, - "/page.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/page.php", - "oF": 0 - }, - "/parts/_cover.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 1, - "oAP": "/parts/_cover.php", - "oF": 0 - }, - "/parts/_doneerformulier.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 1, - "oAP": "/parts/_doneerformulier.php", - "oF": 0 - }, - "/parts/_mailformulier.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 1, - "oAP": "/parts/_mailformulier.php", - "oF": 0 - }, - "/parts/_nieuwsitem.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 1, - "oAP": "/parts/_nieuwsitem.php", - "oF": 0 - }, - "/parts/blocks/afdelingen_items.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/afdelingen_items.php", - "oF": 0 - }, - "/parts/blocks/collectiekaart.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/collectiekaart.php", - "oF": 0 - }, - "/parts/blocks/cta.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/cta.php", - "oF": 0 - }, - "/parts/blocks/cta_blocks.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/cta_blocks.php", - "oF": 0 - }, - "/parts/blocks/faq.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/faq.php", - "oF": 0 - }, - "/parts/blocks/insight.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/insight.php", - "oF": 0 - }, - "/parts/blocks/kandidaten.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/kandidaten.php", - "oF": 0 - }, - "/parts/blocks/nieuws_items.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/nieuws_items.php", - "oF": 0 - }, - "/parts/blocks/programma_items.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/programma_items.php", - "oF": 0 - }, - "/parts/blocks/readmore.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/readmore.php", - "oF": 0 - }, - "/parts/blocks/tekst.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/parts/blocks/tekst.php", - "oF": 0 - }, - "/prepros.config": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/prepros.config", - "oF": 0 - }, - "/screenshot.png": { - "ft": 32768, - "iS": 21594, - "oA": 0, - "oAP": "/screenshot.png", - "oF": 0, - "oIPL": 0, - "opt": 0, - "oT": 1, - "ou": "lpckwebp-none", - "q": 100, - "rq": 75 - }, - "/scss/_settings.scss": { - "aP": 0, - "bl": 0, - "dP": 10, - "ec": 1, - "ft": 4, - "ma": 0, - "oA": 1, - "oAP": "/scss/_settings.css", - "oF": 0, - "oS": 0, - "sct": 0 - }, - "/scss/app.css": { - "aP": 1, - "bl": 0, - "ft": 16, - "ma": 0, - "oA": 0, - "oAP": "/scss/app-min.css", - "oF": 0, - "oS": 3 - }, - "/scss/app.scss": { - "aP": 0, - "bl": 0, - "dP": 10, - "ec": 1, - "ft": 4, - "ma": 0, - "oA": 0, - "oAP": "/css/app.css", - "oF": 2, - "oS": 0, - "sct": 0 - }, - "/scss/flickity.min-min.css": { - "aP": 1, - "bl": 0, - "ft": 16, - "ma": 0, - "oA": 0, - "oAP": "/scss/flickity.min-min-min.css", - "oF": 0, - "oS": 3 - }, - "/scss/flickity.min.css": { - "aP": 1, - "bl": 0, - "ft": 16, - "ma": 0, - "oA": 0, - "oAP": "/scss/flickity.min-min.css", - "oF": 0, - "oS": 3 - }, - "/search.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/search.php", - "oF": 0 - }, - "/single.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/single.php", - "oF": 0 - }, - "/style.css": { - "aP": 1, - "bl": 0, - "ft": 16, - "ma": 0, - "oA": 0, - "oAP": "/style-min.css", - "oF": 0, - "oS": 3 - }, - "/Vacatures.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/Vacatures.php", - "oF": 0 - }, - "/Veelgesteldevragen.php": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/Veelgesteldevragen.php", - "oF": 0 - }, - "/yarn.lock": { - "cB": 0, - "ft": 8192, - "hM": 0, - "oA": 0, - "oAP": "/yarn.lock", - "oF": 0 - } - }, -"hooks": [ - ], -"manualImportLinks": { - }, -"projectAttributes": { - "creationDate": 613044097.90951097, - "displayValue": "BIJ1", - "displayValueWasSetByUser": 0, - "iconImageName": "brackets-ucla", - "iconImageWasSetByUser": 0, - "lastBuiltDate": 613044142.30960095 - }, -"projectSettings": { - "abortBuildOnError": 1, - "allowInjectionReloads": 1, - "alwaysUseExternalServer": 1, - "animateCSSInjections": 1, - "autoBuildNewItems": 1, - "autoprefixerEnableIEGrid": 0, - "babel7PresetType": 1, - "babelAllowRCFiles": 0, - "babelAuxiliaryCommentAfter": "", - "babelAuxiliaryCommentBefore": "", - "babelConfigType": 0, - "babelCustomPluginsList": "", - "babelCustomPresetsList": "", - "babelExcludeString": "/\\/node_modules\\//, /\\/core-js\\//, /\\/bower_components\\//", - "babelInsertModuleIDs": 0, - "babelModuleID": "", - "babelNoComments": 0, - "babelPlugins": { - "arrow-functions": { - "active": 0 - }, - "async-generator-functions": { - "active": 0 - }, - "async-to-generator": { - "active": 0 - }, - "block-scoped-functions": { - "active": 0 - }, - "block-scoping": { - "active": 0 - }, - "class-properties": { - "active": 0 - }, - "classes": { - "active": 0 - }, - "computed-properties": { - "active": 0 - }, - "decorators": { - "active": 0 - }, - "destructuring": { - "active": 0 - }, - "do-expressions": { - "active": 0 - }, - "dotall-regex": { - "active": 0 - }, - "duplicate-keys": { - "active": 0 - }, - "exponentiation-operator": { - "active": 0 - }, - "export-default-from": { - "active": 0 - }, - "export-namespace-from": { - "active": 0 - }, - "external-helpers": { - "active": 0 - }, - "flow-strip-types": { - "active": 0 - }, - "for-of": { - "active": 0 - }, - "function-bind": { - "active": 0 - }, - "function-name": { - "active": 0 - }, - "function-sent": { - "active": 0 - }, - "inline-consecutive-adds": { - "active": 0 - }, - "inline-environment-variables": { - "active": 0 - }, - "instanceof": { - "active": 0 - }, - "jscript": { - "active": 0 - }, - "literals": { - "active": 0 - }, - "logical-assignment-operators": { - "active": 0 - }, - "member-expression-literals": { - "active": 0 - }, - "merge-sibling-variables": { - "active": 0 - }, - "minify-booleans": { - "active": 0 - }, - "minify-builtins": { - "active": 0 - }, - "minify-constant-folding": { - "active": 0 - }, - "minify-dead-code-elimination": { - "active": 0 - }, - "minify-flip-comparisons": { - "active": 0 - }, - "minify-guarded-expressions": { - "active": 0 - }, - "minify-infinity": { - "active": 0 - }, - "minify-mangle-names": { - "active": 0 - }, - "minify-numeric-literals": { - "active": 0 - }, - "minify-simplify": { - "active": 0 - }, - "minify-type-constructors": { - "active": 0 - }, - "modules-amd": { - "active": 0 - }, - "modules-commonjs": { - "active": 0 - }, - "modules-systemjs": { - "active": 0 - }, - "modules-umd": { - "active": 0 - }, - "named-capturing-groups-regex": { - "active": 0 - }, - "new-target": { - "active": 0 - }, - "node-env-inline": { - "active": 0 - }, - "nullish-coalescing-operator": { - "active": 0 - }, - "numeric-separator": { - "active": 0 - }, - "object-assign": { - "active": 0 - }, - "object-rest-spread": { - "active": 0 - }, - "object-set-prototype-of-to-assign": { - "active": 0 - }, - "object-super": { - "active": 0 - }, - "optional-catch-binding": { - "active": 0 - }, - "optional-chaining": { - "active": 0 - }, - "parameters": { - "active": 0 - }, - "partial-application": { - "active": 0 - }, - "pipeline-operator": { - "active": 0 - }, - "private-methods": { - "active": 0 - }, - "property-literals": { - "active": 0 - }, - "property-mutators": { - "active": 0 - }, - "proto-to-assign": { - "active": 0 - }, - "react-constant-elements": { - "active": 0 - }, - "react-display-name": { - "active": 0 - }, - "react-inline-elements": { - "active": 0 - }, - "react-jsx": { - "active": 0 - }, - "react-jsx-compat": { - "active": 0 - }, - "react-jsx-self": { - "active": 0 - }, - "react-jsx-source": { - "active": 0 - }, - "regenerator": { - "active": 0 - }, - "regexp-constructors": { - "active": 0 - }, - "remove-console": { - "active": 0 - }, - "remove-debugger": { - "active": 0 - }, - "remove-undefined": { - "active": 0 - }, - "reserved-words": { - "active": 0 - }, - "runtime": { - "active": 0 - }, - "shorthand-properties": { - "active": 0 - }, - "simplify-comparison-operators": { - "active": 0 - }, - "spread": { - "active": 0 - }, - "sticky-regex": { - "active": 0 - }, - "strict-mode": { - "active": 0 - }, - "template-literals": { - "active": 0 - }, - "throw-expressions": { - "active": 0 - }, - "typeof-symbol": { - "active": 0 - }, - "undefined-to-void": { - "active": 0 - }, - "unicode-property-regex": { - "active": 0 - }, - "unicode-regex": { - "active": 0 - } - }, - "babelRetainLines": 0, - "babelUseBuiltInsType": 0, - "bowerAbbreviatedPath": "bower_components", - "bowerForceLatestOnConflict": 1, - "bowerTargetDependencyListType": 1, - "bowerUseExactVersion": 0, - "browserRefreshDelay": 0, - "browserslistString": ">0.2%, last 2 versions, Firefox ESR, not dead", - "buildFolderActive": 0, - "buildFolderName": "build", - "cleanBuild": 1, - "coffeeLintFlags2": { - "arrow_spacing": { - "active": 0, - "flagValue": -1 - }, - "camel_case_classes": { - "active": 1, - "flagValue": -1 - }, - "colon_assignment_spacing": { - "active": 0, - "flagValue": 1 - }, - "cyclomatic_complexity": { - "active": 0, - "flagValue": 10 - }, - "duplicate_key": { - "active": 1, - "flagValue": -1 - }, - "empty_constructor_needs_parens": { - "active": 0, - "flagValue": -1 - }, - "ensure_comprehensions": { - "active": 1, - "flagValue": -1 - }, - "indentation": { - "active": 1, - "flagValue": 2 - }, - "line_endings": { - "active": 0, - "flagValue": 0 - }, - "max_line_length": { - "active": 0, - "flagValue": 150 - }, - "missing_fat_arrows": { - "active": 0, - "flagValue": -1 - }, - "newlines_after_classes": { - "active": 0, - "flagValue": 3 - }, - "no_backticks": { - "active": 1, - "flagValue": -1 - }, - "no_debugger": { - "active": 1, - "flagValue": -1 - }, - "no_empty_functions": { - "active": 0, - "flagValue": -1 - }, - "no_empty_param_list": { - "active": 0, - "flagValue": -1 - }, - "no_implicit_braces": { - "active": 1, - "flagValue": -1 - }, - "no_implicit_parens": { - "active": 0, - "flagValue": -1 - }, - "no_interpolation_in_single_quotes": { - "active": 0, - "flagValue": -1 - }, - "no_nested_string_interpolation": { - "active": 1, - "flagValue": -1 - }, - "no_plusplus": { - "active": 0, - "flagValue": -1 - }, - "no_private_function_fat_arrows": { - "active": 1, - "flagValue": -1 - }, - "no_stand_alone_at": { - "active": 1, - "flagValue": -1 - }, - "no_tabs": { - "active": 1, - "flagValue": -1 - }, - "no_this": { - "active": 0, - "flagValue": -1 - }, - "no_throwing_strings": { - "active": 1, - "flagValue": -1 - }, - "no_trailing_semicolons": { - "active": 1, - "flagValue": -1 - }, - "no_trailing_whitespace": { - "active": 1, - "flagValue": -1 - }, - "no_unnecessary_double_quotes": { - "active": 0, - "flagValue": -1 - }, - "no_unnecessary_fat_arrows": { - "active": 1, - "flagValue": -1 - }, - "non_empty_constructor_needs_parens": { - "active": 0, - "flagValue": -1 - }, - "prefer_english_operator": { - "active": 0, - "flagValue": -1 - }, - "space_operators": { - "active": 0, - "flagValue": -1 - }, - "spacing_after_comma": { - "active": 1, - "flagValue": -1 - } - }, - "environmentVariablesString": "NODE_ENV:::production", - "esLintConfigFileHandlingType": 0, - "esLintECMAVersion": 7, - "esLintEnvironmentsMask": 1, - "esLintRules": { - "accessor-pairs": { - "active": 0, - "optionString": "{'setWithoutGet': true, 'getWithoutSet': false, 'enforceForClassMembers': true}" - }, - "array-bracket-newline": { - "active": 0, - "optionString": "{'multiline': true, 'minItems': null}" - }, - "array-bracket-spacing": { - "active": 0, - "optionString": "'never', {'singleValue': false, 'objectsInArrays': false, 'arraysInArrays': false}" - }, - "array-callback-return": { - "active": 0, - "optionString": "{'allowImplicit': false}" - }, - "array-element-newline": { - "active": 0, - "optionString": "'always'" - }, - "arrow-body-style": { - "active": 0, - "optionString": "'as-needed', {'requireReturnForObjectLiteral': false}" - }, - "arrow-parens": { - "active": 0, - "optionString": "'always'" - }, - "arrow-spacing": { - "active": 0, - "optionString": "{'before': true, 'after': true}" - }, - "block-scoped-var": { - "active": 0 - }, - "block-spacing": { - "active": 0, - "optionString": "'always'" - }, - "brace-style": { - "active": 0, - "optionString": "'1tbs', {'allowSingleLine': true}" - }, - "callback-return": { - "active": 0, - "optionString": "['callback', 'cb', 'next']" - }, - "camelcase": { - "active": 0, - "optionString": "{'properties': 'always', 'ignoreDestructuring': false, 'ignoreImports': false}" - }, - "capitalized-comments": { - "active": 0, - "optionString": "'always', {'ignoreInlineComments': false, 'ignoreConsecutiveComments': false}" - }, - "class-methods-use-this": { - "active": 0, - "optionString": "{'exceptMethods': []}" - }, - "comma-dangle": { - "active": 1, - "optionString": "'never'" - }, - "comma-spacing": { - "active": 0, - "optionString": "{'before': false, 'after': true}" - }, - "comma-style": { - "active": 0, - "optionString": "'last'" - }, - "complexity": { - "active": 0, - "optionString": "20" - }, - "computed-property-spacing": { - "active": 0, - "optionString": "'never', {'enforceForClassMembers': true}" - }, - "consistent-return": { - "active": 0, - "optionString": "{'treatUndefinedAsUnspecified': false}" - }, - "consistent-this": { - "active": 0, - "optionString": "'that'" - }, - "constructor-super": { - "active": 1 - }, - "curly": { - "active": 0, - "optionString": "'all'" - }, - "default-case": { - "active": 0 - }, - "default-case-last": { - "active": 0 - }, - "default-param-last": { - "active": 0 - }, - "dot-location": { - "active": 0, - "optionString": "'object'" - }, - "dot-notation": { - "active": 0, - "optionString": "{'allowKeywords': false}" - }, - "eol-last": { - "active": 0, - "optionString": "'always'" - }, - "eqeqeq": { - "active": 0, - "optionString": "'always', {'null': 'always'}" - }, - "for-direction": { - "active": 0 - }, - "func-call-spacing": { - "active": 0, - "optionString": "'never'" - }, - "func-name-matching": { - "active": 0, - "optionString": "'always', {'considerPropertyDescriptor': false, 'includeCommonJSModuleExports': false}" - }, - "func-names": { - "active": 0, - "optionString": "'always', {'generators': 'always'}" - }, - "func-style": { - "active": 0, - "optionString": "'expression'" - }, - "function-paren-newline": { - "active": 0, - "optionString": "'multiline'" - }, - "generator-star-spacing": { - "active": 0, - "optionString": "{'before': true, 'after': false}" - }, - "getter-return": { - "active": 0, - "optionString": "{'allowImplicit': false}" - }, - "global-require": { - "active": 0 - }, - "grouped-accessor-pairs": { - "active": 0, - "optionString": "'anyOrder'" - }, - "guard-for-in": { - "active": 0 - }, - "handle-callback-err": { - "active": 0, - "optionString": "'err'" - }, - "id-blacklist": { - "active": 0, - "optionString": "'data', 'err', 'e', 'cb', 'callback'" - }, - "id-length": { - "active": 0, - "optionString": "{'min': 2, 'max': 1000, 'properties': 'always', 'exceptions': ['x', 'i', 'y']}" - }, - "id-match": { - "active": 0, - "optionString": "'^[a-z]+([A-Z][a-z]+)*$', {'properties': false, 'onlyDeclarations': true, 'ignoreDestructuring': false}" - }, - "implicit-arrow-linebreak": { - "active": 0, - "optionString": "'beside'" - }, - "indent": { - "active": 0, - "optionString": "4, {'SwitchCase': 0, 'VariableDeclarator': 1, 'outerIIFEBody': 1 }" - }, - "init-declarations": { - "active": 0, - "optionString": "'always', {'ignoreForLoopInit': true}" - }, - "jsx-quotes": { - "active": 0, - "optionString": "'prefer-double'" - }, - "key-spacing": { - "active": 0, - "optionString": "{'singleLine': {'beforeColon': false, 'afterColon': true, 'mode':'strict'}, 'multiLine': {'beforeColon': false, 'afterColon': true, 'align': 'value', 'mode':'minimum'}}" - }, - "keyword-spacing": { - "active": 0, - "optionString": "{'before': true, 'after': true, 'overrides': {}}" - }, - "line-comment-position": { - "active": 0, - "optionString": "{'position': 'above'}" - }, - "linebreak-style": { - "active": 0, - "optionString": "'unix'" - }, - "lines-around-comment": { - "active": 0, - "optionString": "{'beforeBlockComment': true}" - }, - "lines-between-class-members": { - "active": 0, - "optionString": "'always', {exceptAfterSingleLine: false}" - }, - "max-classes-per-file": { - "active": 0, - "optionString": "1" - }, - "max-depth": { - "active": 0, - "optionString": "{'max': 4}" - }, - "max-len": { - "active": 0, - "optionString": "{'code': 80, 'comments': 80, 'tabWidth': 4, 'ignoreUrls': true, 'ignoreStrings': true, 'ignoreTemplateLiterals': true, 'ignoreRegExpLiterals': true}" - }, - "max-lines": { - "active": 0, - "optionString": "{'max': 300, 'skipBlankLines': true, 'skipComments': true}" - }, - "max-lines-per-function": { - "active": 0, - "optionString": "{'max': 50, 'skipBlankLines': true, 'skipComments': true, 'IIFEs': false}" - }, - "max-nested-callbacks": { - "active": 0, - "optionString": "{'max': 10}" - }, - "max-params": { - "active": 0, - "optionString": "{'max': 4}" - }, - "max-statements": { - "active": 0, - "optionString": "{'max': 10}, {'ignoreTopLevelFunctions': true}" - }, - "max-statements-per-line": { - "active": 0, - "optionString": "{'max': 1}" - }, - "multiline-comment-style": { - "active": 0, - "optionString": "'starred-block'" - }, - "multiline-ternary": { - "active": 0, - "optionString": "'always'" - }, - "new-cap": { - "active": 0, - "optionString": "{'newIsCap': true, 'capIsNew': true, 'newIsCapExceptions': [], 'capIsNewExceptions': ['Array', 'Boolean', 'Date', 'Error', 'Function', 'Number', 'Object', 'RegExp', 'String', 'Symbol'], 'properties': true}" - }, - "new-parens": { - "active": 0, - "optionString": "'always'" - }, - "newline-per-chained-call": { - "active": 0, - "optionString": "{'ignoreChainWithDepth': 2}" - }, - "no-alert": { - "active": 0 - }, - "no-array-constructor": { - "active": 0 - }, - "no-async-promise-executor": { - "active": 0 - }, - "no-await-in-loop": { - "active": 0 - }, - "no-bitwise": { - "active": 0, - "optionString": "{'allow': ['~'], 'int32Hint': true}" - }, - "no-buffer-constructor": { - "active": 0 - }, - "no-caller": { - "active": 0 - }, - "no-case-declarations": { - "active": 1 - }, - "no-class-assign": { - "active": 1 - }, - "no-compare-neg-zero": { - "active": 0 - }, - "no-cond-assign": { - "active": 1, - "optionString": "'except-parens'" - }, - "no-confusing-arrow": { - "active": 0, - "optionString": "{'allowParens': true}" - }, - "no-console": { - "active": 1, - "optionString": "{'allow': ['warn', 'error']}" - }, - "no-const-assign": { - "active": 1 - }, - "no-constant-condition": { - "active": 1, - "optionString": "{'checkLoops': true}" - }, - "no-constructor-return": { - "active": 0 - }, - "no-continue": { - "active": 0 - }, - "no-control-regex": { - "active": 1 - }, - "no-debugger": { - "active": 1 - }, - "no-delete-var": { - "active": 1 - }, - "no-div-regex": { - "active": 0 - }, - "no-dupe-args": { - "active": 1 - }, - "no-dupe-class-members": { - "active": 1 - }, - "no-dupe-else-if": { - "active": 1 - }, - "no-dupe-keys": { - "active": 1 - }, - "no-duplicate-imports": { - "active": 0, - "optionString": "{'includeExports': false}" - }, - "no-else-return": { - "active": 0 - }, - "no-empty": { - "active": 1, - "optionString": "{'allowEmptyCatch': false}" - }, - "no-empty-character-class": { - "active": 1 - }, - "no-empty-function": { - "active": 0, - "optionString": "{'allow': []}" - }, - "no-empty-pattern": { - "active": 1 - }, - "no-eq-null": { - "active": 0 - }, - "no-eval": { - "active": 0, - "optionString": "{'allowIndirect': false}" - }, - "no-ex-assign": { - "active": 1 - }, - "no-extend-native": { - "active": 0, - "optionString": "{'exceptions': []}" - }, - "no-extra-bind": { - "active": 0 - }, - "no-extra-boolean-cast": { - "active": 1 - }, - "no-extra-labels": { - "active": 0 - }, - "no-extra-parens": { - "active": 0, - "optionString": "'all', {'conditionalAssign': false, 'returnAssign': false, 'nestedBinaryExpressions': false, 'ignoreJSX': 'none', 'enforceForArrowConditionals': false, 'enforceForSequenceExpressions': false, 'enforceForNewInMemberExpressions': false}" - }, - "no-extra-semi": { - "active": 1 - }, - "no-fallthrough": { - "active": 1 - }, - "no-floating-decimal": { - "active": 0 - }, - "no-func-assign": { - "active": 1 - }, - "no-global-assign": { - "active": 1, - "optionString": "{'exceptions': []}" - }, - "no-implicit-coercion": { - "active": 0, - "optionString": "{'boolean': true, 'number': true, 'string': true, 'allow': []}" - }, - "no-implicit-globals": { - "active": 0 - }, - "no-implied-eval": { - "active": 0 - }, - "no-import-assign": { - "active": 1 - }, - "no-inline-comments": { - "active": 0 - }, - "no-inner-declarations": { - "active": 1, - "optionString": "'functions'" - }, - "no-invalid-regexp": { - "active": 1, - "optionString": "{'allowConstructorFlags': ['u', 'y']}" - }, - "no-invalid-this": { - "active": 0, - "optionString": "{'capIsConstructor': true}" - }, - "no-irregular-whitespace": { - "active": 1, - "optionString": "{'skipStrings': true, 'skipComments': false, 'skipRegExps': true, 'skipTemplates': true}" - }, - "no-iterator": { - "active": 0 - }, - "no-label-var": { - "active": 0 - }, - "no-labels": { - "active": 0, - "optionString": "{'allowLoop': false, 'allowSwitch': false}" - }, - "no-lone-blocks": { - "active": 0 - }, - "no-lonely-if": { - "active": 0 - }, - "no-loop-func": { - "active": 0 - }, - "no-loss-of-precision": { - "active": 0 - }, - "no-magic-numbers": { - "active": 0, - "optionString": "{'ignore': [], 'ignoreArrayIndexes': true, 'enforceConst': false, 'detectObjects': false}" - }, - "no-misleading-character-class": { - "active": 0 - }, - "no-mixed-operators": { - "active": 0, - "optionString": "{'groups': [['+', '-', '*', '/', '%', '**'], ['&', '|', '^', '~', '<<', '>>', '>>>'], ['==', '!=', '===', '!==', '>', '>=', '<', '<='], ['&&', '||'], ['in', 'instanceof']], 'allowSamePrecedence': true}" - }, - "no-mixed-requires": { - "active": 0, - "optionString": "{'grouping': false, 'allowCall': false }" - }, - "no-mixed-spaces-and-tabs": { - "active": 0, - "optionString": "" - }, - "no-multi-assign": { - "active": 0 - }, - "no-multi-spaces": { - "active": 0, - "optionString": "{'exceptions': {'Property': true, 'BinaryExpression': false, 'VariableDeclarator': false, 'ImportDeclaration': false}}" - }, - "no-multi-str": { - "active": 0 - }, - "no-multiple-empty-lines": { - "active": 0, - "optionString": "{'max': 2, 'maxBOF': 2, 'maxEOF': 2}" - }, - "no-negated-condition": { - "active": 0 - }, - "no-nested-ternary": { - "active": 0 - }, - "no-new": { - "active": 0 - }, - "no-new-func": { - "active": 0 - }, - "no-new-object": { - "active": 0 - }, - "no-new-require": { - "active": 0 - }, - "no-new-symbol": { - "active": 1 - }, - "no-new-wrappers": { - "active": 0 - }, - "no-obj-calls": { - "active": 1 - }, - "no-octal": { - "active": 1 - }, - "no-octal-escape": { - "active": 0 - }, - "no-param-reassign": { - "active": 0, - "optionString": "{'props': false}" - }, - "no-path-concat": { - "active": 0 - }, - "no-plusplus": { - "active": 0, - "optionString": "{'allowForLoopAfterthoughts': false}" - }, - "no-process-env": { - "active": 0 - }, - "no-process-exit": { - "active": 0 - }, - "no-promise-executor-return": { - "active": 0 - }, - "no-proto": { - "active": 0 - }, - "no-prototype-builtins": { - "active": 0 - }, - "no-redeclare": { - "active": 1, - "optionString": "{'builtinGlobals': false}" - }, - "no-regex-spaces": { - "active": 1 - }, - "no-restricted-exports": { - "active": 0, - "optionString": "{'restrictedNamedExports': []}" - }, - "no-restricted-globals": { - "active": 0, - "optionString": "'event', 'fdescribe'" - }, - "no-restricted-imports": { - "active": 0 - }, - "no-restricted-modules": { - "active": 0, - "optionString": "" - }, - "no-restricted-properties": { - "active": 0, - "optionString": "[{'object': 'disallowedObjectName', 'property': 'disallowedPropertyName'}, {'object': 'disallowedObjectName', 'property': 'anotherDisallowedPropertyName', 'message': 'Please use allowedObjectName.allowedPropertyName.'}]" - }, - "no-restricted-syntax": { - "active": 0, - "optionString": "'FunctionExpression', 'WithStatement'" - }, - "no-return-assign": { - "active": 0, - "optionString": "'except-parens'" - }, - "no-return-await": { - "active": 0 - }, - "no-script-url": { - "active": 0 - }, - "no-self-assign": { - "active": 1, - "optionString": "{'props': true}" - }, - "no-self-compare": { - "active": 0 - }, - "no-sequences": { - "active": 0 - }, - "no-setter-return": { - "active": 1 - }, - "no-shadow": { - "active": 0, - "optionString": "{'builtinGlobals': false, 'hoist': 'functions', 'allow': []}" - }, - "no-shadow-restricted-names": { - "active": 0 - }, - "no-sparse-arrays": { - "active": 1 - }, - "no-sync": { - "active": 0, - "optionString": "{'allowAtRootLevel': false}" - }, - "no-tabs": { - "active": 0, - "optionString": "{allowIndentationTabs: false}" - }, - "no-template-curly-in-string": { - "active": 0 - }, - "no-ternary": { - "active": 0 - }, - "no-this-before-super": { - "active": 1 - }, - "no-throw-literal": { - "active": 0 - }, - "no-trailing-spaces": { - "active": 0, - "optionString": "{'skipBlankLines': false, 'ignoreComments': false}" - }, - "no-undef": { - "active": 1, - "optionString": "{'typeof': false}" - }, - "no-undef-init": { - "active": 0 - }, - "no-undefined": { - "active": 0 - }, - "no-underscore-dangle": { - "active": 0, - "optionString": "{'allow': [], 'allowAfterThis': false, 'allowAfterSuper': false, 'allowAfterThisConstructor': false, 'enforceInMethodNames': false}" - }, - "no-unexpected-multiline": { - "active": 1 - }, - "no-unmodified-loop-condition": { - "active": 0 - }, - "no-unneeded-ternary": { - "active": 0, - "optionString": "{'defaultAssignment': true}" - }, - "no-unreachable": { - "active": 1 - }, - "no-unreachable-loop": { - "active": 0, - "optionString": "{'ignore': []}" - }, - "no-unsafe-finally": { - "active": 1 - }, - "no-unsafe-negation": { - "active": 1, - "optionString": "{'enforceForOrderingRelations': false}" - }, - "no-unused-expressions": { - "active": 0, - "optionString": "{'allowShortCircuit': false, 'allowTernary': false, 'allowTaggedTemplates': false}" - }, - "no-unused-labels": { - "active": 1 - }, - "no-unused-vars": { - "active": 1, - "optionString": "{'vars': 'all', 'args': 'after-used', 'caughtErrors': 'none', 'ignoreRestSiblings': false}" - }, - "no-use-before-define": { - "active": 0, - "optionString": "{'functions': true, 'classes': true, 'variables': true}" - }, - "no-useless-backreference": { - "active": 0 - }, - "no-useless-call": { - "active": 0 - }, - "no-useless-catch": { - "active": 0 - }, - "no-useless-computed-key": { - "active": 0, - "optionString": "{'enforceForClassMembers': false}" - }, - "no-useless-concat": { - "active": 0 - }, - "no-useless-constructor": { - "active": 0 - }, - "no-useless-escape": { - "active": 0 - }, - "no-useless-rename": { - "active": 0, - "optionString": "{'ignoreDestructuring': false, 'ignoreImport': false, 'ignoreExport': false}" - }, - "no-useless-return": { - "active": 0 - }, - "no-var": { - "active": 0 - }, - "no-void": { - "active": 0, - "optionString": "{'allowAsStatement': false}" - }, - "no-warning-comments": { - "active": 0, - "optionString": "{'terms': ['todo', 'fixme', 'xxx'], 'location': 'start'}" - }, - "no-whitespace-before-property": { - "active": 0 - }, - "no-with": { - "active": 0 - }, - "nonblock-statement-body-position": { - "active": 0, - "optionString": "'beside'" - }, - "object-curly-newline": { - "active": 0, - "optionString": "{'ObjectExpression': {'multiline': true, 'consistent': true}, 'ObjectPattern': {'multiline': true, 'consistent': true}}" - }, - "object-curly-spacing": { - "active": 0, - "optionString": "'never'" - }, - "object-property-newline": { - "active": 0, - "optionString": "{'allowAllPropertiesOnSameLine': true}" - }, - "object-shorthand": { - "active": 0, - "optionString": "'always', {'avoidQuotes': false, 'ignoreConstructors': false}" - }, - "one-var": { - "active": 0, - "optionString": "'always'" - }, - "one-var-declaration-per-line": { - "active": 0, - "optionString": "'always'" - }, - "operator-assignment": { - "active": 0, - "optionString": "'always'" - }, - "operator-linebreak": { - "active": 0, - "optionString": "'after', {'overrides': {'?': 'after', '+=': 'none'}}" - }, - "padded-blocks": { - "active": 0, - "optionString": "{'blocks': 'always', 'switches': 'always', 'classes': 'always'}" - }, - "padding-line-between-statements": { - "active": 0, - "optionString": "{blankLine: 'always', prev:'*', next:'return'}" - }, - "prefer-arrow-callback": { - "active": 0 - }, - "prefer-const": { - "active": 0, - "optionString": "{'destructuring': 'any', 'ignoreReadBeforeAssign': false}" - }, - "prefer-destructuring": { - "active": 0, - "optionString": "{'array': true, 'object': true}, {'enforceForRenamedProperties': false}" - }, - "prefer-exponentiation-operator": { - "active": 0 - }, - "prefer-named-capture-group": { - "active": 0 - }, - "prefer-numeric-literals": { - "active": 0 - }, - "prefer-object-spread": { - "active": 0 - }, - "prefer-promise-reject-errors": { - "active": 0, - "optionString": "{'allowEmptyReject': false}" - }, - "prefer-regex-literals": { - "active": 0 - }, - "prefer-rest-params": { - "active": 0 - }, - "prefer-spread": { - "active": 0 - }, - "prefer-template": { - "active": 0 - }, - "quote-props": { - "active": 0, - "optionString": "'always'" - }, - "quotes": { - "active": 0, - "optionString": "'double', {'avoidEscape': true, 'allowTemplateLiterals': true}" - }, - "radix": { - "active": 0, - "optionString": "'always'" - }, - "require-atomic-updates": { - "active": 0 - }, - "require-await": { - "active": 0 - }, - "require-jsdoc": { - "active": 0, - "optionString": "{'require': {'FunctionDeclaration': true, 'MethodDefinition': false, 'ClassDeclaration': false, 'ArrowFunctionExpression': false}}" - }, - "require-unicode-regexp": { - "active": 0 - }, - "require-yield": { - "active": 1 - }, - "rest-spread-spacing": { - "active": 0, - "optionString": "'never'" - }, - "semi": { - "active": 0, - "optionString": "'always', {'omitLastInOneLineBlock': false}" - }, - "semi-spacing": { - "active": 0, - "optionString": "{'before': false, 'after': true}" - }, - "semi-style": { - "active": 0, - "optionString": "'last'" - }, - "sort-imports": { - "active": 0, - "optionString": "{'ignoreCase': false, 'ignoreMemberSort': true, 'memberSyntaxSortOrder': ['none', 'all', 'multiple', 'single']}" - }, - "sort-keys": { - "active": 0, - "optionString": "'asc', {'caseSensitive': true, 'natural': false, 'minKeys': 2}" - }, - "sort-vars": { - "active": 0, - "optionString": "{'ignoreCase': false}" - }, - "space-before-blocks": { - "active": 0, - "optionString": "{'functions': 'always', 'keywords': 'always', 'classes': 'always'}" - }, - "space-before-function-paren": { - "active": 0, - "optionString": "{'anonymous': 'always', 'named': 'never'}" - }, - "space-in-parens": { - "active": 0, - "optionString": "'never', {'exceptions': []}" - }, - "space-infix-ops": { - "active": 0, - "optionString": "{'int32Hint': false}" - }, - "space-unary-ops": { - "active": 0, - "optionString": "{'words': true, 'nonwords': false, 'overrides': {}}" - }, - "spaced-comment": { - "active": 0, - "optionString": "'always', {'line': {'markers': ['/'], 'exceptions': ['-', '+']}, 'block': {'markers': ['!'], 'exceptions': ['*'], 'balanced': false}}" - }, - "strict": { - "active": 0, - "optionString": "'safe'" - }, - "switch-colon-spacing": { - "active": 0, - "optionString": "{'after': true, 'before': false}" - }, - "symbol-description": { - "active": 0 - }, - "template-curly-spacing": { - "active": 0, - "optionString": "'never'" - }, - "template-tag-spacing": { - "active": 0, - "optionString": "'never'" - }, - "unicode-bom": { - "active": 0, - "optionString": "'never'" - }, - "use-isnan": { - "active": 1, - "optionString": "{'enforceForSwitchCase': true, 'enforceForIndexOf': false}" - }, - "valid-jsdoc": { - "active": 0, - "optionString": "{'prefer': {'return': 'returns'}, 'requireReturn': true, 'requireReturnDescription': true, 'requireReturnType': true, 'requireParamDescription': true}" - }, - "valid-typeof": { - "active": 1, - "optionString": "{'requireStringLiterals': true}" - }, - "vars-on-top": { - "active": 0 - }, - "wrap-iife": { - "active": 0, - "optionString": "'outside'" - }, - "wrap-regex": { - "active": 0 - }, - "yield-star-spacing": { - "active": 0, - "optionString": "{'before': false, 'after': true}" - }, - "yoda": { - "active": 0, - "optionString": "'never', {'exceptRange': false, 'onlyEquality': false}" - } - }, - "esLintSourceType": 0, - "externalServerAddress": "http://n8w8.local", - "gitIgnoreBuildFolder": 1, - "hideConfigFile": 0, - "jsCheckerReservedNamesString": "$", - "jsHintFlags2": { - "asi": { - "active": 0, - "flagValue": -1 - }, - "bitwise": { - "active": 1, - "flagValue": -1 - }, - "boss": { - "active": 0, - "flagValue": -1 - }, - "browser": { - "active": 1, - "flagValue": -1 - }, - "browserify": { - "active": 0, - "flagValue": -1 - }, - "camelcase": { - "active": 0, - "flagValue": -1 - }, - "couch": { - "active": 0, - "flagValue": -1 - }, - "curly": { - "active": 1, - "flagValue": -1 - }, - "debug": { - "active": 0, - "flagValue": -1 - }, - "devel": { - "active": 0, - "flagValue": -1 - }, - "dojo": { - "active": 0, - "flagValue": -1 - }, - "elision": { - "active": 1, - "flagValue": -1 - }, - "eqeqeq": { - "active": 1, - "flagValue": -1 - }, - "eqnull": { - "active": 0, - "flagValue": -1 - }, - "es3": { - "active": 0, - "flagValue": -1 - }, - "esnext": { - "active": 0, - "flagValue": -1 - }, - "evil": { - "active": 0, - "flagValue": -1 - }, - "expr": { - "active": 0, - "flagValue": -1 - }, - "forin": { - "active": 0, - "flagValue": -1 - }, - "freeze": { - "active": 1, - "flagValue": -1 - }, - "funcscope": { - "active": 0, - "flagValue": -1 - }, - "futurehostile": { - "active": 0, - "flagValue": -1 - }, - "globalstrict": { - "active": 0, - "flagValue": -1 - }, - "immed": { - "active": 0, - "flagValue": -1 - }, - "indent": { - "active": 0, - "flagValue": 4 - }, - "iterator": { - "active": 0, - "flagValue": -1 - }, - "jasmine": { - "active": 0, - "flagValue": -1 - }, - "jquery": { - "active": 1, - "flagValue": -1 - }, - "lastsemic": { - "active": 0, - "flagValue": -1 - }, - "latedef": { - "active": 1, - "flagValue": -1 - }, - "laxbreak": { - "active": 0, - "flagValue": -1 - }, - "laxcomma": { - "active": 0, - "flagValue": -1 - }, - "loopfunc": { - "active": 0, - "flagValue": -1 - }, - "maxcomplexity": { - "active": 0, - "flagValue": 10 - }, - "maxdepth": { - "active": 0, - "flagValue": 3 - }, - "maxlen": { - "active": 0, - "flagValue": 150 - }, - "maxparams": { - "active": 0, - "flagValue": 3 - }, - "maxstatements": { - "active": 0, - "flagValue": 4 - }, - "mocha": { - "active": 0, - "flagValue": -1 - }, - "mootools": { - "active": 0, - "flagValue": -1 - }, - "moz": { - "active": 0, - "flagValue": -1 - }, - "multistr": { - "active": 0, - "flagValue": -1 - }, - "newcap": { - "active": 1, - "flagValue": -1 - }, - "noarg": { - "active": 1, - "flagValue": -1 - }, - "nocomma": { - "active": 0, - "flagValue": -1 - }, - "node": { - "active": 0, - "flagValue": -1 - }, - "noempty": { - "active": 0, - "flagValue": -1 - }, - "nonbsp": { - "active": 0, - "flagValue": -1 - }, - "nonew": { - "active": 1, - "flagValue": -1 - }, - "nonstandard": { - "active": 0, - "flagValue": -1 - }, - "notypeof": { - "active": 1, - "flagValue": -1 - }, - "noyield": { - "active": 0, - "flagValue": -1 - }, - "onecase": { - "active": 0, - "flagValue": -1 - }, - "phantom": { - "active": 0, - "flagValue": -1 - }, - "plusplus": { - "active": 0, - "flagValue": -1 - }, - "proto": { - "active": 0, - "flagValue": -1 - }, - "prototypejs": { - "active": 0, - "flagValue": -1 - }, - "qunit": { - "active": 0, - "flagValue": -1 - }, - "regexp": { - "active": 1, - "flagValue": -1 - }, - "rhino": { - "active": 0, - "flagValue": -1 - }, - "scripturl": { - "active": 0, - "flagValue": -1 - }, - "shadow": { - "active": 0, - "flagValue": -1 - }, - "shelljs": { - "active": 0, - "flagValue": -1 - }, - "singleGroups": { - "active": 0, - "flagValue": -1 - }, - "strict": { - "active": 0, - "flagValue": -1 - }, - "sub": { - "active": 0, - "flagValue": -1 - }, - "supernew": { - "active": 0, - "flagValue": -1 - }, - "typed": { - "active": 0, - "flagValue": -1 - }, - "undef": { - "active": 1, - "flagValue": -1 - }, - "unused": { - "active": 1, - "flagValue": -1 - }, - "varstmt": { - "active": 0, - "flagValue": -1 - }, - "withstmt": { - "active": 0, - "flagValue": -1 - }, - "worker": { - "active": 0, - "flagValue": -1 - }, - "wsh": { - "active": 0, - "flagValue": -1 - }, - "yui": { - "active": 0, - "flagValue": -1 - } - }, - "jsLintFlags2": { - "bitwise": { - "active": 0, - "flagValue": -1 - }, - "browser": { - "active": 1, - "flagValue": -1 - }, - "couch": { - "active": 0, - "flagValue": -1 - }, - "devel": { - "active": 0, - "flagValue": -1 - }, - "es6": { - "active": 0, - "flagValue": -1 - }, - "eval": { - "active": 0, - "flagValue": -1 - }, - "for": { - "active": 0, - "flagValue": -1 - }, - "maxlen": { - "active": 0, - "flagValue": 150 - }, - "node": { - "active": 0, - "flagValue": -1 - }, - "this": { - "active": 0, - "flagValue": -1 - }, - "white": { - "active": 0, - "flagValue": -1 - } - }, - "languageDefaultsCOFFEE": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.js", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "createSourceMap": 0, - "minifyOutput": 1, - "outputStyle": 0, - "syntaxCheckerStyle": 1, - "transpilerStyle": 1 - }, - "languageDefaultsCSS": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*-min.css", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "createSourceMap": 0, - "outputStyle": 3, - "shouldRunAutoprefixer": 1, - "shouldRunBless": 0 - }, - "languageDefaultsGIF": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.gif", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "webpOptimizationPresetUUID": "lpckwebp-none", - "webpRGBQuality": 75 - }, - "languageDefaultsHAML": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.html", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "escapeHTMLCharacters": 0, - "noEscapeInAttributes": 0, - "outputFormat": 2, - "shouldRunCacheBuster": 0, - "shouldRunHTMLMinifier": 0, - "useCDATA": 0, - "useDoubleQuotes": 0, - "useUnixNewlines": 0 - }, - "languageDefaultsJPG": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.jpg", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "outputFormat": 0, - "quality": 100, - "webpOptimizationPresetUUID": "lpckwebp-none", - "webpRGBQuality": 75 - }, - "languageDefaultsJS": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*-min.js", - "autoOutputPathRelativePath": "/min", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "bundleFormat": 0, - "createSourceMap": 0, - "minifyOutput": 1, - "syntaxCheckerStyle": 3, - "transpilerStyle": 0 - }, - "languageDefaultsJSON": { - "autoOutputAction": 1, - "autoOutputPathFilenamePattern": "*-min.json", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "orderOutput": 0, - "outputStyle": 1 - }, - "languageDefaultsKIT": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.html", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "kit", - "autoOutputPathReplace2": "html", - "autoOutputPathStyle": 0, - "shouldRunCacheBuster": 0, - "shouldRunHTMLMinifier": 0 - }, - "languageDefaultsLESS": { - "allowInsecureImports": 0, - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.css", - "autoOutputPathRelativePath": "../css", - "autoOutputPathReplace1": "less", - "autoOutputPathReplace2": "css", - "autoOutputPathStyle": 0, - "createSourceMap": 1, - "enableJavascript": 0, - "mathStyle": 0, - "outputStyle": 0, - "rewriteURLStyle": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictUnits": 0 - }, - "languageDefaultsMARKDOWN": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.html", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "criticStyle": 0, - "enableFootnotes": 1, - "enableLabels": 1, - "enableSmartQuotes": 1, - "maskEmailAddresses": 1, - "outputFormat": 0, - "outputStyle": 0, - "parseMetadata": 1, - "processHTML": 0, - "randomFootnoteNumbers": 0, - "shouldRunCacheBuster": 0, - "shouldRunHTMLMinifier": 0, - "useCompatibilityMode": 0 - }, - "languageDefaultsOTHER": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.*", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "shouldRunCacheBuster": 0, - "shouldRunHTMLMinifier": 0 - }, - "languageDefaultsPNG": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.png", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "optimizerType": 1, - "quality": 100, - "webpOptimizationPresetUUID": "lpckwebp-none", - "webpRGBQuality": 75 - }, - "languageDefaultsPUG": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.html", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "compileDebug": 1, - "outputStyle": 0, - "shouldRunCacheBuster": 0, - "shouldRunHTMLMinifier": 0 - }, - "languageDefaultsSASS": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.css", - "autoOutputPathRelativePath": "../css", - "autoOutputPathReplace1": "sass", - "autoOutputPathReplace2": "css", - "autoOutputPathStyle": 0, - "compilerType": 0, - "createSourceMap": 0, - "decimalPrecision": 10, - "emitCharset": 1, - "outputStyle": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0 - }, - "languageDefaultsSLIM": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.html", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "compileOnly": 0, - "logicless": 0, - "outputFormat": 0, - "outputStyle": 1, - "railsCompatible": 0, - "shouldRunCacheBuster": 0, - "shouldRunHTMLMinifier": 0 - }, - "languageDefaultsSTYLUS": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.css", - "autoOutputPathRelativePath": "../css", - "autoOutputPathReplace1": "stylus", - "autoOutputPathReplace2": "css", - "autoOutputPathStyle": 0, - "createSourceMap": 0, - "debugStyle": 0, - "importCSS": 0, - "outputStyle": 0, - "resolveRelativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0 - }, - "languageDefaultsSVG": { - "autoOutputAction": 2, - "autoOutputPathFilenamePattern": "*.svg", - "autoOutputPathRelativePath": "", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "pluginMask": 52780316221407 - }, - "languageDefaultsTS": { - "autoOutputAction": 0, - "autoOutputPathFilenamePattern": "*.js", - "autoOutputPathRelativePath": "/js", - "autoOutputPathReplace1": "", - "autoOutputPathReplace2": "", - "autoOutputPathStyle": 0, - "createDeclarationFile": 0, - "createSourceMap": 0, - "minifyOutput": 0, - "moduleResolutionType": 0, - "moduleType": 2, - "removeComments": 0, - "targetECMAVersion": 0 - }, - "languageDefaultsUserDefined": [ - ], - "npmAbbreviatedPath": "", - "npmCreatePackageLock": 1, - "npmInstallOptionalDependencies": 0, - "npmSaveExactVersion": 0, - "npmTargetDependencyListType": 1, - "overrideExternalServerCSS": 0, - "previewPathAddition": "", - "rollupExternals": "", - "rollupReplacements": "process.env.NODE_ENV:::$NODE_ENV,,,ENVIRONMENT:::$NODE_ENV", - "rollupTreeshakingEnabled": 1, - "skippedFoldersString": "log, _logs, logs, _cache, cache, .idea, /storage/framework/sessions, node_modules", - "sourceFolderName": "source", - "susyVersion": 3, - "tsAllowSyntheticDefaultImports": 0, - "tsAllowUnreachableCode": 0, - "tsAllowUnusedLabels": 0, - "tsAlwaysStrict": 0, - "tsDownlevelIteration": 0, - "tsEmitBOM": 0, - "tsEmitDecoratorMetadata": 0, - "tsESModuleInterop": 0, - "tsForceConsistentCasingInFileNames": 0, - "tsImportHelpers": 0, - "tsIsolatedModules": 0, - "tsJSXFactory": "React.createElement", - "tsKeyofStringsOnly": 0, - "tsNoEmitHelpers": 0, - "tsNoFallthroughCasesInSwitch": 0, - "tsNoImplicitAny": 0, - "tsNoImplicitReturns": 0, - "tsNoImplicitThis": 0, - "tsNoImplicitUseStrict": 0, - "tsNoLib": 0, - "tsNoResolve": 0, - "tsNoStrictGenericChecks": 0, - "tsNoUnusedLocals": 0, - "tsNoUnusedParameters": 0, - "tsPreserveConstEnums": 0, - "tsPreserveSymlinks": 0, - "tsResolveJsonModule": 0, - "tsSkipLibCheck": 0, - "tsStrictFunctionTypes": 0, - "tsStrictNullChecks": 0, - "tsStrictPropertyInitialization": 0, - "tsStripInternal": 0, - "tsSuppressExcessPropertyErrors": 0, - "tsSuppressImplicitAnyIndexErrors": 0, - "uglifyDefinesString": "", - "uglifyFlags2": { - "arguments": { - "active": 1, - "flagValue": -1 - }, - "arrows": { - "active": 1, - "flagValue": -1 - }, - "ascii_only": { - "active": 0, - "flagValue": -1 - }, - "booleans": { - "active": 1, - "flagValue": -1 - }, - "booleans_as_integers": { - "active": 0, - "flagValue": -1 - }, - "braces": { - "active": 0, - "flagValue": -1 - }, - "collapse_vars": { - "active": 1, - "flagValue": -1 - }, - "comments": { - "active": 0, - "flagValue": -1 - }, - "comparisons": { - "active": 1, - "flagValue": -1 - }, - "computed_props": { - "active": 1, - "flagValue": -1 - }, - "conditionals": { - "active": 1, - "flagValue": -1 - }, - "dead_code": { - "active": 1, - "flagValue": -1 - }, - "directives": { - "active": 1, - "flagValue": -1 - }, - "drop_console": { - "active": 0, - "flagValue": -1 - }, - "drop_debugger": { - "active": 1, - "flagValue": -1 - }, - "ecma": { - "active": 1, - "flagValue": 5 - }, - "eval": { - "active": 0, - "flagValue": -1 - }, - "evaluate": { - "active": 1, - "flagValue": -1 - }, - "expression": { - "active": 0, - "flagValue": -1 - }, - "hoist_funs": { - "active": 0, - "flagValue": -1 - }, - "hoist_props": { - "active": 1, - "flagValue": -1 - }, - "hoist_vars": { - "active": 0, - "flagValue": -1 - }, - "ie8": { - "active": 0, - "flagValue": -1 - }, - "if_return": { - "active": 1, - "flagValue": -1 - }, - "indent_level": { - "active": 0, - "flagValue": 4 - }, - "indent_start": { - "active": 0, - "flagValue": 0 - }, - "inline": { - "active": 1, - "flagValue": 3 - }, - "inline_script": { - "active": 1, - "flagValue": -1 - }, - "join_vars": { - "active": 1, - "flagValue": -1 - }, - "keep_classnames": { - "active": 0, - "flagValue": -1 - }, - "keep_fargs": { - "active": 1, - "flagValue": -1 - }, - "keep_fnames": { - "active": 0, - "flagValue": -1 - }, - "keep_infinity": { - "active": 0, - "flagValue": -1 - }, - "keep_quoted_props": { - "active": 0, - "flagValue": -1 - }, - "loops": { - "active": 1, - "flagValue": -1 - }, - "max_line_len": { - "active": 1, - "flagValue": 32000 - }, - "module": { - "active": 0, - "flagValue": -1 - }, - "negate_iife": { - "active": 1, - "flagValue": -1 - }, - "passes": { - "active": 1, - "flagValue": 1 - }, - "properties": { - "active": 1, - "flagValue": -1 - }, - "pure_getters": { - "active": 0, - "flagValue": -1 - }, - "quote_keys": { - "active": 0, - "flagValue": -1 - }, - "quote_style": { - "active": 1, - "flagValue": 0 - }, - "reduce_funcs": { - "active": 1, - "flagValue": -1 - }, - "reduce_vars": { - "active": 1, - "flagValue": -1 - }, - "safari10": { - "active": 0, - "flagValue": -1 - }, - "semicolons": { - "active": 1, - "flagValue": -1 - }, - "sequences": { - "active": 1, - "flagValue": -1 - }, - "shebang": { - "active": 1, - "flagValue": -1 - }, - "side_effects": { - "active": 1, - "flagValue": -1 - }, - "switches": { - "active": 1, - "flagValue": -1 - }, - "toplevel": { - "active": 0, - "flagValue": -1 - }, - "typeofs": { - "active": 1, - "flagValue": -1 - }, - "unsafe": { - "active": 0, - "flagValue": -1 - }, - "unsafe_arrows": { - "active": 0, - "flagValue": -1 - }, - "unsafe_comps": { - "active": 0, - "flagValue": -1 - }, - "unsafe_Function": { - "active": 0, - "flagValue": -1 - }, - "unsafe_math": { - "active": 0, - "flagValue": -1 - }, - "unsafe_methods": { - "active": 0, - "flagValue": -1 - }, - "unsafe_proto": { - "active": 0, - "flagValue": -1 - }, - "unsafe_regexp": { - "active": 0, - "flagValue": -1 - }, - "unsafe_undefined": { - "active": 0, - "flagValue": -1 - }, - "unused": { - "active": 1, - "flagValue": -1 - }, - "warnings": { - "active": 0, - "flagValue": -1 - }, - "webkit": { - "active": 0, - "flagValue": -1 - }, - "wrap_iife": { - "active": 0, - "flagValue": -1 - } - }, - "uglifyMangleNames": 1, - "uglifyReservedNamesString": "$,exports,require", - "webpPresets": { - }, - "websiteRelativeRoot": "" - }, -"settingsFileVersion": "3" + "AAInfo" : "This is a CodeKit 3 project config file. EDITING THIS FILE IS A POOR LIFE DECISION. Doing so may cause CodeKit to crash and\/or corrupt your project. Several critical values in this file are 64-bit integers, which JavaScript JSON parsers do not support because JavaScript cannot handle 64-bit integers. These values will be corrupted if the file is parsed with JavaScript. This file is not backwards-compatible with CodeKit 1 or 2. For details, see https:\/\/codekitapp.com\/", + "buildSteps" : [ + { + "name" : "Process All Remaining Files and Folders", + "stepType" : 1, + "uuidString" : "D3A22551-9533-4DF5-941F-F19A1A5E5D12" + } + ], + "creatorBuild" : "34081", + "files" : { + "\/3.0.0" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/3.0.0", + "oF" : 0 + }, + "\/404.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/404.php", + "oF" : 0 + }, + "\/contact.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/contact.php", + "oF" : 0 + }, + "\/css\/aos.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/css\/aos-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/css\/app.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/css\/app-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/css\/fontello.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/css\/fontello-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/doemee.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/doemee.php", + "oF" : 0 + }, + "\/fonts\/fontello.eot" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/fontello.eot", + "oF" : 0 + }, + "\/fonts\/fontello.svg" : { + "ft" : 2097152, + "miP" : 0, + "oA" : 2, + "oAP" : "\/fonts\/fontello.svg", + "oF" : 0, + "opt" : 0, + "plM" : 52780316221407, + "prP" : 0 + }, + "\/fonts\/fontello.ttf" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/fontello.ttf", + "oF" : 0 + }, + "\/fonts\/fontello.woff" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/fontello.woff", + "oF" : 0 + }, + "\/fonts\/fontello.woff2" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/fontello.woff2", + "oF" : 0 + }, + "\/fonts\/TradeGothicLTStd-Bd2.woff" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/TradeGothicLTStd-Bd2.woff", + "oF" : 0 + }, + "\/fonts\/TradeGothicLTStd-Bd2.woff2" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/TradeGothicLTStd-Bd2.woff2", + "oF" : 0 + }, + "\/fonts\/TradeGothicLTStd.woff" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/TradeGothicLTStd.woff", + "oF" : 0 + }, + "\/fonts\/TradeGothicLTStd.woff2" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/TradeGothicLTStd.woff2", + "oF" : 0 + }, + "\/fonts\/TradeGothicNextSRPro-Hv.woff" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/TradeGothicNextSRPro-Hv.woff", + "oF" : 0 + }, + "\/fonts\/TradeGothicNextSRPro-Hv.woff2" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/fonts\/TradeGothicNextSRPro-Hv.woff2", + "oF" : 0 + }, + "\/footer.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/footer.php", + "oF" : 0 + }, + "\/functions.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/functions.php", + "oF" : 0 + }, + "\/functions\/guthenberg.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/functions\/guthenberg.php", + "oF" : 0 + }, + "\/header.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/header.php", + "oF" : 0 + }, + "\/img\/includes\/bij1_default.png" : { + "ft" : 32768, + "iS" : 10951, + "oA" : 0, + "oAP" : "\/img\/includes\/bij1_default.png", + "oF" : 0, + "oIPL" : 0, + "opt" : 0, + "oT" : 1, + "ou" : "lpckwebp-none", + "q" : 100, + "rq" : 75 + }, + "\/img\/includes\/brightness.svg.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/img\/includes\/brightness.svg.php", + "oF" : 0 + }, + "\/img\/includes\/donatemobile.svg.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/img\/includes\/donatemobile.svg.php", + "oF" : 0 + }, + "\/img\/includes\/ENG.svg" : { + "ft" : 2097152, + "miP" : 0, + "oA" : 2, + "oAP" : "\/img\/includes\/ENG.svg", + "oF" : 0, + "opt" : 0, + "plM" : 52780316221407, + "prP" : 0 + }, + "\/img\/includes\/logo.svg.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/img\/includes\/logo.svg.php", + "oF" : 0 + }, + "\/img\/includes\/menu.svg.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/img\/includes\/menu.svg.php", + "oF" : 0 + }, + "\/img\/includes\/NL.svg" : { + "ft" : 2097152, + "miP" : 0, + "oA" : 2, + "oAP" : "\/img\/includes\/NL.svg", + "oF" : 0, + "opt" : 0, + "plM" : 52780316221407, + "prP" : 0 + }, + "\/img\/includes\/search.svg.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/img\/includes\/search.svg.php", + "oF" : 0 + }, + "\/index.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/index.php", + "oF" : 0 + }, + "\/js\/aos.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/aos-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/app-min.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/app-min-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/app-min.js.map" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/js\/app-min.js.map", + "oF" : 0 + }, + "\/js\/app.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 1, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/app-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 1 + }, + "\/js\/flickity.pkgd.min.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/flickity.pkgd.min-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/foundation.min.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/foundation.min-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/fundtemp.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/fundtemp-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/jquery.min.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/jquery.min-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/motion-ui.min.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/motion-ui.min-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/js\/what-input.min.js" : { + "bF" : 0, + "ft" : 64, + "ma" : 0, + "mi" : 1, + "oA" : 0, + "oAP" : "\/js\/what-input.min-min.js", + "oF" : 0, + "sC" : 3, + "tS" : 0 + }, + "\/laodmoretemp.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/laodmoretemp.php", + "oF" : 0 + }, + "\/loadmore.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/loadmore.php", + "oF" : 0 + }, + "\/node_modules" : { + "ft" : 65536, + "oA" : 2, + "oAP" : "\/node_modules", + "oF" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_contain.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_contain.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_purge.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_purge.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_remove.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_remove.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_replace.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_replace.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_to-list.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/functions\/_to-list.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/helpers\/_missing-dependencies.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/helpers\/_missing-dependencies.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/helpers\/_true.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/_vendor\/sassy-lists\/stylesheets\/helpers\/_true.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/_global.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/_global.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_accordion-menu.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_accordion-menu.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_accordion.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_accordion.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_badge.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_badge.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_breadcrumbs.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_breadcrumbs.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_button-group.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_button-group.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_button.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_button.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_callout.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_callout.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_card.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_card.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_close-button.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_close-button.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_drilldown.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_drilldown.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_dropdown-menu.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_dropdown-menu.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_dropdown.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_dropdown.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_flex.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_flex.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_float.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_float.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_label.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_label.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_media-object.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_media-object.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_menu-icon.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_menu-icon.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_menu.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_menu.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_off-canvas.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_off-canvas.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_orbit.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_orbit.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_pagination.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_pagination.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_progress-bar.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_progress-bar.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_responsive-embed.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_responsive-embed.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_reveal.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_reveal.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_slider.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_slider.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_sticky.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_sticky.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_switch.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_switch.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_table.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_table.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_tabs.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_tabs.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_thumbnail.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_thumbnail.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_title-bar.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_title-bar.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_tooltip.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_tooltip.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_top-bar.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_top-bar.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/components\/_visibility.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/components\/_visibility.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_checkbox.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_checkbox.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_error.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_error.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_fieldset.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_fieldset.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_forms.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_forms.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_help-text.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_help-text.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_input-group.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_input-group.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_label.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_label.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_meter.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_meter.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_progress.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_progress.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_range.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_range.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_select.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_select.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/forms\/_text.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/forms\/_text.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/foundation.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/foundation.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_classes.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_classes.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_column.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_column.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_flex-grid.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_flex-grid.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_grid.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_grid.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_gutter.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_gutter.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_layout.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_layout.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_position.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_position.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_row.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_row.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/grid\/_size.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/grid\/_size.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_arrow.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_arrow.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_border-box.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_border-box.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_border-none.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_border-none.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_bordered.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_bordered.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_box.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_box.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_display.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_display.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_font-styling.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_font-styling.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_list-style-type.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_list-style-type.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_overflow.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_overflow.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_position.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_position.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_prototype.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_prototype.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_relation.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_relation.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_rotate.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_rotate.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_rounded.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_rounded.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_separator.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_separator.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_shadow.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_shadow.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_sizing.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_sizing.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_spacing.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_spacing.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_text-decoration.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_text-decoration.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_text-transformation.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_text-transformation.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/prototype\/_text-utilities.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/prototype\/_text-utilities.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/typography\/_alignment.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/typography\/_alignment.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/typography\/_base.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/typography\/_base.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/typography\/_helpers.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/typography\/_helpers.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/typography\/_print.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/typography\/_print.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/typography\/_typography.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/typography\/_typography.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_breakpoint.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_breakpoint.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_color.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_color.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_direction.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_direction.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_flex.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_flex.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_math.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_math.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_mixins.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_mixins.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_selector.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_selector.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_typography.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_typography.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_unit.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_unit.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_util.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_util.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/util\/_value.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/util\/_value.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/vendor\/normalize.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/vendor\/normalize.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_cell.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_cell.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_classes.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_classes.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_collapse.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_collapse.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_frame.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_frame.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_grid.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_grid.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_gutters.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_gutters.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_layout.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_layout.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_position.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_position.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/node_modules\/foundation-sites\/scss\/xy-grid\/_xy-grid.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/node_modules\/foundation-sites\/scss\/xy-grid\/_xy-grid.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/package-lock.json" : { + "ft" : 524288, + "oA" : 1, + "oAP" : "\/package-lock-min.json", + "oF" : 0, + "oO" : 0, + "oS" : 1 + }, + "\/package.json" : { + "ft" : 524288, + "oA" : 1, + "oAP" : "\/package-min.json", + "oF" : 0, + "oO" : 0, + "oS" : 1 + }, + "\/page.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/page.php", + "oF" : 0 + }, + "\/parts\/_cover.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 1, + "oAP" : "\/parts\/_cover.php", + "oF" : 0 + }, + "\/parts\/_doneerformulier.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 1, + "oAP" : "\/parts\/_doneerformulier.php", + "oF" : 0 + }, + "\/parts\/_mailformulier.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 1, + "oAP" : "\/parts\/_mailformulier.php", + "oF" : 0 + }, + "\/parts\/_nieuwsitem.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 1, + "oAP" : "\/parts\/_nieuwsitem.php", + "oF" : 0 + }, + "\/parts\/blocks\/afdelingen_items.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/afdelingen_items.php", + "oF" : 0 + }, + "\/parts\/blocks\/collectiekaart.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/collectiekaart.php", + "oF" : 0 + }, + "\/parts\/blocks\/cta_blocks.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/cta_blocks.php", + "oF" : 0 + }, + "\/parts\/blocks\/cta.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/cta.php", + "oF" : 0 + }, + "\/parts\/blocks\/faq.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/faq.php", + "oF" : 0 + }, + "\/parts\/blocks\/form.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/form.php", + "oF" : 0 + }, + "\/parts\/blocks\/insight.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/insight.php", + "oF" : 0 + }, + "\/parts\/blocks\/kandidaten.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/kandidaten.php", + "oF" : 0 + }, + "\/parts\/blocks\/nieuws_items.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/nieuws_items.php", + "oF" : 0 + }, + "\/parts\/blocks\/programma_items.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/programma_items.php", + "oF" : 0 + }, + "\/parts\/blocks\/readmore.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/readmore.php", + "oF" : 0 + }, + "\/parts\/blocks\/tekst.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/parts\/blocks\/tekst.php", + "oF" : 0 + }, + "\/prepros.config" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/prepros.config", + "oF" : 0 + }, + "\/screenshot.png" : { + "ft" : 32768, + "iS" : 21594, + "oA" : 0, + "oAP" : "\/screenshot.png", + "oF" : 0, + "oIPL" : 0, + "opt" : 0, + "oT" : 1, + "ou" : "lpckwebp-none", + "q" : 100, + "rq" : 75 + }, + "\/scss\/_settings.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 1, + "oAP" : "\/scss\/_settings.css", + "oF" : 0, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/scss\/app.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/scss\/app-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/scss\/app.scss" : { + "aP" : 0, + "bl" : 0, + "dP" : 10, + "ec" : 1, + "ft" : 4, + "ma" : 0, + "oA" : 0, + "oAP" : "\/css\/app.css", + "oF" : 2, + "oS" : 0, + "pg" : 0, + "sct" : 0 + }, + "\/scss\/flickity.min-min.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/scss\/flickity.min-min-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/scss\/flickity.min.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/scss\/flickity.min-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/search.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/search.php", + "oF" : 0 + }, + "\/single.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/single.php", + "oF" : 0 + }, + "\/style.css" : { + "aP" : 1, + "bl" : 0, + "ci" : 0, + "co" : 0, + "ft" : 16, + "ma" : 0, + "oA" : 0, + "oAP" : "\/style-min.css", + "oF" : 0, + "pg" : 0 + }, + "\/Vacatures.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/Vacatures.php", + "oF" : 0 + }, + "\/Veelgesteldevragen.php" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/Veelgesteldevragen.php", + "oF" : 0 + }, + "\/yarn.lock" : { + "cB" : 0, + "ft" : 8192, + "hM" : 0, + "oA" : 0, + "oAP" : "\/yarn.lock", + "oF" : 0 + } + }, + "hooks" : [ + + ], + "manualImportLinks" : { + + }, + "projectAttributes" : { + "creationDate" : 613044097.90951097, + "displayValue" : "BIJ1", + "displayValueWasSetByUser" : 0, + "iconImageName" : "brackets-ucla", + "iconImageWasSetByUser" : 0, + "lastBuiltDate" : 613044142.30960095 + }, + "projectSettings" : { + "abortBuildOnError" : 1, + "allowInjectionReloads" : 1, + "alwaysUseExternalServer" : 1, + "animateCSSInjections" : 1, + "autoBuildNewItems" : 1, + "autoprefixerEnableIEGrid" : 0, + "babel7PresetType" : 1, + "babelAllowRCFiles" : 0, + "babelAuxiliaryCommentAfter" : "", + "babelAuxiliaryCommentBefore" : "", + "babelConfigType" : 0, + "babelCustomPluginsList" : "", + "babelCustomPresetsList" : "", + "babelExcludeString" : "\/\\\/node_modules\\\/\/, \/\\\/core-js\\\/\/, \/\\\/bower_components\\\/\/", + "babelInsertModuleIDs" : 0, + "babelModuleID" : "", + "babelNoComments" : 0, + "babelPlugins" : { + "arrow-functions" : { + "active" : 0 + }, + "async-generator-functions" : { + "active" : 0 + }, + "async-to-generator" : { + "active" : 0 + }, + "block-scoped-functions" : { + "active" : 0 + }, + "block-scoping" : { + "active" : 0 + }, + "class-properties" : { + "active" : 0 + }, + "classes" : { + "active" : 0 + }, + "computed-properties" : { + "active" : 0 + }, + "decorators" : { + "active" : 0 + }, + "destructuring" : { + "active" : 0 + }, + "do-expressions" : { + "active" : 0 + }, + "dotall-regex" : { + "active" : 0 + }, + "duplicate-keys" : { + "active" : 0 + }, + "exponentiation-operator" : { + "active" : 0 + }, + "export-default-from" : { + "active" : 0 + }, + "export-namespace-from" : { + "active" : 0 + }, + "external-helpers" : { + "active" : 0 + }, + "flow-strip-types" : { + "active" : 0 + }, + "for-of" : { + "active" : 0 + }, + "function-bind" : { + "active" : 0 + }, + "function-name" : { + "active" : 0 + }, + "function-sent" : { + "active" : 0 + }, + "inline-consecutive-adds" : { + "active" : 0 + }, + "inline-environment-variables" : { + "active" : 0 + }, + "instanceof" : { + "active" : 0 + }, + "jscript" : { + "active" : 0 + }, + "literals" : { + "active" : 0 + }, + "logical-assignment-operators" : { + "active" : 0 + }, + "member-expression-literals" : { + "active" : 0 + }, + "merge-sibling-variables" : { + "active" : 0 + }, + "minify-booleans" : { + "active" : 0 + }, + "minify-builtins" : { + "active" : 0 + }, + "minify-constant-folding" : { + "active" : 0 + }, + "minify-dead-code-elimination" : { + "active" : 0 + }, + "minify-flip-comparisons" : { + "active" : 0 + }, + "minify-guarded-expressions" : { + "active" : 0 + }, + "minify-infinity" : { + "active" : 0 + }, + "minify-mangle-names" : { + "active" : 0 + }, + "minify-numeric-literals" : { + "active" : 0 + }, + "minify-simplify" : { + "active" : 0 + }, + "minify-type-constructors" : { + "active" : 0 + }, + "modules-amd" : { + "active" : 0 + }, + "modules-commonjs" : { + "active" : 0 + }, + "modules-systemjs" : { + "active" : 0 + }, + "modules-umd" : { + "active" : 0 + }, + "named-capturing-groups-regex" : { + "active" : 0 + }, + "new-target" : { + "active" : 0 + }, + "node-env-inline" : { + "active" : 0 + }, + "nullish-coalescing-operator" : { + "active" : 0 + }, + "numeric-separator" : { + "active" : 0 + }, + "object-assign" : { + "active" : 0 + }, + "object-rest-spread" : { + "active" : 0 + }, + "object-set-prototype-of-to-assign" : { + "active" : 0 + }, + "object-super" : { + "active" : 0 + }, + "optional-catch-binding" : { + "active" : 0 + }, + "optional-chaining" : { + "active" : 0 + }, + "parameters" : { + "active" : 0 + }, + "partial-application" : { + "active" : 0 + }, + "pipeline-operator" : { + "active" : 0 + }, + "private-methods" : { + "active" : 0 + }, + "property-literals" : { + "active" : 0 + }, + "property-mutators" : { + "active" : 0 + }, + "proto-to-assign" : { + "active" : 0 + }, + "react-constant-elements" : { + "active" : 0 + }, + "react-display-name" : { + "active" : 0 + }, + "react-inline-elements" : { + "active" : 0 + }, + "react-jsx" : { + "active" : 0 + }, + "react-jsx-compat" : { + "active" : 0 + }, + "react-jsx-self" : { + "active" : 0 + }, + "react-jsx-source" : { + "active" : 0 + }, + "regenerator" : { + "active" : 0 + }, + "regexp-constructors" : { + "active" : 0 + }, + "remove-console" : { + "active" : 0 + }, + "remove-debugger" : { + "active" : 0 + }, + "remove-undefined" : { + "active" : 0 + }, + "reserved-words" : { + "active" : 0 + }, + "runtime" : { + "active" : 0 + }, + "shorthand-properties" : { + "active" : 0 + }, + "simplify-comparison-operators" : { + "active" : 0 + }, + "spread" : { + "active" : 0 + }, + "sticky-regex" : { + "active" : 0 + }, + "strict-mode" : { + "active" : 0 + }, + "template-literals" : { + "active" : 0 + }, + "throw-expressions" : { + "active" : 0 + }, + "typeof-symbol" : { + "active" : 0 + }, + "undefined-to-void" : { + "active" : 0 + }, + "unicode-property-regex" : { + "active" : 0 + }, + "unicode-regex" : { + "active" : 0 + } + }, + "babelRetainLines" : 0, + "babelUseBuiltInsType" : 0, + "bowerAbbreviatedPath" : "bower_components", + "bowerForceLatestOnConflict" : 1, + "bowerTargetDependencyListType" : 1, + "bowerUseExactVersion" : 0, + "browserRefreshDelay" : 0, + "browserslistString" : ">0.2%, last 2 versions, Firefox ESR, not dead", + "buildEnvironment" : 0, + "buildFolderActive" : 0, + "buildFolderName" : "build", + "cleanBuild" : 1, + "coffeeLintFlags2" : { + "arrow_spacing" : { + "active" : 0, + "flagValue" : -1 + }, + "camel_case_classes" : { + "active" : 1, + "flagValue" : -1 + }, + "colon_assignment_spacing" : { + "active" : 0, + "flagValue" : 1 + }, + "cyclomatic_complexity" : { + "active" : 0, + "flagValue" : 10 + }, + "duplicate_key" : { + "active" : 1, + "flagValue" : -1 + }, + "empty_constructor_needs_parens" : { + "active" : 0, + "flagValue" : -1 + }, + "ensure_comprehensions" : { + "active" : 1, + "flagValue" : -1 + }, + "indentation" : { + "active" : 1, + "flagValue" : 2 + }, + "line_endings" : { + "active" : 0, + "flagValue" : 0 + }, + "max_line_length" : { + "active" : 0, + "flagValue" : 150 + }, + "missing_fat_arrows" : { + "active" : 0, + "flagValue" : -1 + }, + "newlines_after_classes" : { + "active" : 0, + "flagValue" : 3 + }, + "no_backticks" : { + "active" : 1, + "flagValue" : -1 + }, + "no_debugger" : { + "active" : 1, + "flagValue" : -1 + }, + "no_empty_functions" : { + "active" : 0, + "flagValue" : -1 + }, + "no_empty_param_list" : { + "active" : 0, + "flagValue" : -1 + }, + "no_implicit_braces" : { + "active" : 1, + "flagValue" : -1 + }, + "no_implicit_parens" : { + "active" : 0, + "flagValue" : -1 + }, + "no_interpolation_in_single_quotes" : { + "active" : 0, + "flagValue" : -1 + }, + "no_nested_string_interpolation" : { + "active" : 1, + "flagValue" : -1 + }, + "no_plusplus" : { + "active" : 0, + "flagValue" : -1 + }, + "no_private_function_fat_arrows" : { + "active" : 1, + "flagValue" : -1 + }, + "no_stand_alone_at" : { + "active" : 1, + "flagValue" : -1 + }, + "no_tabs" : { + "active" : 1, + "flagValue" : -1 + }, + "no_this" : { + "active" : 0, + "flagValue" : -1 + }, + "no_throwing_strings" : { + "active" : 1, + "flagValue" : -1 + }, + "no_trailing_semicolons" : { + "active" : 1, + "flagValue" : -1 + }, + "no_trailing_whitespace" : { + "active" : 1, + "flagValue" : -1 + }, + "no_unnecessary_double_quotes" : { + "active" : 0, + "flagValue" : -1 + }, + "no_unnecessary_fat_arrows" : { + "active" : 1, + "flagValue" : -1 + }, + "non_empty_constructor_needs_parens" : { + "active" : 0, + "flagValue" : -1 + }, + "prefer_english_operator" : { + "active" : 0, + "flagValue" : -1 + }, + "space_operators" : { + "active" : 0, + "flagValue" : -1 + }, + "spacing_after_comma" : { + "active" : 1, + "flagValue" : -1 + } + }, + "cssoForceMediaMerge" : 0, + "cssoRestructure" : 1, + "environmentVariableEntries" : [ + "NODE_ENV:::production" + ], + "esLintConfigFileHandlingType" : 0, + "esLintECMAVersion" : 7, + "esLintEnvironmentsMask" : 1, + "esLintRules" : { + "accessor-pairs" : { + "active" : 0, + "optionString" : "{'setWithoutGet': true, 'getWithoutSet': false, 'enforceForClassMembers': true}" + }, + "array-bracket-newline" : { + "active" : 0, + "optionString" : "{'multiline': true, 'minItems': null}" + }, + "array-bracket-spacing" : { + "active" : 0, + "optionString" : "'never', {'singleValue': false, 'objectsInArrays': false, 'arraysInArrays': false}" + }, + "array-callback-return" : { + "active" : 0, + "optionString" : "{'allowImplicit': false}" + }, + "array-element-newline" : { + "active" : 0, + "optionString" : "'always'" + }, + "arrow-body-style" : { + "active" : 0, + "optionString" : "'as-needed', {'requireReturnForObjectLiteral': false}" + }, + "arrow-parens" : { + "active" : 0, + "optionString" : "'always'" + }, + "arrow-spacing" : { + "active" : 0, + "optionString" : "{'before': true, 'after': true}" + }, + "block-scoped-var" : { + "active" : 0 + }, + "block-spacing" : { + "active" : 0, + "optionString" : "'always'" + }, + "brace-style" : { + "active" : 0, + "optionString" : "'1tbs', {'allowSingleLine': true}" + }, + "callback-return" : { + "active" : 0, + "optionString" : "['callback', 'cb', 'next']" + }, + "camelcase" : { + "active" : 0, + "optionString" : "{'properties': 'always', 'ignoreDestructuring': false, 'ignoreImports': false}" + }, + "capitalized-comments" : { + "active" : 0, + "optionString" : "'always', {'ignoreInlineComments': false, 'ignoreConsecutiveComments': false}" + }, + "class-methods-use-this" : { + "active" : 0, + "optionString" : "{'exceptMethods': []}" + }, + "comma-dangle" : { + "active" : 1, + "optionString" : "'never'" + }, + "comma-spacing" : { + "active" : 0, + "optionString" : "{'before': false, 'after': true}" + }, + "comma-style" : { + "active" : 0, + "optionString" : "'last'" + }, + "complexity" : { + "active" : 0, + "optionString" : "20" + }, + "computed-property-spacing" : { + "active" : 0, + "optionString" : "'never', {'enforceForClassMembers': true}" + }, + "consistent-return" : { + "active" : 0, + "optionString" : "{'treatUndefinedAsUnspecified': false}" + }, + "consistent-this" : { + "active" : 0, + "optionString" : "'that'" + }, + "constructor-super" : { + "active" : 1 + }, + "curly" : { + "active" : 0, + "optionString" : "'all'" + }, + "default-case" : { + "active" : 0 + }, + "default-case-last" : { + "active" : 0 + }, + "default-param-last" : { + "active" : 0 + }, + "dot-location" : { + "active" : 0, + "optionString" : "'object'" + }, + "dot-notation" : { + "active" : 0, + "optionString" : "{'allowKeywords': false}" + }, + "eol-last" : { + "active" : 0, + "optionString" : "'always'" + }, + "eqeqeq" : { + "active" : 0, + "optionString" : "'always', {'null': 'always'}" + }, + "for-direction" : { + "active" : 0 + }, + "func-call-spacing" : { + "active" : 0, + "optionString" : "'never'" + }, + "func-name-matching" : { + "active" : 0, + "optionString" : "'always', {'considerPropertyDescriptor': false, 'includeCommonJSModuleExports': false}" + }, + "func-names" : { + "active" : 0, + "optionString" : "'always', {'generators': 'always'}" + }, + "func-style" : { + "active" : 0, + "optionString" : "'expression'" + }, + "function-paren-newline" : { + "active" : 0, + "optionString" : "'multiline'" + }, + "generator-star-spacing" : { + "active" : 0, + "optionString" : "{'before': true, 'after': false}" + }, + "getter-return" : { + "active" : 0, + "optionString" : "{'allowImplicit': false}" + }, + "global-require" : { + "active" : 0 + }, + "grouped-accessor-pairs" : { + "active" : 0, + "optionString" : "'anyOrder'" + }, + "guard-for-in" : { + "active" : 0 + }, + "handle-callback-err" : { + "active" : 0, + "optionString" : "'err'" + }, + "id-blacklist" : { + "active" : 0, + "optionString" : "'data', 'err', 'e', 'cb', 'callback'" + }, + "id-length" : { + "active" : 0, + "optionString" : "{'min': 2, 'max': 1000, 'properties': 'always', 'exceptions': ['x', 'i', 'y']}" + }, + "id-match" : { + "active" : 0, + "optionString" : "'^[a-z]+([A-Z][a-z]+)*$', {'properties': false, 'onlyDeclarations': true, 'ignoreDestructuring': false}" + }, + "implicit-arrow-linebreak" : { + "active" : 0, + "optionString" : "'beside'" + }, + "indent" : { + "active" : 0, + "optionString" : "4, {'SwitchCase': 0, 'VariableDeclarator': 1, 'outerIIFEBody': 1 }" + }, + "init-declarations" : { + "active" : 0, + "optionString" : "'always', {'ignoreForLoopInit': true}" + }, + "jsx-quotes" : { + "active" : 0, + "optionString" : "'prefer-double'" + }, + "key-spacing" : { + "active" : 0, + "optionString" : "{'singleLine': {'beforeColon': false, 'afterColon': true, 'mode':'strict'}, 'multiLine': {'beforeColon': false, 'afterColon': true, 'align': 'value', 'mode':'minimum'}}" + }, + "keyword-spacing" : { + "active" : 0, + "optionString" : "{'before': true, 'after': true, 'overrides': {}}" + }, + "line-comment-position" : { + "active" : 0, + "optionString" : "{'position': 'above'}" + }, + "linebreak-style" : { + "active" : 0, + "optionString" : "'unix'" + }, + "lines-around-comment" : { + "active" : 0, + "optionString" : "{'beforeBlockComment': true}" + }, + "lines-between-class-members" : { + "active" : 0, + "optionString" : "'always', {exceptAfterSingleLine: false}" + }, + "max-classes-per-file" : { + "active" : 0, + "optionString" : "1" + }, + "max-depth" : { + "active" : 0, + "optionString" : "{'max': 4}" + }, + "max-len" : { + "active" : 0, + "optionString" : "{'code': 80, 'comments': 80, 'tabWidth': 4, 'ignoreUrls': true, 'ignoreStrings': true, 'ignoreTemplateLiterals': true, 'ignoreRegExpLiterals': true}" + }, + "max-lines" : { + "active" : 0, + "optionString" : "{'max': 300, 'skipBlankLines': true, 'skipComments': true}" + }, + "max-lines-per-function" : { + "active" : 0, + "optionString" : "{'max': 50, 'skipBlankLines': true, 'skipComments': true, 'IIFEs': false}" + }, + "max-nested-callbacks" : { + "active" : 0, + "optionString" : "{'max': 10}" + }, + "max-params" : { + "active" : 0, + "optionString" : "{'max': 4}" + }, + "max-statements" : { + "active" : 0, + "optionString" : "{'max': 10}, {'ignoreTopLevelFunctions': true}" + }, + "max-statements-per-line" : { + "active" : 0, + "optionString" : "{'max': 1}" + }, + "multiline-comment-style" : { + "active" : 0, + "optionString" : "'starred-block'" + }, + "multiline-ternary" : { + "active" : 0, + "optionString" : "'always'" + }, + "new-cap" : { + "active" : 0, + "optionString" : "{'newIsCap': true, 'capIsNew': true, 'newIsCapExceptions': [], 'capIsNewExceptions': ['Array', 'Boolean', 'Date', 'Error', 'Function', 'Number', 'Object', 'RegExp', 'String', 'Symbol'], 'properties': true}" + }, + "new-parens" : { + "active" : 0, + "optionString" : "'always'" + }, + "newline-per-chained-call" : { + "active" : 0, + "optionString" : "{'ignoreChainWithDepth': 2}" + }, + "no-alert" : { + "active" : 0 + }, + "no-array-constructor" : { + "active" : 0 + }, + "no-async-promise-executor" : { + "active" : 0 + }, + "no-await-in-loop" : { + "active" : 0 + }, + "no-bitwise" : { + "active" : 0, + "optionString" : "{'allow': ['~'], 'int32Hint': true}" + }, + "no-buffer-constructor" : { + "active" : 0 + }, + "no-caller" : { + "active" : 0 + }, + "no-case-declarations" : { + "active" : 1 + }, + "no-class-assign" : { + "active" : 1 + }, + "no-compare-neg-zero" : { + "active" : 0 + }, + "no-cond-assign" : { + "active" : 1, + "optionString" : "'except-parens'" + }, + "no-confusing-arrow" : { + "active" : 0, + "optionString" : "{'allowParens': true}" + }, + "no-console" : { + "active" : 1, + "optionString" : "{'allow': ['warn', 'error']}" + }, + "no-const-assign" : { + "active" : 1 + }, + "no-constant-condition" : { + "active" : 1, + "optionString" : "{'checkLoops': true}" + }, + "no-constructor-return" : { + "active" : 0 + }, + "no-continue" : { + "active" : 0 + }, + "no-control-regex" : { + "active" : 1 + }, + "no-debugger" : { + "active" : 1 + }, + "no-delete-var" : { + "active" : 1 + }, + "no-div-regex" : { + "active" : 0 + }, + "no-dupe-args" : { + "active" : 1 + }, + "no-dupe-class-members" : { + "active" : 1 + }, + "no-dupe-else-if" : { + "active" : 1 + }, + "no-dupe-keys" : { + "active" : 1 + }, + "no-duplicate-imports" : { + "active" : 0, + "optionString" : "{'includeExports': false}" + }, + "no-else-return" : { + "active" : 0 + }, + "no-empty" : { + "active" : 1, + "optionString" : "{'allowEmptyCatch': false}" + }, + "no-empty-character-class" : { + "active" : 1 + }, + "no-empty-function" : { + "active" : 0, + "optionString" : "{'allow': []}" + }, + "no-empty-pattern" : { + "active" : 1 + }, + "no-eq-null" : { + "active" : 0 + }, + "no-eval" : { + "active" : 0, + "optionString" : "{'allowIndirect': false}" + }, + "no-ex-assign" : { + "active" : 1 + }, + "no-extend-native" : { + "active" : 0, + "optionString" : "{'exceptions': []}" + }, + "no-extra-bind" : { + "active" : 0 + }, + "no-extra-boolean-cast" : { + "active" : 1 + }, + "no-extra-labels" : { + "active" : 0 + }, + "no-extra-parens" : { + "active" : 0, + "optionString" : "'all', {'conditionalAssign': false, 'returnAssign': false, 'nestedBinaryExpressions': false, 'ignoreJSX': 'none', 'enforceForArrowConditionals': false, 'enforceForSequenceExpressions': false, 'enforceForNewInMemberExpressions': false}" + }, + "no-extra-semi" : { + "active" : 1 + }, + "no-fallthrough" : { + "active" : 1 + }, + "no-floating-decimal" : { + "active" : 0 + }, + "no-func-assign" : { + "active" : 1 + }, + "no-global-assign" : { + "active" : 1, + "optionString" : "{'exceptions': []}" + }, + "no-implicit-coercion" : { + "active" : 0, + "optionString" : "{'boolean': true, 'number': true, 'string': true, 'allow': []}" + }, + "no-implicit-globals" : { + "active" : 0 + }, + "no-implied-eval" : { + "active" : 0 + }, + "no-import-assign" : { + "active" : 1 + }, + "no-inline-comments" : { + "active" : 0 + }, + "no-inner-declarations" : { + "active" : 1, + "optionString" : "'functions'" + }, + "no-invalid-regexp" : { + "active" : 1, + "optionString" : "{'allowConstructorFlags': ['u', 'y']}" + }, + "no-invalid-this" : { + "active" : 0, + "optionString" : "{'capIsConstructor': true}" + }, + "no-irregular-whitespace" : { + "active" : 1, + "optionString" : "{'skipStrings': true, 'skipComments': false, 'skipRegExps': true, 'skipTemplates': true}" + }, + "no-iterator" : { + "active" : 0 + }, + "no-label-var" : { + "active" : 0 + }, + "no-labels" : { + "active" : 0, + "optionString" : "{'allowLoop': false, 'allowSwitch': false}" + }, + "no-lone-blocks" : { + "active" : 0 + }, + "no-lonely-if" : { + "active" : 0 + }, + "no-loop-func" : { + "active" : 0 + }, + "no-loss-of-precision" : { + "active" : 0 + }, + "no-magic-numbers" : { + "active" : 0, + "optionString" : "{'ignore': [], 'ignoreArrayIndexes': true, 'enforceConst': false, 'detectObjects': false}" + }, + "no-misleading-character-class" : { + "active" : 0 + }, + "no-mixed-operators" : { + "active" : 0, + "optionString" : "{'groups': [['+', '-', '*', '\/', '%', '**'], ['&', '|', '^', '~', '<<', '>>', '>>>'], ['==', '!=', '===', '!==', '>', '>=', '<', '<='], ['&&', '||'], ['in', 'instanceof']], 'allowSamePrecedence': true}" + }, + "no-mixed-requires" : { + "active" : 0, + "optionString" : "{'grouping': false, 'allowCall': false }" + }, + "no-mixed-spaces-and-tabs" : { + "active" : 0, + "optionString" : "" + }, + "no-multi-assign" : { + "active" : 0 + }, + "no-multi-spaces" : { + "active" : 0, + "optionString" : "{'exceptions': {'Property': true, 'BinaryExpression': false, 'VariableDeclarator': false, 'ImportDeclaration': false}}" + }, + "no-multi-str" : { + "active" : 0 + }, + "no-multiple-empty-lines" : { + "active" : 0, + "optionString" : "{'max': 2, 'maxBOF': 2, 'maxEOF': 2}" + }, + "no-negated-condition" : { + "active" : 0 + }, + "no-nested-ternary" : { + "active" : 0 + }, + "no-new" : { + "active" : 0 + }, + "no-new-func" : { + "active" : 0 + }, + "no-new-object" : { + "active" : 0 + }, + "no-new-require" : { + "active" : 0 + }, + "no-new-symbol" : { + "active" : 1 + }, + "no-new-wrappers" : { + "active" : 0 + }, + "no-nonoctal-decimal-escape" : { + "active" : 0 + }, + "no-obj-calls" : { + "active" : 1 + }, + "no-octal" : { + "active" : 1 + }, + "no-octal-escape" : { + "active" : 0 + }, + "no-param-reassign" : { + "active" : 0, + "optionString" : "{'props': false}" + }, + "no-path-concat" : { + "active" : 0 + }, + "no-plusplus" : { + "active" : 0, + "optionString" : "{'allowForLoopAfterthoughts': false}" + }, + "no-process-env" : { + "active" : 0 + }, + "no-process-exit" : { + "active" : 0 + }, + "no-promise-executor-return" : { + "active" : 0 + }, + "no-proto" : { + "active" : 0 + }, + "no-prototype-builtins" : { + "active" : 0 + }, + "no-redeclare" : { + "active" : 1, + "optionString" : "{'builtinGlobals': false}" + }, + "no-regex-spaces" : { + "active" : 1 + }, + "no-restricted-exports" : { + "active" : 0, + "optionString" : "{'restrictedNamedExports': []}" + }, + "no-restricted-globals" : { + "active" : 0, + "optionString" : "'event', 'fdescribe'" + }, + "no-restricted-imports" : { + "active" : 0 + }, + "no-restricted-modules" : { + "active" : 0, + "optionString" : "" + }, + "no-restricted-properties" : { + "active" : 0, + "optionString" : "[{'object': 'disallowedObjectName', 'property': 'disallowedPropertyName'}, {'object': 'disallowedObjectName', 'property': 'anotherDisallowedPropertyName', 'message': 'Please use allowedObjectName.allowedPropertyName.'}]" + }, + "no-restricted-syntax" : { + "active" : 0, + "optionString" : "'FunctionExpression', 'WithStatement'" + }, + "no-return-assign" : { + "active" : 0, + "optionString" : "'except-parens'" + }, + "no-return-await" : { + "active" : 0 + }, + "no-script-url" : { + "active" : 0 + }, + "no-self-assign" : { + "active" : 1, + "optionString" : "{'props': true}" + }, + "no-self-compare" : { + "active" : 0 + }, + "no-sequences" : { + "active" : 0 + }, + "no-setter-return" : { + "active" : 1 + }, + "no-shadow" : { + "active" : 0, + "optionString" : "{'builtinGlobals': false, 'hoist': 'functions', 'allow': []}" + }, + "no-shadow-restricted-names" : { + "active" : 0 + }, + "no-sparse-arrays" : { + "active" : 1 + }, + "no-sync" : { + "active" : 0, + "optionString" : "{'allowAtRootLevel': false}" + }, + "no-tabs" : { + "active" : 0, + "optionString" : "{allowIndentationTabs: false}" + }, + "no-template-curly-in-string" : { + "active" : 0 + }, + "no-ternary" : { + "active" : 0 + }, + "no-this-before-super" : { + "active" : 1 + }, + "no-throw-literal" : { + "active" : 0 + }, + "no-trailing-spaces" : { + "active" : 0, + "optionString" : "{'skipBlankLines': false, 'ignoreComments': false}" + }, + "no-undef" : { + "active" : 1, + "optionString" : "{'typeof': false}" + }, + "no-undef-init" : { + "active" : 0 + }, + "no-undefined" : { + "active" : 0 + }, + "no-underscore-dangle" : { + "active" : 0, + "optionString" : "{'allow': [], 'allowAfterThis': false, 'allowAfterSuper': false, 'allowAfterThisConstructor': false, 'enforceInMethodNames': false}" + }, + "no-unexpected-multiline" : { + "active" : 1 + }, + "no-unmodified-loop-condition" : { + "active" : 0 + }, + "no-unneeded-ternary" : { + "active" : 0, + "optionString" : "{'defaultAssignment': true}" + }, + "no-unreachable" : { + "active" : 1 + }, + "no-unreachable-loop" : { + "active" : 0, + "optionString" : "{'ignore': []}" + }, + "no-unsafe-finally" : { + "active" : 1 + }, + "no-unsafe-negation" : { + "active" : 1, + "optionString" : "{'enforceForOrderingRelations': false}" + }, + "no-unsafe-optional-chaining" : { + "active" : 0, + "optionString" : "{'disallowArithmeticOperators': false}" + }, + "no-unused-expressions" : { + "active" : 0, + "optionString" : "{'allowShortCircuit': false, 'allowTernary': false, 'allowTaggedTemplates': false}" + }, + "no-unused-labels" : { + "active" : 1 + }, + "no-unused-vars" : { + "active" : 1, + "optionString" : "{'vars': 'all', 'args': 'after-used', 'caughtErrors': 'none', 'ignoreRestSiblings': false}" + }, + "no-use-before-define" : { + "active" : 0, + "optionString" : "{'functions': true, 'classes': true, 'variables': true}" + }, + "no-useless-backreference" : { + "active" : 0 + }, + "no-useless-call" : { + "active" : 0 + }, + "no-useless-catch" : { + "active" : 0 + }, + "no-useless-computed-key" : { + "active" : 0, + "optionString" : "{'enforceForClassMembers': false}" + }, + "no-useless-concat" : { + "active" : 0 + }, + "no-useless-constructor" : { + "active" : 0 + }, + "no-useless-escape" : { + "active" : 0 + }, + "no-useless-rename" : { + "active" : 0, + "optionString" : "{'ignoreDestructuring': false, 'ignoreImport': false, 'ignoreExport': false}" + }, + "no-useless-return" : { + "active" : 0 + }, + "no-var" : { + "active" : 0 + }, + "no-void" : { + "active" : 0, + "optionString" : "{'allowAsStatement': false}" + }, + "no-warning-comments" : { + "active" : 0, + "optionString" : "{'terms': ['todo', 'fixme', 'xxx'], 'location': 'start'}" + }, + "no-whitespace-before-property" : { + "active" : 0 + }, + "no-with" : { + "active" : 0 + }, + "nonblock-statement-body-position" : { + "active" : 0, + "optionString" : "'beside'" + }, + "object-curly-newline" : { + "active" : 0, + "optionString" : "{'ObjectExpression': {'multiline': true, 'consistent': true}, 'ObjectPattern': {'multiline': true, 'consistent': true}}" + }, + "object-curly-spacing" : { + "active" : 0, + "optionString" : "'never'" + }, + "object-property-newline" : { + "active" : 0, + "optionString" : "{'allowAllPropertiesOnSameLine': true}" + }, + "object-shorthand" : { + "active" : 0, + "optionString" : "'always', {'avoidQuotes': false, 'ignoreConstructors': false}" + }, + "one-var" : { + "active" : 0, + "optionString" : "'always'" + }, + "one-var-declaration-per-line" : { + "active" : 0, + "optionString" : "'always'" + }, + "operator-assignment" : { + "active" : 0, + "optionString" : "'always'" + }, + "operator-linebreak" : { + "active" : 0, + "optionString" : "'after', {'overrides': {'?': 'after', '+=': 'none'}}" + }, + "padded-blocks" : { + "active" : 0, + "optionString" : "{'blocks': 'always', 'switches': 'always', 'classes': 'always'}" + }, + "padding-line-between-statements" : { + "active" : 0, + "optionString" : "{blankLine: 'always', prev:'*', next:'return'}" + }, + "prefer-arrow-callback" : { + "active" : 0 + }, + "prefer-const" : { + "active" : 0, + "optionString" : "{'destructuring': 'any', 'ignoreReadBeforeAssign': false}" + }, + "prefer-destructuring" : { + "active" : 0, + "optionString" : "{'array': true, 'object': true}, {'enforceForRenamedProperties': false}" + }, + "prefer-exponentiation-operator" : { + "active" : 0 + }, + "prefer-named-capture-group" : { + "active" : 0 + }, + "prefer-numeric-literals" : { + "active" : 0 + }, + "prefer-object-spread" : { + "active" : 0 + }, + "prefer-promise-reject-errors" : { + "active" : 0, + "optionString" : "{'allowEmptyReject': false}" + }, + "prefer-regex-literals" : { + "active" : 0 + }, + "prefer-rest-params" : { + "active" : 0 + }, + "prefer-spread" : { + "active" : 0 + }, + "prefer-template" : { + "active" : 0 + }, + "quote-props" : { + "active" : 0, + "optionString" : "'always'" + }, + "quotes" : { + "active" : 0, + "optionString" : "'double', {'avoidEscape': true, 'allowTemplateLiterals': true}" + }, + "radix" : { + "active" : 0, + "optionString" : "'always'" + }, + "require-atomic-updates" : { + "active" : 0 + }, + "require-await" : { + "active" : 0 + }, + "require-jsdoc" : { + "active" : 0, + "optionString" : "{'require': {'FunctionDeclaration': true, 'MethodDefinition': false, 'ClassDeclaration': false, 'ArrowFunctionExpression': false}}" + }, + "require-unicode-regexp" : { + "active" : 0 + }, + "require-yield" : { + "active" : 1 + }, + "rest-spread-spacing" : { + "active" : 0, + "optionString" : "'never'" + }, + "semi" : { + "active" : 0, + "optionString" : "'always', {'omitLastInOneLineBlock': false}" + }, + "semi-spacing" : { + "active" : 0, + "optionString" : "{'before': false, 'after': true}" + }, + "semi-style" : { + "active" : 0, + "optionString" : "'last'" + }, + "sort-imports" : { + "active" : 0, + "optionString" : "{'ignoreCase': false, 'ignoreMemberSort': true, 'memberSyntaxSortOrder': ['none', 'all', 'multiple', 'single']}" + }, + "sort-keys" : { + "active" : 0, + "optionString" : "'asc', {'caseSensitive': true, 'natural': false, 'minKeys': 2}" + }, + "sort-vars" : { + "active" : 0, + "optionString" : "{'ignoreCase': false}" + }, + "space-before-blocks" : { + "active" : 0, + "optionString" : "{'functions': 'always', 'keywords': 'always', 'classes': 'always'}" + }, + "space-before-function-paren" : { + "active" : 0, + "optionString" : "{'anonymous': 'always', 'named': 'never'}" + }, + "space-in-parens" : { + "active" : 0, + "optionString" : "'never', {'exceptions': []}" + }, + "space-infix-ops" : { + "active" : 0, + "optionString" : "{'int32Hint': false}" + }, + "space-unary-ops" : { + "active" : 0, + "optionString" : "{'words': true, 'nonwords': false, 'overrides': {}}" + }, + "spaced-comment" : { + "active" : 0, + "optionString" : "'always', {'line': {'markers': ['\/'], 'exceptions': ['-', '+']}, 'block': {'markers': ['!'], 'exceptions': ['*'], 'balanced': false}}" + }, + "strict" : { + "active" : 0, + "optionString" : "'safe'" + }, + "switch-colon-spacing" : { + "active" : 0, + "optionString" : "{'after': true, 'before': false}" + }, + "symbol-description" : { + "active" : 0 + }, + "template-curly-spacing" : { + "active" : 0, + "optionString" : "'never'" + }, + "template-tag-spacing" : { + "active" : 0, + "optionString" : "'never'" + }, + "unicode-bom" : { + "active" : 0, + "optionString" : "'never'" + }, + "use-isnan" : { + "active" : 1, + "optionString" : "{'enforceForSwitchCase': true, 'enforceForIndexOf': false}" + }, + "valid-jsdoc" : { + "active" : 0, + "optionString" : "{'prefer': {'return': 'returns'}, 'requireReturn': true, 'requireReturnDescription': true, 'requireReturnType': true, 'requireParamDescription': true}" + }, + "valid-typeof" : { + "active" : 1, + "optionString" : "{'requireStringLiterals': true}" + }, + "vars-on-top" : { + "active" : 0 + }, + "wrap-iife" : { + "active" : 0, + "optionString" : "'outside'" + }, + "wrap-regex" : { + "active" : 0 + }, + "yield-star-spacing" : { + "active" : 0, + "optionString" : "{'before': false, 'after': true}" + }, + "yoda" : { + "active" : 0, + "optionString" : "'never', {'exceptRange': false, 'onlyEquality': false}" + } + }, + "esLintSourceType" : 0, + "externalServerAddress" : "http:\/\/n8w8.local", + "gitIgnoreBuildFolder" : 1, + "hideConfigFile" : 0, + "jsCheckerReservedNamesString" : "$", + "jsHintFlags2" : { + "asi" : { + "active" : 0, + "flagValue" : -1 + }, + "bitwise" : { + "active" : 1, + "flagValue" : -1 + }, + "boss" : { + "active" : 0, + "flagValue" : -1 + }, + "browser" : { + "active" : 1, + "flagValue" : -1 + }, + "browserify" : { + "active" : 0, + "flagValue" : -1 + }, + "camelcase" : { + "active" : 0, + "flagValue" : -1 + }, + "couch" : { + "active" : 0, + "flagValue" : -1 + }, + "curly" : { + "active" : 1, + "flagValue" : -1 + }, + "debug" : { + "active" : 0, + "flagValue" : -1 + }, + "devel" : { + "active" : 0, + "flagValue" : -1 + }, + "dojo" : { + "active" : 0, + "flagValue" : -1 + }, + "elision" : { + "active" : 1, + "flagValue" : -1 + }, + "eqeqeq" : { + "active" : 1, + "flagValue" : -1 + }, + "eqnull" : { + "active" : 0, + "flagValue" : -1 + }, + "es3" : { + "active" : 0, + "flagValue" : -1 + }, + "esnext" : { + "active" : 0, + "flagValue" : -1 + }, + "evil" : { + "active" : 0, + "flagValue" : -1 + }, + "expr" : { + "active" : 0, + "flagValue" : -1 + }, + "forin" : { + "active" : 0, + "flagValue" : -1 + }, + "freeze" : { + "active" : 1, + "flagValue" : -1 + }, + "funcscope" : { + "active" : 0, + "flagValue" : -1 + }, + "futurehostile" : { + "active" : 0, + "flagValue" : -1 + }, + "globalstrict" : { + "active" : 0, + "flagValue" : -1 + }, + "immed" : { + "active" : 0, + "flagValue" : -1 + }, + "indent" : { + "active" : 0, + "flagValue" : 4 + }, + "iterator" : { + "active" : 0, + "flagValue" : -1 + }, + "jasmine" : { + "active" : 0, + "flagValue" : -1 + }, + "jquery" : { + "active" : 1, + "flagValue" : -1 + }, + "lastsemic" : { + "active" : 0, + "flagValue" : -1 + }, + "latedef" : { + "active" : 1, + "flagValue" : -1 + }, + "laxbreak" : { + "active" : 0, + "flagValue" : -1 + }, + "laxcomma" : { + "active" : 0, + "flagValue" : -1 + }, + "loopfunc" : { + "active" : 0, + "flagValue" : -1 + }, + "maxcomplexity" : { + "active" : 0, + "flagValue" : 10 + }, + "maxdepth" : { + "active" : 0, + "flagValue" : 3 + }, + "maxlen" : { + "active" : 0, + "flagValue" : 150 + }, + "maxparams" : { + "active" : 0, + "flagValue" : 3 + }, + "maxstatements" : { + "active" : 0, + "flagValue" : 4 + }, + "mocha" : { + "active" : 0, + "flagValue" : -1 + }, + "mootools" : { + "active" : 0, + "flagValue" : -1 + }, + "moz" : { + "active" : 0, + "flagValue" : -1 + }, + "multistr" : { + "active" : 0, + "flagValue" : -1 + }, + "newcap" : { + "active" : 1, + "flagValue" : -1 + }, + "noarg" : { + "active" : 1, + "flagValue" : -1 + }, + "nocomma" : { + "active" : 0, + "flagValue" : -1 + }, + "node" : { + "active" : 0, + "flagValue" : -1 + }, + "noempty" : { + "active" : 0, + "flagValue" : -1 + }, + "nonbsp" : { + "active" : 0, + "flagValue" : -1 + }, + "nonew" : { + "active" : 1, + "flagValue" : -1 + }, + "nonstandard" : { + "active" : 0, + "flagValue" : -1 + }, + "notypeof" : { + "active" : 1, + "flagValue" : -1 + }, + "noyield" : { + "active" : 0, + "flagValue" : -1 + }, + "onecase" : { + "active" : 0, + "flagValue" : -1 + }, + "phantom" : { + "active" : 0, + "flagValue" : -1 + }, + "plusplus" : { + "active" : 0, + "flagValue" : -1 + }, + "proto" : { + "active" : 0, + "flagValue" : -1 + }, + "prototypejs" : { + "active" : 0, + "flagValue" : -1 + }, + "qunit" : { + "active" : 0, + "flagValue" : -1 + }, + "regexp" : { + "active" : 1, + "flagValue" : -1 + }, + "rhino" : { + "active" : 0, + "flagValue" : -1 + }, + "scripturl" : { + "active" : 0, + "flagValue" : -1 + }, + "shadow" : { + "active" : 0, + "flagValue" : -1 + }, + "shelljs" : { + "active" : 0, + "flagValue" : -1 + }, + "singleGroups" : { + "active" : 0, + "flagValue" : -1 + }, + "strict" : { + "active" : 0, + "flagValue" : -1 + }, + "sub" : { + "active" : 0, + "flagValue" : -1 + }, + "supernew" : { + "active" : 0, + "flagValue" : -1 + }, + "typed" : { + "active" : 0, + "flagValue" : -1 + }, + "undef" : { + "active" : 1, + "flagValue" : -1 + }, + "unused" : { + "active" : 1, + "flagValue" : -1 + }, + "varstmt" : { + "active" : 0, + "flagValue" : -1 + }, + "withstmt" : { + "active" : 0, + "flagValue" : -1 + }, + "worker" : { + "active" : 0, + "flagValue" : -1 + }, + "wsh" : { + "active" : 0, + "flagValue" : -1 + }, + "yui" : { + "active" : 0, + "flagValue" : -1 + } + }, + "jsLintFlags2" : { + "bitwise" : { + "active" : 0, + "flagValue" : -1 + }, + "browser" : { + "active" : 1, + "flagValue" : -1 + }, + "couch" : { + "active" : 0, + "flagValue" : -1 + }, + "devel" : { + "active" : 0, + "flagValue" : -1 + }, + "es6" : { + "active" : 0, + "flagValue" : -1 + }, + "eval" : { + "active" : 0, + "flagValue" : -1 + }, + "for" : { + "active" : 0, + "flagValue" : -1 + }, + "maxlen" : { + "active" : 0, + "flagValue" : 150 + }, + "node" : { + "active" : 0, + "flagValue" : -1 + }, + "this" : { + "active" : 0, + "flagValue" : -1 + }, + "white" : { + "active" : 0, + "flagValue" : -1 + } + }, + "languageDefaultsCOFFEE" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.js", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "minifierStyle" : 1, + "outputStyle" : 0, + "sourceMapStyle" : 0, + "syntaxCheckerStyle" : 1, + "transpilerStyle" : 1 + }, + "languageDefaultsCSS" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*-min.css", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "combineImports" : 0, + "cssoStyle" : 0, + "purgeCSSStyle" : 0, + "shouldRunAutoprefixer" : 1, + "shouldRunBless" : 0, + "sourceMapStyle" : 0 + }, + "languageDefaultsGIF" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.gif", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "webpOptimizationPresetUUID" : "lpckwebp-none", + "webpRGBQuality" : 75 + }, + "languageDefaultsHAML" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.html", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "escapeHTMLCharacters" : 0, + "htmlMinifierStyle" : 0, + "noEscapeInAttributes" : 0, + "outputFormat" : 2, + "shouldRunCacheBuster" : 0, + "useCDATA" : 0, + "useDoubleQuotes" : 0, + "useUnixNewlines" : 0 + }, + "languageDefaultsJPG" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.jpg", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "outputFormat" : 0, + "quality" : 100, + "webpOptimizationPresetUUID" : "lpckwebp-none", + "webpRGBQuality" : 75 + }, + "languageDefaultsJS" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*-min.js", + "autoOutputPathRelativePath" : "\/min", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "bundleFormat" : 0, + "minifierStyle" : 1, + "sourceMapStyle" : 0, + "syntaxCheckerStyle" : 3, + "transpilerStyle" : 0 + }, + "languageDefaultsJSON" : { + "autoOutputAction" : 1, + "autoOutputPathFilenamePattern" : "*-min.json", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "orderOutput" : 0, + "outputStyle" : 1 + }, + "languageDefaultsKIT" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.html", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "kit", + "autoOutputPathReplace2" : "html", + "autoOutputPathStyle" : 0, + "htmlMinifierStyle" : 0, + "shouldRunCacheBuster" : 0 + }, + "languageDefaultsLESS" : { + "allowInsecureImports" : 0, + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.css", + "autoOutputPathRelativePath" : "..\/css", + "autoOutputPathReplace1" : "less", + "autoOutputPathReplace2" : "css", + "autoOutputPathStyle" : 0, + "cssoStyle" : 0, + "enableJavascript" : 0, + "mathStyle" : 0, + "outputStyle" : 0, + "purgeCSSStyle" : 0, + "rewriteURLStyle" : 0, + "shouldRunAutoprefixer" : 0, + "shouldRunBless" : 0, + "sourceMapStyle" : 1, + "strictImports" : 0, + "strictUnits" : 0 + }, + "languageDefaultsMARKDOWN" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.html", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "criticStyle" : 0, + "enableFootnotes" : 1, + "enableLabels" : 1, + "enableSmartQuotes" : 1, + "htmlMinifierStyle" : 0, + "maskEmailAddresses" : 1, + "outputFormat" : 0, + "outputStyle" : 0, + "parseMetadata" : 1, + "processHTML" : 0, + "randomFootnoteNumbers" : 0, + "shouldRunCacheBuster" : 0, + "useCompatibilityMode" : 0 + }, + "languageDefaultsOTHER" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.*", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "htmlMinifierStyle" : 0, + "shouldRunCacheBuster" : 0 + }, + "languageDefaultsPNG" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.png", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "optimizerType" : 1, + "quality" : 100, + "webpOptimizationPresetUUID" : "lpckwebp-none", + "webpRGBQuality" : 75 + }, + "languageDefaultsPUG" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.html", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "compileDebug" : 1, + "htmlMinifierStyle" : 0, + "outputStyle" : 0, + "shouldRunCacheBuster" : 0 + }, + "languageDefaultsSASS" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.css", + "autoOutputPathRelativePath" : "..\/css", + "autoOutputPathReplace1" : "sass", + "autoOutputPathReplace2" : "css", + "autoOutputPathStyle" : 0, + "compilerType" : 0, + "cssoStyle" : 0, + "decimalPrecision" : 10, + "emitCharset" : 1, + "outputStyle" : 0, + "purgeCSSStyle" : 0, + "shouldRunAutoprefixer" : 0, + "shouldRunBless" : 0, + "sourceMapStyle" : 0 + }, + "languageDefaultsSLIM" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.html", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "compileOnly" : 0, + "htmlMinifierStyle" : 0, + "logicless" : 0, + "outputFormat" : 0, + "outputStyle" : 1, + "railsCompatible" : 0, + "shouldRunCacheBuster" : 0 + }, + "languageDefaultsSTYLUS" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.css", + "autoOutputPathRelativePath" : "..\/css", + "autoOutputPathReplace1" : "stylus", + "autoOutputPathReplace2" : "css", + "autoOutputPathStyle" : 0, + "cssoStyle" : 0, + "debugStyle" : 0, + "importCSS" : 0, + "outputStyle" : 0, + "purgeCSSStyle" : 0, + "resolveRelativeURLS" : 0, + "shouldRunAutoprefixer" : 0, + "shouldRunBless" : 0, + "sourceMapStyle" : 0 + }, + "languageDefaultsSVG" : { + "autoOutputAction" : 2, + "autoOutputPathFilenamePattern" : "*.svg", + "autoOutputPathRelativePath" : "", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "pluginMask" : 52780316221407 + }, + "languageDefaultsTS" : { + "autoOutputAction" : 0, + "autoOutputPathFilenamePattern" : "*.js", + "autoOutputPathRelativePath" : "\/js", + "autoOutputPathReplace1" : "", + "autoOutputPathReplace2" : "", + "autoOutputPathStyle" : 0, + "createDeclarationFile" : 0, + "jsxMode" : 0, + "minifierStyle" : 0, + "moduleResolutionType" : 0, + "moduleType" : 2, + "removeComments" : 0, + "sourceMapStyle" : 0, + "targetECMAVersion" : 0 + }, + "languageDefaultsUserDefined" : [ + + ], + "npmAbbreviatedPath" : "", + "npmCreatePackageLock" : 1, + "npmInstallOptionalDependencies" : 0, + "npmSaveExactVersion" : 0, + "npmTargetDependencyListType" : 1, + "overrideExternalServerCSS" : 0, + "previewPathAddition" : "", + "purgeCSS" : { + "blocklistEntries" : [ + + ], + "contentEntries" : [ + "**\/*.html", + "**\/*.htm", + "**\/*.shtml", + "**\/*.xhtml", + "**\/*.php", + "**\/*.js", + "**\/*.ts", + "**\/*.coffee", + "**\/*.erb", + "**\/*.pug", + "**\/*.jade", + "**\/*.slim", + "**\/*.haml", + "**\/*.md", + "**\/*.kit" + ], + "removeFontFace" : 0, + "removeKeyframes" : 0, + "removeVariables" : 0, + "safelistEntries" : [ + + ] + }, + "rollupContext" : "", + "rollupExternalEntries" : [ + + ], + "rollupReplacementEntries" : [ + "process.env.NODE_ENV:::$NODE_ENV", + "ENVIRONMENT:::$NODE_ENV" + ], + "rollupTreeshakingEnabled" : 1, + "skippedFoldersString" : "log, _logs, logs, _cache, cache, .idea, \/storage\/framework\/sessions, node_modules", + "sourceFolderName" : "source", + "susyVersion" : 3, + "tsAllowSyntheticDefaultImports" : 0, + "tsAllowUnreachableCode" : 0, + "tsAllowUnusedLabels" : 0, + "tsAlwaysStrict" : 0, + "tsDownlevelIteration" : 0, + "tsEmitBOM" : 0, + "tsEmitDecoratorMetadata" : 0, + "tsESModuleInterop" : 0, + "tsForceConsistentCasingInFileNames" : 0, + "tsImportHelpers" : 0, + "tsIsolatedModules" : 0, + "tsJSXFactory" : "React.createElement", + "tsKeyofStringsOnly" : 0, + "tsNoEmitHelpers" : 0, + "tsNoFallthroughCasesInSwitch" : 0, + "tsNoImplicitAny" : 0, + "tsNoImplicitReturns" : 0, + "tsNoImplicitThis" : 0, + "tsNoImplicitUseStrict" : 0, + "tsNoLib" : 0, + "tsNoResolve" : 0, + "tsNoStrictGenericChecks" : 0, + "tsNoUncheckedIndexAccess" : 0, + "tsNoUnusedLocals" : 0, + "tsNoUnusedParameters" : 0, + "tsPreserveConstEnums" : 0, + "tsPreserveSymlinks" : 0, + "tsResolveJsonModule" : 0, + "tsSkipLibCheck" : 0, + "tsStrictFunctionTypes" : 0, + "tsStrictNullChecks" : 0, + "tsStrictPropertyInitialization" : 0, + "tsStripInternal" : 0, + "tsSuppressExcessPropertyErrors" : 0, + "tsSuppressImplicitAnyIndexErrors" : 0, + "uglifyDefinesString" : "", + "uglifyFlags2" : { + "arguments" : { + "active" : 1, + "flagValue" : -1 + }, + "arrows" : { + "active" : 1, + "flagValue" : -1 + }, + "ascii_only" : { + "active" : 0, + "flagValue" : -1 + }, + "booleans" : { + "active" : 1, + "flagValue" : -1 + }, + "booleans_as_integers" : { + "active" : 0, + "flagValue" : -1 + }, + "braces" : { + "active" : 0, + "flagValue" : -1 + }, + "collapse_vars" : { + "active" : 1, + "flagValue" : -1 + }, + "comments" : { + "active" : 0, + "flagValue" : -1 + }, + "comparisons" : { + "active" : 1, + "flagValue" : -1 + }, + "computed_props" : { + "active" : 1, + "flagValue" : -1 + }, + "conditionals" : { + "active" : 1, + "flagValue" : -1 + }, + "dead_code" : { + "active" : 1, + "flagValue" : -1 + }, + "directives" : { + "active" : 1, + "flagValue" : -1 + }, + "drop_console" : { + "active" : 0, + "flagValue" : -1 + }, + "drop_debugger" : { + "active" : 1, + "flagValue" : -1 + }, + "ecma" : { + "active" : 1, + "flagValue" : 5 + }, + "eval" : { + "active" : 0, + "flagValue" : -1 + }, + "evaluate" : { + "active" : 1, + "flagValue" : -1 + }, + "expression" : { + "active" : 0, + "flagValue" : -1 + }, + "hoist_funs" : { + "active" : 0, + "flagValue" : -1 + }, + "hoist_props" : { + "active" : 1, + "flagValue" : -1 + }, + "hoist_vars" : { + "active" : 0, + "flagValue" : -1 + }, + "ie8" : { + "active" : 0, + "flagValue" : -1 + }, + "if_return" : { + "active" : 1, + "flagValue" : -1 + }, + "indent_level" : { + "active" : 0, + "flagValue" : 4 + }, + "indent_start" : { + "active" : 0, + "flagValue" : 0 + }, + "inline" : { + "active" : 1, + "flagValue" : 3 + }, + "inline_script" : { + "active" : 1, + "flagValue" : -1 + }, + "join_vars" : { + "active" : 1, + "flagValue" : -1 + }, + "keep_classnames" : { + "active" : 0, + "flagValue" : -1 + }, + "keep_fargs" : { + "active" : 1, + "flagValue" : -1 + }, + "keep_fnames" : { + "active" : 0, + "flagValue" : -1 + }, + "keep_infinity" : { + "active" : 0, + "flagValue" : -1 + }, + "keep_quoted_props" : { + "active" : 0, + "flagValue" : -1 + }, + "loops" : { + "active" : 1, + "flagValue" : -1 + }, + "max_line_len" : { + "active" : 1, + "flagValue" : 32000 + }, + "module" : { + "active" : 0, + "flagValue" : -1 + }, + "negate_iife" : { + "active" : 1, + "flagValue" : -1 + }, + "passes" : { + "active" : 1, + "flagValue" : 1 + }, + "properties" : { + "active" : 1, + "flagValue" : -1 + }, + "pure_getters" : { + "active" : 0, + "flagValue" : -1 + }, + "quote_keys" : { + "active" : 0, + "flagValue" : -1 + }, + "quote_style" : { + "active" : 1, + "flagValue" : 0 + }, + "reduce_funcs" : { + "active" : 1, + "flagValue" : -1 + }, + "reduce_vars" : { + "active" : 1, + "flagValue" : -1 + }, + "safari10" : { + "active" : 0, + "flagValue" : -1 + }, + "semicolons" : { + "active" : 1, + "flagValue" : -1 + }, + "sequences" : { + "active" : 1, + "flagValue" : -1 + }, + "shebang" : { + "active" : 1, + "flagValue" : -1 + }, + "side_effects" : { + "active" : 1, + "flagValue" : -1 + }, + "switches" : { + "active" : 1, + "flagValue" : -1 + }, + "toplevel" : { + "active" : 0, + "flagValue" : -1 + }, + "typeofs" : { + "active" : 1, + "flagValue" : -1 + }, + "unsafe" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_arrows" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_comps" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_Function" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_math" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_methods" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_proto" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_regexp" : { + "active" : 0, + "flagValue" : -1 + }, + "unsafe_undefined" : { + "active" : 0, + "flagValue" : -1 + }, + "unused" : { + "active" : 1, + "flagValue" : -1 + }, + "warnings" : { + "active" : 0, + "flagValue" : -1 + }, + "webkit" : { + "active" : 0, + "flagValue" : -1 + }, + "wrap_iife" : { + "active" : 0, + "flagValue" : -1 + } + }, + "uglifyMangleNames" : 1, + "uglifyReservedNamesString" : "$,exports,require", + "webpPresets" : { + + }, + "websiteRelativeRoot" : "" + }, + "settingsFileVersion" : "3" } \ No newline at end of file diff --git a/wp-content/themes/BIJ1/contact.php b/wp-content/themes/BIJ1/contact.php index ed491679..7f62f346 100644 --- a/wp-content/themes/BIJ1/contact.php +++ b/wp-content/themes/BIJ1/contact.php @@ -6,12 +6,20 @@
    - -

    BIJ1 is een politieke partij, ingeschreven bij de KvK onder nummer 67480551. Vestigingsplaats is Wapenstraat 37 A, 3074ZR Rotterdam.

    + + + + + + +

    +
    + + diff --git a/wp-content/themes/BIJ1/css/aos.css b/wp-content/themes/BIJ1/css/aos.css new file mode 100644 index 00000000..66923fe6 --- /dev/null +++ b/wp-content/themes/BIJ1/css/aos.css @@ -0,0 +1 @@ +[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)} \ No newline at end of file diff --git a/wp-content/themes/BIJ1/css/app.css b/wp-content/themes/BIJ1/css/app.css index d0c06628..0a5ffb34 100644 --- a/wp-content/themes/BIJ1/css/app.css +++ b/wp-content/themes/BIJ1/css/app.css @@ -49,8 +49,7 @@ a { abbr[title] { border-bottom: none; text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; + text-decoration: underline dotted; } b, @@ -252,8 +251,7 @@ select { button { padding: 0; - -webkit-appearance: none; - appearance: none; + appearance: none; border: 0; border-radius: 5px; background: transparent; @@ -302,8 +300,7 @@ textarea { line-height: 0; color: #161616; transition: box-shadow 0.5s, border-color 0.25s ease-in-out; - -webkit-appearance: none; - appearance: none; + appearance: none; } [type=text]:focus, [type=password]:focus, [type=date]:focus, [type=datetime]:focus, [type=datetime-local]:focus, [type=month]:focus, [type=week]:focus, [type=email]:focus, [type=number]:focus, [type=search]:focus, [type=tel]:focus, [type=time]:focus, [type=url]:focus, [type=color]:focus, textarea:focus { @@ -330,8 +327,7 @@ textarea[readonly] { [type=submit], [type=button] { - -webkit-appearance: none; - appearance: none; + appearance: none; border-radius: 5px; } @@ -480,8 +476,7 @@ select { height: 1.1666666667rem; margin: 0 0 1.2083333333rem; padding: 0.6041666667rem; - -webkit-appearance: none; - appearance: none; + appearance: none; border: 1px solid #fff; border-radius: 5px; background-color: none; @@ -897,8 +892,7 @@ ul.no-bullet, ol.no-bullet { * { background: transparent !important; color: black !important; - -webkit-print-color-adjust: economy; - color-adjust: economy; + color-adjust: economy; box-shadow: none !important; text-shadow: none !important; } @@ -3690,8 +3684,7 @@ a.button:hover, a.button:focus { font-size: 0.5833333333rem; font-weight: bold; color: #fff; - -webkit-user-select: none; - user-select: none; + user-select: none; } .switch-input { @@ -5337,8 +5330,7 @@ html.is-reveal-open body { .reveal { z-index: 1006; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; + backface-visibility: hidden; display: none; padding: 1rem; border: 1px solid #cacaca; @@ -6085,8 +6077,7 @@ p a:hover { transition: all ease 0.25s; color: #C700BF; text-decoration: underline; - -webkit-text-decoration-color: transparent; - text-decoration-color: transparent; + text-decoration-color: transparent; } .block.text-block li a:hover { @@ -6099,9 +6090,8 @@ GENERAL @media screen and (min-width: 40em) { .breakword { overflow-wrap: break-word; - width: 115%; - -webkit-hyphens: auto; - hyphens: auto; + width: 105%; + hyphens: auto; } } @@ -6162,14 +6152,15 @@ body { margin-left: 10px; } .altheader h1 span:after { - top: 10px; + right: -10px; + top: 5px; left: -7px; right: -7px; } @media screen and (min-width: 64em) { .altheader h1 span:after { + top: 10px; left: -10px; - right: -10px; } } .altheader h2 span { @@ -6438,6 +6429,22 @@ BUTTONS /*----------------- TOPBAR & MENU -----------------*/ +.skiptocontent { + position: absolute; + top: 4.5rem; + font-weight: bold; + left: 1rem; + background: #fff; + font-size: 0.85rem; + border: 2px solid #000; + padding: 0.5rem; + line-height: 1; + opacity: 0; +} +.skiptocontent:focus-within, .skiptocontent:hover { + opacity: 1; +} + .menu { font-size: 16px; line-height: 18px; @@ -6509,6 +6516,45 @@ TOPBAR & MENU text-decoration: none !important; } +.languageswitch { + list-style-type: none; + margin-left: 0 !important; + padding: 5px 0 0 0; +} +.languageswitch a { + padding: 0 !important; + position: relative; + width: 40px; + height: 40px; + display: inline-block; + overflow: hidden; + font-size: 0px !important; + color: #fff; +} +.languageswitch a:after { + position: absolute; + content: ""; + display: block; + background-size: contain; + background-repeat: no-repeat; + background-position: center center; + width: 40px; + height: 40px; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +.languageswitch a:hover { + transform: scale(1.1); +} +.languageswitch .lang-item-nl a:after { + background-image: url(../img/includes/NL.svg) !important; +} +.languageswitch .lang-item-en a:after { + background-image: url(../img/includes/ENG.svg) !important; +} + .admin-bar .topbar { top: 32px; } @@ -6637,13 +6683,14 @@ TOPBAR & MENU z-index: 14; } #iconmenu .menu a { + padding-top: 5px; margin-bottom: 0; } #iconmenu.expanded { top: 200px; } #iconmenu .button { - padding: 0 30px; + padding: 0 15px; } /* INDEX MENU */ @@ -6657,6 +6704,12 @@ TOPBAR & MENU top: -1000px; padding-top: 90px; } +@media screen and (max-width: 39.99875em) { + #indexmenu { + height: 100vh; + overflow: scroll; + } +} #indexmenu.expanded { top: 0; } @@ -6772,6 +6825,12 @@ TOPBAR & MENU left: 0; background: #161616; } +@media screen and (max-width: 39.99875em) { + .leftmenu { + height: 100vh; + overflow-y: scroll; + } +} @media only screen and (max-width: 500px) { .leftmenu { right: 0; @@ -7080,7 +7139,7 @@ BLOCKS } .posttypeblock2 { - margin: 60px 0; + margin: 90px 0; } .posttypeblock2 .imagecontainer { height: 400px; @@ -7617,7 +7676,7 @@ input::placeholder { } .fakebutton { - border-radius: 20px; + border-radius: 99px; background: #fff !important; color: inherit !important; margin: 0 0 1rem 0; @@ -7814,6 +7873,9 @@ input.fakebutton:active, input.fakebutton:focus { } } /* DOEMEE TEMPLATE */ +.doemeepage p.nbm, .contactpage p.nbm { + margin-top: 40px; +} .doemeepage .fullheight, .contactpage .fullheight { height: 400px; } @@ -7822,6 +7884,9 @@ input.fakebutton:active, input.fakebutton:focus { height: 100%; } } +.doemeepage input[type=text], .contactpage input[type=text] { + margin-top: 0 !important; +} .doemeepage .formulier, .contactpage .formulier { background: #FFFF00; height: 100%; @@ -7830,7 +7895,7 @@ input.fakebutton:active, input.fakebutton:focus { .doemeepage .formulier, .contactpage .formulier { padding-left: 0; padding-right: 0; - height: calc(100vh - 90px); + min-height: calc(100vh - 90px); } } .doemeepage .formulier #input_1_3, .contactpage .formulier #input_1_3 { @@ -7851,7 +7916,7 @@ input.fakebutton:active, input.fakebutton:focus { background: #FFFF00; border-radius: 99px; font-size: 18px !important; - padding: 10px !important; + padding: 10px 20px !important; height: unset; box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.18); } @@ -7872,6 +7937,123 @@ input.fakebutton:active, input.fakebutton:focus { } } +.radiostyle input + label { + transition: all ease 0.25s; + background: #fff; + color: #161616; + border: none; + border-radius: 99px; + box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.18); + padding: 14px 30px !important; + font-size: 14px !important; + font-weight: bold; + margin-left: 0 !important; + width: 100% !important; + max-width: 96% !important; +} +.radiostyle input { + -webkit-appearance: initial; +} +.radiostyle input:checked + label { + background: #161616; + color: #fff; + border: none; + border-radius: 99px; +} + +/* FORMULIER STYLING */ +.gform_wrapper { + line-height: 1; +} + +@media screen and (min-width: 40em) and (max-width: 63.99875em) { + .gform_wrapper * { + width: 100% !important; + } + + .has_country { + font-size: 18px !important; + margin-top: 0 !important; + padding-right: 8px !important; + } + + #input_3_14_6 { + margin-bottom: 0 !important; + } +} +@media screen and (min-width: 64em) { + .half { + display: inline-block; + width: 50%; + } + .half .ginput_container { + width: 100%; + margin-top: 0 !important; + } + .half .ginput_container input { + margin-bottom: 15px !important; + width: 100% !important; + } + .half .ginput_container .address_zip { + width: 100% !important; + } + + .has_street span { + display: inline-block; + width: 50%; + } + .has_street span:first-child { + padding-right: 8px; + } + + .address_line_2 { + padding-left: 8px; + } + + .has_country { + font-size: 18px !important; + padding-right: 8px !important; + } + + .address_country { + border-bottom: 1.5px solid #161616; + min-height: 0px !important; + } + .address_country select { + margin-bottom: 0px !important; + } + .address_country #input_3_14_6 { + margin-bottom: 0 !important; + } + + body .gform_wrapper ul li.gfield { + margin-top: 0px !important; + } +} +.has_country { + font-size: 18px !important; + margin-top: 0 !important; +} + +.address_country { + border-bottom: 1.5px solid #161616; + min-height: 0px !important; +} + +#field_3_14 { + margin-top: 0 !important; +} + +@media screen and (max-width: 39.99875em) { + .address_country select { + margin-bottom: 10px !important; + margin-top: 10px !important; + } +} +.gfield_select { + width: 100% !important; +} + /* SIDEBARBUTTONS */ .sidebarbuttons { position: fixed; @@ -7886,4 +8068,23 @@ input.fakebutton:active, input.fakebutton:focus { } .sidebarbuttons .button { margin-bottom: 10px; -} \ No newline at end of file +} + +.yellow_radios .ginput_container li { + display: inline-block; +} +.yellow_radios .ginput_container input { + display: none !important; +} +.yellow_radios .ginput_container label { + background: #FFFF00; + border-radius: 99px; + font-size: 18px !important; + padding: 10px 20px !important; + border: 2px solid #FFFF00; + max-width: none !important; +} + +.gform_wrapper ul.gfield_radio li input[type=radio]:checked + label { + border: 2px solid #161616; +} diff --git a/wp-content/themes/BIJ1/doemee.php b/wp-content/themes/BIJ1/doemee.php index f6833c79..c9392bd0 100644 --- a/wp-content/themes/BIJ1/doemee.php +++ b/wp-content/themes/BIJ1/doemee.php @@ -6,11 +6,17 @@
    -
    -
    -
    -

    - +
    +
    +
    +
    +

    + + + + + +
    diff --git a/wp-content/themes/BIJ1/footer.php b/wp-content/themes/BIJ1/footer.php index cb5e510e..f1edef41 100644 --- a/wp-content/themes/BIJ1/footer.php +++ b/wp-content/themes/BIJ1/footer.php @@ -8,7 +8,7 @@
    -

    Ontdek meer BIJ1

    +


    @@ -19,7 +19,7 @@

    -
    +
    -
    +
    - + 'cta_menu', @@ -66,7 +66,7 @@ ?>
    - + 'sec_menu', @@ -75,7 +75,7 @@ ?>
    - + 'info_menu', @@ -92,7 +92,7 @@
    -
    +
    @@ -116,7 +116,7 @@
    -
    +
    @@ -124,10 +124,10 @@
    -

    Website door Multitude

    +

    Website Multitude

    -

    Identiteit door BUROBRAAK

    +

    Identiteit BUROBRAAK

    @@ -144,8 +144,130 @@
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    + +

    What are you looking for

    + +

    Waar wil je meeroverweten

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

    Themes

    + +

    Thema's

    + + 'thema', + 'hide_empty' => true, + ) + ); + + // Check if any term exists + if (!empty($terms) && is_array($terms)) { + // add links for each category + foreach ($terms as $term) { ?> +

    + + + name; ?> + + +

    + + +
    +
    +

    + + + + +

    + + + + +
    +
    +

    + 4)); ?> + have_posts()) : while ($query->have_posts()) : $query->the_post(); ?> + +

    + + +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + + + +
    diff --git a/wp-content/themes/BIJ1/functions.php b/wp-content/themes/BIJ1/functions.php index 179c7189..2faf4670 100644 --- a/wp-content/themes/BIJ1/functions.php +++ b/wp-content/themes/BIJ1/functions.php @@ -6,17 +6,25 @@ if ( ! is_admin() ) { function my_load_scripts($hook) { + wp_deregister_script('jquery'); + $my_js_ver = date("ymd-Gis", filemtime( plugin_dir_path( __FILE__ ) . '/js/app.js' )); $my_css_ver = date("ymd-Gis", filemtime( plugin_dir_path( __FILE__ ) . '/css/app.css' )); + wp_enqueue_script( 'jquery', get_template_directory_uri().'/js/jquery.min.js', '', 1, true ); - wp_enqueue_script( 'what-input', get_template_directory_uri().'/js/what-input.min.js', '', 1, true ); + wp_enqueue_script( 'what-input', get_template_directory_uri().'/js/what-input.min.js', '', 1, true ); wp_enqueue_script( 'foundation', get_template_directory_uri().'/js/foundation.min.js', '', 1, true ); - wp_enqueue_script( 'flickity', get_template_directory_uri().'/js/flickity.pkgd.min.js', '', 1, true ); + +/* wp_enqueue_script( 'flickity', get_template_directory_uri().'/js/flickity.pkgd.min.js', '', 1, true );*/ +/* wp_enqueue_style ( 'flickity_css', get_template_directory_uri().'/css/flickity.min.css' );*/ + + wp_enqueue_script('aos', get_template_directory_uri() . '/js/aos.js', '', 1, true); wp_enqueue_script( 'app', get_template_directory_uri().'/js/app.js', '', $my_js_ver, true ); - wp_enqueue_style ( 'flickity_css', get_template_directory_uri().'/css/flickity.min.css' ); + wp_enqueue_style('fontello', get_template_directory_uri() . '/css/fontello.css'); - wp_enqueue_style ( 'app_css', get_template_directory_uri().'/css/app.css' ); + wp_enqueue_style('aos', get_template_directory_uri() . '/css/aos.css'); + wp_enqueue_style('app_css', get_template_directory_uri().'/css/app.css' ); } add_action('wp_enqueue_scripts', 'my_load_scripts'); @@ -25,6 +33,44 @@ /* -- BASICS ------------------------------- */ + + +// Force Gravity Forms to init scripts in the footer and ensure that the DOM is loaded before scripts are executed. +add_filter( 'gform_init_scripts_footer', '__return_true' ); +add_filter( 'gform_cdata_open', 'wrap_gform_cdata_open', 1 ); +add_filter( 'gform_cdata_close', 'wrap_gform_cdata_close', 99 ); + +function wrap_gform_cdata_open( $content = '' ) { + if ( ! do_wrap_gform_cdata() ) { + return $content; + } + $content = 'document.addEventListener( "DOMContentLoaded", function() { ' . $content; + return $content; +} + +function wrap_gform_cdata_close( $content = '' ) { + if ( ! do_wrap_gform_cdata() ) { + return $content; + } + $content .= ' }, false );'; + return $content; +} + +function do_wrap_gform_cdata() { + if ( + is_admin() + || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) + || isset( $_POST['gform_ajax'] ) + || isset( $_GET['gf_page'] ) // Admin page (eg. form preview). + || doing_action( 'wp_footer' ) + || did_action( 'wp_footer' ) + ) { + return false; + } + return true; +} + + require_once(get_template_directory() . '/functions/guthenberg.php'); /* REGISTER NAV MENU'S */ @@ -33,6 +79,7 @@ register_nav_menus( array( 'main' => 'Main menu', 'sec_menu' => 'Secondary menu', 'cta_menu' => 'Cta menu', + 'language_menu' => 'Language menu', 'info_menu' => 'Info menu' ) ); @@ -212,4 +259,52 @@ function SearchFilter($query) } return $query; } -add_filter('pre_get_posts', 'SearchFilter'); \ No newline at end of file +add_filter('pre_get_posts', 'SearchFilter'); + + +/* -- STRING TRANSLATIONS +------------------------------- */ + + +add_action('init', function () { + + pll_register_string('Naar het programma', 'Naar het programma'); + pll_register_string('Naar het nieuwsoverzicht', 'Naar het nieuwsoverzicht'); + pll_register_string('Naar het volledige programma', 'Naar het volledige programma'); + pll_register_string('Terug naar het kandidaten overzicht', 'Terug naar het kandidaten overzicht'); + pll_register_string('Terug naar het programma overzicht', 'Terug naar het programma overzicht'); + pll_register_string('Lees meer', 'Lees meer'); + pll_register_string('Nieuws', 'Nieuws'); + pll_register_string('Programma', 'Programma'); + pll_register_string('Verkiezingen', 'Verkiezingen'); + pll_register_string('Naar de site', 'Naar de site'); + pll_register_string('Mail ons', 'Mail ons'); + pll_register_string('Doneer', 'Doneer'); + pll_register_string('Nieuwsbrief', 'Nieuwsbrief'); + pll_register_string('Lees de introductie', 'Lees de introductie'); + pll_register_string('Terug', 'Terug'); + pll_register_string('Inhoudsopgave', 'Inhoudsopgave'); + pll_register_string('Kandidaten', 'Kandidaten'); + pll_register_string('Kandidaten overzicht', 'Kandidaten overzicht'); + pll_register_string('is al gedoneerd', 'is al gedoneerd'); + pll_register_string('Fundraiser wordt geladen', 'Fundraiser wordt geladen'); + pll_register_string('Ja ik help mee voor', 'Ja ik help mee voor'); + pll_register_string('Blijf op de hoogte', 'Blijf op de hoogte'); + pll_register_string('Ik ga akkoord met het', 'Ik ga akkoord met het'); + pll_register_string('privacybeleid', 'privacybeleid'); + pll_register_string('Ontdek meer BIJ1', 'Ontdek meer BIJ1'); + pll_register_string('Kom in actie', 'Kom in actie'); + pll_register_string('Over BIJ1', 'Over BIJ1'); + pll_register_string('Informatie', 'Informatie'); + pll_register_string('door', 'door'); + pll_register_string('zoeken', 'zoeken'); + pll_register_string('Ben jij BIJ1', 'Ben jij BIJ1'); + pll_register_string('Introductie', 'Introductie'); + +}); + +add_filter('gform_address_display_format', 'address_format'); +function address_format($format) +{ + return 'zip_before_city'; +} \ No newline at end of file diff --git a/wp-content/themes/BIJ1/functions/guthenberg.php b/wp-content/themes/BIJ1/functions/guthenberg.php index eb8e0585..3acff1e8 100644 --- a/wp-content/themes/BIJ1/functions/guthenberg.php +++ b/wp-content/themes/BIJ1/functions/guthenberg.php @@ -100,6 +100,14 @@ acf_register_block_type(array( 'icon' => 'edit' )); +acf_register_block_type(array( +'name' => 'form', +'title' => __('Form'), +'render_template' => 'parts/blocks/form.php', +'mode' => 'edit', +'icon' => 'edit' +)); + } add_filter('allowed_block_types', 'okaia_allowed_block_types'); @@ -117,6 +125,7 @@ function okaia_allowed_block_types($allowed_blocks) 'acf/afdelingen-items', 'acf/cta-blocks', 'acf/kandidaten', + 'acf/form', 'core/paragraph', 'core/heading', 'core/list', @@ -124,6 +133,7 @@ function okaia_allowed_block_types($allowed_blocks) 'core/quote', 'core/embed', 'core/insight' + ); } diff --git a/wp-content/themes/BIJ1/header.php b/wp-content/themes/BIJ1/header.php index f1732f3f..0074b75d 100644 --- a/wp-content/themes/BIJ1/header.php +++ b/wp-content/themes/BIJ1/header.php @@ -33,10 +33,13 @@ > +Skip to content +
    - + +
    @@ -58,9 +61,12 @@
    -

    Ben jij BIJ1 ?

    -

    Kom in actie en doe mee
    voor radicale gelijkheid.

    - +

    ?

    + +

    Take action and participate
    for radical equality.

    + +

    Kom in actie en doe mee
    voor radicale gelijkheid.

    +
    - + -
    +